diff --git a/assets/xml/textures/place_title_cards.xml b/assets/xml/textures/place_title_cards.xml
index c1771d4c8e..44bd6c8fb4 100644
--- a/assets/xml/textures/place_title_cards.xml
+++ b/assets/xml/textures/place_title_cards.xml
@@ -150,9 +150,9 @@
-
-
-
+
+
+
@@ -215,9 +215,9 @@
-
-
-
+
+
+
diff --git a/include/fault.h b/include/fault.h
index 642d581d80..511d3516fe 100644
--- a/include/fault.h
+++ b/include/fault.h
@@ -1,6 +1,7 @@
#ifndef FAULT_H
#define FAULT_H
+#include "ultra64.h"
#include "padmgr.h"
// These are the same as the 3-bit ansi color codes
@@ -69,7 +70,7 @@ void FaultDrawer_DrawText(s32 x, s32 y, const char* fmt, ...);
typedef struct FaultMgr {
/* 0x000 */ OSThread thread;
- /* 0x1B0 */ u8 unk_1B0[0x600];
+ /* 0x1B0 */ char unk_1B0[0x600]; // probably an unused internal thread stack for `Fault_ClientRunTask`/`clientThreadSp`
/* 0x7B0 */ OSMesgQueue queue;
/* 0x7C8 */ OSMesg msg;
/* 0x7CC */ u8 exit;
@@ -77,12 +78,11 @@ typedef struct FaultMgr {
/* 0x7CE */ u8 faultHandlerEnabled;
/* 0x7CF */ u8 autoScroll;
/* 0x7D0 */ OSThread* faultedThread;
- /* 0x7D4 */ void (*padCallback)(Input*);
+ /* 0x7D4 */ void (*padCallback)(Input* inputs);
/* 0x7D8 */ FaultClient* clients;
/* 0x7DC */ FaultAddrConvClient* addrConvClients;
- /* 0x7E0 */ u8 unk_7E0[4];
- /* 0x7E4 */ Input padInput;
- /* 0x7FC */ u16 colors[36];
+ /* 0x7E0 */ char unk_7E0[0x4];
+ /* 0x7E4 */ Input inputs[MAXCONTROLLERS];
/* 0x844 */ void* fb;
/* 0x848 */ void* clientThreadSp;
} FaultMgr; // size = 0x850
diff --git a/include/functions.h b/include/functions.h
index 9407602035..1f2076188f 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -939,7 +939,7 @@ void ZeldaArena_GetSizes(u32* outMaxFree, u32* outFree, u32* outAlloc);
void ZeldaArena_Check(void);
void ZeldaArena_Init(void* start, u32 size);
void ZeldaArena_Cleanup(void);
-u8 ZeldaArena_IsInitalized(void);
+u8 ZeldaArena_IsInitialized(void);
void MapMark_Init(PlayState* play);
void MapMark_ClearPointers(PlayState* play);
void MapMark_Draw(PlayState* play);
@@ -1132,9 +1132,9 @@ Gfx* Gfx_TwoTexScrollEnvColor(GraphicsContext* gfxCtx, s32 tile1, u32 x1, u32 y1
Gfx* Gfx_EnvColor(GraphicsContext* gfxCtx, s32 r, s32 g, s32 b, s32 a);
void Gfx_SetupFrame(GraphicsContext* gfxCtx, u8 r, u8 g, u8 b);
void func_80095974(GraphicsContext* gfxCtx);
-void func_80095AA0(PlayState* play, Room* room, Input* arg2, UNK_TYPE arg3);
-void func_8009638C(Gfx** displayList, void* source, void* tlut, u16 width, u16 height, u8 fmt, u8 siz, u16 mode0,
- u16 tlutCount, f32 frameX, f32 frameY);
+void func_80095AA0(PlayState* play, Room* room, Input* input, s32 arg3);
+void Room_DrawBackground2D(Gfx** gfxP, void* tex, void* tlut, u16 width, u16 height, u8 fmt, u8 siz, u16 tlutMode,
+ u16 tlutCount, f32 offsetX, f32 offsetY);
void func_80096FD4(PlayState* play, Room* room);
u32 func_80096FE8(PlayState* play, RoomContext* roomCtx);
s32 func_8009728C(PlayState* play, RoomContext* roomCtx, s32 roomNum);
@@ -1574,21 +1574,6 @@ void ListAlloc_Free(ListAlloc* this, void* data);
void ListAlloc_FreeAll(ListAlloc* this);
void Main_LogSystemHeap(void);
void Main(void* arg);
-OSMesgQueue* PadMgr_LockSerialMesgQueue(PadMgr* padMgr);
-void PadMgr_UnlockSerialMesgQueue(PadMgr* padMgr, OSMesgQueue* serialEventQueue);
-void PadMgr_LockPadData(PadMgr* padMgr);
-void PadMgr_UnlockPadData(PadMgr* padMgr);
-void PadMgr_RumbleControl(PadMgr* padMgr);
-void PadMgr_RumbleStop(PadMgr* padMgr);
-void PadMgr_RumbleReset(PadMgr* padMgr);
-void PadMgr_RumbleSet(PadMgr* padMgr, u8* ctrlrRumbles);
-void PadMgr_ProcessInputs(PadMgr* padMgr);
-void PadMgr_HandleRetraceMsg(PadMgr* padMgr);
-void PadMgr_HandlePreNMI(PadMgr* padMgr);
-// This function must remain commented out, because it is called incorrectly in
-// fault.c (actual bug in game), and the compiler notices and won't compile it
-// void PadMgr_RequestPadData(PadMgr* padmgr, Input* inputs, s32 mode);
-void PadMgr_Init(PadMgr* padMgr, OSMesgQueue* serialEventQueue, IrqMgr* irqMgr, OSId id, OSPri priority, void* stack);
void SpeedMeter_InitImpl(SpeedMeter* this, u32 arg1, u32 y);
void SpeedMeter_Init(SpeedMeter* this);
void SpeedMeter_Destroy(SpeedMeter* this);
@@ -1729,7 +1714,7 @@ void DebugArena_GetSizes(u32* outMaxFree, u32* outFree, u32* outAlloc);
void DebugArena_Check(void);
void DebugArena_Init(void* start, u32 size);
void DebugArena_Cleanup(void);
-u8 DebugArena_IsInitalized(void);
+u8 DebugArena_IsInitialized(void);
void UCodeDisas_Init(UCodeDisas*);
void UCodeDisas_Destroy(UCodeDisas*);
// void UCodeDisas_Disassemble(UCodeDisas*, Gfx*);
@@ -2031,7 +2016,7 @@ void SystemArena_GetSizes(u32* outMaxFree, u32* outFree, u32* outAlloc);
void SystemArena_Check(void);
void SystemArena_Init(void* start, u32 size);
void SystemArena_Cleanup(void);
-u8 SystemArena_IsInitalized(void);
+u8 SystemArena_IsInitialized(void);
u32 Rand_Next(void);
void Rand_Seed(u32 seed);
f32 Rand_ZeroOne(void);
@@ -2060,7 +2045,7 @@ void __osMallocInit(Arena* arena, void* start, u32 size);
void __osMallocAddBlock(Arena* arena, void* start, s32 size);
void ArenaImpl_RemoveAllBlocks(Arena* arena);
void __osMallocCleanup(Arena* arena);
-u8 __osMallocIsInitalized(Arena* arena);
+u8 __osMallocIsInitialized(Arena* arena);
void __osMalloc_FreeBlockTest(Arena* arena, ArenaNode* node);
void* __osMalloc_NoLockDebug(Arena* arena, u32 size, const char* file, s32 line);
void* __osMallocDebug(Arena* arena, u32 size, const char* file, s32 line);
diff --git a/include/irqmgr.h b/include/irqmgr.h
index e1b3befbca..69a749a494 100644
--- a/include/irqmgr.h
+++ b/include/irqmgr.h
@@ -43,4 +43,7 @@ void IrqMgr_Init(IrqMgr* irqMgr, void* stack, OSPri pri, u8 retraceCount);
void IrqMgr_AddClient(IrqMgr* irqMgr, IrqMgrClient* client, OSMesgQueue* msgQueue);
void IrqMgr_RemoveClient(IrqMgr* irqMgr, IrqMgrClient* client);
+extern vu32 gIrqMgrResetStatus;
+extern volatile OSTime gIrqMgrRetraceTime;
+
#endif
diff --git a/include/padmgr.h b/include/padmgr.h
index 52f6f08ee7..bddb136eb9 100644
--- a/include/padmgr.h
+++ b/include/padmgr.h
@@ -1,8 +1,15 @@
#ifndef PADMGR_H
#define PADMGR_H
+#include "ultra64.h"
#include "irqmgr.h"
+typedef enum {
+ CONT_PAK_NONE,
+ CONT_PAK_RUMBLE,
+ CONT_PAK_OTHER
+} ControllerPakType;
+
typedef struct {
/* 0x00 */ OSContPad cur;
/* 0x06 */ OSContPad prev;
@@ -11,9 +18,9 @@ typedef struct {
} Input; // size = 0x18
typedef struct PadMgr {
- /* 0x0000 */ OSContStatus padStatus[4];
- /* 0x0010 */ OSMesg serialLockMsgBuf[1];
- /* 0x0014 */ OSMesg lockMsgBuf[1];
+ /* 0x0000 */ OSContStatus padStatus[MAXCONTROLLERS];
+ /* 0x0010 */ OSMesg serialMsg;
+ /* 0x0014 */ OSMesg lockMsg;
/* 0x0018 */ OSMesg interruptMsgBuf[4];
/* 0x0028 */ OSMesgQueue serialLockQueue;
/* 0x0040 */ OSMesgQueue lockQueue;
@@ -21,20 +28,46 @@ typedef struct PadMgr {
/* 0x0070 */ IrqMgrClient irqClient;
/* 0x0078 */ IrqMgr* irqMgr;
/* 0x0080 */ OSThread thread;
- /* 0x0230 */ Input inputs[4];
- /* 0x0290 */ OSContPad pads[4];
+ /* 0x0230 */ Input inputs[MAXCONTROLLERS];
+ /* 0x0290 */ OSContPad pads[MAXCONTROLLERS];
/* 0x02A8 */ vu8 validCtrlrsMask;
/* 0x02A9 */ u8 nControllers;
- /* 0x02AA */ u8 ctrlrIsConnected[4]; // "Key_switch" originally
- /* 0x02AE */ u8 pakType[4]; // 1 if rumble pack, 2 if mempak?
- /* 0x02B2 */ vu8 rumbleEnable[4];
- /* 0x02B6 */ u8 rumbleCounter[4]; // not clear exact meaning
- /* 0x02BC */ OSPfs pfs[4];
- /* 0x045C */ vu8 rumbleOffFrames;
- /* 0x045D */ vu8 rumbleOnFrames;
- /* 0x045E */ u8 preNMIShutdown;
- /* 0x0460 */ void (*retraceCallback)(struct PadMgr* padmgr, s32 unk464);
- /* 0x0464 */ u32 retraceCallbackValue;
+ /* 0x02AA */ u8 ctrlrIsConnected[MAXCONTROLLERS];
+ /* 0x02AE */ u8 pakType[MAXCONTROLLERS];
+ /* 0x02B2 */ vu8 rumbleEnable[MAXCONTROLLERS];
+ /* 0x02B6 */ u8 rumbleTimer[MAXCONTROLLERS];
+ /* 0x02BC */ OSPfs rumblePfs[MAXCONTROLLERS];
+ /* 0x045C */ vu8 rumbleOffTimer; // amount of VI retraces to not rumble for, takes priority over rumbleOnTimer
+ /* 0x045D */ vu8 rumbleOnTimer; // amount of VI retraces to rumble for
+ /* 0x045E */ u8 isResetting;
+ /* 0x0460 */ void (*retraceCallback)(struct PadMgr* padMgr, s32 arg);
+ /* 0x0464 */ s32 retraceCallbackValue;
} PadMgr; // size = 0x468
+extern PadMgr gPadMgr;
+
+// Initialization
+
+void PadMgr_Init(PadMgr* padMgr, OSMesgQueue* serialEventQueue, IrqMgr* irqMgr, OSId id, OSPri priority, void* stack);
+
+// Fetching inputs
+
+// This function cannot be prototyped here without AVOID_UB because it is called incorrectly in fault.c (see bug in
+// `Fault_PadCallback`)
+#ifdef AVOID_UB
+void PadMgr_RequestPadData(PadMgr* padmgr, Input* inputs, s32 gameRequest);
+#endif
+
+// For internal use by Controller Pak systems
+
+OSMesgQueue* PadMgr_AcquireSerialEventQueue(PadMgr* padMgr);
+void PadMgr_ReleaseSerialEventQueue(PadMgr* padMgr, OSMesgQueue* serialEventQueue);
+
+// Rumble
+
+void PadMgr_RumbleStop(PadMgr* padMgr);
+void PadMgr_RumbleReset(PadMgr* padMgr);
+void PadMgr_RumbleSetSingle(PadMgr* padMgr, u32 port, u32 rumble);
+void PadMgr_RumbleSet(PadMgr* padMgr, u8* enable);
+
#endif
diff --git a/include/regs.h b/include/regs.h
index 04d8b7cf1c..cdd3571463 100644
--- a/include/regs.h
+++ b/include/regs.h
@@ -48,6 +48,8 @@
#define R_ENV_TIME_SPEED_OLD REG(15) // Most likely used during development. Unused in the final game.
#define R_RUN_SPEED_LIMIT REG(45)
#define R_ENABLE_ARENA_DBG SREG(0)
+#define R_ROOM_IMAGE_NODRAW_FLAGS SREG(25)
+#define R_ROOM_BG2D_FORCE_SCALEBG SREG(26)
#define R_UPDATE_RATE SREG(30)
#define R_GRAPH_TASKSET00_FLAGS SREG(33)
#define R_ENABLE_AUDIO_DBG SREG(36)
@@ -57,13 +59,17 @@
#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_MAX_PHI OREG(5)
-#define R_CAM_DEFA_PHI_UPDRATE OREG(7)
-#define R_DEFA_CAM_ANIM_TIME OREG(23)
-#define R_CAM_MIN_PHI OREG(34)
-#define R_CAM_MIN_PHI2 OREG(35)
-#define R_AT_LERP_MIN OREG(41)
-#define R_AT_LERP_SCALE OREG(42)
+#define R_CAM_MAX_PITCH OREG(5)
+#define R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV OREG(7)
+#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_MIN_PITCH_1 OREG(34)
+#define R_CAM_MIN_PITCH_2 OREG(35)
+#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)
#define R_CAM_DATA(type) PREG(0 + (type))
#define R_DBG_CAM_UPDATE PREG(80)
@@ -132,6 +138,10 @@
#define R_TEXTBOX_TEXHEIGHT_TARGET XREG(77)
#define R_ENV_LIGHT1_DIR(i) cREG(3 + (i))
#define R_ENV_LIGHT2_DIR(i) cREG(6 + (i))
+#define R_ROOM_CULL_DEBUG_MODE iREG(86)
+#define R_ROOM_CULL_NUM_ENTRIES iREG(87)
+#define R_ROOM_CULL_USED_ENTRIES iREG(88)
+#define R_ROOM_CULL_DEBUG_TARGET iREG(89)
#define R_B_LABEL_DD WREG(0)
#define R_PAUSE_OFFSET_VERTICAL WREG(2)
#define R_PAUSE_OFFSET_DEPTH WREG(3)
diff --git a/include/variables.h b/include/variables.h
index f947ef989d..a5808eb50c 100644
--- a/include/variables.h
+++ b/include/variables.h
@@ -110,8 +110,6 @@ extern s32 gScreenHeight;
extern Mtx gMtxClear;
extern MtxF gMtxFClear;
extern u32 gIsCtrlr2Valid;
-extern vu32 gIrqMgrResetStatus;
-extern volatile OSTime gIrqMgrRetraceTime;
extern s16* gWaveSamples[9];
extern f32 gBendPitchOneOctaveFrequencies[256];
extern f32 gBendPitchTwoSemitonesFrequencies[256];
@@ -128,7 +126,7 @@ extern f32 gStereoPanVolume[128];
extern f32 gDefaultPanVolume[128];
extern s16 gLowPassFilterData[16 * 8];
extern s16 gHighPassFilterData[15 * 8];
-extern s32 gAudioContextInitalized;
+extern s32 gAudioContextInitialized;
extern u8 gIsLargeSfxBank[7];
extern u8 gChannelsPerBank[4][7];
extern u8 gUsedChannelsPerBank[4][7];
@@ -193,7 +191,6 @@ extern s32 gTrnsnUnkState;
extern Color_RGBA8_u32 D_801614B0;
extern PreNmiBuff* gAppNmiBufferPtr;
extern Scheduler gScheduler;
-extern PadMgr gPadMgr;
extern u32 gSegments[NUM_SEGMENTS];
extern volatile OSTime D_8016A520;
extern volatile OSTime D_8016A528;
diff --git a/include/z64.h b/include/z64.h
index a458a8d028..92b63f7fa0 100644
--- a/include/z64.h
+++ b/include/z64.h
@@ -871,7 +871,7 @@ typedef enum {
/* 01 */ GAMEOVER_DEATH_START,
/* 02 */ GAMEOVER_DEATH_WAIT_GROUND, // wait for link to fall and hit the ground
/* 03 */ GAMEOVER_DEATH_DELAY_MENU, // wait for 1 second before showing the game over menu
- /* 04 */ GAMEOVER_DEATH_MENU, // do nothing while kaliedoscope handles the game over menu
+ /* 04 */ GAMEOVER_DEATH_MENU, // do nothing while kaleidoscope handles the game over menu
/* 20 */ GAMEOVER_REVIVE_START = 20,
/* 21 */ GAMEOVER_REVIVE_RUMBLE,
/* 22 */ GAMEOVER_REVIVE_WAIT_GROUND, // wait for link to fall and hit the ground
@@ -932,7 +932,7 @@ typedef struct {
/* 0x03 */ u8 behaviorType1;
/* 0x04 */ s8 echo;
/* 0x05 */ u8 lensMode;
- /* 0x08 */ MeshHeader* meshHeader; // original name: "ground_shape"
+ /* 0x08 */ RoomShape* roomShape; // original name: "ground_shape"
/* 0x0C */ void* segment;
/* 0x10 */ char unk_10[0x4];
} Room; // size = 0x14
@@ -1120,7 +1120,7 @@ typedef struct GameState {
/* 0x08 */ GameStateFunc destroy; // "cleanup"
/* 0x0C */ GameStateFunc init;
/* 0x10 */ u32 size;
- /* 0x14 */ Input input[4];
+ /* 0x14 */ Input input[MAXCONTROLLERS];
/* 0x74 */ TwoHeadArena tha;
/* 0x84 */ GameAlloc alloc;
/* 0x98 */ u32 running;
diff --git a/include/z64actor.h b/include/z64actor.h
index f3d43e76ea..03418601d0 100644
--- a/include/z64actor.h
+++ b/include/z64actor.h
@@ -220,7 +220,7 @@ typedef struct Actor {
/* 0x100 */ Vec3f prevPos; // World position from the previous update cycle
/* 0x10C */ u8 isTargeted; // Set to true if the actor is currently being targeted by the player
/* 0x10D */ u8 targetPriority; // Lower values have higher priority. Resets to 0 when player stops targeting
- /* 0x10E */ u16 textId; // Text ID to pass to link/display when interacting with the actor
+ /* 0x10E */ u16 textId; // Text ID to pass to player/display when interacting with the actor
/* 0x110 */ u16 freezeTimer; // Actor does not update when set. Timer decrements automatically
/* 0x112 */ u16 colorFilterParams; // Set color filter to red, blue, or white. Toggle opa or xlu
/* 0x114 */ u8 colorFilterTimer; // A non-zero value enables the color filter. Decrements automatically
diff --git a/include/z64bgcheck.h b/include/z64bgcheck.h
index aa8a6859ce..8b52364061 100644
--- a/include/z64bgcheck.h
+++ b/include/z64bgcheck.h
@@ -64,7 +64,7 @@ typedef struct {
/* 0x06 */ Vec3s rot;
/* 0x0C */ s16 fov;
/* 0x0E */ union {
- s16 jfifId;
+ s16 roomImageOverrideBgCamIndex;
s16 timer;
s16 flags;
};
diff --git a/include/z64camera.h b/include/z64camera.h
index 944709bf95..5ea1d97599 100644
--- a/include/z64camera.h
+++ b/include/z64camera.h
@@ -68,7 +68,7 @@ typedef enum {
/* 0x18 */ CAM_SET_PIVOT_IN_FRONT, // The camera used on Link's balcony in Kokiri forest. Data present in scene data for Deku Tree, GTG, Inside Ganon's Castle (TODO: may or may not be used) "CIRCLE3"
/* 0x19 */ CAM_SET_PREREND_FIXED, // Camera is fixed in position and rotation "PREREND0"
/* 0x1A */ CAM_SET_PREREND_PIVOT, // Camera is fixed in position with fixed pitch, but is free to rotate in the yaw direction 360 degrees "PREREND1"
- /* 0x1B */ CAM_SET_PREREND_SIDE_SCROLL, // Camera side-scrolls position to follow link. Only used in castle courtyard with the guards "PREREND3"
+ /* 0x1B */ CAM_SET_PREREND_SIDE_SCROLL, // Camera side-scrolls position to follow the player. Only used in castle courtyard with the guards "PREREND3"
/* 0x1C */ CAM_SET_DOOR0, // Custom room door transitions, used in fire and royal family tomb
/* 0x1D */ CAM_SET_DOORC, // Generic room door transitions, camera moves and follows player as the door is open and closed
/* 0x1E */ CAM_SET_CRAWLSPACE, // Used in all crawlspaces "RAIL3"
@@ -813,7 +813,7 @@ typedef struct {
/* 0x0 */ Vec3s rot;
/* 0x6 */ s16 fov;
/* 0x8 */ s16 updDirTimer;
- /* 0xA */ s16 jfifId;
+ /* 0xA */ s16 roomImageOverrideBgCamIndex;
} Fixed3ReadWriteData; // size = 0xC
typedef struct {
diff --git a/include/z64scene.h b/include/z64scene.h
index 3c5afdf875..ede0d52492 100644
--- a/include/z64scene.h
+++ b/include/z64scene.h
@@ -58,44 +58,44 @@ typedef struct {
/* 0x04 */ Vec3s* points; // Segment Address to the array of points
} Path; // size = 0x8
-// Mesh headers
+// Room shapes
typedef enum {
- /* 0 */ MESH_HEADER_TYPE_0,
- /* 1 */ MESH_HEADER_TYPE_1,
- /* 2 */ MESH_HEADER_TYPE_2,
- /* 3 */ MESH_HEADER_TYPE_MAX
-} MeshHeaderType;
+ /* 0 */ ROOM_SHAPE_TYPE_NORMAL,
+ /* 1 */ ROOM_SHAPE_TYPE_IMAGE,
+ /* 2 */ ROOM_SHAPE_TYPE_CULLABLE,
+ /* 3 */ ROOM_SHAPE_TYPE_MAX
+} RoomShapeType;
typedef struct {
/* 0x00 */ u8 type;
-} MeshHeaderBase; // size = 0x01
+} RoomShapeBase; // size = 0x01
typedef struct {
/* 0x00 */ Gfx* opa;
/* 0x04 */ Gfx* xlu;
-} MeshHeader01Entry; // size = 0x08
+} RoomShapeDListsEntry; // size = 0x08
typedef struct {
- /* 0x00 */ MeshHeaderBase base;
+ /* 0x00 */ RoomShapeBase base;
/* 0x01 */ u8 numEntries;
- /* 0x04 */ MeshHeader01Entry* entries;
- /* 0x08 */ MeshHeader01Entry* entriesEnd;
-} MeshHeader0; // size = 0x0C
+ /* 0x04 */ RoomShapeDListsEntry* entries;
+ /* 0x08 */ RoomShapeDListsEntry* entriesEnd;
+} RoomShapeNormal; // size = 0x0C
typedef enum {
- /* 1 */ MESH_HEADER1_FORMAT_SINGLE = 1,
- /* 2 */ MESH_HEADER1_FORMAT_MULTI
-} MeshHeader1Format;
+ /* 1 */ ROOM_SHAPE_IMAGE_AMOUNT_SINGLE = 1,
+ /* 2 */ ROOM_SHAPE_IMAGE_AMOUNT_MULTI
+} RoomShapeImageAmountType;
typedef struct {
- /* 0x00 */ MeshHeaderBase base;
- /* 0x01 */ u8 format; // MeshHeader1Format
- /* 0x04 */ MeshHeader01Entry* entry;
-} MeshHeader1Base; // size = 0x08
+ /* 0x00 */ RoomShapeBase base;
+ /* 0x01 */ u8 amountType; // RoomShapeImageAmountType
+ /* 0x04 */ RoomShapeDListsEntry* entry;
+} RoomShapeImageBase; // size = 0x08
typedef struct {
- /* 0x00 */ MeshHeader1Base base;
+ /* 0x00 */ RoomShapeImageBase base;
/* 0x08 */ void* source;
/* 0x0C */ u32 unk_0C;
/* 0x10 */ void* tlut;
@@ -103,13 +103,13 @@ typedef struct {
/* 0x16 */ u16 height;
/* 0x18 */ u8 fmt;
/* 0x19 */ u8 siz;
- /* 0x1A */ u16 mode0;
+ /* 0x1A */ u16 tlutMode;
/* 0x1C */ u16 tlutCount;
-} MeshHeader1Single; // size = 0x20
+} RoomShapeImageSingle; // size = 0x20
typedef struct {
/* 0x00 */ u16 unk_00;
- /* 0x02 */ u8 id;
+ /* 0x02 */ u8 bgCamIndex; // for which bg cam index is this entry for
/* 0x04 */ void* source;
/* 0x08 */ u32 unk_0C;
/* 0x0C */ void* tlut;
@@ -117,44 +117,52 @@ typedef struct {
/* 0x12 */ u16 height;
/* 0x14 */ u8 fmt;
/* 0x15 */ u8 siz;
- /* 0x16 */ u16 mode0;
+ /* 0x16 */ u16 tlutMode;
/* 0x18 */ u16 tlutCount;
-} BgImage; // size = 0x1C
+} RoomShapeImageMultiBgEntry; // size = 0x1C
typedef struct {
- /* 0x00 */ MeshHeader1Base base;
- /* 0x08 */ u8 count;
- /* 0x0C */ BgImage* list;
-} MeshHeader1Multi; // size = 0x10
+ /* 0x00 */ RoomShapeImageBase base;
+ /* 0x08 */ u8 numBackgrounds;
+ /* 0x0C */ RoomShapeImageMultiBgEntry* backgrounds;
+} RoomShapeImageMulti; // size = 0x10
typedef struct {
- /* 0x00 */ Vec3s pos;
- /* 0x06 */ s16 unk_06;
+ /* 0x00 */ Vec3s boundsSphereCenter;
+ /* 0x06 */ s16 boundsSphereRadius;
/* 0x08 */ Gfx* opa;
/* 0x0C */ Gfx* xlu;
-} MeshHeader2Entry; // size = 0x10
+} RoomShapeCullableEntry; // size = 0x10
+
+#define ROOM_SHAPE_CULLABLE_MAX_ENTRIES 64
typedef struct {
- /* 0x00 */ MeshHeaderBase base;
+ /* 0x00 */ RoomShapeBase base;
/* 0x01 */ u8 numEntries;
- /* 0x04 */ MeshHeader2Entry* entries;
- /* 0x08 */ MeshHeader2Entry* entriesEnd;
-} MeshHeader2; // size = 0x0C
+ /* 0x04 */ RoomShapeCullableEntry* entries;
+ /* 0x08 */ RoomShapeCullableEntry* entriesEnd;
+} RoomShapeCullable; // size = 0x0C
typedef union {
- MeshHeaderBase base;
- MeshHeader0 meshHeader0;
- MeshHeader1Base meshHeader1Base;
- MeshHeader1Single meshHeader1Single;
- MeshHeader1Multi meshHeader1Multi;
- MeshHeader2 meshHeader2;
-} MeshHeader; // "Ground Shape"
+ RoomShapeBase base;
+ RoomShapeNormal normal;
+ union {
+ RoomShapeImageBase base;
+ RoomShapeImageSingle single;
+ RoomShapeImageMulti multi;
+ } image;
+ RoomShapeCullable cullable;
+} RoomShape; // "Ground Shape"
// TODO update ZAPD
-typedef MeshHeader01Entry PolygonDlist;
-typedef MeshHeader0 PolygonType0;
-typedef MeshHeader2Entry PolygonDlist2;
-typedef MeshHeader2 PolygonType2;
+typedef RoomShapeDListsEntry PolygonDlist;
+typedef RoomShapeNormal PolygonType0;
+typedef RoomShapeImageSingle MeshHeader1Single;
+typedef RoomShapeImageMultiBgEntry BgImage;
+typedef RoomShapeImageMulti MeshHeader1Multi;
+typedef RoomShapeCullableEntry PolygonDlist2;
+typedef RoomShapeCullable PolygonType2;
+#define SCENE_CMD_MESH SCENE_CMD_ROOM_SHAPE
#define ROOM_DRAW_OPA (1 << 0)
#define ROOM_DRAW_XLU (1 << 1)
@@ -228,7 +236,7 @@ typedef struct {
typedef struct {
/* 0x00 */ u8 code;
/* 0x01 */ u8 data1;
- /* 0x04 */ MeshHeaderBase* data;
+ /* 0x04 */ RoomShapeBase* data;
} SCmdMesh;
typedef struct {
@@ -474,7 +482,7 @@ typedef enum {
/* 0x07 */ SCENE_CMD_ID_SPECIAL_FILES,
/* 0x08 */ SCENE_CMD_ID_ROOM_BEHAVIOR,
/* 0x09 */ SCENE_CMD_ID_UNDEFINED_9,
- /* 0x0A */ SCENE_CMD_ID_MESH_HEADER,
+ /* 0x0A */ SCENE_CMD_ID_ROOM_SHAPE,
/* 0x0B */ SCENE_CMD_ID_OBJECT_LIST,
/* 0x0C */ SCENE_CMD_ID_LIGHT_LIST,
/* 0x0D */ SCENE_CMD_ID_PATH_LIST,
@@ -524,8 +532,8 @@ typedef enum {
#define SCENE_CMD_UNK_09() \
{ SCENE_CMD_ID_UNDEFINED_9, 0, CMD_W(0) }
-#define SCENE_CMD_MESH(meshHeader) \
- { SCENE_CMD_ID_MESH_HEADER, 0, CMD_PTR(meshHeader) }
+#define SCENE_CMD_ROOM_SHAPE(roomShape) \
+ { SCENE_CMD_ID_ROOM_SHAPE, 0, CMD_PTR(roomShape) }
#define SCENE_CMD_OBJECT_LIST(numObjects, objectList) \
{ SCENE_CMD_ID_OBJECT_LIST, numObjects, CMD_PTR(objectList) }
diff --git a/src/code/__osMalloc.c b/src/code/__osMalloc.c
index 19de34a8be..22cabc0b5a 100644
--- a/src/code/__osMalloc.c
+++ b/src/code/__osMalloc.c
@@ -163,7 +163,7 @@ void __osMallocCleanup(Arena* arena) {
bzero(arena, sizeof(*arena));
}
-u8 __osMallocIsInitalized(Arena* arena) {
+u8 __osMallocIsInitialized(Arena* arena) {
return arena->isInit;
}
@@ -682,8 +682,8 @@ void __osDisplayArena(Arena* arena) {
ArenaNode* iter;
ArenaNode* next;
- if (!__osMallocIsInitalized(arena)) {
- osSyncPrintf("アリーナは初期化されていません\n"); // "Arena is not initalized"
+ if (!__osMallocIsInitialized(arena)) {
+ osSyncPrintf("アリーナは初期化されていません\n"); // "Arena is not initialized"
return;
}
@@ -746,7 +746,7 @@ void ArenaImpl_FaultClient(Arena* arena) {
ArenaNode* next;
FaultDrawer_Printf("ARENA INFO (0x%08x)\n", arena);
- if (!__osMallocIsInitalized(arena)) {
+ if (!__osMallocIsInitialized(arena)) {
FaultDrawer_Printf("Arena is uninitalized\n", arena);
return;
}
diff --git a/src/code/audio_heap.c b/src/code/audio_heap.c
index 7cdfe086b0..504b56244e 100644
--- a/src/code/audio_heap.c
+++ b/src/code/audio_heap.c
@@ -1059,7 +1059,7 @@ void AudioHeap_Init(void) {
AudioHeap_InitSampleCaches(spec->persistentSampleCacheSize, spec->temporarySampleCacheSize);
AudioLoad_InitSampleDmaBuffers(gAudioContext.numNotes);
- // Initalize Loads
+ // Initialize Loads
gAudioContext.preloadSampleStackTop = 0;
AudioLoad_InitSlowLoads();
AudioLoad_InitScriptLoads();
diff --git a/src/code/audio_load.c b/src/code/audio_load.c
index 73de884116..c234538f34 100644
--- a/src/code/audio_load.c
+++ b/src/code/audio_load.c
@@ -70,7 +70,7 @@ s32 sAudioLoadPad2[4]; // double file padding?
DmaHandler sDmaHandler = osEPiStartDma;
void* sUnusedHandler = NULL;
-s32 gAudioContextInitalized = false;
+s32 gAudioContextInitialized = false;
void AudioLoad_DecreaseSampleDmaTtls(void) {
u32 i;
@@ -1235,7 +1235,7 @@ void AudioLoad_Init(void* heap, u32 heapSize) {
}
AudioHeap_InitPool(&gAudioContext.permanentPool, ramAddr, gAudioHeapInitSizes.permanentPoolSize);
- gAudioContextInitalized = true;
+ gAudioContextInitialized = true;
osSendMesg(gAudioContext.taskStartQueueP, (OSMesg)gAudioContext.totalTaskCount, OS_MESG_NOBLOCK);
}
diff --git a/src/code/audio_synthesis.c b/src/code/audio_synthesis.c
index a00c57ffae..26538dcfde 100644
--- a/src/code/audio_synthesis.c
+++ b/src/code/audio_synthesis.c
@@ -1266,7 +1266,7 @@ Acmd* AudioSynth_LoadWaveSamples(Acmd* cmd, NoteSubEu* noteSubEu, NoteSynthesisS
}
/**
- * The Haas Effect gives directionality to sound by appling a small (< 35ms) delay to either the left or right channel.
+ * The Haas Effect gives directionality to sound by applying a small (< 35ms) delay to either the left or right channel.
* The delay is small enough that the sound is still perceived as one sound, but the channel that is not delayed will
* reach our ear first and give a sense of directionality. The sound is directed towards the opposite side of the delay.
*/
diff --git a/src/code/code_800E4FE0.c b/src/code/code_800E4FE0.c
index c1a75de4af..3b140b6cf7 100644
--- a/src/code/code_800E4FE0.c
+++ b/src/code/code_800E4FE0.c
@@ -573,7 +573,7 @@ s32 func_800E5F88(s32 resetPreloadID) {
void Audio_PreNMIInternal(void) {
gAudioContext.resetTimer = 1;
- if (gAudioContextInitalized) {
+ if (gAudioContextInitialized) {
func_800E5F88(0);
gAudioContext.resetStatus = 0;
}
diff --git a/src/code/code_800EC960.c b/src/code/code_800EC960.c
index 074fececa9..98e3a03560 100644
--- a/src/code/code_800EC960.c
+++ b/src/code/code_800EC960.c
@@ -1267,7 +1267,8 @@ OcarinaNote sScarecrowsLongSongSecondNote;
u8 sAudioHasMalonBgm;
f32 sAudioMalonBgmDist;
-void PadMgr_RequestPadData(PadMgr* padmgr, Input* inputs, s32 mode);
+void PadMgr_RequestPadData(PadMgr* padMgr, Input* inputs, s32 gameRequest);
+
void Audio_StepFreqLerp(FreqLerp* lerp);
void func_800F56A8(void);
void Audio_PlayNatureAmbienceSequence(u8 natureAmbienceId);
@@ -1292,11 +1293,11 @@ void AudioOcarina_SetCustomButtonMapping(u8 useCustom) {
}
void AudioOcarina_ReadControllerInput(void) {
- Input inputs[4];
+ Input inputs[MAXCONTROLLERS];
Input* input = &inputs[0];
u32 ocarinaInputButtonPrev = sOcarinaInputButtonCur;
- PadMgr_RequestPadData(&gPadMgr, inputs, 0);
+ PadMgr_RequestPadData(&gPadMgr, inputs, false);
sOcarinaInputButtonCur = input->cur.button;
sOcarinaInputButtonPrev = ocarinaInputButtonPrev;
sOcarinaInputStickAdj.x = input->rel.stick_x;
@@ -2371,10 +2372,10 @@ u8 sAudioNatureFailed = false;
u8 sPeakNumNotes = 0;
void AudioDebug_SetInput(void) {
- Input inputs[4];
+ Input inputs[MAXCONTROLLERS];
u32 btn;
- PadMgr_RequestPadData(&gPadMgr, inputs, 0);
+ PadMgr_RequestPadData(&gPadMgr, inputs, false);
btn = inputs[3].cur.button;
sDebugPadHold = btn & 0xFFFF;
sDebugPadPress = (btn ^ sDebugPadBtnLast) & btn;
@@ -4854,7 +4855,7 @@ void Audio_SetSequenceMode(u8 seqMode) {
sPrevSeqMode = seqMode + 0x80;
}
} else {
- // Hyrule Field will play slightly different bgm music depending on whether player is standing
+ // Hyrule Field will play slightly different background music depending on whether player is standing
// still or moving. This is the logic to determine the transition between those two states
if (seqMode == SEQ_MODE_DEFAULT) {
if (sPrevSeqMode == SEQ_MODE_STILL) {
diff --git a/src/code/db_camera.c b/src/code/db_camera.c
index 3cb5ffa12e..a514f92dea 100644
--- a/src/code/db_camera.c
+++ b/src/code/db_camera.c
@@ -1,6 +1,8 @@
#include "ultra64.h"
#include "global.h"
+#define DBCAM_CONTROLLER_PORT 2
+
static PlayState* sPlay;
// TODO: cleanup these arrays and UB access
@@ -346,7 +348,7 @@ s32 func_800B4370(DbCamera* dbCamera, s16 idx, Camera* cam) {
void func_800B44E0(DbCamera* dbCamera, Camera* cam) {
s32 i;
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CRIGHT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CRIGHT)) {
sDbCamAnim.keyframe = 0;
sDbCamAnim.unk_0A = 1;
sDbCamAnim.curFrame = 0.0f;
@@ -597,7 +599,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
sp80 = &dbCamera->eye;
sp7C = &dbCamera->at;
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_Z)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_Z)) {
dbCamera->unk_00++;
dbCamera->unk_00 %= 3;
dbCamera->unk_38 = 1;
@@ -688,7 +690,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
}
dbCamera->unk_3C = D_80161140;
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_B | BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_B | BTN_L)) {
sp104.r += temp_f2;
if (sp104.r > 30000.0f) {
@@ -702,7 +704,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
}
dbCamera->unk_40 = 7;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_B)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_B)) {
spFC = sp104;
spFC.r = temp_f2;
if (!D_80161144) {
@@ -719,7 +721,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_44 = 0;
}
dbCamera->unk_40 = 0xB;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_A | BTN_L)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_A | BTN_L)) {
sp104.r -= temp_f2;
if (sp104.r < 10.0f) {
sp104.r = 10.0f;
@@ -730,7 +732,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_44 = 0;
}
dbCamera->unk_40 = 8;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_A)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_A)) {
spFC = sp104;
spFC.r = -temp_f2;
if (!D_80161144) {
@@ -752,7 +754,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_40 = -1;
}
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_DDOWN | BTN_L)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_DDOWN | BTN_L)) {
spFC = sp104;
spFC.r = temp_f2;
spFC.pitch = 0;
@@ -770,7 +772,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_44 = 0;
}
dbCamera->unk_40 = 1;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_DUP | BTN_L)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_DUP | BTN_L)) {
spFC = sp104;
spFC.r = -temp_f2;
spFC.pitch = 0;
@@ -787,7 +789,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_44 = 0;
}
dbCamera->unk_40 = 2;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_DUP)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_DUP)) {
spFC = sp104;
spFC.r = temp_f2;
spFC.pitch = 0x3FFF;
@@ -803,7 +805,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_44 = 0;
}
dbCamera->unk_40 = 3;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_DDOWN)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_DDOWN)) {
spFC = sp104;
spFC.r = temp_f2;
spFC.pitch = -0x3FFF;
@@ -819,8 +821,8 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_44 = 0;
}
dbCamera->unk_40 = 4;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, (BTN_DRIGHT | BTN_L)) ||
- CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_DRIGHT)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, (BTN_DRIGHT | BTN_L)) ||
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_DRIGHT)) {
spFC = sp104;
spFC.r = temp_f2;
spFC.pitch = 0;
@@ -837,8 +839,8 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_44 = 0;
}
dbCamera->unk_40 = 5;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, (BTN_DLEFT | BTN_L)) ||
- CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_DLEFT)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, (BTN_DLEFT | BTN_L)) ||
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_DLEFT)) {
spFC = sp104;
spFC.r = temp_f2;
spFC.pitch = 0;
@@ -855,7 +857,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_44 = 0;
}
dbCamera->unk_40 = 6;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_B | BTN_L)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_B | BTN_L)) {
sp104.r = sp104.r + temp_f2;
if (sp104.r > 30000.0f) {
sp104.r = 30000.0f;
@@ -866,7 +868,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_44 = 0;
}
dbCamera->unk_40 = 7;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_B)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_B)) {
spFC = sp104;
spFC.r = temp_f2;
if (!D_80161144) {
@@ -883,7 +885,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_44 = 0;
}
dbCamera->unk_40 = 0xB;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_A | BTN_L)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_A | BTN_L)) {
sp104.r -= temp_f2;
if (sp104.r < 10.0f) {
@@ -895,7 +897,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_44 = 0;
}
dbCamera->unk_40 = 8;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_A)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_A)) {
spFC = sp104;
spFC.r = -temp_f2;
if (!D_80161144) {
@@ -917,7 +919,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->unk_40 = -1;
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_R)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_R)) {
if (dbCamera->unk_00 == 0) {
dbCamera->sub.unk_104A = cam->inputDir;
*sp7C = cam->at;
@@ -932,13 +934,13 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
func_800B41DC(dbCamera, dbCamera->sub.unkIdx, cam);
} else {
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_R) &&
- CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_R) &&
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
Audio_PlaySfxGeneral(NA_SE_SY_CANCEL, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->sub.nPoints = dbCamera->sub.unkIdx + 1;
func_800B4088(dbCamera, cam);
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_R)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_R)) {
if (dbCamera->sub.unkIdx == 0x80) {
Audio_PlaySfxGeneral(NA_SE_SY_ERROR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
@@ -955,8 +957,8 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
}
}
} else {
- temp_f0_5 = sPlay->state.input[2].rel.stick_y;
- temp_f2_2 = sPlay->state.input[2].rel.stick_x;
+ temp_f0_5 = sPlay->state.input[DBCAM_CONTROLLER_PORT].rel.stick_y;
+ temp_f2_2 = sPlay->state.input[DBCAM_CONTROLLER_PORT].rel.stick_x;
pitch = CAM_DEG_TO_BINANG((SQ(temp_f0_5) / 600.0f) * 0.8f);
yaw = CAM_DEG_TO_BINANG((SQ(temp_f2_2) / 600.0f) * 0.8f);
if (!D_80161144) {
@@ -977,7 +979,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
DbCamera_CalcUpFromPitchYawRoll(&dbCamera->unk_1C, spF4.pitch, spF4.yaw,
CAM_DEG_TO_BINANG(dbCamera->rollDegrees));
if (dbCamera->unk_00 == 1) {
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_CRIGHT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_CRIGHT)) {
cam->inputDir = dbCamera->sub.unk_104A;
new_var2 = OLib_Vec3fDist(&cam->at, &cam->eye);
cam->at = *sp7C;
@@ -991,12 +993,12 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
if (dbCamera->unk_00 == 1) {
OREG(0) = 8;
func_8006376C(0xC, 5, 0, D_8012CEF4);
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_CRIGHT) &&
- !CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_CRIGHT) &&
+ !CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
func_800B44E0(dbCamera, cam);
} else {
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CRIGHT) &&
- CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CRIGHT) &&
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
Audio_PlaySfxGeneral(NA_SE_SY_GET_RUPY, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
osSyncPrintf("@@@\n@@@\n@@@/* *** spline point data ** start here *** */\n@@@\n");
@@ -1006,14 +1008,14 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
osSyncPrintf("@@@static short nFrames = %d;\n@@@\n", dbCamera->sub.nFrames);
osSyncPrintf("@@@static short Mode = %d;\n@@@\n", dbCamera->sub.mode);
osSyncPrintf("@@@\n@@@\n@@@/* *** spline point data ** finish! *** */\n@@@\n");
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CLEFT)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CLEFT)) {
Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->sub.unk_08 = (dbCamera->sub.unk_08 + 1) % 3;
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CUP) &&
- CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CUP) &&
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
Audio_PlaySfxGeneral(NA_SE_IT_SWORD_IMPACT, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
if (dbCamera->sub.unkIdx > 0) {
@@ -1022,7 +1024,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->sub.unkIdx = dbCamera->sub.nPoints - 1;
}
} else {
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CUP)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CUP)) {
Audio_PlaySfxGeneral(NA_SE_IT_SWORD_IMPACT, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
if (dbCamera->sub.unkIdx > 0) {
@@ -1043,8 +1045,8 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
}
}
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L) &&
- CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CDOWN)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L) &&
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CDOWN)) {
Audio_PlaySfxGeneral(NA_SE_IT_SWORD_IMPACT, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
if (dbCamera->sub.unkIdx < (dbCamera->sub.nPoints - 1)) {
@@ -1053,7 +1055,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->sub.unkIdx = 0;
}
} else {
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CDOWN)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CDOWN)) {
Audio_PlaySfxGeneral(NA_SE_IT_SWORD_IMPACT, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
if (dbCamera->sub.unkIdx < (dbCamera->sub.nPoints - 1)) {
@@ -1123,7 +1125,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
break;
case 1:
dbCamera->unk_3C = true;
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DUP)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DUP)) {
Audio_PlaySfxGeneral(NA_SE_SY_ATTENTION_ON, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
if (dbCamera->sub.unk_0A == 0) {
@@ -1132,7 +1134,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->sub.unk_0A--;
}
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DDOWN)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DDOWN)) {
Audio_PlaySfxGeneral(NA_SE_SY_ATTENTION_ON, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
if (dbCamera->sub.unk_0A == 5) {
@@ -1141,12 +1143,12 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->sub.unk_0A++;
}
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DLEFT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DLEFT)) {
Audio_PlaySfxGeneral(NA_SE_SY_ATTENTION_ON, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
switch (dbCamera->sub.unk_0A) {
case 1:
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
dbCamera->sub.lookAt[dbCamera->sub.unkIdx].nextPointFrame -= 5;
} else {
dbCamera->sub.lookAt[dbCamera->sub.unkIdx].nextPointFrame--;
@@ -1178,7 +1180,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->sub.unk_0C = false;
break;
case 2:
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll -= 5;
dbCamera->roll = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll;
} else {
@@ -1190,7 +1192,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
}
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_DLEFT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_DLEFT)) {
if ((D_8012D10C++ % 5) == 0) {
Audio_PlaySfxGeneral(NA_SE_SY_ATTENTION_ON, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
@@ -1198,7 +1200,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
switch (dbCamera->sub.unk_0A) {
case 0:
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle -= 1.0f;
dbCamera->fov = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle;
} else {
@@ -1207,7 +1209,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
}
break;
case 5:
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
dbCamera->sub.nFrames -= 10;
} else {
dbCamera->sub.nFrames--;
@@ -1229,13 +1231,13 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
}
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DRIGHT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DRIGHT)) {
Audio_PlaySfxGeneral(NA_SE_SY_ATTENTION_ON, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
switch (dbCamera->sub.unk_0A) {
case 1:
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
dbCamera->sub.lookAt[dbCamera->sub.unkIdx].nextPointFrame += 5;
} else {
dbCamera->sub.lookAt[dbCamera->sub.unkIdx].nextPointFrame++;
@@ -1267,7 +1269,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->sub.unk_0C = true;
break;
case 2:
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll += 5;
dbCamera->roll = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].cameraRoll;
} else {
@@ -1278,7 +1280,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
break;
}
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_DRIGHT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_DRIGHT)) {
if ((D_8012D10C++ % 5) == 0) {
Audio_PlaySfxGeneral(NA_SE_SY_ATTENTION_ON, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
@@ -1286,7 +1288,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
switch (dbCamera->sub.unk_0A) {
case 0:
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle += 1.0f;
dbCamera->fov = dbCamera->sub.lookAt[dbCamera->sub.unkIdx].viewAngle;
} else {
@@ -1295,7 +1297,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
}
break;
case 5:
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
dbCamera->sub.nFrames += 10;
} else {
dbCamera->sub.nFrames++;
@@ -1432,7 +1434,7 @@ void DbCamera_Update(DbCamera* dbCamera, Camera* cam) {
dbCamera->roll = 0;
dbCamera->fov = 60.0f;
dbCamera->rollDegrees = dbCamera->roll * 1.40625f;
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CLEFT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CLEFT)) {
Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->unk_78 = (dbCamera->unk_78 + 1) % 3;
@@ -1603,7 +1605,7 @@ s32 DbCamera_LoadCallback(char* c) {
}
}
- if (!Mempak_Read(2, *c, sDbCameraCuts, 0, sizeof(sDbCameraCuts))) {
+ if (!Mempak_Read(DBCAM_CONTROLLER_PORT, *c, sDbCameraCuts, 0, sizeof(sDbCameraCuts))) {
return false;
}
@@ -1618,7 +1620,7 @@ s32 DbCamera_LoadCallback(char* c) {
osSyncPrintf("%s: %d: デバッグカメラ メモリ確保失敗!!\n", "../db_camera.c", 2847);
return false;
}
- if (!Mempak_Read(2, *c, sDbCameraCuts[i].lookAt, off, ALIGN32(size))) {
+ if (!Mempak_Read(DBCAM_CONTROLLER_PORT, *c, sDbCameraCuts[i].lookAt, off, ALIGN32(size))) {
return false;
}
off += ALIGN32(size);
@@ -1629,7 +1631,7 @@ s32 DbCamera_LoadCallback(char* c) {
osSyncPrintf("%s: %d: デバッグカメラ メモリ確保失敗!!\n", "../db_camera.c", 2858);
return false;
}
- if (!Mempak_Read(2, *c, sDbCameraCuts[i].position, off, ALIGN32(size))) {
+ if (!Mempak_Read(DBCAM_CONTROLLER_PORT, *c, sDbCameraCuts[i].position, off, ALIGN32(size))) {
return false;
}
off += ALIGN32(size);
@@ -1649,16 +1651,16 @@ s32 DbCamera_SaveCallback(char* c) {
s32 size;
s32 i;
- ret = Mempak_GetFileSize(2, *c);
- freeSize = Mempak_GetFreeBytes(2);
+ ret = Mempak_GetFileSize(DBCAM_CONTROLLER_PORT, *c);
+ freeSize = Mempak_GetFreeBytes(DBCAM_CONTROLLER_PORT);
if ((u32)sAllocSize < (freeSize + ret)) {
- if (!Mempak_Alloc(2, c, sAllocSize)) {
+ if (!Mempak_Alloc(DBCAM_CONTROLLER_PORT, c, sAllocSize)) {
return false;
}
- if (!Mempak_Write(2, *c, sDbCameraCuts, 0, sizeof(sDbCameraCuts))) {
- Mempak_DeleteFile(2, *c);
+ if (!Mempak_Write(DBCAM_CONTROLLER_PORT, *c, sDbCameraCuts, 0, sizeof(sDbCameraCuts))) {
+ Mempak_DeleteFile(DBCAM_CONTROLLER_PORT, *c);
return false;
}
@@ -1667,13 +1669,13 @@ s32 DbCamera_SaveCallback(char* c) {
if (sDbCameraCuts[i].letter != '?') {
size = sDbCameraCuts[i].nPoints * sizeof(CutsceneCameraPoint);
- ret = Mempak_Write(2, *c, sDbCameraCuts[i].lookAt, off, ALIGN32(size));
+ ret = Mempak_Write(DBCAM_CONTROLLER_PORT, *c, sDbCameraCuts[i].lookAt, off, ALIGN32(size));
if (!ret) {
break;
}
off += ALIGN32(size);
- ret = Mempak_Write(2, *c, sDbCameraCuts[i].position, off, ALIGN32(size));
+ ret = Mempak_Write(DBCAM_CONTROLLER_PORT, *c, sDbCameraCuts[i].position, off, ALIGN32(size));
if (!ret) {
break;
}
@@ -1686,7 +1688,7 @@ s32 DbCamera_SaveCallback(char* c) {
if (ret) {
return *c;
} else {
- Mempak_DeleteFile(2, *c);
+ Mempak_DeleteFile(DBCAM_CONTROLLER_PORT, *c);
return false;
}
}
@@ -1695,7 +1697,7 @@ s32 DbCamera_SaveCallback(char* c) {
}
s32 DbCamera_ClearCallback(char* c) {
- return Mempak_DeleteFile(2, *c);
+ return Mempak_DeleteFile(DBCAM_CONTROLLER_PORT, *c);
}
void DbCamera_DrawSlotLetters(char* str, s16 y, s16 x, s32 colorIndex) {
@@ -1861,8 +1863,8 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
case DEMO_CTRL_MENU(ACTION_LOAD, MENU_INFO):
case DEMO_CTRL_MENU(ACTION_CLEAR, MENU_INFO): {
if ((1 << sCurFileIdx) & sMempakFiles) {
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DLEFT) ||
- CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DRIGHT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DLEFT) ||
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DRIGHT)) {
Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->sub.demoCtrlToggleSwitch ^= 1;
@@ -1875,7 +1877,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
func_8006376C(0x11, 8, dbCamera->sub.demoCtrlToggleSwitch ? 4 : 7, D_8012CF94);
func_8006376C(0x15, 8, dbCamera->sub.demoCtrlToggleSwitch ? 7 : 4, D_8012CF98);
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_A)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_A)) {
if (dbCamera->sub.demoCtrlToggleSwitch == 0) {
Audio_PlaySfxGeneral(NA_SE_SY_DECIDE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
@@ -1897,7 +1899,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
func_8006376C(0xD, 9, dbCamera->sub.demoCtrlToggleSwitch ? 1 : 6, "PRESS B BUTTON");
}
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_B)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B)) {
Audio_PlaySfxGeneral(NA_SE_SY_CANCEL, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->sub.demoCtrlMenu = 0;
@@ -1933,8 +1935,8 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
func_8006376C(0x17, 7, 5, D_8012CFA4);
func_8006376C(0xD, 9, (dbCamera->sub.demoCtrlToggleSwitch != 0) ? 1 : 6, "PRESS B BUTTON");
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_A) ||
- CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_B)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_A) ||
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B)) {
Audio_PlaySfxGeneral(NA_SE_SY_DECIDE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
if (dbCamera->sub.demoCtrlMenu == DEMO_CTRL_MENU(ACTION_LOAD, MENU_SUCCESS)) {
@@ -1956,8 +1958,8 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
func_8006376C(0x17, 7, 5, D_8012CFA4);
func_8006376C(0xD, 9, (dbCamera->sub.demoCtrlToggleSwitch != 0) ? 1 : 6, "PRESS B BUTTON");
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_A) ||
- CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_B)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_A) ||
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B)) {
Audio_PlaySfxGeneral(NA_SE_SY_DECIDE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->sub.demoCtrlMenu -= 9;
@@ -1970,12 +1972,12 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
goto block_1;
default: {
- if (Mempak_Init(2)) {
- sMempakFiles = Mempak_FindFile(2, 'A', 'E');
+ if (Mempak_Init(DBCAM_CONTROLLER_PORT)) {
+ sMempakFiles = Mempak_FindFile(DBCAM_CONTROLLER_PORT, 'A', 'E');
dbCamera->sub.demoCtrlMenu = DEMO_CTRL_MENU(ACTION_E, MENU_CALLBACK);
DbCamera_CalcMempakAllocSize();
if ((1 << sCurFileIdx) & sMempakFiles) {
- sMempakFilesize = Mempak_GetFileSize(2, sCurFileIdx + 'A');
+ sMempakFilesize = Mempak_GetFileSize(DBCAM_CONTROLLER_PORT, sCurFileIdx + 'A');
dbCamera->sub.demoCtrlActionIdx = ACTION_LOAD;
} else {
sMempakFilesize = 0;
@@ -1992,7 +1994,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
sp74[i * 2 + 0] = '-';
sp74[i * 2 + 1] = '\0';
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DRIGHT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DRIGHT)) {
Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
if (sCurFileIdx >= 4) {
@@ -2002,14 +2004,14 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
}
if ((1 << sCurFileIdx) & sMempakFiles) {
- sMempakFilesize = Mempak_GetFileSize(2, sCurFileIdx + 'A');
+ sMempakFilesize = Mempak_GetFileSize(DBCAM_CONTROLLER_PORT, sCurFileIdx + 'A');
dbCamera->sub.demoCtrlActionIdx = ACTION_LOAD;
} else {
sMempakFilesize = 0;
dbCamera->sub.demoCtrlActionIdx = ACTION_SAVE;
}
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DLEFT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DLEFT)) {
Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
if (sCurFileIdx <= 0) {
@@ -2019,7 +2021,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
}
if ((1 << sCurFileIdx) & sMempakFiles) {
- sMempakFilesize = Mempak_GetFileSize(2, sCurFileIdx + 'A');
+ sMempakFilesize = Mempak_GetFileSize(DBCAM_CONTROLLER_PORT, sCurFileIdx + 'A');
dbCamera->sub.demoCtrlActionIdx = ACTION_LOAD;
} else {
sMempakFilesize = 0;
@@ -2034,7 +2036,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
DbCamera_SetTextValue(DbCamera_GetMempakAllocSize(), sp74, 6);
func_8006376C(0xD, 9, 6, D_8012CF78); // NEED BYTE
func_8006376C(0x11, 9, 4, sp74);
- DbCamera_SetTextValue(Mempak_GetFreeBytes(2), sp74, 6);
+ DbCamera_SetTextValue(Mempak_GetFreeBytes(DBCAM_CONTROLLER_PORT), sp74, 6);
func_8006376C(0xD, 0xA, 6, D_8012CF74); // FREE BYTE
func_8006376C(0x11, 0xA, 4, sp74);
if (sMempakFilesize != 0) {
@@ -2052,24 +2054,24 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
func_8006376C(0xD, 0x1A, 5, D_8012CF60[0]);
func_8006376C(0x14, 0x1A, 5, D_8012CF70);
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DUP)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DUP)) {
Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->sub.demoCtrlActionIdx = (dbCamera->sub.demoCtrlActionIdx - 1) % 4u;
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DDOWN)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DDOWN)) {
Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->sub.demoCtrlActionIdx = (dbCamera->sub.demoCtrlActionIdx + 1) % 4u;
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_A)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_A)) {
Audio_PlaySfxGeneral(NA_SE_SY_DECIDE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->sub.demoCtrlToggleSwitch = 0;
dbCamera->sub.demoCtrlMenu = DEMO_CTRL_MENU(dbCamera->sub.demoCtrlActionIdx, MENU_INFO);
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_B)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B)) {
Audio_PlaySfxGeneral(NA_SE_SY_CANCEL, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->sub.demoCtrlActionIdx = ACTION_E;
@@ -2079,9 +2081,9 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
} else {
func_8006376C(0xC, 0x1A, 4, D_8012CF60[0]);
func_8006376C(0x13, 0x1A, 4, D_8012CF80);
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_B) ||
- CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DUP) ||
- CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DDOWN)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B) ||
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DUP) ||
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DDOWN)) {
Audio_PlaySfxGeneral(NA_SE_SY_CANCEL, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
@@ -2095,14 +2097,14 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
break;
default: {
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DUP)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DUP)) {
Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->sub.demoCtrlMenu = DEMO_CTRL_MENU(ACTION_E, MENU_INFO);
dbCamera->sub.demoCtrlActionIdx = (dbCamera->sub.demoCtrlActionIdx - 1) % 4u;
sCurFileIdx = 0;
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DDOWN)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DDOWN)) {
Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
dbCamera->sub.demoCtrlMenu = DEMO_CTRL_MENU(ACTION_E, MENU_INFO);
@@ -2116,7 +2118,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
func_8006376C(4, 7, 5, D_8012CF4C);
func_8006376C(D_8016110C * 2 + 6, 7, 7, ">");
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CUP)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CUP)) {
if (D_8016110C > 0) {
D_8016110C--;
}
@@ -2124,7 +2126,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
sDbCamAnim.curFrame = 0.0f;
sDbCamAnim.keyframe = 0;
sDbCamAnim.unk_04 = 0;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CDOWN)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CDOWN)) {
if (D_8016110C < 14) {
D_8016110C++;
}
@@ -2132,7 +2134,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
sDbCamAnim.curFrame = 0.0f;
sDbCamAnim.keyframe = 0;
sDbCamAnim.unk_04 = 0;
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CLEFT)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CLEFT)) {
sDbCamAnim.unk_0A = 0;
Interface_ChangeAlpha(2);
Letterbox_SetSizeTarget(0);
@@ -2166,7 +2168,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_L)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_L)) {
if (sp74[sCurFileIdx] == '?') {
sLastFileIdx = -1;
D_801612EA = '*';
@@ -2175,7 +2177,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
D_801612EA = sDbCameraCuts[idx1].letter;
}
if (1) {}
- } else if (!CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L)) {
+ } else if (!CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L)) {
if (sLastFileIdx != -1) {
switch (sp74[sCurFileIdx]) {
case '?':
@@ -2217,7 +2219,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
sLastFileIdx = -1;
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_A)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_A)) {
if (sp74[sCurFileIdx] == '?') {
Audio_PlaySfxGeneral(NA_SE_SY_DECIDE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
@@ -2228,7 +2230,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
}
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_B)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_B)) {
if (sp74[sCurFileIdx] != '?' && sp74[sCurFileIdx] != '-') {
Audio_PlaySfxGeneral(NA_SE_SY_CANCEL, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
@@ -2237,7 +2239,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
}
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_R)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_R)) {
if (sp74[sCurFileIdx] != '?' && sp74[sCurFileIdx] != '-') {
Audio_PlaySfxGeneral(NA_SE_SY_DECIDE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
@@ -2261,7 +2263,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
}
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DRIGHT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DRIGHT)) {
Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
if (sCurFileIdx == 0x1E) {
@@ -2270,22 +2272,22 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
sCurFileIdx++;
}
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_DLEFT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_DLEFT)) {
Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
sCurFileIdx = (sCurFileIdx == 0) ? 0x1E : sCurFileIdx - 1;
}
- if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L) &&
- CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CRIGHT)) {
+ if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L) &&
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CRIGHT)) {
for (i = 0; i < ARRAY_COUNT(sDbCameraCuts) - 1; i++) {
osSyncPrintf("###%2d:(%c) (%d %d) %d %d %d\n", i, sDbCameraCuts[i].letter,
sDbCameraCuts[i].position, sDbCameraCuts[i].lookAt, sDbCameraCuts[i].nFrames,
sDbCameraCuts[i].nPoints, sDbCameraCuts[i].mode);
}
DbCamera_PrintAllCuts(cam);
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].cur.button, BTN_L) &&
- CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CLEFT)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].cur.button, BTN_L) &&
+ CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CLEFT)) {
Audio_PlaySfxGeneral(NA_SE_SY_GET_RUPY, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale,
&gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb);
for (i = 0; i < ARRAY_COUNT(sDbCameraCuts) - 1; i++) {
@@ -2294,7 +2296,7 @@ s32 DbCamera_UpdateDemoControl(DbCamera* dbCamera, Camera* cam) {
DbCamera_PrintCutBytes(&sDbCameraCuts[i]);
}
}
- } else if (CHECK_BTN_ALL(sPlay->state.input[2].press.button, BTN_CRIGHT)) {
+ } else if (CHECK_BTN_ALL(sPlay->state.input[DBCAM_CONTROLLER_PORT].press.button, BTN_CRIGHT)) {
sDbCamAnim.curFrame = 0.0f;
sDbCamAnim.keyframe = 0;
sDbCamAnim.unk_04 = 0.0f;
diff --git a/src/code/debug_malloc.c b/src/code/debug_malloc.c
index 60c7607cb5..670ce857ab 100644
--- a/src/code/debug_malloc.c
+++ b/src/code/debug_malloc.c
@@ -106,6 +106,6 @@ void DebugArena_Cleanup(void) {
__osMallocCleanup(&sDebugArena);
}
-u8 DebugArena_IsInitalized(void) {
- return __osMallocIsInitalized(&sDebugArena);
+u8 DebugArena_IsInitialized(void) {
+ return __osMallocIsInitialized(&sDebugArena);
}
diff --git a/src/code/fault.c b/src/code/fault.c
index 6edb90b555..c2cfe16315 100644
--- a/src/code/fault.c
+++ b/src/code/fault.c
@@ -352,18 +352,25 @@ void Fault_Sleep(u32 msec) {
Fault_SleepImpl(msec);
}
-void PadMgr_RequestPadData(Input* input, s32 mode);
+#ifndef AVOID_UB
+void PadMgr_RequestPadData(Input* inputs, s32 gameRequest);
+#endif
-void Fault_PadCallback(Input* input) {
+void Fault_PadCallback(Input* inputs) {
//! @bug This function is not called correctly, it is missing a leading PadMgr* argument. This
//! renders the crash screen unusable.
//! In Majora's Mask, PadMgr functions were changed to not require this argument, and this was
//! likely just not addressed when backporting.
- PadMgr_RequestPadData(input, 0);
+#ifndef AVOID_UB
+ PadMgr_RequestPadData(inputs, false);
+#else
+ // Guarantee crashing behavior: false -> NULL, previous value in a2 is more often non-zero than zero
+ PadMgr_RequestPadData((PadMgr*)inputs, NULL, true);
+#endif
}
void Fault_UpdatePadImpl(void) {
- sFaultInstance->padCallback(&sFaultInstance->padInput);
+ sFaultInstance->padCallback(sFaultInstance->inputs);
}
/**
@@ -376,7 +383,7 @@ void Fault_UpdatePadImpl(void) {
* DPad-Left continues and returns false
*/
u32 Fault_WaitForInputImpl(void) {
- Input* input = &sFaultInstance->padInput;
+ Input* input = &sFaultInstance->inputs[0];
s32 count = 600;
u32 pressedBtn;
@@ -651,7 +658,7 @@ void Fault_Wait5Seconds(void) {
* (L & R & Z) + DPad-Up + C-Down + C-Up + DPad-Down + DPad-Left + C-Left + C-Right + DPad-Right + (B & A & START)
*/
void Fault_WaitForButtonCombo(void) {
- Input* input = &sFaultInstance->padInput;
+ Input* input = &sFaultInstance->inputs[0];
s32 state;
u32 s1;
u32 s2;
@@ -853,7 +860,7 @@ void Fault_DrawMemDumpContents(const char* title, uintptr_t addr, u32 arg2) {
* @param cRightJump Unused parameter, pressing C-Right jumps to this address
*/
void Fault_DrawMemDump(uintptr_t pc, uintptr_t sp, uintptr_t cLeftJump, uintptr_t cRightJump) {
- Input* input = &sFaultInstance->padInput;
+ Input* input = &sFaultInstance->inputs[0];
uintptr_t addr = pc;
s32 scrollCountdown;
u32 off;
diff --git a/src/code/game.c b/src/code/game.c
index 68a7057196..ad5f752388 100644
--- a/src/code/game.c
+++ b/src/code/game.c
@@ -227,10 +227,10 @@ void func_800C49F4(GraphicsContext* gfxCtx) {
CLOSE_DISPS(gfxCtx, "../game.c", 865);
}
-void PadMgr_RequestPadData(PadMgr*, Input*, s32);
+void PadMgr_RequestPadData(PadMgr* padMgr, Input* inputs, s32 gameRequest);
void GameState_ReqPadData(GameState* gameState) {
- PadMgr_RequestPadData(&gPadMgr, &gameState->input[0], 1);
+ PadMgr_RequestPadData(&gPadMgr, gameState->input, true);
}
void GameState_Update(GameState* gameState) {
diff --git a/src/code/mempak.c b/src/code/mempak.c
index e423c6666d..2ccf151351 100644
--- a/src/code/mempak.c
+++ b/src/code/mempak.c
@@ -17,14 +17,14 @@ s32 Mempak_Init(s32 controllerNb) {
s32 pad;
s32 ret = false;
- mq = PadMgr_LockSerialMesgQueue(&gPadMgr);
+ mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
if (!osPfsInitPak(mq, &sMempakPfsHandle, controllerNb)) {
ret = true;
}
osPfsFreeBlocks(&sMempakPfsHandle, &sMempakFreeBytes);
- PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq);
+ PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
return ret;
}
@@ -40,7 +40,7 @@ s32 Mempak_FindFile(s32 controllerNb, char start, char end) {
u32 bit = 1;
s32 flag = 0;
- mq = PadMgr_LockSerialMesgQueue(&gPadMgr);
+ mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
for (idx = start; idx <= end; idx++) {
sMempakExtName[0] = idx - 0x27;
@@ -57,7 +57,7 @@ s32 Mempak_FindFile(s32 controllerNb, char start, char end) {
osSyncPrintf("mempak: find '%c' (%d)\n", idx, error);
}
- PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq);
+ PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
osSyncPrintf("mempak: find '%c' - '%c' %02x\n", start, end, flag);
return flag;
@@ -69,7 +69,7 @@ s32 Mempak_Write(s32 controllerNb, char idx, void* buffer, s32 offset, s32 size)
s32 ret = false;
s32 pad;
- mq = PadMgr_LockSerialMesgQueue(&gPadMgr);
+ mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
if (size < sMempakFreeBytes) {
error = osPfsReadWriteFile(&sMempakPfsHandle, sMempakFiles[idx - 'A'], 1, offset, size, buffer);
@@ -78,7 +78,7 @@ s32 Mempak_Write(s32 controllerNb, char idx, void* buffer, s32 offset, s32 size)
}
osSyncPrintf("mempak: write %d byte '%c' (%d)->%d\n", size, idx, sMempakFiles[idx - 'A'], error);
}
- PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq);
+ PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
return ret;
}
@@ -89,7 +89,7 @@ s32 Mempak_Read(s32 controllerNb, char idx, void* buffer, s32 offset, s32 size)
s32 ret = false;
s32 pad;
- mq = PadMgr_LockSerialMesgQueue(&gPadMgr);
+ mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
if (size < sMempakFreeBytes) {
error = osPfsReadWriteFile(&sMempakPfsHandle, sMempakFiles[idx - 'A'], 0, offset, size, buffer);
@@ -98,7 +98,7 @@ s32 Mempak_Read(s32 controllerNb, char idx, void* buffer, s32 offset, s32 size)
}
osSyncPrintf("mempak: read %d byte '%c' (%d)<-%d\n", size, idx, sMempakFiles[idx - 'A'], error);
}
- PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq);
+ PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
return ret;
}
@@ -109,7 +109,7 @@ s32 Mempak_Alloc(s32 controllerNb, char* idx, s32 size) {
s32 i;
s32 pad;
- mq = PadMgr_LockSerialMesgQueue(&gPadMgr);
+ mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
if (*idx >= 'A' && *idx < 'L') {
sMempakExtName[0] = *idx - 0x27;
@@ -149,7 +149,7 @@ s32 Mempak_Alloc(s32 controllerNb, char* idx, s32 size) {
ret = 1;
}
}
- PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq);
+ PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
return ret;
}
@@ -159,7 +159,7 @@ s32 Mempak_DeleteFile(s32 controllerNb, char idx) {
s32 error;
s32 ret = false;
- mq = PadMgr_LockSerialMesgQueue(&gPadMgr);
+ mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
sMempakExtName[0] = idx - 0x27;
error = osPfsDeleteFile(&sMempakPfsHandle, sMempakCompanyCode, sMempakGameCode, sMempakGameName, sMempakExtName);
@@ -167,18 +167,18 @@ s32 Mempak_DeleteFile(s32 controllerNb, char idx) {
ret = true;
}
osSyncPrintf("mempak: delete '%c' (%d)\n", idx, error);
- PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq);
+ PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
return ret;
}
s32 Mempak_GetFileSize(s32 controllerNb, char idx) {
- OSMesgQueue* mq = PadMgr_LockSerialMesgQueue(&gPadMgr);
+ OSMesgQueue* mq = PadMgr_AcquireSerialEventQueue(&gPadMgr);
OSPfsState state;
s32 error = osPfsFileState(&sMempakPfsHandle, sMempakFiles[idx - 'A'], &state);
s32 pad;
- PadMgr_UnlockSerialMesgQueue(&gPadMgr, mq);
+ PadMgr_ReleaseSerialEventQueue(&gPadMgr, mq);
if (error != 0) {
return 0;
diff --git a/src/code/padmgr.c b/src/code/padmgr.c
index 160a5301f9..b8830d5a20 100644
--- a/src/code/padmgr.c
+++ b/src/code/padmgr.c
@@ -1,12 +1,74 @@
+/**
+ * @file padmgr.c
+ *
+ * This file implements communicating with joybus devices at a high level and serving the results to other threads.
+ *
+ * Any device that can be plugged into one of the four controller ports such as a standard N64 controller is a joybus
+ * device. Some joybus devices are also located inside the cartridge such as EEPROM for save data or the Real-Time
+ * Clock, however neither of these are used in Zelda64 and so this type of communication is unimplemented. Of the
+ * possible devices that can be plugged into the controller ports, the only device that padmgr will recognize and
+ * attempt to communicate with is the standard N64 controller.
+ *
+ * Communicating with these devices is broken down into various layers:
+ *
+ * Other threads : The rest of the program that will use the polled data
+ * |
+ * PadMgr : Manages devices, submits polling commands at vertical retrace
+ * |
+ * Libultra osCont* routines : Interface for building commands and safely using the Serial Interface
+ * |
+ * Serial Interface : Hardware unit for sending joybus commands and receiving data via DMA
+ * |
+ * PIF : Forwards joybus commands and receives response data from the devices
+ * |---¬---¬---¬-------¬
+ * 1 2 3 4 5 : The joybus devices plugged into the four controller ports or on the cartridge
+ *
+ * Joybus communication is handled on another thread as polling and receiving controller data is a slow process; the
+ * N64 programming manual section 26.2.4.1 quotes 2 milliseconds as the expected delay from calling
+ * `osContStartReadData` to receiving the data. By running this on a separate thread to the game state, work can be
+ * done while waiting for this operation to complete.
+ */
#include "global.h"
#include "vt.h"
-s32 D_8012D280 = 1;
+#define PADMGR_LOG(controllerNo, msg) \
+ if (1) { \
+ osSyncPrintf(VT_FGCOL(YELLOW)); \
+ /* padmgr: Controller %d: %s */ \
+ osSyncPrintf("padmgr: %dコン: %s\n", (controllerNo) + 1, (msg)); \
+ osSyncPrintf(VT_RST); \
+ } \
+ (void)0
-OSMesgQueue* PadMgr_LockSerialMesgQueue(PadMgr* padMgr) {
+#define LOG_SEVERITY_NOLOG 0
+#define LOG_SEVERITY_CRITICAL 1
+#define LOG_SEVERITY_ERROR 2
+#define LOG_SEVERITY_VERBOSE 3
+
+s32 gPadMgrLogSeverity = LOG_SEVERITY_CRITICAL;
+
+/**
+ * Acquires exclusive access to the serial event queue.
+ *
+ * When a DMA to/from PIF RAM completes, an SI interrupt is generated to notify the process that the DMA has completed
+ * and a message is posted to the serial event queue. If multiple processes are trying to use the SI at the same time
+ * it becomes ambiguous as to which DMA has completed, so a locking system is required to arbitrate access to the SI.
+ *
+ * Once the task requiring the serial event queue is complete, it should be released with a call to
+ * `PadMgr_ReleaseSerialEventQueue()`.
+ *
+ * If another process tries to acquire the event queue, the current thread will be blocked until the event queue is
+ * released. Note the possibility for a deadlock, if the thread that already holds the serial event queue attempts to
+ * acquire it again it will block forever.
+ *
+ * @return The message queue to which SI interrupt events are posted.
+ *
+ * @see PadMgr_ReleaseSerialEventQueue
+ */
+OSMesgQueue* PadMgr_AcquireSerialEventQueue(PadMgr* padMgr) {
OSMesgQueue* serialEventQueue = NULL;
- if (D_8012D280 > 2) {
+ if (gPadMgrLogSeverity >= LOG_SEVERITY_VERBOSE) {
// "serialMsgQ Waiting for lock"
osSyncPrintf("%2d %d serialMsgQロック待ち %08x %08x %08x\n", osGetThreadId(NULL),
MQ_GET_COUNT(&padMgr->serialLockQueue), padMgr, &padMgr->serialLockQueue, &serialEventQueue);
@@ -14,7 +76,7 @@ OSMesgQueue* PadMgr_LockSerialMesgQueue(PadMgr* padMgr) {
osRecvMesg(&padMgr->serialLockQueue, (OSMesg*)&serialEventQueue, OS_MESG_BLOCK);
- if (D_8012D280 > 2) {
+ if (gPadMgrLogSeverity >= LOG_SEVERITY_VERBOSE) {
// "serialMsgQ Locked"
osSyncPrintf("%2d %d serialMsgQをロックしました %08x\n", osGetThreadId(NULL),
MQ_GET_COUNT(&padMgr->serialLockQueue), serialEventQueue);
@@ -23,8 +85,15 @@ OSMesgQueue* PadMgr_LockSerialMesgQueue(PadMgr* padMgr) {
return serialEventQueue;
}
-void PadMgr_UnlockSerialMesgQueue(PadMgr* padMgr, OSMesgQueue* serialEventQueue) {
- if (D_8012D280 > 2) {
+/**
+ * Relinquishes access to the serial message queue, allowing another process to acquire and use it.
+ *
+ * @param serialEventQueue The serial message queue acquired by `PadMgr_AcquireSerialEventQueue`
+ *
+ * @see PadMgr_AcquireSerialEventQueue
+ */
+void PadMgr_ReleaseSerialEventQueue(PadMgr* padMgr, OSMesgQueue* serialEventQueue) {
+ if (gPadMgrLogSeverity >= LOG_SEVERITY_VERBOSE) {
// "serialMsgQ Unlock"
osSyncPrintf("%2d %d serialMsgQロック解除します %08x %08x %08x\n", osGetThreadId(NULL),
MQ_GET_COUNT(&padMgr->serialLockQueue), padMgr, &padMgr->serialLockQueue, serialEventQueue);
@@ -32,97 +101,99 @@ void PadMgr_UnlockSerialMesgQueue(PadMgr* padMgr, OSMesgQueue* serialEventQueue)
osSendMesg(&padMgr->serialLockQueue, (OSMesg)serialEventQueue, OS_MESG_BLOCK);
- if (D_8012D280 > 2) {
+ if (gPadMgrLogSeverity >= LOG_SEVERITY_VERBOSE) {
// "serialMsgQ Unlocked"
osSyncPrintf("%2d %d serialMsgQロック解除しました %08x %08x %08x\n", osGetThreadId(NULL),
MQ_GET_COUNT(&padMgr->serialLockQueue), padMgr, &padMgr->serialLockQueue, serialEventQueue);
}
}
+/**
+ * Locks controller input data while padmgr is reading new inputs or another thread is using the current inputs.
+ * This prevents new inputs overwriting the current inputs while they are in use.
+ *
+ * @see PadMgr_UnlockPadData
+ */
void PadMgr_LockPadData(PadMgr* padMgr) {
osRecvMesg(&padMgr->lockQueue, NULL, OS_MESG_BLOCK);
}
+/**
+ * Unlocks controller input data, allowing padmgr to read new inputs or another thread to access the most recently
+ * polled inputs.
+ *
+ * @see PadMgr_LockPadData
+ */
void PadMgr_UnlockPadData(PadMgr* padMgr) {
osSendMesg(&padMgr->lockQueue, NULL, OS_MESG_BLOCK);
}
-void PadMgr_RumbleControl(PadMgr* padMgr) {
- static u32 errcnt = 0;
- static u32 frame;
- s32 temp = 1;
+/**
+ * Activates the rumble pak for all controllers it is enabled on, stops it for all controllers it is disabled on and
+ * attempts to initialize it for a controller if it is not already initialized.
+ */
+void PadMgr_UpdateRumble(PadMgr* padMgr) {
+ static u32 sRumbleErrorCount = 0; // original name: "errcnt"
+ static u32 sRumbleUpdateCounter;
+ s32 motorStart = MOTOR_START; // required for matching?
s32 triedRumbleComm;
- OSMesgQueue* serialEventQueue = PadMgr_LockSerialMesgQueue(padMgr);
- s32 var4;
+ OSMesgQueue* serialEventQueue = PadMgr_AcquireSerialEventQueue(padMgr);
+ s32 ret;
s32 i;
- triedRumbleComm = 0;
+ triedRumbleComm = false;
- for (i = 0; i < 4; i++) {
+ for (i = 0; i < MAXCONTROLLERS; i++) {
if (padMgr->ctrlrIsConnected[i]) {
- if (padMgr->padStatus[i].status & 1) {
- if (padMgr->pakType[i] == temp) {
- if (padMgr->rumbleEnable[i] != 0) {
- if (padMgr->rumbleCounter[i] < 3) {
- // clang-format off
- if (1) {} osSyncPrintf(VT_FGCOL(YELLOW));
- // clang-format on
+ // Check status for whether a controller pak is connected
+ if (padMgr->padStatus[i].status & CONT_CARD_ON) {
+ if (padMgr->pakType[i] == CONT_PAK_RUMBLE) {
+ if (padMgr->rumbleEnable[i]) {
+ if (padMgr->rumbleTimer[i] < 3) {
+ // "Rumble pack brrr"
+ PADMGR_LOG(i, "振動パック ぶるぶるぶるぶる");
- // "Vibration pack jumble jumble"?
- osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パック ぶるぶるぶるぶる");
- osSyncPrintf(VT_RST);
+ // This should be the osMotorStart macro, however the temporary variable motorStart is
+ // currently required for matching
+ if (__osMotorAccess(&padMgr->rumblePfs[i], motorStart) != 0) {
+ padMgr->pakType[i] = CONT_PAK_NONE;
- if (__osMotorAccess(&padMgr->pfs[i], temp) != 0) {
- padMgr->pakType[i] = 0;
- osSyncPrintf(VT_FGCOL(YELLOW));
// "A communication error has occurred with the vibration pack"
- osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パックで通信エラーが発生しました");
- osSyncPrintf(VT_RST);
+ PADMGR_LOG(i, "振動パックで通信エラーが発生しました");
} else {
- padMgr->rumbleCounter[i] = 3;
+ padMgr->rumbleTimer[i] = 3;
}
- triedRumbleComm = 1;
+ triedRumbleComm = true;
}
} else {
- if (padMgr->rumbleCounter[i] != 0) {
- // clang-format off
- if (1) {} osSyncPrintf(VT_FGCOL(YELLOW));
- // clang-format on
-
+ if (padMgr->rumbleTimer[i] != 0) {
// "Stop vibration pack"
- osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パック 停止");
- osSyncPrintf(VT_RST);
+ PADMGR_LOG(i, "振動パック 停止");
+
+ if (osMotorStop(&padMgr->rumblePfs[i]) != 0) {
+ padMgr->pakType[i] = CONT_PAK_NONE;
- if (osMotorStop(&padMgr->pfs[i]) != 0) {
- padMgr->pakType[i] = 0;
- osSyncPrintf(VT_FGCOL(YELLOW));
// "A communication error has occurred with the vibration pack"
- osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パックで通信エラーが発生しました");
- osSyncPrintf(VT_RST);
+ PADMGR_LOG(i, "振動パックで通信エラーが発生しました");
} else {
- padMgr->rumbleCounter[i]--;
+ padMgr->rumbleTimer[i]--;
}
- triedRumbleComm = 1;
+ triedRumbleComm = true;
}
}
}
} else {
- if (padMgr->pakType[i] != 0) {
- if (padMgr->pakType[i] == 1) {
- osSyncPrintf(VT_FGCOL(YELLOW));
+ if (padMgr->pakType[i] != CONT_PAK_NONE) {
+ if (padMgr->pakType[i] == CONT_PAK_RUMBLE) {
// "It seems that a vibration pack was pulled out"
- osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パックが抜かれたようです");
- osSyncPrintf(VT_RST);
- padMgr->pakType[i] = 0;
+ PADMGR_LOG(i, "振動パックが抜かれたようです");
+ padMgr->pakType[i] = CONT_PAK_NONE;
} else {
- osSyncPrintf(VT_FGCOL(YELLOW));
// "It seems that a controller pack that is not a vibration pack was pulled out"
- osSyncPrintf("padmgr: %dコン: %s\n", i + 1,
- "振動パックではないコントローラパックが抜かれたようです");
- osSyncPrintf(VT_RST);
- padMgr->pakType[i] = 0;
+ PADMGR_LOG(i, "振動パックではないコントローラパックが抜かれたようです");
+ padMgr->pakType[i] = CONT_PAK_NONE;
}
}
}
@@ -130,128 +201,145 @@ void PadMgr_RumbleControl(PadMgr* padMgr) {
}
if (!triedRumbleComm) {
- i = frame % 4;
+ // Try to initialize the rumble pak for controller port `i` if a controller pak is connected and
+ // not already known to be an initialized a rumble pak
+ i = sRumbleUpdateCounter % MAXCONTROLLERS;
- if (padMgr->ctrlrIsConnected[i] && (padMgr->padStatus[i].status & 1) && (padMgr->pakType[i] != 1)) {
- var4 = osMotorInit(serialEventQueue, &padMgr->pfs[i], i);
+ if (padMgr->ctrlrIsConnected[i] && (padMgr->padStatus[i].status & CONT_CARD_ON) &&
+ padMgr->pakType[i] != CONT_PAK_RUMBLE) {
+ ret = osMotorInit(serialEventQueue, &padMgr->rumblePfs[i], i);
+
+ if (ret == 0) {
+ padMgr->pakType[i] = CONT_PAK_RUMBLE;
+ osMotorStart(&padMgr->rumblePfs[i]);
+ osMotorStop(&padMgr->rumblePfs[i]);
- if (var4 == 0) {
- padMgr->pakType[i] = 1;
- osMotorStart(&padMgr->pfs[i]);
- osMotorStop(&padMgr->pfs[i]);
- osSyncPrintf(VT_FGCOL(YELLOW));
// "Recognized vibration pack"
- osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パックを認識しました");
- osSyncPrintf(VT_RST);
- } else if (var4 == 11) {
- padMgr->pakType[i] = 2;
- } else if (var4 == 4) {
- LOG_NUM("++errcnt", ++errcnt, "../padmgr.c", 282);
- osSyncPrintf(VT_FGCOL(YELLOW));
+ PADMGR_LOG(i, "振動パックを認識しました");
+ } else if (ret == PFS_ERR_DEVICE) {
+ padMgr->pakType[i] = CONT_PAK_OTHER;
+ } else if (ret == PFS_ERR_CONTRFAIL) {
+ LOG_NUM("++errcnt", ++sRumbleErrorCount, "../padmgr.c", 282);
+
// "Controller pack communication error"
- osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "コントローラパックの通信エラー");
- osSyncPrintf(VT_RST);
+ PADMGR_LOG(i, "コントローラパックの通信エラー");
}
}
}
+ sRumbleUpdateCounter++;
- frame++;
- PadMgr_UnlockSerialMesgQueue(padMgr, serialEventQueue);
+ PadMgr_ReleaseSerialEventQueue(padMgr, serialEventQueue);
}
+/**
+ * Immediately stops rumble on all controllers
+ */
void PadMgr_RumbleStop(PadMgr* padMgr) {
s32 i;
- OSMesgQueue* serialEventQueue = PadMgr_LockSerialMesgQueue(padMgr);
+ OSMesgQueue* serialEventQueue = PadMgr_AcquireSerialEventQueue(padMgr);
- for (i = 0; i < 4; i++) {
- if (osMotorInit(serialEventQueue, &padMgr->pfs[i], i) == 0) {
- if ((gFaultMgr.msgId == 0) && (padMgr->rumbleOnFrames != 0)) {
- osSyncPrintf(VT_FGCOL(YELLOW));
- // "Stop vibration pack"
- osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "振動パック 停止");
- osSyncPrintf(VT_RST);
+ for (i = 0; i < MAXCONTROLLERS; i++) {
+ if (osMotorInit(serialEventQueue, &padMgr->rumblePfs[i], i) == 0) {
+ // If there is a rumble pak attached to this controller, stop it
+
+ if (gFaultMgr.msgId == 0 && padMgr->rumbleOnTimer != 0) {
+ // "Stop rumble pak"
+ PADMGR_LOG(i, "振動パック 停止");
}
-
- osMotorStop(&padMgr->pfs[i]);
+ osMotorStop(&padMgr->rumblePfs[i]);
}
}
- PadMgr_UnlockSerialMesgQueue(padMgr, serialEventQueue);
+ PadMgr_ReleaseSerialEventQueue(padMgr, serialEventQueue);
}
+/**
+ * Prevents rumble for 3 VI, ~0.05 seconds at 60 VI/sec
+ */
void PadMgr_RumbleReset(PadMgr* padMgr) {
- padMgr->rumbleOffFrames = 3;
+ padMgr->rumbleOffTimer = 3;
}
-void PadMgr_RumbleSetSingle(PadMgr* padMgr, u32 ctrlr, u32 rumble) {
- padMgr->rumbleEnable[ctrlr] = rumble;
- padMgr->rumbleOnFrames = 240;
+/**
+ * Enables or disables rumble on controller port `port` for 240 VI,
+ * ~4 seconds at 60 VI/sec and ~4.8 seconds at 50 VI/sec
+ */
+void PadMgr_RumbleSetSingle(PadMgr* padMgr, u32 port, u32 rumble) {
+ padMgr->rumbleEnable[port] = rumble;
+ padMgr->rumbleOnTimer = 240;
}
-void PadMgr_RumbleSet(PadMgr* padMgr, u8* ctrlrRumbles) {
+/**
+ * Enables or disables rumble on all controller ports for 240 VI,
+ * ~4 seconds at 60 VI/sec and ~4.8 seconds at 50 VI/sec
+ *
+ * @param enable Array of u8 of length MAXCONTROLLERS containing either true or false to enable or disable rumble
+ * for that controller
+ */
+void PadMgr_RumbleSet(PadMgr* padMgr, u8* enable) {
s32 i;
- for (i = 0; i < 4; i++) {
- padMgr->rumbleEnable[i] = ctrlrRumbles[i];
+ for (i = 0; i < MAXCONTROLLERS; i++) {
+ padMgr->rumbleEnable[i] = enable[i];
}
- padMgr->rumbleOnFrames = 240;
+ padMgr->rumbleOnTimer = 240;
}
-void PadMgr_ProcessInputs(PadMgr* padMgr) {
+/**
+ * Updates `padMgr->inputs` based on the error response of each controller
+ */
+void PadMgr_UpdateInputs(PadMgr* padMgr) {
s32 i;
Input* input;
- OSContPad* padnow1; // original name
+ OSContPad* pad; // original name: "padnow1"
s32 buttonDiff;
PadMgr_LockPadData(padMgr);
- input = &padMgr->inputs[0];
- padnow1 = &padMgr->pads[0];
-
- for (i = 0; i < padMgr->nControllers; i++, input++, padnow1++) {
+ for (input = &padMgr->inputs[0], pad = &padMgr->pads[0], i = 0; i < padMgr->nControllers; i++, input++, pad++) {
input->prev = input->cur;
- if (1) {} // Necessary to match
-
- switch (padnow1->errno) {
+ switch (pad->errno) {
case 0:
- input->cur = *padnow1;
+ // No error, copy inputs
+ input->cur = *pad;
if (!padMgr->ctrlrIsConnected[i]) {
padMgr->ctrlrIsConnected[i] = true;
- osSyncPrintf(VT_FGCOL(YELLOW));
- osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "認識しました"); // "Recognized"
- osSyncPrintf(VT_RST);
+ // "Recognized"
+ PADMGR_LOG(i, "認識しました");
}
break;
- case 4:
+ case (CHNL_ERR_OVERRUN >> 4):
+ // Overrun error, reuse previous inputs
input->cur = input->prev;
LOG_NUM("this->Key_switch[i]", padMgr->ctrlrIsConnected[i], "../padmgr.c", 380);
- osSyncPrintf(VT_FGCOL(YELLOW));
// "Overrun error occurred"
- osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "オーバーランエラーが発生");
- osSyncPrintf(VT_RST);
+ PADMGR_LOG(i, "オーバーランエラーが発生");
break;
- case 8:
+ case (CHNL_ERR_NORESP >> 4):
+ // No response error, take inputs as 0
input->cur.button = 0;
input->cur.stick_x = 0;
input->cur.stick_y = 0;
- input->cur.errno = padnow1->errno;
+ input->cur.errno = pad->errno;
if (padMgr->ctrlrIsConnected[i]) {
+ // If we get no response, consider the controller disconnected
padMgr->ctrlrIsConnected[i] = false;
- padMgr->pakType[i] = 0;
- padMgr->rumbleCounter[i] = 0xFF;
- osSyncPrintf(VT_FGCOL(YELLOW));
- // "Do not respond"?
- osSyncPrintf("padmgr: %dコン: %s\n", i + 1, "応答しません");
- osSyncPrintf(VT_RST);
+ padMgr->pakType[i] = CONT_PAK_NONE;
+ padMgr->rumbleTimer[i] = UINT8_MAX;
+ // "Not responding"
+ PADMGR_LOG(i, "応答しません");
}
break;
default:
- LOG_HEX("padnow1->errno", padnow1->errno, "../padmgr.c", 396);
+ // Unknown error response
+ LOG_HEX("padnow1->errno", pad->errno, "../padmgr.c", 396);
Fault_AddHungupAndCrash("../padmgr.c", 397);
+ break;
}
+ // Calculate pressed and relative inputs
buttonDiff = input->prev.button ^ input->cur.button;
input->press.button |= (u16)(buttonDiff & input->cur.button);
input->rel.button |= (u16)(buttonDiff & input->prev.button);
@@ -263,29 +351,43 @@ void PadMgr_ProcessInputs(PadMgr* padMgr) {
PadMgr_UnlockPadData(padMgr);
}
-void PadMgr_HandleRetraceMsg(PadMgr* padMgr) {
+void PadMgr_HandleRetrace(PadMgr* padMgr) {
s32 i;
- OSMesgQueue* serialEventQueue = PadMgr_LockSerialMesgQueue(padMgr);
+ OSMesgQueue* serialEventQueue = PadMgr_AcquireSerialEventQueue(padMgr);
u32 mask;
+ // Begin reading controller data
osContStartReadData(serialEventQueue);
- if (padMgr->retraceCallback) {
+
+ // Execute retrace callback
+ if (padMgr->retraceCallback != NULL) {
padMgr->retraceCallback(padMgr, padMgr->retraceCallbackValue);
}
+
+ // Wait for controller data
osRecvMesg(serialEventQueue, NULL, OS_MESG_BLOCK);
osContGetReadData(padMgr->pads);
- if (padMgr->preNMIShutdown) {
+
+ // If resetting, clear all controllers
+ if (padMgr->isResetting) {
bzero(padMgr->pads, sizeof(padMgr->pads));
}
- PadMgr_ProcessInputs(padMgr);
+
+ // Update input data
+ PadMgr_UpdateInputs(padMgr);
+
+ // Query controller status for all controllers
osContStartQuery(serialEventQueue);
osRecvMesg(serialEventQueue, NULL, OS_MESG_BLOCK);
osContGetQuery(padMgr->padStatus);
- PadMgr_UnlockSerialMesgQueue(padMgr, serialEventQueue);
+ PadMgr_ReleaseSerialEventQueue(padMgr, serialEventQueue);
+
+ // Update the state of connected controllers
mask = 0;
- for (i = 0; i < 4; i++) {
+ for (i = 0; i < MAXCONTROLLERS; i++) {
if (padMgr->padStatus[i].errno == 0) {
+ // Only standard N64 controllers are supported
if (padMgr->padStatus[i].type == CONT_TYPE_NORMAL) {
mask |= 1 << i;
} else {
@@ -298,53 +400,64 @@ void PadMgr_HandleRetraceMsg(PadMgr* padMgr) {
padMgr->validCtrlrsMask = mask;
if (gFaultMgr.msgId != 0) {
+ // If fault is active, no rumble
PadMgr_RumbleStop(padMgr);
- } else if (padMgr->rumbleOffFrames > 0) {
- --padMgr->rumbleOffFrames;
+ } else if (padMgr->rumbleOffTimer > 0) {
+ // If the rumble off timer is active, no rumble
+ --padMgr->rumbleOffTimer;
PadMgr_RumbleStop(padMgr);
- } else if (padMgr->rumbleOnFrames == 0) {
+ } else if (padMgr->rumbleOnTimer == 0) {
+ // If the rumble on timer is inactive, no rumble
PadMgr_RumbleStop(padMgr);
- } else if (!padMgr->preNMIShutdown) {
- PadMgr_RumbleControl(padMgr);
- --padMgr->rumbleOnFrames;
+ } else if (!padMgr->isResetting) {
+ // If not resetting, update rumble
+ PadMgr_UpdateRumble(padMgr);
+ --padMgr->rumbleOnTimer;
}
}
void PadMgr_HandlePreNMI(PadMgr* padMgr) {
osSyncPrintf("padmgr_HandlePreNMI()\n");
- padMgr->preNMIShutdown = true;
+ padMgr->isResetting = true;
PadMgr_RumbleReset(padMgr);
}
-void PadMgr_RequestPadData(PadMgr* padMgr, Input* inputs, s32 mode) {
+/**
+ * Fetches the most recently polled inputs from padmgr
+ *
+ * @param inputs Array of Input of length MAXCONTROLLERS to copy inputs into
+ * @param gamePoll True if polling inputs for updating the game state
+ */
+void PadMgr_RequestPadData(PadMgr* padMgr, Input* inputs, s32 gameRequest) {
s32 i;
- Input* ogInput;
- Input* newInput;
+ Input* inputIn;
+ Input* inputOut;
s32 buttonDiff;
PadMgr_LockPadData(padMgr);
- ogInput = &padMgr->inputs[0];
- newInput = &inputs[0];
- for (i = 0; i < 4; i++) {
- if (mode != 0) {
- *newInput = *ogInput;
- ogInput->press.button = 0;
- ogInput->press.stick_x = 0;
- ogInput->press.stick_y = 0;
- ogInput->rel.button = 0;
+ for (inputIn = &padMgr->inputs[0], inputOut = &inputs[0], i = 0; i < MAXCONTROLLERS; i++, inputIn++, inputOut++) {
+ if (gameRequest) {
+ // Copy inputs as-is, press and rel are calculated prior in `PadMgr_UpdateInputs`
+ *inputOut = *inputIn;
+ // Zero parts of the press and rel inputs in the polled inputs so they are not read more than once
+ inputIn->press.button = 0;
+ inputIn->press.stick_x = 0;
+ inputIn->press.stick_y = 0;
+ inputIn->rel.button = 0;
} else {
- newInput->prev = newInput->cur;
- newInput->cur = ogInput->cur;
- buttonDiff = newInput->prev.button ^ newInput->cur.button;
- newInput->press.button = newInput->cur.button & buttonDiff;
- newInput->rel.button = newInput->prev.button & buttonDiff;
- PadUtils_UpdateRelXY(newInput);
- newInput->press.stick_x += (s8)(newInput->cur.stick_x - newInput->prev.stick_x);
- newInput->press.stick_y += (s8)(newInput->cur.stick_y - newInput->prev.stick_y);
+ // Take as the previous inputs the inputs that are currently in the destination array
+ inputOut->prev = inputOut->cur;
+ // Copy current inputs from the polled inputs
+ inputOut->cur = inputIn->cur;
+ // Calculate press and rel from these
+ buttonDiff = inputOut->prev.button ^ inputOut->cur.button;
+ inputOut->press.button = inputOut->cur.button & buttonDiff;
+ inputOut->rel.button = inputOut->prev.button & buttonDiff;
+ PadUtils_UpdateRelXY(inputOut);
+ inputOut->press.stick_x += (s8)(inputOut->cur.stick_x - inputOut->prev.stick_x);
+ inputOut->press.stick_y += (s8)(inputOut->cur.stick_y - inputOut->prev.stick_y);
}
- ogInput++;
- newInput++;
}
PadMgr_UnlockPadData(padMgr);
@@ -358,7 +471,7 @@ void PadMgr_ThreadEntry(PadMgr* padMgr) {
exit = false;
while (!exit) {
- if ((D_8012D280 > 2) && MQ_IS_EMPTY(&padMgr->interruptQueue)) {
+ if (gPadMgrLogSeverity >= LOG_SEVERITY_VERBOSE && MQ_IS_EMPTY(&padMgr->interruptQueue)) {
// "Waiting for controller thread event"
osSyncPrintf("コントローラスレッドイベント待ち %lld\n", OS_CYCLES_TO_USEC(osGetTime()));
}
@@ -368,16 +481,15 @@ void PadMgr_ThreadEntry(PadMgr* padMgr) {
switch (*msg) {
case OS_SC_RETRACE_MSG:
- if (D_8012D280 > 2) {
+ if (gPadMgrLogSeverity >= LOG_SEVERITY_VERBOSE) {
osSyncPrintf("padmgr_HandleRetraceMsg START %lld\n", OS_CYCLES_TO_USEC(osGetTime()));
}
- PadMgr_HandleRetraceMsg(padMgr);
+ PadMgr_HandleRetrace(padMgr);
- if (D_8012D280 > 2) {
+ if (gPadMgrLogSeverity >= LOG_SEVERITY_VERBOSE) {
osSyncPrintf("padmgr_HandleRetraceMsg END %lld\n", OS_CYCLES_TO_USEC(osGetTime()));
}
-
break;
case OS_SC_PRE_NMI_MSG:
PadMgr_HandlePreNMI(padMgr);
@@ -401,13 +513,16 @@ void PadMgr_Init(PadMgr* padMgr, OSMesgQueue* serialEventQueue, IrqMgr* irqMgr,
osCreateMesgQueue(&padMgr->interruptQueue, padMgr->interruptMsgBuf, ARRAY_COUNT(padMgr->interruptMsgBuf));
IrqMgr_AddClient(padMgr->irqMgr, &padMgr->irqClient, &padMgr->interruptQueue);
- osCreateMesgQueue(&padMgr->serialLockQueue, padMgr->serialLockMsgBuf, ARRAY_COUNT(padMgr->serialLockMsgBuf));
- PadMgr_UnlockSerialMesgQueue(padMgr, serialEventQueue);
- osCreateMesgQueue(&padMgr->lockQueue, padMgr->lockMsgBuf, ARRAY_COUNT(padMgr->lockMsgBuf));
+
+ osCreateMesgQueue(&padMgr->serialLockQueue, &padMgr->serialMsg, 1);
+ PadMgr_ReleaseSerialEventQueue(padMgr, serialEventQueue);
+
+ osCreateMesgQueue(&padMgr->lockQueue, &padMgr->lockMsg, 1);
PadMgr_UnlockPadData(padMgr);
+
PadSetup_Init(serialEventQueue, (u8*)&padMgr->validCtrlrsMask, padMgr->padStatus);
- padMgr->nControllers = 4;
+ padMgr->nControllers = MAXCONTROLLERS;
osContSetCh(padMgr->nControllers);
osCreateThread(&padMgr->thread, id, (void (*)(void*))PadMgr_ThreadEntry, padMgr, stack, priority);
diff --git a/src/code/padsetup.c b/src/code/padsetup.c
index e4e8a0d687..20a546ae3f 100644
--- a/src/code/padsetup.c
+++ b/src/code/padsetup.c
@@ -9,16 +9,16 @@ s32 PadSetup_Init(OSMesgQueue* mq, u8* outMask, OSContStatus* status) {
if (ret != 0) {
return ret;
}
+
if (*outMask == 0xFF) {
if (osContStartQuery(mq) != 0) {
return 1;
}
-
osRecvMesg(mq, NULL, OS_MESG_BLOCK);
osContGetQuery(status);
*outMask = 0;
- for (i = 0; i < 4; i++) {
+ for (i = 0; i < MAXCONTROLLERS; i++) {
switch (status[i].errno) {
case 0:
if (status[i].type == CONT_TYPE_NORMAL) {
diff --git a/src/code/speed_meter.c b/src/code/speed_meter.c
index 59fe130678..f37a227888 100644
--- a/src/code/speed_meter.c
+++ b/src/code/speed_meter.c
@@ -167,7 +167,7 @@ void SpeedMeter_DrawAllocEntries(SpeedMeter* meter, GraphicsContext* gfxCtx, Gam
y = 212;
if (SREG(0) > 2) {
- if (ZeldaArena_IsInitalized()) {
+ if (ZeldaArena_IsInitialized()) {
ZeldaArena_GetSizes(&zeldaFreeMax, &zeldaFree, &zeldaAlloc);
SpeedMeter_InitAllocEntry(&entry, zeldaFree + zeldaAlloc, zeldaAlloc, GPACK_RGBA5551(0, 0, 255, 1),
GPACK_RGBA5551(255, 255, 255, 1), ulx, lrx, y, y + 1);
diff --git a/src/code/system_malloc.c b/src/code/system_malloc.c
index d9085c12f1..f62e5639ae 100644
--- a/src/code/system_malloc.c
+++ b/src/code/system_malloc.c
@@ -105,6 +105,6 @@ void SystemArena_Cleanup(void) {
__osMallocCleanup(&gSystemArena);
}
-u8 SystemArena_IsInitalized(void) {
- return __osMallocIsInitalized(&gSystemArena);
+u8 SystemArena_IsInitialized(void) {
+ return __osMallocIsInitialized(&gSystemArena);
}
diff --git a/src/code/z_actor.c b/src/code/z_actor.c
index 9c71c31285..5e331cbe4f 100644
--- a/src/code/z_actor.c
+++ b/src/code/z_actor.c
@@ -2939,7 +2939,7 @@ void func_800328D4(PlayState* play, ActorContext* actorCtx, Player* player, u32
if ((actor->update != NULL) && ((Player*)actor != player) && CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_0)) {
// This block below is for determining the closest actor to player in determining the volume
- // used while playing enemy bgm music
+ // used while playing enemy background music
if ((actorCategory == ACTORCAT_ENEMY) && CHECK_FLAG_ALL(actor->flags, ACTOR_FLAG_0 | ACTOR_FLAG_2) &&
(actor->xyzDistToPlayerSq < SQ(500.0f)) && (actor->xyzDistToPlayerSq < sbgmEnemyDistSq)) {
actorCtx->targetCtx.bgmEnemy = actor;
diff --git a/src/code/z_camera.c b/src/code/z_camera.c
index 89db13211a..0607a1c5cd 100644
--- a/src/code/z_camera.c
+++ b/src/code/z_camera.c
@@ -68,8 +68,8 @@ f32 Camera_InterpolateCurve(f32 a, f32 b) {
}
/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, The result is rounded up to `target`
+ * Performs linear interpolation between `cur` and `target`. If `cur` is within
+ * `minDiff` units, the result is rounded up to `target`
*/
f32 Camera_LERPCeilF(f32 target, f32 cur, f32 stepScale, f32 minDiff) {
f32 diff = target - cur;
@@ -87,8 +87,8 @@ f32 Camera_LERPCeilF(f32 target, f32 cur, f32 stepScale, f32 minDiff) {
}
/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, The result is rounded down to `cur`
+ * Performs linear interpolation between `cur` and `target`. If `cur` is within
+ * `minDiff` units, the result is rounded down to `cur`
*/
f32 Camera_LERPFloorF(f32 target, f32 cur, f32 stepScale, f32 minDiff) {
f32 diff = target - cur;
@@ -106,8 +106,8 @@ f32 Camera_LERPFloorF(f32 target, f32 cur, f32 stepScale, f32 minDiff) {
}
/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, The result is rounded up to `target`
+ * Performs linear interpolation between `cur` and `target`. If `cur` is within
+ * `minDiff` units, the result is rounded up to `target`
*/
s16 Camera_LERPCeilS(s16 target, s16 cur, f32 stepScale, s16 minDiff) {
s16 diff = target - cur;
@@ -125,8 +125,8 @@ s16 Camera_LERPCeilS(s16 target, s16 cur, f32 stepScale, s16 minDiff) {
}
/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, The result is rounded down to `cur`
+ * Performs linear interpolation between `cur` and `target`. If `cur` is within
+ * `minDiff` units, the result is rounded down to `cur`
*/
s16 Camera_LERPFloorS(s16 target, s16 cur, f32 stepScale, s16 minDiff) {
s16 diff = target - cur;
@@ -144,8 +144,8 @@ s16 Camera_LERPFloorS(s16 target, s16 cur, f32 stepScale, s16 minDiff) {
}
/*
- * Performs linear interpoloation between `cur` and `target`. If `cur` is within
- * `minDiff` units, The result is rounded up to `target`
+ * Performs linear interpolation between `cur` and `target`. If `cur` is within
+ * `minDiff` units, the result is rounded up to `target`
*/
void Camera_LERPCeilVec3f(Vec3f* target, Vec3f* cur, f32 yStepScale, f32 xzStepScale, f32 minDiff) {
cur->x = Camera_LERPCeilF(target->x, cur->x, xzStepScale, minDiff);
@@ -155,7 +155,7 @@ void Camera_LERPCeilVec3f(Vec3f* target, Vec3f* cur, f32 yStepScale, f32 xzStepS
void func_80043ABC(Camera* camera) {
camera->yawUpdateRateInv = 100.0f;
- camera->pitchUpdateRateInv = R_CAM_DEFA_PHI_UPDRATE;
+ 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));
@@ -574,71 +574,83 @@ s16 Camera_XZAngle(Vec3f* to, Vec3f* from) {
return CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(from->x - to->x, from->z - to->z)));
}
-s16 func_80044ADC(Camera* camera, s16 yaw, s16 arg2) {
- static f32 D_8015CE50;
- static f32 D_8015CE54;
- static CamColChk D_8015CE58;
+s16 Camera_GetPitchAdjFromFloorHeightDiffs(Camera* camera, s16 viewYaw, s16 initAndReturnZero) {
+ static f32 sFloorYNear;
+ static f32 sFloorYFar;
+ static CamColChk sFarColChk;
Vec3f playerPos;
- Vec3f rotatedPos;
+ Vec3f nearPos;
Vec3f floorNorm;
- f32 temp_f2;
- s16 temp_s0;
- s16 temp_s1;
- f32 phi_f18;
- f32 sinYaw;
- f32 cosYaw;
+ f32 checkOffsetY;
+ s16 pitchNear;
+ s16 pitchFar;
+ f32 floorYDiffFar;
+ f32 viewForwardsUnitX;
+ f32 viewForwardsUnitZ;
s32 bgId;
- f32 sp30;
- f32 sp2C;
- f32 phi_f16;
+ f32 nearDist;
+ f32 farDist;
+ f32 floorYDiffNear;
f32 playerHeight;
- sinYaw = Math_SinS(yaw);
- cosYaw = Math_CosS(yaw);
+ viewForwardsUnitX = Math_SinS(viewYaw);
+ viewForwardsUnitZ = Math_CosS(viewYaw);
+
playerHeight = Player_GetHeight(camera->player);
- temp_f2 = CAM_DATA_SCALED(OREG(19)) * playerHeight;
- sp30 = CAM_DATA_SCALED(OREG(17)) * playerHeight;
- sp2C = CAM_DATA_SCALED(OREG(18)) * playerHeight;
+ checkOffsetY = CAM_DATA_SCALED(R_CAM_PITCH_FLOOR_CHECK_OFFSET_Y_FAC) * playerHeight;
+ nearDist = CAM_DATA_SCALED(R_CAM_PITCH_FLOOR_CHECK_NEAR_DIST_FAC) * playerHeight;
+ farDist = CAM_DATA_SCALED(R_CAM_PITCH_FLOOR_CHECK_FAR_DIST_FAC) * playerHeight;
+
playerPos.x = camera->playerPosRot.pos.x;
- playerPos.y = camera->playerGroundY + temp_f2;
+ playerPos.y = camera->playerGroundY + checkOffsetY;
playerPos.z = camera->playerPosRot.pos.z;
- rotatedPos.x = playerPos.x + (sp30 * sinYaw);
- rotatedPos.y = playerPos.y;
- rotatedPos.z = playerPos.z + (sp30 * cosYaw);
- if (arg2 || (camera->play->state.frames % 2) == 0) {
- D_8015CE58.pos.x = playerPos.x + (sp2C * sinYaw);
- D_8015CE58.pos.y = playerPos.y;
- D_8015CE58.pos.z = playerPos.z + (sp2C * cosYaw);
- Camera_BGCheckInfo(camera, &playerPos, &D_8015CE58);
- if (arg2) {
- D_8015CE50 = D_8015CE54 = camera->playerGroundY;
+
+ nearPos.x = playerPos.x + (nearDist * viewForwardsUnitX);
+ nearPos.y = playerPos.y;
+ nearPos.z = playerPos.z + (nearDist * viewForwardsUnitZ);
+
+ if (initAndReturnZero || (camera->play->state.frames % 2) == 0) {
+ sFarColChk.pos.x = playerPos.x + (farDist * viewForwardsUnitX);
+ sFarColChk.pos.y = playerPos.y;
+ sFarColChk.pos.z = playerPos.z + (farDist * viewForwardsUnitZ);
+
+ Camera_BGCheckInfo(camera, &playerPos, &sFarColChk);
+
+ if (initAndReturnZero) {
+ sFloorYNear = sFloorYFar = camera->playerGroundY;
}
} else {
- sp2C = OLib_Vec3fDistXZ(&playerPos, &D_8015CE58.pos);
- D_8015CE58.pos.x += D_8015CE58.norm.x * 5.0f;
- D_8015CE58.pos.y += D_8015CE58.norm.y * 5.0f;
- D_8015CE58.pos.z += D_8015CE58.norm.z * 5.0f;
- if (sp2C < sp30) {
- sp30 = sp2C;
- D_8015CE50 = D_8015CE54 = Camera_GetFloorYLayer(camera, &floorNorm, &D_8015CE58.pos, &bgId);
+ farDist = OLib_Vec3fDistXZ(&playerPos, &sFarColChk.pos);
+
+ sFarColChk.pos.x += sFarColChk.norm.x * 5.0f;
+ sFarColChk.pos.y += sFarColChk.norm.y * 5.0f;
+ sFarColChk.pos.z += sFarColChk.norm.z * 5.0f;
+
+ if (nearDist > farDist) {
+ nearDist = farDist;
+ sFloorYNear = sFloorYFar = Camera_GetFloorYLayer(camera, &floorNorm, &sFarColChk.pos, &bgId);
} else {
- D_8015CE50 = Camera_GetFloorYLayer(camera, &floorNorm, &rotatedPos, &bgId);
- D_8015CE54 = Camera_GetFloorYLayer(camera, &floorNorm, &D_8015CE58.pos, &bgId);
+ sFloorYNear = Camera_GetFloorYLayer(camera, &floorNorm, &nearPos, &bgId);
+ sFloorYFar = Camera_GetFloorYLayer(camera, &floorNorm, &sFarColChk.pos, &bgId);
}
- if (D_8015CE50 == BGCHECK_Y_MIN) {
- D_8015CE50 = camera->playerGroundY;
+ if (sFloorYNear == BGCHECK_Y_MIN) {
+ sFloorYNear = camera->playerGroundY;
}
- if (D_8015CE54 == BGCHECK_Y_MIN) {
- D_8015CE54 = D_8015CE50;
+ if (sFloorYFar == BGCHECK_Y_MIN) {
+ sFloorYFar = sFloorYNear;
}
}
- phi_f16 = CAM_DATA_SCALED(OREG(20)) * (D_8015CE50 - camera->playerGroundY);
- phi_f18 = (1.0f - CAM_DATA_SCALED(OREG(20))) * (D_8015CE54 - camera->playerGroundY);
- temp_s0 = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(phi_f16, sp30)));
- temp_s1 = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(phi_f18, sp2C)));
- return temp_s0 + temp_s1;
+
+ floorYDiffNear = CAM_DATA_SCALED(R_CAM_PITCH_FLOOR_CHECK_NEAR_WEIGHT) * (sFloorYNear - camera->playerGroundY);
+ floorYDiffFar =
+ (1.0f - CAM_DATA_SCALED(R_CAM_PITCH_FLOOR_CHECK_NEAR_WEIGHT)) * (sFloorYFar - camera->playerGroundY);
+
+ pitchNear = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(floorYDiffNear, nearDist)));
+ pitchFar = CAM_DEG_TO_BINANG(RAD_TO_DEG(Math_FAtan2F(floorYDiffFar, farDist)));
+
+ return pitchNear + pitchFar;
}
/**
@@ -695,12 +707,12 @@ Vec3f* Camera_CalcUpFromPitchYawRoll(Vec3f* viewUp, s16 pitch, s16 yaw, s16 roll
f32 Camera_ClampLERPScale(Camera* camera, f32 maxLERPScale) {
f32 ret;
- if (camera->atLERPStepScale < CAM_DATA_SCALED(R_AT_LERP_MIN)) {
- ret = CAM_DATA_SCALED(R_AT_LERP_MIN);
+ if (camera->atLERPStepScale < CAM_DATA_SCALED(R_CAM_AT_LERP_STEP_SCALE_MIN)) {
+ ret = CAM_DATA_SCALED(R_CAM_AT_LERP_STEP_SCALE_MIN);
} else if (camera->atLERPStepScale >= maxLERPScale) {
ret = maxLERPScale;
} else {
- ret = CAM_DATA_SCALED(R_AT_LERP_SCALE) * camera->atLERPStepScale;
+ ret = CAM_DATA_SCALED(R_CAM_AT_LERP_STEP_SCALE_FAC) * camera->atLERPStepScale;
}
return ret;
@@ -1277,7 +1289,7 @@ s16 Camera_CalcDefaultPitch(Camera* camera, s16 arg1, s16 arg2, s16 arg3) {
if (ABS(target) < absCur) {
stepScale = (1.0f / camera->pitchUpdateRateInv) * 3.0f;
} else {
- t = absCur * (1.0f / R_CAM_MAX_PHI);
+ t = absCur * (1.0f / R_CAM_MAX_PITCH);
pad = Camera_InterpolateCurve(0.8f, 1.0f - t);
stepScale = (1.0f / camera->pitchUpdateRateInv) * pad;
}
@@ -1523,24 +1535,26 @@ 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_DEFA_PHI_UPDRATE + (f32)(rwData->swing.swingUpdateRateTimer * 2),
+ Camera_LERPCeilF((f32)R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV + (f32)(rwData->swing.swingUpdateRateTimer * 2),
camera->pitchUpdateRateInv, sp9C, rate);
rwData->swing.swingUpdateRateTimer--;
} else {
camera->yawUpdateRateInv = Camera_LERPCeilF(rwData->swing.swingUpdateRate -
((OREG(49) * 0.01f) * rwData->swing.swingUpdateRate * sp94),
camera->yawUpdateRateInv, sp98, rate);
- camera->pitchUpdateRateInv = Camera_LERPCeilF(R_CAM_DEFA_PHI_UPDRATE, camera->pitchUpdateRateInv, sp9C, rate);
+ camera->pitchUpdateRateInv =
+ Camera_LERPCeilF(R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV, camera->pitchUpdateRateInv, sp9C, rate);
}
- camera->pitchUpdateRateInv = Camera_LERPCeilF(R_CAM_DEFA_PHI_UPDRATE, 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);
if (roData->interfaceFlags & 1) {
- t = func_80044ADC(camera, atEyeGeo.yaw - 0x7FFF, 0);
+ t = Camera_GetPitchAdjFromFloorHeightDiffs(camera, atEyeGeo.yaw - 0x7FFF, false);
sp9C = ((1.0f / roData->unk_10) * 0.5f) * (1.0f - camera->speedRatio);
rwData->slopePitchAdj =
Camera_LERPCeilS(t, rwData->slopePitchAdj, ((1.0f / roData->unk_10) * 0.5f) + sp9C, 0xF);
@@ -1670,7 +1684,7 @@ s32 Camera_Normal2(Camera* camera) {
playerHeight = Player_GetHeight(camera->player);
yNormal =
- (1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM)) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
if (R_RELOAD_CAM_PARAMS) {
Camera_CopyPREGToModeValues(camera);
@@ -1740,7 +1754,8 @@ s32 Camera_Normal2(Camera* camera) {
camera->yawUpdateRateInv = Camera_LERPCeilF(roData->unk_0C, camera->yawUpdateRateInv * camera->speedRatio,
CAM_DATA_SCALED(OREG(25)), 0.1f);
- camera->pitchUpdateRateInv = Camera_LERPCeilF(OREG(7), camera->pitchUpdateRateInv, spA0, 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 =
@@ -1870,9 +1885,10 @@ s32 Camera_Normal3(Camera* camera) {
rwData->unk_20 = camera->playerGroundY;
rwData->swing.unk_16 = rwData->swing.unk_14 = rwData->swing.unk_18 = 0;
rwData->swing.swingUpdateRate = roData->yawUpdateSpeed;
- rwData->yawUpdAmt = (s16)((s16)(playerPosRot->rot.y - 0x7FFF) - sp7C.yaw) * (1.0f / OREG(23));
+ rwData->yawUpdAmt =
+ (s16)((s16)(playerPosRot->rot.y - 0x7FFF) - sp7C.yaw) * (1.0f / R_CAM_DEFAULT_ANIM_TIME);
rwData->distTimer = 10;
- rwData->yawTimer = OREG(23);
+ rwData->yawTimer = R_CAM_DEFAULT_ANIM_TIME;
camera->animState = 1;
rwData->swing.swingUpdateRateTimer = 0;
}
@@ -1887,20 +1903,22 @@ s32 Camera_Normal3(Camera* camera) {
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)OREG(7) + (rwData->swing.swingUpdateRateTimer * 2),
- camera->pitchUpdateRateInv, sp94, 0.1f);
+ camera->pitchUpdateRateInv =
+ Camera_LERPCeilF((f32)R_CAM_DEFAULT_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(OREG(7), camera->pitchUpdateRateInv, sp94, 0.1f);
+ camera->pitchUpdateRateInv =
+ Camera_LERPCeilF(R_CAM_DEFAULT_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);
- t2 = func_80044ADC(camera, sp7C.yaw - 0x7FFF, 1);
+ t2 = Camera_GetPitchAdjFromFloorHeightDiffs(camera, sp7C.yaw - 0x7FFF, true);
sp94 = ((1.0f / roData->unk_10) * 0.5f);
temp_f0 = (((1.0f / roData->unk_10) * 0.5f) * (1.0f - camera->speedRatio));
rwData->curPitch = Camera_LERPCeilS(t2, rwData->curPitch, sp94 + temp_f0, 0xF);
@@ -1915,11 +1933,11 @@ s32 Camera_Normal3(Camera* camera) {
phi_a0 = roData->pitchTarget - rwData->curPitch;
sp84.pitch = Camera_LERPCeilS(phi_a0, sp74.pitch, 1.0f / camera->pitchUpdateRateInv, 0xA);
- if (OREG(5) < sp84.pitch) {
- sp84.pitch = OREG(5);
+ if (sp84.pitch > R_CAM_MAX_PITCH) {
+ sp84.pitch = R_CAM_MAX_PITCH;
}
- if (sp84.pitch < OREG(34)) {
- sp84.pitch = OREG(34);
+ if (sp84.pitch < R_CAM_MIN_PITCH_1) {
+ sp84.pitch = R_CAM_MIN_PITCH_1;
}
phi_a0 = playerPosRot->rot.y - (s16)(sp74.yaw - 0x7FFF);
@@ -1990,7 +2008,8 @@ s32 Camera_Parallel1(Camera* camera) {
playerHeight = Player_GetHeight(camera->player);
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- f32 yNormal = (1.0f + CAM_DATA_SCALED(OREG(46))) - (CAM_DATA_SCALED(OREG(46)) * (68.0f / playerHeight));
+ f32 yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->distTarget = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
@@ -2022,7 +2041,7 @@ s32 Camera_Parallel1(Camera* camera) {
if (roData->interfaceFlags & 4) {
rwData->animTimer = 20;
} else {
- rwData->animTimer = OREG(23);
+ rwData->animTimer = R_CAM_DEFAULT_ANIM_TIME;
}
rwData->unk_00.x = 0.0f;
rwData->yTarget = playerPosRot->pos.y - camera->playerPosDelta.y;
@@ -2069,7 +2088,7 @@ s32 Camera_Parallel1(Camera* camera) {
Camera_LERPCeilF(CAM_DATA_SCALED(OREG(4)), camera->fovUpdateRate, camera->speedRatio * 0.05f, 0.1f);
if (roData->interfaceFlags & 1) {
- tangle = func_80044ADC(camera, atToEyeDir.yaw - 0x7FFF, 1);
+ tangle = Camera_GetPitchAdjFromFloorHeightDiffs(camera, atToEyeDir.yaw - 0x7FFF, true);
spB8 = ((1.0f / roData->unk_0C) * 0.3f);
pad2 = (((1.0f / roData->unk_0C) * 0.7f) * (1.0f - camera->speedRatio));
@@ -2120,12 +2139,12 @@ s32 Camera_Parallel1(Camera* camera) {
spA8.pitch = Camera_LERPCeilS(phi_a0, atToEyeNextDir.pitch, 1.0f / camera->pitchUpdateRateInv, 4);
- if (spA8.pitch > OREG(5)) {
- spA8.pitch = OREG(5);
+ if (spA8.pitch > R_CAM_MAX_PITCH) {
+ spA8.pitch = R_CAM_MAX_PITCH;
}
- if (spA8.pitch < OREG(34)) {
- spA8.pitch = OREG(34);
+ if (spA8.pitch < R_CAM_MIN_PITCH_1) {
+ spA8.pitch = R_CAM_MIN_PITCH_1;
}
}
Camera_Vec3fVecSphGeoAdd(eyeNext, at, &spA8);
@@ -2201,8 +2220,8 @@ s32 Camera_Jump1(Camera* camera) {
playerHeight = Player_GetHeight(camera->player);
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- f32 yNormal = (1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM)) -
- (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
+ f32 yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
roData->atYOffset = CAM_DATA_SCALED(GET_NEXT_RO_DATA(values)) * playerHeight * yNormal;
roData->distMin = CAM_DATA_SCALED(GET_NEXT_RO_DATA(values)) * playerHeight * yNormal;
@@ -2243,14 +2262,15 @@ 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->pitchUpdateRateInv = Camera_LERPCeilF((f32)R_CAM_DEFA_PHI_UPDRATE + rwData->swing.swingUpdateRateTimer,
- camera->pitchUpdateRateInv, CAM_DATA_SCALED(OREG(26)), 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);
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_DEFA_PHI_UPDRATE, camera->pitchUpdateRateInv, 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->xzOffsetUpdateRate =
@@ -2285,11 +2305,11 @@ s32 Camera_Jump1(Camera* camera) {
eyeDiffSph.r = roData->distMax;
}
- // Clamp the phi rotation at R_CAM_MAX_PHI AND R_CAM_MIN_PHI2
- if (eyeDiffSph.pitch > R_CAM_MAX_PHI) {
- eyeDiffSph.pitch = R_CAM_MAX_PHI;
- } else if (eyeDiffSph.pitch < R_CAM_MIN_PHI2) {
- eyeDiffSph.pitch = R_CAM_MIN_PHI2;
+ // Clamp the phi rotation at R_CAM_MAX_PITCH AND R_CAM_MIN_PITCH_2
+ if (eyeDiffSph.pitch > R_CAM_MAX_PITCH) {
+ eyeDiffSph.pitch = R_CAM_MAX_PITCH;
+ } else if (eyeDiffSph.pitch < R_CAM_MIN_PITCH_2) {
+ eyeDiffSph.pitch = R_CAM_MIN_PITCH_2;
}
Camera_Vec3fVecSphGeoAdd(&newEye, at, &eyeDiffSph);
@@ -2356,7 +2376,8 @@ s32 Camera_Jump2(Camera* camera) {
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- yNormal = (1.0f + CAM_DATA_SCALED(OREG(46))) - (CAM_DATA_SCALED(OREG(46)) * (68.0f / playerHeight));
+ yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
roData->atYOffset =
CAM_DATA_SCALED((camera->playerPosDelta.y > 0.0f ? -10.0f : 10.0f) + GET_NEXT_RO_DATA(values)) *
playerHeight * yNormal;
@@ -2396,7 +2417,7 @@ s32 Camera_Jump2(Camera* camera) {
}
yawDiff = (s16)(playerPosRot->rot.y - 0x7FFF) - atToEyeNextDir.yaw;
- rwData->initYawDiff = ((yawDiff / OREG(23)) / 4) * 3;
+ rwData->initYawDiff = ((yawDiff / R_CAM_DEFAULT_ANIM_TIME) / 4) * 3;
if (roData->interfaceFlags & 2) {
rwData->yawAdj = 0xA;
} else {
@@ -2406,7 +2427,7 @@ s32 Camera_Jump2(Camera* camera) {
playerPosRot->pos.x -= camera->playerPosDelta.x;
playerPosRot->pos.y -= camera->playerPosDelta.y;
playerPosRot->pos.z -= camera->playerPosDelta.z;
- rwData->animTimer = OREG(23);
+ rwData->animTimer = R_CAM_DEFAULT_ANIM_TIME;
camera->animState++;
camera->atLERPStepScale = roData->atLERPStepScale;
}
@@ -2560,8 +2581,8 @@ s32 Camera_Jump3(Camera* camera) {
if (RELOAD_PARAMS(camera) || modeSwitch || R_RELOAD_CAM_PARAMS) {
values = sCameraSettings[camera->setting].cameraModes[rwData->mode].values;
- yNormal = ((1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM)) -
- (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight)));
+ yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
t2 = CAM_DATA_SCALED(playerHeight) * yNormal;
roData->yOffset = GET_NEXT_RO_DATA(values) * t2;
roData->distMin = GET_NEXT_RO_DATA(values) * t2;
@@ -2660,12 +2681,12 @@ s32 Camera_Jump3(Camera* camera) {
eyeDiffSph.pitch = Camera_CalcDefaultPitch(camera, eyeNextAtOffset.pitch, roData->pitchTarget, 0);
}
- if (eyeDiffSph.pitch > OREG(5)) {
- eyeDiffSph.pitch = OREG(5);
+ if (eyeDiffSph.pitch > R_CAM_MAX_PITCH) {
+ eyeDiffSph.pitch = R_CAM_MAX_PITCH;
}
- if (eyeDiffSph.pitch < OREG(34)) {
- eyeDiffSph.pitch = OREG(34);
+ if (eyeDiffSph.pitch < R_CAM_MIN_PITCH_1) {
+ eyeDiffSph.pitch = R_CAM_MIN_PITCH_1;
}
Camera_Vec3fVecSphGeoAdd(eyeNext, at, &eyeDiffSph);
@@ -2751,7 +2772,8 @@ s32 Camera_Battle1(Camera* camera) {
playerHeight = Player_GetHeight(camera->player);
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- f32 yNormal = (1.0f + CAM_DATA_SCALED(OREG(46))) - (CAM_DATA_SCALED(OREG(46)) * (68.0f / playerHeight));
+ f32 yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->distance = GET_NEXT_RO_DATA(values);
@@ -2837,7 +2859,7 @@ s32 Camera_Battle1(Camera* camera) {
Camera_ChangeMode(camera, CAM_MODE_TARGET);
return true;
}
- rwData->animTimer = OREG(23) + OREG(24);
+ rwData->animTimer = R_CAM_DEFAULT_ANIM_TIME + OREG(24);
rwData->initialEyeToAtYaw = atToEyeDir.yaw;
rwData->initialEyeToAtPitch = atToEyeDir.pitch;
rwData->initialEyeToAtDist = atToEyeDir.r;
@@ -2894,7 +2916,7 @@ s32 Camera_Battle1(Camera* camera) {
OLib_Vec3fDiffToVecSphGeo(&playerToTargetDir, at, eye);
playerToTargetDir.yaw = tmpAng2 - 0x7FFF;
- var2 = 1.0f / OREG(23);
+ var2 = 1.0f / R_CAM_DEFAULT_ANIM_TIME;
var3 = (rwData->initialEyeToAtDist - playerToTargetDir.r) * var2;
tmpAng1 = (s16)(rwData->initialEyeToAtYaw - playerToTargetDir.yaw) * var2;
tmpAng2 = (s16)(rwData->initialEyeToAtPitch - playerToTargetDir.pitch) * var2;
@@ -2992,8 +3014,8 @@ s32 Camera_Battle4(Camera* camera) {
playerHeight = Player_GetHeight(camera->player);
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- f32 yNormal = (1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM)) -
- (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
+ f32 yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->rTarget = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
@@ -3103,7 +3125,8 @@ s32 Camera_KeepOn1(Camera* camera) {
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- f32 yNormal = (1.0f + CAM_DATA_SCALED(OREG(46))) - (CAM_DATA_SCALED(OREG(46)) * (68.0f / playerHeight));
+ f32 yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->unk_04 = GET_NEXT_RO_DATA(values);
@@ -3132,7 +3155,7 @@ s32 Camera_KeepOn1(Camera* camera) {
rwData->unk_10 = 0;
rwData->unk_04 = 0.0f;
rwData->unk_0C = camera->target;
- rwData->unk_16 = OREG(23) + OREG(24);
+ rwData->unk_16 = R_CAM_DEFAULT_ANIM_TIME + OREG(24);
rwData->unk_12 = spC0.yaw;
rwData->unk_14 = spC0.pitch;
rwData->unk_00 = spC0.r;
@@ -3225,7 +3248,7 @@ s32 Camera_KeepOn1(Camera* camera) {
OLib_Vec3fDiffToVecSphGeo(&spC8, at, eye);
spC8.yaw = spE2 - 0x7FFF;
- t2 = 1.0f / OREG(23);
+ t2 = 1.0f / R_CAM_DEFAULT_ANIM_TIME;
spE8 = (rwData->unk_00 - spC8.r) * t2;
spE2 = (s16)(rwData->unk_12 - spC8.yaw) * t2;
spE0 = (s16)(rwData->unk_14 - spC8.pitch) * t2;
@@ -3344,7 +3367,8 @@ s32 Camera_KeepOn3(Camera* camera) {
camera->unk_14C &= ~0x10;
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- f32 yNormal = (1.0f + CAM_DATA_SCALED(OREG(46))) - (CAM_DATA_SCALED(OREG(46)) * (68.0f / playerHeight));
+ f32 yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->minDist = GET_NEXT_RO_DATA(values);
@@ -3420,7 +3444,7 @@ s32 Camera_KeepOn3(Camera* camera) {
angleCnt = ARRAY_COUNT(D_8011D3B0);
i = 0;
targetToPlayerDir.r = prevTargetPlayerDist;
- atToEyeAdj.r = ((roData->minDist + (targetToPlayerDir.r * (1 - 0.5f))) - atToEyeNextDir.r) + atToEyeNextDir.r;
+ atToEyeAdj.r = roData->minDist + (targetToPlayerDir.r * (1 - 0.5f)) - atToEyeNextDir.r + atToEyeNextDir.r;
Camera_Vec3fVecSphGeoAdd(&lineChkPointB, &rwData->atTarget, &atToEyeAdj);
if (!(roData->flags & 0x80)) {
while (i < angleCnt) {
@@ -3537,7 +3561,7 @@ s32 Camera_KeepOn4(Camera* camera) {
camera->unk_14C &= ~0x10;
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- f32 yNormal = (1.0f + t) - ((68.0f / playerHeight) * t);
+ f32 yNormal = 1.0f + t - (68.0f / playerHeight * t);
roData->unk_00 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->unk_04 = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
@@ -3947,8 +3971,8 @@ s32 Camera_Fixed2(Camera* camera) {
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- f32 yNormal = (1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM)) -
- (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
+ f32 yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
roData->yOffset = (GET_NEXT_SCALED_RO_DATA(values) * playerHeight) * yNormal;
roData->eyeStepScale = GET_NEXT_SCALED_RO_DATA(values);
@@ -4035,7 +4059,7 @@ s32 Camera_Fixed3(Camera* camera) {
*eye = *eyeNext;
rwData->rot = bgCamFuncData->rot;
rwData->fov = bgCamFuncData->fov;
- rwData->jfifId = bgCamFuncData->jfifId;
+ rwData->roomImageOverrideBgCamIndex = bgCamFuncData->roomImageOverrideBgCamIndex;
if (rwData->fov == -1) {
rwData->fov = 6000;
}
@@ -4054,9 +4078,9 @@ s32 Camera_Fixed3(Camera* camera) {
camera->animState++;
}
- if (bgCamFuncData->jfifId != rwData->jfifId) {
- osSyncPrintf("camera: position change %d \n", rwData->jfifId);
- rwData->jfifId = bgCamFuncData->jfifId;
+ if (bgCamFuncData->roomImageOverrideBgCamIndex != rwData->roomImageOverrideBgCamIndex) {
+ osSyncPrintf("camera: position change %d \n", rwData->roomImageOverrideBgCamIndex);
+ rwData->roomImageOverrideBgCamIndex = bgCamFuncData->roomImageOverrideBgCamIndex;
rwData->updDirTimer = 5;
}
@@ -4104,7 +4128,8 @@ s32 Camera_Fixed4(Camera* camera) {
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- f32 yNormal = ((1.0f + CAM_DATA_SCALED(OREG(46))) - (CAM_DATA_SCALED(OREG(46)) * (68.0f / playerYOffset)));
+ f32 yNormal = 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) -
+ (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerYOffset));
roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * playerYOffset * yNormal;
roData->speedToEyePos = GET_NEXT_SCALED_RO_DATA(values);
@@ -4230,7 +4255,7 @@ s32 Camera_Subj3(Camera* camera) {
rwData->r = sp7C.r;
rwData->yaw = sp7C.yaw;
rwData->pitch = sp7C.pitch;
- rwData->animTimer = OREG(23);
+ rwData->animTimer = R_CAM_DEFAULT_ANIM_TIME;
camera->dist = roData->eyeNextDist;
camera->animState++;
camera->rUpdateRateInv = 1.0f;
@@ -4247,7 +4272,7 @@ s32 Camera_Subj3(Camera* camera) {
at->y = at->y + (sp98.y - pad2->y) * temp_f0_3;
at->z = at->z + (sp98.z - pad2->z) * temp_f0_3;
- temp_f0_3 = (1.0f / OREG(23));
+ temp_f0_3 = (1.0f / R_CAM_DEFAULT_ANIM_TIME);
sp58 = (tsph.r - sp84.r) * temp_f0_3;
sp52 = (s16)(tsph.yaw - sp84.yaw) * temp_f0_3;
sp50 = (s16)(tsph.pitch - sp84.pitch) * temp_f0_3;
@@ -4480,8 +4505,8 @@ s32 Camera_Data4(Camera* camera) {
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- yNormal = (1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM)) -
- (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
+ yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->fov = GET_NEXT_RO_DATA(values);
roData->interfaceFlags = GET_NEXT_RO_DATA(values);
@@ -4556,8 +4581,8 @@ s32 Camera_Unique1(Camera* camera) {
playerHeight = Player_GetHeight(camera->player);
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- f32 yNormal = (1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM)) -
- (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
+ f32 yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->distMin = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
@@ -4585,7 +4610,7 @@ s32 Camera_Unique1(Camera* camera) {
rwData->unk_00 = 0.0f;
playerWaistPos = camera->player->bodyPartsPos[PLAYER_BODYPART_WAIST];
OLib_Vec3fDiffToVecSphGeo(&unk908PlayerPosOffset, &playerPosRot->pos, &playerWaistPos);
- rwData->timer = R_DEFA_CAM_ANIM_TIME;
+ rwData->timer = R_CAM_DEFAULT_ANIM_TIME;
rwData->yawTargetAdj = ABS((s16)(unk908PlayerPosOffset.yaw - eyeAtOffset.yaw)) < 0x3A98
? 0
: (((s16)(unk908PlayerPosOffset.yaw - eyeAtOffset.yaw) / rwData->timer) / 4) * 3;
@@ -4608,11 +4633,11 @@ s32 Camera_Unique1(Camera* camera) {
phiTarget = roData->pitchTarget;
sp8C.pitch = Camera_LERPCeilS(phiTarget, eyeNextAtOffset.pitch, 1.0f / camera->pitchUpdateRateInv, 0xA);
- if (sp8C.pitch > OREG(5)) {
- sp8C.pitch = OREG(5);
+ if (sp8C.pitch > R_CAM_MAX_PITCH) {
+ sp8C.pitch = R_CAM_MAX_PITCH;
}
- if (sp8C.pitch < -OREG(5)) {
- sp8C.pitch = -OREG(5);
+ if (sp8C.pitch < -R_CAM_MAX_PITCH) {
+ sp8C.pitch = -R_CAM_MAX_PITCH;
}
if (rwData->timer != 0) {
@@ -4650,8 +4675,8 @@ s32 Camera_Unique2(Camera* camera) {
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- f32 yNormal = ((1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM)) -
- (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight)));
+ f32 yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->distTarget = GET_NEXT_RO_DATA(values);
@@ -4726,8 +4751,8 @@ s32 Camera_Unique3(Camera* camera) {
camera->unk_14C &= ~0x10;
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
- f32 yNormal = (1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM)) -
- (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
+ f32 yNormal =
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerHeight));
roData->yOffset = GET_NEXT_SCALED_RO_DATA(values) * playerHeight * yNormal;
roData->fov = GET_NEXT_RO_DATA(values);
@@ -5617,7 +5642,7 @@ s32 Camera_Demo1(Camera* camera) {
switch (camera->animState) {
case 0:
- // initalize camera state
+ // initialize camera state
rwData->keyframe = 0;
rwData->curFrame = 0.0f;
camera->animState++;
@@ -6149,7 +6174,7 @@ s32 Camera_Demo6(Camera* camera) {
switch (camera->animState) {
case 0:
- // initalizes the camera state.
+ // initializes the camera state.
rwData->animTimer = 0;
camera->fov = 60.0f;
Actor_GetWorld(&focusPosRot, camFocus);
@@ -6255,7 +6280,7 @@ s32 Camera_Demo9(Camera* camera) {
switch (camera->animState) {
case 0:
- // initalize the camera state
+ // initialize the camera state
rwData->keyframe = 0;
rwData->finishAction = 0;
rwData->curFrame = 0.0f;
@@ -6276,7 +6301,7 @@ s32 Camera_Demo9(Camera* camera) {
// if the animation timer is still running, run the demo logic
// if it is not, then the case will fallthrough to the finish logic.
- // Run the at and eye cs interpoloation functions, if either of them return 1 (that no more points
+ // Run the at and eye cs interpolation functions, if either of them returns 1 (that no more points
// exist) change the animation state to 2 (standby)
if (func_800BB2B4(&csEyeUpdate, &newRoll, camFOV, onePointCamData->eyePoints, &rwData->keyframe,
&rwData->curFrame) != 0 ||
@@ -6478,7 +6503,7 @@ s32 Camera_Special5(Camera* camera) {
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
f32 yNormal =
- (1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM)) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / yOffset));
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / yOffset));
roData->yOffset = (GET_NEXT_SCALED_RO_DATA(values) * yOffset) * yNormal;
roData->eyeDist = GET_NEXT_RO_DATA(values);
@@ -6686,7 +6711,7 @@ s32 Camera_Special6(Camera* camera) {
camera->fov += (CAM_DATA_SCALED(fov) - camera->fov) / rwData->animTimer;
rwData->animTimer--;
} else {
- // Camera following link on the x axis.
+ // Camera following player on the x axis.
sCameraInterfaceFlags &= 0xF0FF;
eyePosCalc = *eyeNext;
eyePosCalc.x += (playerPosRot->pos.x - eyePosCalc.x) * 0.5f;
@@ -6730,7 +6755,7 @@ s32 Camera_Special9(Camera* camera) {
playerYOffset = Player_GetHeight(camera->player);
camera->unk_14C &= ~0x10;
yNormal =
- (1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM)) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerYOffset));
+ 1.0f + CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) - (CAM_DATA_SCALED(R_CAM_YOFFSET_NORM) * (68.0f / playerYOffset));
if (RELOAD_PARAMS(camera) || R_RELOAD_CAM_PARAMS) {
CameraModeValue* values = sCameraSettings[camera->setting].cameraModes[camera->mode].values;
@@ -6930,7 +6955,7 @@ 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_DEFA_PHI_UPDRATE;
+ 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));
@@ -6959,7 +6984,7 @@ void func_80057FC4(Camera* camera) {
if (camera != &camera->play->mainCamera) {
camera->prevSetting = camera->setting = CAM_SET_FREE0;
camera->unk_14C &= ~0x4;
- } else if (camera->play->roomCtx.curRoom.meshHeader->base.type != MESH_HEADER_TYPE_1) {
+ } else if (camera->play->roomCtx.curRoom.roomShape->base.type != ROOM_SHAPE_TYPE_IMAGE) {
switch (camera->play->roomCtx.curRoom.behaviorType1) {
case ROOM_BEHAVIOR_TYPE1_1:
Camera_ChangeDoorCam(camera, NULL, -99, 0, 0, 18, 10);
diff --git a/src/code/z_camera_data.c b/src/code/z_camera_data.c
index 1bc5b84b5f..5daad611b9 100644
--- a/src/code/z_camera_data.c
+++ b/src/code/z_camera_data.c
@@ -27,12 +27,62 @@ typedef struct {
/*==================================================================*/
// Data
s16 sOREGInit[] = {
- 0, 1, 5, 5, 5, 14500, 20, 16, 150, 25, 150, 6, 10, 10, 0, 0, 1, 100,
- 250, 120, 80, 30, 120, 4, 1, 50, 20, 1800, 50, 50, 50, 20, 20, -10, -5460, -9100,
- -6, 8, 15, 75, 60, 12, 110, 40, 50, 250, -10, 30, 30, 70, 20, 20, 20,
+ 0, // OREG(0)
+ 1, // OREG(1)
+ 5, // OREG(2)
+ 5, // OREG(3)
+ 5, // OREG(4)
+ 14500, // R_CAM_MAX_PITCH
+ 20, // OREG(6)
+ 16, // R_CAM_DEFAULT_PITCH_UPDATE_RATE_INV
+ 150, // OREG(8)
+ 25, // OREG(9)
+ 150, // OREG(10)
+ 6, // OREG(11)
+ 10, // OREG(12)
+ 10, // OREG(13)
+ 0, // OREG(14)
+ 0, // OREG(15)
+ 1, // OREG(16)
+ 100, // R_CAM_PITCH_FLOOR_CHECK_NEAR_DIST_FAC
+ 250, // R_CAM_PITCH_FLOOR_CHECK_FAR_DIST_FAC
+ 120, // R_CAM_PITCH_FLOOR_CHECK_OFFSET_Y_FAC
+ 80, // R_CAM_PITCH_FLOOR_CHECK_NEAR_WEIGHT
+ 30, // OREG(21)
+ 120, // OREG(22)
+ 4, // R_CAM_DEFAULT_ANIM_TIME
+ 1, // OREG(24)
+ 50, // OREG(25)
+ 20, // OREG(26)
+ 1800, // OREG(27)
+ 50, // OREG(28)
+ 50, // OREG(29)
+ 50, // OREG(30)
+ 20, // OREG(31)
+ 20, // OREG(32)
+ -10, // OREG(33)
+ -5460, // R_CAM_MIN_PITCH_1
+ -9100, // R_CAM_MIN_PITCH_2
+ -6, // OREG(36)
+ 8, // OREG(37)
+ 15, // OREG(38)
+ 75, // OREG(39)
+ 60, // OREG(40)
+ 12, // R_CAM_AT_LERP_STEP_SCALE_MIN
+ 110, // R_CAM_AT_LERP_STEP_SCALE_FAC
+ 40, // OREG(43)
+ 50, // OREG(44)
+ 250, // OREG(45)
+ -10, // R_CAM_YOFFSET_NORM
+ 30, // OREG(47)
+ 30, // OREG(48)
+ 70, // OREG(49)
+ 20, // OREG(50)
+ 20, // OREG(51)
+ 20, // OREG(52)
};
-s16 sOREGInitCnt = 53;
+s16 sOREGInitCnt = ARRAY_COUNT(sOREGInit);
s16 sCamDataRegsInit[CAM_DATA_MAX] = {
-20, // CAM_DATA_Y_OFFSET
@@ -355,8 +405,8 @@ CameraModeValue sSetNormal3ModeTalkData[] = {
CAM_FUNCDATA_KEEP3(-30, 70, 200, 40, 10, 10, 20, 70, 45, 10, 10, 0x3500),
};
-/* These values are for when the eye
- * >= OREG(45) units below the surface of the water.
+/*
+ * These values are for when the eye is >= OREG(45) units below the surface of the water.
*/
CameraModeValue sSetNormal3ModeBoomerangData[] = {
CAM_FUNCDATA_JUMP3(-40, 150, 250, -5, 18, 5, 60, 60, 40, 0x0005),
diff --git a/src/code/z_malloc.c b/src/code/z_malloc.c
index e51d381cb6..35942de28f 100644
--- a/src/code/z_malloc.c
+++ b/src/code/z_malloc.c
@@ -104,6 +104,6 @@ void ZeldaArena_Cleanup(void) {
__osMallocCleanup(&sZeldaArena);
}
-u8 ZeldaArena_IsInitalized(void) {
- return __osMallocIsInitalized(&sZeldaArena);
+u8 ZeldaArena_IsInitialized(void) {
+ return __osMallocIsInitialized(&sZeldaArena);
}
diff --git a/src/code/z_play.c b/src/code/z_play.c
index 4b9ef7efd3..c2d2784b00 100644
--- a/src/code/z_play.c
+++ b/src/code/z_play.c
@@ -517,10 +517,10 @@ void Play_Update(PlayState* this) {
// fade out bgm if "continue bgm" flag is not set
if (!(gEntranceTable[this->nextEntranceIndex + sceneLayer].field &
ENTRANCE_INFO_CONTINUE_BGM_FLAG)) {
- // "Sound initalized. 111"
+ // "Sound initialized. 111"
osSyncPrintf("\n\n\nサウンドイニシャル来ました。111");
if ((this->transitionType < TRANS_TYPE_MAX) && !Environment_IsForcedSequenceDisabled()) {
- // "Sound initalized. 222"
+ // "Sound initialized. 222"
osSyncPrintf("\n\n\nサウンドイニシャル来ました。222");
func_800F6964(0x14);
gSaveContext.seqId = (u8)NA_BGM_DISABLED;
@@ -1740,8 +1740,8 @@ void Play_TriggerRespawn(PlayState* this) {
s32 Play_CamIsNotFixed(PlayState* this) {
// SCENE_CAM_TYPE_FIXED_SHOP_VIEWPOINT was probably intended to be in this condition,
- // but the scene mesh header handles all shop cases regardless
- return (this->roomCtx.curRoom.meshHeader->base.type != MESH_HEADER_TYPE_1) &&
+ // but the room shape type check handles all shop cases regardless
+ return (this->roomCtx.curRoom.roomShape->base.type != ROOM_SHAPE_TYPE_IMAGE) &&
(R_SCENE_CAM_TYPE != SCENE_CAM_TYPE_FIXED_TOGGLE_VIEWPOINT) && (R_SCENE_CAM_TYPE != SCENE_CAM_TYPE_FIXED) &&
(R_SCENE_CAM_TYPE != SCENE_CAM_TYPE_FIXED_MARKET) && (this->sceneId != SCENE_HAIRAL_NIWA);
}
diff --git a/src/code/z_room.c b/src/code/z_room.c
index 3a6b33d4ea..add5101380 100644
--- a/src/code/z_room.c
+++ b/src/code/z_room.c
@@ -1,10 +1,6 @@
#include "global.h"
#include "vt.h"
-void Room_Draw0(PlayState* play, Room* room, u32 flags);
-void Room_Draw2(PlayState* play, Room* room, u32 flags);
-void Room_Draw1(PlayState* play, Room* room, u32 flags);
-
Vec3f D_801270A0 = { 0.0f, 0.0f, 0.0f };
// unused
@@ -22,19 +18,23 @@ Gfx D_801270B0[] = {
gsSPEndDisplayList(),
};
-void (*sRoomDrawHandlers[MESH_HEADER_TYPE_MAX])(PlayState* play, Room* room, u32 flags) = {
- Room_Draw0,
- Room_Draw1,
- Room_Draw2,
+void Room_DrawNormal(PlayState* play, Room* room, u32 flags);
+void Room_DrawImage(PlayState* play, Room* room, u32 flags);
+void Room_DrawCullable(PlayState* play, Room* room, u32 flags);
+
+void (*sRoomDrawHandlers[ROOM_SHAPE_TYPE_MAX])(PlayState* play, Room* room, u32 flags) = {
+ Room_DrawNormal, // ROOM_SHAPE_TYPE_NORMAL
+ Room_DrawImage, // ROOM_SHAPE_TYPE_IMAGE
+ Room_DrawCullable, // ROOM_SHAPE_TYPE_CULLABLE
};
-void func_80095AA0(PlayState* play, Room* room, Input* arg2, UNK_TYPE arg3) {
+void func_80095AA0(PlayState* play, Room* room, Input* input, s32 arg3) {
}
-void Room_Draw0(PlayState* play, Room* room, u32 flags) {
+void Room_DrawNormal(PlayState* play, Room* room, u32 flags) {
s32 i;
- MeshHeader0* meshHeader0;
- MeshHeader01Entry* meshHeader0Entry;
+ RoomShapeNormal* roomShape;
+ RoomShapeDListsEntry* entry;
OPEN_DISPS(play->state.gfxCtx, "../z_room.c", 193);
@@ -52,59 +52,75 @@ void Room_Draw0(PlayState* play, Room* room, u32 flags) {
gSPMatrix(POLY_XLU_DISP++, &gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD);
}
- meshHeader0 = &room->meshHeader->meshHeader0;
- meshHeader0Entry = SEGMENTED_TO_VIRTUAL(meshHeader0->entries);
- for (i = 0; i < meshHeader0->numEntries; i++) {
- if ((flags & ROOM_DRAW_OPA) && (meshHeader0Entry->opa != NULL)) {
- gSPDisplayList(POLY_OPA_DISP++, meshHeader0Entry->opa);
+ roomShape = &room->roomShape->normal;
+ entry = SEGMENTED_TO_VIRTUAL(roomShape->entries);
+ for (i = 0; i < roomShape->numEntries; i++) {
+ if ((flags & ROOM_DRAW_OPA) && (entry->opa != NULL)) {
+ gSPDisplayList(POLY_OPA_DISP++, entry->opa);
}
- if ((flags & ROOM_DRAW_XLU) && (meshHeader0Entry->xlu != NULL)) {
- gSPDisplayList(POLY_XLU_DISP++, meshHeader0Entry->xlu);
+ if ((flags & ROOM_DRAW_XLU) && (entry->xlu != NULL)) {
+ gSPDisplayList(POLY_XLU_DISP++, entry->xlu);
}
- meshHeader0Entry++;
+ entry++;
}
CLOSE_DISPS(play->state.gfxCtx, "../z_room.c", 239);
}
-#define SHAPE_SORT_MAX 64
+typedef enum {
+ /* 0 */ ROOM_CULL_DEBUG_MODE_OFF,
+ /* 1 */ ROOM_CULL_DEBUG_MODE_UP_TO_TARGET,
+ /* 2 */ ROOM_CULL_DEBUG_MODE_ONLY_TARGET
+} RoomCullableDebugMode;
-typedef struct struct_80095D04 {
- /* 0x00 */ MeshHeader2Entry* unk_00;
- /* 0x04 */ f32 unk_04;
- /* 0x08 */ struct struct_80095D04* unk_08;
- /* 0x0C */ struct struct_80095D04* unk_0C;
-} struct_80095D04; // size = 0x10
+typedef struct RoomShapeCullableEntryLinked {
+ /* 0x00 */ RoomShapeCullableEntry* entry;
+ /* 0x04 */ f32 boundsNearZ;
+ /* 0x08 */ struct RoomShapeCullableEntryLinked* prev;
+ /* 0x0C */ struct RoomShapeCullableEntryLinked* next;
+} RoomShapeCullableEntryLinked; // size = 0x10
-void Room_Draw2(PlayState* play, Room* room, u32 flags) {
- MeshHeader2* meshHeader2;
- MeshHeader2Entry* meshHeader2Entry;
- struct_80095D04 spB8[SHAPE_SORT_MAX];
- struct_80095D04* spB4 = NULL;
- struct_80095D04* spB0 = NULL;
- struct_80095D04* iter;
+/**
+ * Handle room drawing for the "cullable" type of room shape.
+ *
+ * Each entry referenced by the room shape struct is attached to display lists, and a position and radius indicating the
+ * bounding sphere for the geometry drawn.
+ * The first step Z-sorts the entries, and excludes the entries with a bounding sphere that is entirely before or
+ * beyond the rendered depth range.
+ * The second step draws the entries that remain, from nearest to furthest.
+ */
+void Room_DrawCullable(PlayState* play, Room* room, u32 flags) {
+ RoomShapeCullable* roomShape;
+ RoomShapeCullableEntry* roomShapeCullableEntry;
+ RoomShapeCullableEntryLinked linkedEntriesBuffer[ROOM_SHAPE_CULLABLE_MAX_ENTRIES];
+ RoomShapeCullableEntryLinked* head = NULL;
+ RoomShapeCullableEntryLinked* tail = NULL;
+ RoomShapeCullableEntryLinked* iter;
s32 pad;
- struct_80095D04* spA4;
+ RoomShapeCullableEntryLinked* insert;
s32 j;
s32 i;
Vec3f pos;
Vec3f projectedPos;
f32 projectedW;
s32 pad2;
- MeshHeader2Entry* meshHeader2Entries;
- MeshHeader2Entry* meshHeader2EntryIter;
- f32 temp_f2;
+ RoomShapeCullableEntry* roomShapeCullableEntries;
+ RoomShapeCullableEntry* roomShapeCullableEntryIter;
+ f32 entryBoundsNearZ;
OPEN_DISPS(play->state.gfxCtx, "../z_room.c", 287);
+
if (flags & ROOM_DRAW_OPA) {
func_800342EC(&D_801270A0, play);
gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
func_80093C80(play);
gSPMatrix(POLY_OPA_DISP++, &gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD);
}
+
if (1) {}
+
if (flags & ROOM_DRAW_XLU) {
func_8003435C(&D_801270A0, play);
gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
@@ -112,80 +128,103 @@ void Room_Draw2(PlayState* play, Room* room, u32 flags) {
gSPMatrix(POLY_XLU_DISP++, &gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD);
}
- meshHeader2 = &room->meshHeader->meshHeader2;
- meshHeader2Entry = SEGMENTED_TO_VIRTUAL(meshHeader2->entries);
- spA4 = spB8;
+ roomShape = &room->roomShape->cullable;
+ roomShapeCullableEntry = SEGMENTED_TO_VIRTUAL(roomShape->entries);
+ insert = linkedEntriesBuffer;
- ASSERT(meshHeader2->numEntries <= SHAPE_SORT_MAX, "polygon2->num <= SHAPE_SORT_MAX", "../z_room.c", 317);
- meshHeader2Entries = meshHeader2Entry;
+ ASSERT(roomShape->numEntries <= ROOM_SHAPE_CULLABLE_MAX_ENTRIES, "polygon2->num <= SHAPE_SORT_MAX", "../z_room.c",
+ 317);
- for (i = 0; i < meshHeader2->numEntries; i++, meshHeader2Entry++) {
- pos.x = meshHeader2Entry->pos.x;
- pos.y = meshHeader2Entry->pos.y;
- pos.z = meshHeader2Entry->pos.z;
+ roomShapeCullableEntries = roomShapeCullableEntry;
+
+ // Pick and sort entries by depth
+ for (i = 0; i < roomShape->numEntries; i++, roomShapeCullableEntry++) {
+
+ // Project the entry position, to get the depth it is at.
+ pos.x = roomShapeCullableEntry->boundsSphereCenter.x;
+ pos.y = roomShapeCullableEntry->boundsSphereCenter.y;
+ pos.z = roomShapeCullableEntry->boundsSphereCenter.z;
SkinMatrix_Vec3fMtxFMultXYZW(&play->viewProjectionMtxF, &pos, &projectedPos, &projectedW);
- if (-(f32)meshHeader2Entry->unk_06 < projectedPos.z) {
- temp_f2 = projectedPos.z - meshHeader2Entry->unk_06;
- if (temp_f2 < play->lightCtx.fogFar) {
- spA4->unk_00 = meshHeader2Entry;
- spA4->unk_04 = temp_f2;
- iter = spB4;
+
+ // If the entry bounding sphere isn't fully before the rendered depth range
+ if (-(f32)roomShapeCullableEntry->boundsSphereRadius < projectedPos.z) {
+
+ // Compute the depth of the nearest point in the entry's bounding sphere
+ entryBoundsNearZ = projectedPos.z - roomShapeCullableEntry->boundsSphereRadius;
+
+ // If the entry bounding sphere isn't fully beyond the rendered depth range
+ if (entryBoundsNearZ < play->lightCtx.fogFar) {
+
+ // This entry will be rendered
+ insert->entry = roomShapeCullableEntry;
+ insert->boundsNearZ = entryBoundsNearZ;
+
+ // Insert into the linked list, ordered by ascending depth of the nearest point in the bounding sphere
+ iter = head;
if (iter == NULL) {
- spB4 = spB0 = spA4;
- spA4->unk_08 = spA4->unk_0C = NULL;
+ head = tail = insert;
+ insert->prev = insert->next = NULL;
} else {
do {
- if (spA4->unk_04 < iter->unk_04) {
+ if (insert->boundsNearZ < iter->boundsNearZ) {
break;
}
- iter = iter->unk_0C;
+ iter = iter->next;
} while (iter != NULL);
if (iter == NULL) {
- spA4->unk_08 = spB0;
- spA4->unk_0C = NULL;
- spB0->unk_0C = spA4;
- spB0 = spA4;
+ insert->prev = tail;
+ insert->next = NULL;
+ tail->next = insert;
+ tail = insert;
} else {
- spA4->unk_08 = iter->unk_08;
- if (spA4->unk_08 == NULL) {
- spB4 = spA4;
+ insert->prev = iter->prev;
+ if (insert->prev == NULL) {
+ head = insert;
} else {
- spA4->unk_08->unk_0C = spA4;
+ insert->prev->next = insert;
}
- iter->unk_08 = spA4;
- spA4->unk_0C = iter;
+ iter->prev = insert;
+ insert->next = iter;
}
}
- spA4++;
+
+ insert++;
}
}
}
- iREG(87) = meshHeader2->numEntries & 0xFFFF & 0xFFFF & 0xFFFF; // if this is real then I might not be
+ // if this is real then I might not be
+ R_ROOM_CULL_NUM_ENTRIES = roomShape->numEntries & 0xFFFF & 0xFFFF & 0xFFFF;
- for (i = 1; spB4 != NULL; spB4 = spB4->unk_0C, i++) {
+ // Draw entries, from nearest to furthest
+ for (i = 1; head != NULL; head = head->next, i++) {
Gfx* displayList;
- meshHeader2Entry = spB4->unk_00;
- if (iREG(86) != 0) {
- meshHeader2EntryIter = meshHeader2Entries;
- for (j = 0; j < meshHeader2->numEntries; j++, meshHeader2EntryIter++) {
- if (meshHeader2Entry == meshHeader2EntryIter) {
- break; // This loop does nothing?
+ roomShapeCullableEntry = head->entry;
+
+ if (R_ROOM_CULL_DEBUG_MODE != ROOM_CULL_DEBUG_MODE_OFF) {
+ // Debug mode drawing
+
+ // This loop does nothing
+ roomShapeCullableEntryIter = roomShapeCullableEntries;
+ for (j = 0; j < roomShape->numEntries; j++, roomShapeCullableEntryIter++) {
+ if (roomShapeCullableEntry == roomShapeCullableEntryIter) {
+ break;
}
}
- if (((iREG(86) == 1) && (iREG(89) >= i)) || ((iREG(86) == 2) && (iREG(89) == i))) {
+ if (((R_ROOM_CULL_DEBUG_MODE == ROOM_CULL_DEBUG_MODE_UP_TO_TARGET) && (i <= R_ROOM_CULL_DEBUG_TARGET)) ||
+ ((R_ROOM_CULL_DEBUG_MODE == ROOM_CULL_DEBUG_MODE_ONLY_TARGET) && (i == R_ROOM_CULL_DEBUG_TARGET))) {
if (flags & ROOM_DRAW_OPA) {
- displayList = meshHeader2Entry->opa;
+ displayList = roomShapeCullableEntry->opa;
if (displayList != NULL) {
gSPDisplayList(POLY_OPA_DISP++, displayList);
}
}
if (flags & ROOM_DRAW_XLU) {
- displayList = meshHeader2Entry->xlu;
+ displayList = roomShapeCullableEntry->xlu;
if (displayList != NULL) {
gSPDisplayList(POLY_XLU_DISP++, displayList);
}
@@ -193,14 +232,14 @@ void Room_Draw2(PlayState* play, Room* room, u32 flags) {
}
} else {
if (flags & ROOM_DRAW_OPA) {
- displayList = meshHeader2Entry->opa;
+ displayList = roomShapeCullableEntry->opa;
if (displayList != NULL) {
gSPDisplayList(POLY_OPA_DISP++, displayList);
}
}
if (flags & ROOM_DRAW_XLU) {
- displayList = meshHeader2Entry->xlu;
+ displayList = roomShapeCullableEntry->xlu;
if (displayList != NULL) {
gSPDisplayList(POLY_XLU_DISP++, displayList);
}
@@ -208,14 +247,18 @@ void Room_Draw2(PlayState* play, Room* room, u32 flags) {
}
}
- iREG(88) = i - 1;
+ R_ROOM_CULL_USED_ENTRIES = i - 1;
CLOSE_DISPS(play->state.gfxCtx, "../z_room.c", 430);
}
#define JPEG_MARKER 0xFFD8FFE0
-s32 func_80096238(void* data) {
+/**
+ * If the data is JPEG, decode it and overwrite the initial data with the result.
+ * Uses the depth frame buffer as temporary storage.
+ */
+s32 Room_DecodeJpeg(void* data) {
OSTime time;
if (*(u32*)data == JPEG_MARKER) {
@@ -232,10 +275,10 @@ s32 func_80096238(void* data) {
osSyncPrintf("成功…だと思う。 time = %6.3f ms \n", OS_CYCLES_TO_USEC(time) / 1000.0f);
// "Writing back to original address from work buffer."
osSyncPrintf("ワークバッファから元のアドレスに書き戻します。\n");
- // "If the original buffer size isn't at least 150kb, it will be out of control."
+ // "If the original buffer size isn't at least 150kB, it will be out of control."
osSyncPrintf("元のバッファのサイズが150キロバイト無いと暴走するでしょう。\n");
- bcopy(gZBuffer, data, sizeof(gZBuffer));
+ bcopy(gZBuffer, data, sizeof(u16[SCREEN_HEIGHT][SCREEN_WIDTH]));
} else {
osSyncPrintf("失敗!なんで〜\n"); // "Failure! Why is it 〜"
}
@@ -244,72 +287,78 @@ s32 func_80096238(void* data) {
return 0;
}
-void func_8009638C(Gfx** displayList, void* source, void* tlut, u16 width, u16 height, u8 fmt, u8 siz, u16 mode0,
- u16 tlutCount, f32 frameX, f32 frameY) {
- Gfx* displayListHead;
+void Room_DrawBackground2D(Gfx** gfxP, void* tex, void* tlut, u16 width, u16 height, u8 fmt, u8 siz, u16 tlutMode,
+ u16 tlutCount, f32 offsetX, f32 offsetY) {
+ Gfx* gfx = *gfxP;
uObjBg* bg;
- displayListHead = *displayList;
- func_80096238(SEGMENTED_TO_VIRTUAL(source));
+ Room_DecodeJpeg(SEGMENTED_TO_VIRTUAL(tex));
+
+ bg = (uObjBg*)(gfx + 1);
+ gSPBranchList(gfx, (u32)bg + sizeof(uObjBg));
- bg = (uObjBg*)(displayListHead + 1);
- gSPBranchList(displayListHead, (u8*)bg + sizeof(uObjBg));
bg->b.imageX = 0;
- bg->b.imageW = width * 4;
- bg->b.frameX = frameX * 4;
+ bg->b.imageW = width * (1 << 2);
+ bg->b.frameX = offsetX * (1 << 2);
bg->b.imageY = 0;
- bg->b.imageH = height * 4;
- bg->b.frameY = frameY * 4;
- bg->b.imagePtr = source;
+ bg->b.imageH = height * (1 << 2);
+ bg->b.frameY = offsetY * (1 << 2);
+ bg->b.imagePtr = tex;
bg->b.imageLoad = G_BGLT_LOADTILE;
bg->b.imageFmt = fmt;
bg->b.imageSiz = siz;
bg->b.imagePal = 0;
bg->b.imageFlip = 0;
- displayListHead = (void*)(bg + 1);
+ gfx = (Gfx*)((u32)bg + sizeof(uObjBg));
+
if (fmt == G_IM_FMT_CI) {
- gDPLoadTLUT(displayListHead++, tlutCount, 256, tlut);
+ gDPLoadTLUT(gfx++, tlutCount, 256, tlut);
} else {
- gDPPipeSync(displayListHead++);
+ gDPPipeSync(gfx++);
}
- if ((fmt == G_IM_FMT_RGBA) && (SREG(26) == 0)) {
- bg->b.frameW = width * 4;
- bg->b.frameH = height * 4;
+ if ((fmt == G_IM_FMT_RGBA) && !R_ROOM_BG2D_FORCE_SCALEBG) {
+ bg->b.frameW = width * (1 << 2);
+ bg->b.frameH = height * (1 << 2);
guS2DInitBg(bg);
- gDPSetOtherMode(displayListHead++, mode0 | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_COPY | G_PM_NPRIMITIVE,
+ gDPSetOtherMode(gfx++, tlutMode | G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_COPY | G_PM_NPRIMITIVE,
G_AC_THRESHOLD | G_ZS_PIXEL | G_RM_NOOP | G_RM_NOOP2);
- gSPBgRectCopy(displayListHead++, bg);
+ gSPBgRectCopy(gfx++, bg);
} else {
- bg->s.frameW = width * 4;
- bg->s.frameH = height * 4;
- bg->s.scaleW = 1024;
- bg->s.scaleH = 1024;
+ bg->s.frameW = width * (1 << 2);
+ bg->s.frameH = height * (1 << 2);
+ bg->s.scaleW = 1 << 10;
+ bg->s.scaleH = 1 << 10;
bg->s.imageYorig = bg->b.imageY;
- gDPSetOtherMode(displayListHead++,
- mode0 | G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TT_NONE |
- G_TL_TILE | G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
+ gDPSetOtherMode(gfx++,
+ tlutMode | G_AD_DISABLE | G_CD_DISABLE | G_CK_NONE | G_TC_FILT | G_TF_POINT | G_TL_TILE |
+ G_TD_CLAMP | G_TP_NONE | G_CYC_1CYCLE | G_PM_NPRIMITIVE,
G_AC_THRESHOLD | G_ZS_PIXEL | AA_EN | CVG_DST_CLAMP | ZMODE_OPA | CVG_X_ALPHA | ALPHA_CVG_SEL |
GBL_c1(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_BL, G_BL_1MA) |
GBL_c2(G_BL_CLR_IN, G_BL_A_IN, G_BL_CLR_BL, G_BL_1MA));
- gDPSetCombineLERP(displayListHead++, 0, 0, 0, TEXEL0, 0, 0, 0, 1, 0, 0, 0, TEXEL0, 0, 0, 0, 1);
- gSPObjRenderMode(displayListHead++, G_OBJRM_ANTIALIAS | G_OBJRM_BILERP);
- gSPBgRect1Cyc(displayListHead++, bg);
+ gDPSetCombineLERP(gfx++, 0, 0, 0, TEXEL0, 0, 0, 0, 1, 0, 0, 0, TEXEL0, 0, 0, 0, 1);
+ gSPObjRenderMode(gfx++, G_OBJRM_ANTIALIAS | G_OBJRM_BILERP);
+ gSPBgRect1Cyc(gfx++, bg);
}
- gDPPipeSync(displayListHead++);
- *displayList = displayListHead;
+ gDPPipeSync(gfx++);
+
+ *gfxP = gfx;
}
-void Room_Draw1Single(PlayState* play, Room* room, u32 flags) {
+#define ROOM_IMAGE_NODRAW_BACKGROUND (1 << 0)
+#define ROOM_IMAGE_NODRAW_OPA (1 << 1)
+#define ROOM_IMAGE_NODRAW_XLU (1 << 2)
+
+void Room_DrawImageSingle(PlayState* play, Room* room, u32 flags) {
Camera* activeCam;
- Gfx* spA8;
- MeshHeader1Single* meshHeader1Single;
- MeshHeader01Entry* meshHeader1Entry;
+ Gfx* gfx;
+ RoomShapeImageSingle* roomShape;
+ RoomShapeDListsEntry* entry;
u32 isFixedCamera;
- u32 drawBg;
+ u32 drawBackground;
u32 drawOpa;
u32 drawXlu;
@@ -317,123 +366,34 @@ void Room_Draw1Single(PlayState* play, Room* room, u32 flags) {
activeCam = GET_ACTIVE_CAM(play);
isFixedCamera = (activeCam->setting == CAM_SET_PREREND_FIXED);
- meshHeader1Single = &room->meshHeader->meshHeader1Single;
- meshHeader1Entry = SEGMENTED_TO_VIRTUAL(meshHeader1Single->base.entry);
- drawBg = (flags & ROOM_DRAW_OPA) && isFixedCamera && meshHeader1Single->source && !(SREG(25) & 1);
- drawOpa = (flags & ROOM_DRAW_OPA) && (meshHeader1Entry->opa != NULL) && !(SREG(25) & 2);
- drawXlu = (flags & ROOM_DRAW_XLU) && (meshHeader1Entry->xlu != NULL) && !(SREG(25) & 4);
+ roomShape = &room->roomShape->image.single;
+ entry = SEGMENTED_TO_VIRTUAL(roomShape->base.entry);
+ drawBackground = (flags & ROOM_DRAW_OPA) && isFixedCamera && (roomShape->source != NULL) &&
+ !(R_ROOM_IMAGE_NODRAW_FLAGS & ROOM_IMAGE_NODRAW_BACKGROUND);
+ drawOpa = (flags & ROOM_DRAW_OPA) && (entry->opa != NULL) && !(R_ROOM_IMAGE_NODRAW_FLAGS & ROOM_IMAGE_NODRAW_OPA);
+ drawXlu = (flags & ROOM_DRAW_XLU) && (entry->xlu != NULL) && !(R_ROOM_IMAGE_NODRAW_FLAGS & ROOM_IMAGE_NODRAW_XLU);
- if (drawOpa || drawBg) {
+ if (drawOpa || drawBackground) {
gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
if (drawOpa) {
Gfx_SetupDL_25Opa(play->state.gfxCtx);
gSPMatrix(POLY_OPA_DISP++, &gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD);
- gSPDisplayList(POLY_OPA_DISP++, meshHeader1Entry->opa);
+ gSPDisplayList(POLY_OPA_DISP++, entry->opa);
}
- if (drawBg) {
+ if (drawBackground) {
gSPLoadUcodeL(POLY_OPA_DISP++, gspS2DEX2d_fifo);
{
- Vec3f sp60;
- spA8 = POLY_OPA_DISP;
- Camera_GetSkyboxOffset(&sp60, activeCam);
- func_8009638C(&spA8, meshHeader1Single->source, meshHeader1Single->tlut, meshHeader1Single->width,
- meshHeader1Single->height, meshHeader1Single->fmt, meshHeader1Single->siz,
- meshHeader1Single->mode0, meshHeader1Single->tlutCount,
- (sp60.x + sp60.z) * 1.2f + sp60.y * 0.6f, sp60.y * 2.4f + (sp60.x + sp60.z) * 0.3f);
- POLY_OPA_DISP = spA8;
- }
-
- gSPLoadUcode(POLY_OPA_DISP++, SysUcode_GetUCode(), SysUcode_GetUCodeData());
- }
- }
-
- if (drawXlu) {
- gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
- Gfx_SetupDL_25Xlu(play->state.gfxCtx);
- gSPMatrix(POLY_XLU_DISP++, &gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD);
- gSPDisplayList(POLY_XLU_DISP++, meshHeader1Entry->xlu);
- }
-
- CLOSE_DISPS(play->state.gfxCtx, "../z_room.c", 691);
-}
-
-BgImage* func_80096A74(MeshHeader1Multi* meshHeader1Multi, PlayState* play) {
- Camera* activeCam = GET_ACTIVE_CAM(play);
- s32 bgCamIndex = activeCam->bgCamIndex;
- s16 jfifId;
- Player* player;
- BgImage* bgImage;
- s32 i;
-
- jfifId = ((BgCamFuncData*)BgCheck_GetBgCamFuncDataImpl(&play->colCtx, bgCamIndex, BGCHECK_SCENE))->jfifId;
- if (jfifId >= 0) {
- bgCamIndex = jfifId;
- }
-
- player = GET_PLAYER(play);
- player->actor.params = (player->actor.params & 0xFF00) | bgCamIndex;
-
- bgImage = SEGMENTED_TO_VIRTUAL(meshHeader1Multi->list);
- for (i = 0; i < meshHeader1Multi->count; i++) {
- if (bgImage->id == bgCamIndex) {
- return bgImage;
- }
- bgImage++;
- }
-
- // "z_room.c: Data consistent with camera id does not exist camid=%d"
- osSyncPrintf(VT_COL(RED, WHITE) "z_room.c:カメラIDに一致するデータが存在しません camid=%d\n" VT_RST, bgCamIndex);
- LogUtils_HungupThread("../z_room.c", 726);
-
- return NULL;
-}
-
-void Room_Draw1Multi(PlayState* play, Room* room, u32 flags) {
- Camera* activeCam;
- Gfx* gfx;
- MeshHeader1Multi* meshHeader1Multi;
- BgImage* bgImage;
- MeshHeader01Entry* meshHeader1Entry;
- u32 isFixedCamera;
- u32 drawBg;
- u32 drawOpa;
- u32 drawXlu;
-
- OPEN_DISPS(play->state.gfxCtx, "../z_room.c", 752);
-
- activeCam = GET_ACTIVE_CAM(play);
- isFixedCamera = (activeCam->setting == CAM_SET_PREREND_FIXED);
- meshHeader1Multi = &room->meshHeader->meshHeader1Multi;
- meshHeader1Entry = SEGMENTED_TO_VIRTUAL(meshHeader1Multi->base.entry);
- bgImage = func_80096A74(meshHeader1Multi, play);
- drawBg = (flags & ROOM_DRAW_OPA) && isFixedCamera && bgImage->source && !(SREG(25) & 1);
- drawOpa = (flags & ROOM_DRAW_OPA) && (meshHeader1Entry->opa != NULL) && !(SREG(25) & 2);
- drawXlu = (flags & ROOM_DRAW_XLU) && (meshHeader1Entry->xlu != NULL) && !(SREG(25) & 4);
-
- if (drawOpa || drawBg) {
- gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
-
- if (drawOpa) {
- Gfx_SetupDL_25Opa(play->state.gfxCtx);
- gSPMatrix(POLY_OPA_DISP++, &gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD);
- gSPDisplayList(POLY_OPA_DISP++, meshHeader1Entry->opa);
- }
-
- if (drawBg) {
- gSPLoadUcodeL(POLY_OPA_DISP++, gspS2DEX2d_fifo);
-
- {
- Vec3f skyboxOffset;
+ Vec3f quakeOffset;
gfx = POLY_OPA_DISP;
- Camera_GetSkyboxOffset(&skyboxOffset, activeCam);
- func_8009638C(&gfx, bgImage->source, bgImage->tlut, bgImage->width, bgImage->height, bgImage->fmt,
- bgImage->siz, bgImage->mode0, bgImage->tlutCount,
- (skyboxOffset.x + skyboxOffset.z) * 1.2f + skyboxOffset.y * 0.6f,
- skyboxOffset.y * 2.4f + (skyboxOffset.x + skyboxOffset.z) * 0.3f);
+ Camera_GetSkyboxOffset(&quakeOffset, activeCam);
+ Room_DrawBackground2D(&gfx, roomShape->source, roomShape->tlut, roomShape->width, roomShape->height,
+ roomShape->fmt, roomShape->siz, roomShape->tlutMode, roomShape->tlutCount,
+ (quakeOffset.x + quakeOffset.z) * 1.2f + quakeOffset.y * 0.6f,
+ quakeOffset.y * 2.4f + (quakeOffset.x + quakeOffset.z) * 0.3f);
POLY_OPA_DISP = gfx;
}
@@ -445,19 +405,117 @@ void Room_Draw1Multi(PlayState* play, Room* room, u32 flags) {
gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
Gfx_SetupDL_25Xlu(play->state.gfxCtx);
gSPMatrix(POLY_XLU_DISP++, &gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD);
- gSPDisplayList(POLY_XLU_DISP++, meshHeader1Entry->xlu);
+ gSPDisplayList(POLY_XLU_DISP++, entry->xlu);
+ }
+
+ CLOSE_DISPS(play->state.gfxCtx, "../z_room.c", 691);
+}
+
+RoomShapeImageMultiBgEntry* Room_GetImageMultiBgEntry(RoomShapeImageMulti* roomShapeImageMulti, PlayState* play) {
+ Camera* activeCam = GET_ACTIVE_CAM(play);
+ s32 bgCamIndex = activeCam->bgCamIndex;
+ s16 overrideBgCamIndex;
+ Player* player;
+ RoomShapeImageMultiBgEntry* bgEntry;
+ s32 i;
+
+ // In mq debug vanilla scenes, overrideBgCamIndex is always -1 or the same as bgCamIndex
+ overrideBgCamIndex = ((BgCamFuncData*)BgCheck_GetBgCamFuncDataImpl(&play->colCtx, bgCamIndex, BGCHECK_SCENE))
+ ->roomImageOverrideBgCamIndex;
+ if (overrideBgCamIndex >= 0) {
+ bgCamIndex = overrideBgCamIndex;
+ }
+
+ player = GET_PLAYER(play);
+ player->actor.params = (player->actor.params & 0xFF00) | bgCamIndex;
+
+ bgEntry = SEGMENTED_TO_VIRTUAL(roomShapeImageMulti->backgrounds);
+ for (i = 0; i < roomShapeImageMulti->numBackgrounds; i++) {
+ if (bgEntry->bgCamIndex == bgCamIndex) {
+ return bgEntry;
+ }
+ bgEntry++;
+ }
+
+ // "z_room.c: Data consistent with camera id does not exist camid=%d"
+ osSyncPrintf(VT_COL(RED, WHITE) "z_room.c:カメラIDに一致するデータが存在しません camid=%d\n" VT_RST, bgCamIndex);
+ LogUtils_HungupThread("../z_room.c", 726);
+
+ return NULL;
+}
+
+void Room_DrawImageMulti(PlayState* play, Room* room, u32 flags) {
+ Camera* activeCam;
+ Gfx* gfx;
+ RoomShapeImageMulti* roomShape;
+ RoomShapeImageMultiBgEntry* bgEntry;
+ RoomShapeDListsEntry* dListsEntry;
+ u32 isFixedCamera;
+ u32 drawBackground;
+ u32 drawOpa;
+ u32 drawXlu;
+
+ OPEN_DISPS(play->state.gfxCtx, "../z_room.c", 752);
+
+ activeCam = GET_ACTIVE_CAM(play);
+ isFixedCamera = (activeCam->setting == CAM_SET_PREREND_FIXED);
+ roomShape = &room->roomShape->image.multi;
+ dListsEntry = SEGMENTED_TO_VIRTUAL(roomShape->base.entry);
+
+ bgEntry = Room_GetImageMultiBgEntry(roomShape, play);
+
+ drawBackground = (flags & ROOM_DRAW_OPA) && isFixedCamera && (bgEntry->source != NULL) &&
+ !(R_ROOM_IMAGE_NODRAW_FLAGS & ROOM_IMAGE_NODRAW_BACKGROUND);
+ drawOpa =
+ (flags & ROOM_DRAW_OPA) && (dListsEntry->opa != NULL) && !(R_ROOM_IMAGE_NODRAW_FLAGS & ROOM_IMAGE_NODRAW_OPA);
+ drawXlu =
+ (flags & ROOM_DRAW_XLU) && (dListsEntry->xlu != NULL) && !(R_ROOM_IMAGE_NODRAW_FLAGS & ROOM_IMAGE_NODRAW_XLU);
+
+ if (drawOpa || drawBackground) {
+ gSPSegment(POLY_OPA_DISP++, 0x03, room->segment);
+
+ if (drawOpa) {
+ Gfx_SetupDL_25Opa(play->state.gfxCtx);
+ gSPMatrix(POLY_OPA_DISP++, &gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD);
+ gSPDisplayList(POLY_OPA_DISP++, dListsEntry->opa);
+ }
+
+ if (drawBackground) {
+ gSPLoadUcodeL(POLY_OPA_DISP++, gspS2DEX2d_fifo);
+
+ {
+ Vec3f quakeOffset;
+
+ gfx = POLY_OPA_DISP;
+ Camera_GetSkyboxOffset(&quakeOffset, activeCam);
+ Room_DrawBackground2D(&gfx, bgEntry->source, bgEntry->tlut, bgEntry->width, bgEntry->height,
+ bgEntry->fmt, bgEntry->siz, bgEntry->tlutMode, bgEntry->tlutCount,
+ (quakeOffset.x + quakeOffset.z) * 1.2f + quakeOffset.y * 0.6f,
+ quakeOffset.y * 2.4f + (quakeOffset.x + quakeOffset.z) * 0.3f);
+ POLY_OPA_DISP = gfx;
+ }
+
+ gSPLoadUcode(POLY_OPA_DISP++, SysUcode_GetUCode(), SysUcode_GetUCodeData());
+ }
+ }
+
+ if (drawXlu) {
+ gSPSegment(POLY_XLU_DISP++, 0x03, room->segment);
+ Gfx_SetupDL_25Xlu(play->state.gfxCtx);
+ gSPMatrix(POLY_XLU_DISP++, &gMtxClear, G_MTX_MODELVIEW | G_MTX_LOAD);
+ gSPDisplayList(POLY_XLU_DISP++, dListsEntry->xlu);
}
CLOSE_DISPS(play->state.gfxCtx, "../z_room.c", 819);
}
-void Room_Draw1(PlayState* play, Room* room, u32 flags) {
- MeshHeader1Base* meshHeader1Base = &room->meshHeader->meshHeader1Base;
+void Room_DrawImage(PlayState* play, Room* room, u32 flags) {
+ RoomShapeImageBase* roomShape = &room->roomShape->image.base;
- if (meshHeader1Base->format == MESH_HEADER1_FORMAT_SINGLE) {
- Room_Draw1Single(play, room, flags);
- } else if (meshHeader1Base->format == MESH_HEADER1_FORMAT_MULTI) {
- Room_Draw1Multi(play, room, flags);
+ if (roomShape->amountType == ROOM_SHAPE_IMAGE_AMOUNT_SINGLE) {
+ Room_DrawImageSingle(play, room, flags);
+ } else if (roomShape->amountType == ROOM_SHAPE_IMAGE_AMOUNT_MULTI) {
+ Room_DrawImageMulti(play, room, flags);
} else {
LogUtils_HungupThread("../z_room.c", 841);
}
@@ -578,9 +636,9 @@ s32 func_800973FC(PlayState* play, RoomContext* roomCtx) {
void Room_Draw(PlayState* play, Room* room, u32 flags) {
if (room->segment != NULL) {
gSegments[3] = VIRTUAL_TO_PHYSICAL(room->segment);
- ASSERT(room->meshHeader->base.type < ARRAY_COUNTU(sRoomDrawHandlers),
+ ASSERT(room->roomShape->base.type < ARRAY_COUNTU(sRoomDrawHandlers),
"this->ground_shape->polygon.type < number(Room_Draw_Proc)", "../z_room.c", 1125);
- sRoomDrawHandlers[room->meshHeader->base.type](play, room, flags);
+ sRoomDrawHandlers[room->roomShape->base.type](play, room, flags);
}
}
diff --git a/src/code/z_scene.c b/src/code/z_scene.c
index fc2d32295a..6f21159949 100644
--- a/src/code/z_scene.c
+++ b/src/code/z_scene.c
@@ -243,8 +243,8 @@ void Scene_CommandRoomBehavior(PlayState* play, SceneCmd* cmd) {
play->msgCtx.disableWarpSongs = (cmd->roomBehavior.gpFlag2 >> 0xA) & 1;
}
-void Scene_CommandMeshHeader(PlayState* play, SceneCmd* cmd) {
- play->roomCtx.curRoom.meshHeader = SEGMENTED_TO_VIRTUAL(cmd->mesh.data);
+void Scene_CommandRoomShape(PlayState* play, SceneCmd* cmd) {
+ play->roomCtx.curRoom.roomShape = SEGMENTED_TO_VIRTUAL(cmd->mesh.data);
}
void Scene_CommandObjectList(PlayState* play, SceneCmd* cmd) {
@@ -480,7 +480,7 @@ void (*gSceneCmdHandlers[SCENE_CMD_ID_MAX])(PlayState*, SceneCmd*) = {
Scene_CommandSpecialFiles, // SCENE_CMD_ID_SPECIAL_FILES
Scene_CommandRoomBehavior, // SCENE_CMD_ID_ROOM_BEHAVIOR
Scene_CommandUndefined9, // SCENE_CMD_ID_UNDEFINED_9
- Scene_CommandMeshHeader, // SCENE_CMD_ID_MESH_HEADER
+ 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
diff --git a/src/code/z_view.c b/src/code/z_view.c
index 96c7b79d19..044e5603e7 100644
--- a/src/code/z_view.c
+++ b/src/code/z_view.c
@@ -334,7 +334,7 @@ s32 View_ApplyPerspective(View* view) {
Matrix_MtxToMtxF(projection, &mf);
osSyncPrintf("projection\n");
for (i = 0; i < 4; i++) {
- osSyncPrintf(" %f %f %f %f\n", mf.mf[i][0], mf.mf[i][1], mf.mf[i][2], mf.mf[i][3]);
+ osSyncPrintf("\t%f\t%f\t%f\t%f\n", mf.mf[i][0], mf.mf[i][1], mf.mf[i][2], mf.mf[i][3]);
}
osSyncPrintf("\n");
}
@@ -373,7 +373,7 @@ s32 View_ApplyPerspective(View* view) {
Matrix_MtxToMtxF(view->viewingPtr, &mf);
osSyncPrintf("viewing\n");
for (i = 0; i < 4; i++) {
- osSyncPrintf(" %f %f %f %f\n", mf.mf[i][0], mf.mf[i][1], mf.mf[i][2], mf.mf[i][3]);
+ osSyncPrintf("\t%f\t%f\t%f\t%f\n", mf.mf[i][0], mf.mf[i][1], mf.mf[i][2], mf.mf[i][3]);
}
osSyncPrintf("\n");
}
diff --git a/src/libultra/os/exceptasm.s b/src/libultra/os/exceptasm.s
index 79a6ed1a2b..d6bd3082ce 100644
--- a/src/libultra/os/exceptasm.s
+++ b/src/libultra/os/exceptasm.s
@@ -31,38 +31,38 @@ ENDDATA(__osPiIntTable)
.balign 16
__osIntOffTable:
- .byte 0x00 /* redispatch */
- .byte 0x14 /* prenmi */
- .byte 0x18 /* IP6_Hdlr */
- .byte 0x18 /* IP6_Hdlr */
- .byte 0x1C /* IP7_Hdlr */
- .byte 0x1C /* IP7_Hdlr */
- .byte 0x1C /* IP7_Hdlr */
- .byte 0x1C /* IP7_Hdlr */
- .byte 0x20 /* counter */
- .byte 0x20 /* counter */
- .byte 0x20 /* counter */
- .byte 0x20 /* counter */
- .byte 0x20 /* counter */
- .byte 0x20 /* counter */
- .byte 0x20 /* counter */
- .byte 0x20 /* counter */
- .byte 0x00 /* redispatch */
- .byte 0x04 /* sw1 */
- .byte 0x08 /* sw2 */
- .byte 0x08 /* sw2 */
- .byte 0x0C /* rcp */
- .byte 0x0C /* rcp */
- .byte 0x0C /* rcp */
- .byte 0x0C /* rcp */
- .byte 0x10 /* cart */
- .byte 0x10 /* cart */
- .byte 0x10 /* cart */
- .byte 0x10 /* cart */
- .byte 0x10 /* cart */
- .byte 0x10 /* cart */
- .byte 0x10 /* cart */
- .byte 0x10 /* cart */
+ .byte 0x00 /* redispatch */
+ .byte 0x14 /* prenmi */
+ .byte 0x18 /* IP6_Hdlr */
+ .byte 0x18 /* IP6_Hdlr */
+ .byte 0x1C /* IP7_Hdlr */
+ .byte 0x1C /* IP7_Hdlr */
+ .byte 0x1C /* IP7_Hdlr */
+ .byte 0x1C /* IP7_Hdlr */
+ .byte 0x20 /* counter */
+ .byte 0x20 /* counter */
+ .byte 0x20 /* counter */
+ .byte 0x20 /* counter */
+ .byte 0x20 /* counter */
+ .byte 0x20 /* counter */
+ .byte 0x20 /* counter */
+ .byte 0x20 /* counter */
+ .byte 0x00 /* redispatch */
+ .byte 0x04 /* sw1 */
+ .byte 0x08 /* sw2 */
+ .byte 0x08 /* sw2 */
+ .byte 0x0C /* rcp */
+ .byte 0x0C /* rcp */
+ .byte 0x0C /* rcp */
+ .byte 0x0C /* rcp */
+ .byte 0x10 /* cart */
+ .byte 0x10 /* cart */
+ .byte 0x10 /* cart */
+ .byte 0x10 /* cart */
+ .byte 0x10 /* cart */
+ .byte 0x10 /* cart */
+ .byte 0x10 /* cart */
+ .byte 0x10 /* cart */
__osIntTable:
.word redispatch
diff --git a/src/overlays/actors/ovl_Bg_Haka_Gate/z_bg_haka_gate.c b/src/overlays/actors/ovl_Bg_Haka_Gate/z_bg_haka_gate.c
index 55db2c7ceb..f422b9169d 100644
--- a/src/overlays/actors/ovl_Bg_Haka_Gate/z_bg_haka_gate.c
+++ b/src/overlays/actors/ovl_Bg_Haka_Gate/z_bg_haka_gate.c
@@ -158,7 +158,7 @@ void BgHakaGate_StatueInactive(BgHakaGate* this, PlayState* play) {
void BgHakaGate_StatueIdle(BgHakaGate* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- s32 linkDirection;
+ s32 playerDirection;
f32 forceDirection;
if (this->dyna.unk_150 != 0.0f) {
@@ -166,8 +166,8 @@ void BgHakaGate_StatueIdle(BgHakaGate* this, PlayState* play) {
this->vInitTurnAngle = this->dyna.actor.shape.rot.y - this->dyna.actor.yawTowardsPlayer;
sStatueDistToPlayer = this->dyna.actor.xzDistToPlayer;
forceDirection = (this->dyna.unk_150 >= 0.0f) ? 1.0f : -1.0f;
- linkDirection = ((s16)(this->dyna.actor.yawTowardsPlayer - player->actor.shape.rot.y) > 0) ? -1 : 1;
- this->vTurnDirection = linkDirection * forceDirection;
+ playerDirection = ((s16)(this->dyna.actor.yawTowardsPlayer - player->actor.shape.rot.y) > 0) ? -1 : 1;
+ this->vTurnDirection = playerDirection * forceDirection;
this->actionFunc = BgHakaGate_StatueTurn;
} else {
player->stateFlags2 &= ~PLAYER_STATE2_4;
diff --git a/src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.c b/src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.c
index 63d3fe9f2a..7883ac944b 100644
--- a/src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.c
+++ b/src/overlays/actors/ovl_Bg_Treemouth/z_bg_treemouth.c
@@ -236,7 +236,7 @@ void BgTreemouth_Draw(Actor* thisx, PlayState* play) {
if (GET_EVENTCHKINF(EVENTCHKINF_07)) {
alpha = 2150;
}
- } else { // neeeded to match
+ } else { // needed to match
}
if (gSaveContext.sceneLayer == 6) {
diff --git a/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c b/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c
index bd26c167fe..ff4c0094f1 100644
--- a/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c
+++ b/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.c
@@ -660,7 +660,7 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) {
this->targetPos = this->actor.world.pos;
Math_ApproachF(&this->tentMaxAngle, 0.5f, 1.0f, 0.01);
Math_ApproachF(&this->tentSpeed, 160.0f, 1.0f, 50.0f);
- if ((this->timers[0] == 0) || (this->linkHitTimer != 0)) {
+ if ((this->timers[0] == 0) || (this->playerHitTimer != 0)) {
dx = this->tentPos[22].x - player->actor.world.pos.x;
dy = this->tentPos[22].y - player->actor.world.pos.y;
dz = this->tentPos[22].z - player->actor.world.pos.z;
@@ -670,9 +670,9 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) {
this->timers[0] = 40;
this->tentSpeed = 0;
if ((s16)(this->actor.shape.rot.y - this->actor.yawTowardsPlayer) >= 0) {
- this->linkToLeft = false;
+ this->playerToLeft = false;
} else {
- this->linkToLeft = true;
+ this->playerToLeft = true;
}
} else {
this->tentMaxAngle = .001f;
@@ -702,7 +702,7 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) {
}
for (indS1 = 0; indS1 < 41; indS1++) {
if (this->timers[0] > 25) {
- if (!this->linkToLeft) {
+ if (!this->playerToLeft) {
Math_ApproachS(&this->tentRot[indS1].z, sCurlRot[indS1] * 0x100, 1.0f / this->tentMaxAngle,
this->tentSpeed);
} else {
@@ -710,7 +710,7 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) {
this->tentSpeed);
}
} else {
- if (!this->linkToLeft) {
+ if (!this->playerToLeft) {
Math_ApproachS(&this->tentRot[indS1].z, sGrabRot[indS1] * 0x100, 1.0f / this->tentMaxAngle,
this->tentSpeed);
} else {
@@ -725,7 +725,7 @@ void BossMo_Tentacle(BossMo* this, PlayState* play) {
Math_ApproachS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 5, 0xC8);
}
if (this->work[MO_TENT_ACTION_STATE] == MO_TENT_CURL) {
- if ((this->timers[0] >= 5) && (this->linkHitTimer != 0) && (player->actor.parent == NULL)) {
+ if ((this->timers[0] >= 5) && (this->playerHitTimer != 0) && (player->actor.parent == NULL)) {
if (play->grabPlayer(play, player)) {
player->actor.parent = &this->actor;
this->work[MO_TENT_ACTION_STATE] = MO_TENT_GRAB;
@@ -1158,7 +1158,7 @@ void BossMo_TentCollisionCheck(BossMo* this, PlayState* play) {
this->cutScale = 1.0f;
} else if (hurtbox->toucher.dmgFlags & (DMG_JUMP_MASTER | DMG_JUMP_GIANT | DMG_SPIN_MASTER |
DMG_SPIN_GIANT | DMG_SLASH_GIANT | DMG_SLASH_MASTER)) {
- this->linkHitTimer = 5;
+ this->playerHitTimer = 5;
}
this->tentRippleSize = 0.2f;
for (i2 = 0; i2 < 10; i2++) {
@@ -1177,7 +1177,7 @@ void BossMo_TentCollisionCheck(BossMo* this, PlayState* play) {
break;
} else if (this->tentCollider.elements[i1].info.toucherFlags & TOUCH_HIT) {
this->tentCollider.elements[i1].info.toucherFlags &= ~TOUCH_HIT;
- this->linkHitTimer = 5;
+ this->playerHitTimer = 5;
break;
}
}
@@ -2377,8 +2377,8 @@ void BossMo_UpdateTent(Actor* thisx, PlayState* play) {
if (this->work[MO_TENT_INVINC_TIMER] != 0) {
this->work[MO_TENT_INVINC_TIMER]--;
}
- if (this->linkHitTimer != 0) {
- this->linkHitTimer--;
+ if (this->playerHitTimer != 0) {
+ this->playerHitTimer--;
}
if (this->drawActor) {
@@ -2540,7 +2540,7 @@ void BossMo_DrawTentacle(BossMo* this, PlayState* play) {
Vec3s sp84;
Matrix_Push();
- if (this->linkToLeft) {
+ if (this->playerToLeft) {
sp8C.x *= -1.0f;
}
Matrix_MultVec3f(&sp8C, &this->grabPosRot.pos);
diff --git a/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.h b/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.h
index 310af26fcc..310a45ce9c 100644
--- a/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.h
+++ b/src/overlays/actors/ovl_Boss_Mo/z_boss_mo.h
@@ -67,7 +67,7 @@ typedef struct BossMo {
/* 0x0170 */ s16 zSwing;
/* 0x0172 */ s16 cutIndex;
/* 0x0174 */ s16 meltIndex;
- /* 0x0176 */ s16 linkToLeft;
+ /* 0x0176 */ s16 playerToLeft;
/* 0x0178 */ s16 mashCounter;
/* 0x017A */ s16 noBubbles;
/* 0x017C */ s16 sfxTimer;
@@ -87,7 +87,7 @@ typedef struct BossMo {
/* 0x01CE */ s16 attackAngleMod;
/* 0x01D0 */ u8 unk_1D0; // unused?
/* 0x01D1 */ u8 drawActor;
- /* 0x01D2 */ u8 linkHitTimer;
+ /* 0x01D2 */ u8 playerHitTimer;
/* 0x01D4 */ Vec3f targetPos;
/* 0x01E0 */ f32 tentRippleSize;
/* 0x01E4 */ PosRot grabPosRot;
diff --git a/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c b/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
index 271e9d73bc..fed332efcb 100644
--- a/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
+++ b/src/overlays/actors/ovl_Boss_Tw/z_boss_tw.c
@@ -198,7 +198,7 @@ static Vec3f sTwinrovaPillarPos[] = {
{ 0.0f, 380.0f, -580.0f },
};
-static u8 sTwInitalized = false;
+static u8 sTwInitialized = false;
static InitChainEntry sInitChain[] = {
ICHAIN_U8(targetMode, 5, ICHAIN_CONTINUE),
@@ -488,8 +488,8 @@ void BossTw_Init(Actor* thisx, PlayState* play2) {
this->actor.colChkInfo.health = 0;
Collider_InitCylinder(play, &this->collider);
- if (!sTwInitalized) {
- sTwInitalized = true;
+ if (!sTwInitialized) {
+ sTwInitialized = true;
play->envCtx.lightSettingOverride = 1;
play->envCtx.prevLightSetting = 1;
play->envCtx.lightSetting = 1;
@@ -600,7 +600,7 @@ void BossTw_Destroy(Actor* thisx, PlayState* play) {
}
if (thisx->params == TW_TWINROVA) {
- sTwInitalized = false;
+ sTwInitialized = false;
}
}
diff --git a/src/overlays/actors/ovl_En_Ani/z_en_ani.c b/src/overlays/actors/ovl_En_Ani/z_en_ani.c
index fbc3480229..b71623d5c2 100644
--- a/src/overlays/actors/ovl_En_Ani/z_en_ani.c
+++ b/src/overlays/actors/ovl_En_Ani/z_en_ani.c
@@ -263,7 +263,7 @@ void EnAni_Update(Actor* thisx, PlayState* play) {
func_800788CC(NA_SE_IT_EARTHQUAKE);
}
} else {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
this->skelAnime.curFrame = 0.0f;
}
this->actionFunc(this, play);
diff --git a/src/overlays/actors/ovl_En_Cow/z_en_cow.c b/src/overlays/actors/ovl_En_Cow/z_en_cow.c
index 389d154b71..cffc77dbe4 100644
--- a/src/overlays/actors/ovl_En_Cow/z_en_cow.c
+++ b/src/overlays/actors/ovl_En_Cow/z_en_cow.c
@@ -303,7 +303,7 @@ void EnCow_Update(Actor* thisx, PlayState* play2) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliders[1].base);
Actor_MoveForward(thisx);
Actor_UpdateBgCheckInfo(play, thisx, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_2);
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
if (this->skelAnime.animation == &gCowBodyChewAnim) {
Audio_PlayActorSfx2(thisx, NA_SE_EV_COW_CRY);
Animation_Change(&this->skelAnime, &gCowBodyMoveHeadAnim, 1.0f, 0.0f,
@@ -343,7 +343,7 @@ void func_809DFE98(Actor* thisx, PlayState* play) {
EnCow* this = (EnCow*)thisx;
s32 pad;
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
if (this->skelAnime.animation == &gCowTailIdleAnim) {
Animation_Change(&this->skelAnime, &gCowTailSwishAnim, 1.0f, 0.0f,
Animation_GetLastFrame(&gCowTailSwishAnim), ANIMMODE_ONCE, 1.0f);
diff --git a/src/overlays/actors/ovl_En_Cs/z_en_cs.c b/src/overlays/actors/ovl_En_Cs/z_en_cs.c
index 083f7d0545..f5b6c502d6 100644
--- a/src/overlays/actors/ovl_En_Cs/z_en_cs.c
+++ b/src/overlays/actors/ovl_En_Cs/z_en_cs.c
@@ -398,7 +398,7 @@ void EnCs_Wait(EnCs* this, PlayState* play) {
void EnCs_Talk(EnCs* this, PlayState* play) {
Player* player = GET_PLAYER(play);
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
EnCs_ChangeAnim(this, this->currentAnimIndex, &this->currentAnimIndex);
}
diff --git a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
index d17dcdcbe8..e2634d0c16 100644
--- a/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
+++ b/src/overlays/actors/ovl_En_Dodongo/z_en_dodongo.c
@@ -678,7 +678,7 @@ void EnDodongo_Death(EnDodongo* this, PlayState* play) {
} else if (this->actor.colorFilterTimer == 0) {
Actor_SetColorFilter(&this->actor, 0x4000, 0x78, 0, 4);
}
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
if (this->timer == 0) {
bomb = (EnBom*)Actor_Spawn(&play->actorCtx, play, ACTOR_EN_BOM, this->actor.world.pos.x,
this->actor.world.pos.y, this->actor.world.pos.z, 0, 0, 6, BOMB_BODY);
diff --git a/src/overlays/actors/ovl_En_Ds/z_en_ds.c b/src/overlays/actors/ovl_En_Ds/z_en_ds.c
index 02eb8c5baa..b58efadc8b 100644
--- a/src/overlays/actors/ovl_En_Ds/z_en_ds.c
+++ b/src/overlays/actors/ovl_En_Ds/z_en_ds.c
@@ -236,7 +236,7 @@ void EnDs_Wait(EnDs* this, PlayState* play) {
void EnDs_Update(Actor* thisx, PlayState* play) {
EnDs* this = (EnDs*)thisx;
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
this->skelAnime.curFrame = 0.0f;
}
diff --git a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
index e8235cedb5..fd64bf6603 100644
--- a/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
+++ b/src/overlays/actors/ovl_En_Floormas/z_en_floormas.c
@@ -442,11 +442,11 @@ void EnFloormas_Die(EnFloormas* this, PlayState* play) {
void EnFloormas_BigDecideAction(EnFloormas* this, PlayState* play) {
if (SkelAnime_Update(&this->skelAnime)) {
- // within 400 units of link and within 90 degrees rotation of him
+ // within 400 units and within 90 degrees rotation of player
if (this->actor.xzDistToPlayer < 400.0f && !Actor_IsFacingPlayer(&this->actor, 0x4000)) {
this->actionTarget = this->actor.yawTowardsPlayer;
EnFloormas_SetupTurn(this);
- // within 280 units of link and within 45 degrees rotation of him
+ // within 280 units and within 45 degrees rotation of player
} else if (this->actor.xzDistToPlayer < 280.0f && Actor_IsFacingPlayer(&this->actor, 0x2000)) {
EnFloormas_SetupHover(this, play);
} else {
@@ -490,7 +490,7 @@ void EnFloormas_BigWalk(EnFloormas* this, PlayState* play) {
this->actionTarget = this->actor.wallYaw;
EnFloormas_SetupTurn(this);
} else if ((this->actor.xzDistToPlayer < 400.0f) && !Actor_IsFacingPlayer(&this->actor, 0x4000)) {
- // set target rotation to link.
+ // set target rotation to player.
this->actionTarget = this->actor.yawTowardsPlayer;
EnFloormas_SetupTurn(this);
} else if (this->actionTimer == 0) {
@@ -910,7 +910,7 @@ void EnFloormas_Merge(EnFloormas* this, PlayState* play) {
this->collider.dim.radius = (sCylinderInit.dim.radius * 100.0f) * this->actor.scale.x;
this->collider.dim.height = (sCylinderInit.dim.height * 100.0f) * this->actor.scale.x;
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
if (this->actor.scale.x >= 0.01f) {
this->actor.flags &= ~ACTOR_FLAG_4;
EnFloormas_MakeVulnerable(this);
@@ -935,7 +935,7 @@ void EnFloormas_SmWait(EnFloormas* this, PlayState* play) {
}
void EnFloormas_TakeDamage(EnFloormas* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
if (this->actor.colChkInfo.health == 0) {
EnFloormas_Die(this, play);
} else {
@@ -954,7 +954,7 @@ void EnFloormas_TakeDamage(EnFloormas* this, PlayState* play) {
}
void EnFloormas_Recover(EnFloormas* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
EnFloormas_SetupStand(this);
}
}
diff --git a/src/overlays/actors/ovl_En_Fu/z_en_fu.c b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
index c95d288926..cc6c59ad4a 100644
--- a/src/overlays/actors/ovl_En_Fu/z_en_fu.c
+++ b/src/overlays/actors/ovl_En_Fu/z_en_fu.c
@@ -241,7 +241,7 @@ void EnFu_Update(Actor* thisx, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
Actor_MoveForward(&this->actor);
Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_2);
- if (!(this->behaviorFlags & FU_WAIT) && (SkelAnime_Update(&this->skelanime) != 0)) {
+ if (!(this->behaviorFlags & FU_WAIT) && SkelAnime_Update(&this->skelanime)) {
Animation_Change(&this->skelanime, this->skelanime.animation, 1.0f, 0.0f,
Animation_GetLastFrame(this->skelanime.animation), ANIMMODE_ONCE, 0.0f);
}
diff --git a/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c b/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c
index dd1880b8bb..f8af274cf5 100644
--- a/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c
+++ b/src/overlays/actors/ovl_En_GeldB/z_en_geldb.c
@@ -1183,17 +1183,17 @@ void EnGeldB_Block(EnGeldB* this, PlayState* play) {
}
void EnGeldB_SetupSidestep(EnGeldB* this, PlayState* play) {
- s16 linkAngle;
+ s16 playerRotY;
Player* player;
f32 lastFrame = Animation_GetLastFrame(&gGerudoRedSidestepAnim);
Animation_Change(&this->skelAnime, &gGerudoRedSidestepAnim, 1.0f, 0.0f, lastFrame, ANIMMODE_LOOP_INTERP, 0.0f);
player = GET_PLAYER(play);
Math_SmoothStepToS(&this->actor.shape.rot.y, this->actor.yawTowardsPlayer, 1, 0xFA0, 1);
- linkAngle = player->actor.shape.rot.y;
- if (Math_SinS(linkAngle - this->actor.shape.rot.y) > 0.0f) {
+ playerRotY = player->actor.shape.rot.y;
+ if (Math_SinS(playerRotY - this->actor.shape.rot.y) > 0.0f) {
this->actor.speedXZ = -6.0f;
- } else if (Math_SinS(linkAngle - this->actor.shape.rot.y) < 0.0f) {
+ } else if (Math_SinS(playerRotY - this->actor.shape.rot.y) < 0.0f) {
this->actor.speedXZ = 6.0f;
} else {
this->actor.speedXZ = Rand_CenteredFloat(12.0f);
diff --git a/src/overlays/actors/ovl_En_Horse_Ganon/z_en_horse_ganon.c b/src/overlays/actors/ovl_En_Horse_Ganon/z_en_horse_ganon.c
index 0c7085b902..b974ca0b40 100644
--- a/src/overlays/actors/ovl_En_Horse_Ganon/z_en_horse_ganon.c
+++ b/src/overlays/actors/ovl_En_Horse_Ganon/z_en_horse_ganon.c
@@ -263,7 +263,7 @@ void func_80A68DB0(EnHorseGanon* this, PlayState* play) {
func_80A686A8(this, play);
- if (SkelAnime_Update(&this->skin.skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skin.skelAnime)) {
func_80A68B20(this);
}
}
diff --git a/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c b/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c
index 2a681bc731..59af9f5bfa 100644
--- a/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c
+++ b/src/overlays/actors/ovl_En_Hs2/z_en_hs2.c
@@ -113,7 +113,7 @@ void EnHs2_Update(Actor* thisx, PlayState* play) {
CollisionCheck_SetOC(play, &play->colChkCtx, &this->collider.base);
Actor_MoveForward(&this->actor);
Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_2);
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
this->skelAnime.curFrame = 0.0f;
}
this->actionFunc(this, play);
diff --git a/src/overlays/actors/ovl_En_In/z_en_in.c b/src/overlays/actors/ovl_En_In/z_en_in.c
index bb2ea36f33..33a2e33f1f 100644
--- a/src/overlays/actors/ovl_En_In/z_en_in.c
+++ b/src/overlays/actors/ovl_En_In/z_en_in.c
@@ -617,7 +617,7 @@ void func_80A7A304(EnIn* this, PlayState* play) {
if (this->skelAnime.animation == &object_in_Anim_018C38 && this->skelAnime.curFrame == 20.0f) {
Audio_PlayActorSfx2(&this->actor, NA_SE_VO_IN_CRY_0);
}
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
this->animationIdx %= 8;
this->unk_1E8 = this->animationIdx;
if (this->animationIdx == 3 || this->animationIdx == 4) {
diff --git a/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c b/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c
index 8fe5b1c59d..b87d87daf8 100644
--- a/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c
+++ b/src/overlays/actors/ovl_En_Niw_Lady/z_en_niw_lady.c
@@ -365,13 +365,13 @@ void func_80ABA878(EnNiwLady* this, PlayState* play) {
}
if (Actor_ProcessTalkRequest(&this->actor, play)) {
playerExchangeItemId = func_8002F368(play);
- if ((playerExchangeItemId == 6) && GET_EVENTCHKINF(EVENTCHKINF_6A)) {
+ if ((playerExchangeItemId == EXCH_ITEM_POCKET_CUCCO) && GET_EVENTCHKINF(EVENTCHKINF_6A)) {
func_80078884(NA_SE_SY_TRE_BOX_APPEAR);
player->actor.textId = sTradeItemTextIds[5];
this->unk_26E = this->unk_27A + 21;
this->unk_262 = TEXT_STATE_CHOICE;
this->actionFunc = func_80ABAB08;
- } else if (playerExchangeItemId != 0) {
+ } else if (playerExchangeItemId != EXCH_ITEM_NONE) {
player->actor.textId = sTradeItemTextIds[7];
this->unk_26E = this->unk_27A + 21;
} else {
diff --git a/src/overlays/actors/ovl_En_Owl/z_en_owl.c b/src/overlays/actors/ovl_En_Owl/z_en_owl.c
index 32e70bbdec..92c5a5a170 100644
--- a/src/overlays/actors/ovl_En_Owl/z_en_owl.c
+++ b/src/overlays/actors/ovl_En_Owl/z_en_owl.c
@@ -249,9 +249,9 @@ void EnOwl_LookAtLink(EnOwl* this, PlayState* play) {
}
/**
- * Checks if link is within `targetDist` units, initalize the camera for the owl.
+ * Checks if link is within `targetDist` units, initialize the camera for the owl.
* returns 0 if the link is not within `targetDistance`, returns 1 once link is within
- * the distance, and the camera has been initalized.
+ * the distance, and the camera has been initialized.
*/
s32 EnOwl_CheckInitTalk(EnOwl* this, PlayState* play, u16 textId, f32 targetDist, u16 flags) {
s32 timer;
diff --git a/src/overlays/actors/ovl_En_Skb/z_en_skb.c b/src/overlays/actors/ovl_En_Skb/z_en_skb.c
index daf85fa86f..dce775f55f 100644
--- a/src/overlays/actors/ovl_En_Skb/z_en_skb.c
+++ b/src/overlays/actors/ovl_En_Skb/z_en_skb.c
@@ -231,7 +231,7 @@ void EnSkb_RiseFromGround(EnSkb* this, PlayState* play) {
if ((play->gameplayFrames & 1) != 0) {
EnSkb_SpawnDebris(play, this, &this->actor.world.pos);
}
- if ((SkelAnime_Update(&this->skelAnime) != 0) && (0.0f == this->actor.shape.yOffset)) {
+ if (SkelAnime_Update(&this->skelAnime) && (0.0f == this->actor.shape.yOffset)) {
EnSkb_DecideNextAction(this);
}
}
@@ -253,7 +253,7 @@ void EnSkb_Despawn(EnSkb* this, PlayState* play) {
EnSkb_SpawnDebris(play, this, &this->actor.world.pos);
}
Math_SmoothStepToF(&this->actor.shape.shadowScale, 0.0f, 1.0f, 2.5f, 0.0f);
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
Actor_Kill(&this->actor);
}
}
@@ -328,7 +328,7 @@ void EnSkb_Attack(EnSkb* this, PlayState* play) {
if (this->collider.base.atFlags & AT_BOUNCED) {
this->collider.base.atFlags &= ~(AT_HIT | AT_BOUNCED);
EnSkb_SetupRecoil(this);
- } else if (SkelAnime_Update(&this->skelAnime) != 0) {
+ } else if (SkelAnime_Update(&this->skelAnime)) {
EnSkb_DecideNextAction(this);
}
}
@@ -343,7 +343,7 @@ void EnSkb_SetupRecoil(EnSkb* this) {
}
void EnSkb_Recoil(EnSkb* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
EnSkb_DecideNextAction(this);
}
}
diff --git a/src/overlays/actors/ovl_En_St/z_en_st.c b/src/overlays/actors/ovl_En_St/z_en_st.c
index 68951a0996..3997f23691 100644
--- a/src/overlays/actors/ovl_En_St/z_en_st.c
+++ b/src/overlays/actors/ovl_En_St/z_en_st.c
@@ -270,7 +270,7 @@ void EnSt_SetDropAnimAndVel(EnSt* this) {
}
/**
- * Initalizes the Skulltula's 6 cylinders, and sphere collider.
+ * Initializes the Skulltula's 6 cylinders, and sphere collider.
*/
void EnSt_InitColliders(EnSt* this, PlayState* play) {
ColliderCylinderInit* cylinders[6] = {
@@ -380,7 +380,7 @@ void EnSt_UpdateCylinders(EnSt* this, PlayState* play) {
}
}
-s32 EnSt_CheckHitLink(EnSt* this, PlayState* play) {
+s32 EnSt_CheckHitPlayer(EnSt* this, PlayState* play) {
Player* player = GET_PLAYER(play);
s32 hit;
s32 i;
@@ -500,8 +500,8 @@ s32 EnSt_CheckColliders(EnSt* this, PlayState* play) {
}
if (this->stunTimer == 0 && this->takeDamageSpinTimer == 0) {
- // check if the Skulltula has hit link.
- EnSt_CheckHitLink(this, play);
+ // check if the Skulltula has hit the player.
+ EnSt_CheckHitPlayer(this, play);
}
return false;
}
diff --git a/src/overlays/actors/ovl_En_Tite/z_en_tite.c b/src/overlays/actors/ovl_En_Tite/z_en_tite.c
index 2011f4c01a..dbf62376ad 100644
--- a/src/overlays/actors/ovl_En_Tite/z_en_tite.c
+++ b/src/overlays/actors/ovl_En_Tite/z_en_tite.c
@@ -267,7 +267,7 @@ void EnTite_Attack(EnTite* this, PlayState* play) {
s32 attackState;
Vec3f ripplePos;
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
attackState = this->vAttackState; // for deciding whether to change animation
switch (this->vAttackState) {
case TEKTITE_BEGIN_LUNGE:
diff --git a/src/overlays/actors/ovl_En_Tr/z_en_tr.c b/src/overlays/actors/ovl_En_Tr/z_en_tr.c
index 730e23973e..f6da3b2602 100644
--- a/src/overlays/actors/ovl_En_Tr/z_en_tr.c
+++ b/src/overlays/actors/ovl_En_Tr/z_en_tr.c
@@ -378,7 +378,7 @@ void EnTr_Update(Actor* thisx, PlayState* play) {
Actor_UpdateBgCheckInfo(play, &this->actor, 0.0f, 0.0f, 0.0f, UPDBGCHECKINFO_FLAG_0 | UPDBGCHECKINFO_FLAG_2);
this->actionFunc(this, play);
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
if (this->animation != NULL) {
if ((this->animation == &object_tr_Anim_0035CC) || (this->animation == &object_tr_Anim_0013CC)) {
if (this->actor.params != TR_KOUME) {
diff --git a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
index ca83f96806..15ab641146 100644
--- a/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
+++ b/src/overlays/actors/ovl_En_Wallmas/z_en_wallmas.c
@@ -328,13 +328,13 @@ void EnWallmas_Drop(EnWallmas* this, PlayState* play) {
}
void EnWallmas_Land(EnWallmas* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
EnWallmas_SetupStand(this);
}
}
void EnWallmas_Stand(EnWallmas* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
EnWallmas_SetupWalk(this);
}
@@ -342,7 +342,7 @@ void EnWallmas_Stand(EnWallmas* this, PlayState* play) {
}
void EnWallmas_Walk(EnWallmas* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
EnWallmas_SetupJumpToCeiling(this);
}
@@ -355,7 +355,7 @@ void EnWallmas_Walk(EnWallmas* this, PlayState* play) {
}
void EnWallmas_JumpToCeiling(EnWallmas* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
EnWallmas_SetupReturnToCeiling(this);
}
}
@@ -388,7 +388,7 @@ void EnWallmas_ReturnToCeiling(EnWallmas* this, PlayState* play) {
}
void EnWallmas_TakeDamage(EnWallmas* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
if (this->actor.colChkInfo.health == 0) {
EnWallmas_SetupDie(this, play);
} else {
@@ -403,7 +403,7 @@ void EnWallmas_TakeDamage(EnWallmas* this, PlayState* play) {
}
void EnWallmas_Cooldown(EnWallmas* this, PlayState* play) {
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
EnWallmas_SetupReturnToCeiling(this);
}
}
@@ -430,7 +430,7 @@ void EnWallmas_TakePlayer(EnWallmas* this, PlayState* play) {
Audio_PlayActorSfx2(&this->actor, NA_SE_EN_FALL_CATCH);
}
- if (SkelAnime_Update(&this->skelAnime) != 0) {
+ if (SkelAnime_Update(&this->skelAnime)) {
player->actor.world.pos.x = this->actor.world.pos.x;
player->actor.world.pos.z = this->actor.world.pos.z;
diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c
index e8eb870ade..81da0e84d6 100644
--- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c
+++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_item.c
@@ -125,7 +125,7 @@ void KaleidoScope_DrawItemSelect(PlayState* play) {
osSyncPrintf("now=%d ccc=%d\n", cursorPoint, cursorItem);
- // Seem necessary to match
+ // Seems necessary to match
if (pauseCtx->cursorX[PAUSE_ITEM]) {}
if (gSaveContext.inventory.items[pauseCtx->cursorPoint[PAUSE_ITEM]]) {}
diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c
index 230ac80ea9..04bc3574e7 100644
--- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c
+++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_map_PAL.c
@@ -528,17 +528,16 @@ void KaleidoScope_DrawWorldMap(PlayState* play, GraphicsContext* gfxCtx) {
gSP1Quadrangle(POLY_OPA_DISP++, j, j + 2, j + 3, j + 1, 0);
} else if (HREG(15) == 1) {
- Gfx* sp1CC = POLY_OPA_DISP;
- void* mapImage = gWorldMapImageTex;
+ Gfx* gfx = POLY_OPA_DISP;
- gSPLoadUcodeL(sp1CC++, gspS2DEX2d_fifo);
+ gSPLoadUcodeL(gfx++, gspS2DEX2d_fifo);
- func_8009638C(&sp1CC, mapImage, gWorldMapImageTLUT, 216, 128, G_IM_FMT_CI, G_IM_SIZ_8b, 0x8000, 256,
- HREG(13) / 100.0f, HREG(14) / 100.0f);
+ Room_DrawBackground2D(&gfx, gWorldMapImageTex, gWorldMapImageTLUT, 216, 128, G_IM_FMT_CI, G_IM_SIZ_8b,
+ G_TT_RGBA16, 256, HREG(13) / 100.0f, HREG(14) / 100.0f);
- gSPLoadUcode(sp1CC++, SysUcode_GetUCode(), SysUcode_GetUCodeData());
+ gSPLoadUcode(gfx++, SysUcode_GetUCode(), SysUcode_GetUCodeData());
- POLY_OPA_DISP = sp1CC;
+ POLY_OPA_DISP = gfx;
}
if (HREG(15) == 2) {