1
0
Fork 0
mirror of https://github.com/zeldaret/oot.git synced 2025-07-04 06:54:33 +00:00

Merge branch 'master' into doc_pause_menu

This commit is contained in:
Dragorn421 2022-10-19 18:19:12 +02:00
commit 932e5866e1
No known key found for this signature in database
GPG key ID: 32B53D2D16FC4118
69 changed files with 5804 additions and 4593 deletions

2
Jenkinsfile vendored
View file

@ -50,7 +50,7 @@ pipeline {
branch 'master' branch 'master'
} }
agent { agent {
label 'master' label 'zeldaret_website'
} }
steps { steps {
unstash 'reports' unstash 'reports'

View file

@ -452,7 +452,7 @@ void func_8002F974(Actor* actor, u16 sfxId);
void func_8002F994(Actor* actor, s32 arg1); void func_8002F994(Actor* actor, s32 arg1);
s32 func_8002F9EC(PlayState* play, Actor* actor, CollisionPoly* poly, s32 bgId, Vec3f* pos); s32 func_8002F9EC(PlayState* play, Actor* actor, CollisionPoly* poly, s32 bgId, Vec3f* pos);
void Actor_DisableLens(PlayState* play); void Actor_DisableLens(PlayState* play);
void func_800304DC(PlayState* play, ActorContext* actorCtx, ActorEntry* actorEntry); void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* playerEntry);
void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx); void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx);
s32 func_800314D4(PlayState* play, Actor* actor, Vec3f* arg2, f32 arg3); s32 func_800314D4(PlayState* play, Actor* actor, Vec3f* arg2, f32 arg3);
void func_800315AC(PlayState* play, ActorContext* actorCtx); void func_800315AC(PlayState* play, ActorContext* actorCtx);
@ -797,8 +797,8 @@ void GetItem_Draw(PlayState* play, s16 drawId);
void SfxSource_InitAll(PlayState* play); void SfxSource_InitAll(PlayState* play);
void SfxSource_UpdateAll(PlayState* play); void SfxSource_UpdateAll(PlayState* play);
void SfxSource_PlaySfxAtFixedWorldPos(PlayState* play, Vec3f* worldPos, s32 duration, u16 sfxId); void SfxSource_PlaySfxAtFixedWorldPos(PlayState* play, Vec3f* worldPos, s32 duration, u16 sfxId);
u16 ElfMessage_GetSariaText(PlayState* play); u16 QuestHint_GetSariaTextId(PlayState* play);
u16 ElfMessage_GetCUpText(PlayState* play); u16 QuestHint_GetNaviTextId(PlayState* play);
u16 Text_GetFaceReaction(PlayState* play, u32 reactionSet); u16 Text_GetFaceReaction(PlayState* play, u32 reactionSet);
void Flags_UnsetAllEnv(PlayState* play); void Flags_UnsetAllEnv(PlayState* play);
void Flags_SetEnv(PlayState* play, s16 flag); void Flags_SetEnv(PlayState* play, s16 flag);
@ -1679,7 +1679,7 @@ void DebugArena_Cleanup(void);
u8 DebugArena_IsInitialized(void); u8 DebugArena_IsInitialized(void);
void UCodeDisas_Init(UCodeDisas*); void UCodeDisas_Init(UCodeDisas*);
void UCodeDisas_Destroy(UCodeDisas*); void UCodeDisas_Destroy(UCodeDisas*);
// void UCodeDisas_Disassemble(UCodeDisas*, Gfx*); void UCodeDisas_Disassemble(UCodeDisas*, Gfx*);
void UCodeDisas_RegisterUCode(UCodeDisas*, s32, UCodeInfo*); void UCodeDisas_RegisterUCode(UCodeDisas*, s32, UCodeInfo*);
void UCodeDisas_SetCurUCode(UCodeDisas*, void*); void UCodeDisas_SetCurUCode(UCodeDisas*, void*);
Acmd* AudioSynth_Update(Acmd* cmdStart, s32* cmdCnt, s16* aiStart, s32 aiBufLen); Acmd* AudioSynth_Update(Acmd* cmdStart, s32* cmdCnt, s16* aiStart, s32 aiBufLen);
@ -1826,9 +1826,9 @@ void func_800F4524(Vec3f* pos, u16 sfxId, s8 arg2);
void func_800F4254(Vec3f* pos, u8 level); void func_800F4254(Vec3f* pos, u8 level);
void Audio_PlaySfxRiver(Vec3f* pos, f32 freqScale); void Audio_PlaySfxRiver(Vec3f* pos, f32 freqScale);
void Audio_PlaySfxWaterfall(Vec3f* pos, f32 freqScale); void Audio_PlaySfxWaterfall(Vec3f* pos, f32 freqScale);
void func_800F47BC(void); void Audio_SetBgmVolumeOffDuringFanfare(void);
void func_800F47FC(void); void Audio_SetBgmVolumeOnDuringFanfare(void);
void func_800F483C(u8 targetVol, u8 volFadeTimer); void Audio_SetMainBgmVolume(u8 targetVol, u8 volFadeTimer);
void Audio_SetGanonsTowerBgmVolumeLevel(u8 ganonsTowerLevel); void Audio_SetGanonsTowerBgmVolumeLevel(u8 ganonsTowerLevel);
void Audio_LowerMainBgmVolume(u8 volume); void Audio_LowerMainBgmVolume(u8 volume);
void Audio_PlaySfxIncreasinglyTransposed(Vec3f* pos, s16 sfxId, u8* semitones); void Audio_PlaySfxIncreasinglyTransposed(Vec3f* pos, s16 sfxId, u8* semitones);
@ -1842,12 +1842,12 @@ void Audio_PlaySariaBgm(Vec3f* pos, u16 seqId, u16 distMax);
void Audio_ClearSariaBgm2(void); void Audio_ClearSariaBgm2(void);
void Audio_PlayMorningSceneSequence(u16 seqId); void Audio_PlayMorningSceneSequence(u16 seqId);
void Audio_PlaySceneSequence(u16 seqId); void Audio_PlaySceneSequence(u16 seqId);
void func_800F574C(f32 scaleTempoAndFreq, u8 duration); void Audio_SetMainBgmTempoFreqAfterFanfare(f32 scaleTempoAndFreq, u8 duration);
void func_800F5718(void); void Audio_PlayWindmillBgm(void);
void func_800F5918(void); void Audio_SetFastTempoForTimedMinigame(void);
void func_800F595C(u16); void Audio_PlaySequenceInCutscene(u16 seqId);
void func_800F59E8(u16); void Audio_StopSequenceInCutscene(u16 seqId);
s32 func_800F5A58(u8); s32 Audio_IsSequencePlaying(u16 seqId);
void func_800F5ACC(u16 seqId); void func_800F5ACC(u16 seqId);
void func_800F5B58(void); void func_800F5B58(void);
void func_800F5BF0(u8 natureAmbienceId); void func_800F5BF0(u8 natureAmbienceId);
@ -1867,11 +1867,8 @@ void Audio_SetExtraFilter(u8);
void Audio_SetCutsceneFlag(s8 flag); void Audio_SetCutsceneFlag(s8 flag);
void Audio_PlaySfxIfNotInCutscene(u16 sfxId); void Audio_PlaySfxIfNotInCutscene(u16 sfxId);
void func_800F6964(u16); void func_800F6964(u16);
void func_800F6AB0(u16); void Audio_StopBgmAndFanfare(u16 fadeOutDuration);
// ? Audio_DisableAllSeq(?);
// ? func_800F6BB8(?);
void Audio_PreNMI(void); void Audio_PreNMI(void);
// ? func_800F6C34(?);
void Audio_SetNatureAmbienceChannelIO(u8 channelIdxRange, u8 ioPort, u8 ioData); void Audio_SetNatureAmbienceChannelIO(u8 channelIdxRange, u8 ioPort, u8 ioData);
void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId); void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId);
void Audio_Init(void); void Audio_Init(void);
@ -1945,7 +1942,7 @@ s8 PadUtils_GetRelX(Input* input);
s8 PadUtils_GetRelY(Input* input); s8 PadUtils_GetRelY(Input* input);
void PadUtils_UpdateRelXY(Input* input); void PadUtils_UpdateRelXY(Input* input);
s32 PadSetup_Init(OSMesgQueue* mq, u8* outMask, OSContStatus* status); s32 PadSetup_Init(OSMesgQueue* mq, u8* outMask, OSContStatus* status);
f32 Math_FTanF(f32 x); f32 Math_FTanF(f32 angle);
f32 Math_FFloorF(f32 x); f32 Math_FFloorF(f32 x);
f32 Math_FCeilF(f32 x); f32 Math_FCeilF(f32 x);
f32 Math_FRoundF(f32 x); f32 Math_FRoundF(f32 x);
@ -2043,8 +2040,8 @@ s32 JpegDecoder_ParseNextSymbol(JpegHuffmanTable* hTable, s16* outCoeff, s8* out
u16 JpegDecoder_ReadBits(u8 len); u16 JpegDecoder_ReadBits(u8 len);
s32 osPfsFreeBlocks(OSPfs* pfs, s32* leftoverBytes); s32 osPfsFreeBlocks(OSPfs* pfs, s32* leftoverBytes);
void guScale(Mtx* m, f32 x, f32 y, f32 z); void guScale(Mtx* m, f32 x, f32 y, f32 z);
f32 sinf(f32); f32 sinf(f32 angle);
s16 sins(u16); s16 sins(u16 angle);
OSTask* _VirtualToPhysicalTask(OSTask* intp); OSTask* _VirtualToPhysicalTask(OSTask* intp);
void osSpTaskLoad(OSTask* intp); void osSpTaskLoad(OSTask* intp);
void osSpTaskStartGo(OSTask* tp); void osSpTaskStartGo(OSTask* tp);
@ -2108,8 +2105,8 @@ s32 osPfsDeleteFile(OSPfs* pfs, u16 companyCode, u32 gameCode, u8* gameName, u8*
s32 __osPfsReleasePages(OSPfs* pfs, __OSInode* inode, u8 initialPage, u8 bank, __OSInodeUnit* finalPage); s32 __osPfsReleasePages(OSPfs* pfs, __OSInode* inode, u8 initialPage, u8 bank, __OSInodeUnit* finalPage);
void guOrthoF(f32[4][4], f32, f32, f32, f32, f32, f32, f32); void guOrthoF(f32[4][4], f32, f32, f32, f32, f32, f32, f32);
void guOrtho(Mtx*, f32, f32, f32, f32, f32, f32, f32); void guOrtho(Mtx*, f32, f32, f32, f32, f32, f32, f32);
f32 cosf(f32); f32 cosf(f32 angle);
s16 coss(u16); s16 coss(u16 angle);
void osViSetEvent(OSMesgQueue* mq, OSMesg msg, u32 retraceCount); void osViSetEvent(OSMesgQueue* mq, OSMesg msg, u32 retraceCount);
s32 osPfsIsPlug(OSMesgQueue* mq, u8* pattern); s32 osPfsIsPlug(OSMesgQueue* mq, u8* pattern);
void __osPfsRequestData(u8 cmd); void __osPfsRequestData(u8 cmd);

View file

@ -59,15 +59,26 @@
#define R_FB_FILTER_ENV_COLOR(c) SREG(85 + (c)) #define R_FB_FILTER_ENV_COLOR(c) SREG(85 + (c))
#define R_ENABLE_FB_FILTER SREG(88) #define R_ENABLE_FB_FILTER SREG(88)
#define R_PAUSE_BG_PRERENDER_STATE SREG(94) // `PauseBgPreRenderState` #define R_PAUSE_BG_PRERENDER_STATE SREG(94) // `PauseBgPreRenderState`
#define R_CAM_XZ_OFFSET_UPDATE_RATE OREG(2)
#define R_CAM_Y_OFFSET_UPDATE_RATE OREG(3)
#define R_CAM_FOV_UPDATE_RATE OREG(4)
#define R_CAM_MAX_PITCH OREG(5) #define R_CAM_MAX_PITCH OREG(5)
#define R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV OREG(7) #define R_CAM_R_UPDATE_RATE_INV OREG(6)
#define R_CAM_PITCH_UPDATE_RATE_INV OREG(7)
#define R_CAM_SLOPE_Y_ADJ_AMOUNT OREG(9)
#define R_CAM_PITCH_FLOOR_CHECK_NEAR_DIST_FAC OREG(17) #define R_CAM_PITCH_FLOOR_CHECK_NEAR_DIST_FAC OREG(17)
#define R_CAM_PITCH_FLOOR_CHECK_FAR_DIST_FAC OREG(18) #define R_CAM_PITCH_FLOOR_CHECK_FAR_DIST_FAC OREG(18)
#define R_CAM_PITCH_FLOOR_CHECK_OFFSET_Y_FAC OREG(19) #define R_CAM_PITCH_FLOOR_CHECK_OFFSET_Y_FAC OREG(19)
#define R_CAM_PITCH_FLOOR_CHECK_NEAR_WEIGHT OREG(20) #define R_CAM_PITCH_FLOOR_CHECK_NEAR_WEIGHT OREG(20)
#define R_CAM_DEFAULT_ANIM_TIME OREG(23) #define R_CAM_DEFAULT_ANIM_TIME OREG(23)
#define R_CAM_UPDATE_RATE_STEP_SCALE_XZ OREG(25) // also used as a step scale for other data
#define R_CAM_UPDATE_RATE_STEP_SCALE_Y OREG(26) // also used as a step scale for other data
#define R_CAM_JUMP1_EYE_Y_STEP_SCALE OREG(31)
#define R_CAM_MIN_PITCH_1 OREG(34) #define R_CAM_MIN_PITCH_1 OREG(34)
#define R_CAM_MIN_PITCH_2 OREG(35) #define R_CAM_MIN_PITCH_2 OREG(35)
#define R_CAM_BATTLE1_ROLL_TARGET_BASE OREG(36)
#define R_CAM_BATTLE1_ROLL_STEP_SCALE OREG(37)
#define R_CAM_BATTLE1_XYZ_OFFSET_UPDATE_RATE_TARGET OREG(40)
#define R_CAM_AT_LERP_STEP_SCALE_MIN OREG(41) #define R_CAM_AT_LERP_STEP_SCALE_MIN OREG(41)
#define R_CAM_AT_LERP_STEP_SCALE_FAC OREG(42) #define R_CAM_AT_LERP_STEP_SCALE_FAC OREG(42)
#define R_CAM_YOFFSET_NORM OREG(46) #define R_CAM_YOFFSET_NORM OREG(46)

File diff suppressed because it is too large Load diff

View file

@ -23,20 +23,12 @@ typedef float f32;
typedef double f64; typedef double f64;
typedef long int Mtx_t[4][4];
typedef union {
Mtx_t m;
struct {
u16 intPart[4][4];
u16 fracPart[4][4];
};
long long int force_structure_alignment;
} Mtx;
typedef float MtxF_t[4][4]; typedef float MtxF_t[4][4];
typedef union { typedef union {
MtxF_t mf; MtxF_t mf;
struct { struct {
// Note: The order displayed here is the transpose of the order in which matrices are typically written.
// For example, [xw, yw, zw] is the translation part of the matrix, not [wx, wy, wz].
float xx, yx, zx, wx, float xx, yx, zx, wx,
xy, yy, zy, wy, xy, yy, zy, wy,
xz, yz, zz, wz, xz, yz, zz, wz,

View file

@ -1202,7 +1202,7 @@ typedef struct {
/* 0x01 */ u8 byte1; /* 0x01 */ u8 byte1;
/* 0x02 */ u8 byte2; /* 0x02 */ u8 byte2;
/* 0x03 */ u8 byte3; /* 0x03 */ u8 byte3;
} ElfMessage; // size = 0x4 } QuestHintCmd; // size = 0x4
typedef struct { typedef struct {
/* 0x00 */ u8 numActors; /* 0x00 */ u8 numActors;
@ -1254,17 +1254,17 @@ typedef struct PlayState {
/* 0x11DE4 */ u32 gameplayFrames; /* 0x11DE4 */ u32 gameplayFrames;
/* 0x11DE8 */ u8 linkAgeOnLoad; /* 0x11DE8 */ u8 linkAgeOnLoad;
/* 0x11DE9 */ u8 unk_11DE9; /* 0x11DE9 */ u8 unk_11DE9;
/* 0x11DEA */ u8 curSpawn; /* 0x11DEA */ u8 spawn;
/* 0x11DEB */ u8 numSetupActors; /* 0x11DEB */ u8 numActorEntries;
/* 0x11DEC */ u8 numRooms; /* 0x11DEC */ u8 numRooms;
/* 0x11DF0 */ RomFile* roomList; /* 0x11DF0 */ RomFile* roomList;
/* 0x11DF4 */ ActorEntry* linkActorEntry; /* 0x11DF4 */ ActorEntry* playerEntry;
/* 0x11DF8 */ ActorEntry* setupActorList; /* 0x11DF8 */ ActorEntry* actorEntryList;
/* 0x11DFC */ void* unk_11DFC; /* 0x11DFC */ void* unk_11DFC;
/* 0x11E00 */ EntranceEntry* setupEntranceList; /* 0x11E00 */ Spawn* spawnList;
/* 0x11E04 */ s16* setupExitList; /* 0x11E04 */ s16* exitList;
/* 0x11E08 */ Path* setupPathList; /* 0x11E08 */ Path* pathList;
/* 0x11E0C */ ElfMessage* cUpElfMsgs; /* 0x11E0C */ QuestHintCmd* naviQuestHints;
/* 0x11E10 */ void* specialEffects; /* 0x11E10 */ void* specialEffects;
/* 0x11E14 */ u8 skyboxId; /* 0x11E14 */ u8 skyboxId;
/* 0x11E15 */ s8 transitionTrigger; // "fade_direction" /* 0x11E15 */ s8 transitionTrigger; // "fade_direction"
@ -1699,7 +1699,7 @@ typedef struct {
} UCodeInfo; // size = 0x8 } UCodeInfo; // size = 0x8
typedef struct { typedef struct {
/* 0x00 */ u32 segments[NUM_SEGMENTS]; /* 0x00 */ uintptr_t segments[NUM_SEGMENTS];
/* 0x40 */ Gfx* dlStack[18]; /* 0x40 */ Gfx* dlStack[18];
/* 0x88 */ s32 dlDepth; /* 0x88 */ s32 dlDepth;
/* 0x8C */ u32 dlCnt; /* 0x8C */ u32 dlCnt;

View file

@ -1,129 +0,0 @@
#ifndef Z64ELF_MESSAGE_H
#define Z64ELF_MESSAGE_H
#include "ultra64.h"
// Checks the condition and exits the script if the check passes
#define ELF_MSG_TYPE_CHECK 0
// ? (unused)
#define ELF_MSG_TYPE_UNK_1 1
// ? (unused)
#define ELF_MSG_TYPE_UNK_2 2
// Checks the condition and skips forward by some number of commands if the check passes
#define ELF_MSG_TYPE_SKIP 3
// Always ends the script, returning the text id for this command
#define ELF_MSG_TYPE_END 7
// Check an eventChkInf flag
#define ELF_MSG_CONDITION_FLAG 0
// Check a dungeon item (map, compass, boss key)
#define ELF_MSG_CONDITION_DUNGEON_ITEM 1
// Check if an item is in an item slot
#define ELF_MSG_CONDITION_ITEM 2
// "Other" conditions described below
#define ELF_MSG_CONDITION_OTHER 3
// Check what strength upgrade has been obtained so far
#define ELF_MSG_CONDITION_STRENGTH_UPG 0
// Check if specific boots have been obtained so far
#define ELF_MSG_CONDITION_BOOTS 1
// Check if a particular song has been obtained
#define ELF_MSG_CONDITION_SONG 2
// Check if a particular medallion has been obtained
#define ELF_MSG_CONDITION_MEDALLION 3
// Check if the magic meter has been obtained
#define ELF_MSG_CONDITION_MAGIC 4
/*
* Bitpack byte 0
*/
#define ELF_MSG_B0(type, cond_type, tf) \
_SHIFTL(ELF_MSG_TYPE_##type, 5, 3) | \
_SHIFTL(ELF_MSG_CONDITION_##cond_type, 1, 4) | \
_SHIFTL(tf, 0, 1)
/*
* Bitpack byte 1
*/
#define ELF_MSG_B1(cond_type, data) \
_SHIFTL(ELF_MSG_CONDITION_##cond_type, 4, 4) | \
_SHIFTL(data, 0, 4)
/*
* Other bytes
*/
#define ELF_MSG_B(data) \
_SHIFTL(data, 0, 8)
/*
* Command macros
*/
#define ELF_MSG_FLAG(type, textId, tf, flag) \
{ \
ELF_MSG_B0(type, FLAG, tf), \
ELF_MSG_B(flag), \
ELF_MSG_B(textId), \
ELF_MSG_B(0), \
}
#define ELF_MSG_END(textId) \
ELF_MSG_FLAG(END, textId, false, 0)
#define ELF_MSG_DUNGEON_ITEM(type, textId, tf, itemId) \
{ \
ELF_MSG_B0(type, DUNGEON_ITEM, tf), \
ELF_MSG_B(itemId), \
ELF_MSG_B(textId), \
ELF_MSG_B(0), \
}
#define ELF_MSG_ITEM(type, textId, tf, slotItemId, itemId) \
{ \
ELF_MSG_B0(type, ITEM, tf), \
ELF_MSG_B(slotItemId), \
ELF_MSG_B(textId), \
ELF_MSG_B(itemId), \
}
#define ELF_MSG_STRENGTH_UPG(type, textId, tf, strUpg) \
{ \
ELF_MSG_B0(type, OTHER, tf), \
ELF_MSG_B1(STRENGTH_UPG, strUpg), \
ELF_MSG_B(textId), \
ELF_MSG_B(0), \
}
#define ELF_MSG_BOOTS(type, textId, tf, itemId) \
{ \
ELF_MSG_B0(type, OTHER, tf), \
ELF_MSG_B1(BOOTS, 0), \
ELF_MSG_B(textId), \
ELF_MSG_B(itemId), \
}
#define ELF_MSG_SONG(type, textId, tf, itemId) \
{ \
ELF_MSG_B0(type, OTHER, tf), \
ELF_MSG_B1(SONG, 0), \
ELF_MSG_B(textId), \
ELF_MSG_B(itemId), \
}
#define ELF_MSG_MEDALLION(type, textId, tf, itemId) \
{ \
ELF_MSG_B0(type, OTHER, tf), \
ELF_MSG_B1(MEDALLION, 0), \
ELF_MSG_B(textId), \
ELF_MSG_B(itemId), \
}
#define ELF_MSG_MAGIC(type, textId, tf) \
{ \
ELF_MSG_B0(type, OTHER, tf), \
ELF_MSG_B1(MAGIC, 0), \
ELF_MSG_B(textId), \
ELF_MSG_B(0), \
}
#endif

View file

@ -0,0 +1,150 @@
#ifndef Z64QUEST_HINT_COMMANDS_H
#define Z64QUEST_HINT_COMMANDS_H
#include "ultra64.h"
/*
* Hint Command Types
*/
// Checks the condition and exits the script if the check passes
#define QUEST_HINT_TYPE_CHECK 0
// Checks a chain of conditions and only evaluates the last entry
// if all conditions leading up to it were also true
#define QUEST_HINT_TYPE_CHAIN 1
// Checks a chain of conditionals and will return a randomly chosen entry among
// the conditions that evaluated to true
#define QUEST_HINT_TYPE_RANDOM 2
// Checks the condition and skips forward by specified number of commands if the check passes
// Note that the amount of entries to skip is specified in the field where the textId would usually go
#define QUEST_HINT_TYPE_SKIP 3
// Always ends the script, returning the text id for this command
#define QUEST_HINT_TYPE_END 7
/*
* Hint Condition Types
*/
// Check an eventChkInf flag
#define QUEST_HINT_CONDITION_FLAG 0
// Check a dungeon item (map, compass, boss key)
#define QUEST_HINT_CONDITION_DUNGEON_ITEM 1
// Check if an item is in an item slot
#define QUEST_HINT_CONDITION_ITEM 2
// "Other" conditions described below
#define QUEST_HINT_CONDITION_OTHER 3
/*
* "Other" Condition Types
*/
// Check what strength upgrade has been obtained so far
#define QUEST_HINT_CONDITION_STRENGTH_UPG 0
// Check if specific boots have been obtained so far
#define QUEST_HINT_CONDITION_BOOTS 1
// Check if a particular song has been obtained
#define QUEST_HINT_CONDITION_SONG 2
// Check if a particular medallion has been obtained
#define QUEST_HINT_CONDITION_MEDALLION 3
// Check if the magic meter has been obtained
#define QUEST_HINT_CONDITION_MAGIC 4
/*
* Byte pack macros
*/
#define HINT_B0(type, condType, tf) \
_SHIFTL(QUEST_HINT_TYPE_##type, 5, 3) | \
_SHIFTL(condType, 1, 4) | \
_SHIFTL(tf, 0, 1)
#define HINT_B1(condType, data) \
_SHIFTL(condType, 4, 4) | \
_SHIFTL(data, 0, 4)
#define HINT_B(data) \
_SHIFTL(data, 0, 8)
/*
* Command macros
*/
#define QUEST_HINT_FLAG(type, flag, tf, textId) \
{ \
HINT_B0(type, QUEST_HINT_CONDITION_FLAG, tf), \
HINT_B(flag), \
HINT_B(textId), \
HINT_B(0), \
}
#define QUEST_HINT_END(textId) \
QUEST_HINT_FLAG(END, 0, false, textId)
#define QUEST_HINT_DUNGEON_ITEM(type, itemId, tf, textId) \
{ \
HINT_B0(type, QUEST_HINT_CONDITION_DUNGEON_ITEM, tf), \
HINT_B(itemId), \
HINT_B(textId), \
HINT_B(0), \
}
#define QUEST_HINT_ITEM(type, slotItemId, itemId, tf, textId) \
{ \
HINT_B0(type, QUEST_HINT_CONDITION_ITEM, tf), \
HINT_B(slotItemId), \
HINT_B(textId), \
HINT_B(itemId), \
}
#define QUEST_HINT_STRENGTH_UPG(type, strUpg, tf, textId) \
{ \
HINT_B0(type, QUEST_HINT_CONDITION_OTHER, tf), \
HINT_B1(QUEST_HINT_CONDITION_STRENGTH_UPG, strUpg), \
HINT_B(textId), \
HINT_B(0), \
}
#define QUEST_HINT_BOOTS(type, itemId, tf, textId) \
{ \
HINT_B0(type, QUEST_HINT_CONDITION_OTHER, tf), \
HINT_B1(QUEST_HINT_CONDITION_BOOTS, 0), \
HINT_B(textId), \
HINT_B(itemId), \
}
#define QUEST_HINT_SONG(type, itemId, tf, textId) \
{ \
HINT_B0(type, QUEST_HINT_CONDITION_OTHER, tf), \
HINT_B1(QUEST_HINT_CONDITION_SONG, 0), \
HINT_B(textId), \
HINT_B(itemId), \
}
#define QUEST_HINT_MEDALLION(type, itemId, tf, textId) \
{ \
HINT_B0(type, QUEST_HINT_CONDITION_OTHER, tf), \
HINT_B1(QUEST_HINT_CONDITION_MEDALLION, 0), \
HINT_B(textId), \
HINT_B(itemId), \
}
#define QUEST_HINT_MAGIC(type, tf, textId) \
{ \
HINT_B0(type, QUEST_HINT_CONDITION_OTHER, tf), \
HINT_B1(QUEST_HINT_CONDITION_MAGIC, 0), \
HINT_B(textId), \
HINT_B(0), \
}
#endif

View file

@ -38,9 +38,12 @@ typedef struct {
} TransitionActorEntry; // size = 0x10 } TransitionActorEntry; // size = 0x10
typedef struct { typedef struct {
/* 0x00 */ u8 spawn; /* 0x00 */ u8 playerEntryIndex;
/* 0x01 */ u8 room; /* 0x01 */ u8 room;
} EntranceEntry; } Spawn;
// TODO: ZAPD Compatibility
typedef Spawn EntranceEntry;
typedef struct { typedef struct {
/* 0x00 */ u8 ambientColor[3]; /* 0x00 */ u8 ambientColor[3];
@ -179,13 +182,13 @@ typedef struct {
/* 0x00 */ u8 code; /* 0x00 */ u8 code;
/* 0x01 */ u8 length; /* 0x01 */ u8 length;
/* 0x04 */ ActorEntry* data; /* 0x04 */ ActorEntry* data;
} SCmdSpawnList; } SCmdPlayerEntryList;
typedef struct { typedef struct {
/* 0x00 */ u8 code; /* 0x00 */ u8 code;
/* 0x01 */ u8 length; /* 0x01 */ u8 length;
/* 0x04 */ ActorEntry* data; /* 0x04 */ ActorEntry* data;
} SCmdActorList; } SCmdActorEntryList;
typedef struct { typedef struct {
/* 0x00 */ u8 code; /* 0x00 */ u8 code;
@ -218,12 +221,12 @@ typedef struct {
typedef struct { typedef struct {
/* 0x00 */ u8 code; /* 0x00 */ u8 code;
/* 0x01 */ u8 data1; /* 0x01 */ u8 data1;
/* 0x04 */ EntranceEntry* data; /* 0x04 */ Spawn* data;
} SCmdEntranceList; } SCmdSpawnList;
typedef struct { typedef struct {
/* 0x00 */ u8 code; /* 0x00 */ u8 code;
/* 0x01 */ u8 cUpElfMsgNum; /* 0x01 */ u8 naviQuestHintFileId;
/* 0x04 */ u32 keepObjectId; /* 0x04 */ u32 keepObjectId;
} SCmdSpecialFiles; } SCmdSpecialFiles;
@ -342,11 +345,11 @@ typedef struct {
typedef union { typedef union {
SCmdBase base; SCmdBase base;
SCmdSpawnList spawnList; SCmdPlayerEntryList playerEntryList;
SCmdActorList actorList; SCmdActorEntryList actorEntryList;
SCmdUnused02 unused02; SCmdUnused02 unused02;
SCmdRoomList roomList; SCmdRoomList roomList;
SCmdEntranceList entranceList; SCmdSpawnList spawnList;
SCmdObjectList objectList; SCmdObjectList objectList;
SCmdLightList lightList; SCmdLightList lightList;
SCmdPathList pathList; SCmdPathList pathList;
@ -469,6 +472,14 @@ typedef enum {
#define SCENE_CAM_TYPE_FIXED_MARKET 0x40 // Camera exhibits fixed behaviors and delays textboxes by a small amount before they start to appear #define SCENE_CAM_TYPE_FIXED_MARKET 0x40 // Camera exhibits fixed behaviors and delays textboxes by a small amount before they start to appear
#define SCENE_CAM_TYPE_SHOOTING_GALLERY 0x50 // Unreferenced in code, and used only by the main layer of the shooting gallery scene #define SCENE_CAM_TYPE_SHOOTING_GALLERY 0x50 // Unreferenced in code, and used only by the main layer of the shooting gallery scene
// navi hints
// TODO: make ZAPD use this enum for `SCENE_CMD_SPECIAL_FILES`
typedef enum {
NAVI_QUEST_HINTS_NONE,
NAVI_QUEST_HINTS_OVERWORLD,
NAVI_QUEST_HINTS_DUNGEON
} NaviQuestHintFileId;
// Scene commands // Scene commands
typedef enum { typedef enum {
@ -522,8 +533,8 @@ typedef enum {
#define SCENE_CMD_ENTRANCE_LIST(entranceList) \ #define SCENE_CMD_ENTRANCE_LIST(entranceList) \
{ SCENE_CMD_ID_ENTRANCE_LIST, 0, CMD_PTR(entranceList) } { SCENE_CMD_ID_ENTRANCE_LIST, 0, CMD_PTR(entranceList) }
#define SCENE_CMD_SPECIAL_FILES(elfMessageFile, keepObjectId) \ #define SCENE_CMD_SPECIAL_FILES(naviQuestHintFileId, keepObjectId) \
{ SCENE_CMD_ID_SPECIAL_FILES, elfMessageFile, CMD_W(keepObjectId) } { SCENE_CMD_ID_SPECIAL_FILES, naviQuestHintFileId, CMD_W(keepObjectId) }
#define SCENE_CMD_ROOM_BEHAVIOR(curRoomUnk3, curRoomUnk2, showInvisActors, disableWarpSongs) \ #define SCENE_CMD_ROOM_BEHAVIOR(curRoomUnk3, curRoomUnk2, showInvisActors, disableWarpSongs) \
{ SCENE_CMD_ID_ROOM_BEHAVIOR, curRoomUnk3, \ { SCENE_CMD_ID_ROOM_BEHAVIOR, curRoomUnk3, \

View file

@ -212,16 +212,62 @@ void* gItemIcons[] = {
// Used to map item IDs to inventory slots // Used to map item IDs to inventory slots
u8 gItemSlots[] = { u8 gItemSlots[] = {
SLOT_STICK, SLOT_NUT, SLOT_BOMB, SLOT_BOW, SLOT_ARROW_FIRE, SLOT_DINS_FIRE, SLOT_STICK, // ITEM_STICK
SLOT_SLINGSHOT, SLOT_OCARINA, SLOT_OCARINA, SLOT_BOMBCHU, SLOT_HOOKSHOT, SLOT_HOOKSHOT, SLOT_NUT, // ITEM_NUT
SLOT_ARROW_ICE, SLOT_FARORES_WIND, SLOT_BOOMERANG, SLOT_LENS, SLOT_BEAN, SLOT_HAMMER, SLOT_BOMB, // ITEM_BOMB
SLOT_ARROW_LIGHT, SLOT_NAYRUS_LOVE, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOW, // ITEM_BOW
SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_ARROW_FIRE, // ITEM_ARROW_FIRE
SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_DINS_FIRE, // ITEM_DINS_FIRE
SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_SLINGSHOT, // ITEM_SLINGSHOT
SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_OCARINA, // ITEM_OCARINA_FAIRY
SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_OCARINA, // ITEM_OCARINA_TIME
SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_BOMBCHU, // ITEM_BOMBCHU
SLOT_HOOKSHOT, // ITEM_HOOKSHOT
SLOT_HOOKSHOT, // ITEM_LONGSHOT
SLOT_ARROW_ICE, // ITEM_ARROW_ICE
SLOT_FARORES_WIND, // ITEM_FARORES_WIND
SLOT_BOOMERANG, // ITEM_BOOMERANG
SLOT_LENS, // ITEM_LENS
SLOT_BEAN, // ITEM_BEAN
SLOT_HAMMER, // ITEM_HAMMER
SLOT_ARROW_LIGHT, // ITEM_ARROW_LIGHT
SLOT_NAYRUS_LOVE, // ITEM_NAYRUS_LOVE
SLOT_BOTTLE_1, // ITEM_BOTTLE
SLOT_BOTTLE_1, // ITEM_POTION_RED
SLOT_BOTTLE_1, // ITEM_POTION_GREEN
SLOT_BOTTLE_1, // ITEM_POTION_BLUE
SLOT_BOTTLE_1, // ITEM_FAIRY
SLOT_BOTTLE_1, // ITEM_FISH
SLOT_BOTTLE_1, // ITEM_MILK_BOTTLE
SLOT_BOTTLE_1, // ITEM_LETTER_RUTO
SLOT_BOTTLE_1, // ITEM_BLUE_FIRE
SLOT_BOTTLE_1, // ITEM_BUG
SLOT_BOTTLE_1, // ITEM_BIG_POE
SLOT_BOTTLE_1, // ITEM_MILK_HALF
SLOT_BOTTLE_1, // ITEM_POE
SLOT_TRADE_CHILD, // ITEM_WEIRD_EGG
SLOT_TRADE_CHILD, // ITEM_CHICKEN
SLOT_TRADE_CHILD, // ITEM_LETTER_ZELDA
SLOT_TRADE_CHILD, // ITEM_MASK_KEATON
SLOT_TRADE_CHILD, // ITEM_MASK_SKULL
SLOT_TRADE_CHILD, // ITEM_MASK_SPOOKY
SLOT_TRADE_CHILD, // ITEM_MASK_BUNNY
SLOT_TRADE_CHILD, // ITEM_MASK_GORON
SLOT_TRADE_CHILD, // ITEM_MASK_ZORA
SLOT_TRADE_CHILD, // ITEM_MASK_GERUDO
SLOT_TRADE_CHILD, // ITEM_MASK_TRUTH
SLOT_TRADE_CHILD, // ITEM_SOLD_OUT
SLOT_TRADE_ADULT, // ITEM_POCKET_EGG
SLOT_TRADE_ADULT, // ITEM_POCKET_CUCCO
SLOT_TRADE_ADULT, // ITEM_COJIRO
SLOT_TRADE_ADULT, // ITEM_ODD_MUSHROOM
SLOT_TRADE_ADULT, // ITEM_ODD_POTION
SLOT_TRADE_ADULT, // ITEM_SAW
SLOT_TRADE_ADULT, // ITEM_SWORD_BROKEN
SLOT_TRADE_ADULT, // ITEM_PRESCRIPTION
SLOT_TRADE_ADULT, // ITEM_FROG
SLOT_TRADE_ADULT, // ITEM_EYEDROPS
SLOT_TRADE_ADULT, // ITEM_CLAIM_CHECK
}; };
void Inventory_ChangeEquipment(s16 equipment, u16 value) { void Inventory_ChangeEquipment(s16 equipment, u16 value) {

View file

@ -1241,8 +1241,8 @@ u8 sMalonSingingTimer;
u8 sAudioSpecPeakNumNotes[0x12]; u8 sAudioSpecPeakNumNotes[0x12];
u8 sMalonSingingDisabled; u8 sMalonSingingDisabled;
u8 D_8016B9F3; u8 D_8016B9F3;
u8 D_8016B9F4; u8 sFanfareStartTimer;
u16 D_8016B9F6; u16 sFanfareSeqId;
OcarinaStaff sPlayingStaff; OcarinaStaff sPlayingStaff;
OcarinaStaff sPlaybackStaff; OcarinaStaff sPlaybackStaff;
@ -3208,7 +3208,7 @@ void AudioDebug_ProcessInput_SndCont(void) {
if (CHECK_BTN_ANY(sDebugPadPress, BTN_CDOWN)) { if (CHECK_BTN_ANY(sDebugPadPress, BTN_CDOWN)) {
if (sAudioSndContSel == 0) { if (sAudioSndContSel == 0) {
if (1) {} if (1) {}
func_800F595C(sAudioSndContWork[sAudioSndContSel]); Audio_PlaySequenceInCutscene(sAudioSndContWork[sAudioSndContSel]);
} }
} }
@ -3693,7 +3693,7 @@ void AudioDebug_ProcessInput(void) {
} }
void Audio_UpdateRiverSoundVolumes(void); void Audio_UpdateRiverSoundVolumes(void);
void func_800F5CF8(void); void Audio_UpdateFanfare(void);
/** /**
* This is Audio_Update for the graph thread * This is Audio_Update for the graph thread
@ -3707,7 +3707,7 @@ void func_800F3054(void) {
Audio_StepFreqLerp(&sWaterfallFreqScaleLerp); Audio_StepFreqLerp(&sWaterfallFreqScaleLerp);
Audio_UpdateRiverSoundVolumes(); Audio_UpdateRiverSoundVolumes();
Audio_UpdateSceneSequenceResumePoint(); Audio_UpdateSceneSequenceResumePoint();
func_800F5CF8(); Audio_UpdateFanfare();
if (gAudioSpecId == 7) { if (gAudioSpecId == 7) {
Audio_ClearSariaBgm(); Audio_ClearSariaBgm();
} }
@ -4260,17 +4260,17 @@ void Audio_StepFreqLerp(FreqLerp* lerp) {
} }
} }
void func_800F47BC(void) { void Audio_SetBgmVolumeOffDuringFanfare(void) {
Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_FANFARE, 0, 10); Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_FANFARE, 0, 10);
Audio_SetVolumeScale(SEQ_PLAYER_BGM_SUB, VOL_SCALE_INDEX_FANFARE, 0, 10); Audio_SetVolumeScale(SEQ_PLAYER_BGM_SUB, VOL_SCALE_INDEX_FANFARE, 0, 10);
} }
void func_800F47FC(void) { void Audio_SetBgmVolumeOnDuringFanfare(void) {
Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_FANFARE, 0x7F, 3); Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_FANFARE, 0x7F, 3);
Audio_SetVolumeScale(SEQ_PLAYER_BGM_SUB, VOL_SCALE_INDEX_FANFARE, 0x7F, 3); Audio_SetVolumeScale(SEQ_PLAYER_BGM_SUB, VOL_SCALE_INDEX_FANFARE, 0x7F, 3);
} }
void func_800F483C(u8 targetVol, u8 volFadeTimer) { void Audio_SetMainBgmVolume(u8 targetVol, u8 volFadeTimer) {
Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_BGM_MAIN, targetVol, volFadeTimer); Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_BGM_MAIN, targetVol, volFadeTimer);
} }
@ -4593,7 +4593,7 @@ void Audio_PlaySceneSequence(u16 seqId) {
Audio_QueueCmdS32(0xF8000000, 0); Audio_QueueCmdS32(0xF8000000, 0);
} }
if ((sSeqFlags[sPrevSceneSeqId] & SEQ_FLAG_RESUME_PREV) && sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_RESUME) { if ((sSeqFlags[sPrevSceneSeqId] & SEQ_FLAG_RESUME_PREV) && (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_RESUME)) {
// Resume the sequence from the point where it left off last time it was played in the scene // Resume the sequence from the point where it left off last time it was played in the scene
if ((sSeqResumePoint & 0x3F) != 0) { if ((sSeqResumePoint & 0x3F) != 0) {
fadeInDuration = 30; fadeInDuration = 30;
@ -4622,7 +4622,7 @@ void Audio_PlaySceneSequence(u16 seqId) {
void Audio_UpdateSceneSequenceResumePoint(void) { void Audio_UpdateSceneSequenceResumePoint(void) {
u16 seqId = Audio_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN); u16 seqId = Audio_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN);
if ((seqId != NA_BGM_DISABLED) && (sSeqFlags[(u8)seqId & 0xFF] & SEQ_FLAG_RESUME)) { if ((seqId != NA_BGM_DISABLED) && (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_RESUME)) {
if (sSeqResumePoint != SEQ_RESUME_POINT_NONE) { if (sSeqResumePoint != SEQ_RESUME_POINT_NONE) {
// Get the current point to resume from // Get the current point to resume from
sSeqResumePoint = gAudioCtx.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[3]; sSeqResumePoint = gAudioCtx.seqPlayers[SEQ_PLAYER_BGM_MAIN].soundScriptIO[3];
@ -4633,14 +4633,15 @@ void Audio_UpdateSceneSequenceResumePoint(void) {
} }
} }
void func_800F5718(void) { void Audio_PlayWindmillBgm(void) {
if (Audio_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) != NA_BGM_WINDMILL) { if (Audio_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) != NA_BGM_WINDMILL) {
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, 0, NA_BGM_WINDMILL); SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0, 0, NA_BGM_WINDMILL);
} }
} }
void func_800F574C(f32 scaleTempoAndFreq, u8 duration) { void Audio_SetMainBgmTempoFreqAfterFanfare(f32 scaleTempoAndFreq, u8 duration) {
if (scaleTempoAndFreq == 1.0f) { if (scaleTempoAndFreq == 1.0f) {
// Should instead use `SEQCMD_SETUP_RESET_TEMPO` to wait until the fanfare is finished
SEQCMD_RESET_TEMPO(SEQ_PLAYER_BGM_MAIN, duration); SEQCMD_RESET_TEMPO(SEQ_PLAYER_BGM_MAIN, duration);
} else { } else {
SEQCMD_SETUP_SCALE_TEMPO(SEQ_PLAYER_FANFARE, SEQ_PLAYER_BGM_MAIN, duration, scaleTempoAndFreq * 100.0f); SEQCMD_SETUP_SCALE_TEMPO(SEQ_PLAYER_FANFARE, SEQ_PLAYER_BGM_MAIN, duration, scaleTempoAndFreq * 100.0f);
@ -4649,52 +4650,51 @@ void func_800F574C(f32 scaleTempoAndFreq, u8 duration) {
SEQCMD_SETUP_SET_PLAYER_FREQ(SEQ_PLAYER_FANFARE, SEQ_PLAYER_BGM_MAIN, duration, scaleTempoAndFreq * 100.0f); SEQCMD_SETUP_SET_PLAYER_FREQ(SEQ_PLAYER_FANFARE, SEQ_PLAYER_BGM_MAIN, duration, scaleTempoAndFreq * 100.0f);
} }
void func_800F5918(void) { /**
if (Audio_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) == NA_BGM_TIMED_MINI_GAME && * Set the tempo for the timed minigame sequence to 210 bpm,
* which is faster than the default tempo
*/
void Audio_SetFastTempoForTimedMinigame(void) {
if ((Audio_GetActiveSeqId(SEQ_PLAYER_BGM_MAIN) == NA_BGM_TIMED_MINI_GAME) &&
Audio_IsSeqCmdNotQueued(SEQCMD_OP_PLAY_SEQUENCE << 28, SEQCMD_OP_MASK)) { Audio_IsSeqCmdNotQueued(SEQCMD_OP_PLAY_SEQUENCE << 28, SEQCMD_OP_MASK)) {
SEQCMD_SET_TEMPO(SEQ_PLAYER_BGM_MAIN, 5, 210); SEQCMD_SET_TEMPO(SEQ_PLAYER_BGM_MAIN, 5, 210);
} }
} }
void func_800F595C(u16 arg0) { void Audio_PlaySequenceInCutscene(u16 seqId) {
u8 arg0b = arg0 & 0xFF; if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE) {
Audio_PlayFanfare(seqId);
if (sSeqFlags[arg0b] & SEQ_FLAG_FANFARE) { } else if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE_GANON) {
Audio_PlayFanfare(arg0); SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_FANFARE, 0, 0, seqId);
} else if (sSeqFlags[arg0b] & SEQ_FLAG_FANFARE_GANON) {
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_FANFARE, 0, 0, arg0);
} else { } else {
Audio_PlaySequenceWithSeqPlayerIO(SEQ_PLAYER_BGM_MAIN, arg0, 0, 7, SEQ_IO_VAL_NONE); Audio_PlaySequenceWithSeqPlayerIO(SEQ_PLAYER_BGM_MAIN, seqId, 0, 7, SEQ_IO_VAL_NONE);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0); SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
} }
} }
void func_800F59E8(u16 arg0) { void Audio_StopSequenceInCutscene(u16 seqId) {
u8 arg0b = arg0 & 0xFF; if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE) {
if (sSeqFlags[arg0b] & SEQ_FLAG_FANFARE) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0); SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
} else if (sSeqFlags[arg0b] & SEQ_FLAG_FANFARE_GANON) { } else if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE_GANON) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0); SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
} else { } else {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0); SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0);
} }
} }
s32 func_800F5A58(u8 arg0) { s32 Audio_IsSequencePlaying(u16 seqId) {
u8 phi_a1 = 0; u8 seqPlayerIndex = SEQ_PLAYER_BGM_MAIN;
if (sSeqFlags[arg0 & 0xFF] & SEQ_FLAG_FANFARE) { if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE) {
phi_a1 = 1; seqPlayerIndex = SEQ_PLAYER_FANFARE;
} else if (sSeqFlags[arg0 & 0xFF] & SEQ_FLAG_FANFARE_GANON) { } else if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE_GANON) {
phi_a1 = 1; seqPlayerIndex = SEQ_PLAYER_FANFARE;
} }
if (arg0 == (u8)Audio_GetActiveSeqId(phi_a1)) { if ((seqId & 0xFF) == (Audio_GetActiveSeqId(seqPlayerIndex) & 0xFF)) {
return 1; return true;
} else { } else {
return 0; return false;
} }
} }
@ -4757,31 +4757,35 @@ void func_800F5C2C(void) {
} }
void Audio_PlayFanfare(u16 seqId) { void Audio_PlayFanfare(u16 seqId) {
u16 sp26; u16 curSeqId;
u32 sp20; u32 outNumFonts;
u8* sp1C; u8* curFontId;
u8* sp18; u8* requestedFontId;
sp26 = Audio_GetActiveSeqId(SEQ_PLAYER_FANFARE); curSeqId = Audio_GetActiveSeqId(SEQ_PLAYER_FANFARE);
sp1C = func_800E5E84(sp26 & 0xFF, &sp20);
sp18 = func_800E5E84(seqId & 0xFF, &sp20); curFontId = func_800E5E84(curSeqId & 0xFF, &outNumFonts);
if ((sp26 == NA_BGM_DISABLED) || (*sp1C == *sp18)) { requestedFontId = func_800E5E84(seqId & 0xFF, &outNumFonts);
D_8016B9F4 = 1;
if ((curSeqId == NA_BGM_DISABLED) || (*curFontId == *requestedFontId)) {
sFanfareStartTimer = 1;
} else { } else {
D_8016B9F4 = 5; // Give extra time to start the fanfare if both another fanfare needs to be stopped
// and a new fontId needs to be loaded in
sFanfareStartTimer = 5;
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0); SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, 0);
} }
D_8016B9F6 = seqId; sFanfareSeqId = seqId;
} }
void func_800F5CF8(void) { void Audio_UpdateFanfare(void) {
u16 seqIdFanfare; u16 seqIdFanfare;
u16 seqIdBgmMain; u16 seqIdBgmMain;
u16 seqIdBgmSub; u16 seqIdBgmSub;
if (D_8016B9F4 != 0) { if (sFanfareStartTimer != 0) {
D_8016B9F4--; sFanfareStartTimer--;
if (D_8016B9F4 == 0) { if (sFanfareStartTimer == 0) {
Audio_QueueCmdS32(0xE3000000, SEQUENCE_TABLE); Audio_QueueCmdS32(0xE3000000, SEQUENCE_TABLE);
Audio_QueueCmdS32(0xE3000000, FONT_TABLE); Audio_QueueCmdS32(0xE3000000, FONT_TABLE);
@ -4802,7 +4806,7 @@ void func_800F5CF8(void) {
SEQCMD_SETUP_SET_CHANNEL_DISABLE_MASK(SEQ_PLAYER_FANFARE, SEQ_PLAYER_BGM_SUB, 0); SEQCMD_SETUP_SET_CHANNEL_DISABLE_MASK(SEQ_PLAYER_FANFARE, SEQ_PLAYER_BGM_SUB, 0);
} }
} }
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_FANFARE, 1, 0, D_8016B9F6); SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_FANFARE, 1, 0, sFanfareSeqId);
SEQCMD_SET_CHANNEL_DISABLE_MASK(SEQ_PLAYER_BGM_MAIN, 0xFFFF); SEQCMD_SET_CHANNEL_DISABLE_MASK(SEQ_PLAYER_BGM_MAIN, 0xFFFF);
if (seqIdBgmSub != NA_BGM_LONLON) { if (seqIdBgmSub != NA_BGM_LONLON) {
SEQCMD_SET_CHANNEL_DISABLE_MASK(SEQ_PLAYER_BGM_SUB, 0xFFFF); SEQCMD_SET_CHANNEL_DISABLE_MASK(SEQ_PLAYER_BGM_SUB, 0xFFFF);
@ -4833,7 +4837,7 @@ void Audio_SetSequenceMode(u8 seqMode) {
seqMode = SEQ_MODE_IGNORE; seqMode = SEQ_MODE_IGNORE;
} }
if ((seqId == NA_BGM_DISABLED) || (sSeqFlags[(u8)(seqId & 0xFF)] & SEQ_FLAG_ENEMY) || if ((seqId == NA_BGM_DISABLED) || (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_ENEMY) ||
((sPrevSeqMode & 0x7F) == SEQ_MODE_ENEMY)) { ((sPrevSeqMode & 0x7F) == SEQ_MODE_ENEMY)) {
if (seqMode != (sPrevSeqMode & 0x7F)) { if (seqMode != (sPrevSeqMode & 0x7F)) {
if (seqMode == SEQ_MODE_ENEMY) { if (seqMode == SEQ_MODE_ENEMY) {
@ -5160,10 +5164,10 @@ void func_800F6964(u16 arg0) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_SUB, (arg0 * 3) / 2); SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_SUB, (arg0 * 3) / 2);
} }
void func_800F6AB0(u16 arg0) { void Audio_StopBgmAndFanfare(u16 fadeOutDuration) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, arg0); SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, fadeOutDuration);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, arg0); SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, fadeOutDuration);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_SUB, arg0); SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_SUB, fadeOutDuration);
Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_BGM_SUB, 0x7F, 0); Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_BGM_SUB, 0x7F, 0);
Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_FANFARE, 0x7F, 0); Audio_SetVolumeScale(SEQ_PLAYER_BGM_MAIN, VOL_SCALE_INDEX_FANFARE, 0x7F, 0);
} }
@ -5223,7 +5227,7 @@ void func_800F6C34(void) {
sPrevMainBgmSeqId = NA_BGM_DISABLED; sPrevMainBgmSeqId = NA_BGM_DISABLED;
Audio_QueueCmdS8(0x46 << 24 | SEQ_PLAYER_BGM_MAIN << 16, -1); Audio_QueueCmdS8(0x46 << 24 | SEQ_PLAYER_BGM_MAIN << 16, -1);
sSariaBgmPtr = NULL; sSariaBgmPtr = NULL;
D_8016B9F4 = 0; sFanfareStartTimer = 0;
D_8016B9F3 = 1; D_8016B9F3 = 1;
sMalonSingingDisabled = false; sMalonSingingDisabled = false;
} }
@ -5297,7 +5301,7 @@ void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId) {
u8 ioData; u8 ioData;
if ((gActiveSeqs[SEQ_PLAYER_BGM_MAIN].seqId == NA_BGM_DISABLED) || if ((gActiveSeqs[SEQ_PLAYER_BGM_MAIN].seqId == NA_BGM_DISABLED) ||
!(sSeqFlags[((u8)gActiveSeqs[SEQ_PLAYER_BGM_MAIN].seqId) & 0xFF] & SEQ_FLAG_NO_AMBIENCE)) { !(sSeqFlags[gActiveSeqs[SEQ_PLAYER_BGM_MAIN].seqId & 0xFF & 0xFF] & SEQ_FLAG_NO_AMBIENCE)) {
Audio_StartNatureAmbienceSequence(sNatureAmbienceDataIO[natureAmbienceId].playerIO, Audio_StartNatureAmbienceSequence(sNatureAmbienceDataIO[natureAmbienceId].playerIO,
sNatureAmbienceDataIO[natureAmbienceId].channelMask); sNatureAmbienceDataIO[natureAmbienceId].channelMask);

View file

@ -3,9 +3,13 @@
s32 gUseAtanContFrac; s32 gUseAtanContFrac;
f32 Math_FTanF(f32 x) { /**
f32 sin = sinf(x); * @param angle radians
f32 cos = cosf(x); * @return tan(angle)
*/
f32 Math_FTanF(f32 angle) {
f32 sin = sinf(angle);
f32 cos = cosf(angle);
return sin / cos; return sin / cos;
} }
@ -42,7 +46,7 @@ f32 Math_FAtanTaylorQF(f32 x) {
const f32* c = coeffs; const f32* c = coeffs;
f32 term; f32 term;
while (1) { while (true) {
term = *c++ * exp; term = *c++ * exp;
if (poly + term == poly) { if (poly + term == poly) {
break; break;
@ -124,6 +128,9 @@ f32 Math_FAtanContFracF(f32 x) {
} }
} }
/**
* @return arctan(x) in radians, in (-pi/2,pi/2) range
*/
f32 Math_FAtanF(f32 x) { f32 Math_FAtanF(f32 x) {
if (!gUseAtanContFrac) { if (!gUseAtanContFrac) {
return Math_FAtanTaylorF(x); return Math_FAtanTaylorF(x);
@ -132,6 +139,9 @@ f32 Math_FAtanF(f32 x) {
} }
} }
/**
* @return angle to (x,y) from vector (1,0) around (0,0) in radians, in (-pi,pi] range
*/
f32 Math_FAtan2F(f32 y, f32 x) { f32 Math_FAtan2F(f32 y, f32 x) {
if (x == 0.0f) { if (x == 0.0f) {
if (y == 0.0f) { if (y == 0.0f) {
@ -152,10 +162,16 @@ f32 Math_FAtan2F(f32 y, f32 x) {
} }
} }
/**
* @return arcsin(x) in radians, in [-pi/2,pi/2] range
*/
f32 Math_FAsinF(f32 x) { f32 Math_FAsinF(f32 x) {
return Math_FAtan2F(x, sqrtf(1.0f - SQ(x))); return Math_FAtan2F(x, sqrtf(1.0f - SQ(x)));
} }
/**
* @return arccos(x) in radians, in [0,pi] range
*/
f32 Math_FAcosF(f32 x) { f32 Math_FAcosF(f32 x) {
return M_PI / 2 - Math_FAsinF(x); return M_PI / 2 - Math_FAsinF(x);
} }

View file

@ -111,61 +111,54 @@ Vec3f* DbCamera_AddVecGeoToVec3f(Vec3f* dest, Vec3f* a, VecGeo* geo) {
return dest; return dest;
} }
Vec3f* DbCamera_CalcUpFromPitchYawRoll(Vec3f* dest, s16 pitch, s16 yaw, s16 roll) { /**
f32 sinPitch; * Calculates a new Up vector from the pitch, yaw, roll
f32 cosPitch; */
f32 sinYaw; Vec3f* DbCamera_CalcUpFromPitchYawRoll(Vec3f* viewUp, s16 pitch, s16 yaw, s16 roll) {
f32 cosYaw; f32 sinP = Math_SinS(pitch);
f32 sinNegRoll; f32 cosP = Math_CosS(pitch);
f32 cosNegRoll; f32 sinY = Math_SinS(yaw);
Vec3f spA4; f32 cosY = Math_CosS(yaw);
f32 sp54; f32 sinR = Math_SinS(-roll);
f32 sp4C; f32 cosR = Math_CosS(-roll);
f32 cosPitchCosYawSinRoll; Vec3f up;
f32 negSinPitch; Vec3f baseUp;
f32 temp_f10_2; Vec3f u;
f32 cosPitchcosYaw; Vec3f rollMtxRow1;
f32 temp_f14; Vec3f rollMtxRow2;
f32 negSinPitchSinYaw; Vec3f rollMtxRow3;
f32 negSinPitchCosYaw;
f32 cosPitchSinYaw;
f32 temp_f4_2;
f32 temp_f6;
f32 temp_f8;
f32 temp_f8_2;
f32 temp_f8_3;
sinPitch = Math_SinS(pitch); // Axis to roll around
cosPitch = Math_CosS(pitch); u.x = cosP * sinY;
sinYaw = Math_SinS(yaw); u.y = sinP;
cosYaw = Math_CosS(yaw); u.z = cosP * cosY;
sinNegRoll = Math_SinS(-roll);
cosNegRoll = Math_CosS(-roll); // Up without roll
negSinPitch = -sinPitch; baseUp.x = -sinP * sinY;
negSinPitchSinYaw = negSinPitch * sinYaw; baseUp.y = cosP;
negSinPitchCosYaw = negSinPitch * cosYaw; baseUp.z = -sinP * cosY;
temp_f14 = 1.0f - cosNegRoll;
cosPitchSinYaw = cosPitch * sinYaw; // Matrix to apply the roll to the Up vector without roll
sp54 = SQ(cosPitchSinYaw); rollMtxRow1.x = ((1.0f - SQ(u.x)) * cosR) + SQ(u.x);
sp4C = (cosPitchSinYaw * sinPitch) * ((void)0, temp_f14); rollMtxRow1.y = ((1.0f - cosR) * (u.x * u.y)) - (u.z * sinR);
cosPitchcosYaw = cosPitch * cosYaw; rollMtxRow1.z = ((1.0f - cosR) * (u.z * u.x)) + (u.y * sinR);
temp_f4_2 = ((1.0f - sp54) * cosNegRoll) + sp54;
cosPitchCosYawSinRoll = cosPitchcosYaw * sinNegRoll; rollMtxRow2.x = ((1.0f - cosR) * (u.x * u.y)) + (u.z * sinR);
temp_f6 = (cosPitchcosYaw * cosPitchSinYaw) * ((void)0, temp_f14); rollMtxRow2.y = ((1.0f - SQ(u.y)) * cosR) + SQ(u.y);
temp_f10_2 = sinPitch * sinNegRoll; rollMtxRow2.z = ((1.0f - cosR) * (u.y * u.z)) - (u.x * sinR);
spA4.x = ((negSinPitchSinYaw * temp_f4_2) + (cosPitch * (sp4C - cosPitchCosYawSinRoll))) +
(negSinPitchCosYaw * (temp_f6 + temp_f10_2)); rollMtxRow3.x = ((1.0f - cosR) * (u.z * u.x)) - (u.y * sinR);
sp54 = SQ(sinPitch); rollMtxRow3.y = ((1.0f - cosR) * (u.y * u.z)) + (u.x * sinR);
temp_f4_2 = (sinPitch * cosPitchcosYaw) * ((void)0, temp_f14); rollMtxRow3.z = ((1.0f - SQ(u.z)) * cosR) + SQ(u.z);
temp_f8_3 = cosPitchSinYaw * sinNegRoll;
temp_f8 = sp4C + cosPitchCosYawSinRoll; // rollMtx * baseUp
spA4.y = ((negSinPitchSinYaw * temp_f8) + (cosPitch * (((1.0f - sp54) * cosNegRoll) + sp54))) + up.x = DOTXYZ(baseUp, rollMtxRow1);
(negSinPitchCosYaw * (temp_f4_2 - temp_f8_3)); up.y = DOTXYZ(baseUp, rollMtxRow2);
temp_f8_2 = temp_f6 - temp_f10_2; up.z = DOTXYZ(baseUp, rollMtxRow3);
spA4.z = ((negSinPitchSinYaw * temp_f8_2) + (cosPitch * (temp_f4_2 + temp_f8_3))) +
(negSinPitchCosYaw * (((1.0f - SQ(cosPitchcosYaw)) * cosNegRoll) + SQ(cosPitchcosYaw))); *viewUp = up;
*dest = spA4;
return dest; return viewUp;
} }
char* DbCamera_SetTextValue(s16 value, char* str, u8 endIdx) { char* DbCamera_SetTextValue(s16 value, char* str, u8 endIdx) {

View file

@ -38,10 +38,18 @@ f32 Math_PowF(f32 base, s32 exp) {
return ret; return ret;
} }
/**
* @param angle radians
* @return sin(angle)
*/
f32 Math_SinF(f32 angle) { f32 Math_SinF(f32 angle) {
return sins((s16)(angle * (0x7FFF / M_PI))) * SHT_MINV; return sins((s16)(angle * (0x7FFF / M_PI))) * SHT_MINV;
} }
/**
* @param angle radians
* @return cos(angle)
*/
f32 Math_CosF(f32 angle) { f32 Math_CosF(f32 angle) {
return coss((s16)(angle * (0x7FFF / M_PI))) * SHT_MINV; return coss((s16)(angle * (0x7FFF / M_PI))) * SHT_MINV;
} }

View file

@ -1,6 +1,6 @@
#include "global.h" #include "global.h"
static u16 sATan2Tbl[] = { static u16 sAtan2Tbl[] = {
0x0000, 0x000A, 0x0014, 0x001F, 0x0029, 0x0033, 0x003D, 0x0047, 0x0051, 0x005C, 0x0066, 0x0070, 0x007A, 0x0084, 0x0000, 0x000A, 0x0014, 0x001F, 0x0029, 0x0033, 0x003D, 0x0047, 0x0051, 0x005C, 0x0066, 0x0070, 0x007A, 0x0084,
0x008F, 0x0099, 0x00A3, 0x00AD, 0x00B7, 0x00C2, 0x00CC, 0x00D6, 0x00E0, 0x00EA, 0x00F4, 0x00FF, 0x0109, 0x0113, 0x008F, 0x0099, 0x00A3, 0x00AD, 0x00B7, 0x00C2, 0x00CC, 0x00D6, 0x00E0, 0x00EA, 0x00F4, 0x00FF, 0x0109, 0x0113,
0x011D, 0x0127, 0x0131, 0x013C, 0x0146, 0x0150, 0x015A, 0x0164, 0x016F, 0x0179, 0x0183, 0x018D, 0x0197, 0x01A1, 0x011D, 0x0127, 0x0131, 0x013C, 0x0146, 0x0150, 0x015A, 0x0164, 0x016F, 0x0179, 0x0183, 0x018D, 0x0197, 0x01A1,
@ -77,24 +77,34 @@ static u16 sATan2Tbl[] = {
0x1FF6, 0x1FFB, 0x2000, 0x1FF6, 0x1FFB, 0x2000,
}; };
u16 Math_GetAtan2Tbl(f32 x, f32 y) { /**
* @param y must be >= 0 and <= x
* @param x must be >= 0
* @return arctan(y/x) as binang, in [0,0x2000] range
*/
u16 Math_GetAtan2Tbl(f32 y, f32 x) {
u16 ret; u16 ret;
if (y == 0.0f) { if (x == 0.0f) {
ret = sATan2Tbl[0]; ret = sAtan2Tbl[0];
} else { } else {
s32 tblIdx = ((x / y) * 1024.0f) + 0.5f; s32 tblIdx = ((y / x) * 1024.0f) + 0.5f;
if (tblIdx >= ARRAY_COUNT(sATan2Tbl)) { if (tblIdx >= ARRAY_COUNT(sAtan2Tbl)) {
ret = sATan2Tbl[0]; ret = sAtan2Tbl[0];
} else { } else {
ret = sATan2Tbl[tblIdx]; ret = sAtan2Tbl[tblIdx];
} }
} }
return ret; return ret;
} }
/**
* @return angle to (x,y) from vector (1,0) around (0,0) as binang, in [-0x8000,0x7FFF] range
*
* @note The arguments are (x,y), which is different from atan2's (y,x)
*/
s16 Math_Atan2S(f32 x, f32 y) { s16 Math_Atan2S(f32 x, f32 y) {
s32 ret; s32 ret;
@ -107,7 +117,7 @@ s16 Math_Atan2S(f32 x, f32 y) {
} }
} else { } else {
if (-x < y) { if (-x < y) {
ret = Math_GetAtan2Tbl(-x, y) + 0x4000; ret = 0x4000 + Math_GetAtan2Tbl(-x, y);
} else { } else {
ret = 0x8000 - Math_GetAtan2Tbl(y, -x); ret = 0x8000 - Math_GetAtan2Tbl(y, -x);
} }
@ -115,21 +125,27 @@ s16 Math_Atan2S(f32 x, f32 y) {
} else { } else {
if (x < 0.0f) { if (x < 0.0f) {
if (-y <= -x) { if (-y <= -x) {
ret = Math_GetAtan2Tbl(-y, -x) + 0x8000; ret = 0x8000 + Math_GetAtan2Tbl(-y, -x);
} else { } else {
ret = 0xC000 - Math_GetAtan2Tbl(-x, -y); ret = 0xC000 - Math_GetAtan2Tbl(-x, -y);
} }
} else { } else {
if (x < -y) { if (x < -y) {
ret = Math_GetAtan2Tbl(x, -y) + 0xC000; ret = 0xC000 + Math_GetAtan2Tbl(x, -y);
} else { } else {
ret = -Math_GetAtan2Tbl(-y, x); ret = -Math_GetAtan2Tbl(-y, x);
} }
} }
} }
return ret;
return (s16)ret;
} }
/**
* @return angle to (x,y) from vector (1,0) around (0,0) in radians, in [-pi,pi) range
*
* @note The arguments are (x,y), which is different from atan2's (y,x)
*/
f32 Math_Atan2F(f32 x, f32 y) { f32 Math_Atan2F(f32 x, f32 y) {
return BINANG_TO_RAD(Math_Atan2S(x, y)); return BINANG_TO_RAD(Math_Atan2S(x, y));
} }

View file

@ -1,12 +1,12 @@
#include "global.h" #include "global.h"
// clang-format off // clang-format off
Mtx gMtxClear = { Mtx gMtxClear = gdSPDefMtx(
65536, 0, 1, 0, 1.0f, 0.0f, 0.0f, 0.0f,
0, 65536, 0, 1, 0.0f, 1.0f, 0.0f, 0.0f,
0, 0, 0, 0, 0.0f, 0.0f, 1.0f, 0.0f,
0, 0, 0, 0, 0.0f, 0.0f, 0.0f, 1.0f
}; );
MtxF gMtxFClear = { MtxF gMtxFClear = {
1.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f,

View file

@ -1,5 +1,7 @@
#include "global.h" #include "global.h"
typedef void (*UcodeDisasCallback)(UCodeDisas*, u32);
#define F3DZEX_CONST(name) \ #define F3DZEX_CONST(name) \
{ name, #name } { name, #name }
#define F3DZEX_FLAG(set, unset) \ #define F3DZEX_FLAG(set, unset) \
@ -17,8 +19,8 @@
if (this->enableLog) \ if (this->enableLog) \
osSyncPrintf osSyncPrintf
void* UCodeDisas_TranslateAddr(UCodeDisas* this, u32 addr) { void* UCodeDisas_TranslateAddr(UCodeDisas* this, uintptr_t addr) {
u32 physical = this->segments[SEGMENT_NUMBER(addr)] + SEGMENT_OFFSET(addr); uintptr_t physical = this->segments[SEGMENT_NUMBER(addr)] + SEGMENT_OFFSET(addr);
return PHYSICAL_TO_VIRTUAL(physical); return PHYSICAL_TO_VIRTUAL(physical);
} }
@ -38,61 +40,82 @@ F3dzexFlag sUCodeDisasMtxFlags[] = {
F3DZEX_FLAG(G_MTX_PUSH, G_MTX_NOPUSH), F3DZEX_FLAG(G_MTX_PUSH, G_MTX_NOPUSH),
}; };
const char* UCodeDisas_ParseCombineColor(u32 value, u32 idx) { typedef enum { COMBINER_A = 1, COMBINER_B, COMBINER_C, COMBINER_D } CombinerArg;
const char* UCodeDisas_GetCombineColorName(u32 value, u32 arg) {
const char* ret = "?"; const char* ret = "?";
switch (value) { switch (value) {
case G_CCMUX_COMBINED: case G_CCMUX_COMBINED:
ret = "COMBINED"; ret = "COMBINED";
break; break;
case G_CCMUX_TEXEL0: case G_CCMUX_TEXEL0:
ret = "TEXEL0"; ret = "TEXEL0";
break; break;
case G_CCMUX_TEXEL1: case G_CCMUX_TEXEL1:
ret = "TEXEL1"; ret = "TEXEL1";
break; break;
case G_CCMUX_PRIMITIVE: case G_CCMUX_PRIMITIVE:
ret = "PRIMITIVE"; ret = "PRIMITIVE";
break; break;
case G_CCMUX_SHADE: case G_CCMUX_SHADE:
ret = "SHADE"; ret = "SHADE";
break; break;
case G_CCMUX_ENVIRONMENT: case G_CCMUX_ENVIRONMENT:
ret = "ENVIRONMENT"; ret = "ENVIRONMENT";
break; break;
case 6:
ret = (idx == 2) ? "CENTER" : (idx == 3) ? "SCALE" : "1"; case 6: // G_CCMUX_CENTER, G_CCMUX_SCALE, G_CCMUX_1
ret = (arg == COMBINER_B) ? "CENTER" : (arg == COMBINER_C) ? "SCALE" : "1";
break; break;
case 7:
ret = (idx == 1) ? "NOISE" : (idx == 2) ? "K4" : (idx == 3) ? "COMBINED_ALPHA" : "0"; case 7: // G_CCMUX_NOISE, G_CCMUX_K4, G_CCMUX_COMBINED_ALPHA, G_CCMUX_0
ret = (arg == COMBINER_A) ? "NOISE"
: (arg == COMBINER_B) ? "K4"
: (arg == COMBINER_C) ? "COMBINED_ALPHA"
: "0";
break; break;
default: default:
if (idx == 3) { if (arg == COMBINER_C) {
switch (value) { switch (value) {
case G_CCMUX_TEXEL0_ALPHA: case G_CCMUX_TEXEL0_ALPHA:
ret = "TEXEL0_ALPHA"; ret = "TEXEL0_ALPHA";
break; break;
case G_CCMUX_TEXEL1_ALPHA: case G_CCMUX_TEXEL1_ALPHA:
ret = "TEXEL1_ALPHA"; ret = "TEXEL1_ALPHA";
break; break;
case G_CCMUX_PRIMITIVE_ALPHA: case G_CCMUX_PRIMITIVE_ALPHA:
ret = "PRIMITIVE_ALPHA"; ret = "PRIMITIVE_ALPHA";
break; break;
case G_CCMUX_SHADE_ALPHA: case G_CCMUX_SHADE_ALPHA:
ret = "SHADE_ALPHA"; ret = "SHADE_ALPHA";
break; break;
case G_CCMUX_ENV_ALPHA: case G_CCMUX_ENV_ALPHA:
ret = "ENV_ALPHA"; ret = "ENV_ALPHA";
break; break;
case G_CCMUX_LOD_FRACTION: case G_CCMUX_LOD_FRACTION:
ret = "LOD_FRACTION"; ret = "LOD_FRACTION";
break; break;
case G_CCMUX_PRIM_LOD_FRAC: case G_CCMUX_PRIM_LOD_FRAC:
ret = "PRIM_LOD_FRAC"; ret = "PRIM_LOD_FRAC";
break; break;
case G_CCMUX_K5: case G_CCMUX_K5:
ret = "K5"; ret = "K5";
break; break;
default: default:
ret = "0"; ret = "0";
break; break;
@ -104,30 +127,38 @@ const char* UCodeDisas_ParseCombineColor(u32 value, u32 idx) {
return ret; return ret;
} }
const char* UCodeDisas_ParseCombineAlpha(u32 value, u32 idx) { const char* UCodeDisas_GetCombineAlphaName(u32 value, u32 arg) {
const char* ret = "?"; const char* ret = "?";
switch (value) { switch (value) {
case 0: case 0: // G_ACMUX_LOD_FRACTION, G_ACMUX_COMBINED
ret = (idx == 3) ? "LOD_FRACTION" : "COMBINED"; ret = (arg == COMBINER_C) ? "LOD_FRACTION" : "COMBINED";
break; break;
case G_ACMUX_TEXEL0: case G_ACMUX_TEXEL0:
ret = "TEXEL0"; ret = "TEXEL0";
break; break;
case G_ACMUX_TEXEL1: case G_ACMUX_TEXEL1:
ret = "TEXEL1"; ret = "TEXEL1";
break; break;
case G_ACMUX_PRIMITIVE: case G_ACMUX_PRIMITIVE:
ret = "PRIMITIVE"; ret = "PRIMITIVE";
break; break;
case G_ACMUX_SHADE: case G_ACMUX_SHADE:
ret = "SHADE"; ret = "SHADE";
break; break;
case G_ACMUX_ENVIRONMENT: case G_ACMUX_ENVIRONMENT:
ret = "ENVIRONMENT"; ret = "ENVIRONMENT";
break; break;
case 6:
ret = (idx == 3) ? "PRIM_LOD_FRAC" : "1"; case 6: // G_ACMUX_PRIM_LOD_FRAC, G_ACMUX_1
ret = (arg == COMBINER_C) ? "PRIM_LOD_FRAC" : "1";
break; break;
case G_ACMUX_0: case G_ACMUX_0:
ret = "0"; ret = "0";
break; break;
@ -162,7 +193,7 @@ void UCodeDisas_SetCurUCodeImpl(UCodeDisas* this, void* ptr) {
} }
} }
void UCodeDisas_ParseGeometryMode(UCodeDisas* this, u32 mode) { void UCodeDisas_PrintGeometryMode(UCodeDisas* this, u32 mode) {
u32 first = true; u32 first = true;
s32 i; s32 i;
@ -181,7 +212,7 @@ void UCodeDisas_ParseGeometryMode(UCodeDisas* this, u32 mode) {
} }
} }
void UCodeDisas_ParseRenderMode(UCodeDisas* this, u32 mode) { void UCodeDisas_PrintRenderMode(UCodeDisas* this, u32 mode) {
static F3dzexRenderMode sUCodeDisasRenderModeFlags[] = { static F3dzexRenderMode sUCodeDisasRenderModeFlags[] = {
F3DZEX_RENDERMODE(AA_EN, 0x8), F3DZEX_RENDERMODE(AA_EN, 0x8),
F3DZEX_RENDERMODE(Z_CMP, 0x10), F3DZEX_RENDERMODE(Z_CMP, 0x10),
@ -200,7 +231,7 @@ void UCodeDisas_ParseRenderMode(UCodeDisas* this, u32 mode) {
F3DZEX_RENDERMODE(ALPHA_CVG_SEL, 0x2000), F3DZEX_RENDERMODE(ALPHA_CVG_SEL, 0x2000),
F3DZEX_RENDERMODE(FORCE_BL, 0x4000), F3DZEX_RENDERMODE(FORCE_BL, 0x4000),
}; };
static const char* D_8012DDDC[4][4] = { static const char* sBlenderInputNames[4][4] = {
{ "G_BL_CLR_IN", "G_BL_CLR_MEM", "G_BL_CLR_BL", "G_BL_CLR_FOG" }, { "G_BL_CLR_IN", "G_BL_CLR_MEM", "G_BL_CLR_BL", "G_BL_CLR_FOG" },
{ "G_BL_A_IN", "G_BL_A_FOG", "G_BL_A_SHADE", "G_BL_0" }, { "G_BL_A_IN", "G_BL_A_FOG", "G_BL_A_SHADE", "G_BL_0" },
{ "G_BL_CLR_IN", "G_BL_CLR_MEM", "G_BL_CLR_BL", "G_BL_CLR_FOG" }, { "G_BL_CLR_IN", "G_BL_CLR_MEM", "G_BL_CLR_BL", "G_BL_CLR_FOG" },
@ -224,18 +255,19 @@ void UCodeDisas_ParseRenderMode(UCodeDisas* this, u32 mode) {
// clang-format off // clang-format off
if (this->enableLog == 0) {} else { osSyncPrintf("\nGBL_c1(%s, %s, %s, %s)|", if (this->enableLog == 0) {} else { osSyncPrintf("\nGBL_c1(%s, %s, %s, %s)|",
D_8012DDDC[0][a >> 12 & 3], D_8012DDDC[1][a >> 8 & 3], D_8012DDDC[2][a >> 4 & 3], D_8012DDDC[3][a >> 0 & 3]); sBlenderInputNames[0][a >> 12 & 3], sBlenderInputNames[1][a >> 8 & 3], sBlenderInputNames[2][a >> 4 & 3], sBlenderInputNames[3][a >> 0 & 3]);
} }
// clang-format on // clang-format on
if (this->enableLog) { if (this->enableLog) {
osSyncPrintf("\nGBL_c2(%s, %s, %s, %s)", D_8012DDDC[0][b >> 12 & 3], D_8012DDDC[1][b >> 8 & 3], osSyncPrintf("\nGBL_c2(%s, %s, %s, %s)", sBlenderInputNames[0][b >> 12 & 3], sBlenderInputNames[1][b >> 8 & 3],
D_8012DDDC[2][b >> 4 & 3], D_8012DDDC[3][b >> 0 & 3]); sBlenderInputNames[2][b >> 4 & 3], sBlenderInputNames[3][b >> 0 & 3]);
} }
} }
void UCodeDisas_PrintVertices(UCodeDisas* this, Vtx* vtx, s32 count, s32 start) { void UCodeDisas_PrintVertices(UCodeDisas* this, Vtx* vtx, s32 count, s32 start) {
s32 i; s32 i;
for (i = 0; i < count; i++) { for (i = 0; i < count; i++) {
if (this->geometryMode & G_LIGHTING) { if (this->geometryMode & G_LIGHTING) {
DISAS_LOG("\n{{%6d, %6d, %6d, %d, %6d, %6d, %3d, %3d, %3d, %3d}}, /* vc%d */", vtx->n.ob[0], vtx->n.ob[1], DISAS_LOG("\n{{%6d, %6d, %6d, %d, %6d, %6d, %3d, %3d, %3d, %3d}}, /* vc%d */", vtx->n.ob[0], vtx->n.ob[1],
@ -252,225 +284,32 @@ void UCodeDisas_PrintVertices(UCodeDisas* this, Vtx* vtx, s32 count, s32 start)
} }
} }
// Todo: clean this up void UCodeDisas_Disassemble(UCodeDisas* this, Gfx* ptr) {
typedef struct {
s8 cmd;
u8 v0;
u8 v1;
u8 wd;
u32 pad; u32 pad;
} Gline3DFix; uintptr_t addr;
typedef struct {
int cmd : 8;
u32 pad : 4;
u32 numv : 8;
s32 pad2 : 4;
u8 vbidx;
} Gvtx;
typedef struct {
u8 pad : 8;
u8 v0 : 8;
u8 v1 : 8;
u8 v2 : 8;
} Gtrimod;
typedef struct {
int cmd : 8;
int pad : 24;
Gtrimod tri;
} Gtri1;
typedef struct {
Gtrimod tri1;
Gtrimod tri2;
} Gtri2;
typedef struct {
u8 pad : 8;
u8 v0 : 8;
u8 v1 : 8;
u8 v2 : 8;
u8 pad1 : 8;
u8 pad2 : 8;
u8 pad3 : 8;
u8 v3 : 8;
} Gquadmod;
typedef struct {
u16 pad;
u16 vstart;
u16 pad2;
u16 vend;
} Gcull;
typedef struct {
u16 pad;
u16 vstart;
u16 pad2;
u16 vend;
} Gbranchz;
typedef struct {
int cmd : 8;
u8 pad;
u8 prim_min_level;
u8 prim_level;
u8 r;
u8 g;
u8 b;
u8 a;
} GsetcolorMod;
typedef struct {
u8 cmd;
char pad[3];
u16 z;
u16 d;
} Gsetprimdepth;
typedef struct {
u8 cmd;
u8 type;
u16 len;
union {
u32 u32;
f32 f32;
} value;
} Gnoop;
typedef struct {
u8 cmd;
u8 pad[2];
u8 params;
u32 addr;
} Gmatrix;
typedef struct {
u8 cmd;
u32 a : 4;
u32 c : 5;
u32 z : 3;
u32 x : 3;
u32 e : 4;
u32 g : 5;
u32 b : 4;
u32 f : 4;
u32 v : 3;
u32 t : 3;
u32 d : 3;
u32 y : 3;
u32 w : 3;
u32 h : 3;
u32 u : 3;
u32 s : 3;
} GsetcombineMod;
typedef struct {
u32 cmd : 8;
u32 pad0 : 8;
u32 sft : 8;
u32 len : 8;
u32 data : 32;
} GsetothermodeMod;
typedef struct {
s32 cmd : 8;
u32 offset : 16;
u32 index : 8;
u32 data;
} Gmovewd;
typedef struct {
s32 cmd : 8;
u32 size : 8;
u32 offset : 8;
u32 index : 8;
u32 data;
} Gmovemem;
typedef struct {
u8 cmd : 8;
u8 lodscale : 8;
u8 pad : 2;
u8 level : 3;
u8 tile : 3;
unsigned char on;
unsigned short s;
unsigned short t;
} Gtexturemod;
typedef struct {
int cmd : 8;
int pad1 : 24;
u32 param : 26;
unsigned char pad3 : 6;
} Gpopmtxmod;
typedef union {
Gwords words;
Gnoop noop;
Gmatrix matrix;
Gdma dma;
Gtri1 tri1;
Gtri2 tri2;
Gquadmod quad;
Gcull cull;
Gline3D line;
Gline3DFix linefix;
Gmovewd movewd;
Gmovemem movemem;
Gpopmtx popmtx;
Gpopmtxmod popmtxmod;
Gsegment segment;
GsetothermodeH setothermodeH;
GsetothermodeL setothermodeL;
GsetothermodeMod setothermode;
Gtexture texture;
Gtexturemod texmod;
Gperspnorm perspnorm;
Gsetimg setimg;
GsetcombineMod setcombine;
GsetcolorMod setcolor; // mod
Gfillrect fillrect; /* use for setscissor also */
Gsettile settile;
Gloadtile loadtile; /* use for loadblock also, th is dxt */
Gsettilesize settilesize;
Gloadtlut loadtlut;
Gsetprimdepth setprimdepth;
Gvtx vtx;
long long int force_structure_alignment;
} GfxMod;
void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
u32 pad;
u32 addr;
u32 rdpHalf; u32 rdpHalf;
u16 linkDlLow; u16 linkDlLow;
u8 sid; u8 sid;
u8 cmd; u8 cmd;
s32 i0; s32 i;
u32 exit; u32 exit;
GfxMod curGfx[1]; Gfx curGfx[1];
exit = false; exit = false;
while (!exit) { while (!exit) {
this->dlCnt++; this->dlCnt++;
ptr = UCodeDisas_TranslateAddr(this, (u32)ptr); ptr = UCodeDisas_TranslateAddr(this, (uintptr_t)ptr);
DISAS_LOG("%08x:", ptr); DISAS_LOG("%08x:", ptr);
*curGfx = *ptr; *curGfx = *ptr;
cmd = curGfx->dma.cmd; cmd = curGfx->noop.cmd;
addr = (u32)UCodeDisas_TranslateAddr(this, curGfx->dma.addr); addr = (uintptr_t)UCodeDisas_TranslateAddr(this, (uintptr_t)curGfx->noop.value.addr);
DISAS_LOG("%08x-%08x:", curGfx->words.w0, curGfx->words.w1); DISAS_LOG("%08x-%08x:", curGfx->words.w0, curGfx->words.w1);
for (i0 = 0; i0 < this->dlDepth; i0++) { for (i = 0; i < this->dlDepth; i++) {
DISAS_LOG(" "); DISAS_LOG(" ");
} }
@ -483,15 +322,15 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
Gdma dma = ptr->dma; Gdma dma = ptr->dma;
switch (dma.par) { switch (dma.par) {
case 0: { case G_DL_PUSH: {
DISAS_LOG("gsSPDisplayList(0x%08x),", dma.addr); DISAS_LOG("gsSPDisplayList(0x%08x),", dma.addr);
this->dlStack[this->dlDepth++] = (Gfx*)(ptr + 1); this->dlStack[this->dlDepth++] = (Gfx*)(ptr + 1);
ptr = (GfxMod*)addr - 1; ptr = (Gfx*)addr - 1;
} break; } break;
case 1: { case G_DL_NOPUSH: {
DISAS_LOG("gsSPBranchList(0x%08x),", dma.addr); DISAS_LOG("gsSPBranchList(0x%08x),", dma.addr);
ptr = (GfxMod*)addr - 1; ptr = (Gfx*)addr - 1;
} break; } break;
} }
} break; } break;
@ -513,7 +352,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break; } break;
case G_LOAD_UCODE: { case G_LOAD_UCODE: {
if (curGfx->dma.len == 0x7FF) { if (curGfx->dma.len == SP_UCODE_DATA_SIZE - 1) {
DISAS_LOG("gsSPLoadUcode(0x%08x, 0x%08x),", curGfx->dma.addr, rdpHalf); DISAS_LOG("gsSPLoadUcode(0x%08x, 0x%08x),", curGfx->dma.addr, rdpHalf);
} else { } else {
DISAS_LOG("gsSPLoadUcodeEx(0x%08x, 0x%08x, 0x%05x),", curGfx->dma.addr, rdpHalf, DISAS_LOG("gsSPLoadUcodeEx(0x%08x, 0x%08x, 0x%05x),", curGfx->dma.addr, rdpHalf,
@ -528,7 +367,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
if (this->dlDepth <= 0) { if (this->dlDepth <= 0) {
exit = true; exit = true;
} else { } else {
ptr = (GfxMod*)this->dlStack[--this->dlDepth] - 1; ptr = this->dlStack[--this->dlDepth] - 1;
} }
} break; } break;
@ -579,20 +418,28 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break; } break;
case G_SETCOMBINE: { case G_SETCOMBINE: {
GsetcombineMod setcombine = ptr->setcombine; Gsetcombine setcombine = ptr->setcombine;
DISAS_LOG("gsDPSetCombineLERP(%s,%s,%s,%s, %s,%s,%s,%s, %s,%s,%s,%s, %s,%s,%s,%s),", DISAS_LOG("gsDPSetCombineLERP(%s,%s,%s,%s, %s,%s,%s,%s, %s,%s,%s,%s, %s,%s,%s,%s),",
UCodeDisas_ParseCombineColor(setcombine.a, 1), UCodeDisas_ParseCombineColor(setcombine.b, 2), UCodeDisas_GetCombineColorName(setcombine.a0, COMBINER_A),
UCodeDisas_ParseCombineColor(setcombine.c, 3), UCodeDisas_ParseCombineColor(setcombine.d, 4), UCodeDisas_GetCombineColorName(setcombine.b0, COMBINER_B),
UCodeDisas_GetCombineColorName(setcombine.c0, COMBINER_C),
UCodeDisas_GetCombineColorName(setcombine.d0, COMBINER_D),
UCodeDisas_ParseCombineAlpha(setcombine.z, 1), UCodeDisas_ParseCombineAlpha(setcombine.y, 2), UCodeDisas_GetCombineAlphaName(setcombine.Aa0, COMBINER_A),
UCodeDisas_ParseCombineAlpha(setcombine.x, 3), UCodeDisas_ParseCombineAlpha(setcombine.w, 4), UCodeDisas_GetCombineAlphaName(setcombine.Ab0, COMBINER_B),
UCodeDisas_GetCombineAlphaName(setcombine.Ac0, COMBINER_C),
UCodeDisas_GetCombineAlphaName(setcombine.Ad0, COMBINER_D),
UCodeDisas_ParseCombineColor(setcombine.e, 1), UCodeDisas_ParseCombineColor(setcombine.f, 2), UCodeDisas_GetCombineColorName(setcombine.a1, COMBINER_A),
UCodeDisas_ParseCombineColor(setcombine.g, 3), UCodeDisas_ParseCombineColor(setcombine.h, 4), UCodeDisas_GetCombineColorName(setcombine.b1, COMBINER_B),
UCodeDisas_GetCombineColorName(setcombine.c1, COMBINER_C),
UCodeDisas_GetCombineColorName(setcombine.d1, COMBINER_D),
UCodeDisas_ParseCombineAlpha(setcombine.v, 1), UCodeDisas_ParseCombineAlpha(setcombine.u, 2), UCodeDisas_GetCombineAlphaName(setcombine.Aa1, COMBINER_A),
UCodeDisas_ParseCombineAlpha(setcombine.t, 3), UCodeDisas_ParseCombineAlpha(setcombine.s, 4)); UCodeDisas_GetCombineAlphaName(setcombine.Ab1, COMBINER_B),
UCodeDisas_GetCombineAlphaName(setcombine.Ac1, COMBINER_C),
UCodeDisas_GetCombineAlphaName(setcombine.Ad1, COMBINER_D));
if (this->pipeSyncRequired) { if (this->pipeSyncRequired) {
DISAS_LOG("### PipeSyncが必要です。\n"); DISAS_LOG("### PipeSyncが必要です。\n");
@ -624,34 +471,33 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
-1), -1),
}; };
u32 len = curGfx->setothermode.len + 1; u32 len = curGfx->setothermodeH.len + 1;
u32 sft = (-curGfx->setothermode.sft - len) + 32; u32 sft = (-curGfx->setothermodeH.sft - len) + 32;
u32 s2 = curGfx->setothermode.data * 1; u32 s2 = curGfx->setothermodeH.data * 1;
u32 i1; u32 j;
u32 i2; u32 k;
for (i1 = 0; i1 < ARRAY_COUNTU(sUCodeDisasModeHMacros); i1++) { for (j = 0; j < ARRAY_COUNTU(sUCodeDisasModeHMacros); j++) {
if (sft == sUCodeDisasModeHMacros[i1].shift) { if (sft == sUCodeDisasModeHMacros[j].shift) {
for (i2 = 0; i2 < 4; i2++) { for (k = 0; k < ARRAY_COUNTU(sUCodeDisasModeHMacros[j].values); k++) {
if (s2 == sUCodeDisasModeHMacros[i1].values[i2].value) { if (s2 == sUCodeDisasModeHMacros[j].values[k].value) {
DISAS_LOG("gsDP%s(%s),", sUCodeDisasModeHMacros[i1].name, DISAS_LOG("gsDP%s(%s),", sUCodeDisasModeHMacros[j].name,
sUCodeDisasModeHMacros[i1].values[i2].name); sUCodeDisasModeHMacros[j].values[k].name);
goto block_1; goto found_othermode_hi_macro;
} }
} }
} }
} }
DISAS_LOG("gsSPSetOtherModeH(%d, %d, 0x%08x),", sft, len, s2); DISAS_LOG("gsSPSetOtherModeH(%d, %d, 0x%08x),", sft, len, s2);
block_1: found_othermode_hi_macro:
this->modeH &= (((1 - (1 << len)) << sft) - 1); this->modeH &= ((1 - (1 << len)) << sft) - 1;
this->modeH |= s2; this->modeH |= s2;
if (this->pipeSyncRequired) { if (this->pipeSyncRequired) {
DISAS_LOG("### PipeSyncが必要です。\n"); DISAS_LOG("### PipeSyncが必要です。\n");
this->syncErr++; this->syncErr++;
} }
} break; } break;
case G_SETOTHERMODE_L: { case G_SETOTHERMODE_L: {
@ -661,24 +507,24 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
F3DZEX_SETRENDERMACRO("gsDPSetDepthSource", G_MDSFT_ZSRCSEL, 1, G_ZS_PIXEL, G_ZS_PRIM, -1, -1), F3DZEX_SETRENDERMACRO("gsDPSetDepthSource", G_MDSFT_ZSRCSEL, 1, G_ZS_PIXEL, G_ZS_PRIM, -1, -1),
}; };
u32 len = curGfx->setothermode.len + 1; u32 len = curGfx->setothermodeL.len + 1;
u32 sft = (-curGfx->setothermode.sft - len) + 32; u32 sft = (-curGfx->setothermodeL.sft - len) + 32;
u32 s2 = curGfx->setothermode.data * 1; u32 s2 = curGfx->setothermodeL.data * 1;
u32 i1; u32 j;
u32 i2; u32 k;
if (sft == G_MDSFT_RENDERMODE) { if (sft == G_MDSFT_RENDERMODE) {
DISAS_LOG("\ngsDPSetRenderBlender("); DISAS_LOG("\ngsDPSetRenderBlender(");
UCodeDisas_ParseRenderMode(this, s2); UCodeDisas_PrintRenderMode(this, s2);
DISAS_LOG("\n),"); DISAS_LOG("\n),");
} else { } else {
for (i1 = 0; i1 * 1 < ARRAY_COUNTU(sUCodeDisasModeLMacros); i1++) { for (j = 0; j * 1 < ARRAY_COUNTU(sUCodeDisasModeLMacros); j++) {
if (sft == sUCodeDisasModeLMacros[i1].shift) { if (sft == sUCodeDisasModeLMacros[j].shift) {
for (i2 = 0; i2 < 4; i2++) { for (k = 0; k < ARRAY_COUNTU(sUCodeDisasModeLMacros[j].values); k++) {
if (s2 == sUCodeDisasModeLMacros[i1].values[i2].value) { if (s2 == sUCodeDisasModeLMacros[j].values[k].value) {
DISAS_LOG("gsDP%s(%s),", sUCodeDisasModeLMacros[i1].name, DISAS_LOG("gsDP%s(%s),", sUCodeDisasModeLMacros[j].name,
sUCodeDisasModeLMacros[i1].values[i2].name); sUCodeDisasModeLMacros[j].values[k].name);
goto block_2; goto found_othermode_lo_macro;
} }
} }
} }
@ -686,7 +532,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
DISAS_LOG("gsSPSetOtherModeL(%d, %d, 0x%08x),", sft, len, s2); DISAS_LOG("gsSPSetOtherModeL(%d, %d, 0x%08x),", sft, len, s2);
} }
block_2: found_othermode_lo_macro:
this->modeL &= (((1 - (1 << len)) << sft) - 1); this->modeL &= (((1 - (1 << len)) << sft) - 1);
this->modeL |= s2; this->modeL |= s2;
@ -758,7 +604,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break; } break;
case G_SETZIMG: { case G_SETZIMG: {
DISAS_LOG("gsDPSetDepthImage(0x%08x(0x%08x)),", curGfx->words.w1, addr); DISAS_LOG("gsDPSetDepthImage(0x%08x(0x%08x)),", curGfx->setimg.dram, addr);
if (this->pipeSyncRequired) { if (this->pipeSyncRequired) {
DISAS_LOG("### PipeSyncが必要です。\n"); DISAS_LOG("### PipeSyncが必要です。\n");
@ -814,7 +660,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break; } break;
case G_SETFILLCOLOR: { case G_SETFILLCOLOR: {
DISAS_LOG("gsDPSetFillColor(0x%08x),", curGfx->words.w1); DISAS_LOG("gsDPSetFillColor(0x%08x),", curGfx->setcolor.color);
if (this->pipeSyncRequired) { if (this->pipeSyncRequired) {
DISAS_LOG("### PipeSyncが必要です。\n"); DISAS_LOG("### PipeSyncが必要です。\n");
@ -823,7 +669,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break; } break;
case G_SETPRIMDEPTH: { case G_SETPRIMDEPTH: {
DISAS_LOG("gsDPSetPrimDepth(%d, %d),", curGfx->setprimdepth.z, curGfx->setprimdepth.d); DISAS_LOG("gsDPSetPrimDepth(%d, %d),", curGfx->setprimdepth.z, curGfx->setprimdepth.dz);
if (this->pipeSyncRequired) { if (this->pipeSyncRequired) {
DISAS_LOG("### PipeSyncが必要です。\n"); DISAS_LOG("### PipeSyncが必要です。\n");
@ -872,19 +718,19 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break; } break;
case 1: { case 1: {
DISAS_LOG("count_gsDPNoOpHere([%s:%d]),", curGfx->noop.value.u32, curGfx->noop.len); DISAS_LOG("count_gsDPNoOpHere([%s:%d]),", curGfx->noop.value.str, curGfx->noop.len);
} break; } break;
case 7: { case 7: {
DISAS_LOG("count_gsDPNoOpOpenDisp([%s:%d]),", curGfx->noop.value.u32, curGfx->noop.len); DISAS_LOG("count_gsDPNoOpOpenDisp([%s:%d]),", curGfx->noop.value.str, curGfx->noop.len);
} break; } break;
case 8: { case 8: {
DISAS_LOG("count_gsDPNoOpCloseDisp([%s:%d]),", curGfx->noop.value.u32, curGfx->noop.len); DISAS_LOG("count_gsDPNoOpCloseDisp([%s:%d]),", curGfx->noop.value.str, curGfx->noop.len);
} break; } break;
case 2: { case 2: {
DISAS_LOG("count_gsDPNoOpString(%c%s%c, %d),", '"', curGfx->noop.value.u32, '"', DISAS_LOG("count_gsDPNoOpString(%c%s%c, %d),", '"', curGfx->noop.value.str, '"',
curGfx->noop.len); curGfx->noop.len);
} break; } break;
@ -906,9 +752,9 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break; } break;
case 6: { case 6: {
/*! @bug arguments are not printed */ //! @bug arguments are not printed
DISAS_LOG("count_gsDPNoOpCallBack(%08x,%d),"); DISAS_LOG("count_gsDPNoOpCallBack(%08x,%d),");
((void (*)(UCodeDisas*, u32))curGfx->noop.value.u32)(this, curGfx->noop.len); ((UcodeDisasCallback)curGfx->noop.value.callback)(this, curGfx->noop.len);
} break; } break;
default: { default: {
@ -924,27 +770,27 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
case UCODE_UNK: { case UCODE_UNK: {
switch (cmd) { switch (cmd) {
case G_MTX: { case G_MTX: {
Gmatrix gmtx = ptr->matrix; Gdma2 gmtx = ptr->dma2;
u32 params; u32 params;
MtxF mtx; MtxF mtxF;
s32 i1 = 0; s32 j = 0;
DISAS_LOG("gsSPMatrix(0x%08x(%08x), 0", gmtx.addr, addr); DISAS_LOG("gsSPMatrix(0x%08x(%08x), 0", gmtx.addr, addr);
params = (gmtx.params ^ G_MTX_PUSH); params = gmtx.par ^ G_MTX_PUSH;
for (; i1 != ARRAY_COUNT(sUCodeDisasMtxFlags); i1++) { for (; j != ARRAY_COUNT(sUCodeDisasMtxFlags); j++) {
DISAS_LOG("|%s", (sUCodeDisasMtxFlags[i1].value & params) DISAS_LOG("|%s", (sUCodeDisasMtxFlags[j].value & params)
? sUCodeDisasMtxFlags[i1].setName ? sUCodeDisasMtxFlags[j].setName
: sUCodeDisasMtxFlags[i1].unsetName); : sUCodeDisasMtxFlags[j].unsetName);
} }
DISAS_LOG("),", gmtx.addr); /*! @bug gmtx.addr shouldn't be here*/ DISAS_LOG("),", gmtx.addr); //! @bug gmtx.addr shouldn't be here
if (this->enableLog >= 2) { if (this->enableLog >= 2) {
MtxConv_L2F(&mtx, (Mtx*)addr); MtxConv_L2F(&mtxF, (Mtx*)addr);
DISAS_LOG("\n"); DISAS_LOG("\n");
/*! @bug %.04x.%04x is a typo, should be %04x.%04x */ //! @bug %.04x.%04x is a typo, should be %04x.%04x
// clang-format off // clang-format off
DISAS_LOG( DISAS_LOG(
"/ %04x.%04x %04x.%04x %04x.%04x %.04x.%04x \\/ %12.6f %12.6f %12.6f %12.6f \\\n" "/ %04x.%04x %04x.%04x %04x.%04x %.04x.%04x \\/ %12.6f %12.6f %12.6f %12.6f \\\n"
@ -955,22 +801,22 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
((Mtx*)addr)->intPart[1][0], ((Mtx*)addr)->fracPart[1][0], ((Mtx*)addr)->intPart[1][0], ((Mtx*)addr)->fracPart[1][0],
((Mtx*)addr)->intPart[2][0], ((Mtx*)addr)->fracPart[2][0], ((Mtx*)addr)->intPart[2][0], ((Mtx*)addr)->fracPart[2][0],
((Mtx*)addr)->intPart[3][0], ((Mtx*)addr)->fracPart[3][0], ((Mtx*)addr)->intPart[3][0], ((Mtx*)addr)->fracPart[3][0],
mtx.mf[0][0], mtx.mf[1][0], mtx.mf[2][0], mtx.mf[3][0], mtxF.mf[0][0], mtxF.mf[1][0], mtxF.mf[2][0], mtxF.mf[3][0],
((Mtx*)addr)->intPart[0][1], ((Mtx*)addr)->fracPart[0][1], ((Mtx*)addr)->intPart[0][1], ((Mtx*)addr)->fracPart[0][1],
((Mtx*)addr)->intPart[1][1], ((Mtx*)addr)->fracPart[1][1], ((Mtx*)addr)->intPart[1][1], ((Mtx*)addr)->fracPart[1][1],
((Mtx*)addr)->intPart[2][1], ((Mtx*)addr)->fracPart[2][1], ((Mtx*)addr)->intPart[2][1], ((Mtx*)addr)->fracPart[2][1],
((Mtx*)addr)->intPart[3][1], ((Mtx*)addr)->fracPart[3][1], ((Mtx*)addr)->intPart[3][1], ((Mtx*)addr)->fracPart[3][1],
mtx.mf[0][1], mtx.mf[1][1], mtx.mf[2][1], mtx.mf[3][1], mtxF.mf[0][1], mtxF.mf[1][1], mtxF.mf[2][1], mtxF.mf[3][1],
((Mtx*)addr)->intPart[0][2], ((Mtx*)addr)->fracPart[0][2], ((Mtx*)addr)->intPart[0][2], ((Mtx*)addr)->fracPart[0][2],
((Mtx*)addr)->intPart[1][2], ((Mtx*)addr)->fracPart[1][2], ((Mtx*)addr)->intPart[1][2], ((Mtx*)addr)->fracPart[1][2],
((Mtx*)addr)->intPart[2][2], ((Mtx*)addr)->fracPart[2][2], ((Mtx*)addr)->intPart[2][2], ((Mtx*)addr)->fracPart[2][2],
((Mtx*)addr)->intPart[3][2], ((Mtx*)addr)->fracPart[3][2], ((Mtx*)addr)->intPart[3][2], ((Mtx*)addr)->fracPart[3][2],
mtx.mf[0][2], mtx.mf[1][2], mtx.mf[2][2], mtx.mf[3][2], mtxF.mf[0][2], mtxF.mf[1][2], mtxF.mf[2][2], mtxF.mf[3][2],
((Mtx*)addr)->intPart[0][3], ((Mtx*)addr)->fracPart[0][3], ((Mtx*)addr)->intPart[0][3], ((Mtx*)addr)->fracPart[0][3],
((Mtx*)addr)->intPart[1][3], ((Mtx*)addr)->fracPart[1][3], ((Mtx*)addr)->intPart[1][3], ((Mtx*)addr)->fracPart[1][3],
((Mtx*)addr)->intPart[2][3], ((Mtx*)addr)->fracPart[2][3], ((Mtx*)addr)->intPart[2][3], ((Mtx*)addr)->fracPart[2][3],
((Mtx*)addr)->intPart[3][3], ((Mtx*)addr)->fracPart[3][3], ((Mtx*)addr)->intPart[3][3], ((Mtx*)addr)->fracPart[3][3],
mtx.mf[0][3], mtx.mf[1][3], mtx.mf[2][3], mtx.mf[3][3]); mtxF.mf[0][3], mtxF.mf[1][3], mtxF.mf[2][3], mtxF.mf[3][3]);
// clang-format on // clang-format on
} }
} break; } break;
@ -981,9 +827,9 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
numv >>= 12; numv >>= 12;
numv &= 0xFF; numv &= 0xFF;
vbidx = (curGfx->vtx.vbidx >> 1) - numv; vbidx = (curGfx->vtx.par >> 1) - numv;
DISAS_LOG("gsSPVertex(0x%08x(0x%08x), %d, %d),", curGfx->words.w1, addr, numv, vbidx); DISAS_LOG("gsSPVertex(0x%08x(0x%08x), %d, %d),", curGfx->vtx.addr, addr, numv, vbidx);
this->vtxCnt += numv; this->vtxCnt += numv;
this->spvtxCnt++; this->spvtxCnt++;
@ -1006,21 +852,21 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break; } break;
case G_TRI1: { case G_TRI1: {
Gtri1 gtri = ptr->tri1; Gtri gtri = ptr->tri;
Gtrimod tri = gtri.tri; Tri tri = gtri.tri;
DISAS_LOG("gsSP1Triangle(%d, %d, %d),", tri.v0 / 2, tri.v1 / 2, tri.v2 / 2); DISAS_LOG("gsSP1Triangle(%d, %d, %d),", tri.v[0] / 2, tri.v[1] / 2, tri.v[2] / 2);
this->tri1Cnt++; this->tri1Cnt++;
this->pipeSyncRequired = true; this->pipeSyncRequired = true;
} break; } break;
case G_LINE3D: { case G_LINE3D: {
if (curGfx->linefix.wd == 0) { if (curGfx->line.wd == 0) {
DISAS_LOG("gsSPLine3D(%d, %d),", curGfx->linefix.v0, curGfx->linefix.v1); DISAS_LOG("gsSPLine3D(%d, %d),", curGfx->line.v0, curGfx->line.v1);
} else { } else {
DISAS_LOG("gsSPLineW3D(%d, %d, %d),", curGfx->linefix.v0, curGfx->linefix.v1, DISAS_LOG("gsSPLineW3D(%d, %d, %d),", curGfx->line.v0, curGfx->line.v1,
curGfx->linefix.wd); curGfx->line.wd);
} }
this->lineCnt++; this->lineCnt++;
@ -1032,13 +878,13 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
u32 v0, v1, v2; u32 v0, v1, v2;
u32 v3, v4, v5; u32 v3, v4, v5;
v0 = tri2.tri1.v0 / 2; v0 = tri2.tri1.v[0] / 2;
v1 = tri2.tri1.v1 / 2; v1 = tri2.tri1.v[1] / 2;
v2 = tri2.tri1.v2 / 2; v2 = tri2.tri1.v[2] / 2;
v3 = tri2.tri2.v0 / 2; v3 = tri2.tri2.v[0] / 2;
v4 = tri2.tri2.v1 / 2; v4 = tri2.tri2.v[1] / 2;
v5 = tri2.tri2.v2 / 2; v5 = tri2.tri2.v[2] / 2;
DISAS_LOG("gsSP2Triangles(%d, %d, %d, 0, %d, %d, %d, 0),", v0, v1, v2, v3, v4, v5); DISAS_LOG("gsSP2Triangles(%d, %d, %d, 0, %d, %d, %d, 0),", v0, v1, v2, v3, v4, v5);
@ -1047,13 +893,13 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break; } break;
case G_QUAD: { case G_QUAD: {
Gquadmod quad = ptr->quad; Gquad quad = ptr->quad;
u32 v0, v1, v2, v3; u32 v0, v1, v2, v3;
v0 = quad.v0 / 2; v0 = quad.tri1.v[0] / 2;
v1 = quad.v1 / 2; v1 = quad.tri1.v[1] / 2;
v2 = quad.v2 / 2; v2 = quad.tri1.v[2] / 2;
v3 = quad.v3 / 2; v3 = quad.tri2.v[2] / 2;
DISAS_LOG("gsSP1Quadrangle(%d, %d, %d, %d, 0),", v0, v1, v2, v3); DISAS_LOG("gsSP1Quadrangle(%d, %d, %d, %d, 0),", v0, v1, v2, v3);
@ -1062,19 +908,19 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break; } break;
case G_CULLDL: { case G_CULLDL: {
DISAS_LOG("gsSPCullDisplayList(%d, %d),", (curGfx->cull.vstart) / 2, DISAS_LOG("gsSPCullDisplayList(%d, %d),", (curGfx->cull.vstart_x2) / 2,
(curGfx->cull.vend) / 2); (curGfx->cull.vend_x2) / 2);
} break; } break;
case G_BRANCH_Z: { case G_BRANCH_Z: {
addr = (u32)UCodeDisas_TranslateAddr(this, rdpHalf); addr = (uintptr_t)UCodeDisas_TranslateAddr(this, rdpHalf);
DISAS_LOG("gsSPBranchLessZraw(0x%08x(0x%08x), %d, 0x%08x),", rdpHalf, addr, DISAS_LOG("gsSPBranchLessZraw(0x%08x(0x%08x), %d, 0x%08x),", rdpHalf, addr,
(curGfx->words.w0 & 0xFFF) / 2, curGfx->words.w1); (curGfx->words.w0 & 0xFFF) / 2, curGfx->words.w1);
ptr = (GfxMod*)addr - 1; ptr = (Gfx*)addr - 1;
} break; } break;
case G_TEXTURE: { case G_TEXTURE: {
Gtexturemod texture = ptr->texmod; Gtexture texture = ptr->texture;
if (texture.lodscale == 0) { if (texture.lodscale == 0) {
DISAS_LOG("gsSPTexture(%d, %d, %d, %d, %s),", texture.s, texture.t, texture.level, DISAS_LOG("gsSPTexture(%d, %d, %d, %d, %s),", texture.s, texture.t, texture.level,
@ -1087,12 +933,12 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break; } break;
case G_POPMTX: { case G_POPMTX: {
Gpopmtxmod popmtx = ptr->popmtxmod; Gpopmtx popmtx = ptr->popmtx;
if (popmtx.param == 1) { if (popmtx.param / 64 == 1) {
DISAS_LOG("gsSPPopMatrix(G_MTX_MODELVIEW),"); DISAS_LOG("gsSPPopMatrix(G_MTX_MODELVIEW),");
} else { } else {
DISAS_LOG("gsSPPopMatrixN(G_MTX_MODELVIEW, %d),", popmtx.param); DISAS_LOG("gsSPPopMatrixN(G_MTX_MODELVIEW, %d),", popmtx.param / 64);
} }
} break; } break;
@ -1102,21 +948,21 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
if (clearbits == 0) { if (clearbits == 0) {
DISAS_LOG("gsSPLoadGeometryMode("); DISAS_LOG("gsSPLoadGeometryMode(");
UCodeDisas_ParseGeometryMode(this, setbits); UCodeDisas_PrintGeometryMode(this, setbits);
DISAS_LOG("),"); DISAS_LOG("),");
} else if (setbits == 0) { } else if (setbits == 0) {
DISAS_LOG("gsSPClearGeometryMode("); DISAS_LOG("gsSPClearGeometryMode(");
UCodeDisas_ParseGeometryMode(this, ~clearbits); UCodeDisas_PrintGeometryMode(this, ~clearbits);
DISAS_LOG("),"); DISAS_LOG("),");
} else if (clearbits == 0xFFFFFF) { } else if (clearbits == 0xFFFFFF) {
DISAS_LOG("gsSPSetGeometryMode("); DISAS_LOG("gsSPSetGeometryMode(");
UCodeDisas_ParseGeometryMode(this, setbits); UCodeDisas_PrintGeometryMode(this, setbits);
DISAS_LOG("),"); DISAS_LOG("),");
} else { } else {
DISAS_LOG("gsSPGeometryMode("); DISAS_LOG("gsSPGeometryMode(");
UCodeDisas_ParseGeometryMode(this, ~clearbits); UCodeDisas_PrintGeometryMode(this, ~clearbits);
DISAS_LOG(", "); DISAS_LOG(", ");
UCodeDisas_ParseGeometryMode(this, setbits); UCodeDisas_PrintGeometryMode(this, setbits);
DISAS_LOG("),"); DISAS_LOG("),");
} }
@ -1185,7 +1031,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
case G_MV_MATRIX: { case G_MV_MATRIX: {
DISAS_LOG("gsSPForceMatrix(0x%08x),", movemem.data); DISAS_LOG("gsSPForceMatrix(0x%08x),", movemem.data);
ptr += 1; ptr += 2 - 1;
} break; } break;
case G_MV_LIGHT: { case G_MV_LIGHT: {
@ -1200,7 +1046,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
default: { default: {
DISAS_LOG("gsSPLight(0x%08x,%d),", movemem.data, DISAS_LOG("gsSPLight(0x%08x,%d),", movemem.data,
(movemem.offset * 8 - 24) / 24); (movemem.offset * 8 - 0x18) / 0x18);
} break; } break;
} }
} break; } break;
@ -1299,8 +1145,9 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
case G_SELECT_DL: { case G_SELECT_DL: {
Gdma dma = ptr->dma; Gdma dma = ptr->dma;
u32 dlAddr = (u32)UCodeDisas_TranslateAddr(this, (dma.len << 16) | (linkDlLow)); uintptr_t dlAddr =
u32 dmaAddr = dma.addr; (uintptr_t)UCodeDisas_TranslateAddr(this, (dma.len << 16) | (linkDlLow));
uintptr_t dmaAddr = dma.addr;
if (dma.par == 0) { if (dma.par == 0) {
DISAS_LOG("gsSPSelectDL(0x%08x, %d, 0x%08x, 0x%08x),", dlAddr, sid, rdpHalf, DISAS_LOG("gsSPSelectDL(0x%08x, %d, 0x%08x, 0x%08x),", dlAddr, sid, rdpHalf,

View file

@ -1953,15 +1953,14 @@ void Actor_DisableLens(PlayState* play) {
} }
} }
// Actor_InitContext void Actor_InitContext(PlayState* play, ActorContext* actorCtx, ActorEntry* playerEntry) {
void func_800304DC(PlayState* play, ActorContext* actorCtx, ActorEntry* actorEntry) {
ActorOverlay* overlayEntry; ActorOverlay* overlayEntry;
SavedSceneFlags* savedSceneFlags; SavedSceneFlags* savedSceneFlags;
s32 i; s32 i;
savedSceneFlags = &gSaveContext.sceneFlags[play->sceneId]; savedSceneFlags = &gSaveContext.sceneFlags[play->sceneId];
bzero(actorCtx, sizeof(*actorCtx)); bzero(actorCtx, sizeof(ActorContext));
ActorOverlayTable_Init(); ActorOverlayTable_Init();
Matrix_MtxFCopy(&play->billboardMtxF, &gMtxFClear); Matrix_MtxFCopy(&play->billboardMtxF, &gMtxFClear);
@ -1983,7 +1982,7 @@ void func_800304DC(PlayState* play, ActorContext* actorCtx, ActorEntry* actorEnt
actorCtx->absoluteSpace = NULL; actorCtx->absoluteSpace = NULL;
Actor_SpawnEntry(actorCtx, actorEntry, play); Actor_SpawnEntry(actorCtx, playerEntry, play);
func_8002C0C0(&actorCtx->targetCtx, actorCtx->actorLists[ACTORCAT_PLAYER].head, play); func_8002C0C0(&actorCtx->targetCtx, actorCtx->actorLists[ACTORCAT_PLAYER].head, play);
func_8002FA60(play); func_8002FA60(play);
} }
@ -2024,12 +2023,12 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) {
sp74 = NULL; sp74 = NULL;
unkFlag = 0; unkFlag = 0;
if (play->numSetupActors != 0) { if (play->numActorEntries != 0) {
actorEntry = &play->setupActorList[0]; actorEntry = &play->actorEntryList[0];
for (i = 0; i < play->numSetupActors; i++) { for (i = 0; i < play->numActorEntries; i++) {
Actor_SpawnEntry(&play->actorCtx, actorEntry++, play); Actor_SpawnEntry(&play->actorCtx, actorEntry++, play);
} }
play->numSetupActors = 0; play->numActorEntries = 0;
} }
if (actorCtx->unk_02 != 0) { if (actorCtx->unk_02 != 0) {

View file

@ -156,11 +156,11 @@ void Camera_LERPCeilVec3f(Vec3f* target, Vec3f* cur, f32 yStepScale, f32 xzStepS
void func_80043ABC(Camera* camera) { void func_80043ABC(Camera* camera) {
camera->yawUpdateRateInv = 100.0f; camera->yawUpdateRateInv = 100.0f;
camera->pitchUpdateRateInv = R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV; camera->pitchUpdateRateInv = R_CAM_PITCH_UPDATE_RATE_INV;
camera->rUpdateRateInv = OREG(6); camera->rUpdateRateInv = R_CAM_R_UPDATE_RATE_INV;
camera->xzOffsetUpdateRate = CAM_DATA_SCALED(OREG(2)); camera->xzOffsetUpdateRate = CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE);
camera->yOffsetUpdateRate = CAM_DATA_SCALED(OREG(3)); camera->yOffsetUpdateRate = CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE);
camera->fovUpdateRate = CAM_DATA_SCALED(OREG(4)); camera->fovUpdateRate = CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE);
} }
void func_80043B60(Camera* camera) { void func_80043B60(Camera* camera) {
@ -928,7 +928,8 @@ s32 Camera_CalcAtDefault(Camera* camera, VecGeo* eyeAtDir, f32 extraYOffset, s16
if (calcSlope) { if (calcSlope) {
posOffsetTarget.y -= OLib_ClampMaxDist( posOffsetTarget.y -= OLib_ClampMaxDist(
Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, OREG(9)), yOffset); Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT),
yOffset);
} }
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate, Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate,
@ -957,7 +958,8 @@ s32 func_800458D4(Camera* camera, VecGeo* eyeAtDir, f32 arg2, f32* arg3, s16 arg
posOffsetTarget.z = 0.0f; posOffsetTarget.z = 0.0f;
if (arg4) { if (arg4) {
posOffsetTarget.y -= Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, OREG(9)); posOffsetTarget.y -=
Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT);
} }
deltaY = playerPosRot->pos.y - *arg3; deltaY = playerPosRot->pos.y - *arg3;
@ -1005,7 +1007,7 @@ s32 func_80045B08(Camera* camera, VecGeo* eyeAtDir, f32 yExtra, s16 arg3) {
phi_f2 = -Math_CosS(playerPosRot->rot.y - eyeAtDir->yaw); phi_f2 = -Math_CosS(playerPosRot->rot.y - eyeAtDir->yaw);
} }
posOffsetTarget.y -= temp_ret * phi_f2 * OREG(9); posOffsetTarget.y -= temp_ret * phi_f2 * R_CAM_SLOPE_Y_ADJ_AMOUNT;
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate, Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate,
0.1f); 0.1f);
@ -1038,7 +1040,8 @@ s32 Camera_CalcAtForParallel(Camera* camera, VecGeo* arg1, f32 yOffset, f32* arg
posOffsetTarget.z = 0.0f; posOffsetTarget.z = 0.0f;
if (PREG(76) && arg4) { if (PREG(76) && arg4) {
posOffsetTarget.y -= Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, arg1->yaw, OREG(9)); posOffsetTarget.y -=
Camera_CalcSlopeYAdj(&camera->floorNorm, playerPosRot->rot.y, arg1->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT);
} }
if (camera->playerGroundY == camera->playerPosRot.pos.y || camera->player->actor.gravity > -0.1f || if (camera->playerGroundY == camera->playerPosRot.pos.y || camera->player->actor.gravity > -0.1f ||
@ -1110,7 +1113,7 @@ s32 Camera_CalcAtForLockOn(Camera* camera, VecGeo* eyeAtDir, Vec3f* targetPos, f
tmpPos0.y = playerHeight + yOffset; tmpPos0.y = playerHeight + yOffset;
tmpPos0.z = 0.0f; tmpPos0.z = 0.0f;
if (PREG(76) && (flags & FLG_ADJSLOPE)) { if (PREG(76) && (flags & FLG_ADJSLOPE)) {
tmpPos0.y -= Camera_CalcSlopeYAdj(floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, OREG(9)); tmpPos0.y -= Camera_CalcSlopeYAdj(floorNorm, playerPosRot->rot.y, eyeAtDir->yaw, R_CAM_SLOPE_Y_ADJ_AMOUNT);
} }
// tmpPos1 is player's head // tmpPos1 is player's head
@ -1219,8 +1222,8 @@ s32 Camera_CalcAtForHorse(Camera* camera, VecGeo* eyeAtDir, f32 yOffset, f32* yP
posOffsetTarget.z = 0.0f; posOffsetTarget.z = 0.0f;
if (calcSlope != 0) { if (calcSlope != 0) {
posOffsetTarget.y -= posOffsetTarget.y -= Camera_CalcSlopeYAdj(&camera->floorNorm, camera->playerPosRot.rot.y, eyeAtDir->yaw,
Camera_CalcSlopeYAdj(&camera->floorNorm, camera->playerPosRot.rot.y, eyeAtDir->yaw, OREG(9)); R_CAM_SLOPE_Y_ADJ_AMOUNT);
} }
Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate, Camera_LERPCeilVec3f(&posOffsetTarget, &camera->posOffset, camera->yOffsetUpdateRate, camera->xzOffsetUpdateRate,
@ -1240,17 +1243,17 @@ f32 Camera_LERPClampDist(Camera* camera, f32 dist, f32 min, f32 max) {
if (dist < min) { if (dist < min) {
distTarget = min; distTarget = min;
rUpdateRateInvTarget = OREG(6); rUpdateRateInvTarget = R_CAM_R_UPDATE_RATE_INV;
} else if (dist > max) { } else if (dist > max) {
distTarget = max; distTarget = max;
rUpdateRateInvTarget = OREG(6); rUpdateRateInvTarget = R_CAM_R_UPDATE_RATE_INV;
} else { } else {
distTarget = dist; distTarget = dist;
rUpdateRateInvTarget = 1.0f; rUpdateRateInvTarget = 1.0f;
} }
camera->rUpdateRateInv = camera->rUpdateRateInv = Camera_LERPCeilF(rUpdateRateInvTarget, camera->rUpdateRateInv,
Camera_LERPCeilF(rUpdateRateInvTarget, camera->rUpdateRateInv, CAM_DATA_SCALED(OREG(25)), 0.1f); CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
return Camera_LERPCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv, 0.2f); return Camera_LERPCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv, 0.2f);
} }
@ -1261,19 +1264,19 @@ f32 Camera_ClampDist(Camera* camera, f32 dist, f32 minDist, f32 maxDist, s16 tim
if (dist < minDist) { if (dist < minDist) {
distTarget = minDist; distTarget = minDist;
rUpdateRateInvTarget = timer != 0 ? OREG(6) * 0.5f : OREG(6); rUpdateRateInvTarget = timer != 0 ? R_CAM_R_UPDATE_RATE_INV * 0.5f : R_CAM_R_UPDATE_RATE_INV;
} else if (maxDist < dist) { } else if (maxDist < dist) {
distTarget = maxDist; distTarget = maxDist;
rUpdateRateInvTarget = timer != 0 ? OREG(6) * 0.5f : OREG(6); rUpdateRateInvTarget = timer != 0 ? R_CAM_R_UPDATE_RATE_INV * 0.5f : R_CAM_R_UPDATE_RATE_INV;
} else { } else {
distTarget = dist; distTarget = dist;
rUpdateRateInvTarget = timer != 0 ? OREG(6) : 1.0f; rUpdateRateInvTarget = timer != 0 ? R_CAM_R_UPDATE_RATE_INV : 1.0f;
} }
camera->rUpdateRateInv = camera->rUpdateRateInv = Camera_LERPCeilF(rUpdateRateInvTarget, camera->rUpdateRateInv,
Camera_LERPCeilF(rUpdateRateInvTarget, camera->rUpdateRateInv, CAM_DATA_SCALED(OREG(25)), 0.1f); CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
return Camera_LERPCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv, 0.2f); return Camera_LERPCeilF(distTarget, camera->dist, 1.0f / camera->rUpdateRateInv, 0.2f);
} }
@ -1519,9 +1522,9 @@ s32 Camera_Normal1(Camera* camera) {
rwData->startSwingTimer--; rwData->startSwingTimer--;
} }
spA0 = camera->speedRatio * CAM_DATA_SCALED(OREG(25)); spA0 = camera->speedRatio * CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ);
sp9C = camera->speedRatio * CAM_DATA_SCALED(OREG(26)); sp9C = camera->speedRatio * CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y);
sp98 = rwData->swing.unk_18 != 0 ? CAM_DATA_SCALED(OREG(25)) : spA0; sp98 = rwData->swing.unk_18 != 0 ? CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) : spA0;
sp94 = (camera->xzSpeed - rwData->unk_20) * (0.333333f); sp94 = (camera->xzSpeed - rwData->unk_20) * (0.333333f);
if (sp94 > 1.0f) { if (sp94 > 1.0f) {
@ -1538,7 +1541,7 @@ s32 Camera_Normal1(Camera* camera) {
Camera_LERPCeilF(rwData->swing.swingUpdateRate + (f32)(rwData->swing.swingUpdateRateTimer * 2), Camera_LERPCeilF(rwData->swing.swingUpdateRate + (f32)(rwData->swing.swingUpdateRateTimer * 2),
camera->yawUpdateRateInv, sp98, rate); camera->yawUpdateRateInv, sp98, rate);
camera->pitchUpdateRateInv = camera->pitchUpdateRateInv =
Camera_LERPCeilF((f32)R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV + (f32)(rwData->swing.swingUpdateRateTimer * 2), Camera_LERPCeilF((f32)R_CAM_PITCH_UPDATE_RATE_INV + (f32)(rwData->swing.swingUpdateRateTimer * 2),
camera->pitchUpdateRateInv, sp9C, rate); camera->pitchUpdateRateInv, sp9C, rate);
rwData->swing.swingUpdateRateTimer--; rwData->swing.swingUpdateRateTimer--;
} else { } else {
@ -1546,15 +1549,16 @@ s32 Camera_Normal1(Camera* camera) {
((OREG(49) * 0.01f) * rwData->swing.swingUpdateRate * sp94), ((OREG(49) * 0.01f) * rwData->swing.swingUpdateRate * sp94),
camera->yawUpdateRateInv, sp98, rate); camera->yawUpdateRateInv, sp98, rate);
camera->pitchUpdateRateInv = camera->pitchUpdateRateInv =
Camera_LERPCeilF(R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp9C, rate); Camera_LERPCeilF(R_CAM_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp9C, rate);
} }
camera->pitchUpdateRateInv = camera->pitchUpdateRateInv = Camera_LERPCeilF(R_CAM_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp9C, rate);
Camera_LERPCeilF(R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp9C, rate); camera->xzOffsetUpdateRate =
camera->xzOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(2)), camera->xzOffsetUpdateRate, spA0, rate); Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE), camera->xzOffsetUpdateRate, spA0, rate);
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, sp9C, rate); camera->yOffsetUpdateRate =
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, sp9C, rate);
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->yOffsetUpdateRate, camera->speedRatio * 0.05f, rate); camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->yOffsetUpdateRate,
camera->speedRatio * 0.05f, rate);
if (roData->interfaceFlags & 1) { if (roData->interfaceFlags & 1) {
t = Camera_GetPitchAdjFromFloorHeightDiffs(camera, atEyeGeo.yaw - 0x7FFF, false); t = Camera_GetPitchAdjFromFloorHeightDiffs(camera, atEyeGeo.yaw - 0x7FFF, false);
@ -1752,17 +1756,18 @@ s32 Camera_Normal2(Camera* camera) {
OLib_Vec3fDiffToVecGeo(&atToEyeNextDir, at, eyeNext); OLib_Vec3fDiffToVecGeo(&atToEyeNextDir, at, eyeNext);
camera->speedRatio *= 0.5f; camera->speedRatio *= 0.5f;
spA4 = CAM_DATA_SCALED(OREG(25)) * camera->speedRatio; spA4 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio;
spA0 = CAM_DATA_SCALED(OREG(26)) * camera->speedRatio; spA0 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio;
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->unk_0C, camera->yawUpdateRateInv * camera->speedRatio, camera->yawUpdateRateInv = Camera_LERPCeilF(roData->unk_0C, camera->yawUpdateRateInv * camera->speedRatio,
CAM_DATA_SCALED(OREG(25)), 0.1f); CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
camera->pitchUpdateRateInv = camera->pitchUpdateRateInv = Camera_LERPCeilF(R_CAM_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, spA0, 0.1f);
Camera_LERPCeilF(R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, spA0, 0.1f); camera->xzOffsetUpdateRate =
camera->xzOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(2)), camera->xzOffsetUpdateRate, spA4, 0.1f); Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE), camera->xzOffsetUpdateRate, spA4, 0.1f);
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, spA0, 0.1f); camera->yOffsetUpdateRate =
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, spA0, 0.1f);
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->yOffsetUpdateRate, camera->speedRatio * 0.05f, 0.1f); camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->yOffsetUpdateRate,
camera->speedRatio * 0.05f, 0.1f);
if (!(roData->interfaceFlags & 0x80)) { if (!(roData->interfaceFlags & 0x80)) {
Camera_CalcAtDefault(camera, &atToEyeNextDir, roData->unk_00, roData->interfaceFlags & 1); Camera_CalcAtDefault(camera, &atToEyeNextDir, roData->unk_00, roData->interfaceFlags & 1);
@ -1900,26 +1905,28 @@ s32 Camera_Normal3(Camera* camera) {
rwData->distTimer--; rwData->distTimer--;
} }
sp98 = CAM_DATA_SCALED(OREG(25)) * camera->speedRatio; sp98 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio;
sp94 = CAM_DATA_SCALED(OREG(26)) * camera->speedRatio; sp94 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio;
if (rwData->swing.swingUpdateRateTimer != 0) { if (rwData->swing.swingUpdateRateTimer != 0) {
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpdateSpeed + (rwData->swing.swingUpdateRateTimer * 2), camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpdateSpeed + (rwData->swing.swingUpdateRateTimer * 2),
camera->yawUpdateRateInv, sp98, 0.1f); camera->yawUpdateRateInv, sp98, 0.1f);
camera->pitchUpdateRateInv = camera->pitchUpdateRateInv =
Camera_LERPCeilF((f32)R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV + (rwData->swing.swingUpdateRateTimer * 2), Camera_LERPCeilF((f32)R_CAM_PITCH_UPDATE_RATE_INV + (rwData->swing.swingUpdateRateTimer * 2),
camera->pitchUpdateRateInv, sp94, 0.1f); camera->pitchUpdateRateInv, sp94, 0.1f);
if (1) {} if (1) {}
rwData->swing.swingUpdateRateTimer--; rwData->swing.swingUpdateRateTimer--;
} else { } else {
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpdateSpeed, camera->yawUpdateRateInv, sp98, 0.1f); camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpdateSpeed, camera->yawUpdateRateInv, sp98, 0.1f);
camera->pitchUpdateRateInv = camera->pitchUpdateRateInv =
Camera_LERPCeilF(R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp94, 0.1f); Camera_LERPCeilF(R_CAM_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp94, 0.1f);
} }
camera->xzOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(2)), camera->xzOffsetUpdateRate, sp98, 0.1f); camera->xzOffsetUpdateRate =
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, sp94, 0.1f); Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE), camera->xzOffsetUpdateRate, sp98, 0.1f);
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->fovUpdateRate, sp94, 0.1f); camera->yOffsetUpdateRate =
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, sp94, 0.1f);
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->fovUpdateRate, sp94, 0.1f);
t2 = Camera_GetPitchAdjFromFloorHeightDiffs(camera, sp7C.yaw - 0x7FFF, true); t2 = Camera_GetPitchAdjFromFloorHeightDiffs(camera, sp7C.yaw - 0x7FFF, true);
sp94 = ((1.0f / roData->unk_10) * 0.5f); sp94 = ((1.0f / roData->unk_10) * 0.5f);
@ -2079,16 +2086,18 @@ s32 Camera_Parallel1(Camera* camera) {
camera->animState = 1; camera->animState = 1;
} }
spB8 = CAM_DATA_SCALED(OREG(25)) * camera->speedRatio; spB8 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio;
spB4 = CAM_DATA_SCALED(OREG(26)) * camera->speedRatio; spB4 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio;
camera->rUpdateRateInv = Camera_LERPCeilF(OREG(6), camera->rUpdateRateInv, spB8, 0.1f); camera->rUpdateRateInv = Camera_LERPCeilF(R_CAM_R_UPDATE_RATE_INV, camera->rUpdateRateInv, spB8, 0.1f);
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->unk_08, camera->yawUpdateRateInv, spB8, 0.1f); camera->yawUpdateRateInv = Camera_LERPCeilF(roData->unk_08, camera->yawUpdateRateInv, spB8, 0.1f);
camera->pitchUpdateRateInv = Camera_LERPCeilF(2.0f, camera->pitchUpdateRateInv, spB4, 0.1f); camera->pitchUpdateRateInv = Camera_LERPCeilF(2.0f, camera->pitchUpdateRateInv, spB4, 0.1f);
camera->xzOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(2)), camera->xzOffsetUpdateRate, spB8, 0.1f); camera->xzOffsetUpdateRate =
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, spB4, 0.1f); Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE), camera->xzOffsetUpdateRate, spB8, 0.1f);
camera->fovUpdateRate = camera->yOffsetUpdateRate =
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.1f); Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, spB4, 0.1f);
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->fovUpdateRate,
camera->speedRatio * 0.05f, 0.1f);
if (roData->interfaceFlags & 1) { if (roData->interfaceFlags & 1) {
tangle = Camera_GetPitchAdjFromFloorHeightDiffs(camera, atToEyeDir.yaw - 0x7FFF, true); tangle = Camera_GetPitchAdjFromFloorHeightDiffs(camera, atToEyeDir.yaw - 0x7FFF, true);
@ -2263,24 +2272,27 @@ s32 Camera_Jump1(Camera* camera) {
} }
if (rwData->swing.swingUpdateRateTimer != 0) { if (rwData->swing.swingUpdateRateTimer != 0) {
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpateRateTarget + rwData->swing.swingUpdateRateTimer, camera->yawUpdateRateInv =
camera->yawUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f); Camera_LERPCeilF(roData->yawUpateRateTarget + rwData->swing.swingUpdateRateTimer, camera->yawUpdateRateInv,
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
camera->pitchUpdateRateInv = camera->pitchUpdateRateInv =
Camera_LERPCeilF((f32)R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV + rwData->swing.swingUpdateRateTimer, Camera_LERPCeilF((f32)R_CAM_PITCH_UPDATE_RATE_INV + rwData->swing.swingUpdateRateTimer,
camera->pitchUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f); camera->pitchUpdateRateInv, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
rwData->swing.swingUpdateRateTimer--; rwData->swing.swingUpdateRateTimer--;
} else { } else {
camera->yawUpdateRateInv = camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpateRateTarget, camera->yawUpdateRateInv,
Camera_LERPCeilF(roData->yawUpateRateTarget, camera->yawUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f); CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
camera->pitchUpdateRateInv = Camera_LERPCeilF((f32)R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv = Camera_LERPCeilF((f32)R_CAM_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv,
camera->pitchUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f); CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
} }
camera->xzOffsetUpdateRate = camera->xzOffsetUpdateRate =
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(2)), camera->xzOffsetUpdateRate, CAM_DATA_SCALED(OREG(25)), 0.1f); Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE), camera->xzOffsetUpdateRate,
camera->yOffsetUpdateRate = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, CAM_DATA_SCALED(OREG(26)), 0.1f); camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate,
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->yOffsetUpdateRate, 0.05f, 0.1f); CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
camera->fovUpdateRate =
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->yOffsetUpdateRate, 0.05f, 0.1f);
func_800458D4(camera, &eyeNextAtOffset, roData->atYOffset, &rwData->unk_1C, 0); func_800458D4(camera, &eyeNextAtOffset, roData->atYOffset, &rwData->unk_1C, 0);
@ -2318,7 +2330,7 @@ s32 Camera_Jump1(Camera* camera) {
Camera_AddVecGeoToVec3f(&newEye, at, &eyeDiffGeo); Camera_AddVecGeoToVec3f(&newEye, at, &eyeDiffGeo);
eyeNext->x = newEye.x; eyeNext->x = newEye.x;
eyeNext->z = newEye.z; eyeNext->z = newEye.z;
eyeNext->y += (newEye.y - eyeNext->y) * CAM_DATA_SCALED(OREG(31)); eyeNext->y += (newEye.y - eyeNext->y) * CAM_DATA_SCALED(R_CAM_JUMP1_EYE_Y_STEP_SCALE);
if ((camera->status == CAM_STAT_ACTIVE) && !(roData->interfaceFlags & 0x10)) { if ((camera->status == CAM_STAT_ACTIVE) && !(roData->interfaceFlags & 0x10)) {
func_80046E20(camera, &eyeDiffGeo, roData->distMin, roData->yawUpateRateTarget, &spA4, &rwData->swing); func_80046E20(camera, &eyeDiffGeo, roData->distMin, roData->yawUpateRateTarget, &spA4, &rwData->swing);
if (roData->interfaceFlags & 4) { if (roData->interfaceFlags & 4) {
@ -2435,14 +2447,15 @@ s32 Camera_Jump2(Camera* camera) {
camera->atLERPStepScale = roData->atLERPStepScale; camera->atLERPStepScale = roData->atLERPStepScale;
} }
sp90 = CAM_DATA_SCALED(OREG(25)) * camera->speedRatio; sp90 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio;
sp8C = CAM_DATA_SCALED(OREG(26)) * camera->speedRatio; sp8C = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio;
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpdRateTarget, camera->yawUpdateRateInv, sp90, 0.1f); camera->yawUpdateRateInv = Camera_LERPCeilF(roData->yawUpdRateTarget, camera->yawUpdateRateInv, sp90, 0.1f);
camera->xzOffsetUpdateRate = Camera_LERPCeilF(roData->xzUpdRateTarget, camera->xzOffsetUpdateRate, sp90, 0.1f); camera->xzOffsetUpdateRate = Camera_LERPCeilF(roData->xzUpdRateTarget, camera->xzOffsetUpdateRate, sp90, 0.1f);
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, sp8C, 0.1f); camera->yOffsetUpdateRate =
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, sp8C, 0.1f);
camera->fovUpdateRate = camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->yOffsetUpdateRate,
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->yOffsetUpdateRate, camera->speedRatio * 0.05f, 0.1f); camera->speedRatio * 0.05f, 0.1f);
camera->rUpdateRateInv = OREG(27); camera->rUpdateRateInv = OREG(27);
Camera_CalcAtDefault(camera, &atToEyeNextDir, roData->atYOffset, 0); Camera_CalcAtDefault(camera, &atToEyeNextDir, roData->atYOffset, 0);
@ -2481,14 +2494,16 @@ s32 Camera_Jump2(Camera* camera) {
if ((sp90 != BGCHECK_Y_MIN) && (playerPosRot->pos.y < sp90)) { if ((sp90 != BGCHECK_Y_MIN) && (playerPosRot->pos.y < sp90)) {
// top of the climb is within 2.2x of the player's height. // top of the climb is within 2.2x of the player's height.
camera->pitchUpdateRateInv = camera->pitchUpdateRateInv =
Camera_LERPCeilF(20.0f, camera->pitchUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f); Camera_LERPCeilF(20.0f, camera->pitchUpdateRateInv, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
camera->rUpdateRateInv = Camera_LERPCeilF(20.0f, camera->rUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f); camera->rUpdateRateInv =
Camera_LERPCeilF(20.0f, camera->rUpdateRateInv, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
adjAtToEyeDir.pitch = Camera_LERPCeilS(0x1F4, atToEyeNextDir.pitch, 1.0f / camera->pitchUpdateRateInv, 0xA); adjAtToEyeDir.pitch = Camera_LERPCeilS(0x1F4, atToEyeNextDir.pitch, 1.0f / camera->pitchUpdateRateInv, 0xA);
} else if ((playerPosRot->pos.y - rwData->floorY) < playerHeight) { } else if ((playerPosRot->pos.y - rwData->floorY) < playerHeight) {
// player is within his height of the ground. // player is within his height of the ground.
camera->pitchUpdateRateInv = camera->pitchUpdateRateInv =
Camera_LERPCeilF(20.0f, camera->pitchUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f); Camera_LERPCeilF(20.0f, camera->pitchUpdateRateInv, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
camera->rUpdateRateInv = Camera_LERPCeilF(20.0f, camera->rUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 0.1f); camera->rUpdateRateInv =
Camera_LERPCeilF(20.0f, camera->rUpdateRateInv, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y), 0.1f);
adjAtToEyeDir.pitch = Camera_LERPCeilS(0x1F4, atToEyeNextDir.pitch, 1.0f / camera->pitchUpdateRateInv, 0xA); adjAtToEyeDir.pitch = Camera_LERPCeilS(0x1F4, atToEyeNextDir.pitch, 1.0f / camera->pitchUpdateRateInv, 0xA);
} else { } else {
camera->pitchUpdateRateInv = 100.0f; camera->pitchUpdateRateInv = 100.0f;
@ -2630,9 +2645,9 @@ s32 Camera_Jump3(Camera* camera) {
spB0 = *eye; spB0 = *eye;
spC4 = CAM_DATA_SCALED(OREG(25)) * camera->speedRatio; spC4 = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio;
spC0 = camera->speedRatio * CAM_DATA_SCALED(OREG(26)); spC0 = camera->speedRatio * CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y);
spBC = rwData->swing.unk_18 != 0 ? CAM_DATA_SCALED(OREG(25)) : spC4; spBC = rwData->swing.unk_18 != 0 ? CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) : spC4;
if (rwData->swing.swingUpdateRateTimer != 0) { if (rwData->swing.swingUpdateRateTimer != 0) {
camera->yawUpdateRateInv = camera->yawUpdateRateInv =
@ -2647,10 +2662,12 @@ s32 Camera_Jump3(Camera* camera) {
camera->pitchUpdateRateInv = Camera_LERPCeilF(40.0f, camera->pitchUpdateRateInv, spC0, 0.1f); camera->pitchUpdateRateInv = Camera_LERPCeilF(40.0f, camera->pitchUpdateRateInv, spC0, 0.1f);
} }
camera->xzOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(2)), camera->xzOffsetUpdateRate, spC4, 0.1f); camera->xzOffsetUpdateRate =
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, spC0, 0.1f); Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE), camera->xzOffsetUpdateRate, spC4, 0.1f);
camera->fovUpdateRate = camera->yOffsetUpdateRate =
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->yOffsetUpdateRate, camera->speedRatio * 0.05f, 0.1f); Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate, spC0, 0.1f);
camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->yOffsetUpdateRate,
camera->speedRatio * 0.05f, 0.1f);
Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, roData->interfaceFlags); Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, roData->interfaceFlags);
OLib_Vec3fDiffToVecGeo(&eyeDiffGeo, at, eyeNext); OLib_Vec3fDiffToVecGeo(&eyeDiffGeo, at, eyeNext);
@ -2805,12 +2822,13 @@ s32 Camera_Battle1(Camera* camera) {
if (camera->player->stateFlags1 & PLAYER_STATE1_12) { if (camera->player->stateFlags1 & PLAYER_STATE1_12) {
// charging sword. // charging sword.
rwData->unk_10 = rwData->unk_10 = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(12)) * 0.5f, rwData->unk_10,
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(12)) * 0.5f, rwData->unk_10, CAM_DATA_SCALED(OREG(25)), 0.1f); CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
camera->xzOffsetUpdateRate = camera->xzOffsetUpdateRate =
Camera_LERPCeilF(0.2f, camera->xzOffsetUpdateRate, CAM_DATA_SCALED(OREG(25)), 0.1f); Camera_LERPCeilF(0.2f, camera->xzOffsetUpdateRate, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
camera->yOffsetUpdateRate = Camera_LERPCeilF(0.2f, camera->yOffsetUpdateRate, CAM_DATA_SCALED(OREG(25)), 0.1f); camera->yOffsetUpdateRate =
if (rwData->chargeTimer >= -19) { Camera_LERPCeilF(0.2f, camera->yOffsetUpdateRate, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
if (rwData->chargeTimer > -20) {
rwData->chargeTimer--; rwData->chargeTimer--;
} else { } else {
distance = 250.0f; distance = 250.0f;
@ -2826,14 +2844,17 @@ s32 Camera_Battle1(Camera* camera) {
rwData->chargeTimer++; rwData->chargeTimer++;
} else { } else {
rwData->chargeTimer = 40; rwData->chargeTimer = 40;
rwData->unk_10 = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(12)), rwData->unk_10, CAM_DATA_SCALED(OREG(25)), 0.1f); rwData->unk_10 = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(12)), rwData->unk_10,
camera->xzOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(40)), camera->xzOffsetUpdateRate, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
CAM_DATA_SCALED(OREG(25)) * camera->speedRatio, 0.1f); camera->xzOffsetUpdateRate =
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(40)), camera->yOffsetUpdateRate, Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_BATTLE1_XYZ_OFFSET_UPDATE_RATE_TARGET), camera->xzOffsetUpdateRate,
CAM_DATA_SCALED(OREG(26)) * camera->speedRatio, 0.1f); CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio, 0.1f);
camera->yOffsetUpdateRate =
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_BATTLE1_XYZ_OFFSET_UPDATE_RATE_TARGET), camera->yOffsetUpdateRate,
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio, 0.1f);
} }
camera->fovUpdateRate = camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->fovUpdateRate,
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.1f); camera->speedRatio * 0.05f, 0.1f);
playerHeight += roData->yOffset; playerHeight += roData->yOffset;
OLib_Vec3fDiffToVecGeo(&atToEyeDir, at, eye); OLib_Vec3fDiffToVecGeo(&atToEyeDir, at, eye);
OLib_Vec3fDiffToVecGeo(&atToEyeNextDir, at, eyeNext); OLib_Vec3fDiffToVecGeo(&atToEyeNextDir, at, eyeNext);
@ -2980,7 +3001,8 @@ s32 Camera_Battle1(Camera* camera) {
*eye = *eyeNext; *eye = *eyeNext;
} }
} }
rwData->roll += (((OREG(36) * camera->speedRatio) * (1.0f - distRatio)) - rwData->roll) * CAM_DATA_SCALED(OREG(37)); rwData->roll += ((R_CAM_BATTLE1_ROLL_TARGET_BASE * camera->speedRatio * (1.0f - distRatio)) - rwData->roll) *
CAM_DATA_SCALED(R_CAM_BATTLE1_ROLL_STEP_SCALE);
camera->roll = CAM_DEG_TO_BINANG(rwData->roll); camera->roll = CAM_DEG_TO_BINANG(rwData->roll);
camera->fov = Camera_LERPCeilF((player->meleeWeaponState != 0 ? 0.8f camera->fov = Camera_LERPCeilF((player->meleeWeaponState != 0 ? 0.8f
: gSaveContext.health <= 0x10 ? 0.8f : gSaveContext.health <= 0x10 ? 0.8f
@ -3047,13 +3069,16 @@ s32 Camera_Battle4(Camera* camera) {
break; break;
} }
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->lerpUpdateRate, camera->yawUpdateRateInv, camera->yawUpdateRateInv =
CAM_DATA_SCALED(OREG(25)) * camera->speedRatio, 0.1f); Camera_LERPCeilF(roData->lerpUpdateRate, camera->yawUpdateRateInv,
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio, 0.1f);
camera->rUpdateRateInv = 1000.0f; camera->rUpdateRateInv = 1000.0f;
camera->pitchUpdateRateInv = 1000.0f; camera->pitchUpdateRateInv = 1000.0f;
camera->xzOffsetUpdateRate = Camera_LERPCeilF(0.025f, camera->xzOffsetUpdateRate, CAM_DATA_SCALED(OREG(25)), 0.1f); camera->xzOffsetUpdateRate =
camera->yOffsetUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(OREG(3)), camera->yOffsetUpdateRate, Camera_LERPCeilF(0.025f, camera->xzOffsetUpdateRate, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
CAM_DATA_SCALED(OREG(26)) * camera->speedRatio, 0.1f); camera->yOffsetUpdateRate =
Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE), camera->yOffsetUpdateRate,
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio, 0.1f);
camera->fovUpdateRate = 0.0001f; camera->fovUpdateRate = 0.0001f;
Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, 1); Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, 1);
if (rwData->animTimer != 0) { if (rwData->animTimer != 0) {
@ -3191,12 +3216,14 @@ s32 Camera_KeepOn1(Camera* camera) {
rwData->unk_0C = camera->target; rwData->unk_0C = camera->target;
camera->atLERPStepScale = 0.0f; camera->atLERPStepScale = 0.0f;
} }
camera->xzOffsetUpdateRate = Camera_LERPCeilF(1.0f, camera->xzOffsetUpdateRate, camera->xzOffsetUpdateRate =
CAM_DATA_SCALED(OREG(25)) * camera->speedRatio, 0.1f); Camera_LERPCeilF(1.0f, camera->xzOffsetUpdateRate,
CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ) * camera->speedRatio, 0.1f);
camera->yOffsetUpdateRate = camera->yOffsetUpdateRate =
Camera_LERPCeilF(1.0f, camera->yOffsetUpdateRate, CAM_DATA_SCALED(OREG(26)) * camera->speedRatio, 0.1f); Camera_LERPCeilF(1.0f, camera->yOffsetUpdateRate,
camera->fovUpdateRate = CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_Y) * camera->speedRatio, 0.1f);
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.1f); camera->fovUpdateRate = Camera_LERPCeilF(CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), camera->fovUpdateRate,
camera->speedRatio * 0.05f, 0.1f);
goto cont; goto cont;
case 0x10: case 0x10:
rwData->unk_0C = NULL; rwData->unk_0C = NULL;
@ -3225,16 +3252,17 @@ s32 Camera_KeepOn1(Camera* camera) {
OLib_Vec3fDiffToVecGeo(&spD8, at, eyeNext); OLib_Vec3fDiffToVecGeo(&spD8, at, eyeNext);
if (spD8.r < roData->unk_04) { if (spD8.r < roData->unk_04) {
sp104 = roData->unk_04; sp104 = roData->unk_04;
spE8 = OREG(6); spE8 = R_CAM_R_UPDATE_RATE_INV;
} else if (roData->unk_08 < spD8.r) { } else if (roData->unk_08 < spD8.r) {
sp104 = roData->unk_08; sp104 = roData->unk_08;
spE8 = OREG(6); spE8 = R_CAM_R_UPDATE_RATE_INV;
} else { } else {
sp104 = spD8.r; sp104 = spD8.r;
spE8 = 1.0f; spE8 = 1.0f;
} }
camera->rUpdateRateInv = Camera_LERPCeilF(spE8, camera->rUpdateRateInv, CAM_DATA_SCALED(OREG(25)), 0.1f); camera->rUpdateRateInv =
Camera_LERPCeilF(spE8, camera->rUpdateRateInv, CAM_DATA_SCALED(R_CAM_UPDATE_RATE_STEP_SCALE_XZ), 0.1f);
spD8.r = spE8 = camera->dist = Camera_LERPCeilF(sp104, camera->dist, 1.0f / camera->rUpdateRateInv, 0.2f); spD8.r = spE8 = camera->dist = Camera_LERPCeilF(sp104, camera->dist, 1.0f / camera->rUpdateRateInv, 0.2f);
sp108 = camera->targetPosRot.pos; sp108 = camera->targetPosRot.pos;
OLib_Vec3fDiffToVecGeo(&spD0, at, &sp108); OLib_Vec3fDiffToVecGeo(&spD0, at, &sp108);
@ -4622,11 +4650,15 @@ s32 Camera_Unique1(Camera* camera) {
Actor_GetFocus(&playerhead, &camera->player->actor); // unused Actor_GetFocus(&playerhead, &camera->player->actor); // unused
camera->yawUpdateRateInv = Camera_LERPCeilF(100.0f, camera->yawUpdateRateInv, OREG(25) * 0.01f, 0.1f); camera->yawUpdateRateInv =
camera->pitchUpdateRateInv = Camera_LERPCeilF(100.0f, camera->pitchUpdateRateInv, OREG(25) * 0.01f, 0.1f); Camera_LERPCeilF(100.0f, camera->yawUpdateRateInv, R_CAM_UPDATE_RATE_STEP_SCALE_XZ * 0.01f, 0.1f);
camera->xzOffsetUpdateRate = Camera_LERPCeilF(0.005f, camera->xzOffsetUpdateRate, OREG(25) * 0.01f, 0.01f); camera->pitchUpdateRateInv =
camera->yOffsetUpdateRate = Camera_LERPCeilF(0.01f, camera->yOffsetUpdateRate, OREG(26) * 0.01f, 0.01f); Camera_LERPCeilF(100.0f, camera->pitchUpdateRateInv, R_CAM_UPDATE_RATE_STEP_SCALE_XZ * 0.01f, 0.1f);
camera->fovUpdateRate = Camera_LERPCeilF(OREG(4) * 0.01f, camera->fovUpdateRate, 0.05f, 0.1f); camera->xzOffsetUpdateRate =
Camera_LERPCeilF(0.005f, camera->xzOffsetUpdateRate, R_CAM_UPDATE_RATE_STEP_SCALE_XZ * 0.01f, 0.01f);
camera->yOffsetUpdateRate =
Camera_LERPCeilF(0.01f, camera->yOffsetUpdateRate, R_CAM_UPDATE_RATE_STEP_SCALE_Y * 0.01f, 0.01f);
camera->fovUpdateRate = Camera_LERPCeilF(R_CAM_FOV_UPDATE_RATE * 0.01f, camera->fovUpdateRate, 0.05f, 0.1f);
Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, 1); Camera_CalcAtDefault(camera, &eyeNextAtOffset, roData->yOffset, 1);
OLib_Vec3fDiffToVecGeo(&sp8C, at, eyeNext); OLib_Vec3fDiffToVecGeo(&sp8C, at, eyeNext);
@ -6563,8 +6595,8 @@ s32 Camera_Special5(Camera* camera) {
} }
Camera_CalcAtDefault(camera, &sp5C, roData->yOffset, 0); Camera_CalcAtDefault(camera, &sp5C, roData->yOffset, 0);
camera->fov = camera->fov = Camera_LERPCeilF(roData->fovTarget, camera->fov,
Camera_LERPCeilF(roData->fovTarget, camera->fov, camera->atLERPStepScale * CAM_DATA_SCALED(OREG(4)), 1.0f); camera->atLERPStepScale * CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE), 1.0f);
camera->roll = Camera_LERPCeilS(0, camera->roll, 0.5f, 0xA); camera->roll = Camera_LERPCeilS(0, camera->roll, 0.5f, 0xA);
camera->atLERPStepScale = Camera_ClampLERPScale(camera, roData->atMaxLERPScale); camera->atLERPStepScale = Camera_ClampLERPScale(camera, roData->atMaxLERPScale);
return true; return true;
@ -6958,10 +6990,10 @@ void Camera_Init(Camera* camera, View* view, CollisionContext* colCtx, PlayState
camera->up.y = 1.0f; camera->up.y = 1.0f;
camera->up.z = 0.0f; camera->up.z = 0.0f;
camera->fov = 60.0f; camera->fov = 60.0f;
camera->pitchUpdateRateInv = R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV; camera->pitchUpdateRateInv = R_CAM_PITCH_UPDATE_RATE_INV;
camera->xzOffsetUpdateRate = CAM_DATA_SCALED(OREG(2)); camera->xzOffsetUpdateRate = CAM_DATA_SCALED(R_CAM_XZ_OFFSET_UPDATE_RATE);
camera->yOffsetUpdateRate = CAM_DATA_SCALED(OREG(3)); camera->yOffsetUpdateRate = CAM_DATA_SCALED(R_CAM_Y_OFFSET_UPDATE_RATE);
camera->fovUpdateRate = CAM_DATA_SCALED(OREG(4)); camera->fovUpdateRate = CAM_DATA_SCALED(R_CAM_FOV_UPDATE_RATE);
sCameraLetterboxSize = 32; sCameraLetterboxSize = 32;
sCameraInterfaceAlpha = 0; sCameraInterfaceAlpha = 0;
camera->unk_14C = 0; camera->unk_14C = 0;

File diff suppressed because it is too large Load diff

View file

@ -437,14 +437,14 @@ void Cutscene_Command_SetLighting(PlayState* play, CutsceneContext* csCtx, CsCmd
// Command 0x56: Play Background Music // Command 0x56: Play Background Music
void Cutscene_Command_PlayBGM(PlayState* play, CutsceneContext* csCtx, CsCmdMusicChange* cmd) { void Cutscene_Command_PlayBGM(PlayState* play, CutsceneContext* csCtx, CsCmdMusicChange* cmd) {
if (csCtx->frames == cmd->startFrame) { if (csCtx->frames == cmd->startFrame) {
func_800F595C(cmd->sequence - 1); Audio_PlaySequenceInCutscene(cmd->sequence - 1);
} }
} }
// Command 0x57: Stop Background Music // Command 0x57: Stop Background Music
void Cutscene_Command_StopBGM(PlayState* play, CutsceneContext* csCtx, CsCmdMusicChange* cmd) { void Cutscene_Command_StopBGM(PlayState* play, CutsceneContext* csCtx, CsCmdMusicChange* cmd) {
if (csCtx->frames == cmd->startFrame) { if (csCtx->frames == cmd->startFrame) {
func_800F59E8(cmd->sequence - 1); Audio_StopSequenceInCutscene(cmd->sequence - 1);
} }
} }

View file

@ -1,60 +1,69 @@
#include "global.h" #include "global.h"
#include "z64elf_message.h" #include "z64quest_hint_commands.h"
ElfMessage sChildSariaMsgs[] = { QuestHintCmd sChildSariaQuestHints[] = {
ELF_MSG_STRENGTH_UPG(SKIP, 3, false, 0), QUEST_HINT_STRENGTH_UPG(SKIP, 0, false, 3),
ELF_MSG_FLAG(CHECK, 0x61, false, EVENTCHKINF_37), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_37, false, 0x61),
ELF_MSG_END(0x64), QUEST_HINT_END(0x64),
ELF_MSG_FLAG(CHECK, 0x62, false, EVENTCHKINF_25),
ELF_MSG_FLAG(CHECK, 0x63, false, EVENTCHKINF_37), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_25, false, 0x62),
ELF_MSG_FLAG(CHECK, 0x65, false, EVENTCHKINF_43), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_37, false, 0x63),
ELF_MSG_MEDALLION(CHECK, 0x66, false, ITEM_MEDALLION_FOREST), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_43, false, 0x65),
ELF_MSG_MEDALLION(CHECK, 0x66, false, ITEM_MEDALLION_FIRE), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_FOREST, false, 0x66),
ELF_MSG_MEDALLION(CHECK, 0x66, false, ITEM_MEDALLION_WATER), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_FIRE, false, 0x66),
ELF_MSG_SONG(CHECK, 0x67, false, ITEM_SONG_STORMS), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_WATER, false, 0x66),
ELF_MSG_MEDALLION(CHECK, 0x68, false, ITEM_MEDALLION_SPIRIT), QUEST_HINT_SONG(CHECK, ITEM_SONG_STORMS, false, 0x67),
ELF_MSG_MEDALLION(CHECK, 0x68, false, ITEM_MEDALLION_SHADOW), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_SPIRIT, false, 0x68),
ELF_MSG_END(0x69), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_SHADOW, false, 0x68),
QUEST_HINT_END(0x69),
}; };
ElfMessage sAdultSariaMsgs[] = { QuestHintCmd sAdultSariaQuestHints[] = {
ELF_MSG_MEDALLION(CHECK, 0x6A, false, ITEM_MEDALLION_FOREST), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_FOREST, false, 0x6A),
ELF_MSG_MEDALLION(CHECK, 0x6B, false, ITEM_MEDALLION_FIRE), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_FIRE, false, 0x6B),
ELF_MSG_MEDALLION(CHECK, 0x6B, false, ITEM_MEDALLION_WATER), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_WATER, false, 0x6B),
ELF_MSG_MEDALLION(CHECK, 0x6C, false, ITEM_MEDALLION_SPIRIT), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_SPIRIT, false, 0x6C),
ELF_MSG_MEDALLION(CHECK, 0x6C, false, ITEM_MEDALLION_SHADOW), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_SHADOW, false, 0x6C),
ELF_MSG_END(0x6D), QUEST_HINT_END(0x6D),
}; };
u32 ElfMessage_CheckCondition(ElfMessage* msg) { u32 QuestHint_CheckCondition(QuestHintCmd* hintCmd) {
s32 type = msg->byte0 & 0x1E; s32 type = hintCmd->byte0 & 0x1E;
u16 flag; u16 flag;
switch (type) { switch (type) {
case (ELF_MSG_CONDITION_FLAG << 1): case (QUEST_HINT_CONDITION_FLAG << 1):
flag = 1 << (msg->byte1 & 0x0F); flag = 1 << (hintCmd->byte1 & 0x0F);
return ((msg->byte0 & 1) == 1) == ((flag & gSaveContext.eventChkInf[(msg->byte1 & 0xF0) >> 4]) != 0); return ((hintCmd->byte0 & 1) == 1) ==
case (ELF_MSG_CONDITION_DUNGEON_ITEM << 1): ((flag & gSaveContext.eventChkInf[(hintCmd->byte1 & 0xF0) >> 4]) != 0);
return ((msg->byte0 & 1) == 1) ==
(CHECK_DUNGEON_ITEM(msg->byte1 - ITEM_KEY_BOSS, gSaveContext.mapIndex) != 0); case (QUEST_HINT_CONDITION_DUNGEON_ITEM << 1):
case (ELF_MSG_CONDITION_ITEM << 1): return ((hintCmd->byte0 & 1) == 1) ==
return ((msg->byte0 & 1) == 1) == (msg->byte3 == INV_CONTENT(msg->byte1)); (CHECK_DUNGEON_ITEM(hintCmd->byte1 - ITEM_KEY_BOSS, gSaveContext.mapIndex) != 0);
case (ELF_MSG_CONDITION_OTHER << 1):
switch (msg->byte1 & 0xF0) { case (QUEST_HINT_CONDITION_ITEM << 1):
case (ELF_MSG_CONDITION_STRENGTH_UPG << 4): return ((hintCmd->byte0 & 1) == 1) == (hintCmd->byte3 == INV_CONTENT(hintCmd->byte1));
return ((msg->byte0 & 1) == 1) == ((msg->byte1 & 0x0F) == CUR_UPG_VALUE(UPG_STRENGTH));
case (ELF_MSG_CONDITION_BOOTS << 4): case (QUEST_HINT_CONDITION_OTHER << 1):
return ((msg->byte0 & 1) == 1) == switch (hintCmd->byte1 & 0xF0) {
case (QUEST_HINT_CONDITION_STRENGTH_UPG << 4):
return ((hintCmd->byte0 & 1) == 1) == ((hintCmd->byte1 & 0x0F) == CUR_UPG_VALUE(UPG_STRENGTH));
case (QUEST_HINT_CONDITION_BOOTS << 4):
return ((hintCmd->byte0 & 1) == 1) ==
(CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS, (CHECK_OWNED_EQUIP(EQUIP_TYPE_BOOTS,
msg->byte3 - ITEM_BOOTS_KOKIRI + EQUIP_INV_BOOTS_KOKIRI) != 0); hintCmd->byte3 - ITEM_BOOTS_KOKIRI + EQUIP_INV_BOOTS_KOKIRI) != 0);
case (ELF_MSG_CONDITION_SONG << 4):
return ((msg->byte0 & 1) == 1) == case (QUEST_HINT_CONDITION_SONG << 4):
(CHECK_QUEST_ITEM(msg->byte3 - ITEM_SONG_MINUET + QUEST_SONG_MINUET) != 0); return ((hintCmd->byte0 & 1) == 1) ==
case (ELF_MSG_CONDITION_MEDALLION << 4): (CHECK_QUEST_ITEM(hintCmd->byte3 - ITEM_SONG_MINUET + QUEST_SONG_MINUET) != 0);
return ((msg->byte0 & 1) == 1) ==
(CHECK_QUEST_ITEM(msg->byte3 - ITEM_MEDALLION_FOREST + QUEST_MEDALLION_FOREST) != 0); case (QUEST_HINT_CONDITION_MEDALLION << 4):
case (ELF_MSG_CONDITION_MAGIC << 4): return ((hintCmd->byte0 & 1) == 1) ==
return ((msg->byte0 & 1) == 1) == (((void)0, gSaveContext.isMagicAcquired) != 0); (CHECK_QUEST_ITEM(hintCmd->byte3 - ITEM_MEDALLION_FOREST + QUEST_MEDALLION_FOREST) != 0);
case (QUEST_HINT_CONDITION_MAGIC << 4):
return ((hintCmd->byte0 & 1) == 1) == (((void)0, gSaveContext.isMagicAcquired) != 0);
} }
} }
@ -64,111 +73,126 @@ u32 ElfMessage_CheckCondition(ElfMessage* msg) {
return false; return false;
} }
u32 func_8006BE88(ElfMessage** msgp) { u32 QuestHint_CheckConditionChain(QuestHintCmd** hintCmdPtr) {
u32 temp = true; u32 allConditionsMet = true;
while (((*msgp)->byte0 & 0xE0) == (ELF_MSG_TYPE_UNK_1 << 5)) { while (((*hintCmdPtr)->byte0 & 0xE0) == (QUEST_HINT_TYPE_CHAIN << 5)) {
if (!ElfMessage_CheckCondition(*msgp)) { // if any of the conditions checked in the chain are not met,
temp = false; // the whole chain is considered false
if (!QuestHint_CheckCondition(*hintCmdPtr)) {
allConditionsMet = false;
} }
*msgp += 1;
*hintCmdPtr += 1;
} }
if (temp) { if (allConditionsMet) {
return ElfMessage_CheckCondition(*msgp); return QuestHint_CheckCondition(*hintCmdPtr);
} else { } else {
return false; return false;
} }
} }
u32 func_8006BF1C(ElfMessage** msgp) { u32 QuestHint_CheckRandomCondition(QuestHintCmd** hintCmdPtr) {
ElfMessage* msg = *msgp; QuestHintCmd* hintCmd = *hintCmdPtr;
u32 sp44[10]; u32 conditions[10];
s32 temp1 = 0; s32 i = 0;
s32 temp2 = 0; s32 totalChecked = 0;
s32 temp3; s32 rand;
do { do {
sp44[temp2] = ElfMessage_CheckCondition(msg); conditions[totalChecked] = QuestHint_CheckCondition(hintCmd);
temp1 += sp44[temp2]; // i is incremented if the condition was met
temp2++; i += conditions[totalChecked];
msg++; totalChecked++;
} while ((msg->byte0 & 0xE0) == (ELF_MSG_TYPE_UNK_2 << 5)); hintCmd++;
} while ((hintCmd->byte0 & 0xE0) == (QUEST_HINT_TYPE_RANDOM << 5));
if (temp1 == 0) { // if none of the conditions checked were satisfied, there are none to use
if (i == 0) {
return false; return false;
} }
temp3 = Rand_ZeroFloat(temp1); // choose a random number between 0 and the total amount of conditions met
for (temp1 = 0; temp1 < temp2; temp1++) { rand = Rand_ZeroFloat(i);
if (sp44[temp1]) {
if (temp3 > 0) { for (i = 0; i < totalChecked; i++) {
temp3--; // keep decrementing the random number until it reaches 0 then use that hint
if (conditions[i]) {
if (rand > 0) {
rand--;
} else { } else {
return true; return true;
} }
} }
*msgp += 1;
*hintCmdPtr += 1;
} }
return false; return false;
} }
u16 ElfMessage_GetTextFromMsgs(ElfMessage* msg) { u16 QuestHint_GetTextIdFromScript(QuestHintCmd* hintCmd) {
while (true) { while (true) {
switch (msg->byte0 & 0xE0) { switch (hintCmd->byte0 & 0xE0) {
case (ELF_MSG_TYPE_CHECK << 5): case (QUEST_HINT_TYPE_CHECK << 5):
if (ElfMessage_CheckCondition(msg)) { if (QuestHint_CheckCondition(hintCmd)) {
return msg->byte2 | 0x100; return hintCmd->byte2 | 0x100;
} }
break; break;
case (ELF_MSG_TYPE_UNK_1 << 5):
if (func_8006BE88(&msg)) { case (QUEST_HINT_TYPE_CHAIN << 5):
return msg->byte2 | 0x100; if (QuestHint_CheckConditionChain(&hintCmd)) {
return hintCmd->byte2 | 0x100;
} }
break; break;
case (ELF_MSG_TYPE_UNK_2 << 5):
if (func_8006BF1C(&msg)) { case (QUEST_HINT_TYPE_RANDOM << 5):
return msg->byte2 | 0x100; if (QuestHint_CheckRandomCondition(&hintCmd)) {
return hintCmd->byte2 | 0x100;
} }
break; break;
case (ELF_MSG_TYPE_SKIP << 5):
if (ElfMessage_CheckCondition(msg)) { case (QUEST_HINT_TYPE_SKIP << 5):
msg += msg->byte2; if (QuestHint_CheckCondition(hintCmd)) {
msg--; hintCmd += hintCmd->byte2; // skip the specified amount
hintCmd--; // decrement by 1 because it will be incremented again below
} }
break; break;
case (ELF_MSG_TYPE_END << 5):
return msg->byte2 | 0x100; case (QUEST_HINT_TYPE_END << 5):
return hintCmd->byte2 | 0x100;
default: default:
LOG_STRING("企画外 条件", "../z_elf_message.c", 281); // "Unplanned conditions" LOG_STRING("企画外 条件", "../z_elf_message.c", 281); // "Unplanned conditions"
ASSERT(0, "0", "../z_elf_message.c", 282); ASSERT(0, "0", "../z_elf_message.c", 282);
} }
msg++;
hintCmd++;
} }
} }
u16 ElfMessage_GetSariaText(PlayState* play) { u16 QuestHint_GetSariaTextId(PlayState* play) {
Player* player = GET_PLAYER(play); Player* player = GET_PLAYER(play);
ElfMessage* msgs; QuestHintCmd* sariaQuestHints;
if (!LINK_IS_ADULT) { if (!LINK_IS_ADULT) {
if (Actor_FindNearby(play, &player->actor, ACTOR_EN_SA, 4, 800.0f) == NULL) { if (Actor_FindNearby(play, &player->actor, ACTOR_EN_SA, 4, 800.0f) == NULL) {
msgs = sChildSariaMsgs; sariaQuestHints = sChildSariaQuestHints;
} else { } else {
return 0x0160; // Special text about Saria preferring to talk to you face-to-face return 0x0160; // Special text about Saria preferring to talk to you face-to-face
} }
} else { } else {
msgs = sAdultSariaMsgs; sariaQuestHints = sAdultSariaQuestHints;
} }
return ElfMessage_GetTextFromMsgs(msgs); return QuestHint_GetTextIdFromScript(sariaQuestHints);
} }
u16 ElfMessage_GetCUpText(PlayState* play) { u16 QuestHint_GetNaviTextId(PlayState* play) {
if (play->cUpElfMsgs == NULL) { if (play->naviQuestHints == NULL) {
return 0; return 0;
} else { } else {
return ElfMessage_GetTextFromMsgs(play->cUpElfMsgs); return QuestHint_GetTextIdFromScript(play->naviQuestHints);
} }
} }

View file

@ -23,10 +23,18 @@ void Lib_MemSet(u8* dest, size_t len, u8 val) {
// clang-format on // clang-format on
} }
/**
* @param angle binang
* @return cos(angle)
*/
f32 Math_CosS(s16 angle) { f32 Math_CosS(s16 angle) {
return coss(angle) * SHT_MINV; return coss(angle) * SHT_MINV;
} }
/**
* @param angle binang
* @return sin(angle)
*/
f32 Math_SinS(s16 angle) { f32 Math_SinS(s16 angle) {
return sins(angle) * SHT_MINV; return sins(angle) * SHT_MINV;
} }

View file

@ -4,7 +4,7 @@ Path* Path_GetByIndex(PlayState* play, s16 index, s16 max) {
Path* path; Path* path;
if (index != max) { if (index != max) {
path = &play->setupPathList[index]; path = &play->pathList[index];
} else { } else {
path = NULL; path = NULL;
} }

View file

@ -403,7 +403,7 @@ void Play_Init(GameState* thisx) {
(s32)(zAllocAligned + zAllocSize) - (s32)(zAllocAligned - zAlloc)); (s32)(zAllocAligned + zAllocSize) - (s32)(zAllocAligned - zAlloc));
Fault_AddClient(&D_801614B8, ZeldaArena_Display, NULL, NULL); Fault_AddClient(&D_801614B8, ZeldaArena_Display, NULL, NULL);
func_800304DC(this, &this->actorCtx, this->linkActorEntry); Actor_InitContext(this, &this->actorCtx, this->playerEntry);
while (!func_800973FC(this, &this->roomCtx)) { while (!func_800973FC(this, &this->roomCtx)) {
; // Empty Loop ; // Empty Loop
@ -1408,14 +1408,17 @@ void Play_InitEnvironment(PlayState* this, s16 skyboxId) {
} }
void Play_InitScene(PlayState* this, s32 spawn) { void Play_InitScene(PlayState* this, s32 spawn) {
this->curSpawn = spawn; this->spawn = spawn;
this->linkActorEntry = NULL;
this->playerEntry = NULL;
this->unk_11DFC = NULL; this->unk_11DFC = NULL;
this->setupEntranceList = NULL; this->spawnList = NULL;
this->setupExitList = NULL; this->exitList = NULL;
this->cUpElfMsgs = NULL; this->naviQuestHints = NULL;
this->setupPathList = NULL; this->pathList = NULL;
this->numSetupActors = 0;
this->numActorEntries = 0;
Object_InitBank(this, &this->objectCtx); Object_InitBank(this, &this->objectCtx);
LightContext_Init(this, &this->lightCtx); LightContext_Init(this, &this->lightCtx);
TransitionActor_InitContext(&this->state, &this->transiActorCtx); TransitionActor_InitContext(&this->state, &this->transiActorCtx);

View file

@ -582,7 +582,7 @@ u32 func_80096FE8(PlayState* play, RoomContext* roomCtx) {
roomCtx->status = 0; roomCtx->status = 0;
frontRoom = gSaveContext.respawnFlag > 0 ? ((void)0, gSaveContext.respawn[gSaveContext.respawnFlag - 1].roomIndex) frontRoom = gSaveContext.respawnFlag > 0 ? ((void)0, gSaveContext.respawn[gSaveContext.respawnFlag - 1].roomIndex)
: play->setupEntranceList[play->curSpawn].room; : play->spawnList[play->spawn].room;
func_8009728C(play, roomCtx, frontRoom); func_8009728C(play, roomCtx, frontRoom);
return maxRoomSize; return maxRoomSize;

View file

@ -1,7 +1,7 @@
#include "global.h" #include "global.h"
#include "vt.h" #include "vt.h"
RomFile sNaviMsgFiles[]; RomFile sNaviQuestHintFiles[];
s32 Object_Spawn(ObjectContext* objectCtx, s16 objectId) { s32 Object_Spawn(ObjectContext* objectCtx, s16 objectId) {
u32 size; u32 size;
@ -182,22 +182,22 @@ s32 Scene_ExecuteCommands(PlayState* play, SceneCmd* sceneCmd) {
return 0; return 0;
} }
void Scene_CommandSpawnList(PlayState* play, SceneCmd* cmd) { void Scene_CommandPlayerEntryList(PlayState* play, SceneCmd* cmd) {
ActorEntry* linkEntry = play->linkActorEntry = ActorEntry* playerEntry = play->playerEntry =
(ActorEntry*)SEGMENTED_TO_VIRTUAL(cmd->spawnList.data) + play->setupEntranceList[play->curSpawn].spawn; (ActorEntry*)SEGMENTED_TO_VIRTUAL(cmd->playerEntryList.data) + play->spawnList[play->spawn].playerEntryIndex;
s16 linkObjectId; s16 linkObjectId;
play->linkAgeOnLoad = ((void)0, gSaveContext.linkAge); play->linkAgeOnLoad = ((void)0, gSaveContext.linkAge);
linkObjectId = gLinkObjectIds[((void)0, gSaveContext.linkAge)]; linkObjectId = gLinkObjectIds[((void)0, gSaveContext.linkAge)];
gActorOverlayTable[linkEntry->id].initInfo->objectId = linkObjectId; gActorOverlayTable[playerEntry->id].initInfo->objectId = linkObjectId;
Object_Spawn(&play->objectCtx, linkObjectId); Object_Spawn(&play->objectCtx, linkObjectId);
} }
void Scene_CommandActorList(PlayState* play, SceneCmd* cmd) { void Scene_CommandActorEntryList(PlayState* play, SceneCmd* cmd) {
play->numSetupActors = cmd->actorList.length; play->numActorEntries = cmd->actorEntryList.length;
play->setupActorList = SEGMENTED_TO_VIRTUAL(cmd->actorList.data); play->actorEntryList = SEGMENTED_TO_VIRTUAL(cmd->actorEntryList.data);
} }
void Scene_CommandUnused2(PlayState* play, SceneCmd* cmd) { void Scene_CommandUnused2(PlayState* play, SceneCmd* cmd) {
@ -221,8 +221,8 @@ void Scene_CommandRoomList(PlayState* play, SceneCmd* cmd) {
play->roomList = SEGMENTED_TO_VIRTUAL(cmd->roomList.data); play->roomList = SEGMENTED_TO_VIRTUAL(cmd->roomList.data);
} }
void Scene_CommandEntranceList(PlayState* play, SceneCmd* cmd) { void Scene_CommandSpawnList(PlayState* play, SceneCmd* cmd) {
play->setupEntranceList = SEGMENTED_TO_VIRTUAL(cmd->entranceList.data); play->spawnList = SEGMENTED_TO_VIRTUAL(cmd->spawnList.data);
} }
void Scene_CommandSpecialFiles(PlayState* play, SceneCmd* cmd) { void Scene_CommandSpecialFiles(PlayState* play, SceneCmd* cmd) {
@ -231,8 +231,8 @@ void Scene_CommandSpecialFiles(PlayState* play, SceneCmd* cmd) {
gSegments[5] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[play->objectCtx.subKeepIndex].segment); gSegments[5] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[play->objectCtx.subKeepIndex].segment);
} }
if (cmd->specialFiles.cUpElfMsgNum != 0) { if (cmd->specialFiles.naviQuestHintFileId != NAVI_QUEST_HINTS_NONE) {
play->cUpElfMsgs = Play_LoadFile(play, &sNaviMsgFiles[cmd->specialFiles.cUpElfMsgNum - 1]); play->naviQuestHints = Play_LoadFile(play, &sNaviQuestHintFiles[cmd->specialFiles.naviQuestHintFileId - 1]);
} }
} }
@ -308,10 +308,10 @@ void Scene_CommandLightList(PlayState* play, SceneCmd* cmd) {
} }
void Scene_CommandPathList(PlayState* play, SceneCmd* cmd) { void Scene_CommandPathList(PlayState* play, SceneCmd* cmd) {
play->setupPathList = SEGMENTED_TO_VIRTUAL(cmd->pathList.data); play->pathList = SEGMENTED_TO_VIRTUAL(cmd->pathList.data);
} }
void Scene_CommandTransitionActorList(PlayState* play, SceneCmd* cmd) { void Scene_CommandTransitionActorEntryList(PlayState* play, SceneCmd* cmd) {
play->transiActorCtx.numActors = cmd->transiActorList.length; play->transiActorCtx.numActors = cmd->transiActorList.length;
play->transiActorCtx.list = SEGMENTED_TO_VIRTUAL(cmd->transiActorList.data); play->transiActorCtx.list = SEGMENTED_TO_VIRTUAL(cmd->transiActorList.data);
} }
@ -386,7 +386,7 @@ void Scene_CommandWindSettings(PlayState* play, SceneCmd* cmd) {
} }
void Scene_CommandExitList(PlayState* play, SceneCmd* cmd) { void Scene_CommandExitList(PlayState* play, SceneCmd* cmd) {
play->setupExitList = SEGMENTED_TO_VIRTUAL(cmd->exitList.data); play->exitList = SEGMENTED_TO_VIRTUAL(cmd->exitList.data);
} }
void Scene_CommandUndefined9(PlayState* play, SceneCmd* cmd) { void Scene_CommandUndefined9(PlayState* play, SceneCmd* cmd) {
@ -470,35 +470,35 @@ void Scene_CommandMiscSettings(PlayState* play, SceneCmd* cmd) {
} }
void (*gSceneCmdHandlers[SCENE_CMD_ID_MAX])(PlayState*, SceneCmd*) = { void (*gSceneCmdHandlers[SCENE_CMD_ID_MAX])(PlayState*, SceneCmd*) = {
Scene_CommandSpawnList, // SCENE_CMD_ID_SPAWN_LIST Scene_CommandPlayerEntryList, // SCENE_CMD_ID_SPAWN_LIST
Scene_CommandActorList, // SCENE_CMD_ID_ACTOR_LIST Scene_CommandActorEntryList, // SCENE_CMD_ID_ACTOR_LIST
Scene_CommandUnused2, // SCENE_CMD_ID_UNUSED_2 Scene_CommandUnused2, // SCENE_CMD_ID_UNUSED_2
Scene_CommandCollisionHeader, // SCENE_CMD_ID_COLLISION_HEADER Scene_CommandCollisionHeader, // SCENE_CMD_ID_COLLISION_HEADER
Scene_CommandRoomList, // SCENE_CMD_ID_ROOM_LIST Scene_CommandRoomList, // SCENE_CMD_ID_ROOM_LIST
Scene_CommandWindSettings, // SCENE_CMD_ID_WIND_SETTINGS Scene_CommandWindSettings, // SCENE_CMD_ID_WIND_SETTINGS
Scene_CommandEntranceList, // SCENE_CMD_ID_ENTRANCE_LIST Scene_CommandSpawnList, // SCENE_CMD_ID_ENTRANCE_LIST
Scene_CommandSpecialFiles, // SCENE_CMD_ID_SPECIAL_FILES Scene_CommandSpecialFiles, // SCENE_CMD_ID_SPECIAL_FILES
Scene_CommandRoomBehavior, // SCENE_CMD_ID_ROOM_BEHAVIOR Scene_CommandRoomBehavior, // SCENE_CMD_ID_ROOM_BEHAVIOR
Scene_CommandUndefined9, // SCENE_CMD_ID_UNDEFINED_9 Scene_CommandUndefined9, // SCENE_CMD_ID_UNDEFINED_9
Scene_CommandRoomShape, // SCENE_CMD_ID_ROOM_SHAPE Scene_CommandRoomShape, // SCENE_CMD_ID_ROOM_SHAPE
Scene_CommandObjectList, // SCENE_CMD_ID_OBJECT_LIST Scene_CommandObjectList, // SCENE_CMD_ID_OBJECT_LIST
Scene_CommandLightList, // SCENE_CMD_ID_LIGHT_LIST Scene_CommandLightList, // SCENE_CMD_ID_LIGHT_LIST
Scene_CommandPathList, // SCENE_CMD_ID_PATH_LIST Scene_CommandPathList, // SCENE_CMD_ID_PATH_LIST
Scene_CommandTransitionActorList, // SCENE_CMD_ID_TRANSITION_ACTOR_LIST Scene_CommandTransitionActorEntryList, // SCENE_CMD_ID_TRANSITION_ACTOR_LIST
Scene_CommandLightSettingsList, // SCENE_CMD_ID_LIGHT_SETTINGS_LIST Scene_CommandLightSettingsList, // SCENE_CMD_ID_LIGHT_SETTINGS_LIST
Scene_CommandTimeSettings, // SCENE_CMD_ID_TIME_SETTINGS Scene_CommandTimeSettings, // SCENE_CMD_ID_TIME_SETTINGS
Scene_CommandSkyboxSettings, // SCENE_CMD_ID_SKYBOX_SETTINGS Scene_CommandSkyboxSettings, // SCENE_CMD_ID_SKYBOX_SETTINGS
Scene_CommandSkyboxDisables, // SCENE_CMD_ID_SKYBOX_DISABLES Scene_CommandSkyboxDisables, // SCENE_CMD_ID_SKYBOX_DISABLES
Scene_CommandExitList, // SCENE_CMD_ID_EXIT_LIST Scene_CommandExitList, // SCENE_CMD_ID_EXIT_LIST
NULL, // SCENE_CMD_ID_END NULL, // SCENE_CMD_ID_END
Scene_CommandSoundSettings, // SCENE_CMD_ID_SOUND_SETTINGS Scene_CommandSoundSettings, // SCENE_CMD_ID_SOUND_SETTINGS
Scene_CommandEchoSettings, // SCENE_CMD_ID_ECHO_SETTINGS Scene_CommandEchoSettings, // SCENE_CMD_ID_ECHO_SETTINGS
Scene_CommandCutsceneData, // SCENE_CMD_ID_CUTSCENE_DATA Scene_CommandCutsceneData, // SCENE_CMD_ID_CUTSCENE_DATA
Scene_CommandAlternateHeaderList, // SCENE_CMD_ID_ALTERNATE_HEADER_LIST Scene_CommandAlternateHeaderList, // SCENE_CMD_ID_ALTERNATE_HEADER_LIST
Scene_CommandMiscSettings, // SCENE_CMD_ID_MISC_SETTINGS Scene_CommandMiscSettings, // SCENE_CMD_ID_MISC_SETTINGS
}; };
RomFile sNaviMsgFiles[] = { RomFile sNaviQuestHintFiles[] = {
ROM_FILE(elf_message_field), ROM_FILE(elf_message_field),
ROM_FILE(elf_message_ydan), ROM_FILE(elf_message_ydan),
ROM_FILE_UNSET, ROM_FILE_UNSET,

View file

@ -136,9 +136,52 @@ static ItemEquips sNewSaveEquips = {
}; };
static Inventory sNewSaveInventory = { static Inventory sNewSaveInventory = {
{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, // items
0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }, // items {
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // ammo ITEM_NONE, // SLOT_STICK
ITEM_NONE, // SLOT_NUT
ITEM_NONE, // SLOT_BOMB
ITEM_NONE, // SLOT_BOW
ITEM_NONE, // SLOT_ARROW_FIRE
ITEM_NONE, // SLOT_DINS_FIRE
ITEM_NONE, // SLOT_SLINGSHOT
ITEM_NONE, // SLOT_OCARINA
ITEM_NONE, // SLOT_BOMBCHU
ITEM_NONE, // SLOT_HOOKSHOT
ITEM_NONE, // SLOT_ARROW_ICE
ITEM_NONE, // SLOT_FARORES_WIND
ITEM_NONE, // SLOT_BOOMERANG
ITEM_NONE, // SLOT_LENS
ITEM_NONE, // SLOT_BEAN
ITEM_NONE, // SLOT_HAMMER
ITEM_NONE, // SLOT_ARROW_LIGHT
ITEM_NONE, // SLOT_NAYRUS_LOVE
ITEM_NONE, // SLOT_BOTTLE_1
ITEM_NONE, // SLOT_BOTTLE_2
ITEM_NONE, // SLOT_BOTTLE_3
ITEM_NONE, // SLOT_BOTTLE_4
ITEM_NONE, // SLOT_TRADE_ADULT
ITEM_NONE, // SLOT_TRADE_CHILD
},
// ammo
{
0, // SLOT_STICK
0, // SLOT_NUT
0, // SLOT_BOMB
0, // SLOT_BOW
0, // SLOT_ARROW_FIRE
0, // SLOT_DINS_FIRE
0, // SLOT_SLINGSHOT
0, // SLOT_OCARINA
0, // SLOT_BOMBCHU
0, // SLOT_HOOKSHOT
0, // SLOT_ARROW_ICE
0, // SLOT_FARORES_WIND
0, // SLOT_BOOMERANG
0, // SLOT_LENS
0, // SLOT_BEAN
0, // SLOT_HAMMER
},
// equipment // equipment
(((1 << EQUIP_INV_TUNIC_KOKIRI) << (EQUIP_TYPE_TUNIC * 4)) | (((1 << EQUIP_INV_TUNIC_KOKIRI) << (EQUIP_TYPE_TUNIC * 4)) |
((1 << EQUIP_INV_BOOTS_KOKIRI) << (EQUIP_TYPE_BOOTS * 4))), ((1 << EQUIP_INV_BOOTS_KOKIRI) << (EQUIP_TYPE_BOOTS * 4))),
@ -223,13 +266,52 @@ static ItemEquips sDebugSaveEquips = {
}; };
static Inventory sDebugSaveInventory = { static Inventory sDebugSaveInventory = {
// items
{ {
ITEM_STICK, ITEM_NUT, ITEM_BOMB, ITEM_BOW, ITEM_ARROW_FIRE, ITEM_DINS_FIRE, ITEM_STICK, // SLOT_STICK
ITEM_SLINGSHOT, ITEM_OCARINA_FAIRY, ITEM_BOMBCHU, ITEM_HOOKSHOT, ITEM_ARROW_ICE, ITEM_FARORES_WIND, ITEM_NUT, // SLOT_NUT
ITEM_BOOMERANG, ITEM_LENS, ITEM_BEAN, ITEM_HAMMER, ITEM_ARROW_LIGHT, ITEM_NAYRUS_LOVE, ITEM_BOMB, // SLOT_BOMB
ITEM_BOTTLE, ITEM_POTION_RED, ITEM_POTION_GREEN, ITEM_POTION_BLUE, ITEM_POCKET_EGG, ITEM_WEIRD_EGG, ITEM_BOW, // SLOT_BOW
}, // items ITEM_ARROW_FIRE, // SLOT_ARROW_FIRE
{ 50, 50, 10, 30, 1, 1, 30, 1, 50, 1, 1, 1, 1, 1, 1, 1 }, // ammo ITEM_DINS_FIRE, // SLOT_DINS_FIRE
ITEM_SLINGSHOT, // SLOT_SLINGSHOT
ITEM_OCARINA_FAIRY, // SLOT_OCARINA
ITEM_BOMBCHU, // SLOT_BOMBCHU
ITEM_HOOKSHOT, // SLOT_HOOKSHOT
ITEM_ARROW_ICE, // SLOT_ARROW_ICE
ITEM_FARORES_WIND, // SLOT_FARORES_WIND
ITEM_BOOMERANG, // SLOT_BOOMERANG
ITEM_LENS, // SLOT_LENS
ITEM_BEAN, // SLOT_BEAN
ITEM_HAMMER, // SLOT_HAMMER
ITEM_ARROW_LIGHT, // SLOT_ARROW_LIGHT
ITEM_NAYRUS_LOVE, // SLOT_NAYRUS_LOVE
ITEM_BOTTLE, // SLOT_BOTTLE_1
ITEM_POTION_RED, // SLOT_BOTTLE_2
ITEM_POTION_GREEN, // SLOT_BOTTLE_3
ITEM_POTION_BLUE, // SLOT_BOTTLE_4
ITEM_POCKET_EGG, // SLOT_TRADE_ADULT
ITEM_WEIRD_EGG, // SLOT_TRADE_CHILD
},
// ammo
{
50, // SLOT_STICK
50, // SLOT_NUT
10, // SLOT_BOMB
30, // SLOT_BOW
1, // SLOT_ARROW_FIRE
1, // SLOT_DINS_FIRE
30, // SLOT_SLINGSHOT
1, // SLOT_OCARINA
50, // SLOT_BOMBCHU
1, // SLOT_HOOKSHOT
1, // SLOT_ARROW_ICE
1, // SLOT_FARORES_WIND
1, // SLOT_BOOMERANG
1, // SLOT_LENS
1, // SLOT_BEAN
1 // SLOT_HAMMER
},
// equipment // equipment
((((1 << EQUIP_INV_SWORD_KOKIRI) << (EQUIP_TYPE_SWORD * 4)) | ((((1 << EQUIP_INV_SWORD_KOKIRI) << (EQUIP_TYPE_SWORD * 4)) |
((1 << EQUIP_INV_SWORD_MASTER) << (EQUIP_TYPE_SWORD * 4)) | ((1 << EQUIP_INV_SWORD_MASTER) << (EQUIP_TYPE_SWORD * 4)) |
@ -300,9 +382,22 @@ void Sram_InitDebugSave(void) {
} }
static s16 sDungeonEntrances[] = { static s16 sDungeonEntrances[] = {
ENTR_YDAN_0, ENTR_DDAN_0, ENTR_BDAN_0, ENTR_BMORI1_0, ENTR_HIDAN_0, ENTR_MIZUSIN_0, ENTR_YDAN_0, // SCENE_YDAN
ENTR_JYASINZOU_0, ENTR_HAKADAN_0, ENTR_HAKADANCH_0, ENTR_ICE_DOUKUTO_0, ENTR_GANON_0, ENTR_MEN_0, ENTR_DDAN_0, // SCENE_DDAN
ENTR_GERUDOWAY_0, ENTR_GANONTIKA_0, ENTR_GANON_SONOGO_0, ENTR_GANONTIKA_SONOGO_0, ENTR_BDAN_0, // SCENE_BDAN
ENTR_BMORI1_0, // SCENE_BMORI1
ENTR_HIDAN_0, // SCENE_HIDAN
ENTR_MIZUSIN_0, // SCENE_MIZUSIN
ENTR_JYASINZOU_0, // SCENE_JYASINZOU
ENTR_HAKADAN_0, // SCENE_HAKADAN
ENTR_HAKADANCH_0, // SCENE_HAKADANCH
ENTR_ICE_DOUKUTO_0, // SCENE_ICE_DOUKUTO
ENTR_GANON_0, // SCENE_GANON
ENTR_MEN_0, // SCENE_MEN
ENTR_GERUDOWAY_0, // SCENE_GERUDOWAY
ENTR_GANONTIKA_0, // SCENE_GANONTIKA
ENTR_GANON_SONOGO_0, // SCENE_GANON_SONOGO
ENTR_GANONTIKA_SONOGO_0, // SCENE_GANONTIKA_SONOGO
}; };
/** /**

View file

@ -1,33 +1,33 @@
#include "global.h" #include "global.h"
#include "z64elf_message.h" #include "z64quest_hint_commands.h"
ElfMessage gOverworldNaviMsgs[] = { QuestHintCmd gOverworldNaviQuestHints[] = {
ELF_MSG_FLAG(CHECK, 0x40, false, EVENTCHKINF_05), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_05, false, 0x40),
ELF_MSG_FLAG(CHECK, 0x41, false, EVENTCHKINF_09), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_09, false, 0x41),
ELF_MSG_FLAG(CHECK, 0x42, false, EVENTCHKINF_12), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_12, false, 0x42),
ELF_MSG_FLAG(CHECK, 0x43, false, EVENTCHKINF_TALON_RETURNED_FROM_CASTLE), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_TALON_RETURNED_FROM_CASTLE, false, 0x43),
ELF_MSG_FLAG(CHECK, 0x44, false, EVENTCHKINF_40), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_40, false, 0x44),
ELF_MSG_SONG(CHECK, 0x45, false, ITEM_SONG_SARIA), QUEST_HINT_SONG(CHECK, ITEM_SONG_SARIA, false, 0x45),
ELF_MSG_STRENGTH_UPG(CHECK, 0x46, true, 0), QUEST_HINT_STRENGTH_UPG(CHECK, 0, true, 0x46),
ELF_MSG_FLAG(CHECK, 0x47, false, EVENTCHKINF_25), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_25, false, 0x47),
ELF_MSG_MAGIC(CHECK, 0x48, false), QUEST_HINT_MAGIC(CHECK, false, 0x48),
ELF_MSG_FLAG(CHECK, 0x49, false, EVENTCHKINF_33), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_33, false, 0x49),
ELF_MSG_FLAG(CHECK, 0x4A, false, EVENTCHKINF_37), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_37, false, 0x4A),
ELF_MSG_FLAG(CHECK, 0x4B, false, EVENTCHKINF_80), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_80, false, 0x4B),
ELF_MSG_FLAG(CHECK, 0x4C, false, EVENTCHKINF_43), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_43, false, 0x4C),
ELF_MSG_FLAG(CHECK, 0x4D, false, EVENTCHKINF_45), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_45, false, 0x4D),
ELF_MSG_ITEM(CHECK, 0x4E, true, ITEM_HOOKSHOT, ITEM_NONE), QUEST_HINT_ITEM(CHECK, ITEM_HOOKSHOT, ITEM_NONE, true, 0x4E),
ELF_MSG_MEDALLION(CHECK, 0x50, false, ITEM_MEDALLION_FOREST), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_FOREST, false, 0x50),
ELF_MSG_MEDALLION(CHECK, 0x51, false, ITEM_MEDALLION_FIRE), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_FIRE, false, 0x51),
ELF_MSG_BOOTS(CHECK, 0x52, false, ITEM_BOOTS_IRON), QUEST_HINT_BOOTS(CHECK, ITEM_BOOTS_IRON, false, 0x52),
ELF_MSG_MEDALLION(CHECK, 0x53, false, ITEM_MEDALLION_WATER), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_WATER, false, 0x53),
ELF_MSG_FLAG(CHECK, 0x54, false, EVENTCHKINF_AA), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_AA, false, 0x54),
ELF_MSG_ITEM(CHECK, 0x55, true, ITEM_LENS, ITEM_NONE), QUEST_HINT_ITEM(CHECK, ITEM_LENS, ITEM_NONE, true, 0x55),
ELF_MSG_MEDALLION(CHECK, 0x57, false, ITEM_MEDALLION_SHADOW), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_SHADOW, false, 0x57),
ELF_MSG_SONG(CHECK, 0x58, false, ITEM_SONG_REQUIEM), QUEST_HINT_SONG(CHECK, ITEM_SONG_REQUIEM, false, 0x58),
ELF_MSG_STRENGTH_UPG(CHECK, 0x56, true, 1), QUEST_HINT_STRENGTH_UPG(CHECK, 1, true, 0x56),
ELF_MSG_MEDALLION(CHECK, 0x5A, false, ITEM_MEDALLION_SPIRIT), QUEST_HINT_MEDALLION(CHECK, ITEM_MEDALLION_SPIRIT, false, 0x5A),
ELF_MSG_ITEM(CHECK, 0x5B, true, ITEM_ARROW_LIGHT, ITEM_NONE), QUEST_HINT_ITEM(CHECK, ITEM_ARROW_LIGHT, ITEM_NONE, true, 0x5B),
ELF_MSG_FLAG(CHECK, 0x5C, false, EVENTCHKINF_C3), QUEST_HINT_FLAG(CHECK, EVENTCHKINF_C3, false, 0x5C),
ELF_MSG_END(0x5F), QUEST_HINT_END(0x5F),
}; };

View file

@ -1,6 +1,6 @@
#include "global.h" #include "global.h"
#include "z64elf_message.h" #include "z64quest_hint_commands.h"
ElfMessage gDungeonNaviMsgs[] = { QuestHintCmd gDungeonNaviQuestHints[] = {
ELF_MSG_END(0x5F), QUEST_HINT_END(0x5F),
}; };

View file

@ -14,7 +14,11 @@ static const du pilo = { 0x3E6110B4, 0x611A6263 };
static const fu zero = { 0x00000000 }; static const fu zero = { 0x00000000 };
f32 cosf(f32 x) { /**
* @param angle radians
* @return cos(angle)
*/
f32 cosf(f32 angle) {
f32 absx; f32 absx;
f64 dx; f64 dx;
f64 xSq; f64 xSq;
@ -22,13 +26,13 @@ f32 cosf(f32 x) {
f64 dn; f64 dn;
s32 n; s32 n;
f64 result; f64 result;
s32 ix = *(s32*)&x; s32 ix = *(s32*)&angle;
s32 xpt = (ix >> 22); s32 xpt = (ix >> 22);
xpt &= 0x1FF; xpt &= 0x1FF;
if (xpt < 0x136) { if (xpt < 0x136) {
absx = (x > 0) ? x : -x; absx = (angle > 0) ? angle : -angle;
dx = absx; dx = absx;
dn = dx * rpi.d + 0.5; dn = dx * rpi.d + 0.5;
@ -51,7 +55,7 @@ f32 cosf(f32 x) {
} }
return -(f32)result; return -(f32)result;
} }
if (x != x) { if (angle != angle) {
return __libm_qnan_f; return __libm_qnan_f;
} }

View file

@ -1,5 +1,9 @@
#include "global.h" #include "global.h"
/**
* @param angle binang
* @return cos(angle)*0x7FFF
*/
s16 coss(u16 angle) { s16 coss(u16 angle) {
return sins(angle + 0x4000); return sins(angle + 0x4000);
} }

View file

@ -14,20 +14,24 @@ static const du pilo = { 0x3E6110B4, 0x611A6263 };
static const fu zero = { 0x00000000 }; static const fu zero = { 0x00000000 };
f32 sinf(f32 x) { /**
* @param angle radians
* @return sin(angle)
*/
f32 sinf(f32 angle) {
f64 dx; f64 dx;
f64 xSq; f64 xSq;
f64 polyApprox; f64 polyApprox;
f64 dn; f64 dn;
s32 n; s32 n;
f64 result; f64 result;
s32 ix = *(s32*)&x; s32 ix = *(s32*)&angle;
s32 xpt = (ix >> 22); s32 xpt = (ix >> 22);
xpt &= 0x1FF; xpt &= 0x1FF;
if (xpt < 0xFF) { if (xpt < 0xFF) {
dx = x; dx = angle;
if (xpt >= 0xE6) { if (xpt >= 0xE6) {
xSq = SQ(dx); xSq = SQ(dx);
@ -35,11 +39,11 @@ f32 sinf(f32 x) {
result = dx + (dx * xSq) * polyApprox; result = dx + (dx * xSq) * polyApprox;
return (f32)result; return (f32)result;
} }
return x; return angle;
} }
if (xpt < 0x136) { if (xpt < 0x136) {
dx = x; dx = angle;
dn = dx * rpi.d; dn = dx * rpi.d;
n = ROUND(dn); n = ROUND(dn);
dn = n; dn = n;
@ -57,7 +61,7 @@ f32 sinf(f32 x) {
return -(f32)result; return -(f32)result;
} }
if (x != x) { if (angle != angle) {
return __libm_qnan_f; return __libm_qnan_f;
} }
return zero.f; return zero.f;

View file

@ -2,18 +2,22 @@
#include "sintable.inc.c" #include "sintable.inc.c"
s16 sins(u16 x) { /**
* @param angle binang
* @return sin(angle)*0x7FFF
*/
s16 sins(u16 angle) {
s16 value; s16 value;
x >>= 4; angle >>= 4;
if (x & 0x400) { if (angle & 0x400) {
value = sintable[0x3FF - (x & 0x3FF)]; value = sintable[0x3FF - (angle & 0x3FF)];
} else { } else {
value = sintable[x & 0x3FF]; value = sintable[angle & 0x3FF];
} }
if (x & 0x800) { if (angle & 0x800) {
return -value; return -value;
} else { } else {
return value; return value;

View file

@ -70,7 +70,7 @@ void BgDyYoseizo_Init(Actor* thisx, PlayState* play2) {
PlayState* play = play2; PlayState* play = play2;
BgDyYoseizo* this = (BgDyYoseizo*)thisx; BgDyYoseizo* this = (BgDyYoseizo*)thisx;
this->fountainType = play->curSpawn; this->fountainType = play->spawn;
if (this->fountainType < 0) { if (this->fountainType < 0) {
this->fountainType = 0; this->fountainType = 0;
@ -82,12 +82,12 @@ void BgDyYoseizo_Init(Actor* thisx, PlayState* play2) {
if (play->sceneId == SCENE_DAIYOUSEI_IZUMI) { if (play->sceneId == SCENE_DAIYOUSEI_IZUMI) {
// "Great Fairy Fountain" // "Great Fairy Fountain"
osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 大妖精の泉 ☆☆☆☆☆ %d\n" VT_RST, play->curSpawn); osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 大妖精の泉 ☆☆☆☆☆ %d\n" VT_RST, play->spawn);
SkelAnime_InitFlex(play, &this->skelAnime, &gGreatFairySkel, &gGreatFairySittingTransitionAnim, SkelAnime_InitFlex(play, &this->skelAnime, &gGreatFairySkel, &gGreatFairySittingTransitionAnim,
this->jointTable, this->morphTable, 28); this->jointTable, this->morphTable, 28);
} else { } else {
// "Stone/Jewel Fairy Fountain" // "Stone/Jewel Fairy Fountain"
osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 石妖精の泉 ☆☆☆☆☆ %d\n" VT_RST, play->curSpawn); osSyncPrintf(VT_FGCOL(GREEN) "☆☆☆☆☆ 石妖精の泉 ☆☆☆☆☆ %d\n" VT_RST, play->spawn);
SkelAnime_InitFlex(play, &this->skelAnime, &gGreatFairySkel, &gGreatFairyLayingDownTransitionAnim, SkelAnime_InitFlex(play, &this->skelAnime, &gGreatFairySkel, &gGreatFairyLayingDownTransitionAnim,
this->jointTable, this->morphTable, 28); this->jointTable, this->morphTable, 28);
} }

View file

@ -143,7 +143,7 @@ void BgMizuMovebg_Init(Actor* thisx, PlayState* play) {
((BgMizuMovebg*)thisx)->scrollAlpha4 = 160; ((BgMizuMovebg*)thisx)->scrollAlpha4 = 160;
waypointId = MOVEBG_POINT_ID(thisx->params); waypointId = MOVEBG_POINT_ID(thisx->params);
((BgMizuMovebg*)thisx)->waypointId = waypointId; ((BgMizuMovebg*)thisx)->waypointId = waypointId;
func_8089E108(play->setupPathList, &thisx->world.pos, MOVEBG_PATH_ID(thisx->params), waypointId); func_8089E108(play->pathList, &thisx->world.pos, MOVEBG_PATH_ID(thisx->params), waypointId);
((BgMizuMovebg*)thisx)->actionFunc = func_8089E650; ((BgMizuMovebg*)thisx)->actionFunc = func_8089E650;
break; break;
} }
@ -323,7 +323,7 @@ void func_8089E650(BgMizuMovebg* this, PlayState* play) {
f32 dz; f32 dz;
this->dyna.actor.speedXZ = MOVEBG_SPEED(this->dyna.actor.params) * 0.1f; this->dyna.actor.speedXZ = MOVEBG_SPEED(this->dyna.actor.params) * 0.1f;
func_8089E108(play->setupPathList, &waypoint, MOVEBG_PATH_ID(this->dyna.actor.params), this->waypointId); func_8089E108(play->pathList, &waypoint, MOVEBG_PATH_ID(this->dyna.actor.params), this->waypointId);
dist = Actor_WorldDistXYZToPoint(&this->dyna.actor, &waypoint); dist = Actor_WorldDistXYZToPoint(&this->dyna.actor, &waypoint);
if (dist < this->dyna.actor.speedXZ) { if (dist < this->dyna.actor.speedXZ) {
this->dyna.actor.speedXZ = dist; this->dyna.actor.speedXZ = dist;
@ -335,9 +335,9 @@ void func_8089E650(BgMizuMovebg* this, PlayState* play) {
dz = waypoint.z - this->dyna.actor.world.pos.z; dz = waypoint.z - this->dyna.actor.world.pos.z;
if (fabsf(dx) < 2.0f && fabsf(dy) < 2.0f && fabsf(dz) < 2.0f) { if (fabsf(dx) < 2.0f && fabsf(dy) < 2.0f && fabsf(dz) < 2.0f) {
this->waypointId++; this->waypointId++;
if (this->waypointId >= play->setupPathList[MOVEBG_PATH_ID(this->dyna.actor.params)].count) { if (this->waypointId >= play->pathList[MOVEBG_PATH_ID(this->dyna.actor.params)].count) {
this->waypointId = 0; this->waypointId = 0;
func_8089E108(play->setupPathList, &this->dyna.actor.world.pos, MOVEBG_PATH_ID(this->dyna.actor.params), 0); func_8089E108(play->pathList, &this->dyna.actor.world.pos, MOVEBG_PATH_ID(this->dyna.actor.params), 0);
} }
} }
if (!(D_8089EE40 & 1) && MOVEBG_SPEED(this->dyna.actor.params) != 0) { if (!(D_8089EE40 & 1) && MOVEBG_SPEED(this->dyna.actor.params) != 0) {

View file

@ -60,7 +60,7 @@ void BgRelayObjects_Init(Actor* thisx, PlayState* play) {
} else { } else {
thisx->world.rot.y = 0x80; thisx->world.rot.y = 0x80;
} }
func_800F5718(); Audio_PlayWindmillBgm();
thisx->room = -1; thisx->room = -1;
thisx->flags |= ACTOR_FLAG_5; thisx->flags |= ACTOR_FLAG_5;
if (D_808A9508 & 2) { if (D_808A9508 & 2) {

View file

@ -108,7 +108,7 @@ void func_808AC2BC(BgSpot01Objects2* this, PlayState* play) {
CollisionHeader_GetVirtual(&object_spot01_matoyab_col, &colHeader); CollisionHeader_GetVirtual(&object_spot01_matoyab_col, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, thisx, colHeader); this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, thisx, colHeader);
if (IS_DAY) { if (IS_DAY) {
func_808AC22C(play->setupPathList, &position, ((s32)thisx->params >> 8) & 0xFF, 0); func_808AC22C(play->pathList, &position, ((s32)thisx->params >> 8) & 0xFF, 0);
Actor_SpawnAsChild(&play->actorCtx, thisx, play, ACTOR_EN_DAIKU_KAKARIKO, position.x, position.y, Actor_SpawnAsChild(&play->actorCtx, thisx, play, ACTOR_EN_DAIKU_KAKARIKO, position.x, position.y,
position.z, thisx->world.rot.x, thisx->world.rot.y, thisx->world.rot.z, position.z, thisx->world.rot.x, thisx->world.rot.y, thisx->world.rot.z,
((((s32)thisx->params >> 8) & 0xFF) << 8) + 1); ((((s32)thisx->params >> 8) & 0xFF) << 8) + 1);

View file

@ -618,7 +618,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) {
this->csCamEye.z = 300.0f; this->csCamEye.z = 300.0f;
this->csCamAt.x = 0.0f; this->csCamAt.x = 0.0f;
this->unk_704 = 1.2566371f; this->unk_704 = 2 * M_PI / 5;
FALLTHROUGH; FALLTHROUGH;
case 3: case 3:
this->envLightMode = 0; this->envLightMode = 0;
@ -3178,8 +3178,8 @@ void BossGanon_Update(Actor* thisx, PlayState* play2) {
this->unk_278.y = this->unk_2EC[0].y + 50.0f + 30.0f; this->unk_278.y = this->unk_2EC[0].y + 50.0f + 30.0f;
this->unk_278.z = this->unk_2EC[0].z; this->unk_278.z = this->unk_2EC[0].z;
xOffset = (sinf(i * 1.2566371f) * 600.0f); xOffset = (sinf(i * (2 * M_PI / 5)) * 600.0f);
zOffset = (cosf(i * 1.2566371f) * 600.0f); zOffset = (cosf(i * (2 * M_PI / 5)) * 600.0f);
// 5 or 6 light balls that go into the charge. not the same as the ones that he throws // 5 or 6 light balls that go into the charge. not the same as the ones that he throws
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_BOSS_GANON, this->unk_1FC.x + xOffset, Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_BOSS_GANON, this->unk_1FC.x + xOffset,

View file

@ -858,7 +858,7 @@ void EnBb_FaceWaypoint(EnBb* this) {
} }
void EnBb_SetWaypoint(EnBb* this, PlayState* play) { void EnBb_SetWaypoint(EnBb* this, PlayState* play) {
Path* path = &play->setupPathList[this->path]; Path* path = &play->pathList[this->path];
Vec3s* point; Vec3s* point;
if (this->waypoint == (s16)(path->count - 1)) { if (this->waypoint == (s16)(path->count - 1)) {

View file

@ -287,7 +287,7 @@ s32 EnCs_HandleWalking(EnCs* this, PlayState* play) {
s16 walkAngle1; s16 walkAngle1;
s16 walkAngle2; s16 walkAngle2;
EnCs_GetPathPoint(play->setupPathList, &pathPos, this->path, this->waypoint); EnCs_GetPathPoint(play->pathList, &pathPos, this->path, this->waypoint);
xDiff = pathPos.x - this->actor.world.pos.x; xDiff = pathPos.x - this->actor.world.pos.x;
zDiff = pathPos.z - this->actor.world.pos.z; zDiff = pathPos.z - this->actor.world.pos.z;
walkAngle1 = RAD_TO_BINANG(Math_FAtan2F(xDiff, zDiff)); walkAngle1 = RAD_TO_BINANG(Math_FAtan2F(xDiff, zDiff));
@ -296,13 +296,13 @@ s32 EnCs_HandleWalking(EnCs* this, PlayState* play) {
while (this->walkDist <= 10.44f) { while (this->walkDist <= 10.44f) {
this->waypoint++; this->waypoint++;
waypointCount = EnCs_GetwaypointCount(play->setupPathList, this->path); waypointCount = EnCs_GetwaypointCount(play->pathList, this->path);
if ((this->waypoint < 0) || (!(this->waypoint < waypointCount))) { if ((this->waypoint < 0) || (!(this->waypoint < waypointCount))) {
this->waypoint = 0; this->waypoint = 0;
} }
EnCs_GetPathPoint(play->setupPathList, &pathPos, this->path, this->waypoint); EnCs_GetPathPoint(play->pathList, &pathPos, this->path, this->waypoint);
xDiff = pathPos.x - this->actor.world.pos.x; xDiff = pathPos.x - this->actor.world.pos.x;
zDiff = pathPos.z - this->actor.world.pos.z; zDiff = pathPos.z - this->actor.world.pos.z;
walkAngle2 = RAD_TO_BINANG(Math_FAtan2F(xDiff, zDiff)); walkAngle2 = RAD_TO_BINANG(Math_FAtan2F(xDiff, zDiff));

View file

@ -407,7 +407,7 @@ void EnDaiku_InitEscape(EnDaiku* this, PlayState* play) {
EnDaiku_InitSubCamera(this, play); EnDaiku_InitSubCamera(this, play);
exitLoop = false; exitLoop = false;
path = &play->setupPathList[this->actor.params >> 4 & 0xF]; path = &play->pathList[this->actor.params >> 4 & 0xF];
while (!exitLoop) { while (!exitLoop) {
pointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->waypoint; pointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->waypoint;
dx = pointPos->x - this->actor.world.pos.x; dx = pointPos->x - this->actor.world.pos.x;
@ -522,7 +522,7 @@ void EnDaiku_EscapeRun(EnDaiku* this, PlayState* play) {
f32 dxz; f32 dxz;
Vec3s* pointPos; Vec3s* pointPos;
path = &play->setupPathList[this->actor.params >> 4 & 0xF]; path = &play->pathList[this->actor.params >> 4 & 0xF];
pointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->waypoint; pointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->waypoint;
dx = pointPos->x - this->actor.world.pos.x; dx = pointPos->x - this->actor.world.pos.x;
dz = pointPos->z - this->actor.world.pos.z; dz = pointPos->z - this->actor.world.pos.z;

View file

@ -359,7 +359,7 @@ void EnDaikuKakariko_Run(EnDaikuKakariko* this, PlayState* play) {
s32 run; s32 run;
do { do {
path = &play->setupPathList[(this->actor.params >> 8) & 0xFF]; path = &play->pathList[(this->actor.params >> 8) & 0xFF];
pathPos = &((Vec3s*)SEGMENTED_TO_VIRTUAL(path->points))[this->waypoint]; pathPos = &((Vec3s*)SEGMENTED_TO_VIRTUAL(path->points))[this->waypoint];
xDist = pathPos->x - this->actor.world.pos.x; xDist = pathPos->x - this->actor.world.pos.x;
zDist = pathPos->z - this->actor.world.pos.z; zDist = pathPos->z - this->actor.world.pos.z;

View file

@ -507,7 +507,7 @@ void EnDivingGame_Update(Actor* thisx, PlayState* play2) {
if (1) {} if (1) {}
if (gSaveContext.timer1Value == 10) { if (gSaveContext.timer1Value == 10) {
func_800F5918(); Audio_SetFastTempoForTimedMinigame();
} }
if (this->eyeTimer == 0) { if (this->eyeTimer == 0) {
this->eyeTimer = 2; this->eyeTimer = 2;

View file

@ -1267,7 +1267,7 @@ void func_80A05040(Actor* thisx, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) { switch (play->msgCtx.choiceIndex) {
case 0: // yes case 0: // yes
Message_ContinueTextbox(play, ElfMessage_GetSariaText(play)); Message_ContinueTextbox(play, QuestHint_GetSariaTextId(play));
this->actor.update = func_80A05114; this->actor.update = func_80A05114;
break; break;
case 1: // no case 1: // no
@ -1301,7 +1301,7 @@ void func_80A05188(Actor* thisx, PlayState* play) {
func_80A04DE4(this, play); func_80A04DE4(this, play);
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play)) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_EVENT) && Message_ShouldAdvance(play)) {
Message_ContinueTextbox(play, ElfMessage_GetSariaText(play)); Message_ContinueTextbox(play, QuestHint_GetSariaTextId(play));
this->actor.update = func_80A05114; this->actor.update = func_80A05114;
} }
@ -1310,7 +1310,7 @@ void func_80A05188(Actor* thisx, PlayState* play) {
// ask to talk to navi // ask to talk to navi
void func_80A05208(Actor* thisx, PlayState* play) { void func_80A05208(Actor* thisx, PlayState* play) {
s32 naviCUpText; s32 naviTextId;
EnElf* this = (EnElf*)thisx; EnElf* this = (EnElf*)thisx;
func_80A04DE4(this, play); func_80A04DE4(this, play);
@ -1318,10 +1318,10 @@ void func_80A05208(Actor* thisx, PlayState* play) {
if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) { if ((Message_GetState(&play->msgCtx) == TEXT_STATE_CHOICE) && Message_ShouldAdvance(play)) {
switch (play->msgCtx.choiceIndex) { switch (play->msgCtx.choiceIndex) {
case 0: // yes case 0: // yes
naviCUpText = ElfMessage_GetCUpText(play); naviTextId = QuestHint_GetNaviTextId(play);
if (naviCUpText != 0) { if (naviTextId != 0) {
Message_ContinueTextbox(play, naviCUpText); Message_ContinueTextbox(play, naviTextId);
} else { } else {
Message_ContinueTextbox(play, 0x15F); Message_ContinueTextbox(play, 0x15F);
} }
@ -1379,7 +1379,7 @@ void func_80A053F0(Actor* thisx, PlayState* play) {
if (player->naviTextId == 0) { if (player->naviTextId == 0) {
if (player->unk_664 == NULL) { if (player->unk_664 == NULL) {
if (((gSaveContext.naviTimer >= 600) && (gSaveContext.naviTimer <= 3000)) || (nREG(89) != 0)) { if (((gSaveContext.naviTimer >= 600) && (gSaveContext.naviTimer <= 3000)) || (nREG(89) != 0)) {
player->naviTextId = ElfMessage_GetCUpText(play); player->naviTextId = QuestHint_GetNaviTextId(play);
if (player->naviTextId == 0x15F) { if (player->naviTextId == 0x15F) {
player->naviTextId = 0; player->naviTextId = 0;
@ -1395,7 +1395,7 @@ void func_80A053F0(Actor* thisx, PlayState* play) {
func_800F4524(&gSfxDefaultPos, NA_SE_VO_SK_LAUGH, 0x20); func_800F4524(&gSfxDefaultPos, NA_SE_VO_SK_LAUGH, 0x20);
thisx->focus.pos = thisx->world.pos; thisx->focus.pos = thisx->world.pos;
if (thisx->textId == ElfMessage_GetCUpText(play)) { if (thisx->textId == QuestHint_GetNaviTextId(play)) {
this->fairyFlags |= 0x80; this->fairyFlags |= 0x80;
gSaveContext.naviTimer = 3001; gSaveContext.naviTimer = 3001;
} }

View file

@ -473,7 +473,7 @@ s32 EnGo_FollowPath(EnGo* this, PlayState* play) {
return false; return false;
} }
path = &play->setupPathList[this->actor.params & 0xF]; path = &play->pathList[this->actor.params & 0xF];
pointPos = SEGMENTED_TO_VIRTUAL(path->points); pointPos = SEGMENTED_TO_VIRTUAL(path->points);
pointPos += this->unk_218; pointPos += this->unk_218;
xDist = pointPos->x - this->actor.world.pos.x; xDist = pointPos->x - this->actor.world.pos.x;
@ -507,7 +507,7 @@ s32 EnGo_SetMovedPos(EnGo* this, PlayState* play) {
if ((this->actor.params & 0xF) == 0xF) { if ((this->actor.params & 0xF) == 0xF) {
return false; return false;
} else { } else {
path = &play->setupPathList[this->actor.params & 0xF]; path = &play->pathList[this->actor.params & 0xF];
pointPos = SEGMENTED_TO_VIRTUAL(path->points); pointPos = SEGMENTED_TO_VIRTUAL(path->points);
pointPos += (path->count - 1); pointPos += (path->count - 1);
this->actor.world.pos.x = pointPos->x; this->actor.world.pos.x = pointPos->x;

View file

@ -1833,7 +1833,7 @@ void EnGo2_BiggoronEyedrops(EnGo2* this, PlayState* play) {
this->eyeMouthTexState = 2; this->eyeMouthTexState = 2;
this->unk_20C = 0; this->unk_20C = 0;
this->goronState++; this->goronState++;
func_800F483C(0x28, 5); Audio_SetMainBgmVolume(0x28, 5);
OnePointCutscene_Init(play, 4190, -99, &this->actor, CAM_ID_MAIN); OnePointCutscene_Init(play, 4190, -99, &this->actor, CAM_ID_MAIN);
break; break;
case 1: case 1:
@ -1848,7 +1848,7 @@ void EnGo2_BiggoronEyedrops(EnGo2* this, PlayState* play) {
Message_ContinueTextbox(play, 0x305A); Message_ContinueTextbox(play, 0x305A);
this->eyeMouthTexState = 3; this->eyeMouthTexState = 3;
this->goronState++; this->goronState++;
func_800F483C(0x7F, 5); Audio_SetMainBgmVolume(0x7F, 5);
} }
break; break;
case 2: case 2:

View file

@ -137,7 +137,7 @@ void EnGoroiwa_SetSpeed(EnGoroiwa* this, PlayState* play) {
} }
void EnGoroiwa_FaceNextWaypoint(EnGoroiwa* this, PlayState* play) { void EnGoroiwa_FaceNextWaypoint(EnGoroiwa* this, PlayState* play) {
Path* path = &play->setupPathList[this->actor.params & 0xFF]; Path* path = &play->pathList[this->actor.params & 0xFF];
Vec3s* nextPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint; Vec3s* nextPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint;
Vec3f nextPosF; Vec3f nextPosF;
@ -150,7 +150,7 @@ void EnGoroiwa_FaceNextWaypoint(EnGoroiwa* this, PlayState* play) {
void EnGoroiwa_GetPrevWaypointDiff(EnGoroiwa* this, PlayState* play, Vec3f* dest) { void EnGoroiwa_GetPrevWaypointDiff(EnGoroiwa* this, PlayState* play, Vec3f* dest) {
s16 loopMode = (this->actor.params >> 8) & 3; s16 loopMode = (this->actor.params >> 8) & 3;
Path* path = &play->setupPathList[this->actor.params & 0xFF]; Path* path = &play->pathList[this->actor.params & 0xFF];
s16 prevWaypoint = this->currentWaypoint - this->pathDirection; s16 prevWaypoint = this->currentWaypoint - this->pathDirection;
Vec3s* prevPointPos; Vec3s* prevPointPos;
Vec3s* currentPointPos; Vec3s* currentPointPos;
@ -215,14 +215,14 @@ void EnGoroiwa_ReverseDirection(EnGoroiwa* this) {
} }
void EnGoroiwa_InitPath(EnGoroiwa* this, PlayState* play) { void EnGoroiwa_InitPath(EnGoroiwa* this, PlayState* play) {
this->endWaypoint = play->setupPathList[this->actor.params & 0xFF].count - 1; this->endWaypoint = play->pathList[this->actor.params & 0xFF].count - 1;
this->currentWaypoint = 0; this->currentWaypoint = 0;
this->nextWaypoint = 1; this->nextWaypoint = 1;
this->pathDirection = 1; this->pathDirection = 1;
} }
void EnGoroiwa_TeleportToWaypoint(EnGoroiwa* this, PlayState* play, s32 waypoint) { void EnGoroiwa_TeleportToWaypoint(EnGoroiwa* this, PlayState* play, s32 waypoint) {
Path* path = &play->setupPathList[this->actor.params & 0xFF]; Path* path = &play->pathList[this->actor.params & 0xFF];
Vec3s* pointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + waypoint; Vec3s* pointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + waypoint;
this->actor.world.pos.x = pointPos->x; this->actor.world.pos.x = pointPos->x;
@ -237,7 +237,7 @@ void EnGoroiwa_InitRotation(EnGoroiwa* this) {
s32 EnGoroiwa_GetAscendDirection(EnGoroiwa* this, PlayState* play) { s32 EnGoroiwa_GetAscendDirection(EnGoroiwa* this, PlayState* play) {
s32 pad; s32 pad;
Path* path = &play->setupPathList[this->actor.params & 0xFF]; Path* path = &play->pathList[this->actor.params & 0xFF];
Vec3s* nextPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint; Vec3s* nextPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint;
Vec3s* currentPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->currentWaypoint; Vec3s* currentPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->currentWaypoint;
@ -301,7 +301,7 @@ s32 EnGoroiwa_MoveAndFall(EnGoroiwa* this, PlayState* play) {
Math_StepToF(&this->actor.speedXZ, R_EN_GOROIWA_SPEED * 0.01f, 0.3f); Math_StepToF(&this->actor.speedXZ, R_EN_GOROIWA_SPEED * 0.01f, 0.3f);
func_8002D868(&this->actor); func_8002D868(&this->actor);
path = &play->setupPathList[this->actor.params & 0xFF]; path = &play->pathList[this->actor.params & 0xFF];
nextPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint; nextPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint;
result = true; result = true;
result &= Math_StepToF(&this->actor.world.pos.x, nextPointPos->x, fabsf(this->actor.velocity.x)); result &= Math_StepToF(&this->actor.world.pos.x, nextPointPos->x, fabsf(this->actor.velocity.x));
@ -311,7 +311,7 @@ s32 EnGoroiwa_MoveAndFall(EnGoroiwa* this, PlayState* play) {
} }
s32 EnGoroiwa_Move(EnGoroiwa* this, PlayState* play) { s32 EnGoroiwa_Move(EnGoroiwa* this, PlayState* play) {
Path* path = &play->setupPathList[this->actor.params & 0xFF]; Path* path = &play->pathList[this->actor.params & 0xFF];
s32 pad; s32 pad;
Vec3s* nextPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint; Vec3s* nextPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint;
Vec3s* currentPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->currentWaypoint; Vec3s* currentPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->currentWaypoint;
@ -343,7 +343,7 @@ s32 EnGoroiwa_Move(EnGoroiwa* this, PlayState* play) {
s32 EnGoroiwa_MoveUpToNextWaypoint(EnGoroiwa* this, PlayState* play) { s32 EnGoroiwa_MoveUpToNextWaypoint(EnGoroiwa* this, PlayState* play) {
s32 pad; s32 pad;
Path* path = &play->setupPathList[this->actor.params & 0xFF]; Path* path = &play->pathList[this->actor.params & 0xFF];
Vec3s* nextPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint; Vec3s* nextPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint;
Math_StepToF(&this->actor.velocity.y, (R_EN_GOROIWA_SPEED * 0.01f) * 0.5f, 0.18f); Math_StepToF(&this->actor.velocity.y, (R_EN_GOROIWA_SPEED * 0.01f) * 0.5f, 0.18f);
@ -354,7 +354,7 @@ s32 EnGoroiwa_MoveUpToNextWaypoint(EnGoroiwa* this, PlayState* play) {
s32 EnGoroiwa_MoveDownToNextWaypoint(EnGoroiwa* this, PlayState* play) { s32 EnGoroiwa_MoveDownToNextWaypoint(EnGoroiwa* this, PlayState* play) {
s32 pad; s32 pad;
Path* path = &play->setupPathList[this->actor.params & 0xFF]; Path* path = &play->pathList[this->actor.params & 0xFF];
Vec3s* nextPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint; Vec3s* nextPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint;
f32 nextPointY; f32 nextPointY;
f32 thisY; f32 thisY;
@ -543,7 +543,7 @@ void EnGoroiwa_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor); Actor_Kill(&this->actor);
return; return;
} }
if (play->setupPathList[pathIdx].count < 2) { if (play->pathList[pathIdx].count < 2) {
// "Error: Invalid Path Data" // "Error: Invalid Path Data"
osSyncPrintf(" : レールデータ が不正(%s %d)\n", "../z_en_gr.c", 1043); osSyncPrintf(" : レールデータ が不正(%s %d)\n", "../z_en_gr.c", 1043);
Actor_Kill(&this->actor); Actor_Kill(&this->actor);

View file

@ -153,7 +153,7 @@ void EnHeishi1_Walk(EnHeishi1* this, PlayState* play) {
} }
if (!sPlayerIsCaught) { if (!sPlayerIsCaught) {
path = &play->setupPathList[this->path]; path = &play->pathList[this->path];
pointPos = SEGMENTED_TO_VIRTUAL(path->points); pointPos = SEGMENTED_TO_VIRTUAL(path->points);
pointPos += this->waypoint; pointPos += this->waypoint;

View file

@ -2512,7 +2512,7 @@ void EnHorse_UpdateHbaAnim(EnHorse* this) {
void EnHorse_UpdateHorsebackArchery(EnHorse* this, PlayState* play) { void EnHorse_UpdateHorsebackArchery(EnHorse* this, PlayState* play) {
f32 playSpeed; f32 playSpeed;
s32 sp20; s32 isFanfarePlaying;
if (this->animationIdx == ENHORSE_ANIM_WALK) { if (this->animationIdx == ENHORSE_ANIM_WALK) {
EnHorse_PlayWalkingSfx(this); EnHorse_PlayWalkingSfx(this);
@ -2521,10 +2521,10 @@ void EnHorse_UpdateHorsebackArchery(EnHorse* this, PlayState* play) {
this->hbaTimer++; this->hbaTimer++;
} }
sp20 = func_800F5A58(NA_BGM_HORSE_GOAL); isFanfarePlaying = Audio_IsSequencePlaying(NA_BGM_HORSE_GOAL);
EnHorse_UpdateHbaRaceInfo(this, play, &sHbaInfo); EnHorse_UpdateHbaRaceInfo(this, play, &sHbaInfo);
if (this->hbaFlags & 1 || this->hbaTimer >= 46) { if ((this->hbaFlags & 1) || (this->hbaTimer >= 46)) {
if (sp20 != 1 && gSaveContext.minigameState != 3) { if ((isFanfarePlaying != true) && (gSaveContext.minigameState != 3)) {
gSaveContext.cutsceneIndex = 0; gSaveContext.cutsceneIndex = 0;
play->nextEntranceIndex = ENTR_SPOT12_16; play->nextEntranceIndex = ENTR_SPOT12_16;
play->transitionTrigger = TRANS_TRIGGER_START; play->transitionTrigger = TRANS_TRIGGER_START;

View file

@ -286,7 +286,7 @@ void func_80A6B91C(EnHorseNormal* this, PlayState* play) {
} }
void EnHorseNormal_FollowPath(EnHorseNormal* this, PlayState* play) { void EnHorseNormal_FollowPath(EnHorseNormal* this, PlayState* play) {
Path* path = &play->setupPathList[this->actor.params & 0xF]; Path* path = &play->pathList[this->actor.params & 0xF];
Vec3s* pointPos = SEGMENTED_TO_VIRTUAL(path->points); Vec3s* pointPos = SEGMENTED_TO_VIRTUAL(path->points);
f32 dx; f32 dx;
f32 dz; f32 dz;

View file

@ -279,7 +279,7 @@ s32 EnKz_FollowPath(EnKz* this, PlayState* play) {
return 0; return 0;
} }
path = &play->setupPathList[(this->actor.params & 0xFF00) >> 8]; path = &play->pathList[(this->actor.params & 0xFF00) >> 8];
pointPos = SEGMENTED_TO_VIRTUAL(path->points); pointPos = SEGMENTED_TO_VIRTUAL(path->points);
pointPos += this->waypoint; pointPos += this->waypoint;
@ -305,7 +305,7 @@ s32 EnKz_SetMovedPos(EnKz* this, PlayState* play) {
return 0; return 0;
} }
path = &play->setupPathList[(this->actor.params & 0xFF00) >> 8]; path = &play->pathList[(this->actor.params & 0xFF00) >> 8];
lastPointPos = SEGMENTED_TO_VIRTUAL(path->points); lastPointPos = SEGMENTED_TO_VIRTUAL(path->points);
lastPointPos += path->count - 1; lastPointPos += path->count - 1;

View file

@ -348,7 +348,7 @@ void EnMb_NextWaypoint(EnMb* this, PlayState* play) {
Path* path; Path* path;
Vec3s* waypointPos; Vec3s* waypointPos;
path = &play->setupPathList[this->path]; path = &play->pathList[this->path];
if (this->waypoint == 0) { if (this->waypoint == 0) {
this->direction = 1; this->direction = 1;
@ -404,7 +404,7 @@ s32 EnMb_IsPlayerInCorridor(EnMb* this, PlayState* play) {
} }
void EnMb_FindWaypointTowardsPlayer(EnMb* this, PlayState* play) { void EnMb_FindWaypointTowardsPlayer(EnMb* this, PlayState* play) {
Path* path = &play->setupPathList[this->path]; Path* path = &play->pathList[this->path];
s16 yawToWaypoint; s16 yawToWaypoint;
Vec3f waypointPosF; Vec3f waypointPosF;
Vec3s* waypointPosS; Vec3s* waypointPosS;

View file

@ -595,7 +595,7 @@ u8 EnMd_FollowPath(EnMd* this, PlayState* play) {
return 0; return 0;
} }
path = &play->setupPathList[(this->actor.params & 0xFF00) >> 8]; path = &play->pathList[(this->actor.params & 0xFF00) >> 8];
pointPos = SEGMENTED_TO_VIRTUAL(path->points); pointPos = SEGMENTED_TO_VIRTUAL(path->points);
pointPos += this->waypoint; pointPos += this->waypoint;
@ -622,7 +622,7 @@ u8 EnMd_SetMovedPos(EnMd* this, PlayState* play) {
return 0; return 0;
} }
path = &play->setupPathList[(this->actor.params & 0xFF00) >> 8]; path = &play->pathList[(this->actor.params & 0xFF00) >> 8];
lastPointPos = SEGMENTED_TO_VIRTUAL(path->points); lastPointPos = SEGMENTED_TO_VIRTUAL(path->points);
lastPointPos += path->count - 1; lastPointPos += path->count - 1;

View file

@ -331,7 +331,7 @@ s32 func_80AADEF0(EnMm* this, PlayState* play) {
s32 phi_a2; s32 phi_a2;
s32 phi_v1; s32 phi_v1;
func_80AADE60(play->setupPathList, &waypointPos, this->path, this->waypoint); func_80AADE60(play->pathList, &waypointPos, this->path, this->waypoint);
xDiff = waypointPos.x - this->actor.world.pos.x; xDiff = waypointPos.x - this->actor.world.pos.x;
zDiff = waypointPos.z - this->actor.world.pos.z; zDiff = waypointPos.z - this->actor.world.pos.z;
@ -349,7 +349,7 @@ s32 func_80AADEF0(EnMm* this, PlayState* play) {
phi_a2 = 0; phi_a2 = 0;
break; break;
case 1: case 1:
phi_a2 = EnMm_GetPointCount(play->setupPathList, this->path) - 1; phi_a2 = EnMm_GetPointCount(play->pathList, this->path) - 1;
break; break;
case 2: case 2:
phi_a2 = this->unk_1F0; phi_a2 = this->unk_1F0;
@ -363,7 +363,7 @@ s32 func_80AADEF0(EnMm* this, PlayState* play) {
phi_v1 = 0; phi_v1 = 0;
break; break;
case 1: case 1:
phi_v1 = EnMm_GetPointCount(play->setupPathList, this->path) - 1; phi_v1 = EnMm_GetPointCount(play->pathList, this->path) - 1;
break; break;
case 2: case 2:
phi_v1 = this->unk_1F0; phi_v1 = this->unk_1F0;
@ -376,7 +376,7 @@ s32 func_80AADEF0(EnMm* this, PlayState* play) {
this->waypoint = sPathInfo[this->unk_1E8].unk_08; this->waypoint = sPathInfo[this->unk_1E8].unk_08;
} }
func_80AADE60(play->setupPathList, &waypointPos, this->path, this->waypoint); func_80AADE60(play->pathList, &waypointPos, this->path, this->waypoint);
xDiff = waypointPos.x - this->actor.world.pos.x; xDiff = waypointPos.x - this->actor.world.pos.x;
zDiff = waypointPos.z - this->actor.world.pos.z; zDiff = waypointPos.z - this->actor.world.pos.z;

View file

@ -106,7 +106,7 @@ void EnNb_UpdatePath(EnNb* this, PlayState* play) {
s32 pad; s32 pad;
s32 path; s32 path;
pathList = play->setupPathList; pathList = play->pathList;
if (pathList != NULL) { if (pathList != NULL) {
path = EnNb_GetPath(this); path = EnNb_GetPath(this);

View file

@ -603,7 +603,7 @@ void func_80AB6A38(EnNiw* this, PlayState* play) {
this->unk_2FC = this->unk_300 = 0.0f; this->unk_2FC = this->unk_300 = 0.0f;
this->actionFunc = EnNiw_ResetAction; this->actionFunc = EnNiw_ResetAction;
} else { } else {
path = &play->setupPathList[pathIndex]; path = &play->pathList[pathIndex];
pointPos = SEGMENTED_TO_VIRTUAL(path->points); pointPos = SEGMENTED_TO_VIRTUAL(path->points);
pointPos += this->waypoint; pointPos += this->waypoint;
pathDiffX = pointPos->x - this->actor.world.pos.x; pathDiffX = pointPos->x - this->actor.world.pos.x;

View file

@ -101,7 +101,7 @@ void EnNiwGirl_Jump(EnNiwGirl* this, PlayState* play) {
} }
void func_80AB9210(EnNiwGirl* this, PlayState* play) { void func_80AB9210(EnNiwGirl* this, PlayState* play) {
Path* path = &play->setupPathList[this->path]; Path* path = &play->pathList[this->path];
f32 xDistBetween; f32 xDistBetween;
f32 zDistBetween; f32 zDistBetween;

View file

@ -243,7 +243,9 @@ void func_80ABF4C8(EnOkarinaTag* this, PlayState* play) {
case 2: case 2:
play->csCtx.segment = D_80ABF9D0; play->csCtx.segment = D_80ABF9D0;
gSaveContext.cutsceneTrigger = 1; gSaveContext.cutsceneTrigger = 1;
func_800F574C(1.18921f, 90); // Increase pitch by 3 semitones i.e. 2^(3/12), scale tempo by same ratio
// Applies to the windmill bgm once the song of storms fanfare is complete
Audio_SetMainBgmTempoFreqAfterFanfare(1.18921f, 90);
break; break;
case 4: case 4:
play->csCtx.segment = D_80ABFB40; play->csCtx.segment = D_80ABFB40;

View file

@ -471,7 +471,7 @@ void EnOssan_TalkDefaultShopkeeper(PlayState* play) {
} }
void EnOssan_TalkKakarikoPotionShopkeeper(PlayState* play) { void EnOssan_TalkKakarikoPotionShopkeeper(PlayState* play) {
if (play->curSpawn == 0) { if (play->spawn == 0) {
Message_ContinueTextbox(play, 0x5046); Message_ContinueTextbox(play, 0x5046);
} else { } else {
Message_ContinueTextbox(play, 0x504E); Message_ContinueTextbox(play, 0x504E);
@ -487,7 +487,7 @@ void EnOssan_TalkKokiriShopkeeper(PlayState* play) {
} }
void EnOssan_TalkBazaarShopkeeper(PlayState* play) { void EnOssan_TalkBazaarShopkeeper(PlayState* play) {
if (play->curSpawn == 0) { if (play->spawn == 0) {
Message_ContinueTextbox(play, 0x9D); Message_ContinueTextbox(play, 0x9D);
} else { } else {
Message_ContinueTextbox(play, 0x9C); Message_ContinueTextbox(play, 0x9C);

View file

@ -87,7 +87,7 @@ void EnPoDesert_Destroy(Actor* thisx, PlayState* play) {
} }
void EnPoDesert_SetNextPathPoint(EnPoDesert* this, PlayState* play) { void EnPoDesert_SetNextPathPoint(EnPoDesert* this, PlayState* play) {
Path* path = &play->setupPathList[this->actor.params]; Path* path = &play->pathList[this->actor.params];
Vec3s* pathPoint; Vec3s* pathPoint;
Animation_MorphToLoop(&this->skelAnime, &gPoeFieldDisappearAnim, -6.0f); Animation_MorphToLoop(&this->skelAnime, &gPoeFieldDisappearAnim, -6.0f);

View file

@ -200,7 +200,7 @@ void EnRiverSound_Update(Actor* thisx, PlayState* play) {
if ((thisx->params == RS_RIVER_DEFAULT_LOW_FREQ) || (thisx->params == RS_RIVER_DEFAULT_MEDIUM_FREQ) || if ((thisx->params == RS_RIVER_DEFAULT_LOW_FREQ) || (thisx->params == RS_RIVER_DEFAULT_MEDIUM_FREQ) ||
(thisx->params == RS_RIVER_DEFAULT_HIGH_FREQ)) { (thisx->params == RS_RIVER_DEFAULT_HIGH_FREQ)) {
path = &play->setupPathList[this->pathIndex]; path = &play->pathList[this->pathIndex];
pos = &thisx->world.pos; pos = &thisx->world.pos;
if (EnRiverSound_GetSfxPos(SEGMENTED_TO_VIRTUAL(path->points), path->count, &player->actor.world.pos, pos)) { if (EnRiverSound_GetSfxPos(SEGMENTED_TO_VIRTUAL(path->points), path->count, &player->actor.world.pos, pos)) {

View file

@ -797,7 +797,7 @@ void EnTa_RunCuccoGame(EnTa* this, PlayState* play) {
} }
if (gSaveContext.timer1Value == 10) { if (gSaveContext.timer1Value == 10) {
func_800F5918(); Audio_SetFastTempoForTimedMinigame();
} }
if (gSaveContext.timer1Value == 0 && !Play_InCsMode(play)) { if (gSaveContext.timer1Value == 0 && !Play_InCsMode(play)) {

View file

@ -308,7 +308,7 @@ s32 EnTk_Orient(EnTk* this, PlayState* play) {
return 1; return 1;
} }
path = &play->setupPathList[0]; path = &play->pathList[0];
point = SEGMENTED_TO_VIRTUAL(path->points); point = SEGMENTED_TO_VIRTUAL(path->points);
point += this->currentWaypoint; point += this->currentWaypoint;

View file

@ -1573,7 +1573,7 @@ s32 func_80B56EE4(EnZl3* this, PlayState* play) {
void func_80B56F10(EnZl3* this, PlayState* play) { void func_80B56F10(EnZl3* this, PlayState* play) {
s32 waypoint; s32 waypoint;
Path* pathHead = play->setupPathList; Path* pathHead = play->pathList;
if (pathHead != NULL) { if (pathHead != NULL) {
waypoint = func_80B54DC4(this); waypoint = func_80B54DC4(this);
@ -1838,49 +1838,49 @@ void func_80B57858(PlayState* play) {
s32 func_80B57890(EnZl3* this, PlayState* play) { s32 func_80B57890(EnZl3* this, PlayState* play) {
s8 pad[2]; s8 pad[2];
u8 curSpawn = play->curSpawn; u8 spawn = play->spawn;
s16 sceneId = play->sceneId; s16 sceneId = play->sceneId;
s32 result = func_80B54DB4(this); s32 result = func_80B54DB4(this);
if (play) {} // Needed to match, this if can be almost anywhere and it still matches if (play) {} // Needed to match, this if can be almost anywhere and it still matches
if (sceneId == SCENE_GANON_SONOGO) { if (sceneId == SCENE_GANON_SONOGO) {
if ((result == 0x24) && (curSpawn == 0)) { if ((result == 0x24) && (spawn == 0)) {
return 1; return 1;
} }
if ((result == 0x25) && (curSpawn == 2)) { if ((result == 0x25) && (spawn == 2)) {
return 1; return 1;
} }
if ((result == 0x26) && (curSpawn == 4)) { if ((result == 0x26) && (spawn == 4)) {
return 1; return 1;
} }
if ((result == 0x27) && (curSpawn == 6)) { if ((result == 0x27) && (spawn == 6)) {
return 1; return 1;
} }
if ((result == 0x28) && (curSpawn == 6)) { if ((result == 0x28) && (spawn == 6)) {
return 1; return 1;
} }
} else if (sceneId == SCENE_GANON_FINAL) { } else if (sceneId == SCENE_GANON_FINAL) {
if ((result == 0x20) && (curSpawn == 0) && Flags_GetSwitch(play, 0x37)) { if ((result == 0x20) && (spawn == 0) && Flags_GetSwitch(play, 0x37)) {
if ((play->sceneId == SCENE_GANON_DEMO) || (play->sceneId == SCENE_GANON_FINAL) || if ((play->sceneId == SCENE_GANON_DEMO) || (play->sceneId == SCENE_GANON_FINAL) ||
(play->sceneId == SCENE_GANON_SONOGO) || (play->sceneId == SCENE_GANONTIKA_SONOGO)) { (play->sceneId == SCENE_GANON_SONOGO) || (play->sceneId == SCENE_GANONTIKA_SONOGO)) {
return 1; return 1;
} }
} }
if ((result == 0x21) && (curSpawn == 2)) { if ((result == 0x21) && (spawn == 2)) {
return 1; return 1;
} }
if ((result == 0x22) && (curSpawn == 4)) { if ((result == 0x22) && (spawn == 4)) {
return 1; return 1;
} }
if ((result == 0x23) && (curSpawn == 6)) { if ((result == 0x23) && (spawn == 6)) {
return 1; return 1;
} }
} else if (sceneId == SCENE_GANONTIKA_SONOGO) { } else if (sceneId == SCENE_GANONTIKA_SONOGO) {
if ((result == 0x29) && (curSpawn == 0)) { if ((result == 0x29) && (spawn == 0)) {
return 1; return 1;
} }
if ((result == 0x2A) && (curSpawn == 0)) { if ((result == 0x2A) && (spawn == 0)) {
return 1; return 1;
} }
} }
@ -2489,9 +2489,9 @@ s32 func_80B59698(EnZl3* this, PlayState* play) {
(play->sceneId == SCENE_GANON_SONOGO) || (play->sceneId == SCENE_GANONTIKA_SONOGO)); (play->sceneId == SCENE_GANON_SONOGO) || (play->sceneId == SCENE_GANONTIKA_SONOGO));
if (cond) { if (cond) {
u8 curSpawn = play->curSpawn; u8 spawn = play->spawn;
if ((func_80B54DB4(this) == 0x20) && (curSpawn == 0) && if ((func_80B54DB4(this) == 0x20) && (spawn == 0) &&
((gSaveContext.timer2Value <= 0) || (gSaveContext.timer2State == 0))) { ((gSaveContext.timer2Value <= 0) || (gSaveContext.timer2State == 0))) {
return 1; return 1;
} }
@ -2505,9 +2505,9 @@ s32 func_80B59768(EnZl3* this, PlayState* play) {
(play->sceneId == SCENE_GANON_SONOGO) || (play->sceneId == SCENE_GANONTIKA_SONOGO)); (play->sceneId == SCENE_GANON_SONOGO) || (play->sceneId == SCENE_GANONTIKA_SONOGO));
if (cond) { if (cond) {
u8 curSpawn = play->curSpawn; u8 spawn = play->spawn;
if ((func_80B54DB4(this) == 0x20) && (curSpawn == 0) && (gSaveContext.timer2Value <= 0)) { if ((func_80B54DB4(this) == 0x20) && (spawn == 0) && (gSaveContext.timer2Value <= 0)) {
return 1; return 1;
} }
} }

View file

@ -35,21 +35,55 @@ const ActorInit Item_Etcetera_InitVars = {
}; };
static s16 sObjectIds[] = { static s16 sObjectIds[] = {
OBJECT_GI_BOTTLE, OBJECT_GI_BOTTLE_LETTER, OBJECT_GI_SHIELD_2, OBJECT_GI_ARROWCASE, OBJECT_GI_SCALE, OBJECT_GI_BOTTLE, // ITEM_ETC_BOTTLE
OBJECT_GI_SCALE, OBJECT_GI_KEY, OBJECT_GI_M_ARROW, OBJECT_GI_RUPY, OBJECT_GI_RUPY, OBJECT_GI_BOTTLE_LETTER, // ITEM_ETC_LETTER
OBJECT_GI_RUPY, OBJECT_GI_RUPY, OBJECT_GI_HEARTS, OBJECT_GI_KEY, OBJECT_GI_SHIELD_2, // ITEM_ETC_SHIELD_HYLIAN
OBJECT_GI_ARROWCASE, // ITEM_ETC_QUIVER
OBJECT_GI_SCALE, // ITEM_ETC_SCALE_SILVER
OBJECT_GI_SCALE, // ITEM_ETC_SCALE_GOLD
OBJECT_GI_KEY, // ITEM_ETC_KEY_SMALL
OBJECT_GI_M_ARROW, // ITEM_ETC_ARROW_FIRE
OBJECT_GI_RUPY, // ITEM_ETC_RUPEE_GREEN_CHEST_GAME
OBJECT_GI_RUPY, // ITEM_ETC_RUPEE_BLUE_CHEST_GAME
OBJECT_GI_RUPY, // ITEM_ETC_RUPEE_RED_CHEST_GAME
OBJECT_GI_RUPY, // ITEM_ETC_RUPEE_PURPLE_CHEST_GAME
OBJECT_GI_HEARTS, // ITEM_ETC_HEART_PIECE_CHEST_GAME
OBJECT_GI_KEY, // ITEM_ETC_KEY_SMALL_CHEST_GAME
}; };
// Indices passed to the item table in z_draw.c // Indices passed to the item table in z_draw.c
static s16 sDrawItemIndices[] = { static s16 sDrawItemIndices[] = {
GID_BOTTLE, GID_LETTER_RUTO, GID_SHIELD_HYLIAN, GID_QUIVER_40, GID_SCALE_SILVER, GID_BOTTLE, // ITEM_ETC_BOTTLE
GID_SCALE_GOLDEN, GID_KEY_SMALL, GID_ARROW_FIRE, GID_RUPEE_GREEN, GID_RUPEE_BLUE, GID_LETTER_RUTO, // ITEM_ETC_LETTER
GID_RUPEE_RED, GID_RUPEE_PURPLE, GID_HEART_PIECE, GID_KEY_SMALL, GID_SHIELD_HYLIAN, // ITEM_ETC_SHIELD_HYLIAN
GID_QUIVER_40, // ITEM_ETC_QUIVER
GID_SCALE_SILVER, // ITEM_ETC_SCALE_SILVER
GID_SCALE_GOLDEN, // ITEM_ETC_SCALE_GOLD
GID_KEY_SMALL, // ITEM_ETC_KEY_SMALL
GID_ARROW_FIRE, // ITEM_ETC_ARROW_FIRE
GID_RUPEE_GREEN, // ITEM_ETC_RUPEE_GREEN_CHEST_GAME
GID_RUPEE_BLUE, // ITEM_ETC_RUPEE_BLUE_CHEST_GAME
GID_RUPEE_RED, // ITEM_ETC_RUPEE_RED_CHEST_GAME
GID_RUPEE_PURPLE, // ITEM_ETC_RUPEE_PURPLE_CHEST_GAME
GID_HEART_PIECE, // ITEM_ETC_HEART_PIECE_CHEST_GAME
GID_KEY_SMALL, // ITEM_ETC_KEY_SMALL_CHEST_GAME
}; };
static s16 sGetItemIds[] = { static s16 sGetItemIds[] = {
GI_BOTTLE, GI_LETTER_RUTO, GI_SHIELD_HYLIAN, GI_QUIVER_40, GI_SCALE_SILVER, GI_SCALE_GOLD, GI_KEY_SMALL, GI_BOTTLE, // ITEM_ETC_BOTTLE
GI_ARROW_FIRE, GI_NONE, GI_NONE, GI_NONE, GI_NONE, GI_NONE, GI_NONE, GI_LETTER_RUTO, // ITEM_ETC_LETTER
GI_SHIELD_HYLIAN, // ITEM_ETC_SHIELD_HYLIAN
GI_QUIVER_40, // ITEM_ETC_QUIVER
GI_SCALE_SILVER, // ITEM_ETC_SCALE_SILVER
GI_SCALE_GOLD, // ITEM_ETC_SCALE_GOLD
GI_KEY_SMALL, // ITEM_ETC_KEY_SMALL
GI_ARROW_FIRE, // ITEM_ETC_ARROW_FIRE
GI_NONE, // ITEM_ETC_RUPEE_GREEN_CHEST_GAME
GI_NONE, // ITEM_ETC_RUPEE_BLUE_CHEST_GAME
GI_NONE, // ITEM_ETC_RUPEE_RED_CHEST_GAME
GI_NONE, // ITEM_ETC_RUPEE_PURPLE_CHEST_GAME
GI_NONE, // ITEM_ETC_HEART_PIECE_CHEST_GAME
GI_NONE, // ITEM_ETC_KEY_SMALL_CHEST_GAME
}; };
void ItemEtcetera_SetupAction(ItemEtcetera* this, ItemEtceteraActionFunc actionFunc) { void ItemEtcetera_SetupAction(ItemEtcetera* this, ItemEtceteraActionFunc actionFunc) {

View file

@ -226,13 +226,13 @@ void ObjBean_SetDrawMode(ObjBean* this, u8 drawFlag) {
} }
void ObjBean_SetupPathCount(ObjBean* this, PlayState* play) { void ObjBean_SetupPathCount(ObjBean* this, PlayState* play) {
this->pathCount = play->setupPathList[(this->dyna.actor.params >> 8) & 0x1F].count - 1; this->pathCount = play->pathList[(this->dyna.actor.params >> 8) & 0x1F].count - 1;
this->currentPointIndex = 0; this->currentPointIndex = 0;
this->nextPointIndex = 1; this->nextPointIndex = 1;
} }
void ObjBean_SetupPath(ObjBean* this, PlayState* play) { void ObjBean_SetupPath(ObjBean* this, PlayState* play) {
Path* path = &play->setupPathList[(this->dyna.actor.params >> 8) & 0x1F]; Path* path = &play->pathList[(this->dyna.actor.params >> 8) & 0x1F];
Math_Vec3s_ToVec3f(&this->pathPoints, SEGMENTED_TO_VIRTUAL(path->points)); Math_Vec3s_ToVec3f(&this->pathPoints, SEGMENTED_TO_VIRTUAL(path->points));
} }
@ -250,7 +250,7 @@ void ObjBean_FollowPath(ObjBean* this, PlayState* play) {
f32 mag; f32 mag;
Math_StepToF(&this->dyna.actor.speedXZ, sBeanSpeeds[this->unk_1F6].velocity, sBeanSpeeds[this->unk_1F6].accel); Math_StepToF(&this->dyna.actor.speedXZ, sBeanSpeeds[this->unk_1F6].velocity, sBeanSpeeds[this->unk_1F6].accel);
path = &play->setupPathList[(this->dyna.actor.params >> 8) & 0x1F]; path = &play->pathList[(this->dyna.actor.params >> 8) & 0x1F];
nextPathPoint = &((Vec3s*)SEGMENTED_TO_VIRTUAL(path->points))[this->nextPointIndex]; nextPathPoint = &((Vec3s*)SEGMENTED_TO_VIRTUAL(path->points))[this->nextPointIndex];
Math_Vec3s_ToVec3f(&pathPointsFloat, nextPathPoint); Math_Vec3s_ToVec3f(&pathPointsFloat, nextPathPoint);
@ -480,7 +480,7 @@ void ObjBean_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->dyna.actor); Actor_Kill(&this->dyna.actor);
return; return;
} }
if (play->setupPathList[path].count < 3) { if (play->pathList[path].count < 3) {
osSyncPrintf(VT_COL(RED, WHITE)); osSyncPrintf(VT_COL(RED, WHITE));
// "Incorrect number of path data" // "Incorrect number of path data"
osSyncPrintf("パスデータ数が不正(%s %d)(arg_data %xH)\n", "../z_obj_bean.c", 921, osSyncPrintf("パスデータ数が不正(%s %d)(arg_data %xH)\n", "../z_obj_bean.c", 921,

View file

@ -493,130 +493,255 @@ static u16 D_8085361C[] = {
}; };
static GetItemEntry sGetItemTable[] = { static GetItemEntry sGetItemTable[] = {
// GI_BOMBS_5
GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), GET_ITEM(ITEM_BOMBS_5, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT),
// GI_NUTS_5
GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT),
// GI_BOMBCHUS_10
GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_BOMBCHU, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT),
// GI_BOW
GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BOW, OBJECT_GI_BOW, GID_BOW, 0x31, 0x80, CHEST_ANIM_LONG),
// GI_SLINGSHOT
GET_ITEM(ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_SLINGSHOT, OBJECT_GI_PACHINKO, GID_SLINGSHOT, 0x30, 0x80, CHEST_ANIM_LONG),
// GI_BOOMERANG
GET_ITEM(ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BOOMERANG, OBJECT_GI_BOOMERANG, GID_BOOMERANG, 0x35, 0x80, CHEST_ANIM_LONG),
// GI_STICKS_1
GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), GET_ITEM(ITEM_STICK, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT),
// GI_HOOKSHOT
GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_HOOKSHOT, OBJECT_GI_HOOKSHOT, GID_HOOKSHOT, 0x36, 0x80, CHEST_ANIM_LONG),
// GI_LONGSHOT
GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_HOOKSHOT, GID_LONGSHOT, 0x4F, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_LONGSHOT, OBJECT_GI_HOOKSHOT, GID_LONGSHOT, 0x4F, 0x80, CHEST_ANIM_LONG),
// GI_LENS
GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x39, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_LENS, OBJECT_GI_GLASSES, GID_LENS, 0x39, 0x80, CHEST_ANIM_LONG),
// GI_LETTER_ZELDA
GET_ITEM(ITEM_LETTER_ZELDA, OBJECT_GI_LETTER, GID_LETTER_ZELDA, 0x69, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_LETTER_ZELDA, OBJECT_GI_LETTER, GID_LETTER_ZELDA, 0x69, 0x80, CHEST_ANIM_LONG),
// GI_OCARINA_OOT
GET_ITEM(ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_OCARINA_TIME, OBJECT_GI_OCARINA, GID_OCARINA_TIME, 0x3A, 0x80, CHEST_ANIM_LONG),
// GI_HAMMER
GET_ITEM(ITEM_HAMMER, OBJECT_GI_HAMMER, GID_HAMMER, 0x38, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_HAMMER, OBJECT_GI_HAMMER, GID_HAMMER, 0x38, 0x80, CHEST_ANIM_LONG),
// GI_COJIRO
GET_ITEM(ITEM_COJIRO, OBJECT_GI_NIWATORI, GID_COJIRO, 0x02, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_COJIRO, OBJECT_GI_NIWATORI, GID_COJIRO, 0x02, 0x80, CHEST_ANIM_LONG),
// GI_BOTTLE
GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BOTTLE, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x42, 0x80, CHEST_ANIM_LONG),
// GI_POTION_RED
GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_POTION_RED, OBJECT_GI_LIQUID, GID_POTION_RED, 0x43, 0x80, CHEST_ANIM_LONG),
// GI_POTION_GREEN
GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_POTION_GREEN, OBJECT_GI_LIQUID, GID_POTION_GREEN, 0x44, 0x80, CHEST_ANIM_LONG),
// GI_POTION_BLUE
GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_POTION_BLUE, OBJECT_GI_LIQUID, GID_POTION_BLUE, 0x45, 0x80, CHEST_ANIM_LONG),
// GI_FAIRY
GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_FAIRY, OBJECT_GI_BOTTLE, GID_BOTTLE, 0x46, 0x80, CHEST_ANIM_LONG),
// GI_MILK_BOTTLE
GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MILK_BOTTLE, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG),
// GI_LETTER_RUTO
GET_ITEM(ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_LETTER_RUTO, OBJECT_GI_BOTTLE_LETTER, GID_LETTER_RUTO, 0x99, 0x80, CHEST_ANIM_LONG),
// GI_BEAN
GET_ITEM(ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_BEAN, OBJECT_GI_BEAN, GID_BEAN, 0x48, 0x80, CHEST_ANIM_SHORT),
// GI_MASK_SKULL
GET_ITEM(ITEM_MASK_SKULL, OBJECT_GI_SKJ_MASK, GID_MASK_SKULL, 0x10, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MASK_SKULL, OBJECT_GI_SKJ_MASK, GID_MASK_SKULL, 0x10, 0x80, CHEST_ANIM_LONG),
// GI_MASK_SPOOKY
GET_ITEM(ITEM_MASK_SPOOKY, OBJECT_GI_REDEAD_MASK, GID_MASK_SPOOKY, 0x11, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MASK_SPOOKY, OBJECT_GI_REDEAD_MASK, GID_MASK_SPOOKY, 0x11, 0x80, CHEST_ANIM_LONG),
// GI_CHICKEN
GET_ITEM(ITEM_CHICKEN, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_CHICKEN, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG),
// GI_MASK_KEATON
GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x12, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MASK_KEATON, OBJECT_GI_KI_TAN_MASK, GID_MASK_KEATON, 0x12, 0x80, CHEST_ANIM_LONG),
// GI_MASK_BUNNY
GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x13, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MASK_BUNNY, OBJECT_GI_RABIT_MASK, GID_MASK_BUNNY, 0x13, 0x80, CHEST_ANIM_LONG),
// GI_MASK_TRUTH
GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x17, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MASK_TRUTH, OBJECT_GI_TRUTH_MASK, GID_MASK_TRUTH, 0x17, 0x80, CHEST_ANIM_LONG),
// GI_POCKET_EGG
GET_ITEM(ITEM_POCKET_EGG, OBJECT_GI_EGG, GID_EGG, 0x01, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_POCKET_EGG, OBJECT_GI_EGG, GID_EGG, 0x01, 0x80, CHEST_ANIM_LONG),
// GI_POCKET_CUCCO
GET_ITEM(ITEM_POCKET_CUCCO, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_POCKET_CUCCO, OBJECT_GI_NIWATORI, GID_CHICKEN, 0x48, 0x80, CHEST_ANIM_LONG),
// GI_ODD_MUSHROOM
GET_ITEM(ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_ODD_MUSHROOM, OBJECT_GI_MUSHROOM, GID_ODD_MUSHROOM, 0x03, 0x80, CHEST_ANIM_LONG),
// GI_ODD_POTION
GET_ITEM(ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_ODD_POTION, OBJECT_GI_POWDER, GID_ODD_POTION, 0x04, 0x80, CHEST_ANIM_LONG),
// GI_SAW
GET_ITEM(ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_SAW, OBJECT_GI_SAW, GID_SAW, 0x05, 0x80, CHEST_ANIM_LONG),
// GI_SWORD_BROKEN
GET_ITEM(ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_SWORD_BROKEN, OBJECT_GI_BROKENSWORD, GID_SWORD_BROKEN, 0x08, 0x80, CHEST_ANIM_LONG),
// GI_PRESCRIPTION
GET_ITEM(ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_PRESCRIPTION, OBJECT_GI_PRESCRIPTION, GID_PRESCRIPTION, 0x09, 0x80, CHEST_ANIM_LONG),
// GI_FROG
GET_ITEM(ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_FROG, OBJECT_GI_FROG, GID_FROG, 0x0D, 0x80, CHEST_ANIM_LONG),
// GI_EYEDROPS
GET_ITEM(ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_EYEDROPS, OBJECT_GI_EYE_LOTION, GID_EYEDROPS, 0x0E, 0x80, CHEST_ANIM_LONG),
// GI_CLAIM_CHECK
GET_ITEM(ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_CLAIM_CHECK, OBJECT_GI_TICKETSTONE, GID_CLAIM_CHECK, 0x0A, 0x80, CHEST_ANIM_LONG),
// GI_SWORD_KOKIRI
GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_SWORD_KOKIRI, OBJECT_GI_SWORD_1, GID_SWORD_KOKIRI, 0xA4, 0x80, CHEST_ANIM_LONG),
// GI_SWORD_KNIFE
GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x4B, 0x80, CHEST_ANIM_LONG),
// GI_SHIELD_DEKU
GET_ITEM(ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT), GET_ITEM(ITEM_SHIELD_DEKU, OBJECT_GI_SHIELD_1, GID_SHIELD_DEKU, 0x4C, 0xA0, CHEST_ANIM_SHORT),
// GI_SHIELD_HYLIAN
GET_ITEM(ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT), GET_ITEM(ITEM_SHIELD_HYLIAN, OBJECT_GI_SHIELD_2, GID_SHIELD_HYLIAN, 0x4D, 0xA0, CHEST_ANIM_SHORT),
// GI_SHIELD_MIRROR
GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_SHIELD_MIRROR, OBJECT_GI_SHIELD_3, GID_SHIELD_MIRROR, 0x4E, 0x80, CHEST_ANIM_LONG),
// GI_TUNIC_GORON
GET_ITEM(ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG), GET_ITEM(ITEM_TUNIC_GORON, OBJECT_GI_CLOTHES, GID_TUNIC_GORON, 0x50, 0xA0, CHEST_ANIM_LONG),
// GI_TUNIC_ZORA
GET_ITEM(ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG), GET_ITEM(ITEM_TUNIC_ZORA, OBJECT_GI_CLOTHES, GID_TUNIC_ZORA, 0x51, 0xA0, CHEST_ANIM_LONG),
// GI_BOOTS_IRON
GET_ITEM(ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BOOTS_IRON, OBJECT_GI_BOOTS_2, GID_BOOTS_IRON, 0x53, 0x80, CHEST_ANIM_LONG),
// GI_BOOTS_HOVER
GET_ITEM(ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BOOTS_HOVER, OBJECT_GI_HOVERBOOTS, GID_BOOTS_HOVER, 0x54, 0x80, CHEST_ANIM_LONG),
// GI_QUIVER_40
GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_QUIVER_40, OBJECT_GI_ARROWCASE, GID_QUIVER_40, 0x56, 0x80, CHEST_ANIM_LONG),
// GI_QUIVER_50
GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_QUIVER_50, OBJECT_GI_ARROWCASE, GID_QUIVER_50, 0x57, 0x80, CHEST_ANIM_LONG),
// GI_BOMB_BAG_20
GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BOMB_BAG_20, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_20, 0x58, 0x80, CHEST_ANIM_LONG),
// GI_BOMB_BAG_30
GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BOMB_BAG_30, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_30, 0x59, 0x80, CHEST_ANIM_LONG),
// GI_BOMB_BAG_40
GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BOMB_BAG_40, OBJECT_GI_BOMBPOUCH, GID_BOMB_BAG_40, 0x5A, 0x80, CHEST_ANIM_LONG),
// GI_GAUNTLETS_SILVER
GET_ITEM(ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_GAUNTLETS_SILVER, OBJECT_GI_GLOVES, GID_GAUNTLETS_SILVER, 0x5B, 0x80, CHEST_ANIM_LONG),
// GI_GAUNTLETS_GOLD
GET_ITEM(ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_GAUNTLETS_GOLD, OBJECT_GI_GLOVES, GID_GAUNTLETS_GOLD, 0x5C, 0x80, CHEST_ANIM_LONG),
// GI_SCALE_SILVER
GET_ITEM(ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_SCALE_SILVER, OBJECT_GI_SCALE, GID_SCALE_SILVER, 0xCD, 0x80, CHEST_ANIM_LONG),
// GI_SCALE_GOLD
GET_ITEM(ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_SCALE_GOLDEN, OBJECT_GI_SCALE, GID_SCALE_GOLDEN, 0xCE, 0x80, CHEST_ANIM_LONG),
// GI_STONE_OF_AGONY
GET_ITEM(ITEM_STONE_OF_AGONY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x68, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_STONE_OF_AGONY, OBJECT_GI_MAP, GID_STONE_OF_AGONY, 0x68, 0x80, CHEST_ANIM_LONG),
// GI_GERUDO_CARD
GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_GERUDO_CARD, OBJECT_GI_GERUDO, GID_GERUDO_CARD, 0x7B, 0x80, CHEST_ANIM_LONG),
// GI_OCARINA_FAIRY
GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x3A, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_OCARINA_FAIRY, OBJECT_GI_OCARINA_0, GID_OCARINA_FAIRY, 0x3A, 0x80, CHEST_ANIM_LONG),
// GI_SEEDS_5
GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT), GET_ITEM(ITEM_SEEDS, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT),
// GI_HEART_CONTAINER
GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG),
// GI_HEART_PIECE
GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xC2, 0x80, CHEST_ANIM_LONG),
// GI_KEY_BOSS
GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_KEY_BOSS, OBJECT_GI_BOSSKEY, GID_KEY_BOSS, 0xC7, 0x80, CHEST_ANIM_LONG),
// GI_COMPASS
GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_COMPASS, OBJECT_GI_COMPASS, GID_COMPASS, 0x67, 0x80, CHEST_ANIM_LONG),
// GI_MAP
GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_DUNGEON_MAP, OBJECT_GI_MAP, GID_DUNGEON_MAP, 0x66, 0x80, CHEST_ANIM_LONG),
// GI_KEY_SMALL
GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x60, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0x60, 0x80, CHEST_ANIM_SHORT),
// GI_MAGIC_SMALL
GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0x52, 0x6F, CHEST_ANIM_SHORT), GET_ITEM(ITEM_MAGIC_SMALL, OBJECT_GI_MAGICPOT, GID_MAGIC_SMALL, 0x52, 0x6F, CHEST_ANIM_SHORT),
// GI_MAGIC_LARGE
GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0x52, 0x6E, CHEST_ANIM_SHORT), GET_ITEM(ITEM_MAGIC_LARGE, OBJECT_GI_MAGICPOT, GID_MAGIC_LARGE, 0x52, 0x6E, CHEST_ANIM_SHORT),
// GI_WALLET_ADULT
GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_WALLET_ADULT, OBJECT_GI_PURSE, GID_WALLET_ADULT, 0x5E, 0x80, CHEST_ANIM_LONG),
// GI_WALLET_GIANT
GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_WALLET_GIANT, OBJECT_GI_PURSE, GID_WALLET_GIANT, 0x5F, 0x80, CHEST_ANIM_LONG),
// GI_WEIRD_EGG
GET_ITEM(ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_WEIRD_EGG, OBJECT_GI_EGG, GID_EGG, 0x9A, 0x80, CHEST_ANIM_LONG),
// GI_RECOVERY_HEART
GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0x55, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_RECOVERY_HEART, OBJECT_GI_HEART, GID_RECOVERY_HEART, 0x55, 0x80, CHEST_ANIM_LONG),
// GI_ARROWS_SMALL
GET_ITEM(ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT), GET_ITEM(ITEM_ARROWS_SMALL, OBJECT_GI_ARROW, GID_ARROWS_SMALL, 0xE6, 0x48, CHEST_ANIM_SHORT),
// GI_ARROWS_MEDIUM
GET_ITEM(ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT), GET_ITEM(ITEM_ARROWS_MEDIUM, OBJECT_GI_ARROW, GID_ARROWS_MEDIUM, 0xE6, 0x49, CHEST_ANIM_SHORT),
// GI_ARROWS_LARGE
GET_ITEM(ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT), GET_ITEM(ITEM_ARROWS_LARGE, OBJECT_GI_ARROW, GID_ARROWS_LARGE, 0xE6, 0x4A, CHEST_ANIM_SHORT),
// GI_RUPEE_GREEN
GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT), GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0x6F, 0x00, CHEST_ANIM_SHORT),
// GI_RUPEE_BLUE
GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT), GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xCC, 0x01, CHEST_ANIM_SHORT),
// GI_RUPEE_RED
GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT), GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF0, 0x02, CHEST_ANIM_SHORT),
// GI_HEART_CONTAINER_2
GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_HEART_CONTAINER, OBJECT_GI_HEARTS, GID_HEART_CONTAINER, 0xC6, 0x80, CHEST_ANIM_LONG),
// GI_MILK
GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MILK, OBJECT_GI_MILK, GID_MILK, 0x98, 0x80, CHEST_ANIM_LONG),
// GI_MASK_GORON
GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MASK_GORON, OBJECT_GI_GOLONMASK, GID_MASK_GORON, 0x14, 0x80, CHEST_ANIM_LONG),
// GI_MASK_ZORA
GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MASK_ZORA, OBJECT_GI_ZORAMASK, GID_MASK_ZORA, 0x15, 0x80, CHEST_ANIM_LONG),
// GI_MASK_GERUDO
GET_ITEM(ITEM_MASK_GERUDO, OBJECT_GI_GERUDOMASK, GID_MASK_GERUDO, 0x16, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_MASK_GERUDO, OBJECT_GI_GERUDOMASK, GID_MASK_GERUDO, 0x16, 0x80, CHEST_ANIM_LONG),
// GI_BRACELET
GET_ITEM(ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BRACELET, OBJECT_GI_BRACELET, GID_BRACELET, 0x79, 0x80, CHEST_ANIM_LONG),
// GI_RUPEE_PURPLE
GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT), GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF1, 0x14, CHEST_ANIM_SHORT),
// GI_RUPEE_GOLD
GET_ITEM(ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT), GET_ITEM(ITEM_RUPEE_GOLD, OBJECT_GI_RUPY, GID_RUPEE_GOLD, 0xF2, 0x13, CHEST_ANIM_SHORT),
// GI_SWORD_BGS
GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_SWORD_BGS, OBJECT_GI_LONGSWORD, GID_SWORD_BGS, 0x0C, 0x80, CHEST_ANIM_LONG),
// GI_ARROW_FIRE
GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_ARROW_FIRE, OBJECT_GI_M_ARROW, GID_ARROW_FIRE, 0x70, 0x80, CHEST_ANIM_LONG),
// GI_ARROW_ICE
GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_ARROW_ICE, OBJECT_GI_M_ARROW, GID_ARROW_ICE, 0x71, 0x80, CHEST_ANIM_LONG),
// GI_ARROW_LIGHT
GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_ARROW_LIGHT, OBJECT_GI_M_ARROW, GID_ARROW_LIGHT, 0x72, 0x80, CHEST_ANIM_LONG),
// GI_SKULL_TOKEN
GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_SKULL_TOKEN, OBJECT_GI_SUTARU, GID_SKULL_TOKEN, 0xB4, 0x80, CHEST_ANIM_SHORT),
// GI_DINS_FIRE
GET_ITEM(ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_DINS_FIRE, OBJECT_GI_GODDESS, GID_DINS_FIRE, 0xAD, 0x80, CHEST_ANIM_LONG),
// GI_FARORES_WIND
GET_ITEM(ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_FARORES_WIND, OBJECT_GI_GODDESS, GID_FARORES_WIND, 0xAE, 0x80, CHEST_ANIM_LONG),
// GI_NAYRUS_LOVE
GET_ITEM(ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_NAYRUS_LOVE, OBJECT_GI_GODDESS, GID_NAYRUS_LOVE, 0xAF, 0x80, CHEST_ANIM_LONG),
// GI_BULLET_BAG_30
GET_ITEM(ITEM_BULLET_BAG_30, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BULLET_BAG_30, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG),
// GI_BULLET_BAG_40
GET_ITEM(ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BULLET_BAG_40, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG, 0x07, 0x80, CHEST_ANIM_LONG),
// GI_STICKS_5
GET_ITEM(ITEM_STICKS_5, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), GET_ITEM(ITEM_STICKS_5, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT),
// GI_STICKS_10
GET_ITEM(ITEM_STICKS_10, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT), GET_ITEM(ITEM_STICKS_10, OBJECT_GI_STICK, GID_STICK, 0x37, 0x0D, CHEST_ANIM_SHORT),
// GI_NUTS_5_2
GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), GET_ITEM(ITEM_NUTS_5, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT),
// GI_NUTS_10
GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT), GET_ITEM(ITEM_NUTS_10, OBJECT_GI_NUTS, GID_NUTS, 0x34, 0x0C, CHEST_ANIM_SHORT),
// GI_BOMBS_1
GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), GET_ITEM(ITEM_BOMB, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT),
// GI_BOMBS_10
GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), GET_ITEM(ITEM_BOMBS_10, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT),
// GI_BOMBS_20
GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), GET_ITEM(ITEM_BOMBS_20, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT),
// GI_BOMBS_30
GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT), GET_ITEM(ITEM_BOMBS_30, OBJECT_GI_BOMB_1, GID_BOMB, 0x32, 0x59, CHEST_ANIM_SHORT),
// GI_SEEDS_30
GET_ITEM(ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT), GET_ITEM(ITEM_SEEDS_30, OBJECT_GI_SEED, GID_SEEDS, 0xDC, 0x50, CHEST_ANIM_SHORT),
// GI_BOMBCHUS_5
GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_BOMBCHUS_5, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT),
// GI_BOMBCHUS_20
GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_BOMBCHUS_20, OBJECT_GI_BOMB_2, GID_BOMBCHU, 0x33, 0x80, CHEST_ANIM_SHORT),
// GI_FISH
GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_FISH, OBJECT_GI_FISH, GID_FISH, 0x47, 0x80, CHEST_ANIM_LONG),
// GI_BUGS
GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BUG, OBJECT_GI_INSECT, GID_BUG, 0x7A, 0x80, CHEST_ANIM_LONG),
// GI_BLUE_FIRE
GET_ITEM(ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BLUE_FIRE, OBJECT_GI_FIRE, GID_BLUE_FIRE, 0x5D, 0x80, CHEST_ANIM_LONG),
// GI_POE
GET_ITEM(ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_POE, OBJECT_GI_GHOST, GID_POE, 0x97, 0x80, CHEST_ANIM_LONG),
// GI_BIG_POE
GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BIG_POE, OBJECT_GI_GHOST, GID_BIG_POE, 0xF9, 0x80, CHEST_ANIM_LONG),
// GI_DOOR_KEY
GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_KEY_SMALL, OBJECT_GI_KEY, GID_KEY_SMALL, 0xF3, 0x80, CHEST_ANIM_SHORT),
// GI_RUPEE_GREEN_LOSE
GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT), GET_ITEM(ITEM_RUPEE_GREEN, OBJECT_GI_RUPY, GID_RUPEE_GREEN, 0xF4, 0x00, CHEST_ANIM_SHORT),
// GI_RUPEE_BLUE_LOSE
GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT), GET_ITEM(ITEM_RUPEE_BLUE, OBJECT_GI_RUPY, GID_RUPEE_BLUE, 0xF5, 0x01, CHEST_ANIM_SHORT),
// GI_RUPEE_RED_LOSE
GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT), GET_ITEM(ITEM_RUPEE_RED, OBJECT_GI_RUPY, GID_RUPEE_RED, 0xF6, 0x02, CHEST_ANIM_SHORT),
// GI_RUPEE_PURPLE_LOSE
GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT), GET_ITEM(ITEM_RUPEE_PURPLE, OBJECT_GI_RUPY, GID_RUPEE_PURPLE, 0xF7, 0x14, CHEST_ANIM_SHORT),
// GI_HEART_PIECE_WIN
GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_HEART_PIECE_2, OBJECT_GI_HEARTS, GID_HEART_PIECE, 0xFA, 0x80, CHEST_ANIM_LONG),
// GI_STICK_UPGRADE_20
GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_STICK_UPGRADE_20, OBJECT_GI_STICK, GID_STICK, 0x90, 0x80, CHEST_ANIM_SHORT),
// GI_STICK_UPGRADE_30
GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_STICK_UPGRADE_30, OBJECT_GI_STICK, GID_STICK, 0x91, 0x80, CHEST_ANIM_SHORT),
// GI_NUT_UPGRADE_30
GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_NUT_UPGRADE_30, OBJECT_GI_NUTS, GID_NUTS, 0xA7, 0x80, CHEST_ANIM_SHORT),
// GI_NUT_UPGRADE_40
GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT), GET_ITEM(ITEM_NUT_UPGRADE_40, OBJECT_GI_NUTS, GID_NUTS, 0xA8, 0x80, CHEST_ANIM_SHORT),
// GI_BULLET_BAG_50
GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG), GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG),
// GI_ICE_TRAP
GET_ITEM_NONE, GET_ITEM_NONE,
// GI_TEXT_0
GET_ITEM_NONE, GET_ITEM_NONE,
}; };
@ -1026,94 +1151,208 @@ static u8 D_80853E7C[] = {
// Used to map item IDs to item actions // Used to map item IDs to item actions
static s8 sItemActions[] = { static s8 sItemActions[] = {
PLAYER_IA_STICK, PLAYER_IA_STICK, // ITEM_STICK
PLAYER_IA_NUT, PLAYER_IA_NUT, // ITEM_NUT
PLAYER_IA_BOMB, PLAYER_IA_BOMB, // ITEM_BOMB
PLAYER_IA_BOW, PLAYER_IA_BOW, // ITEM_BOW
PLAYER_IA_BOW_FIRE, PLAYER_IA_BOW_FIRE, // ITEM_ARROW_FIRE
PLAYER_IA_DINS_FIRE, PLAYER_IA_DINS_FIRE, // ITEM_DINS_FIRE
PLAYER_IA_SLINGSHOT, PLAYER_IA_SLINGSHOT, // ITEM_SLINGSHOT
PLAYER_IA_OCARINA_FAIRY, PLAYER_IA_OCARINA_FAIRY, // ITEM_OCARINA_FAIRY
PLAYER_IA_OCARINA_TIME, PLAYER_IA_OCARINA_TIME, // ITEM_OCARINA_TIME
PLAYER_IA_BOMBCHU, PLAYER_IA_BOMBCHU, // ITEM_BOMBCHU
PLAYER_IA_HOOKSHOT, PLAYER_IA_HOOKSHOT, // ITEM_HOOKSHOT
PLAYER_IA_LONGSHOT, PLAYER_IA_LONGSHOT, // ITEM_LONGSHOT
PLAYER_IA_BOW_ICE, PLAYER_IA_BOW_ICE, // ITEM_ARROW_ICE
PLAYER_IA_FARORES_WIND, PLAYER_IA_FARORES_WIND, // ITEM_FARORES_WIND
PLAYER_IA_BOOMERANG, PLAYER_IA_BOOMERANG, // ITEM_BOOMERANG
PLAYER_IA_LENS, PLAYER_IA_LENS, // ITEM_LENS
PLAYER_IA_BEAN, PLAYER_IA_BEAN, // ITEM_BEAN
PLAYER_IA_HAMMER, PLAYER_IA_HAMMER, // ITEM_HAMMER
PLAYER_IA_BOW_LIGHT, PLAYER_IA_BOW_LIGHT, // ITEM_ARROW_LIGHT
PLAYER_IA_NAYRUS_LOVE, PLAYER_IA_NAYRUS_LOVE, // ITEM_NAYRUS_LOVE
PLAYER_IA_BOTTLE, PLAYER_IA_BOTTLE, // ITEM_BOTTLE
PLAYER_IA_BOTTLE_POTION_RED, PLAYER_IA_BOTTLE_POTION_RED, // ITEM_POTION_RED
PLAYER_IA_BOTTLE_POTION_GREEN, PLAYER_IA_BOTTLE_POTION_GREEN, // ITEM_POTION_GREEN
PLAYER_IA_BOTTLE_POTION_BLUE, PLAYER_IA_BOTTLE_POTION_BLUE, // ITEM_POTION_BLUE
PLAYER_IA_BOTTLE_FAIRY, PLAYER_IA_BOTTLE_FAIRY, // ITEM_FAIRY
PLAYER_IA_BOTTLE_FISH, PLAYER_IA_BOTTLE_FISH, // ITEM_FISH
PLAYER_IA_BOTTLE_MILK, PLAYER_IA_BOTTLE_MILK, // ITEM_MILK_BOTTLE
PLAYER_IA_BOTTLE_LETTER, PLAYER_IA_BOTTLE_LETTER, // ITEM_LETTER_RUTO
PLAYER_IA_BOTTLE_FIRE, PLAYER_IA_BOTTLE_FIRE, // ITEM_BLUE_FIRE
PLAYER_IA_BOTTLE_BUG, PLAYER_IA_BOTTLE_BUG, // ITEM_BUG
PLAYER_IA_BOTTLE_BIG_POE, PLAYER_IA_BOTTLE_BIG_POE, // ITEM_BIG_POE
PLAYER_IA_BOTTLE_MILK_HALF, PLAYER_IA_BOTTLE_MILK_HALF, // ITEM_MILK_HALF
PLAYER_IA_BOTTLE_POE, PLAYER_IA_BOTTLE_POE, // ITEM_POE
PLAYER_IA_WEIRD_EGG, PLAYER_IA_WEIRD_EGG, // ITEM_WEIRD_EGG
PLAYER_IA_CHICKEN, PLAYER_IA_CHICKEN, // ITEM_CHICKEN
PLAYER_IA_LETTER_ZELDA, PLAYER_IA_LETTER_ZELDA, // ITEM_LETTER_ZELDA
PLAYER_IA_MASK_KEATON, PLAYER_IA_MASK_KEATON, // ITEM_MASK_KEATON
PLAYER_IA_MASK_SKULL, PLAYER_IA_MASK_SKULL, // ITEM_MASK_SKULL
PLAYER_IA_MASK_SPOOKY, PLAYER_IA_MASK_SPOOKY, // ITEM_MASK_SPOOKY
PLAYER_IA_MASK_BUNNY, PLAYER_IA_MASK_BUNNY, // ITEM_MASK_BUNNY
PLAYER_IA_MASK_GORON, PLAYER_IA_MASK_GORON, // ITEM_MASK_GORON
PLAYER_IA_MASK_ZORA, PLAYER_IA_MASK_ZORA, // ITEM_MASK_ZORA
PLAYER_IA_MASK_GERUDO, PLAYER_IA_MASK_GERUDO, // ITEM_MASK_GERUDO
PLAYER_IA_MASK_TRUTH, PLAYER_IA_MASK_TRUTH, // ITEM_MASK_TRUTH
PLAYER_IA_SWORD_MASTER, PLAYER_IA_SWORD_MASTER, // ITEM_SOLD_OUT
PLAYER_IA_POCKET_EGG, PLAYER_IA_POCKET_EGG, // ITEM_POCKET_EGG
PLAYER_IA_POCKET_CUCCO, PLAYER_IA_POCKET_CUCCO, // ITEM_POCKET_CUCCO
PLAYER_IA_COJIRO, PLAYER_IA_COJIRO, // ITEM_COJIRO
PLAYER_IA_ODD_MUSHROOM, PLAYER_IA_ODD_MUSHROOM, // ITEM_ODD_MUSHROOM
PLAYER_IA_ODD_POTION, PLAYER_IA_ODD_POTION, // ITEM_ODD_POTION
PLAYER_IA_SAW, PLAYER_IA_SAW, // ITEM_SAW
PLAYER_IA_SWORD_BROKEN, PLAYER_IA_SWORD_BROKEN, // ITEM_SWORD_BROKEN
PLAYER_IA_PRESCRIPTION, PLAYER_IA_PRESCRIPTION, // ITEM_PRESCRIPTION
PLAYER_IA_FROG, PLAYER_IA_FROG, // ITEM_FROG
PLAYER_IA_EYEDROPS, PLAYER_IA_EYEDROPS, // ITEM_EYEDROPS
PLAYER_IA_CLAIM_CHECK, PLAYER_IA_CLAIM_CHECK, // ITEM_CLAIM_CHECK
PLAYER_IA_BOW_FIRE, PLAYER_IA_BOW_FIRE, // ITEM_BOW_ARROW_FIRE
PLAYER_IA_BOW_ICE, PLAYER_IA_BOW_ICE, // ITEM_BOW_ARROW_ICE
PLAYER_IA_BOW_LIGHT, PLAYER_IA_BOW_LIGHT, // ITEM_BOW_ARROW_LIGHT
PLAYER_IA_SWORD_KOKIRI, PLAYER_IA_SWORD_KOKIRI, // ITEM_SWORD_KOKIRI
PLAYER_IA_SWORD_MASTER, PLAYER_IA_SWORD_MASTER, // ITEM_SWORD_MASTER
PLAYER_IA_SWORD_BGS, PLAYER_IA_SWORD_BGS, // ITEM_SWORD_BGS
}; };
static s32 (*D_80853EDC[])(Player* this, PlayState* play) = { static s32 (*D_80853EDC[])(Player* this, PlayState* play) = {
func_8083485C, func_8083485C, func_8083485C, func_808349DC, func_808349DC, func_808349DC, func_8083485C, func_8083485C, // PLAYER_IA_NONE
func_8083485C, func_8083501C, func_8083501C, func_8083501C, func_8083501C, func_8083501C, func_8083501C, func_8083485C, // PLAYER_IA_LAST_USED
func_8083501C, func_8083501C, func_8083501C, func_8083501C, func_808356E8, func_808356E8, func_80835800, func_8083485C, // PLAYER_IA_FISHING_POLE
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_808349DC, // PLAYER_IA_SWORD_MASTER
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_808349DC, // PLAYER_IA_SWORD_KOKIRI
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_808349DC, // PLAYER_IA_SWORD_BGS
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, // PLAYER_IA_STICK
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, // PLAYER_IA_HAMMER
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083501C, // PLAYER_IA_BOW
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083501C, // PLAYER_IA_BOW_FIRE
func_8083501C, // PLAYER_IA_BOW_ICE
func_8083501C, // PLAYER_IA_BOW_LIGHT
func_8083501C, // PLAYER_IA_BOW_0C
func_8083501C, // PLAYER_IA_BOW_0D
func_8083501C, // PLAYER_IA_BOW_0E
func_8083501C, // PLAYER_IA_SLINGSHOT
func_8083501C, // PLAYER_IA_HOOKSHOT
func_8083501C, // PLAYER_IA_LONGSHOT
func_808356E8, // PLAYER_IA_BOMB
func_808356E8, // PLAYER_IA_BOMBCHU
func_80835800, // PLAYER_IA_BOOMERANG
func_8083485C, // PLAYER_IA_MAGIC_SPELL_15
func_8083485C, // PLAYER_IA_MAGIC_SPELL_16
func_8083485C, // PLAYER_IA_MAGIC_SPELL_17
func_8083485C, // PLAYER_IA_FARORES_WIND
func_8083485C, // PLAYER_IA_NAYRUS_LOVE
func_8083485C, // PLAYER_IA_DINS_FIRE
func_8083485C, // PLAYER_IA_NUT
func_8083485C, // PLAYER_IA_OCARINA_FAIRY
func_8083485C, // PLAYER_IA_OCARINA_TIME
func_8083485C, // PLAYER_IA_BOTTLE
func_8083485C, // PLAYER_IA_BOTTLE_FISH
func_8083485C, // PLAYER_IA_BOTTLE_FIRE
func_8083485C, // PLAYER_IA_BOTTLE_BUG
func_8083485C, // PLAYER_IA_BOTTLE_POE
func_8083485C, // PLAYER_IA_BOTTLE_BIG_POE
func_8083485C, // PLAYER_IA_BOTTLE_LETTER
func_8083485C, // PLAYER_IA_BOTTLE_POTION_RED
func_8083485C, // PLAYER_IA_BOTTLE_POTION_BLUE
func_8083485C, // PLAYER_IA_BOTTLE_POTION_GREEN
func_8083485C, // PLAYER_IA_BOTTLE_MILK
func_8083485C, // PLAYER_IA_BOTTLE_MILK_HALF
func_8083485C, // PLAYER_IA_BOTTLE_FAIRY
func_8083485C, // PLAYER_IA_LETTER_ZELDA
func_8083485C, // PLAYER_IA_WEIRD_EGG
func_8083485C, // PLAYER_IA_CHICKEN
func_8083485C, // PLAYER_IA_BEAN
func_8083485C, // PLAYER_IA_POCKET_EGG
func_8083485C, // PLAYER_IA_POCKET_CUCCO
func_8083485C, // PLAYER_IA_COJIRO
func_8083485C, // PLAYER_IA_ODD_MUSHROOM
func_8083485C, // PLAYER_IA_ODD_POTION
func_8083485C, // PLAYER_IA_SAW
func_8083485C, // PLAYER_IA_SWORD_BROKEN
func_8083485C, // PLAYER_IA_PRESCRIPTION
func_8083485C, // PLAYER_IA_FROG
func_8083485C, // PLAYER_IA_EYEDROPS
func_8083485C, // PLAYER_IA_CLAIM_CHECK
func_8083485C, // PLAYER_IA_MASK_KEATON
func_8083485C, // PLAYER_IA_MASK_SKULL
func_8083485C, // PLAYER_IA_MASK_SPOOKY
func_8083485C, // PLAYER_IA_MASK_BUNNY
func_8083485C, // PLAYER_IA_MASK_GORON
func_8083485C, // PLAYER_IA_MASK_ZORA
func_8083485C, // PLAYER_IA_MASK_GERUDO
func_8083485C, // PLAYER_IA_MASK_TRUTH
func_8083485C, // PLAYER_IA_LENS
}; };
static void (*D_80853FE8[])(PlayState* play, Player* this) = { static void (*D_80853FE8[])(PlayState* play, Player* this) = {
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_8083377C, func_80833770, // PLAYER_IA_NONE
func_80833790, func_8083379C, func_8083379C, func_8083379C, func_8083379C, func_8083379C, func_8083379C, func_80833770, // PLAYER_IA_LAST_USED
func_8083379C, func_8083379C, func_80833910, func_80833910, func_808337D4, func_808337D4, func_80833984, func_80833770, // PLAYER_IA_FISHING_POLE
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, // PLAYER_IA_SWORD_MASTER
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, // PLAYER_IA_SWORD_KOKIRI
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, // PLAYER_IA_SWORD_BGS
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_8083377C, // PLAYER_IA_STICK
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833790, // PLAYER_IA_HAMMER
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_8083379C, // PLAYER_IA_BOW
func_80833770, func_80833770, func_80833770, func_80833770, func_8083379C, // PLAYER_IA_BOW_FIRE
func_8083379C, // PLAYER_IA_BOW_ICE
func_8083379C, // PLAYER_IA_BOW_LIGHT
func_8083379C, // PLAYER_IA_BOW_0C
func_8083379C, // PLAYER_IA_BOW_0D
func_8083379C, // PLAYER_IA_BOW_0E
func_8083379C, // PLAYER_IA_SLINGSHOT
func_80833910, // PLAYER_IA_HOOKSHOT
func_80833910, // PLAYER_IA_LONGSHOT
func_808337D4, // PLAYER_IA_BOMB
func_808337D4, // PLAYER_IA_BOMBCHU
func_80833984, // PLAYER_IA_BOOMERANG
func_80833770, // PLAYER_IA_MAGIC_SPELL_15
func_80833770, // PLAYER_IA_MAGIC_SPELL_16
func_80833770, // PLAYER_IA_MAGIC_SPELL_17
func_80833770, // PLAYER_IA_FARORES_WIND
func_80833770, // PLAYER_IA_NAYRUS_LOVE
func_80833770, // PLAYER_IA_DINS_FIRE
func_80833770, // PLAYER_IA_NUT
func_80833770, // PLAYER_IA_OCARINA_FAIRY
func_80833770, // PLAYER_IA_OCARINA_TIME
func_80833770, // PLAYER_IA_BOTTLE
func_80833770, // PLAYER_IA_BOTTLE_FISH
func_80833770, // PLAYER_IA_BOTTLE_FIRE
func_80833770, // PLAYER_IA_BOTTLE_BUG
func_80833770, // PLAYER_IA_BOTTLE_POE
func_80833770, // PLAYER_IA_BOTTLE_BIG_POE
func_80833770, // PLAYER_IA_BOTTLE_LETTER
func_80833770, // PLAYER_IA_BOTTLE_POTION_RED
func_80833770, // PLAYER_IA_BOTTLE_POTION_BLUE
func_80833770, // PLAYER_IA_BOTTLE_POTION_GREEN
func_80833770, // PLAYER_IA_BOTTLE_MILK
func_80833770, // PLAYER_IA_BOTTLE_MILK_HALF
func_80833770, // PLAYER_IA_BOTTLE_FAIRY
func_80833770, // PLAYER_IA_LETTER_ZELDA
func_80833770, // PLAYER_IA_WEIRD_EGG
func_80833770, // PLAYER_IA_CHICKEN
func_80833770, // PLAYER_IA_BEAN
func_80833770, // PLAYER_IA_POCKET_EGG
func_80833770, // PLAYER_IA_POCKET_CUCCO
func_80833770, // PLAYER_IA_COJIRO
func_80833770, // PLAYER_IA_ODD_MUSHROOM
func_80833770, // PLAYER_IA_ODD_POTION
func_80833770, // PLAYER_IA_SAW
func_80833770, // PLAYER_IA_SWORD_BROKEN
func_80833770, // PLAYER_IA_PRESCRIPTION
func_80833770, // PLAYER_IA_FROG
func_80833770, // PLAYER_IA_EYEDROPS
func_80833770, // PLAYER_IA_CLAIM_CHECK
func_80833770, // PLAYER_IA_MASK_KEATON
func_80833770, // PLAYER_IA_MASK_SKULL
func_80833770, // PLAYER_IA_MASK_SPOOKY
func_80833770, // PLAYER_IA_MASK_BUNNY
func_80833770, // PLAYER_IA_MASK_GORON
func_80833770, // PLAYER_IA_MASK_ZORA
func_80833770, // PLAYER_IA_MASK_GERUDO
func_80833770, // PLAYER_IA_MASK_TRUTH
func_80833770, // PLAYER_IA_LENS
}; };
typedef enum { typedef enum {
@ -2998,14 +3237,14 @@ void func_80836448(PlayState* play, Player* this, LinkAnimationHeader* anim) {
func_80832698(this, NA_SE_VO_LI_DOWN); func_80832698(this, NA_SE_VO_LI_DOWN);
if (this->actor.category == ACTORCAT_PLAYER) { if (this->actor.category == ACTORCAT_PLAYER) {
func_800F47BC(); Audio_SetBgmVolumeOffDuringFanfare();
if (Inventory_ConsumeFairy(play)) { if (Inventory_ConsumeFairy(play)) {
play->gameOverCtx.state = GAMEOVER_REVIVE_START; play->gameOverCtx.state = GAMEOVER_REVIVE_START;
this->unk_84F = 1; this->unk_84F = 1;
} else { } else {
play->gameOverCtx.state = GAMEOVER_DEATH_START; play->gameOverCtx.state = GAMEOVER_DEATH_START;
func_800F6AB0(0); Audio_StopBgmAndFanfare(0);
Audio_PlayFanfare(NA_BGM_GAME_OVER); Audio_PlayFanfare(NA_BGM_GAME_OVER);
gSaveContext.seqId = (u8)NA_BGM_DISABLED; gSaveContext.seqId = (u8)NA_BGM_DISABLED;
gSaveContext.natureAmbienceId = NATURE_ID_DISABLED; gSaveContext.natureAmbienceId = NATURE_ID_DISABLED;
@ -4118,7 +4357,7 @@ s32 func_80838FB8(PlayState* play, Player* this) {
* The start of each group is indexed by `sReturnEntranceGroupIndices` values. * The start of each group is indexed by `sReturnEntranceGroupIndices` values.
* The resulting groups are then indexed by the spawn value. * The resulting groups are then indexed by the spawn value.
* *
* The spawn value (`PlayState.curSpawn`) is set to a different value depending on the entrance used to enter the * The spawn value (`PlayState.spawn`) is set to a different value depending on the entrance used to enter the
* scene, which allows these dynamic "return entrances" to link back to the previous scene. * scene, which allows these dynamic "return entrances" to link back to the previous scene.
* *
* Note: grottos and normal fairy fountains use `ENTR_RETURN_GROTTO` * Note: grottos and normal fairy fountains use `ENTR_RETURN_GROTTO`
@ -4189,7 +4428,7 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId)
Play_TriggerVoidOut(play); Play_TriggerVoidOut(play);
Scene_SetTransitionForNextEntrance(play); Scene_SetTransitionForNextEntrance(play);
} else { } else {
play->nextEntranceIndex = play->setupExitList[exitIndex - 1]; play->nextEntranceIndex = play->exitList[exitIndex - 1];
if (play->nextEntranceIndex == ENTR_RETURN_GROTTO) { if (play->nextEntranceIndex == ENTR_RETURN_GROTTO) {
gSaveContext.respawnFlag = 2; gSaveContext.respawnFlag = 2;
@ -4200,7 +4439,7 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId)
play->nextEntranceIndex = play->nextEntranceIndex =
sReturnEntranceGroupData[sReturnEntranceGroupIndices[play->nextEntranceIndex - sReturnEntranceGroupData[sReturnEntranceGroupIndices[play->nextEntranceIndex -
ENTR_RETURN_YOUSEI_IZUMI_YOKO] + ENTR_RETURN_YOUSEI_IZUMI_YOKO] +
play->curSpawn]; play->spawn];
Scene_SetTransitionForNextEntrance(play); Scene_SetTransitionForNextEntrance(play);
} else { } else {
if (SurfaceType_GetFloorEffect(&play->colCtx, poly, bgId) == FLOOR_EFFECT_2) { if (SurfaceType_GetFloorEffect(&play->colCtx, poly, bgId) == FLOOR_EFFECT_2) {
@ -4928,11 +5167,35 @@ void func_8083B010(Player* this) {
} }
static u8 D_80854528[] = { static u8 D_80854528[] = {
GI_LETTER_ZELDA, GI_WEIRD_EGG, GI_CHICKEN, GI_BEAN, GI_POCKET_EGG, GI_POCKET_CUCCO, GI_LETTER_ZELDA, // EXCH_ITEM_LETTER_ZELDA
GI_COJIRO, GI_ODD_MUSHROOM, GI_ODD_POTION, GI_SAW, GI_SWORD_BROKEN, GI_PRESCRIPTION, GI_WEIRD_EGG, // EXCH_ITEM_WEIRD_EGG
GI_FROG, GI_EYEDROPS, GI_CLAIM_CHECK, GI_MASK_SKULL, GI_MASK_SPOOKY, GI_MASK_KEATON, GI_CHICKEN, // EXCH_ITEM_CHICKEN
GI_MASK_BUNNY, GI_MASK_TRUTH, GI_MASK_GORON, GI_MASK_ZORA, GI_MASK_GERUDO, GI_LETTER_RUTO, GI_BEAN, // EXCH_ITEM_BEAN
GI_LETTER_RUTO, GI_LETTER_RUTO, GI_LETTER_RUTO, GI_LETTER_RUTO, GI_LETTER_RUTO, GI_POCKET_EGG, // EXCH_ITEM_POCKET_EGG
GI_POCKET_CUCCO, // EXCH_ITEM_POCKET_CUCCO
GI_COJIRO, // EXCH_ITEM_COJIRO
GI_ODD_MUSHROOM, // EXCH_ITEM_ODD_MUSHROOM
GI_ODD_POTION, // EXCH_ITEM_ODD_POTION
GI_SAW, // EXCH_ITEM_SAW
GI_SWORD_BROKEN, // EXCH_ITEM_SWORD_BROKEN
GI_PRESCRIPTION, // EXCH_ITEM_PRESCRIPTION
GI_FROG, // EXCH_ITEM_FROG
GI_EYEDROPS, // EXCH_ITEM_EYEDROPS
GI_CLAIM_CHECK, // EXCH_ITEM_CLAIM_CHECK
GI_MASK_SKULL, // EXCH_ITEM_MASK_SKULL
GI_MASK_SPOOKY, // EXCH_ITEM_MASK_SPOOKY
GI_MASK_KEATON, // EXCH_ITEM_MASK_KEATON
GI_MASK_BUNNY, // EXCH_ITEM_MASK_BUNNY
GI_MASK_TRUTH, // EXCH_ITEM_MASK_TRUTH
GI_MASK_GORON, // EXCH_ITEM_MASK_GORON
GI_MASK_ZORA, // EXCH_ITEM_MASK_ZORA
GI_MASK_GERUDO, // EXCH_ITEM_MASK_GERUDO
GI_LETTER_RUTO, // EXCH_ITEM_FISH
GI_LETTER_RUTO, // EXCH_ITEM_BLUE_FIRE
GI_LETTER_RUTO, // EXCH_ITEM_BUG
GI_LETTER_RUTO, // EXCH_ITEM_POE
GI_LETTER_RUTO, // EXCH_ITEM_BIG_POE
GI_LETTER_RUTO, // EXCH_ITEM_LETTER_RUTO
}; };
static LinkAnimationHeader* D_80854548[] = { static LinkAnimationHeader* D_80854548[] = {
@ -8121,7 +8384,7 @@ void func_80843AE8(PlayState* play, Player* this) {
} }
this->unk_A87 = 20; this->unk_A87 = 20;
func_80837AFC(this, -20); func_80837AFC(this, -20);
func_800F47FC(); Audio_SetBgmVolumeOnDuringFanfare();
} }
} else if (this->unk_84F != 0) { } else if (this->unk_84F != 0) {
this->unk_850 = 60; this->unk_850 = 60;

View file

@ -210,32 +210,32 @@ def disas_elfmsgs(start):
if condition_type == 0: if condition_type == 0:
if elf_message_type == 0xE0 and b1 == 0 and not (b0 & 1): if elf_message_type == 0xE0 and b1 == 0 and not (b0 & 1):
print(f"ELF_MSG_END({ARG_1}),") print(f"QUEST_HINT_END({ARG_1}),")
else: else:
print(f"ELF_MSG_FLAG({ARG_0}, {ARG_1}, {ARG_2}, 0x{b1:02X}), /* eventChkInf[{(b1 >> 4) & 0xF}] & 0x{1 << (b1 & 0xF):X} */") print(f"QUEST_HINT_FLAG({ARG_0}, {ARG_1}, {ARG_2}, 0x{b1:02X}), /* eventChkInf[{(b1 >> 4) & 0xF}] & 0x{1 << (b1 & 0xF):X} */")
assert b3 == 0 assert b3 == 0
elif condition_type == 2: elif condition_type == 2:
print(f"ELF_MSG_DUNGEON_ITEM({ARG_0}, {ARG_1}, {ARG_2}, {item_ids[b1]}),") print(f"QUEST_HINT_DUNGEON_ITEM({ARG_0}, {ARG_1}, {ARG_2}, {item_ids[b1]}),")
assert b3 == 0 assert b3 == 0
elif condition_type == 4: elif condition_type == 4:
print(f"ELF_MSG_ITEM({ARG_0}, {ARG_1}, {ARG_2}, {item_ids[b1]}, {item_ids[b3]}),") print(f"QUEST_HINT_ITEM({ARG_0}, {ARG_1}, {ARG_2}, {item_ids[b1]}, {item_ids[b3]}),")
elif condition_type == 6: elif condition_type == 6:
condition_other_type = b1 & 0xF0 condition_other_type = b1 & 0xF0
if condition_other_type == 0: if condition_other_type == 0:
print(f"ELF_MSG_STRENGTH_UPG({ARG_0}, {ARG_1}, {ARG_2}, {b1 & 0xF}),") print(f"QUEST_HINT_STRENGTH_UPG({ARG_0}, {ARG_1}, {ARG_2}, {b1 & 0xF}),")
assert b3 == 0 assert b3 == 0
elif condition_other_type == 0x10: elif condition_other_type == 0x10:
print(f"ELF_MSG_BOOTS({ARG_0}, {ARG_1}, {ARG_2}, {item_ids[b3]}),") print(f"QUEST_HINT_BOOTS({ARG_0}, {ARG_1}, {ARG_2}, {item_ids[b3]}),")
assert (b1 & 0xF) == 0 assert (b1 & 0xF) == 0
elif condition_other_type == 0x20: elif condition_other_type == 0x20:
print(f"ELF_MSG_SONG({ARG_0}, {ARG_1}, {ARG_2}, {item_ids[b3]}),") print(f"QUEST_HINT_SONG({ARG_0}, {ARG_1}, {ARG_2}, {item_ids[b3]}),")
assert (b1 & 0xF) == 0 assert (b1 & 0xF) == 0
elif condition_other_type == 0x30: elif condition_other_type == 0x30:
print(f"ELF_MSG_MEDALLION({ARG_0}, {ARG_1}, {ARG_2}, {item_ids[b3]}),") print(f"QUEST_HINT_MEDALLION({ARG_0}, {ARG_1}, {ARG_2}, {item_ids[b3]}),")
assert (b1 & 0xF) == 0 assert (b1 & 0xF) == 0
elif condition_other_type == 0x40: elif condition_other_type == 0x40:
print(f"ELF_MSG_MAGIC({ARG_0}, {ARG_1}, {ARG_2}),") print(f"QUEST_HINT_MAGIC({ARG_0}, {ARG_1}, {ARG_2}),")
assert (b1 & 0xF) == 0 assert (b1 & 0xF) == 0
assert b3 == 0 assert b3 == 0
else: else: