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

Merge branch 'master' into doc_pause_menu

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

2
Jenkinsfile vendored
View file

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

View file

@ -452,7 +452,7 @@ void func_8002F974(Actor* actor, u16 sfxId);
void func_8002F994(Actor* actor, s32 arg1);
s32 func_8002F9EC(PlayState* play, Actor* actor, CollisionPoly* poly, s32 bgId, Vec3f* pos);
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);
s32 func_800314D4(PlayState* play, Actor* actor, Vec3f* arg2, f32 arg3);
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_UpdateAll(PlayState* play);
void SfxSource_PlaySfxAtFixedWorldPos(PlayState* play, Vec3f* worldPos, s32 duration, u16 sfxId);
u16 ElfMessage_GetSariaText(PlayState* play);
u16 ElfMessage_GetCUpText(PlayState* play);
u16 QuestHint_GetSariaTextId(PlayState* play);
u16 QuestHint_GetNaviTextId(PlayState* play);
u16 Text_GetFaceReaction(PlayState* play, u32 reactionSet);
void Flags_UnsetAllEnv(PlayState* play);
void Flags_SetEnv(PlayState* play, s16 flag);
@ -1679,7 +1679,7 @@ void DebugArena_Cleanup(void);
u8 DebugArena_IsInitialized(void);
void UCodeDisas_Init(UCodeDisas*);
void UCodeDisas_Destroy(UCodeDisas*);
// void UCodeDisas_Disassemble(UCodeDisas*, Gfx*);
void UCodeDisas_Disassemble(UCodeDisas*, Gfx*);
void UCodeDisas_RegisterUCode(UCodeDisas*, s32, UCodeInfo*);
void UCodeDisas_SetCurUCode(UCodeDisas*, void*);
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 Audio_PlaySfxRiver(Vec3f* pos, f32 freqScale);
void Audio_PlaySfxWaterfall(Vec3f* pos, f32 freqScale);
void func_800F47BC(void);
void func_800F47FC(void);
void func_800F483C(u8 targetVol, u8 volFadeTimer);
void Audio_SetBgmVolumeOffDuringFanfare(void);
void Audio_SetBgmVolumeOnDuringFanfare(void);
void Audio_SetMainBgmVolume(u8 targetVol, u8 volFadeTimer);
void Audio_SetGanonsTowerBgmVolumeLevel(u8 ganonsTowerLevel);
void Audio_LowerMainBgmVolume(u8 volume);
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_PlayMorningSceneSequence(u16 seqId);
void Audio_PlaySceneSequence(u16 seqId);
void func_800F574C(f32 scaleTempoAndFreq, u8 duration);
void func_800F5718(void);
void func_800F5918(void);
void func_800F595C(u16);
void func_800F59E8(u16);
s32 func_800F5A58(u8);
void Audio_SetMainBgmTempoFreqAfterFanfare(f32 scaleTempoAndFreq, u8 duration);
void Audio_PlayWindmillBgm(void);
void Audio_SetFastTempoForTimedMinigame(void);
void Audio_PlaySequenceInCutscene(u16 seqId);
void Audio_StopSequenceInCutscene(u16 seqId);
s32 Audio_IsSequencePlaying(u16 seqId);
void func_800F5ACC(u16 seqId);
void func_800F5B58(void);
void func_800F5BF0(u8 natureAmbienceId);
@ -1867,11 +1867,8 @@ void Audio_SetExtraFilter(u8);
void Audio_SetCutsceneFlag(s8 flag);
void Audio_PlaySfxIfNotInCutscene(u16 sfxId);
void func_800F6964(u16);
void func_800F6AB0(u16);
// ? Audio_DisableAllSeq(?);
// ? func_800F6BB8(?);
void Audio_StopBgmAndFanfare(u16 fadeOutDuration);
void Audio_PreNMI(void);
// ? func_800F6C34(?);
void Audio_SetNatureAmbienceChannelIO(u8 channelIdxRange, u8 ioPort, u8 ioData);
void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId);
void Audio_Init(void);
@ -1945,7 +1942,7 @@ s8 PadUtils_GetRelX(Input* input);
s8 PadUtils_GetRelY(Input* input);
void PadUtils_UpdateRelXY(Input* input);
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_FCeilF(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);
s32 osPfsFreeBlocks(OSPfs* pfs, s32* leftoverBytes);
void guScale(Mtx* m, f32 x, f32 y, f32 z);
f32 sinf(f32);
s16 sins(u16);
f32 sinf(f32 angle);
s16 sins(u16 angle);
OSTask* _VirtualToPhysicalTask(OSTask* intp);
void osSpTaskLoad(OSTask* intp);
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);
void guOrthoF(f32[4][4], f32, f32, f32, f32, f32, f32, f32);
void guOrtho(Mtx*, f32, f32, f32, f32, f32, f32, f32);
f32 cosf(f32);
s16 coss(u16);
f32 cosf(f32 angle);
s16 coss(u16 angle);
void osViSetEvent(OSMesgQueue* mq, OSMesg msg, u32 retraceCount);
s32 osPfsIsPlug(OSMesgQueue* mq, u8* pattern);
void __osPfsRequestData(u8 cmd);

View file

@ -59,15 +59,26 @@
#define R_FB_FILTER_ENV_COLOR(c) SREG(85 + (c))
#define R_ENABLE_FB_FILTER SREG(88)
#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_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_FAR_DIST_FAC OREG(18)
#define R_CAM_PITCH_FLOOR_CHECK_OFFSET_Y_FAC OREG(19)
#define R_CAM_PITCH_FLOOR_CHECK_NEAR_WEIGHT OREG(20)
#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_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_FAC OREG(42)
#define R_CAM_YOFFSET_NORM OREG(46)

File diff suppressed because it is too large Load diff

View file

@ -23,20 +23,12 @@ typedef float f32;
typedef double f64;
typedef 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 union {
MtxF_t mf;
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,
xy, yy, zy, wy,
xz, yz, zz, wz,

View file

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

View file

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

View file

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

View file

@ -38,9 +38,12 @@ typedef struct {
} TransitionActorEntry; // size = 0x10
typedef struct {
/* 0x00 */ u8 spawn;
/* 0x00 */ u8 playerEntryIndex;
/* 0x01 */ u8 room;
} EntranceEntry;
} Spawn;
// TODO: ZAPD Compatibility
typedef Spawn EntranceEntry;
typedef struct {
/* 0x00 */ u8 ambientColor[3];
@ -179,13 +182,13 @@ typedef struct {
/* 0x00 */ u8 code;
/* 0x01 */ u8 length;
/* 0x04 */ ActorEntry* data;
} SCmdSpawnList;
} SCmdPlayerEntryList;
typedef struct {
/* 0x00 */ u8 code;
/* 0x01 */ u8 length;
/* 0x04 */ ActorEntry* data;
} SCmdActorList;
} SCmdActorEntryList;
typedef struct {
/* 0x00 */ u8 code;
@ -218,12 +221,12 @@ typedef struct {
typedef struct {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
/* 0x04 */ EntranceEntry* data;
} SCmdEntranceList;
/* 0x04 */ Spawn* data;
} SCmdSpawnList;
typedef struct {
/* 0x00 */ u8 code;
/* 0x01 */ u8 cUpElfMsgNum;
/* 0x01 */ u8 naviQuestHintFileId;
/* 0x04 */ u32 keepObjectId;
} SCmdSpecialFiles;
@ -342,11 +345,11 @@ typedef struct {
typedef union {
SCmdBase base;
SCmdSpawnList spawnList;
SCmdActorList actorList;
SCmdPlayerEntryList playerEntryList;
SCmdActorEntryList actorEntryList;
SCmdUnused02 unused02;
SCmdRoomList roomList;
SCmdEntranceList entranceList;
SCmdSpawnList spawnList;
SCmdObjectList objectList;
SCmdLightList lightList;
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_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
typedef enum {
@ -522,8 +533,8 @@ typedef enum {
#define SCENE_CMD_ENTRANCE_LIST(entranceList) \
{ SCENE_CMD_ID_ENTRANCE_LIST, 0, CMD_PTR(entranceList) }
#define SCENE_CMD_SPECIAL_FILES(elfMessageFile, keepObjectId) \
{ SCENE_CMD_ID_SPECIAL_FILES, elfMessageFile, CMD_W(keepObjectId) }
#define SCENE_CMD_SPECIAL_FILES(naviQuestHintFileId, keepObjectId) \
{ SCENE_CMD_ID_SPECIAL_FILES, naviQuestHintFileId, CMD_W(keepObjectId) }
#define SCENE_CMD_ROOM_BEHAVIOR(curRoomUnk3, curRoomUnk2, showInvisActors, disableWarpSongs) \
{ SCENE_CMD_ID_ROOM_BEHAVIOR, curRoomUnk3, \

View file

@ -212,16 +212,62 @@ void* gItemIcons[] = {
// Used to map item IDs to inventory slots
u8 gItemSlots[] = {
SLOT_STICK, SLOT_NUT, SLOT_BOMB, SLOT_BOW, SLOT_ARROW_FIRE, SLOT_DINS_FIRE,
SLOT_SLINGSHOT, SLOT_OCARINA, SLOT_OCARINA, SLOT_BOMBCHU, SLOT_HOOKSHOT, SLOT_HOOKSHOT,
SLOT_ARROW_ICE, SLOT_FARORES_WIND, SLOT_BOOMERANG, SLOT_LENS, SLOT_BEAN, SLOT_HAMMER,
SLOT_ARROW_LIGHT, SLOT_NAYRUS_LOVE, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1,
SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1,
SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_BOTTLE_1, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD,
SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_CHILD, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT,
SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT, SLOT_TRADE_ADULT,
SLOT_TRADE_ADULT, SLOT_TRADE_ADULT,
SLOT_STICK, // ITEM_STICK
SLOT_NUT, // ITEM_NUT
SLOT_BOMB, // ITEM_BOMB
SLOT_BOW, // ITEM_BOW
SLOT_ARROW_FIRE, // ITEM_ARROW_FIRE
SLOT_DINS_FIRE, // ITEM_DINS_FIRE
SLOT_SLINGSHOT, // ITEM_SLINGSHOT
SLOT_OCARINA, // ITEM_OCARINA_FAIRY
SLOT_OCARINA, // ITEM_OCARINA_TIME
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) {

View file

@ -1241,8 +1241,8 @@ u8 sMalonSingingTimer;
u8 sAudioSpecPeakNumNotes[0x12];
u8 sMalonSingingDisabled;
u8 D_8016B9F3;
u8 D_8016B9F4;
u16 D_8016B9F6;
u8 sFanfareStartTimer;
u16 sFanfareSeqId;
OcarinaStaff sPlayingStaff;
OcarinaStaff sPlaybackStaff;
@ -3208,7 +3208,7 @@ void AudioDebug_ProcessInput_SndCont(void) {
if (CHECK_BTN_ANY(sDebugPadPress, BTN_CDOWN)) {
if (sAudioSndContSel == 0) {
if (1) {}
func_800F595C(sAudioSndContWork[sAudioSndContSel]);
Audio_PlaySequenceInCutscene(sAudioSndContWork[sAudioSndContSel]);
}
}
@ -3693,7 +3693,7 @@ void AudioDebug_ProcessInput(void) {
}
void Audio_UpdateRiverSoundVolumes(void);
void func_800F5CF8(void);
void Audio_UpdateFanfare(void);
/**
* This is Audio_Update for the graph thread
@ -3707,7 +3707,7 @@ void func_800F3054(void) {
Audio_StepFreqLerp(&sWaterfallFreqScaleLerp);
Audio_UpdateRiverSoundVolumes();
Audio_UpdateSceneSequenceResumePoint();
func_800F5CF8();
Audio_UpdateFanfare();
if (gAudioSpecId == 7) {
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_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_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);
}
@ -4593,7 +4593,7 @@ void Audio_PlaySceneSequence(u16 seqId) {
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
if ((sSeqResumePoint & 0x3F) != 0) {
fadeInDuration = 30;
@ -4622,7 +4622,7 @@ void Audio_PlaySceneSequence(u16 seqId) {
void Audio_UpdateSceneSequenceResumePoint(void) {
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) {
// Get the current point to resume from
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) {
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) {
// Should instead use `SEQCMD_SETUP_RESET_TEMPO` to wait until the fanfare is finished
SEQCMD_RESET_TEMPO(SEQ_PLAYER_BGM_MAIN, duration);
} else {
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);
}
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)) {
SEQCMD_SET_TEMPO(SEQ_PLAYER_BGM_MAIN, 5, 210);
}
}
void func_800F595C(u16 arg0) {
u8 arg0b = arg0 & 0xFF;
if (sSeqFlags[arg0b] & SEQ_FLAG_FANFARE) {
Audio_PlayFanfare(arg0);
} else if (sSeqFlags[arg0b] & SEQ_FLAG_FANFARE_GANON) {
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_FANFARE, 0, 0, arg0);
void Audio_PlaySequenceInCutscene(u16 seqId) {
if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE) {
Audio_PlayFanfare(seqId);
} else if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE_GANON) {
SEQCMD_PLAY_SEQUENCE(SEQ_PLAYER_FANFARE, 0, 0, seqId);
} 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);
}
}
void func_800F59E8(u16 arg0) {
u8 arg0b = arg0 & 0xFF;
if (sSeqFlags[arg0b] & SEQ_FLAG_FANFARE) {
void Audio_StopSequenceInCutscene(u16 seqId) {
if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE) {
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);
} else {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, 0);
}
}
s32 func_800F5A58(u8 arg0) {
u8 phi_a1 = 0;
s32 Audio_IsSequencePlaying(u16 seqId) {
u8 seqPlayerIndex = SEQ_PLAYER_BGM_MAIN;
if (sSeqFlags[arg0 & 0xFF] & SEQ_FLAG_FANFARE) {
phi_a1 = 1;
} else if (sSeqFlags[arg0 & 0xFF] & SEQ_FLAG_FANFARE_GANON) {
phi_a1 = 1;
if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE) {
seqPlayerIndex = SEQ_PLAYER_FANFARE;
} else if (sSeqFlags[seqId & 0xFF & 0xFF] & SEQ_FLAG_FANFARE_GANON) {
seqPlayerIndex = SEQ_PLAYER_FANFARE;
}
if (arg0 == (u8)Audio_GetActiveSeqId(phi_a1)) {
return 1;
if ((seqId & 0xFF) == (Audio_GetActiveSeqId(seqPlayerIndex) & 0xFF)) {
return true;
} else {
return 0;
return false;
}
}
@ -4757,31 +4757,35 @@ void func_800F5C2C(void) {
}
void Audio_PlayFanfare(u16 seqId) {
u16 sp26;
u32 sp20;
u8* sp1C;
u8* sp18;
u16 curSeqId;
u32 outNumFonts;
u8* curFontId;
u8* requestedFontId;
sp26 = Audio_GetActiveSeqId(SEQ_PLAYER_FANFARE);
sp1C = func_800E5E84(sp26 & 0xFF, &sp20);
sp18 = func_800E5E84(seqId & 0xFF, &sp20);
if ((sp26 == NA_BGM_DISABLED) || (*sp1C == *sp18)) {
D_8016B9F4 = 1;
curSeqId = Audio_GetActiveSeqId(SEQ_PLAYER_FANFARE);
curFontId = func_800E5E84(curSeqId & 0xFF, &outNumFonts);
requestedFontId = func_800E5E84(seqId & 0xFF, &outNumFonts);
if ((curSeqId == NA_BGM_DISABLED) || (*curFontId == *requestedFontId)) {
sFanfareStartTimer = 1;
} 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);
}
D_8016B9F6 = seqId;
sFanfareSeqId = seqId;
}
void func_800F5CF8(void) {
void Audio_UpdateFanfare(void) {
u16 seqIdFanfare;
u16 seqIdBgmMain;
u16 seqIdBgmSub;
if (D_8016B9F4 != 0) {
D_8016B9F4--;
if (D_8016B9F4 == 0) {
if (sFanfareStartTimer != 0) {
sFanfareStartTimer--;
if (sFanfareStartTimer == 0) {
Audio_QueueCmdS32(0xE3000000, SEQUENCE_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_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);
if (seqIdBgmSub != NA_BGM_LONLON) {
SEQCMD_SET_CHANNEL_DISABLE_MASK(SEQ_PLAYER_BGM_SUB, 0xFFFF);
@ -4833,7 +4837,7 @@ void Audio_SetSequenceMode(u8 seqMode) {
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)) {
if (seqMode != (sPrevSeqMode & 0x7F)) {
if (seqMode == SEQ_MODE_ENEMY) {
@ -5160,10 +5164,10 @@ void func_800F6964(u16 arg0) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_SUB, (arg0 * 3) / 2);
}
void func_800F6AB0(u16 arg0) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, arg0);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, arg0);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_SUB, arg0);
void Audio_StopBgmAndFanfare(u16 fadeOutDuration) {
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_BGM_MAIN, fadeOutDuration);
SEQCMD_STOP_SEQUENCE(SEQ_PLAYER_FANFARE, fadeOutDuration);
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_FANFARE, 0x7F, 0);
}
@ -5223,7 +5227,7 @@ void func_800F6C34(void) {
sPrevMainBgmSeqId = NA_BGM_DISABLED;
Audio_QueueCmdS8(0x46 << 24 | SEQ_PLAYER_BGM_MAIN << 16, -1);
sSariaBgmPtr = NULL;
D_8016B9F4 = 0;
sFanfareStartTimer = 0;
D_8016B9F3 = 1;
sMalonSingingDisabled = false;
}
@ -5297,7 +5301,7 @@ void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId) {
u8 ioData;
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,
sNatureAmbienceDataIO[natureAmbienceId].channelMask);

View file

@ -3,9 +3,13 @@
s32 gUseAtanContFrac;
f32 Math_FTanF(f32 x) {
f32 sin = sinf(x);
f32 cos = cosf(x);
/**
* @param angle radians
* @return tan(angle)
*/
f32 Math_FTanF(f32 angle) {
f32 sin = sinf(angle);
f32 cos = cosf(angle);
return sin / cos;
}
@ -42,7 +46,7 @@ f32 Math_FAtanTaylorQF(f32 x) {
const f32* c = coeffs;
f32 term;
while (1) {
while (true) {
term = *c++ * exp;
if (poly + term == poly) {
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) {
if (!gUseAtanContFrac) {
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) {
if (x == 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) {
return Math_FAtan2F(x, sqrtf(1.0f - SQ(x)));
}
/**
* @return arccos(x) in radians, in [0,pi] range
*/
f32 Math_FAcosF(f32 x) {
return M_PI / 2 - Math_FAsinF(x);
}

View file

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

View file

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

View file

@ -1,6 +1,6 @@
#include "global.h"
static u16 sATan2Tbl[] = {
static u16 sAtan2Tbl[] = {
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,
0x011D, 0x0127, 0x0131, 0x013C, 0x0146, 0x0150, 0x015A, 0x0164, 0x016F, 0x0179, 0x0183, 0x018D, 0x0197, 0x01A1,
@ -77,24 +77,34 @@ static u16 sATan2Tbl[] = {
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;
if (y == 0.0f) {
ret = sATan2Tbl[0];
if (x == 0.0f) {
ret = sAtan2Tbl[0];
} else {
s32 tblIdx = ((x / y) * 1024.0f) + 0.5f;
s32 tblIdx = ((y / x) * 1024.0f) + 0.5f;
if (tblIdx >= ARRAY_COUNT(sATan2Tbl)) {
ret = sATan2Tbl[0];
if (tblIdx >= ARRAY_COUNT(sAtan2Tbl)) {
ret = sAtan2Tbl[0];
} else {
ret = sATan2Tbl[tblIdx];
ret = sAtan2Tbl[tblIdx];
}
}
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) {
s32 ret;
@ -107,7 +117,7 @@ s16 Math_Atan2S(f32 x, f32 y) {
}
} else {
if (-x < y) {
ret = Math_GetAtan2Tbl(-x, y) + 0x4000;
ret = 0x4000 + Math_GetAtan2Tbl(-x, y);
} else {
ret = 0x8000 - Math_GetAtan2Tbl(y, -x);
}
@ -115,21 +125,27 @@ s16 Math_Atan2S(f32 x, f32 y) {
} else {
if (x < 0.0f) {
if (-y <= -x) {
ret = Math_GetAtan2Tbl(-y, -x) + 0x8000;
ret = 0x8000 + Math_GetAtan2Tbl(-y, -x);
} else {
ret = 0xC000 - Math_GetAtan2Tbl(-x, -y);
}
} else {
if (x < -y) {
ret = Math_GetAtan2Tbl(x, -y) + 0xC000;
ret = 0xC000 + Math_GetAtan2Tbl(x, -y);
} else {
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) {
return BINANG_TO_RAD(Math_Atan2S(x, y));
}

View file

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

View file

@ -1,5 +1,7 @@
#include "global.h"
typedef void (*UcodeDisasCallback)(UCodeDisas*, u32);
#define F3DZEX_CONST(name) \
{ name, #name }
#define F3DZEX_FLAG(set, unset) \
@ -17,8 +19,8 @@
if (this->enableLog) \
osSyncPrintf
void* UCodeDisas_TranslateAddr(UCodeDisas* this, u32 addr) {
u32 physical = this->segments[SEGMENT_NUMBER(addr)] + SEGMENT_OFFSET(addr);
void* UCodeDisas_TranslateAddr(UCodeDisas* this, uintptr_t addr) {
uintptr_t physical = this->segments[SEGMENT_NUMBER(addr)] + SEGMENT_OFFSET(addr);
return PHYSICAL_TO_VIRTUAL(physical);
}
@ -38,61 +40,82 @@ F3dzexFlag sUCodeDisasMtxFlags[] = {
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 = "?";
switch (value) {
case G_CCMUX_COMBINED:
ret = "COMBINED";
break;
case G_CCMUX_TEXEL0:
ret = "TEXEL0";
break;
case G_CCMUX_TEXEL1:
ret = "TEXEL1";
break;
case G_CCMUX_PRIMITIVE:
ret = "PRIMITIVE";
break;
case G_CCMUX_SHADE:
ret = "SHADE";
break;
case G_CCMUX_ENVIRONMENT:
ret = "ENVIRONMENT";
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;
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;
default:
if (idx == 3) {
if (arg == COMBINER_C) {
switch (value) {
case G_CCMUX_TEXEL0_ALPHA:
ret = "TEXEL0_ALPHA";
break;
case G_CCMUX_TEXEL1_ALPHA:
ret = "TEXEL1_ALPHA";
break;
case G_CCMUX_PRIMITIVE_ALPHA:
ret = "PRIMITIVE_ALPHA";
break;
case G_CCMUX_SHADE_ALPHA:
ret = "SHADE_ALPHA";
break;
case G_CCMUX_ENV_ALPHA:
ret = "ENV_ALPHA";
break;
case G_CCMUX_LOD_FRACTION:
ret = "LOD_FRACTION";
break;
case G_CCMUX_PRIM_LOD_FRAC:
ret = "PRIM_LOD_FRAC";
break;
case G_CCMUX_K5:
ret = "K5";
break;
default:
ret = "0";
break;
@ -104,30 +127,38 @@ const char* UCodeDisas_ParseCombineColor(u32 value, u32 idx) {
return ret;
}
const char* UCodeDisas_ParseCombineAlpha(u32 value, u32 idx) {
const char* UCodeDisas_GetCombineAlphaName(u32 value, u32 arg) {
const char* ret = "?";
switch (value) {
case 0:
ret = (idx == 3) ? "LOD_FRACTION" : "COMBINED";
case 0: // G_ACMUX_LOD_FRACTION, G_ACMUX_COMBINED
ret = (arg == COMBINER_C) ? "LOD_FRACTION" : "COMBINED";
break;
case G_ACMUX_TEXEL0:
ret = "TEXEL0";
break;
case G_ACMUX_TEXEL1:
ret = "TEXEL1";
break;
case G_ACMUX_PRIMITIVE:
ret = "PRIMITIVE";
break;
case G_ACMUX_SHADE:
ret = "SHADE";
break;
case G_ACMUX_ENVIRONMENT:
ret = "ENVIRONMENT";
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;
case G_ACMUX_0:
ret = "0";
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;
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[] = {
F3DZEX_RENDERMODE(AA_EN, 0x8),
F3DZEX_RENDERMODE(Z_CMP, 0x10),
@ -200,7 +231,7 @@ void UCodeDisas_ParseRenderMode(UCodeDisas* this, u32 mode) {
F3DZEX_RENDERMODE(ALPHA_CVG_SEL, 0x2000),
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_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" },
@ -224,18 +255,19 @@ void UCodeDisas_ParseRenderMode(UCodeDisas* this, u32 mode) {
// clang-format off
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
if (this->enableLog) {
osSyncPrintf("\nGBL_c2(%s, %s, %s, %s)", D_8012DDDC[0][b >> 12 & 3], D_8012DDDC[1][b >> 8 & 3],
D_8012DDDC[2][b >> 4 & 3], D_8012DDDC[3][b >> 0 & 3]);
osSyncPrintf("\nGBL_c2(%s, %s, %s, %s)", sBlenderInputNames[0][b >> 12 & 3], sBlenderInputNames[1][b >> 8 & 3],
sBlenderInputNames[2][b >> 4 & 3], sBlenderInputNames[3][b >> 0 & 3]);
}
}
void UCodeDisas_PrintVertices(UCodeDisas* this, Vtx* vtx, s32 count, s32 start) {
s32 i;
for (i = 0; i < count; i++) {
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],
@ -252,225 +284,32 @@ void UCodeDisas_PrintVertices(UCodeDisas* this, Vtx* vtx, s32 count, s32 start)
}
}
// Todo: clean this up
typedef struct {
s8 cmd;
u8 v0;
u8 v1;
u8 wd;
void UCodeDisas_Disassemble(UCodeDisas* this, Gfx* ptr) {
u32 pad;
} Gline3DFix;
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;
uintptr_t addr;
u32 rdpHalf;
u16 linkDlLow;
u8 sid;
u8 cmd;
s32 i0;
s32 i;
u32 exit;
GfxMod curGfx[1];
Gfx curGfx[1];
exit = false;
while (!exit) {
this->dlCnt++;
ptr = UCodeDisas_TranslateAddr(this, (u32)ptr);
ptr = UCodeDisas_TranslateAddr(this, (uintptr_t)ptr);
DISAS_LOG("%08x:", ptr);
*curGfx = *ptr;
cmd = curGfx->dma.cmd;
addr = (u32)UCodeDisas_TranslateAddr(this, curGfx->dma.addr);
cmd = curGfx->noop.cmd;
addr = (uintptr_t)UCodeDisas_TranslateAddr(this, (uintptr_t)curGfx->noop.value.addr);
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(" ");
}
@ -483,15 +322,15 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
Gdma dma = ptr->dma;
switch (dma.par) {
case 0: {
case G_DL_PUSH: {
DISAS_LOG("gsSPDisplayList(0x%08x),", dma.addr);
this->dlStack[this->dlDepth++] = (Gfx*)(ptr + 1);
ptr = (GfxMod*)addr - 1;
ptr = (Gfx*)addr - 1;
} break;
case 1: {
case G_DL_NOPUSH: {
DISAS_LOG("gsSPBranchList(0x%08x),", dma.addr);
ptr = (GfxMod*)addr - 1;
ptr = (Gfx*)addr - 1;
} break;
}
} break;
@ -513,7 +352,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break;
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);
} else {
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) {
exit = true;
} else {
ptr = (GfxMod*)this->dlStack[--this->dlDepth] - 1;
ptr = this->dlStack[--this->dlDepth] - 1;
}
} break;
@ -579,20 +418,28 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break;
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),",
UCodeDisas_ParseCombineColor(setcombine.a, 1), UCodeDisas_ParseCombineColor(setcombine.b, 2),
UCodeDisas_ParseCombineColor(setcombine.c, 3), UCodeDisas_ParseCombineColor(setcombine.d, 4),
UCodeDisas_GetCombineColorName(setcombine.a0, COMBINER_A),
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_ParseCombineAlpha(setcombine.x, 3), UCodeDisas_ParseCombineAlpha(setcombine.w, 4),
UCodeDisas_GetCombineAlphaName(setcombine.Aa0, COMBINER_A),
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_ParseCombineColor(setcombine.g, 3), UCodeDisas_ParseCombineColor(setcombine.h, 4),
UCodeDisas_GetCombineColorName(setcombine.a1, COMBINER_A),
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_ParseCombineAlpha(setcombine.t, 3), UCodeDisas_ParseCombineAlpha(setcombine.s, 4));
UCodeDisas_GetCombineAlphaName(setcombine.Aa1, COMBINER_A),
UCodeDisas_GetCombineAlphaName(setcombine.Ab1, COMBINER_B),
UCodeDisas_GetCombineAlphaName(setcombine.Ac1, COMBINER_C),
UCodeDisas_GetCombineAlphaName(setcombine.Ad1, COMBINER_D));
if (this->pipeSyncRequired) {
DISAS_LOG("### PipeSyncが必要です。\n");
@ -624,34 +471,33 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
-1),
};
u32 len = curGfx->setothermode.len + 1;
u32 sft = (-curGfx->setothermode.sft - len) + 32;
u32 s2 = curGfx->setothermode.data * 1;
u32 i1;
u32 i2;
u32 len = curGfx->setothermodeH.len + 1;
u32 sft = (-curGfx->setothermodeH.sft - len) + 32;
u32 s2 = curGfx->setothermodeH.data * 1;
u32 j;
u32 k;
for (i1 = 0; i1 < ARRAY_COUNTU(sUCodeDisasModeHMacros); i1++) {
if (sft == sUCodeDisasModeHMacros[i1].shift) {
for (i2 = 0; i2 < 4; i2++) {
if (s2 == sUCodeDisasModeHMacros[i1].values[i2].value) {
DISAS_LOG("gsDP%s(%s),", sUCodeDisasModeHMacros[i1].name,
sUCodeDisasModeHMacros[i1].values[i2].name);
goto block_1;
for (j = 0; j < ARRAY_COUNTU(sUCodeDisasModeHMacros); j++) {
if (sft == sUCodeDisasModeHMacros[j].shift) {
for (k = 0; k < ARRAY_COUNTU(sUCodeDisasModeHMacros[j].values); k++) {
if (s2 == sUCodeDisasModeHMacros[j].values[k].value) {
DISAS_LOG("gsDP%s(%s),", sUCodeDisasModeHMacros[j].name,
sUCodeDisasModeHMacros[j].values[k].name);
goto found_othermode_hi_macro;
}
}
}
}
DISAS_LOG("gsSPSetOtherModeH(%d, %d, 0x%08x),", sft, len, s2);
block_1:
this->modeH &= (((1 - (1 << len)) << sft) - 1);
found_othermode_hi_macro:
this->modeH &= ((1 - (1 << len)) << sft) - 1;
this->modeH |= s2;
if (this->pipeSyncRequired) {
DISAS_LOG("### PipeSyncが必要です。\n");
this->syncErr++;
}
} break;
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),
};
u32 len = curGfx->setothermode.len + 1;
u32 sft = (-curGfx->setothermode.sft - len) + 32;
u32 s2 = curGfx->setothermode.data * 1;
u32 i1;
u32 i2;
u32 len = curGfx->setothermodeL.len + 1;
u32 sft = (-curGfx->setothermodeL.sft - len) + 32;
u32 s2 = curGfx->setothermodeL.data * 1;
u32 j;
u32 k;
if (sft == G_MDSFT_RENDERMODE) {
DISAS_LOG("\ngsDPSetRenderBlender(");
UCodeDisas_ParseRenderMode(this, s2);
UCodeDisas_PrintRenderMode(this, s2);
DISAS_LOG("\n),");
} else {
for (i1 = 0; i1 * 1 < ARRAY_COUNTU(sUCodeDisasModeLMacros); i1++) {
if (sft == sUCodeDisasModeLMacros[i1].shift) {
for (i2 = 0; i2 < 4; i2++) {
if (s2 == sUCodeDisasModeLMacros[i1].values[i2].value) {
DISAS_LOG("gsDP%s(%s),", sUCodeDisasModeLMacros[i1].name,
sUCodeDisasModeLMacros[i1].values[i2].name);
goto block_2;
for (j = 0; j * 1 < ARRAY_COUNTU(sUCodeDisasModeLMacros); j++) {
if (sft == sUCodeDisasModeLMacros[j].shift) {
for (k = 0; k < ARRAY_COUNTU(sUCodeDisasModeLMacros[j].values); k++) {
if (s2 == sUCodeDisasModeLMacros[j].values[k].value) {
DISAS_LOG("gsDP%s(%s),", sUCodeDisasModeLMacros[j].name,
sUCodeDisasModeLMacros[j].values[k].name);
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);
}
block_2:
found_othermode_lo_macro:
this->modeL &= (((1 - (1 << len)) << sft) - 1);
this->modeL |= s2;
@ -758,7 +604,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break;
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) {
DISAS_LOG("### PipeSyncが必要です。\n");
@ -814,7 +660,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break;
case G_SETFILLCOLOR: {
DISAS_LOG("gsDPSetFillColor(0x%08x),", curGfx->words.w1);
DISAS_LOG("gsDPSetFillColor(0x%08x),", curGfx->setcolor.color);
if (this->pipeSyncRequired) {
DISAS_LOG("### PipeSyncが必要です。\n");
@ -823,7 +669,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break;
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) {
DISAS_LOG("### PipeSyncが必要です。\n");
@ -872,19 +718,19 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break;
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;
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;
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;
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);
} break;
@ -906,9 +752,9 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break;
case 6: {
/*! @bug arguments are not printed */
//! @bug arguments are not printed
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;
default: {
@ -924,27 +770,27 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
case UCODE_UNK: {
switch (cmd) {
case G_MTX: {
Gmatrix gmtx = ptr->matrix;
Gdma2 gmtx = ptr->dma2;
u32 params;
MtxF mtx;
s32 i1 = 0;
MtxF mtxF;
s32 j = 0;
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++) {
DISAS_LOG("|%s", (sUCodeDisasMtxFlags[i1].value & params)
? sUCodeDisasMtxFlags[i1].setName
: sUCodeDisasMtxFlags[i1].unsetName);
for (; j != ARRAY_COUNT(sUCodeDisasMtxFlags); j++) {
DISAS_LOG("|%s", (sUCodeDisasMtxFlags[j].value & params)
? sUCodeDisasMtxFlags[j].setName
: 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) {
MtxConv_L2F(&mtx, (Mtx*)addr);
MtxConv_L2F(&mtxF, (Mtx*)addr);
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
DISAS_LOG(
"/ %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[2][0], ((Mtx*)addr)->fracPart[2][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[1][1], ((Mtx*)addr)->fracPart[1][1],
((Mtx*)addr)->intPart[2][1], ((Mtx*)addr)->fracPart[2][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[1][2], ((Mtx*)addr)->fracPart[1][2],
((Mtx*)addr)->intPart[2][2], ((Mtx*)addr)->fracPart[2][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[1][3], ((Mtx*)addr)->fracPart[1][3],
((Mtx*)addr)->intPart[2][3], ((Mtx*)addr)->fracPart[2][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
}
} break;
@ -981,9 +827,9 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
numv >>= 12;
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->spvtxCnt++;
@ -1006,21 +852,21 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break;
case G_TRI1: {
Gtri1 gtri = ptr->tri1;
Gtrimod tri = gtri.tri;
Gtri gtri = ptr->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->pipeSyncRequired = true;
} break;
case G_LINE3D: {
if (curGfx->linefix.wd == 0) {
DISAS_LOG("gsSPLine3D(%d, %d),", curGfx->linefix.v0, curGfx->linefix.v1);
if (curGfx->line.wd == 0) {
DISAS_LOG("gsSPLine3D(%d, %d),", curGfx->line.v0, curGfx->line.v1);
} else {
DISAS_LOG("gsSPLineW3D(%d, %d, %d),", curGfx->linefix.v0, curGfx->linefix.v1,
curGfx->linefix.wd);
DISAS_LOG("gsSPLineW3D(%d, %d, %d),", curGfx->line.v0, curGfx->line.v1,
curGfx->line.wd);
}
this->lineCnt++;
@ -1032,13 +878,13 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
u32 v0, v1, v2;
u32 v3, v4, v5;
v0 = tri2.tri1.v0 / 2;
v1 = tri2.tri1.v1 / 2;
v2 = tri2.tri1.v2 / 2;
v0 = tri2.tri1.v[0] / 2;
v1 = tri2.tri1.v[1] / 2;
v2 = tri2.tri1.v[2] / 2;
v3 = tri2.tri2.v0 / 2;
v4 = tri2.tri2.v1 / 2;
v5 = tri2.tri2.v2 / 2;
v3 = tri2.tri2.v[0] / 2;
v4 = tri2.tri2.v[1] / 2;
v5 = tri2.tri2.v[2] / 2;
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;
case G_QUAD: {
Gquadmod quad = ptr->quad;
Gquad quad = ptr->quad;
u32 v0, v1, v2, v3;
v0 = quad.v0 / 2;
v1 = quad.v1 / 2;
v2 = quad.v2 / 2;
v3 = quad.v3 / 2;
v0 = quad.tri1.v[0] / 2;
v1 = quad.tri1.v[1] / 2;
v2 = quad.tri1.v[2] / 2;
v3 = quad.tri2.v[2] / 2;
DISAS_LOG("gsSP1Quadrangle(%d, %d, %d, %d, 0),", v0, v1, v2, v3);
@ -1062,19 +908,19 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
} break;
case G_CULLDL: {
DISAS_LOG("gsSPCullDisplayList(%d, %d),", (curGfx->cull.vstart) / 2,
(curGfx->cull.vend) / 2);
DISAS_LOG("gsSPCullDisplayList(%d, %d),", (curGfx->cull.vstart_x2) / 2,
(curGfx->cull.vend_x2) / 2);
} break;
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,
(curGfx->words.w0 & 0xFFF) / 2, curGfx->words.w1);
ptr = (GfxMod*)addr - 1;
ptr = (Gfx*)addr - 1;
} break;
case G_TEXTURE: {
Gtexturemod texture = ptr->texmod;
Gtexture texture = ptr->texture;
if (texture.lodscale == 0) {
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;
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),");
} else {
DISAS_LOG("gsSPPopMatrixN(G_MTX_MODELVIEW, %d),", popmtx.param);
DISAS_LOG("gsSPPopMatrixN(G_MTX_MODELVIEW, %d),", popmtx.param / 64);
}
} break;
@ -1102,21 +948,21 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
if (clearbits == 0) {
DISAS_LOG("gsSPLoadGeometryMode(");
UCodeDisas_ParseGeometryMode(this, setbits);
UCodeDisas_PrintGeometryMode(this, setbits);
DISAS_LOG("),");
} else if (setbits == 0) {
DISAS_LOG("gsSPClearGeometryMode(");
UCodeDisas_ParseGeometryMode(this, ~clearbits);
UCodeDisas_PrintGeometryMode(this, ~clearbits);
DISAS_LOG("),");
} else if (clearbits == 0xFFFFFF) {
DISAS_LOG("gsSPSetGeometryMode(");
UCodeDisas_ParseGeometryMode(this, setbits);
UCodeDisas_PrintGeometryMode(this, setbits);
DISAS_LOG("),");
} else {
DISAS_LOG("gsSPGeometryMode(");
UCodeDisas_ParseGeometryMode(this, ~clearbits);
UCodeDisas_PrintGeometryMode(this, ~clearbits);
DISAS_LOG(", ");
UCodeDisas_ParseGeometryMode(this, setbits);
UCodeDisas_PrintGeometryMode(this, setbits);
DISAS_LOG("),");
}
@ -1185,7 +1031,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
case G_MV_MATRIX: {
DISAS_LOG("gsSPForceMatrix(0x%08x),", movemem.data);
ptr += 1;
ptr += 2 - 1;
} break;
case G_MV_LIGHT: {
@ -1200,7 +1046,7 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
default: {
DISAS_LOG("gsSPLight(0x%08x,%d),", movemem.data,
(movemem.offset * 8 - 24) / 24);
(movemem.offset * 8 - 0x18) / 0x18);
} break;
}
} break;
@ -1299,8 +1145,9 @@ void UCodeDisas_Disassemble(UCodeDisas* this, GfxMod* ptr) {
case G_SELECT_DL: {
Gdma dma = ptr->dma;
u32 dlAddr = (u32)UCodeDisas_TranslateAddr(this, (dma.len << 16) | (linkDlLow));
u32 dmaAddr = dma.addr;
uintptr_t dlAddr =
(uintptr_t)UCodeDisas_TranslateAddr(this, (dma.len << 16) | (linkDlLow));
uintptr_t dmaAddr = dma.addr;
if (dma.par == 0) {
DISAS_LOG("gsSPSelectDL(0x%08x, %d, 0x%08x, 0x%08x),", dlAddr, sid, rdpHalf,

View file

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

View file

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

File diff suppressed because it is too large Load diff

View file

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

View file

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

View file

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

View file

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

View file

@ -403,7 +403,7 @@ void Play_Init(GameState* thisx) {
(s32)(zAllocAligned + zAllocSize) - (s32)(zAllocAligned - zAlloc));
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)) {
; // Empty Loop
@ -1408,14 +1408,17 @@ void Play_InitEnvironment(PlayState* this, s16 skyboxId) {
}
void Play_InitScene(PlayState* this, s32 spawn) {
this->curSpawn = spawn;
this->linkActorEntry = NULL;
this->spawn = spawn;
this->playerEntry = NULL;
this->unk_11DFC = NULL;
this->setupEntranceList = NULL;
this->setupExitList = NULL;
this->cUpElfMsgs = NULL;
this->setupPathList = NULL;
this->numSetupActors = 0;
this->spawnList = NULL;
this->exitList = NULL;
this->naviQuestHints = NULL;
this->pathList = NULL;
this->numActorEntries = 0;
Object_InitBank(this, &this->objectCtx);
LightContext_Init(this, &this->lightCtx);
TransitionActor_InitContext(&this->state, &this->transiActorCtx);

View file

@ -582,7 +582,7 @@ u32 func_80096FE8(PlayState* play, RoomContext* roomCtx) {
roomCtx->status = 0;
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);
return maxRoomSize;

View file

@ -1,7 +1,7 @@
#include "global.h"
#include "vt.h"
RomFile sNaviMsgFiles[];
RomFile sNaviQuestHintFiles[];
s32 Object_Spawn(ObjectContext* objectCtx, s16 objectId) {
u32 size;
@ -182,22 +182,22 @@ s32 Scene_ExecuteCommands(PlayState* play, SceneCmd* sceneCmd) {
return 0;
}
void Scene_CommandSpawnList(PlayState* play, SceneCmd* cmd) {
ActorEntry* linkEntry = play->linkActorEntry =
(ActorEntry*)SEGMENTED_TO_VIRTUAL(cmd->spawnList.data) + play->setupEntranceList[play->curSpawn].spawn;
void Scene_CommandPlayerEntryList(PlayState* play, SceneCmd* cmd) {
ActorEntry* playerEntry = play->playerEntry =
(ActorEntry*)SEGMENTED_TO_VIRTUAL(cmd->playerEntryList.data) + play->spawnList[play->spawn].playerEntryIndex;
s16 linkObjectId;
play->linkAgeOnLoad = ((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);
}
void Scene_CommandActorList(PlayState* play, SceneCmd* cmd) {
play->numSetupActors = cmd->actorList.length;
play->setupActorList = SEGMENTED_TO_VIRTUAL(cmd->actorList.data);
void Scene_CommandActorEntryList(PlayState* play, SceneCmd* cmd) {
play->numActorEntries = cmd->actorEntryList.length;
play->actorEntryList = SEGMENTED_TO_VIRTUAL(cmd->actorEntryList.data);
}
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);
}
void Scene_CommandEntranceList(PlayState* play, SceneCmd* cmd) {
play->setupEntranceList = SEGMENTED_TO_VIRTUAL(cmd->entranceList.data);
void Scene_CommandSpawnList(PlayState* play, SceneCmd* cmd) {
play->spawnList = SEGMENTED_TO_VIRTUAL(cmd->spawnList.data);
}
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);
}
if (cmd->specialFiles.cUpElfMsgNum != 0) {
play->cUpElfMsgs = Play_LoadFile(play, &sNaviMsgFiles[cmd->specialFiles.cUpElfMsgNum - 1]);
if (cmd->specialFiles.naviQuestHintFileId != NAVI_QUEST_HINTS_NONE) {
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) {
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.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) {
play->setupExitList = SEGMENTED_TO_VIRTUAL(cmd->exitList.data);
play->exitList = SEGMENTED_TO_VIRTUAL(cmd->exitList.data);
}
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*) = {
Scene_CommandSpawnList, // SCENE_CMD_ID_SPAWN_LIST
Scene_CommandActorList, // SCENE_CMD_ID_ACTOR_LIST
Scene_CommandUnused2, // SCENE_CMD_ID_UNUSED_2
Scene_CommandCollisionHeader, // SCENE_CMD_ID_COLLISION_HEADER
Scene_CommandRoomList, // SCENE_CMD_ID_ROOM_LIST
Scene_CommandWindSettings, // SCENE_CMD_ID_WIND_SETTINGS
Scene_CommandEntranceList, // SCENE_CMD_ID_ENTRANCE_LIST
Scene_CommandSpecialFiles, // SCENE_CMD_ID_SPECIAL_FILES
Scene_CommandRoomBehavior, // SCENE_CMD_ID_ROOM_BEHAVIOR
Scene_CommandUndefined9, // SCENE_CMD_ID_UNDEFINED_9
Scene_CommandRoomShape, // SCENE_CMD_ID_ROOM_SHAPE
Scene_CommandObjectList, // SCENE_CMD_ID_OBJECT_LIST
Scene_CommandLightList, // SCENE_CMD_ID_LIGHT_LIST
Scene_CommandPathList, // SCENE_CMD_ID_PATH_LIST
Scene_CommandTransitionActorList, // SCENE_CMD_ID_TRANSITION_ACTOR_LIST
Scene_CommandLightSettingsList, // SCENE_CMD_ID_LIGHT_SETTINGS_LIST
Scene_CommandTimeSettings, // SCENE_CMD_ID_TIME_SETTINGS
Scene_CommandSkyboxSettings, // SCENE_CMD_ID_SKYBOX_SETTINGS
Scene_CommandSkyboxDisables, // SCENE_CMD_ID_SKYBOX_DISABLES
Scene_CommandExitList, // SCENE_CMD_ID_EXIT_LIST
NULL, // SCENE_CMD_ID_END
Scene_CommandSoundSettings, // SCENE_CMD_ID_SOUND_SETTINGS
Scene_CommandEchoSettings, // SCENE_CMD_ID_ECHO_SETTINGS
Scene_CommandCutsceneData, // SCENE_CMD_ID_CUTSCENE_DATA
Scene_CommandAlternateHeaderList, // SCENE_CMD_ID_ALTERNATE_HEADER_LIST
Scene_CommandMiscSettings, // SCENE_CMD_ID_MISC_SETTINGS
Scene_CommandPlayerEntryList, // SCENE_CMD_ID_SPAWN_LIST
Scene_CommandActorEntryList, // SCENE_CMD_ID_ACTOR_LIST
Scene_CommandUnused2, // SCENE_CMD_ID_UNUSED_2
Scene_CommandCollisionHeader, // SCENE_CMD_ID_COLLISION_HEADER
Scene_CommandRoomList, // SCENE_CMD_ID_ROOM_LIST
Scene_CommandWindSettings, // SCENE_CMD_ID_WIND_SETTINGS
Scene_CommandSpawnList, // SCENE_CMD_ID_ENTRANCE_LIST
Scene_CommandSpecialFiles, // SCENE_CMD_ID_SPECIAL_FILES
Scene_CommandRoomBehavior, // SCENE_CMD_ID_ROOM_BEHAVIOR
Scene_CommandUndefined9, // SCENE_CMD_ID_UNDEFINED_9
Scene_CommandRoomShape, // SCENE_CMD_ID_ROOM_SHAPE
Scene_CommandObjectList, // SCENE_CMD_ID_OBJECT_LIST
Scene_CommandLightList, // SCENE_CMD_ID_LIGHT_LIST
Scene_CommandPathList, // SCENE_CMD_ID_PATH_LIST
Scene_CommandTransitionActorEntryList, // SCENE_CMD_ID_TRANSITION_ACTOR_LIST
Scene_CommandLightSettingsList, // SCENE_CMD_ID_LIGHT_SETTINGS_LIST
Scene_CommandTimeSettings, // SCENE_CMD_ID_TIME_SETTINGS
Scene_CommandSkyboxSettings, // SCENE_CMD_ID_SKYBOX_SETTINGS
Scene_CommandSkyboxDisables, // SCENE_CMD_ID_SKYBOX_DISABLES
Scene_CommandExitList, // SCENE_CMD_ID_EXIT_LIST
NULL, // SCENE_CMD_ID_END
Scene_CommandSoundSettings, // SCENE_CMD_ID_SOUND_SETTINGS
Scene_CommandEchoSettings, // SCENE_CMD_ID_ECHO_SETTINGS
Scene_CommandCutsceneData, // SCENE_CMD_ID_CUTSCENE_DATA
Scene_CommandAlternateHeaderList, // SCENE_CMD_ID_ALTERNATE_HEADER_LIST
Scene_CommandMiscSettings, // SCENE_CMD_ID_MISC_SETTINGS
};
RomFile sNaviMsgFiles[] = {
RomFile sNaviQuestHintFiles[] = {
ROM_FILE(elf_message_field),
ROM_FILE(elf_message_ydan),
ROM_FILE_UNSET,

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -70,7 +70,7 @@ void BgDyYoseizo_Init(Actor* thisx, PlayState* play2) {
PlayState* play = play2;
BgDyYoseizo* this = (BgDyYoseizo*)thisx;
this->fountainType = play->curSpawn;
this->fountainType = play->spawn;
if (this->fountainType < 0) {
this->fountainType = 0;
@ -82,12 +82,12 @@ void BgDyYoseizo_Init(Actor* thisx, PlayState* play2) {
if (play->sceneId == SCENE_DAIYOUSEI_IZUMI) {
// "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,
this->jointTable, this->morphTable, 28);
} else {
// "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,
this->jointTable, this->morphTable, 28);
}

View file

@ -143,7 +143,7 @@ void BgMizuMovebg_Init(Actor* thisx, PlayState* play) {
((BgMizuMovebg*)thisx)->scrollAlpha4 = 160;
waypointId = MOVEBG_POINT_ID(thisx->params);
((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;
break;
}
@ -323,7 +323,7 @@ void func_8089E650(BgMizuMovebg* this, PlayState* play) {
f32 dz;
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);
if (dist < this->dyna.actor.speedXZ) {
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;
if (fabsf(dx) < 2.0f && fabsf(dy) < 2.0f && fabsf(dz) < 2.0f) {
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;
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) {

View file

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

View file

@ -108,7 +108,7 @@ void func_808AC2BC(BgSpot01Objects2* this, PlayState* play) {
CollisionHeader_GetVirtual(&object_spot01_matoyab_col, &colHeader);
this->dyna.bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, thisx, colHeader);
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,
position.z, thisx->world.rot.x, thisx->world.rot.y, thisx->world.rot.z,
((((s32)thisx->params >> 8) & 0xFF) << 8) + 1);

View file

@ -618,7 +618,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) {
this->csCamEye.z = 300.0f;
this->csCamAt.x = 0.0f;
this->unk_704 = 1.2566371f;
this->unk_704 = 2 * M_PI / 5;
FALLTHROUGH;
case 3:
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.z = this->unk_2EC[0].z;
xOffset = (sinf(i * 1.2566371f) * 600.0f);
zOffset = (cosf(i * 1.2566371f) * 600.0f);
xOffset = (sinf(i * (2 * M_PI / 5)) * 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
Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_BOSS_GANON, this->unk_1FC.x + xOffset,

View file

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

View file

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

View file

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

View file

@ -359,7 +359,7 @@ void EnDaikuKakariko_Run(EnDaikuKakariko* this, PlayState* play) {
s32 run;
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];
xDist = pathPos->x - this->actor.world.pos.x;
zDist = pathPos->z - this->actor.world.pos.z;

View file

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

View file

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

View file

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

View file

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

View file

@ -137,7 +137,7 @@ void EnGoroiwa_SetSpeed(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;
Vec3f nextPosF;
@ -150,7 +150,7 @@ void EnGoroiwa_FaceNextWaypoint(EnGoroiwa* this, PlayState* play) {
void EnGoroiwa_GetPrevWaypointDiff(EnGoroiwa* this, PlayState* play, Vec3f* dest) {
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;
Vec3s* prevPointPos;
Vec3s* currentPointPos;
@ -215,14 +215,14 @@ void EnGoroiwa_ReverseDirection(EnGoroiwa* this) {
}
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->nextWaypoint = 1;
this->pathDirection = 1;
}
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;
this->actor.world.pos.x = pointPos->x;
@ -237,7 +237,7 @@ void EnGoroiwa_InitRotation(EnGoroiwa* this) {
s32 EnGoroiwa_GetAscendDirection(EnGoroiwa* this, PlayState* play) {
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* 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);
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;
result = true;
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) {
Path* path = &play->setupPathList[this->actor.params & 0xFF];
Path* path = &play->pathList[this->actor.params & 0xFF];
s32 pad;
Vec3s* nextPointPos = (Vec3s*)SEGMENTED_TO_VIRTUAL(path->points) + this->nextWaypoint;
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 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;
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 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;
f32 nextPointY;
f32 thisY;
@ -543,7 +543,7 @@ void EnGoroiwa_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->actor);
return;
}
if (play->setupPathList[pathIdx].count < 2) {
if (play->pathList[pathIdx].count < 2) {
// "Error: Invalid Path Data"
osSyncPrintf(" : レールデータ が不正(%s %d)\n", "../z_en_gr.c", 1043);
Actor_Kill(&this->actor);

View file

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

View file

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

View file

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

View file

@ -279,7 +279,7 @@ s32 EnKz_FollowPath(EnKz* this, PlayState* play) {
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 += this->waypoint;
@ -305,7 +305,7 @@ s32 EnKz_SetMovedPos(EnKz* this, PlayState* play) {
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 += path->count - 1;

View file

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

View file

@ -595,7 +595,7 @@ u8 EnMd_FollowPath(EnMd* this, PlayState* play) {
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 += this->waypoint;
@ -622,7 +622,7 @@ u8 EnMd_SetMovedPos(EnMd* this, PlayState* play) {
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 += path->count - 1;

View file

@ -331,7 +331,7 @@ s32 func_80AADEF0(EnMm* this, PlayState* play) {
s32 phi_a2;
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;
zDiff = waypointPos.z - this->actor.world.pos.z;
@ -349,7 +349,7 @@ s32 func_80AADEF0(EnMm* this, PlayState* play) {
phi_a2 = 0;
break;
case 1:
phi_a2 = EnMm_GetPointCount(play->setupPathList, this->path) - 1;
phi_a2 = EnMm_GetPointCount(play->pathList, this->path) - 1;
break;
case 2:
phi_a2 = this->unk_1F0;
@ -363,7 +363,7 @@ s32 func_80AADEF0(EnMm* this, PlayState* play) {
phi_v1 = 0;
break;
case 1:
phi_v1 = EnMm_GetPointCount(play->setupPathList, this->path) - 1;
phi_v1 = EnMm_GetPointCount(play->pathList, this->path) - 1;
break;
case 2:
phi_v1 = this->unk_1F0;
@ -376,7 +376,7 @@ s32 func_80AADEF0(EnMm* this, PlayState* play) {
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;
zDiff = waypointPos.z - this->actor.world.pos.z;

View file

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

View file

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

View file

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

View file

@ -243,7 +243,9 @@ void func_80ABF4C8(EnOkarinaTag* this, PlayState* play) {
case 2:
play->csCtx.segment = D_80ABF9D0;
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;
case 4:
play->csCtx.segment = D_80ABFB40;

View file

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

View file

@ -87,7 +87,7 @@ void EnPoDesert_Destroy(Actor* thisx, 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;
Animation_MorphToLoop(&this->skelAnime, &gPoeFieldDisappearAnim, -6.0f);

View file

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

View file

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

View file

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

View file

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

View file

@ -35,21 +35,55 @@ const ActorInit Item_Etcetera_InitVars = {
};
static s16 sObjectIds[] = {
OBJECT_GI_BOTTLE, OBJECT_GI_BOTTLE_LETTER, OBJECT_GI_SHIELD_2, OBJECT_GI_ARROWCASE, OBJECT_GI_SCALE,
OBJECT_GI_SCALE, OBJECT_GI_KEY, OBJECT_GI_M_ARROW, OBJECT_GI_RUPY, OBJECT_GI_RUPY,
OBJECT_GI_RUPY, OBJECT_GI_RUPY, OBJECT_GI_HEARTS, OBJECT_GI_KEY,
OBJECT_GI_BOTTLE, // ITEM_ETC_BOTTLE
OBJECT_GI_BOTTLE_LETTER, // ITEM_ETC_LETTER
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
static s16 sDrawItemIndices[] = {
GID_BOTTLE, GID_LETTER_RUTO, GID_SHIELD_HYLIAN, GID_QUIVER_40, GID_SCALE_SILVER,
GID_SCALE_GOLDEN, GID_KEY_SMALL, GID_ARROW_FIRE, GID_RUPEE_GREEN, GID_RUPEE_BLUE,
GID_RUPEE_RED, GID_RUPEE_PURPLE, GID_HEART_PIECE, GID_KEY_SMALL,
GID_BOTTLE, // ITEM_ETC_BOTTLE
GID_LETTER_RUTO, // ITEM_ETC_LETTER
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[] = {
GI_BOTTLE, GI_LETTER_RUTO, GI_SHIELD_HYLIAN, GI_QUIVER_40, GI_SCALE_SILVER, GI_SCALE_GOLD, GI_KEY_SMALL,
GI_ARROW_FIRE, GI_NONE, GI_NONE, GI_NONE, GI_NONE, GI_NONE, GI_NONE,
GI_BOTTLE, // ITEM_ETC_BOTTLE
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) {

View file

@ -226,13 +226,13 @@ void ObjBean_SetDrawMode(ObjBean* this, u8 drawFlag) {
}
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->nextPointIndex = 1;
}
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));
}
@ -250,7 +250,7 @@ void ObjBean_FollowPath(ObjBean* this, PlayState* play) {
f32 mag;
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];
Math_Vec3s_ToVec3f(&pathPointsFloat, nextPathPoint);
@ -480,7 +480,7 @@ void ObjBean_Init(Actor* thisx, PlayState* play) {
Actor_Kill(&this->dyna.actor);
return;
}
if (play->setupPathList[path].count < 3) {
if (play->pathList[path].count < 3) {
osSyncPrintf(VT_COL(RED, WHITE));
// "Incorrect number of path data"
osSyncPrintf("パスデータ数が不正(%s %d)(arg_data %xH)\n", "../z_obj_bean.c", 921,

View file

@ -493,130 +493,255 @@ static u16 D_8085361C[] = {
};
static GetItemEntry sGetItemTable[] = {
// GI_BOMBS_5
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),
// GI_BOMBCHUS_10
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),
// GI_SLINGSHOT
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),
// GI_STICKS_1
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),
// GI_LONGSHOT
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),
// GI_LETTER_ZELDA
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),
// GI_HAMMER
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),
// GI_BOTTLE
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),
// GI_POTION_GREEN
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),
// GI_FAIRY
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),
// GI_LETTER_RUTO
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),
// GI_MASK_SKULL
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),
// GI_CHICKEN
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),
// GI_MASK_BUNNY
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),
// GI_POCKET_EGG
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),
// GI_ODD_MUSHROOM
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),
// GI_SAW
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),
// GI_PRESCRIPTION
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),
// GI_EYEDROPS
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),
// GI_SWORD_KOKIRI
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),
// GI_SHIELD_DEKU
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),
// GI_SHIELD_MIRROR
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),
// GI_TUNIC_ZORA
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),
// GI_BOOTS_HOVER
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),
// GI_QUIVER_50
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),
// GI_BOMB_BAG_30
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),
// GI_GAUNTLETS_SILVER
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),
// GI_SCALE_SILVER
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),
// GI_STONE_OF_AGONY
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),
// GI_OCARINA_FAIRY
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),
// GI_HEART_CONTAINER
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),
// GI_KEY_BOSS
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),
// GI_MAP
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),
// GI_MAGIC_SMALL
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),
// GI_WALLET_ADULT
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),
// GI_WEIRD_EGG
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),
// GI_ARROWS_SMALL
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),
// GI_ARROWS_LARGE
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),
// GI_RUPEE_BLUE
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),
// GI_HEART_CONTAINER_2
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),
// GI_MASK_GORON
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),
// GI_MASK_GERUDO
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),
// GI_RUPEE_PURPLE
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),
// GI_SWORD_BGS
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),
// GI_ARROW_ICE
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),
// GI_SKULL_TOKEN
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),
// GI_FARORES_WIND
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),
// GI_BULLET_BAG_30
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),
// GI_STICKS_5
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),
// GI_NUTS_5_2
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),
// GI_BOMBS_1
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),
// GI_BOMBS_20
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),
// GI_SEEDS_30
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),
// GI_BOMBCHUS_20
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),
// GI_BUGS
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),
// GI_POE
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),
// GI_DOOR_KEY
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),
// GI_RUPEE_BLUE_LOSE
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),
// GI_RUPEE_PURPLE_LOSE
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),
// GI_STICK_UPGRADE_20
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),
// GI_NUT_UPGRADE_30
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),
// GI_BULLET_BAG_50
GET_ITEM(ITEM_BULLET_BAG_50, OBJECT_GI_DEKUPOUCH, GID_BULLET_BAG_50, 0x6C, 0x80, CHEST_ANIM_LONG),
// GI_ICE_TRAP
GET_ITEM_NONE,
// GI_TEXT_0
GET_ITEM_NONE,
};
@ -1026,94 +1151,208 @@ static u8 D_80853E7C[] = {
// Used to map item IDs to item actions
static s8 sItemActions[] = {
PLAYER_IA_STICK,
PLAYER_IA_NUT,
PLAYER_IA_BOMB,
PLAYER_IA_BOW,
PLAYER_IA_BOW_FIRE,
PLAYER_IA_DINS_FIRE,
PLAYER_IA_SLINGSHOT,
PLAYER_IA_OCARINA_FAIRY,
PLAYER_IA_OCARINA_TIME,
PLAYER_IA_BOMBCHU,
PLAYER_IA_HOOKSHOT,
PLAYER_IA_LONGSHOT,
PLAYER_IA_BOW_ICE,
PLAYER_IA_FARORES_WIND,
PLAYER_IA_BOOMERANG,
PLAYER_IA_LENS,
PLAYER_IA_BEAN,
PLAYER_IA_HAMMER,
PLAYER_IA_BOW_LIGHT,
PLAYER_IA_NAYRUS_LOVE,
PLAYER_IA_BOTTLE,
PLAYER_IA_BOTTLE_POTION_RED,
PLAYER_IA_BOTTLE_POTION_GREEN,
PLAYER_IA_BOTTLE_POTION_BLUE,
PLAYER_IA_BOTTLE_FAIRY,
PLAYER_IA_BOTTLE_FISH,
PLAYER_IA_BOTTLE_MILK,
PLAYER_IA_BOTTLE_LETTER,
PLAYER_IA_BOTTLE_FIRE,
PLAYER_IA_BOTTLE_BUG,
PLAYER_IA_BOTTLE_BIG_POE,
PLAYER_IA_BOTTLE_MILK_HALF,
PLAYER_IA_BOTTLE_POE,
PLAYER_IA_WEIRD_EGG,
PLAYER_IA_CHICKEN,
PLAYER_IA_LETTER_ZELDA,
PLAYER_IA_MASK_KEATON,
PLAYER_IA_MASK_SKULL,
PLAYER_IA_MASK_SPOOKY,
PLAYER_IA_MASK_BUNNY,
PLAYER_IA_MASK_GORON,
PLAYER_IA_MASK_ZORA,
PLAYER_IA_MASK_GERUDO,
PLAYER_IA_MASK_TRUTH,
PLAYER_IA_SWORD_MASTER,
PLAYER_IA_POCKET_EGG,
PLAYER_IA_POCKET_CUCCO,
PLAYER_IA_COJIRO,
PLAYER_IA_ODD_MUSHROOM,
PLAYER_IA_ODD_POTION,
PLAYER_IA_SAW,
PLAYER_IA_SWORD_BROKEN,
PLAYER_IA_PRESCRIPTION,
PLAYER_IA_FROG,
PLAYER_IA_EYEDROPS,
PLAYER_IA_CLAIM_CHECK,
PLAYER_IA_BOW_FIRE,
PLAYER_IA_BOW_ICE,
PLAYER_IA_BOW_LIGHT,
PLAYER_IA_SWORD_KOKIRI,
PLAYER_IA_SWORD_MASTER,
PLAYER_IA_SWORD_BGS,
PLAYER_IA_STICK, // ITEM_STICK
PLAYER_IA_NUT, // ITEM_NUT
PLAYER_IA_BOMB, // ITEM_BOMB
PLAYER_IA_BOW, // ITEM_BOW
PLAYER_IA_BOW_FIRE, // ITEM_ARROW_FIRE
PLAYER_IA_DINS_FIRE, // ITEM_DINS_FIRE
PLAYER_IA_SLINGSHOT, // ITEM_SLINGSHOT
PLAYER_IA_OCARINA_FAIRY, // ITEM_OCARINA_FAIRY
PLAYER_IA_OCARINA_TIME, // ITEM_OCARINA_TIME
PLAYER_IA_BOMBCHU, // ITEM_BOMBCHU
PLAYER_IA_HOOKSHOT, // ITEM_HOOKSHOT
PLAYER_IA_LONGSHOT, // ITEM_LONGSHOT
PLAYER_IA_BOW_ICE, // ITEM_ARROW_ICE
PLAYER_IA_FARORES_WIND, // ITEM_FARORES_WIND
PLAYER_IA_BOOMERANG, // ITEM_BOOMERANG
PLAYER_IA_LENS, // ITEM_LENS
PLAYER_IA_BEAN, // ITEM_BEAN
PLAYER_IA_HAMMER, // ITEM_HAMMER
PLAYER_IA_BOW_LIGHT, // ITEM_ARROW_LIGHT
PLAYER_IA_NAYRUS_LOVE, // ITEM_NAYRUS_LOVE
PLAYER_IA_BOTTLE, // ITEM_BOTTLE
PLAYER_IA_BOTTLE_POTION_RED, // ITEM_POTION_RED
PLAYER_IA_BOTTLE_POTION_GREEN, // ITEM_POTION_GREEN
PLAYER_IA_BOTTLE_POTION_BLUE, // ITEM_POTION_BLUE
PLAYER_IA_BOTTLE_FAIRY, // ITEM_FAIRY
PLAYER_IA_BOTTLE_FISH, // ITEM_FISH
PLAYER_IA_BOTTLE_MILK, // ITEM_MILK_BOTTLE
PLAYER_IA_BOTTLE_LETTER, // ITEM_LETTER_RUTO
PLAYER_IA_BOTTLE_FIRE, // ITEM_BLUE_FIRE
PLAYER_IA_BOTTLE_BUG, // ITEM_BUG
PLAYER_IA_BOTTLE_BIG_POE, // ITEM_BIG_POE
PLAYER_IA_BOTTLE_MILK_HALF, // ITEM_MILK_HALF
PLAYER_IA_BOTTLE_POE, // ITEM_POE
PLAYER_IA_WEIRD_EGG, // ITEM_WEIRD_EGG
PLAYER_IA_CHICKEN, // ITEM_CHICKEN
PLAYER_IA_LETTER_ZELDA, // ITEM_LETTER_ZELDA
PLAYER_IA_MASK_KEATON, // ITEM_MASK_KEATON
PLAYER_IA_MASK_SKULL, // ITEM_MASK_SKULL
PLAYER_IA_MASK_SPOOKY, // ITEM_MASK_SPOOKY
PLAYER_IA_MASK_BUNNY, // ITEM_MASK_BUNNY
PLAYER_IA_MASK_GORON, // ITEM_MASK_GORON
PLAYER_IA_MASK_ZORA, // ITEM_MASK_ZORA
PLAYER_IA_MASK_GERUDO, // ITEM_MASK_GERUDO
PLAYER_IA_MASK_TRUTH, // ITEM_MASK_TRUTH
PLAYER_IA_SWORD_MASTER, // ITEM_SOLD_OUT
PLAYER_IA_POCKET_EGG, // ITEM_POCKET_EGG
PLAYER_IA_POCKET_CUCCO, // ITEM_POCKET_CUCCO
PLAYER_IA_COJIRO, // ITEM_COJIRO
PLAYER_IA_ODD_MUSHROOM, // ITEM_ODD_MUSHROOM
PLAYER_IA_ODD_POTION, // ITEM_ODD_POTION
PLAYER_IA_SAW, // ITEM_SAW
PLAYER_IA_SWORD_BROKEN, // ITEM_SWORD_BROKEN
PLAYER_IA_PRESCRIPTION, // ITEM_PRESCRIPTION
PLAYER_IA_FROG, // ITEM_FROG
PLAYER_IA_EYEDROPS, // ITEM_EYEDROPS
PLAYER_IA_CLAIM_CHECK, // ITEM_CLAIM_CHECK
PLAYER_IA_BOW_FIRE, // ITEM_BOW_ARROW_FIRE
PLAYER_IA_BOW_ICE, // ITEM_BOW_ARROW_ICE
PLAYER_IA_BOW_LIGHT, // ITEM_BOW_ARROW_LIGHT
PLAYER_IA_SWORD_KOKIRI, // ITEM_SWORD_KOKIRI
PLAYER_IA_SWORD_MASTER, // ITEM_SWORD_MASTER
PLAYER_IA_SWORD_BGS, // ITEM_SWORD_BGS
};
static s32 (*D_80853EDC[])(Player* this, PlayState* play) = {
func_8083485C, func_8083485C, func_8083485C, func_808349DC, func_808349DC, func_808349DC, func_8083485C,
func_8083485C, func_8083501C, func_8083501C, func_8083501C, func_8083501C, func_8083501C, func_8083501C,
func_8083501C, func_8083501C, func_8083501C, func_8083501C, func_808356E8, func_808356E8, func_80835800,
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C,
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C,
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C,
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C,
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C,
func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C, func_8083485C,
func_8083485C, func_8083485C, func_8083485C, func_8083485C,
func_8083485C, // PLAYER_IA_NONE
func_8083485C, // PLAYER_IA_LAST_USED
func_8083485C, // PLAYER_IA_FISHING_POLE
func_808349DC, // PLAYER_IA_SWORD_MASTER
func_808349DC, // PLAYER_IA_SWORD_KOKIRI
func_808349DC, // PLAYER_IA_SWORD_BGS
func_8083485C, // PLAYER_IA_STICK
func_8083485C, // PLAYER_IA_HAMMER
func_8083501C, // PLAYER_IA_BOW
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) = {
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_8083377C,
func_80833790, func_8083379C, func_8083379C, func_8083379C, func_8083379C, func_8083379C, func_8083379C,
func_8083379C, func_8083379C, func_80833910, func_80833910, func_808337D4, func_808337D4, func_80833984,
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770,
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770,
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770,
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770,
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770,
func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770, func_80833770,
func_80833770, func_80833770, func_80833770, func_80833770,
func_80833770, // PLAYER_IA_NONE
func_80833770, // PLAYER_IA_LAST_USED
func_80833770, // PLAYER_IA_FISHING_POLE
func_80833770, // PLAYER_IA_SWORD_MASTER
func_80833770, // PLAYER_IA_SWORD_KOKIRI
func_80833770, // PLAYER_IA_SWORD_BGS
func_8083377C, // PLAYER_IA_STICK
func_80833790, // PLAYER_IA_HAMMER
func_8083379C, // PLAYER_IA_BOW
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 {
@ -2998,14 +3237,14 @@ void func_80836448(PlayState* play, Player* this, LinkAnimationHeader* anim) {
func_80832698(this, NA_SE_VO_LI_DOWN);
if (this->actor.category == ACTORCAT_PLAYER) {
func_800F47BC();
Audio_SetBgmVolumeOffDuringFanfare();
if (Inventory_ConsumeFairy(play)) {
play->gameOverCtx.state = GAMEOVER_REVIVE_START;
this->unk_84F = 1;
} else {
play->gameOverCtx.state = GAMEOVER_DEATH_START;
func_800F6AB0(0);
Audio_StopBgmAndFanfare(0);
Audio_PlayFanfare(NA_BGM_GAME_OVER);
gSaveContext.seqId = (u8)NA_BGM_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 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.
*
* 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);
Scene_SetTransitionForNextEntrance(play);
} else {
play->nextEntranceIndex = play->setupExitList[exitIndex - 1];
play->nextEntranceIndex = play->exitList[exitIndex - 1];
if (play->nextEntranceIndex == ENTR_RETURN_GROTTO) {
gSaveContext.respawnFlag = 2;
@ -4200,7 +4439,7 @@ s32 func_80839034(PlayState* play, Player* this, CollisionPoly* poly, u32 bgId)
play->nextEntranceIndex =
sReturnEntranceGroupData[sReturnEntranceGroupIndices[play->nextEntranceIndex -
ENTR_RETURN_YOUSEI_IZUMI_YOKO] +
play->curSpawn];
play->spawn];
Scene_SetTransitionForNextEntrance(play);
} else {
if (SurfaceType_GetFloorEffect(&play->colCtx, poly, bgId) == FLOOR_EFFECT_2) {
@ -4928,11 +5167,35 @@ void func_8083B010(Player* this) {
}
static u8 D_80854528[] = {
GI_LETTER_ZELDA, GI_WEIRD_EGG, GI_CHICKEN, GI_BEAN, GI_POCKET_EGG, GI_POCKET_CUCCO,
GI_COJIRO, GI_ODD_MUSHROOM, GI_ODD_POTION, GI_SAW, GI_SWORD_BROKEN, GI_PRESCRIPTION,
GI_FROG, GI_EYEDROPS, GI_CLAIM_CHECK, GI_MASK_SKULL, GI_MASK_SPOOKY, GI_MASK_KEATON,
GI_MASK_BUNNY, GI_MASK_TRUTH, GI_MASK_GORON, GI_MASK_ZORA, GI_MASK_GERUDO, GI_LETTER_RUTO,
GI_LETTER_RUTO, GI_LETTER_RUTO, GI_LETTER_RUTO, GI_LETTER_RUTO, GI_LETTER_RUTO,
GI_LETTER_ZELDA, // EXCH_ITEM_LETTER_ZELDA
GI_WEIRD_EGG, // EXCH_ITEM_WEIRD_EGG
GI_CHICKEN, // EXCH_ITEM_CHICKEN
GI_BEAN, // EXCH_ITEM_BEAN
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[] = {
@ -8121,7 +8384,7 @@ void func_80843AE8(PlayState* play, Player* this) {
}
this->unk_A87 = 20;
func_80837AFC(this, -20);
func_800F47FC();
Audio_SetBgmVolumeOnDuringFanfare();
}
} else if (this->unk_84F != 0) {
this->unk_850 = 60;

View file

@ -210,32 +210,32 @@ def disas_elfmsgs(start):
if condition_type == 0:
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:
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
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
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:
condition_other_type = b1 & 0xF0
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
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
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
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
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 b3 == 0
else: