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:
commit
932e5866e1
69 changed files with 5804 additions and 4593 deletions
2
Jenkinsfile
vendored
2
Jenkinsfile
vendored
|
@ -50,7 +50,7 @@ pipeline {
|
||||||
branch 'master'
|
branch 'master'
|
||||||
}
|
}
|
||||||
agent {
|
agent {
|
||||||
label 'master'
|
label 'zeldaret_website'
|
||||||
}
|
}
|
||||||
steps {
|
steps {
|
||||||
unstash 'reports'
|
unstash 'reports'
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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
|
|
150
include/z64quest_hint_commands.h
Normal file
150
include/z64quest_hint_commands.h
Normal 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
|
|
@ -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, \
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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));
|
||||||
}
|
}
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -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),
|
||||||
};
|
};
|
||||||
|
|
|
@ -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),
|
||||||
};
|
};
|
||||||
|
|
|
@ -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*)∠
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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*)∠
|
||||||
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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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));
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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("Error : レールデータ が不正(%s %d)\n", "../z_en_gr.c", 1043);
|
osSyncPrintf("Error : レールデータ が不正(%s %d)\n", "../z_en_gr.c", 1043);
|
||||||
Actor_Kill(&this->actor);
|
Actor_Kill(&this->actor);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue