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) {