diff --git a/assets/xml/objects/object_ganon.xml b/assets/xml/objects/object_ganon.xml index e877b60f49..79cba2ab36 100644 --- a/assets/xml/objects/object_ganon.xml +++ b/assets/xml/objects/object_ganon.xml @@ -1,96 +1,106 @@ + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - + + - + + + + + - + + - - - - - - - - - - - - - - - - - - - - - - - - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/xml/objects/object_ganon2.xml b/assets/xml/objects/object_ganon2.xml index 8b66cfcc2d..93f3a05e5e 100644 --- a/assets/xml/objects/object_ganon2.xml +++ b/assets/xml/objects/object_ganon2.xml @@ -1,158 +1,174 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/xml/objects/object_ganon_anime1.xml b/assets/xml/objects/object_ganon_anime1.xml index 6021fdd9b1..11e08a9eb5 100644 --- a/assets/xml/objects/object_ganon_anime1.xml +++ b/assets/xml/objects/object_ganon_anime1.xml @@ -1,29 +1,30 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/xml/objects/object_ganon_anime2.xml b/assets/xml/objects/object_ganon_anime2.xml index 96121689e9..f05c72dedc 100644 --- a/assets/xml/objects/object_ganon_anime2.xml +++ b/assets/xml/objects/object_ganon_anime2.xml @@ -1,21 +1,22 @@ + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + diff --git a/assets/xml/objects/object_ganon_anime3.xml b/assets/xml/objects/object_ganon_anime3.xml index 2af1e94f95..17bc46eb49 100644 --- a/assets/xml/objects/object_ganon_anime3.xml +++ b/assets/xml/objects/object_ganon_anime3.xml @@ -1,13 +1,17 @@ + - - - - - - - - - + + + + + + + + + + + + diff --git a/assets/xml/objects/object_gndd.xml b/assets/xml/objects/object_gndd.xml index 10a5fff8ce..8bf5d770c4 100644 --- a/assets/xml/objects/object_gndd.xml +++ b/assets/xml/objects/object_gndd.xml @@ -1,96 +1,106 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/assets/xml/overlays/ovl_Boss_Ganon.xml b/assets/xml/overlays/ovl_Boss_Ganon.xml index 07507ae63d..cdb87e9c16 100644 --- a/assets/xml/overlays/ovl_Boss_Ganon.xml +++ b/assets/xml/overlays/ovl_Boss_Ganon.xml @@ -1,53 +1,53 @@ - - - - - - - - - - - - + + + + + + + + + + + + - + - - - - - - - - - - - - + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + diff --git a/include/functions.h b/include/functions.h index 7508a0ca35..9407602035 100644 --- a/include/functions.h +++ b/include/functions.h @@ -534,35 +534,25 @@ s32 Actor_TrackPlayer(PlayState* play, Actor* actor, Vec3s* headRot, Vec3s* tors void ActorOverlayTable_LogPrint(void); void ActorOverlayTable_Init(void); void ActorOverlayTable_Cleanup(void); -u16 DynaSSNodeList_GetNextNodeIdx(DynaSSNodeList* nodeList); void func_80038A28(CollisionPoly* poly, f32 tx, f32 ty, f32 tz, MtxF* dest); f32 CollisionPoly_GetPointDistanceFromPlane(CollisionPoly* poly, Vec3f* point); void CollisionPoly_GetVerticesByBgId(CollisionPoly* poly, s32 bgId, CollisionContext* colCtx, Vec3f* dest); -s32 BgCheck_CheckStaticCeiling(StaticLookup* lookup, u16 xpFlags, CollisionContext* colCtx, f32* outY, Vec3f* pos, - f32 checkHeight, CollisionPoly** outPoly); -s32 BgCheck_CheckLineAgainstSSList(SSList* ssList, CollisionContext* colCtx, u16 xpFlags1, u16 xpFlags2, Vec3f* posA, - Vec3f* posB, Vec3f* outPos, CollisionPoly** outPoly, f32* outDistSq, f32 chkDist, - s32 bccFlags); -void BgCheck_GetStaticLookupIndicesFromPos(CollisionContext* colCtx, Vec3f* pos, Vec3i* sector); void BgCheck_Allocate(CollisionContext* colCtx, PlayState* play, CollisionHeader* colHeader); -s32 BgCheck_PosInStaticBoundingBox(CollisionContext* colCtx, Vec3f* pos); -f32 BgCheck_EntityRaycastFloor1(CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos); -f32 BgCheck_EntityRaycastFloor2(PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, - Vec3f* pos); -f32 BgCheck_EntityRaycastFloor3(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos); -f32 BgCheck_EntityRaycastFloor4(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos); -f32 BgCheck_EntityRaycastFloor5(PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, - Actor* actor, Vec3f* pos); -f32 BgCheck_EntityRaycastFloor6(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos, - f32 chkDist); -f32 BgCheck_EntityRaycastFloor7(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos); -f32 BgCheck_AnyRaycastFloor1(CollisionContext* colCtx, CollisionPoly* outPoly, Vec3f* pos); -f32 BgCheck_AnyRaycastFloor2(CollisionContext* colCtx, CollisionPoly* outPoly, s32* bgId, Vec3f* pos); -f32 BgCheck_CameraRaycastFloor2(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos); -f32 BgCheck_EntityRaycastFloor8(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos); -f32 BgCheck_EntityRaycastFloor9(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos); -s32 BgCheck_CheckWallImpl(CollisionContext* colCtx, u16 xpFlags, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, - f32 radius, CollisionPoly** outPoly, s32* outBgId, Actor* actor, f32 checkHeight, u8 argA); +f32 BgCheck_EntityRaycastDown1(CollisionContext* colCtx, CollisionPoly** outGroundPoly, Vec3f* pos); +f32 BgCheck_EntityRaycastDown2(PlayState* play, CollisionContext* colCtx, CollisionPoly** outGroundPoly, Vec3f* pos); +f32 BgCheck_EntityRaycastDown3(CollisionContext* colCtx, CollisionPoly** outGroundPoly, s32* bgId, Vec3f* pos); +f32 BgCheck_EntityRaycastDown4(CollisionContext* colCtx, CollisionPoly** outGroundPoly, s32* bgId, Actor* actor, + Vec3f* pos); +f32 BgCheck_EntityRaycastDown5(PlayState* play, CollisionContext* colCtx, CollisionPoly** outGroundPoly, s32* bgId, + Actor* actor, Vec3f* pos); +f32 BgCheck_EntityRaycastDown6(CollisionContext* colCtx, CollisionPoly** outGroundPoly, s32* bgId, Actor* actor, + Vec3f* pos, f32 chkDist); +f32 BgCheck_EntityRaycastDown7(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos); +f32 BgCheck_AnyRaycastDown1(CollisionContext* colCtx, CollisionPoly* outGroundPoly, Vec3f* pos); +f32 BgCheck_AnyRaycastDown2(CollisionContext* colCtx, CollisionPoly* outGroundPoly, s32* bgId, Vec3f* pos); +f32 BgCheck_CameraRaycastDown2(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos); +f32 BgCheck_EntityRaycastDownWalls(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos); +f32 BgCheck_EntityRaycastDown9(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos); s32 BgCheck_EntitySphVsWall1(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, CollisionPoly** outPoly, f32 checkHeight); s32 BgCheck_EntitySphVsWall2(CollisionContext* colCtx, Vec3f* posResult, Vec3f* posNext, Vec3f* posPrev, f32 radius, @@ -574,9 +564,6 @@ s32 BgCheck_EntitySphVsWall4(CollisionContext* colCtx, Vec3f* posResult, Vec3f* s32 BgCheck_AnyCheckCeiling(CollisionContext* colCtx, f32* outY, Vec3f* pos, f32 checkHeight); s32 BgCheck_EntityCheckCeiling(CollisionContext* colCtx, f32* outY, Vec3f* pos, f32 checkHeight, CollisionPoly** outPoly, s32* outBgId, Actor* actor); -s32 BgCheck_CheckLineImpl(CollisionContext* colCtx, u16 xpFlags1, u16 xpFlags2, Vec3f* posA, Vec3f* posB, - Vec3f* posResult, CollisionPoly** outPoly, s32* outBgId, Actor* actor, f32 chkDist, - u32 bccFlags); s32 BgCheck_CameraLineTest1(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 chkWall, s32 chkFloor, s32 chkCeil, s32 chkOneFace, s32* bgId); s32 BgCheck_CameraLineTest2(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, @@ -599,12 +586,7 @@ s32 BgCheck_AnyLineTest2(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec s32 BgCheck_AnyLineTest3(CollisionContext* colCtx, Vec3f* posA, Vec3f* posB, Vec3f* posResult, CollisionPoly** outPoly, s32 chkWall, s32 chkFloor, s32 chkCeil, s32 chkOneFace, s32* bgId); s32 BgCheck_SphVsFirstPoly(CollisionContext* colCtx, Vec3f* center, f32 radius); -void SSNodeList_Initialize(SSNodeList*); -void SSNodeList_Alloc(PlayState* play, SSNodeList* this, s32 tblMax, s32 numPolys); -u16 SSNodeList_GetNextNodeIdx(SSNodeList* this); s32 DynaPoly_IsBgIdBgActor(s32 bgId); -void DynaPoly_Init(PlayState* play, DynaCollisionContext* dyna); -void DynaPoly_Alloc(PlayState* play, DynaCollisionContext* dyna); void DynaPoly_DisableCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId); void DynaPoly_EnableCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId); void DynaPoly_DisableCeilingCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId); @@ -615,19 +597,8 @@ void DynaPoly_InvalidateLookup(PlayState* play, DynaCollisionContext* dyna); void DynaPoly_UnsetAllInteractFlags(PlayState* play, DynaCollisionContext* dyna, Actor* actor); void DynaPoly_UpdateContext(PlayState* play, DynaCollisionContext* dyna); void DynaPoly_UpdateBgActorTransforms(PlayState* play, DynaCollisionContext* dyna); -f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast); -s32 BgCheck_SphVsDynaWall(CollisionContext* colCtx, u16 xpFlags, f32* outX, f32* outZ, Vec3f* pos, f32 radius, - CollisionPoly** outPoly, s32* outBgId, Actor* actor); -s32 BgCheck_CheckDynaCeiling(CollisionContext* colCtx, u16 xpFlags, f32* outY, Vec3f* pos, f32 chkDist, - CollisionPoly** outPoly, s32* outBgId, Actor* actor); -s32 BgCheck_CheckLineAgainstDyna(CollisionContext* colCtx, u16 xpFlags, Vec3f* posA, Vec3f* posB, Vec3f* posResult, - CollisionPoly** outPoly, f32* distSq, s32* outBgId, Actor* actor, f32 chkDist, - s32 bccFlags); -s32 BgCheck_SphVsFirstDynaPoly(CollisionContext* colCtx, u16 xpFlags, CollisionPoly** outPoly, s32* outBgId, - Vec3f* center, f32 radius, Actor* actor, u16 bciFlags); void CollisionHeader_GetVirtual(void* colHeader, CollisionHeader** dest); void func_800418D0(CollisionContext* colCtx, PlayState* play); -void BgCheck_ResetPolyCheckTbl(SSNodeList* nodeList, s32 numPolys); u32 SurfaceType_GetBgCamIndex(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId); u16 BgCheck_GetBgCamSettingImpl(CollisionContext* colCtx, u32 bgCamIndex, s32 bgId); u16 BgCheck_GetBgCamSetting(CollisionContext* colCtx, CollisionPoly* poly, s32 bgId); @@ -664,7 +635,7 @@ s32 WaterBox_GetSurfaceImpl(PlayState* play, CollisionContext* colCtx, f32 x, f3 WaterBox** outWaterBox); u32 WaterBox_GetBgCamIndex(CollisionContext* colCtx, WaterBox* waterBox); u16 WaterBox_GetBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox); -u32 WaterBox_GetLightSettingIndex(CollisionContext* colCtx, WaterBox* waterBox); +u32 WaterBox_GetLightIndex(CollisionContext* colCtx, WaterBox* waterBox); s32 func_80042708(CollisionPoly* polyA, CollisionPoly* polyB, Vec3f* point, Vec3f* closestPoint); s32 func_800427B4(CollisionPoly* polyA, CollisionPoly* polyB, Vec3f* pointA, Vec3f* pointB, Vec3f* closestPoint); void BgCheck_DrawDynaCollision(PlayState*, CollisionContext*); @@ -1483,7 +1454,7 @@ void Play_Destroy(GameState* thisx); void Play_Init(GameState* thisx); void Play_Main(GameState* thisx); s32 Play_InCsMode(PlayState* this); -f32 func_800BFCB8(PlayState* this, MtxF* mf, Vec3f* vec); +f32 func_800BFCB8(PlayState* this, MtxF* mf, Vec3f* pos); void* Play_LoadFile(PlayState* this, RomFile* file); void Play_GetScreenPos(PlayState* this, Vec3f* src, Vec3f* dest); s16 Play_CreateSubCamera(PlayState* this); diff --git a/include/z64.h b/include/z64.h index f2838cf3ab..a458a8d028 100644 --- a/include/z64.h +++ b/include/z64.h @@ -1346,8 +1346,8 @@ typedef struct { /* 0x1CAB4 */ s16 inputTimerY; /* 0x1CAB6 */ s16 stickXDir; /* 0x1CAB8 */ s16 stickYDir; - /* 0x1CABA */ s16 stickRelX; - /* 0x1CABC */ s16 stickRelY; + /* 0x1CABA */ s16 stickAdjX; + /* 0x1CABC */ s16 stickAdjY; /* 0x1CABE */ s16 nameEntryBoxPosX; /* 0x1CAC0 */ s16 windowPosX; /* 0x1CAC4 */ f32 windowRot; diff --git a/include/z64bgcheck.h b/include/z64bgcheck.h index 2b9169f094..aa8a6859ce 100644 --- a/include/z64bgcheck.h +++ b/include/z64bgcheck.h @@ -26,8 +26,6 @@ struct DynaPolyActor; #define FUNC_80041EA4_STOP 8 #define FUNC_80041EA4_VOID_OUT 12 -#define WATERBOX_ROOM(p) ((p >> 13) & 0x3F) - typedef struct { Vec3f scale; Vec3s rot; @@ -73,6 +71,32 @@ typedef struct { /* 0x10 */ s16 unk_10; // unused } BgCamFuncData; // size = 0x12 +// Macros for `WaterBox.properties` + +#define WATERBOX_BGCAM_INDEX_SHIFT 0 +#define WATERBOX_BGCAM_INDEX_MASK 0x000000FF +#define WATERBOX_BGCAM_INDEX(properties) \ + (((properties) >> WATERBOX_BGCAM_INDEX_SHIFT) & (WATERBOX_BGCAM_INDEX_MASK >> WATERBOX_BGCAM_INDEX_SHIFT)) + +#define WATERBOX_LIGHT_INDEX_SHIFT 8 +#define WATERBOX_LIGHT_INDEX_MASK 0x00001F00 +#define WATERBOX_LIGHT_INDEX(properties) \ + (((properties) >> WATERBOX_LIGHT_INDEX_SHIFT) & (WATERBOX_LIGHT_INDEX_MASK >> WATERBOX_LIGHT_INDEX_SHIFT)) +#define WATERBOX_LIGHT_INDEX_NONE 0x1F // warns and defaults to 0 + +#define WATERBOX_ROOM_SHIFT 13 +#define WATERBOX_ROOM_MASK 0x0007E000 +#define WATERBOX_ROOM(properties) (((properties) >> WATERBOX_ROOM_SHIFT) & (WATERBOX_ROOM_MASK >> WATERBOX_ROOM_SHIFT)) +#define WATERBOX_ROOM_ALL 0x3F // value for "room index" indicating "all rooms" + +#define WATERBOX_FLAG_19_SHIFT 19 +#define WATERBOX_FLAG_19 (1 << WATERBOX_FLAG_19_SHIFT) + +#define WATERBOX_PROPERTIES(bgCamIndex, lightIndex, room, setFlag19) \ + ((((bgCamIndex) << WATERBOX_BGCAM_INDEX_SHIFT) & WATERBOX_BGCAM_INDEX_MASK) | \ + (((lightIndex) << WATERBOX_LIGHT_INDEX_SHIFT) & WATERBOX_LIGHT_INDEX_MASK) | \ + (((room) << WATERBOX_ROOM_SHIFT) & WATERBOX_ROOM_MASK) | (((setFlag19) & 1) << WATERBOX_FLAG_19_SHIFT)) + typedef struct { /* 0x00 */ s16 xMin; /* 0x02 */ s16 ySurface; @@ -80,11 +104,6 @@ typedef struct { /* 0x06 */ s16 xLength; /* 0x08 */ s16 zLength; /* 0x0C */ u32 properties; - - // 0x0008_0000 = ? - // 0x0007_E000 = Room Index, 0x3F = all rooms - // 0x0000_1F00 = Lighting Settings Index - // 0x0000_00FF = BgCam Index } WaterBox; // size = 0x10 typedef enum { @@ -277,11 +296,11 @@ typedef struct { /* 0x14 */ Vec3f* pos; /* 0x18 */ s32* bgId; /* 0x1C */ struct Actor* actor; - /* 0x20 */ u32 unk_20; + /* 0x20 */ u32 downChkFlags; /* 0x24 */ f32 chkDist; /* 0x28 */ DynaCollisionContext* dyna; /* 0x2C */ SSList* ssList; -} DynaRaycast; +} DynaRaycastDown; typedef struct { /* 0x00 */ struct CollisionContext* colCtx; diff --git a/src/code/code_800EC960.c b/src/code/code_800EC960.c index 876d4f7cbd..074fececa9 100644 --- a/src/code/code_800EC960.c +++ b/src/code/code_800EC960.c @@ -1246,7 +1246,7 @@ OcarinaStaff sPlayingStaff; OcarinaStaff sPlaybackStaff; OcarinaStaff sRecordingStaff; u32 sOcarinaUpdateTaskStart; -OcarinaStick sOcarinaInputStickRel; +OcarinaStick sOcarinaInputStickAdj; u32 sOcarinaInputButtonCur; u32 sOcarinaInputButtonStart; u32 sOcarinaInputButtonPrev; @@ -1299,8 +1299,8 @@ void AudioOcarina_ReadControllerInput(void) { PadMgr_RequestPadData(&gPadMgr, inputs, 0); sOcarinaInputButtonCur = input->cur.button; sOcarinaInputButtonPrev = ocarinaInputButtonPrev; - sOcarinaInputStickRel.x = input->rel.stick_x; - sOcarinaInputStickRel.y = input->rel.stick_y; + sOcarinaInputStickAdj.x = input->rel.stick_x; + sOcarinaInputStickAdj.y = input->rel.stick_y; } /** @@ -1719,11 +1719,11 @@ void AudioOcarina_PlayControllerInput(u8 unused) { if (sRecordingState != OCARINA_RECORD_SCARECROW_SPAWN) { // Bend the pitch of the note based on y control stick - sCurOcarinaBendIndex = sOcarinaInputStickRel.y; + sCurOcarinaBendIndex = sOcarinaInputStickAdj.y; sCurOcarinaBendFreq = AudioOcarina_BendPitchTwoSemitones(sCurOcarinaBendIndex); // Add vibrato of the ocarina note based on the x control stick - sCurOcarinaVibrato = ABS_ALT(sOcarinaInputStickRel.x) >> 2; + sCurOcarinaVibrato = ABS_ALT(sOcarinaInputStickAdj.x) >> 2; // Sets vibrato to io port 6 Audio_QueueCmdS8(0x6 << 24 | SEQ_PLAYER_SFX << 16 | SFX_CHANNEL_OCARINA << 8 | 6, sCurOcarinaVibrato); } else { diff --git a/src/code/z_actor.c b/src/code/z_actor.c index ab310a446d..9c71c31285 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -1168,13 +1168,13 @@ s32 func_8002E234(Actor* actor, f32 arg1, s32 arg2) { return true; } -s32 func_8002E2AC(PlayState* play, Actor* actor, Vec3f* arg2, s32 arg3) { +s32 func_8002E2AC(PlayState* play, Actor* actor, Vec3f* pos, s32 arg3) { f32 floorHeightDiff; s32 floorBgId; - arg2->y += 50.0f; + pos->y += 50.0f; - actor->floorHeight = BgCheck_EntityRaycastFloor5(play, &play->colCtx, &actor->floorPoly, &floorBgId, actor, arg2); + actor->floorHeight = BgCheck_EntityRaycastDown5(play, &play->colCtx, &actor->floorPoly, &floorBgId, actor, pos); actor->bgCheckFlags &= ~(BGCHECKFLAG_GROUND_TOUCH | BGCHECKFLAG_GROUND_LEAVE | BGCHECKFLAG_GROUND_STRICT); if (actor->floorHeight <= BGCHECK_Y_MIN) { @@ -3472,9 +3472,9 @@ f32 func_80033AEC(Vec3f* arg0, Vec3f* arg1, f32 arg2, f32 arg3, f32 arg4, f32 ar void func_80033C30(Vec3f* arg0, Vec3f* arg1, u8 alpha, PlayState* play) { MtxF sp60; - f32 var; - Vec3f sp50; - CollisionPoly* sp4C; + f32 yIntersect; + Vec3f checkPos; + CollisionPoly* groundPoly; OPEN_DISPS(play->state.gfxCtx, "../z_actor.c", 8120); @@ -3484,14 +3484,14 @@ void func_80033C30(Vec3f* arg0, Vec3f* arg1, u8 alpha, PlayState* play) { gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 0, 0, 0, alpha); - sp50.x = arg0->x; - sp50.y = arg0->y + 1.0f; - sp50.z = arg0->z; + checkPos.x = arg0->x; + checkPos.y = arg0->y + 1.0f; + checkPos.z = arg0->z; - var = BgCheck_EntityRaycastFloor2(play, &play->colCtx, &sp4C, &sp50); + yIntersect = BgCheck_EntityRaycastDown2(play, &play->colCtx, &groundPoly, &checkPos); - if (sp4C != NULL) { - func_80038A28(sp4C, arg0->x, var, arg0->z, &sp60); + if (groundPoly != NULL) { + func_80038A28(groundPoly, arg0->x, yIntersect, arg0->z, &sp60); Matrix_Put(&sp60); } else { Matrix_Translate(arg0->x, arg0->y, arg0->z, MTXMODE_NEW); diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c index 78d4edcc1b..2ded6b8f79 100644 --- a/src/code/z_bgcheck.c +++ b/src/code/z_bgcheck.c @@ -1,6 +1,29 @@ #include "global.h" #include "vt.h" +u16 DynaSSNodeList_GetNextNodeIdx(DynaSSNodeList* nodeList); +void BgCheck_GetStaticLookupIndicesFromPos(CollisionContext* colCtx, Vec3f* pos, Vec3i* sector); +s32 BgCheck_PosInStaticBoundingBox(CollisionContext* colCtx, Vec3f* pos); +s32 BgCheck_CheckLineImpl(CollisionContext* colCtx, u16 xpFlags1, u16 xpFlags2, Vec3f* posA, Vec3f* posB, + Vec3f* posResult, CollisionPoly** outPoly, s32* outBgId, Actor* actor, f32 chkDist, + u32 bccFlags); +void SSNodeList_Initialize(SSNodeList* this); +void SSNodeList_Alloc(PlayState* play, SSNodeList* this, s32 tblMax, s32 numPolys); +u16 SSNodeList_GetNextNodeIdx(SSNodeList* this); +void DynaPoly_Init(PlayState* play, DynaCollisionContext* dyna); +void DynaPoly_Alloc(PlayState* play, DynaCollisionContext* dyna); +f32 BgCheck_RaycastDownDyna(DynaRaycastDown* dynaRaycastDown); +s32 BgCheck_SphVsDynaWall(CollisionContext* colCtx, u16 xpFlags, f32* outX, f32* outZ, Vec3f* pos, f32 radius, + CollisionPoly** outPoly, s32* outBgId, Actor* actor); +s32 BgCheck_CheckDynaCeiling(CollisionContext* colCtx, u16 xpFlags, f32* outY, Vec3f* pos, f32 chkDist, + CollisionPoly** outPoly, s32* outBgId, Actor* actor); +s32 BgCheck_CheckLineAgainstDyna(CollisionContext* colCtx, u16 xpFlags, Vec3f* posA, Vec3f* posB, Vec3f* posResult, + CollisionPoly** outPoly, f32* distSq, s32* outBgId, Actor* actor, f32 chkDist, + s32 bccFlags); +s32 BgCheck_SphVsFirstDynaPoly(CollisionContext* colCtx, u16 xpFlags, CollisionPoly** outPoly, s32* outBgId, + Vec3f* center, f32 radius, Actor* actor, u16 bciFlags); +void BgCheck_ResetPolyCheckTbl(SSNodeList* nodeList, s32 numPolys); + #define SS_NULL 0xFFFF // bccFlags @@ -24,6 +47,16 @@ #define COLPOLY_IGNORE_ENTITY (1 << 1) #define COLPOLY_IGNORE_PROJECTILES (1 << 2) +// raycast down flags (downChkFlags) +#define BGCHECK_RAYCAST_DOWN_CHECK_CEILINGS (1 << 0) +#define BGCHECK_RAYCAST_DOWN_CHECK_WALLS (1 << 1) +#define BGCHECK_RAYCAST_DOWN_CHECK_FLOORS (1 << 2) +#define BGCHECK_RAYCAST_DOWN_CHECK_WALLS_SIMPLE (1 << 3) // stops checking dyna walls on finding first candidate result +#define BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY (1 << 4) // skips walls and ceilings with normal.y < 0 + +// raycast down groundChk flag. When enabled, search range is limited to floors and walls with a normal.y >= 0 +#define BGCHECK_GROUND_CHECK_ON (1 << 0) + s32 D_80119D90[WALL_TYPE_MAX] = { 0, // WALL_TYPE_0 WALL_FLAG_0, // WALL_TYPE_1 @@ -527,10 +560,10 @@ void StaticLookup_AddPoly(StaticLookup* lookup, CollisionContext* colCtx, Collis * Locates the closest static poly directly underneath `pos`, starting at list `ssList` * returns yIntersect of the closest poly, or `yIntersectMin` * stores the pointer of the closest poly to `outPoly` - * if (flags & 1), ignore polys with a normal.y < 0 (from vertical walls to ceilings) + * if BGCHECK_GROUND_CHECK_ON is set, ignore polys with a normal.y < 0 (from vertical walls to ceilings) */ -f32 BgCheck_RaycastFloorStaticList(CollisionContext* colCtx, u16 xpFlags, SSList* ssList, CollisionPoly** outPoly, - Vec3f* pos, f32 yIntersectMin, f32 chkDist, s32 flags) { +f32 BgCheck_RaycastDownStaticList(CollisionContext* colCtx, u16 xpFlags, SSList* ssList, CollisionPoly** outPoly, + Vec3f* pos, f32 yIntersectMin, f32 chkDist, s32 groundChk) { SSNode* curNode; s32 polyId; f32 result; @@ -547,7 +580,7 @@ f32 BgCheck_RaycastFloorStaticList(CollisionContext* colCtx, u16 xpFlags, SSList polyId = curNode->polyId; if (COLPOLY_VIA_FLAG_TEST(colCtx->colHeader->polyList[polyId].flags_vIA, xpFlags) || - ((flags & 1) && colCtx->colHeader->polyList[polyId].normal.y < 0)) { + ((groundChk & BGCHECK_GROUND_CHECK_ON) && colCtx->colHeader->polyList[polyId].normal.y < 0)) { if (curNode->next == SS_NULL) { break; } @@ -565,7 +598,6 @@ f32 BgCheck_RaycastFloorStaticList(CollisionContext* colCtx, u16 xpFlags, SSList pos->z, &yIntersect, chkDist) == true) { // if poly is closer to pos without going over if (yIntersect < pos->y && result < yIntersect) { - result = yIntersect; *outPoly = &colCtx->colHeader->polyList[polyId]; } @@ -584,31 +616,31 @@ f32 BgCheck_RaycastFloorStaticList(CollisionContext* colCtx, u16 xpFlags, SSList * returns yIntersect of the closest poly, or `yIntersectMin` * stores the pointer of the closest poly to `outPoly` */ -f32 BgCheck_RaycastFloorStatic(StaticLookup* lookup, CollisionContext* colCtx, u16 xpFlags, CollisionPoly** poly, - Vec3f* pos, u32 arg5, f32 chkDist, f32 yIntersectMin) { - s32 flag; // skip polys with normal.y < 0 +f32 BgCheck_RaycastDownStatic(StaticLookup* lookup, CollisionContext* colCtx, u16 xpFlags, CollisionPoly** poly, + Vec3f* pos, u32 downChkFlags, f32 chkDist, f32 yIntersectMin) { f32 yIntersect = yIntersectMin; + s32 groundChk; - if (arg5 & 4) { - yIntersect = BgCheck_RaycastFloorStaticList(colCtx, xpFlags, &lookup->floor, poly, pos, yIntersect, chkDist, 0); + if (downChkFlags & BGCHECK_RAYCAST_DOWN_CHECK_FLOORS) { + yIntersect = BgCheck_RaycastDownStaticList(colCtx, xpFlags, &lookup->floor, poly, pos, yIntersect, chkDist, 0); } - if ((arg5 & 2) || (arg5 & 8)) { - flag = 0; - if (arg5 & 0x10) { - flag = 1; + if ((downChkFlags & BGCHECK_RAYCAST_DOWN_CHECK_WALLS) || (downChkFlags & BGCHECK_RAYCAST_DOWN_CHECK_WALLS_SIMPLE)) { + groundChk = 0; + if (downChkFlags & BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY) { + groundChk |= BGCHECK_GROUND_CHECK_ON; } yIntersect = - BgCheck_RaycastFloorStaticList(colCtx, xpFlags, &lookup->wall, poly, pos, yIntersect, chkDist, flag); + BgCheck_RaycastDownStaticList(colCtx, xpFlags, &lookup->wall, poly, pos, yIntersect, chkDist, groundChk); } - if (arg5 & 1) { - flag = 0; - if (arg5 & 0x10) { - flag = 1; + if (downChkFlags & BGCHECK_RAYCAST_DOWN_CHECK_CEILINGS) { + groundChk = 0; + if (downChkFlags & BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY) { + groundChk |= BGCHECK_GROUND_CHECK_ON; } yIntersect = - BgCheck_RaycastFloorStaticList(colCtx, xpFlags, &lookup->ceiling, poly, pos, yIntersect, chkDist, flag); + BgCheck_RaycastDownStaticList(colCtx, xpFlags, &lookup->ceiling, poly, pos, yIntersect, chkDist, groundChk); } return yIntersect; @@ -1662,19 +1694,19 @@ s32 BgCheck_PosInStaticBoundingBox(CollisionContext* colCtx, Vec3f* pos) { } /** - * Raycast Toward Floor + * Raycast Downward + * If `actor` != null, bgcheck will be skipped for that actor * returns the yIntersect of the nearest poly found directly below `pos`, or BGCHECK_Y_MIN if no floor detected * returns the poly found in `outPoly`, and the bgId of the entity in `outBgId` */ -f32 BgCheck_RaycastFloorImpl(PlayState* play, CollisionContext* colCtx, u16 xpFlags, CollisionPoly** outPoly, - s32* outBgId, Vec3f* pos, Actor* actor, u32 arg7, f32 chkDist) { - +f32 BgCheck_RaycastDownImpl(PlayState* play, CollisionContext* colCtx, u16 xpFlags, CollisionPoly** outPoly, + s32* outBgId, Vec3f* pos, Actor* actor, u32 downChkFlags, f32 chkDist) { f32 yIntersectDyna; s32* temp_a0; StaticLookup* lookupTbl; Vec3f checkPos; StaticLookup* lookup; - DynaRaycast dynaRaycast; + DynaRaycastDown dynaRaycastDown; f32 yIntersect; *outBgId = BGCHECK_SCENE; @@ -1697,25 +1729,26 @@ f32 BgCheck_RaycastFloorImpl(PlayState* play, CollisionContext* colCtx, u16 xpFl checkPos.y -= colCtx->subdivLength.y; continue; } - yIntersect = BgCheck_RaycastFloorStatic(lookup, colCtx, xpFlags, outPoly, pos, arg7, chkDist, BGCHECK_Y_MIN); + yIntersect = + BgCheck_RaycastDownStatic(lookup, colCtx, xpFlags, outPoly, pos, downChkFlags, chkDist, BGCHECK_Y_MIN); if (yIntersect > BGCHECK_Y_MIN) { break; } checkPos.y -= colCtx->subdivLength.y; } - dynaRaycast.colCtx = colCtx; - dynaRaycast.xpFlags = xpFlags; - dynaRaycast.yIntersect = yIntersect; - dynaRaycast.pos = pos; - dynaRaycast.actor = actor; - dynaRaycast.unk_20 = arg7; - dynaRaycast.chkDist = chkDist; - dynaRaycast.play = play; - dynaRaycast.resultPoly = outPoly; - dynaRaycast.bgId = outBgId; + dynaRaycastDown.colCtx = colCtx; + dynaRaycastDown.xpFlags = xpFlags; + dynaRaycastDown.yIntersect = yIntersect; + dynaRaycastDown.pos = pos; + dynaRaycastDown.actor = actor; + dynaRaycastDown.downChkFlags = downChkFlags; + dynaRaycastDown.chkDist = chkDist; + dynaRaycastDown.play = play; + dynaRaycastDown.resultPoly = outPoly; + dynaRaycastDown.bgId = outBgId; - yIntersectDyna = BgCheck_RaycastFloorDyna(&dynaRaycast); + yIntersectDyna = BgCheck_RaycastDownDyna(&dynaRaycastDown); if (yIntersect < yIntersectDyna) { yIntersect = yIntersectDyna; @@ -1728,133 +1761,171 @@ f32 BgCheck_RaycastFloorImpl(PlayState* play, CollisionContext* colCtx, u16 xpFl } /** - * Public raycast toward floor + * Public raycast downward, ground check (UNUSED) * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_CameraRaycastFloor1(CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos) { +f32 BgCheck_CameraRaycastDown1(CollisionContext* colCtx, CollisionPoly** outGroundPoly, Vec3f* pos) { s32 bgId; - return BgCheck_RaycastFloorImpl(NULL, colCtx, COLPOLY_IGNORE_CAMERA, outPoly, &bgId, pos, NULL, 0x1C, 1.0f); + return BgCheck_RaycastDownImpl(NULL, colCtx, COLPOLY_IGNORE_CAMERA, outGroundPoly, &bgId, pos, NULL, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS_SIMPLE | BGCHECK_RAYCAST_DOWN_CHECK_FLOORS | + BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY, + 1.0f); } /** - * Public raycast toward floor + * Public raycast downward, ground check * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_EntityRaycastFloor1(CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos) { +f32 BgCheck_EntityRaycastDown1(CollisionContext* colCtx, CollisionPoly** outGroundPoly, Vec3f* pos) { s32 bgId; - return BgCheck_RaycastFloorImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outPoly, &bgId, pos, NULL, 0x1C, 1.0f); + return BgCheck_RaycastDownImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outGroundPoly, &bgId, pos, NULL, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS_SIMPLE | BGCHECK_RAYCAST_DOWN_CHECK_FLOORS | + BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY, + 1.0f); } /** - * Public raycast toward floor + * Public raycast downward, ground check * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_EntityRaycastFloor2(PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, Vec3f* pos) { +f32 BgCheck_EntityRaycastDown2(PlayState* play, CollisionContext* colCtx, CollisionPoly** outGroundPoly, Vec3f* pos) { s32 bgId; - return BgCheck_RaycastFloorImpl(play, colCtx, COLPOLY_IGNORE_ENTITY, outPoly, &bgId, pos, NULL, 0x1C, 1.0f); + return BgCheck_RaycastDownImpl(play, colCtx, COLPOLY_IGNORE_ENTITY, outGroundPoly, &bgId, pos, NULL, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS_SIMPLE | BGCHECK_RAYCAST_DOWN_CHECK_FLOORS | + BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY, + 1.0f); } /** - * Public raycast toward floor + * Public raycast downward, ground check * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_EntityRaycastFloor3(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos) { - return BgCheck_RaycastFloorImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outPoly, bgId, pos, NULL, 0x1C, 1.0f); +f32 BgCheck_EntityRaycastDown3(CollisionContext* colCtx, CollisionPoly** outGroundPoly, s32* bgId, Vec3f* pos) { + return BgCheck_RaycastDownImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outGroundPoly, bgId, pos, NULL, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS_SIMPLE | BGCHECK_RAYCAST_DOWN_CHECK_FLOORS | + BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY, + 1.0f); } /** - * Public raycast toward floor + * Public raycast downward, ground check + * If `actor` != null, bgcheck will be skipped for that actor * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_EntityRaycastFloor4(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, - Vec3f* pos) { - return BgCheck_RaycastFloorImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outPoly, bgId, pos, actor, 0x1C, 1.0f); +f32 BgCheck_EntityRaycastDown4(CollisionContext* colCtx, CollisionPoly** outGroundPoly, s32* bgId, Actor* actor, + Vec3f* pos) { + return BgCheck_RaycastDownImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outGroundPoly, bgId, pos, actor, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS_SIMPLE | BGCHECK_RAYCAST_DOWN_CHECK_FLOORS | + BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY, + 1.0f); } /** - * Public raycast toward floor + * Public raycast downward, ground check + * If `actor` != null, bgcheck will be skipped for that actor * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_EntityRaycastFloor5(PlayState* play, CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, - Actor* actor, Vec3f* pos) { - return BgCheck_RaycastFloorImpl(play, colCtx, COLPOLY_IGNORE_ENTITY, outPoly, bgId, pos, actor, 0x1C, 1.0f); +f32 BgCheck_EntityRaycastDown5(PlayState* play, CollisionContext* colCtx, CollisionPoly** outGroundPoly, s32* bgId, + Actor* actor, Vec3f* pos) { + return BgCheck_RaycastDownImpl(play, colCtx, COLPOLY_IGNORE_ENTITY, outGroundPoly, bgId, pos, actor, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS_SIMPLE | BGCHECK_RAYCAST_DOWN_CHECK_FLOORS | + BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY, + 1.0f); } /** - * Public raycast toward floor + * Public raycast downward, ground check + * If `actor` != null, bgcheck will be skipped for that actor + * `chkDist` is the distance beyond the poly's boundary where the check will still pass * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_EntityRaycastFloor6(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos, - f32 chkDist) { - return BgCheck_RaycastFloorImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outPoly, bgId, pos, actor, 0x1C, chkDist); +f32 BgCheck_EntityRaycastDown6(CollisionContext* colCtx, CollisionPoly** outGroundPoly, s32* bgId, Actor* actor, + Vec3f* pos, f32 chkDist) { + return BgCheck_RaycastDownImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outGroundPoly, bgId, pos, actor, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS_SIMPLE | BGCHECK_RAYCAST_DOWN_CHECK_FLOORS | + BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY, + chkDist); } /** - * Public raycast toward floor + * Public raycast downward, floor and exhaustive wall check (UNUSED) + * If `actor` != null, bgcheck will be skipped for that actor * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_EntityRaycastFloor7(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, - Vec3f* pos) { - return BgCheck_RaycastFloorImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outPoly, bgId, pos, actor, 0x06, 1.0f); +f32 BgCheck_EntityRaycastDown7(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, Vec3f* pos) { + return BgCheck_RaycastDownImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outPoly, bgId, pos, actor, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS | BGCHECK_RAYCAST_DOWN_CHECK_FLOORS, 1.0f); } /** - * Public raycast toward floor + * Public raycast downward, ground check + * `outGroundPoly` returns original value if no poly detected * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_AnyRaycastFloor1(CollisionContext* colCtx, CollisionPoly* outPoly, Vec3f* pos) { - CollisionPoly* tempPoly; +f32 BgCheck_AnyRaycastDown1(CollisionContext* colCtx, CollisionPoly* outGroundPoly, Vec3f* pos) { + CollisionPoly* checkResultPoly; f32 result; s32 bgId; - result = BgCheck_RaycastFloorImpl(NULL, colCtx, COLPOLY_IGNORE_NONE, &tempPoly, &bgId, pos, NULL, 0x1C, 1.0f); + result = BgCheck_RaycastDownImpl(NULL, colCtx, COLPOLY_IGNORE_NONE, &checkResultPoly, &bgId, pos, NULL, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS_SIMPLE | BGCHECK_RAYCAST_DOWN_CHECK_FLOORS | + BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY, + 1.0f); - if (tempPoly != NULL) { - *outPoly = *tempPoly; + if (checkResultPoly != NULL) { + *outGroundPoly = *checkResultPoly; } return result; } /** - * Public raycast toward floor + * Public raycast downward, ground check (UNUSED) + * `outGroundPoly` returns original value if no poly detected * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_AnyRaycastFloor2(CollisionContext* colCtx, CollisionPoly* outPoly, s32* bgId, Vec3f* pos) { - CollisionPoly* tempPoly; - f32 result = BgCheck_RaycastFloorImpl(NULL, colCtx, COLPOLY_IGNORE_NONE, &tempPoly, bgId, pos, NULL, 0x1C, 1.0f); +f32 BgCheck_AnyRaycastDown2(CollisionContext* colCtx, CollisionPoly* outGroundPoly, s32* bgId, Vec3f* pos) { + CollisionPoly* checkResultPoly; + f32 result = BgCheck_RaycastDownImpl(NULL, colCtx, COLPOLY_IGNORE_NONE, &checkResultPoly, bgId, pos, NULL, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS_SIMPLE | BGCHECK_RAYCAST_DOWN_CHECK_FLOORS | + BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY, + 1.0f); - if (tempPoly != NULL) { - *outPoly = *tempPoly; + if (checkResultPoly != NULL) { + *outGroundPoly = *checkResultPoly; } return result; } /** - * Public raycast toward floor + * Public raycast downward, floor and exhaustive wall check * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_CameraRaycastFloor2(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos) { - return BgCheck_RaycastFloorImpl(NULL, colCtx, COLPOLY_IGNORE_CAMERA, outPoly, bgId, pos, NULL, 0x06, 1.0f); +f32 BgCheck_CameraRaycastDown2(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos) { + return BgCheck_RaycastDownImpl(NULL, colCtx, COLPOLY_IGNORE_CAMERA, outPoly, bgId, pos, NULL, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS | BGCHECK_RAYCAST_DOWN_CHECK_FLOORS, 1.0f); } /** - * Public raycast toward floor + * Public raycast downward, exhaustive wall check (UNUSED) + * If `actor` != null, bgcheck will be skipped for that actor * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_EntityRaycastFloor8(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, - Vec3f* pos) { - return BgCheck_RaycastFloorImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outPoly, bgId, pos, actor, 0x02, 1.0f); +f32 BgCheck_EntityRaycastDownWalls(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Actor* actor, + Vec3f* pos) { + return BgCheck_RaycastDownImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outPoly, bgId, pos, actor, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS, 1.0f); } /** - * Public raycast toward floor + * Public raycast downward, floor and exhaustive wall check (UNUSED) * returns yIntersect of the poly found, or BGCHECK_Y_MIN if no poly detected */ -f32 BgCheck_EntityRaycastFloor9(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos) { - return BgCheck_RaycastFloorImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outPoly, bgId, pos, NULL, 0x06, 1.0f); +f32 BgCheck_EntityRaycastDown9(CollisionContext* colCtx, CollisionPoly** outPoly, s32* bgId, Vec3f* pos) { + return BgCheck_RaycastDownImpl(NULL, colCtx, COLPOLY_IGNORE_ENTITY, outPoly, bgId, pos, NULL, + BGCHECK_RAYCAST_DOWN_CHECK_WALLS | BGCHECK_RAYCAST_DOWN_CHECK_FLOORS, 1.0f); } /** @@ -3014,52 +3085,54 @@ void DynaPoly_UpdateBgActorTransforms(PlayState* play, DynaCollisionContext* dyn #define DYNA_RAYCAST_CEILINGS 4 /** - * Perform dyna poly raycast toward floor on a list of floor, wall, or ceiling polys + * Performs a downward raycast check on a list of floor, wall, or ceiling dyna polys * `listType` specifies the poly list type (e.g. DYNA_RAYCAST_FLOORS) */ -f32 BgCheck_RaycastFloorDynaList(DynaRaycast* dynaRaycast, u32 listType) { +f32 BgCheck_RaycastDownDynaList(DynaRaycastDown* dynaRaycastDown, u32 listType) { CollisionPoly* polyList; SSNode* curNode; f32 result; f32 yIntersect; s16 id; - result = dynaRaycast->yIntersect; - if (dynaRaycast->ssList->head == SS_NULL) { + result = dynaRaycastDown->yIntersect; + if (dynaRaycastDown->ssList->head == SS_NULL) { return result; } - polyList = dynaRaycast->dyna->polyList; - curNode = &dynaRaycast->dyna->polyNodes.tbl[dynaRaycast->ssList->head]; + polyList = dynaRaycastDown->dyna->polyList; + curNode = &dynaRaycastDown->dyna->polyNodes.tbl[dynaRaycastDown->ssList->head]; while (true) { id = curNode->polyId; - if (COLPOLY_VIA_FLAG_TEST(polyList[id].flags_vIA, dynaRaycast->xpFlags)) { + if (COLPOLY_VIA_FLAG_TEST(polyList[id].flags_vIA, dynaRaycastDown->xpFlags)) { if (curNode->next == SS_NULL) { break; } else { - curNode = &dynaRaycast->dyna->polyNodes.tbl[curNode->next]; + curNode = &dynaRaycastDown->dyna->polyNodes.tbl[curNode->next]; continue; } } - if ((listType & (DYNA_RAYCAST_WALLS | DYNA_RAYCAST_CEILINGS)) && (dynaRaycast->unk_20 & 0x10) && + if ((listType & (DYNA_RAYCAST_WALLS | DYNA_RAYCAST_CEILINGS)) && + (dynaRaycastDown->downChkFlags & BGCHECK_RAYCAST_DOWN_CHECK_GROUND_ONLY) && COLPOLY_GET_NORMAL(polyList[id].normal.y) < 0.0f) { if (curNode->next == SS_NULL) { break; } else { - curNode = &dynaRaycast->dyna->polyNodes.tbl[curNode->next]; + curNode = &dynaRaycastDown->dyna->polyNodes.tbl[curNode->next]; continue; } } - if (CollisionPoly_CheckYIntersectApprox1(&polyList[id], dynaRaycast->dyna->vtxList, dynaRaycast->pos->x, - dynaRaycast->pos->z, &yIntersect, dynaRaycast->chkDist) == true && - yIntersect < dynaRaycast->pos->y && result < yIntersect) { + if (CollisionPoly_CheckYIntersectApprox1(&polyList[id], dynaRaycastDown->dyna->vtxList, dynaRaycastDown->pos->x, + dynaRaycastDown->pos->z, &yIntersect, + dynaRaycastDown->chkDist) == true && + yIntersect < dynaRaycastDown->pos->y && result < yIntersect) { result = yIntersect; - *dynaRaycast->resultPoly = &dynaRaycast->dyna->polyList[id]; + *dynaRaycastDown->resultPoly = &dynaRaycastDown->dyna->polyList[id]; } if (curNode->next == SS_NULL) { break; } else { - curNode = &dynaRaycast->dyna->polyNodes.tbl[curNode->next]; + curNode = &dynaRaycastDown->dyna->polyNodes.tbl[curNode->next]; continue; } } @@ -3067,10 +3140,10 @@ f32 BgCheck_RaycastFloorDynaList(DynaRaycast* dynaRaycast, u32 listType) { } /** - * Perform dyna poly raycast toward floor + * Performs a downward raycast check on dyna polys * returns the yIntersect of the poly found, or BGCHECK_Y_MIN if no poly is found */ -f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast) { +f32 BgCheck_RaycastDownDyna(DynaRaycastDown* dynaRaycastDown) { s32 i; f32 result; f32 intersect2; @@ -3092,75 +3165,76 @@ f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast) { CollisionPoly* poly; result = BGCHECK_Y_MIN; - *dynaRaycast->bgId = BGCHECK_SCENE; + *dynaRaycastDown->bgId = BGCHECK_SCENE; for (i = 0; i < BG_ACTOR_MAX; i++) { - if (!(dynaRaycast->colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE)) { + if (!(dynaRaycastDown->colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE)) { continue; } - if (dynaRaycast->actor == dynaRaycast->colCtx->dyna.bgActors[i].actor || - dynaRaycast->pos->y < dynaRaycast->colCtx->dyna.bgActors[i].minY || - Math3D_XZInSphere(&dynaRaycast->colCtx->dyna.bgActors[i].boundingSphere, dynaRaycast->pos->x, - dynaRaycast->pos->z) == false) { + if (dynaRaycastDown->actor == dynaRaycastDown->colCtx->dyna.bgActors[i].actor || + dynaRaycastDown->pos->y < dynaRaycastDown->colCtx->dyna.bgActors[i].minY || + Math3D_XZInSphere(&dynaRaycastDown->colCtx->dyna.bgActors[i].boundingSphere, dynaRaycastDown->pos->x, + dynaRaycastDown->pos->z) == false) { continue; } - dynaRaycast->dyna = &dynaRaycast->colCtx->dyna; - if (dynaRaycast->unk_20 & BGCHECK_IGNORE_FLOOR) { - dynaRaycast->ssList = &dynaRaycast->colCtx->dyna.bgActors[i].dynaLookup.floor; - intersect2 = BgCheck_RaycastFloorDynaList(dynaRaycast, DYNA_RAYCAST_FLOORS); + dynaRaycastDown->dyna = &dynaRaycastDown->colCtx->dyna; + if (dynaRaycastDown->downChkFlags & BGCHECK_RAYCAST_DOWN_CHECK_FLOORS) { + dynaRaycastDown->ssList = &dynaRaycastDown->colCtx->dyna.bgActors[i].dynaLookup.floor; + intersect2 = BgCheck_RaycastDownDynaList(dynaRaycastDown, DYNA_RAYCAST_FLOORS); - if (dynaRaycast->yIntersect < intersect2) { - - dynaRaycast->yIntersect = intersect2; - *dynaRaycast->bgId = i; + if (dynaRaycastDown->yIntersect < intersect2) { + dynaRaycastDown->yIntersect = intersect2; + *dynaRaycastDown->bgId = i; result = intersect2; } } - if ((dynaRaycast->unk_20 & BGCHECK_IGNORE_WALL) || - (*dynaRaycast->resultPoly == NULL && (dynaRaycast->unk_20 & 8))) { - dynaRaycast->ssList = &dynaRaycast->colCtx->dyna.bgActors[i].dynaLookup.wall; - intersect2 = BgCheck_RaycastFloorDynaList(dynaRaycast, DYNA_RAYCAST_WALLS); - if (dynaRaycast->yIntersect < intersect2) { + if ((dynaRaycastDown->downChkFlags & BGCHECK_RAYCAST_DOWN_CHECK_WALLS) || + (*dynaRaycastDown->resultPoly == NULL && + (dynaRaycastDown->downChkFlags & BGCHECK_RAYCAST_DOWN_CHECK_WALLS_SIMPLE))) { + dynaRaycastDown->ssList = &dynaRaycastDown->colCtx->dyna.bgActors[i].dynaLookup.wall; + intersect2 = BgCheck_RaycastDownDynaList(dynaRaycastDown, DYNA_RAYCAST_WALLS); - dynaRaycast->yIntersect = intersect2; - *dynaRaycast->bgId = i; + if (dynaRaycastDown->yIntersect < intersect2) { + dynaRaycastDown->yIntersect = intersect2; + *dynaRaycastDown->bgId = i; result = intersect2; } } - if (dynaRaycast->unk_20 & BGCHECK_IGNORE_CEILING) { - dynaRaycast->ssList = &dynaRaycast->colCtx->dyna.bgActors[i].dynaLookup.ceiling; - intersect2 = BgCheck_RaycastFloorDynaList(dynaRaycast, DYNA_RAYCAST_CEILINGS); - if (dynaRaycast->yIntersect < intersect2) { + if (dynaRaycastDown->downChkFlags & BGCHECK_RAYCAST_DOWN_CHECK_CEILINGS) { + dynaRaycastDown->ssList = &dynaRaycastDown->colCtx->dyna.bgActors[i].dynaLookup.ceiling; + intersect2 = BgCheck_RaycastDownDynaList(dynaRaycastDown, DYNA_RAYCAST_CEILINGS); - dynaRaycast->yIntersect = intersect2; - *dynaRaycast->bgId = i; + if (dynaRaycastDown->yIntersect < intersect2) { + dynaRaycastDown->yIntersect = intersect2; + *dynaRaycastDown->bgId = i; result = intersect2; } } } - dynaActor = DynaPoly_GetActor(dynaRaycast->colCtx, *dynaRaycast->bgId); - if ((result != BGCHECK_Y_MIN) && (dynaActor != NULL) && (dynaRaycast->play != NULL)) { - pauseState = dynaRaycast->play->pauseCtx.state != PAUSE_STATE_OFF; + dynaActor = DynaPoly_GetActor(dynaRaycastDown->colCtx, *dynaRaycastDown->bgId); + if ((result != BGCHECK_Y_MIN) && (dynaActor != NULL) && (dynaRaycastDown->play != NULL)) { + pauseState = dynaRaycastDown->play->pauseCtx.state != PAUSE_STATE_OFF; if (!pauseState) { - pauseState = dynaRaycast->play->pauseCtx.debugState != 0; + pauseState = dynaRaycastDown->play->pauseCtx.debugState != 0; } - if (!pauseState && (dynaRaycast->colCtx->dyna.bgActorFlags[*dynaRaycast->bgId] & BGACTOR_1)) { - curTransform = &dynaRaycast->dyna->bgActors[*dynaRaycast->bgId].curTransform; + if (!pauseState && (dynaRaycastDown->colCtx->dyna.bgActorFlags[*dynaRaycastDown->bgId] & BGACTOR_1)) { + curTransform = &dynaRaycastDown->dyna->bgActors[*dynaRaycastDown->bgId].curTransform; polyMin = - &dynaRaycast->dyna->polyList[dynaRaycast->dyna->bgActors[*dynaRaycast->bgId].dynaLookup.polyStartIndex]; - polyIndex = *dynaRaycast->resultPoly - polyMin; - poly = &dynaRaycast->dyna->bgActors[*dynaRaycast->bgId].colHeader->polyList[polyIndex]; + &dynaRaycastDown->dyna + ->polyList[dynaRaycastDown->dyna->bgActors[*dynaRaycastDown->bgId].dynaLookup.polyStartIndex]; + polyIndex = *dynaRaycastDown->resultPoly - polyMin; + poly = &dynaRaycastDown->dyna->bgActors[*dynaRaycastDown->bgId].colHeader->polyList[polyIndex]; SkinMatrix_SetTranslateRotateYXZScale(&srpMtx, curTransform->scale.x, curTransform->scale.y, curTransform->scale.z, curTransform->rot.x, curTransform->rot.y, curTransform->rot.z, curTransform->pos.x, curTransform->pos.y, curTransform->pos.z); - vtxList = dynaRaycast->dyna->bgActors[*dynaRaycast->bgId].colHeader->vtxList; + vtxList = dynaRaycastDown->dyna->bgActors[*dynaRaycastDown->bgId].colHeader->vtxList; for (i2 = 0; i2 < 3; i2++) { Math_Vec3s_ToVec3f(&vtx, &vtxList[COLPOLY_VTX_INDEX(poly->vtxData[i2])]); @@ -3174,9 +3248,9 @@ f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast) { polyNorm.y *= 1.0f / magnitude; polyNorm.z *= 1.0f / magnitude; polyDist = -DOTXYZ(polyNorm, polyVtx[0]); - if (Math3D_TriChkPointParaYIntersectInsideTri(&polyVtx[0], &polyVtx[1], &polyVtx[2], polyNorm.x, - polyNorm.y, polyNorm.z, polyDist, dynaRaycast->pos->z, - dynaRaycast->pos->x, &intersect, dynaRaycast->chkDist)) { + if (Math3D_TriChkPointParaYIntersectInsideTri( + &polyVtx[0], &polyVtx[1], &polyVtx[2], polyNorm.x, polyNorm.y, polyNorm.z, polyDist, + dynaRaycastDown->pos->z, dynaRaycastDown->pos->x, &intersect, dynaRaycastDown->chkDist)) { if (fabsf(intersect - result) < 1.0f) { result = intersect; @@ -4174,9 +4248,9 @@ s32 WaterBox_GetSurfaceImpl(PlayState* play, CollisionContext* colCtx, f32 x, f3 for (curWaterBox = colHeader->waterBoxes; curWaterBox < colHeader->waterBoxes + colHeader->numWaterBoxes; curWaterBox++) { - room = (curWaterBox->properties >> 13) & 0x3F; - if (room == (u32)play->roomCtx.curRoom.num || room == 0x3F) { - if ((curWaterBox->properties & 0x80000) == 0) { + room = WATERBOX_ROOM(curWaterBox->properties); + if (room == (u32)play->roomCtx.curRoom.num || room == WATERBOX_ROOM_ALL) { + if (!(curWaterBox->properties & WATERBOX_FLAG_19)) { if (curWaterBox->xMin < x && x < curWaterBox->xMin + curWaterBox->xLength) { if (curWaterBox->zMin < z && z < curWaterBox->zMin + curWaterBox->zLength) { *outWaterBox = curWaterBox; @@ -4191,7 +4265,7 @@ s32 WaterBox_GetSurfaceImpl(PlayState* play, CollisionContext* colCtx, f32 x, f3 } /** - * Gets the first active WaterBox at `pos` where WaterBox.properties & 0x80000 == 0 + * Gets the first active WaterBox at `pos` with WATERBOX_FLAG_19 not set * `surfaceChkDist` is the absolute y distance from the water surface to check * returns the index of the waterbox found, or -1 if no waterbox is found * `outWaterBox` returns the pointer to the waterbox found, or NULL if none is found @@ -4213,10 +4287,10 @@ s32 WaterBox_GetSurface2(PlayState* play, CollisionContext* colCtx, Vec3f* pos, waterBox = &colHeader->waterBoxes[i]; room = WATERBOX_ROOM(waterBox->properties); - if (!(room == play->roomCtx.curRoom.num || room == 0x3F)) { + if (!(room == play->roomCtx.curRoom.num || room == WATERBOX_ROOM_ALL)) { continue; } - if (waterBox->properties & 0x80000) { + if (waterBox->properties & WATERBOX_FLAG_19) { continue; } if (!(waterBox->xMin < pos->x && pos->x < waterBox->xMin + waterBox->xLength)) { @@ -4239,9 +4313,9 @@ s32 WaterBox_GetSurface2(PlayState* play, CollisionContext* colCtx, Vec3f* pos, * WaterBox get BgCam index */ u32 WaterBox_GetBgCamIndex(CollisionContext* colCtx, WaterBox* waterBox) { - u32 prop = waterBox->properties >> 0; + u32 bgCamIndex = WATERBOX_BGCAM_INDEX(waterBox->properties); - return prop & 0xFF; + return bgCamIndex; } /** @@ -4261,15 +4335,15 @@ u16 WaterBox_GetBgCamSetting(CollisionContext* colCtx, WaterBox* waterBox) { /** * WaterBox get lighting settings */ -u32 WaterBox_GetLightSettingIndex(CollisionContext* colCtx, WaterBox* waterBox) { - u32 prop = waterBox->properties >> 8; +u32 WaterBox_GetLightIndex(CollisionContext* colCtx, WaterBox* waterBox) { + u32 lightIndex = WATERBOX_LIGHT_INDEX(waterBox->properties); - return prop & 0x1F; + return lightIndex; } /** * Get the water surface at point (`x`, `ySurface`, `z`). `ySurface` doubles as position y input - * same as WaterBox_GetSurfaceImpl, but tests if WaterBox properties & 0x80000 != 0 + * same as WaterBox_GetSurfaceImpl, but tests if WATERBOX_FLAG_19 is set * returns true if point is within the xz boundaries of an active water box, else false * `ySurface` returns the water box's surface, while `outWaterBox` returns a pointer to the WaterBox */ @@ -4284,9 +4358,9 @@ s32 func_800425B0(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* for (curWaterBox = colHeader->waterBoxes; curWaterBox < colHeader->waterBoxes + colHeader->numWaterBoxes; curWaterBox++) { - room = (curWaterBox->properties >> 0xD) & 0x3F; - if ((room == (u32)play->roomCtx.curRoom.num) || (room == 0x3F)) { - if ((curWaterBox->properties & 0x80000) != 0) { + room = WATERBOX_ROOM(curWaterBox->properties); + if ((room == (u32)play->roomCtx.curRoom.num) || (room == WATERBOX_ROOM_ALL)) { + if (curWaterBox->properties & WATERBOX_FLAG_19) { if (curWaterBox->xMin < x && x < (curWaterBox->xMin + curWaterBox->xLength)) { if (curWaterBox->zMin < z && z < (curWaterBox->zMin + curWaterBox->zLength)) { *outWaterBox = curWaterBox; diff --git a/src/code/z_camera.c b/src/code/z_camera.c index ee0b45eb5f..89db13211a 100644 --- a/src/code/z_camera.c +++ b/src/code/z_camera.c @@ -233,7 +233,7 @@ s32 Camera_BGCheckInfo(Camera* camera, Vec3f* from, CamColChk* to) { toNewPos = to->pos; toNewPos.y += 5.0f; - floorPolyY = BgCheck_CameraRaycastFloor2(colCtx, &floorPoly, &floorBgId, &toNewPos); + floorPolyY = BgCheck_CameraRaycastDown2(colCtx, &floorPoly, &floorBgId, &toNewPos); if ((to->pos.y - floorPolyY) > 5.0f) { // if the y distance from the check point to the floor is more than 5 units @@ -293,7 +293,7 @@ s32 func_80043F94(Camera* camera, Vec3f* from, CamColChk* to) { to->norm.z = -fromToNorm.z; toNewPos = to->pos; toNewPos.y += 5.0f; - floorY = BgCheck_CameraRaycastFloor2(colCtx, &floorPoly, &bgId, &toNewPos); + floorY = BgCheck_CameraRaycastDown2(colCtx, &floorPoly, &bgId, &toNewPos); if ((to->pos.y - floorY) > 5.0f) { // to is not on the ground or below it. to->pos.x += to->norm.x; @@ -377,7 +377,7 @@ s32 Camera_CheckOOB(Camera* camera, Vec3f* from, Vec3f* to) { f32 Camera_GetFloorYNorm(Camera* camera, Vec3f* floorNorm, Vec3f* chkPos, s32* bgId) { s32 pad; CollisionPoly* floorPoly; - f32 floorY = BgCheck_EntityRaycastFloor3(&camera->play->colCtx, &floorPoly, bgId, chkPos); + f32 floorY = BgCheck_EntityRaycastDown3(&camera->play->colCtx, &floorPoly, bgId, chkPos); if (floorY == BGCHECK_Y_MIN) { // no floor @@ -418,7 +418,7 @@ f32 Camera_GetFloorYLayer(Camera* camera, Vec3f* norm, Vec3f* pos, s32* bgId) { s32 i; for (i = 3; i > 0; i--) { - floorY = BgCheck_CameraRaycastFloor2(colCtx, &floorPoly, bgId, pos); + floorY = BgCheck_CameraRaycastDown2(colCtx, &floorPoly, bgId, pos); if (floorY == BGCHECK_Y_MIN || (camera->playerGroundY < floorY && !(COLPOLY_GET_NORMAL(floorPoly->normal.y) > 0.5f))) { // no floor, or player is below the floor and floor is not considered steep @@ -492,7 +492,7 @@ Vec3s* Camera_GetBgCamFuncDataUnderPlayer(Camera* camera, u16* bgCamCount) { Actor_GetWorldPosShapeRot(&playerPosShape, &camera->player->actor); playerPosShape.pos.y += Player_GetHeight(camera->player); - if (BgCheck_EntityRaycastFloor3(&camera->play->colCtx, &floorPoly, &bgId, &playerPosShape.pos) == BGCHECK_Y_MIN) { + if (BgCheck_EntityRaycastDown3(&camera->play->colCtx, &floorPoly, &bgId, &playerPosShape.pos) == BGCHECK_Y_MIN) { // no floor return NULL; } @@ -540,11 +540,11 @@ s32 Camera_GetWaterBoxBgCamIndex(Camera* camera, f32* waterY) { } /** - * Checks if `chkPos` is inside a waterbox. If there is no water box below `chkPos` - * or if `chkPos` is above the water surface, return BGCHECK_Y_MIN, output - * environment properites to `envProp` if `chkPos` is inside the waterbox. + * Checks if `chkPos` is inside a waterbox. + * If there is no water box below `chkPos` or if `chkPos` is above the water surface, return BGCHECK_Y_MIN. + * If `chkPos` is inside the waterbox, output light index to `lightIndex`. */ -f32 Camera_GetWaterSurface(Camera* camera, Vec3f* chkPos, s32* envProp) { +f32 Camera_GetWaterSurface(Camera* camera, Vec3f* chkPos, s32* lightIndex) { PosRot playerPosRot; f32 waterY; WaterBox* waterBox; @@ -563,7 +563,7 @@ f32 Camera_GetWaterSurface(Camera* camera, Vec3f* chkPos, s32* envProp) { return BGCHECK_Y_MIN; } - *envProp = WaterBox_GetLightSettingIndex(&camera->play->colCtx, waterBox); + *lightIndex = WaterBox_GetLightIndex(&camera->play->colCtx, waterBox); return waterY; } @@ -641,62 +641,55 @@ s16 func_80044ADC(Camera* camera, s16 yaw, s16 arg2) { return temp_s0 + temp_s1; } -Vec3f* Camera_CalcUpFromPitchYawRoll(Vec3f* dest, s16 pitch, s16 yaw, s16 roll) { - f32 sinPitch; - f32 cosPitch; - f32 sinYaw; - f32 cosYaw; - f32 sinNegRoll; - f32 cosNegRoll; - Vec3f spA4; +/** + * Calculates a new Up vector from the pitch, yaw, roll + */ +Vec3f* Camera_CalcUpFromPitchYawRoll(Vec3f* viewUp, s16 pitch, s16 yaw, s16 roll) { + f32 sinP = Math_SinS(pitch); + f32 cosP = Math_CosS(pitch); + f32 sinY = Math_SinS(yaw); + f32 cosY = Math_CosS(yaw); + f32 sinR = Math_SinS(-roll); + f32 cosR = Math_CosS(-roll); + Vec3f up; + Vec3f baseUp; + Vec3f u; + Vec3f rollMtxRow1; + Vec3f rollMtxRow2; + Vec3f rollMtxRow3; f32 pad; - f32 sp54; - f32 sp4C; - f32 cosPitchCosYawSinRoll; - f32 negSinPitch; - f32 temp_f10_2; - f32 cosPitchcosYaw; - f32 temp_f14; - f32 negSinPitchSinYaw; - f32 negSinPitchCosYaw; - f32 cosPitchSinYaw; - f32 temp_f4_2; - f32 temp_f6; - f32 temp_f8; - f32 temp_f8_2; - f32 temp_f8_3; - sinPitch = Math_SinS(pitch); - cosPitch = Math_CosS(pitch); - sinYaw = Math_SinS(yaw); - cosYaw = Math_CosS(yaw); - negSinPitch = -sinPitch; - sinNegRoll = Math_SinS(-roll); - cosNegRoll = Math_CosS(-roll); - negSinPitchSinYaw = negSinPitch * sinYaw; - temp_f14 = 1.0f - cosNegRoll; - cosPitchSinYaw = cosPitch * sinYaw; - sp54 = SQ(cosPitchSinYaw); - sp4C = (cosPitchSinYaw * sinPitch) * temp_f14; - cosPitchcosYaw = cosPitch * cosYaw; - temp_f4_2 = ((1.0f - sp54) * cosNegRoll) + sp54; - cosPitchCosYawSinRoll = cosPitchcosYaw * sinNegRoll; - negSinPitchCosYaw = negSinPitch * cosYaw; - temp_f6 = (cosPitchcosYaw * cosPitchSinYaw) * temp_f14; - temp_f10_2 = sinPitch * sinNegRoll; - spA4.x = ((negSinPitchSinYaw * temp_f4_2) + (cosPitch * (sp4C - cosPitchCosYawSinRoll))) + - (negSinPitchCosYaw * (temp_f6 + temp_f10_2)); - sp54 = SQ(sinPitch); - temp_f4_2 = (sinPitch * cosPitchcosYaw) * temp_f14; - temp_f8_3 = cosPitchSinYaw * sinNegRoll; - temp_f8 = sp4C + cosPitchCosYawSinRoll; - spA4.y = ((negSinPitchSinYaw * temp_f8) + (cosPitch * (((1.0f - sp54) * cosNegRoll) + sp54))) + - (negSinPitchCosYaw * (temp_f4_2 - temp_f8_3)); - temp_f8_2 = temp_f6 - temp_f10_2; - spA4.z = ((negSinPitchSinYaw * temp_f8_2) + (cosPitch * (temp_f4_2 + temp_f8_3))) + - (negSinPitchCosYaw * (((1.0f - SQ(cosPitchcosYaw)) * cosNegRoll) + SQ(cosPitchcosYaw))); - *dest = spA4; - return dest; + // Axis to roll around + u.x = cosP * sinY; + u.y = sinP; + u.z = cosP * cosY; + + // Matrix to apply the roll to the Up vector without roll + rollMtxRow1.x = ((1.0f - SQ(u.x)) * cosR) + SQ(u.x); + rollMtxRow1.y = ((u.x * u.y) * (1.0f - cosR)) - (u.z * sinR); + rollMtxRow1.z = ((u.z * u.x) * (1.0f - cosR)) + (u.y * sinR); + + rollMtxRow2.x = ((u.x * u.y) * (1.0f - cosR)) + (u.z * sinR); + rollMtxRow2.y = ((1.0f - SQ(u.y)) * cosR) + SQ(u.y); + rollMtxRow2.z = ((u.y * u.z) * (1.0f - cosR)) - (u.x * sinR); + + rollMtxRow3.x = ((u.z * u.x) * (1.0f - cosR)) - (u.y * sinR); + rollMtxRow3.y = ((u.y * u.z) * (1.0f - cosR)) + (u.x * sinR); + rollMtxRow3.z = ((1.0f - SQ(u.z)) * cosR) + SQ(u.z); + + // Up without roll + baseUp.x = -sinP * sinY; + baseUp.y = cosP; + baseUp.z = -sinP * cosY; + + // rollMtx * baseUp + up.x = DOTXYZ(baseUp, rollMtxRow1); + up.y = DOTXYZ(baseUp, rollMtxRow2); + up.z = DOTXYZ(baseUp, rollMtxRow3); + + *viewUp = up; + + return viewUp; } f32 Camera_ClampLERPScale(Camera* camera, f32 maxLERPScale) { @@ -3654,7 +3647,7 @@ s32 Camera_KeepOn4(Camera* camera) { OLib_Vec3fDiffToVecSphGeo(&spA8, at, eyeNext); D_8015BD50 = playerPosRot->pos; D_8015BD50.y += playerHeight; - temp_f0_2 = BgCheck_CameraRaycastFloor2(&camera->play->colCtx, &spC0, &i, &D_8015BD50); + temp_f0_2 = BgCheck_CameraRaycastDown2(&camera->play->colCtx, &spC0, &i, &D_8015BD50); if (temp_f0_2 > (roData->unk_00 + D_8015BD50.y)) { D_8015BD50.y = temp_f0_2 + 10.0f; } else { @@ -7414,7 +7407,7 @@ Vec3s Camera_Update(Camera* camera) { Vec3f viewEye; Vec3f viewUp; f32 viewFov; - Vec3f spAC; + Vec3f pos; s32 bgId; f32 playerGroundY; f32 playerXZSpeed; @@ -7448,11 +7441,11 @@ Vec3s Camera_Update(Camera* camera) { camera->playerPosDelta.x = curPlayerPosRot.pos.x - camera->playerPosRot.pos.x; camera->playerPosDelta.y = curPlayerPosRot.pos.y - camera->playerPosRot.pos.y; camera->playerPosDelta.z = curPlayerPosRot.pos.z - camera->playerPosRot.pos.z; - spAC = curPlayerPosRot.pos; - spAC.y += Player_GetHeight(camera->player); + pos = curPlayerPosRot.pos; + pos.y += Player_GetHeight(camera->player); - playerGroundY = BgCheck_EntityRaycastFloor5(camera->play, &camera->play->colCtx, &playerFloorPoly, &bgId, - &camera->player->actor, &spAC); + playerGroundY = BgCheck_EntityRaycastDown5(camera->play, &camera->play->colCtx, &playerFloorPoly, &bgId, + &camera->player->actor, &pos); if (playerGroundY != BGCHECK_Y_MIN) { // player is above ground. sOOBTimer = 0; diff --git a/src/code/z_kankyo.c b/src/code/z_kankyo.c index 980353bffe..782009b680 100644 --- a/src/code/z_kankyo.c +++ b/src/code/z_kankyo.c @@ -783,7 +783,7 @@ void Environment_UpdateSkybox(u8 skyboxId, EnvironmentContext* envCtx, SkyboxCon } void Environment_EnableUnderwaterLights(PlayState* play, s32 waterLightsIndex) { - if (waterLightsIndex == 0x1F) { + if (waterLightsIndex == WATERBOX_LIGHT_INDEX_NONE) { waterLightsIndex = 0; // "Underwater color is not set in the water poly data!" osSyncPrintf(VT_COL(YELLOW, BLACK) "\n水ポリゴンデータに水中カラーが設定されておりません!" VT_RST); diff --git a/src/code/z_onepointdemo.c b/src/code/z_onepointdemo.c index 0f61caee18..9750aa21e6 100644 --- a/src/code/z_onepointdemo.c +++ b/src/code/z_onepointdemo.c @@ -39,11 +39,11 @@ s32 OnePointCutscene_BgCheckLineTest(CollisionContext* colCtx, Vec3f* vec1, Vec3 return BgCheck_CameraLineTest1(colCtx, vec1, vec2, &posResult, &outPoly, true, true, true, false, &bgId); } -f32 OnePointCutscene_RaycastFloor(CollisionContext* colCtx, Vec3f* pos) { +f32 OnePointCutscene_RaycastDown(CollisionContext* colCtx, Vec3f* pos) { CollisionPoly* outPoly; s32 bgId; - return BgCheck_EntityRaycastFloor3(colCtx, &outPoly, &bgId, pos); + return BgCheck_EntityRaycastDown3(colCtx, &outPoly, &bgId, pos); } void OnePointCutscene_SetCsCamPoints(Camera* camera, s16 actionParameters, s16 initTimer, CutsceneCameraPoint* atPoints, @@ -292,7 +292,7 @@ s32 OnePointCutscene_SetInfo(PlayState* play, s16 subCamId, s16 csId, Actor* act case 4500: Actor_GetFocus(&spA0, actor); spC0 = spA0.pos; - spC0.y = OnePointCutscene_RaycastFloor(&play->colCtx, &spC0) + 40.0f; + spC0.y = OnePointCutscene_RaycastDown(&play->colCtx, &spC0) + 40.0f; spD0.r = 150.0f; spD0.yaw = spA0.rot.y; spD0.pitch = 0x3E8; diff --git a/src/code/z_play.c b/src/code/z_play.c index 8cf2462672..4b9ef7efd3 100644 --- a/src/code/z_play.c +++ b/src/code/z_play.c @@ -1324,7 +1324,7 @@ s32 Play_InCsMode(PlayState* this) { return (this->csCtx.state != CS_STATE_IDLE) || Player_InCsMode(this); } -f32 func_800BFCB8(PlayState* this, MtxF* mf, Vec3f* vec) { +f32 func_800BFCB8(PlayState* this, MtxF* mf, Vec3f* pos) { CollisionPoly poly; f32 temp1; f32 temp2; @@ -1335,7 +1335,7 @@ f32 func_800BFCB8(PlayState* this, MtxF* mf, Vec3f* vec) { f32 nz; s32 pad[5]; - floorY = BgCheck_AnyRaycastFloor1(&this->colCtx, &poly, vec); + floorY = BgCheck_AnyRaycastDown1(&this->colCtx, &poly, pos); if (floorY > BGCHECK_Y_MIN) { nx = COLPOLY_GET_NORMAL(poly.normal.x); @@ -1364,9 +1364,9 @@ f32 func_800BFCB8(PlayState* this, MtxF* mf, Vec3f* vec) { mf->wy = 0.0f; mf->xz = 0.0f; mf->wz = 0.0f; - mf->xw = vec->x; + mf->xw = pos->x; mf->yw = floorY; - mf->zw = vec->z; + mf->zw = pos->z; mf->ww = 1.0f; } else { mf->xy = 0.0f; @@ -1381,9 +1381,9 @@ f32 func_800BFCB8(PlayState* this, MtxF* mf, Vec3f* vec) { mf->yz = 0.0f; mf->zy = 0.0f; mf->yy = 1.0f; - mf->xw = vec->x; - mf->yw = vec->y; - mf->zw = vec->z; + mf->xw = pos->x; + mf->yw = pos->y; + mf->zw = pos->z; mf->ww = 1.0f; } @@ -1785,7 +1785,7 @@ s32 func_800C0DB4(PlayState* this, Vec3f* pos) { if (WaterBox_GetSurface1(this, &this->colCtx, waterSurfacePos.x, waterSurfacePos.z, &waterSurfacePos.y, &waterBox) == true && pos->y < waterSurfacePos.y && - BgCheck_EntityRaycastFloor3(&this->colCtx, &poly, &bgId, &waterSurfacePos) != BGCHECK_Y_MIN) { + BgCheck_EntityRaycastDown3(&this->colCtx, &poly, &bgId, &waterSurfacePos) != BGCHECK_Y_MIN) { return true; } else { return false; diff --git a/src/code/z_player_lib.c b/src/code/z_player_lib.c index 3933bac42c..dfafe0a72f 100644 --- a/src/code/z_player_lib.c +++ b/src/code/z_player_lib.c @@ -997,7 +997,7 @@ void func_8008F87C(PlayState* play, Player* this, SkelAnime* skelAnime, Vec3f* p footprintPos.y += 15.0f; - sp80 = BgCheck_EntityRaycastFloor4(&play->colCtx, &sp88, &sp84, &this->actor, &footprintPos) + sp74; + sp80 = BgCheck_EntityRaycastDown4(&play->colCtx, &sp88, &sp84, &this->actor, &footprintPos) + sp74; if (sp98.y < sp80) { sp70 = sp98.x - spA4.x; diff --git a/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c b/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c index b8ad536922..310fb6b7f1 100644 --- a/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c +++ b/src/overlays/actors/ovl_Bg_Haka_Trap/z_bg_haka_trap.c @@ -349,10 +349,9 @@ void func_808805C0(BgHakaTrap* this, PlayState* play) { void func_808806BC(BgHakaTrap* this, PlayState* play) { Vec3f vector; - f32 tempf20; - f32 temp; + f32 floorHeight; + f32 yIntersect; s32 i; - s32 sp64; this->dyna.actor.velocity.y *= 1.6f; @@ -364,20 +363,22 @@ void func_808806BC(BgHakaTrap* this, PlayState* play) { vector.y = (this->dyna.actor.world.pos.y + 1.0f) + 25.0f; vector.z = this->dyna.actor.world.pos.z; - tempf20 = this->dyna.actor.floorHeight; + floorHeight = this->dyna.actor.floorHeight; for (i = 0; i < 3; i++) { - temp = - BgCheck_EntityRaycastFloor4(&play->colCtx, &this->dyna.actor.floorPoly, &sp64, &this->dyna.actor, &vector) - + s32 bgId; + + yIntersect = + BgCheck_EntityRaycastDown4(&play->colCtx, &this->dyna.actor.floorPoly, &bgId, &this->dyna.actor, &vector) - 25.0f; - if (tempf20 < temp) { - tempf20 = temp; + if (floorHeight < yIntersect) { + floorHeight = yIntersect; } vector.x -= 90.0f; } - if (Math_StepToF(&this->dyna.actor.world.pos.y, tempf20, this->dyna.actor.velocity.y)) { + if (Math_StepToF(&this->dyna.actor.world.pos.y, floorHeight, this->dyna.actor.velocity.y)) { if (this->dyna.actor.velocity.y > 0.01f) { Audio_PlayActorSfx2(&this->dyna.actor, NA_SE_EV_TRAP_BOUND); } diff --git a/src/overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.c b/src/overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.c index 4f9abc8ace..50c358532f 100644 --- a/src/overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.c +++ b/src/overlays/actors/ovl_Bg_Heavy_Block/z_bg_heavy_block.c @@ -378,18 +378,18 @@ void BgHeavyBlock_LiftedUp(BgHeavyBlock* this, PlayState* play) { void BgHeavyBlock_Fly(BgHeavyBlock* this, PlayState* play) { s32 bgId; s32 quakeIndex; - Vec3f pos; - f32 raycastResult; + Vec3f checkPos; + f32 yIntersect; Actor_MoveForward(&this->dyna.actor); - pos.x = this->dyna.actor.home.pos.x; - pos.y = this->dyna.actor.home.pos.y + 1000.0f; - pos.z = this->dyna.actor.home.pos.z; - raycastResult = - BgCheck_EntityRaycastFloor4(&play->colCtx, &this->dyna.actor.floorPoly, &bgId, &this->dyna.actor, &pos); - this->dyna.actor.floorHeight = raycastResult; + checkPos.x = this->dyna.actor.home.pos.x; + checkPos.y = this->dyna.actor.home.pos.y + 1000.0f; + checkPos.z = this->dyna.actor.home.pos.z; + yIntersect = + BgCheck_EntityRaycastDown4(&play->colCtx, &this->dyna.actor.floorPoly, &bgId, &this->dyna.actor, &checkPos); + this->dyna.actor.floorHeight = yIntersect; - if (this->dyna.actor.home.pos.y <= raycastResult) { + if (this->dyna.actor.home.pos.y <= yIntersect) { func_800AA000(0.0f, 0xFF, 0x3C, 4); switch (this->dyna.actor.params & 0xFF) { diff --git a/src/overlays/actors/ovl_Bg_Jya_Goroiwa/z_bg_jya_goroiwa.c b/src/overlays/actors/ovl_Bg_Jya_Goroiwa/z_bg_jya_goroiwa.c index 8ba8bc84d1..7db6322ed4 100644 --- a/src/overlays/actors/ovl_Bg_Jya_Goroiwa/z_bg_jya_goroiwa.c +++ b/src/overlays/actors/ovl_Bg_Jya_Goroiwa/z_bg_jya_goroiwa.c @@ -198,16 +198,16 @@ void BgJyaGoroiwa_Update(Actor* thisx, PlayState* play) { BgJyaGoroiwa* this = (BgJyaGoroiwa*)thisx; Player* player = GET_PLAYER(play); s32 bgId; - Vec3f pos; + Vec3f checkPos; if (!(player->stateFlags1 & (PLAYER_STATE1_6 | PLAYER_STATE1_7 | PLAYER_STATE1_28 | PLAYER_STATE1_29))) { this->actionFunc(this, play); BgJyaGoroiwa_UpdateRotation(this); - pos.x = this->actor.world.pos.x; - pos.y = this->actor.world.pos.y + 59.5f; - pos.z = this->actor.world.pos.z; + checkPos.x = this->actor.world.pos.x; + checkPos.y = this->actor.world.pos.y + 59.5f; + checkPos.z = this->actor.world.pos.z; this->actor.floorHeight = - BgCheck_EntityRaycastFloor4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &pos); + BgCheck_EntityRaycastDown4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &checkPos); BgJyaGoroiwa_UpdateCollider(this); if (this->collider.base.atFlags & AT_ON) { CollisionCheck_SetAT(play, &play->colChkCtx, &this->collider.base); diff --git a/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c b/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c index 5fa503c0c0..621903b8c7 100644 --- a/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c +++ b/src/overlays/actors/ovl_Bg_Po_Event/z_bg_po_event.c @@ -182,8 +182,8 @@ void BgPoEvent_InitBlocks(BgPoEvent* this, PlayState* play) { } } this->dyna.actor.world.pos.y = 833.0f; - this->dyna.actor.floorHeight = BgCheck_EntityRaycastFloor4(&play->colCtx, &this->dyna.actor.floorPoly, &bgId, - &this->dyna.actor, &this->dyna.actor.world.pos); + this->dyna.actor.floorHeight = BgCheck_EntityRaycastDown4(&play->colCtx, &this->dyna.actor.floorPoly, &bgId, + &this->dyna.actor, &this->dyna.actor.world.pos); this->actionFunc = BgPoEvent_BlockWait; } diff --git a/src/overlays/actors/ovl_Bg_Spot15_Rrbox/z_bg_spot15_rrbox.c b/src/overlays/actors/ovl_Bg_Spot15_Rrbox/z_bg_spot15_rrbox.c index fe8f81721f..3ecb301cf6 100644 --- a/src/overlays/actors/ovl_Bg_Spot15_Rrbox/z_bg_spot15_rrbox.c +++ b/src/overlays/actors/ovl_Bg_Spot15_Rrbox/z_bg_spot15_rrbox.c @@ -49,7 +49,8 @@ static Vec3f D_808B45C4[] = { { 770.0f, 1550.0f, -299.0f }, }; -static Vec3f D_808B45DC[] = { +// list of ground check positions, relative to 1/10th model space +static Vec3f sBoxGroundCheckPoints[] = { { 29.99f, 0.01f, -29.99f }, { -29.99f, 0.01f, -29.99f }, { -29.99f, 0.01f, 29.99f }, { 29.99f, 0.01f, 29.99f }, { 0.0f, 0.01f, 0.0f }, }; @@ -70,10 +71,10 @@ void func_808B3960(BgSpot15Rrbox* this, PlayState* play, CollisionHeader* collis } } -void func_808B39E8(Vec3f* arg0, Vec3f* arg1, f32 arg2, f32 arg3) { - arg0->x = (arg1->z * arg2) + (arg1->x * arg3); - arg0->y = arg1->y; - arg0->z = (arg1->z * arg3) - (arg1->x * arg2); +void BgSpot15Rrbox_RotatePoint(Vec3f* outPos, Vec3f* pos, f32 arg2, f32 arg3) { + outPos->x = (pos->z * arg2) + (pos->x * arg3); + outPos->y = pos->y; + outPos->z = (pos->z * arg3) - (pos->x * arg2); } void func_808B3A34(BgSpot15Rrbox* this) { @@ -140,25 +141,25 @@ void BgSpot15Rrbox_Destroy(Actor* thisx, PlayState* play) { D_808B4590 = 0; } -s32 func_808B3CA0(BgSpot15Rrbox* this, PlayState* play, s32 arg2) { +s32 BgSpot15Rrbox_TrySnapToCheckedPoint(BgSpot15Rrbox* this, PlayState* play, s32 checkIndex) { f32 chkDist = 0.0f; - Vec3f actorPosition; - Vec3f actorScale; + Vec3f checkPos; + Vec3f relCheckPos; func_808B3A34(this); - actorScale.x = D_808B45DC[arg2].x * (this->dyna.actor.scale.x * 10.0f); - actorScale.y = D_808B45DC[arg2].y * (this->dyna.actor.scale.y * 10.0f); - actorScale.z = D_808B45DC[arg2].z * (this->dyna.actor.scale.z * 10.0f); + relCheckPos.x = sBoxGroundCheckPoints[checkIndex].x * (this->dyna.actor.scale.x * 10.0f); + relCheckPos.y = sBoxGroundCheckPoints[checkIndex].y * (this->dyna.actor.scale.y * 10.0f); + relCheckPos.z = sBoxGroundCheckPoints[checkIndex].z * (this->dyna.actor.scale.z * 10.0f); - func_808B39E8(&actorPosition, &actorScale, this->unk_16C, this->unk_170); + BgSpot15Rrbox_RotatePoint(&checkPos, &relCheckPos, this->unk_16C, this->unk_170); - actorPosition.x += this->dyna.actor.world.pos.x; - actorPosition.y += this->dyna.actor.prevPos.y; - actorPosition.z += this->dyna.actor.world.pos.z; + checkPos.x += this->dyna.actor.world.pos.x; + checkPos.y += this->dyna.actor.prevPos.y; + checkPos.z += this->dyna.actor.world.pos.z; - this->dyna.actor.floorHeight = BgCheck_EntityRaycastFloor6(&play->colCtx, &this->dyna.actor.floorPoly, &this->bgId, - &this->dyna.actor, &actorPosition, chkDist); + this->dyna.actor.floorHeight = BgCheck_EntityRaycastDown6(&play->colCtx, &this->dyna.actor.floorPoly, &this->bgId, + &this->dyna.actor, &checkPos, chkDist); if ((this->dyna.actor.floorHeight - this->dyna.actor.world.pos.y) >= -0.001f) { this->dyna.actor.world.pos.y = this->dyna.actor.floorHeight; @@ -167,51 +168,51 @@ s32 func_808B3CA0(BgSpot15Rrbox* this, PlayState* play, s32 arg2) { return false; } -f32 func_808B3DDC(BgSpot15Rrbox* this, PlayState* play) { +f32 BgSpot15Rrbox_GetFloorHeight(BgSpot15Rrbox* this, PlayState* play) { s32 i; - Vec3f position; - Vec3f scale; + Vec3f checkPos; + Vec3f relCheckPos; Actor* actor = &this->dyna.actor; f32 yIntersect; - f32 returnValue = BGCHECK_Y_MIN; + f32 floorY = BGCHECK_Y_MIN; s32 bgId; func_808B3A34(this); - for (i = 0; i < ARRAY_COUNT(D_808B45DC); i++) { - scale.x = D_808B45DC[i].x * (actor->scale.x * 10.0f); - scale.y = D_808B45DC[i].y * (actor->scale.y * 10.0f); - scale.z = D_808B45DC[i].z * (actor->scale.z * 10.0f); + for (i = 0; i < ARRAY_COUNT(sBoxGroundCheckPoints); i++) { + relCheckPos.x = sBoxGroundCheckPoints[i].x * (actor->scale.x * 10.0f); + relCheckPos.y = sBoxGroundCheckPoints[i].y * (actor->scale.y * 10.0f); + relCheckPos.z = sBoxGroundCheckPoints[i].z * (actor->scale.z * 10.0f); - func_808B39E8(&position, &scale, this->unk_16C, this->unk_170); + BgSpot15Rrbox_RotatePoint(&checkPos, &relCheckPos, this->unk_16C, this->unk_170); - position.x += actor->world.pos.x; - position.y += actor->prevPos.y; - position.z += actor->world.pos.z; + checkPos.x += actor->world.pos.x; + checkPos.y += actor->prevPos.y; + checkPos.z += actor->world.pos.z; - yIntersect = BgCheck_EntityRaycastFloor6(&play->colCtx, &actor->floorPoly, &bgId, actor, &position, 0); + yIntersect = BgCheck_EntityRaycastDown6(&play->colCtx, &actor->floorPoly, &bgId, actor, &checkPos, 0); - if (returnValue < yIntersect) { - returnValue = yIntersect; + if (floorY < yIntersect) { + floorY = yIntersect; this->bgId = bgId; } } - return returnValue; + return floorY; } -s32 func_808B3F58(BgSpot15Rrbox* this, PlayState* play) { - if (func_808B3CA0(this, play, 0)) { +s32 BgSpot15Rrbox_TrySnapToFloor(BgSpot15Rrbox* this, PlayState* play) { + if (BgSpot15Rrbox_TrySnapToCheckedPoint(this, play, 0)) { return true; } - if (func_808B3CA0(this, play, 1)) { + if (BgSpot15Rrbox_TrySnapToCheckedPoint(this, play, 1)) { return true; } - if (func_808B3CA0(this, play, 2)) { + if (BgSpot15Rrbox_TrySnapToCheckedPoint(this, play, 2)) { return true; } - if (func_808B3CA0(this, play, 3)) { + if (BgSpot15Rrbox_TrySnapToCheckedPoint(this, play, 3)) { return true; } - if (func_808B3CA0(this, play, 4)) { + if (BgSpot15Rrbox_TrySnapToCheckedPoint(this, play, 4)) { return true; } return false; @@ -271,7 +272,7 @@ void func_808B4194(BgSpot15Rrbox* this, PlayState* play) { actor->world.pos.x = actor->home.pos.x + (tempUnk178 * this->unk_16C); actor->world.pos.z = actor->home.pos.z + (tempUnk178 * this->unk_170); - if (!func_808B3F58(this, play)) { + if (!BgSpot15Rrbox_TrySnapToFloor(this, play)) { actor->home.pos.x = actor->world.pos.x; actor->home.pos.z = actor->world.pos.z; player->stateFlags2 &= ~PLAYER_STATE2_4; @@ -304,7 +305,7 @@ void func_808B4380(BgSpot15Rrbox* this, PlayState* play) { this->dyna.actor.velocity.y = 0.0f; this->dyna.actor.velocity.z = 0.0f; this->dyna.actor.gravity = -1.0f; - this->dyna.actor.floorHeight = func_808B3DDC(this, play); + this->dyna.actor.floorHeight = BgSpot15Rrbox_GetFloorHeight(this, play); this->actionFunc = func_808B43D0; } diff --git a/src/overlays/actors/ovl_Bg_Spot18_Basket/z_bg_spot18_basket.c b/src/overlays/actors/ovl_Bg_Spot18_Basket/z_bg_spot18_basket.c index ad0595cf5f..56ff910426 100644 --- a/src/overlays/actors/ovl_Bg_Spot18_Basket/z_bg_spot18_basket.c +++ b/src/overlays/actors/ovl_Bg_Spot18_Basket/z_bg_spot18_basket.c @@ -431,8 +431,8 @@ void BgSpot18Basket_Update(Actor* thisx, PlayState* play) { this->unk_216++; this->actionFunc(this, play); - this->dyna.actor.floorHeight = BgCheck_EntityRaycastFloor4(&play->colCtx, &this->dyna.actor.floorPoly, &bgId, - &this->dyna.actor, &this->dyna.actor.world.pos); + this->dyna.actor.floorHeight = BgCheck_EntityRaycastDown4(&play->colCtx, &this->dyna.actor.floorPoly, &bgId, + &this->dyna.actor, &this->dyna.actor.world.pos); if (this->actionFunc != func_808B7AFC) { CollisionCheck_SetOC(play, &play->colChkCtx, &this->colliderJntSph.base); if (this->actionFunc != func_808B7B6C) { diff --git a/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c b/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c index 141f111357..79d09fe1cf 100644 --- a/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c +++ b/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.c @@ -355,7 +355,7 @@ void BossGanon_Init(Actor* thisx, PlayState* play2) { Actor_ProcessInitChain(thisx, sInitChain); ActorShape_Init(&thisx->shape, 0, NULL, 0); Actor_SetScale(thisx, 0.01f); - SkelAnime_InitFlex(play, &this->skelAnime, &gDorfSkel, NULL, NULL, NULL, 0); + SkelAnime_InitFlex(play, &this->skelAnime, &gGanondorfSkel, NULL, NULL, NULL, 0); Collider_InitCylinder(play, &this->collider); Collider_SetCylinder(play, &this->collider, thisx, &sDorfCylinderInit); @@ -485,7 +485,7 @@ void BossGanon_SetupIntroCutscene(BossGanon* this, PlayState* play) { this->unk_198 = 1; this->animBankIndex = animBankIndex; gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[animBankIndex].segment); - Animation_MorphToLoop(&this->skelAnime, &object_ganon_anime2_Anim_005FFC, 0.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfPlayOrganAnim, 0.0f); } else { this->actionFunc = BossGanon_SetupIntroCutscene; } @@ -569,7 +569,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { this->csTimer = 0; player->actor.world.pos.z = 20.0f; this->useOpenHand = false; - Animation_MorphToLoop(&this->skelAnime, &object_ganon_anime2_Anim_0089F8, -5.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfStandBackwardsAnim, -5.0f); this->fwork[GDF_FWORK_1] = 1000.0f; BossGanon_SetIntroCsCamera(this, 11); this->unk_198 = 2; @@ -808,12 +808,12 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { if (this->csTimer == 30) { Audio_QueueSeqCmd(0x100100FF); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&object_ganon_anime2_Anim_004F64); - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime2_Anim_004F64, -5.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfStopPlayingOrganAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfStopPlayingOrganAnim, -5.0f); } if ((this->csTimer > 30) && Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon_anime2_Anim_006AF4, 0.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfLeanOnOrganAnim, 0.0f); this->fwork[GDF_FWORK_1] = 1000.0f; } @@ -853,12 +853,12 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { if (this->csTimer <= 20) { if (this->csTimer == 20) { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime2_Anim_004304, -5.0f); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&object_ganon_anime2_Anim_004304); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfStandUpFromOrganAnim, -5.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfStandUpFromOrganAnim); } } else if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { Message_StartTextbox(play, 0x70CA, NULL); - Animation_MorphToLoop(&this->skelAnime, &object_ganon_anime2_Anim_0089F8, -5.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfStandBackwardsAnim, -5.0f); this->fwork[GDF_FWORK_1] = 1000.0f; } @@ -872,8 +872,8 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { this->envLightMode = 3; if (this->csTimer == 20) { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime2_Anim_001F58, -5.0f); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&object_ganon_anime2_Anim_001F58); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfTurnAroundAnim, -5.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfTurnAroundAnim); } if (this->csTimer > 10) { @@ -906,7 +906,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { this->csCamEye.z += 6.0f; if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1] - 5.0f)) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon_anime2_Anim_003018, -5.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfStandIdleAnim, -5.0f); this->fwork[GDF_FWORK_1] = 1000.0f; } @@ -917,7 +917,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { this->csState = 19; this->csTimer = 0; Message_StartTextbox(play, 0x70CC, NULL); - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime2_Anim_007268, -5.0f); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfRaiseHandStartAnim, -5.0f); this->triforceType = GDF_TRIFORCE_DORF; this->fwork[GDF_TRIFORCE_SCALE] = 10.0f; this->fwork[GDF_TRIFORCE_PRIM_A] = 0.0f; @@ -953,7 +953,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { } if (this->csTimer == 17) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon_anime2_Anim_007A64, -5.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfRaiseHandLoopAnim, -5.0f); } if ((this->csTimer > 80) && (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE)) { @@ -1068,7 +1068,7 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { if (this->csTimer == 20) { BossGanon_SetAnimationObject(this, play, OBJECT_GANON_ANIME1); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfGetUp3Anim, 0.0f); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfGetUp3Anim, 0.0f); SkelAnime_Update(&this->skelAnime); this->actor.shape.yOffset = 0.0f; sCape->attachShouldersTimer = 18.0f; @@ -1082,8 +1082,8 @@ void BossGanon_IntroCutscene(BossGanon* this, PlayState* play) { play->objectCtx.status[Object_GetIndex(&play->objectCtx, OBJECT_GANON)].segment); if (!GET_EVENTCHKINF(EVENTCHKINF_78)) { - TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gDorfTitleCardTex), 160, - 180, 128, 40); + TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gGanondorfTitleCardTex), + 160, 180, 128, 40); } SET_EVENTCHKINF(EVENTCHKINF_78); @@ -1170,8 +1170,8 @@ void BossGanon_SetupDeathCutscene(BossGanon* this, PlayState* play) { this->unk_198 = 1; this->animBankIndex = animBankIndex; gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[animBankIndex].segment); - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime2_Anim_00EA00, 0.0f); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&object_ganon_anime2_Anim_00EA00); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfDefeatedStartAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfDefeatedStartAnim); this->unk_508 = 0.0f; } } @@ -1183,8 +1183,8 @@ void BossGanon_SetupTowerCutscene(BossGanon* this, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, animBankIndex)) { this->animBankIndex = animBankIndex; gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[animBankIndex].segment); - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime2_Anim_00EA00, 0.0f); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&object_ganon_anime2_Anim_00EA00); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfDefeatedStartAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfDefeatedStartAnim); this->actionFunc = BossGanon_DeathAndTowerCutscene; this->csTimer = 0; this->csState = 100; @@ -1203,7 +1203,8 @@ void BossGanon_ShatterWindows(u8 windowShatterState) { for (i = 0; i < 2048; i++) { if ((tex1[i] != 0) && (Rand_ZeroOne() < 0.03f)) { - if ((((u8*)gDorfWindowShatterTemplateTex)[i] == 0) || (windowShatterState == GDF_WINDOW_SHATTER_FULL)) { + if ((((u8*)gGanondorfWindowShatterTemplateTex)[i] == 0) || + (windowShatterState == GDF_WINDOW_SHATTER_FULL)) { tex1[i] = tex2[i] = 1; } } @@ -1274,7 +1275,7 @@ void BossGanon_DeathAndTowerCutscene(BossGanon* this, PlayState* play) { this->csCamAt.z = this->unk_1FC.z; if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon_anime2_Anim_00F19C, 0.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfDefeatedLoopAnim, 0.0f); this->csState = 2; this->csTimer = 0; } @@ -1320,8 +1321,8 @@ void BossGanon_DeathAndTowerCutscene(BossGanon* this, PlayState* play) { if ((this->fwork[GDF_FWORK_1] > 100.0f) && (this->csTimer > 100) && (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE)) { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime2_Anim_00B668, 0.0f); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&object_ganon_anime2_Anim_00B668); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfVomitStartAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfVomitStartAnim); Audio_PlayActorSfx2(&this->actor, NA_SE_EN_GANON_TOKETU); } else { if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1] - 16.0f)) { @@ -1344,7 +1345,7 @@ void BossGanon_DeathAndTowerCutscene(BossGanon* this, PlayState* play) { } if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon_anime2_Anim_00BE38, 0.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfVomitLoopAnim, 0.0f); this->csState = 4; this->csTimer = 0; } @@ -1367,8 +1368,8 @@ void BossGanon_DeathAndTowerCutscene(BossGanon* this, PlayState* play) { if ((this->csTimer > 70) && (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE)) { this->csState = 6; this->csTimer = 0; - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime2_Anim_010298, 0.0f); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&object_ganon_anime2_Anim_010298); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfYellStartAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfYellStartAnim); this->csCamMovementScale = 0.05f; this->csCamMaxStepScale = 0.0f; @@ -1399,7 +1400,7 @@ void BossGanon_DeathAndTowerCutscene(BossGanon* this, PlayState* play) { Math_ApproachF(&this->csCamMaxStepScale, 0.2f, 1.0f, 0.01f); if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon_anime2_Anim_010514, 0.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfYellLoopAnim, 0.0f); this->csState = 7; this->csTimer = 0; this->unk_2E8 = 0; @@ -1507,8 +1508,8 @@ void BossGanon_DeathAndTowerCutscene(BossGanon* this, PlayState* play) { this->csCamIndex = Play_CreateSubCamera(play); Play_ChangeCameraStatus(play, CAM_ID_MAIN, CAM_STAT_WAIT); Play_ChangeCameraStatus(play, this->csCamIndex, CAM_STAT_ACTIVE); - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime2_Anim_00ADDC, 0.0f); - this->fwork[1] = Animation_GetLastFrame(&object_ganon_anime2_Anim_00EA00); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfCollapseAnim, 0.0f); + this->fwork[1] = Animation_GetLastFrame(&gGanondorfDefeatedStartAnim); this->csState = 101; this->skelAnime.playSpeed = 0.0f; sZelda = (EnZl3*)Actor_SpawnAsChild(&play->actorCtx, &this->actor, play, ACTOR_EN_ZL3, 0.0f, 6000.0f, 0.0f, @@ -1875,8 +1876,8 @@ void BossGanon_PoundFloor(BossGanon* this, PlayState* play) { Math_ApproachF(&this->actor.velocity.y, 20.0f, 1.0f, 1.0f); if (this->timers[0] == 14) { - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfPoundAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfPoundAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfPoundAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfPoundAnim, 0.0f); this->actor.velocity.y = 0.0f; } @@ -1918,8 +1919,8 @@ void BossGanon_PoundFloor(BossGanon* this, PlayState* play) { this->envLightMode = 1; if (this->timers[0] == 0) { - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfPoundEndAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfPoundEndAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfPoundEndAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfPoundEndAnim, 0.0f); this->unk_1C2 = 3; this->unk_19F = 1; this->actor.velocity.y = 0.0f; @@ -1931,8 +1932,8 @@ void BossGanon_PoundFloor(BossGanon* this, PlayState* play) { Math_ApproachF(&this->actor.velocity.y, 20.0f, 1.0f, 1.0f); if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfGetUp3Anim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfGetUp3Anim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfGetUp3Anim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfGetUp3Anim, 0.0f); SkelAnime_Update(&this->skelAnime); sCape->attachShouldersTimer = 18.0f; Audio_PlayActorSfx2(&this->actor, NA_SE_EV_GANON_MANTLE); @@ -2001,16 +2002,16 @@ void BossGanon_ChargeBigMagic(BossGanon* this, PlayState* play) { switch (this->unk_1C2) { case 0: if (this->timers[0] == 0) { - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfBigMagicChargeStartAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfBigMagicChargeStartAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfBigMagicChargeStartAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfBigMagicChargeStartAnim, 0.0f); this->unk_1C2 = 1; } break; case 1: if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfBigMagicChargeHoldAnim); - Animation_MorphToLoop(&this->skelAnime, &gDorfBigMagicChargeHoldAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfBigMagicChargeHoldAnim); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfBigMagicChargeHoldAnim, 0.0f); this->unk_1C2 = 2; this->timers[0] = 100; } @@ -2032,8 +2033,8 @@ void BossGanon_ChargeBigMagic(BossGanon* this, PlayState* play) { } if (this->timers[0] == 0) { - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfBigMagicWindupAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfBigMagicWindupAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfBigMagicWindupAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfBigMagicWindupAnim, 0.0f); this->unk_1C2 = 3; this->timers[0] = 6; this->timers[1] = 15; @@ -2132,8 +2133,8 @@ void BossGanon_ChargeBigMagic(BossGanon* this, PlayState* play) { } if (this->timers[1] == 0) { - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfBigMagicThrowAnim); - Animation_MorphToLoop(&this->skelAnime, &gDorfBigMagicThrowAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfBigMagicThrowAnim); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfBigMagicThrowAnim, 0.0f); this->unk_1C2 = 4; this->unk_288 = 0.0f; this->unk_290 = 0.0f; @@ -2161,8 +2162,8 @@ void BossGanon_ChargeBigMagic(BossGanon* this, PlayState* play) { } if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfBigMagicThrowEndAnim); - Animation_MorphToLoop(&this->skelAnime, &gDorfBigMagicThrowEndAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfBigMagicThrowEndAnim); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfBigMagicThrowEndAnim, 0.0f); this->unk_1C2 = 5; } break; @@ -2179,7 +2180,7 @@ void BossGanon_ChargeBigMagic(BossGanon* this, PlayState* play) { void BossGanon_SetupWait(BossGanon* this, PlayState* play) { BossGanon_SetAnimationObject(this, play, OBJECT_GANON_ANIME1); - Animation_MorphToLoop(&this->skelAnime, &gDorfFloatAnim, -10.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfFloatAnim, -10.0f); this->actionFunc = BossGanon_Wait; this->fwork[GDF_FWORK_0] = 0.0f; this->timers[0] = (s16)Rand_ZeroFloat(64.0f) + 30; @@ -2244,8 +2245,8 @@ void BossGanon_Wait(BossGanon* this, PlayState* play) { void BossGanon_SetupChargeLightBall(BossGanon* this, PlayState* play) { BossGanon_SetAnimationObject(this, play, OBJECT_GANON_ANIME1); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfChargeLightBallAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfChargeLightBallAnim, -3.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfChargeLightBallAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfChargeLightBallAnim, -3.0f); this->actionFunc = BossGanon_ChargeLightBall; this->timers[0] = 25; } @@ -2291,13 +2292,13 @@ void BossGanon_ChargeLightBall(BossGanon* this, PlayState* play) { void BossGanon_SetupPlayTennis(BossGanon* this, PlayState* play) { BossGanon_SetAnimationObject(this, play, OBJECT_GANON_ANIME1); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfThrowAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfThrowAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfThrowAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfThrowAnim, 0.0f); this->actionFunc = BossGanon_PlayTennis; } void BossGanon_PlayTennis(BossGanon* this, PlayState* play) { - static AnimationHeader* volleyAnims[] = { &gDorfVolleyLeftAnim, &gDorfVolleyRightAnim }; + static AnimationHeader* volleyAnims[] = { &gGanondorfVolleyLeftAnim, &gGanondorfVolleyRightAnim }; static s16 capeRightArmDurations[] = { 26, 20 }; s16 rand; @@ -2310,7 +2311,7 @@ void BossGanon_PlayTennis(BossGanon* this, PlayState* play) { if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { this->unk_1C2 = 1; - Animation_MorphToLoop(&this->skelAnime, &gDorfFloatAnim, 0.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfFloatAnim, 0.0f); } if (this->skelAnime.curFrame <= 12.0f) { @@ -2359,8 +2360,8 @@ void BossGanon_PlayTennis(BossGanon* this, PlayState* play) { void BossGanon_SetupBlock(BossGanon* this, PlayState* play) { if ((this->actionFunc != BossGanon_Block) || (this->unk_1C2 != 0)) { BossGanon_SetAnimationObject(this, play, OBJECT_GANON_ANIME1); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfBlockAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfBlockAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfBlockAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfBlockAnim, 0.0f); this->actionFunc = BossGanon_Block; } @@ -2381,8 +2382,8 @@ void BossGanon_Block(BossGanon* this, PlayState* play) { if (this->unk_1C2 == 0) { if (this->timers[0] == 0) { this->unk_1C2 = 1; - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfBlockReleaseAnim, 0.0f); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfBlockReleaseAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfBlockReleaseAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfBlockReleaseAnim); SkelAnime_Update(&this->skelAnime); sCape->attachShouldersTimer = 15.0f; Audio_PlayActorSfx2(&this->actor, NA_SE_EV_GANON_MANTLE); @@ -2408,8 +2409,8 @@ void BossGanon_SetupHitByLightBall(BossGanon* this, PlayState* play) { s16 i; BossGanon_SetAnimationObject(this, play, OBJECT_GANON_ANIME1); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfBigMagicHitAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfBigMagicHitAnim, 0); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfBigMagicHitAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfBigMagicHitAnim, 0); this->timers[0] = 70; sCape->attachRightArmTimer = sCape->attachLeftArmTimer = 0; @@ -2436,16 +2437,16 @@ void BossGanon_HitByLightBall(BossGanon* this, PlayState* play) { BossGanonEff_SpawnShock(play, 1500.0f, GDF_SHOCK_DORF_YELLOW); if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfLightArrowWaitAnim); - Animation_MorphToLoop(&this->skelAnime, &gDorfLightArrowWaitAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfLightArrowWaitAnim); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfLightArrowWaitAnim, 0.0f); this->unk_1C2 = 1; } } else if (this->unk_1C2 == 1) { BossGanonEff_SpawnShock(play, 1000.0f, GDF_SHOCK_DORF_YELLOW); if (this->timers[0] == 0) { - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfGetUp3Anim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfGetUp3Anim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfGetUp3Anim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfGetUp3Anim, 0.0f); this->unk_1C2 = 2; SkelAnime_Update(&this->skelAnime); sCape->attachShouldersTimer = 18.0f; @@ -2480,8 +2481,8 @@ void BossGanon_SetupVulnerable(BossGanon* this, PlayState* play) { if (this->actionFunc != BossGanon_Vulnerable) { BossGanon_SetAnimationObject(this, play, OBJECT_GANON_ANIME1); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfLightArrowHitAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfLightArrowHitAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfLightArrowHitAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfLightArrowHitAnim, 0.0f); sCape->attachRightArmTimer = sCape->attachLeftArmTimer = 0; this->actionFunc = BossGanon_Vulnerable; @@ -2539,16 +2540,16 @@ void BossGanon_Vulnerable(BossGanon* this, PlayState* play) { case 0: if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { this->unk_1C2 = 1; - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfLightEnergyHitAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfLightEnergyHitAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfLightEnergyHitAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfLightEnergyHitAnim, 0.0f); } break; case 1: if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { this->unk_1C2 = 2; - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfKneelVulnerableAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfKneelVulnerableAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfDownedAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfDownedAnim, 0.0f); } break; @@ -2560,8 +2561,8 @@ void BossGanon_Vulnerable(BossGanon* this, PlayState* play) { this->actor.world.pos.y = 40.0f; this->actor.velocity.y = 0.0f; this->unk_1C2 = 3; - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfLandAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfLandAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfLandAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfLandAnim, 0.0f); this->timers[0] = 70; this->actor.flags |= ACTOR_FLAG_10; } @@ -2574,8 +2575,8 @@ void BossGanon_Vulnerable(BossGanon* this, PlayState* play) { if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { this->unk_1C2 = 4; - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfVulnerableAnim); - Animation_MorphToLoop(&this->skelAnime, &gDorfVulnerableAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfVulnerableAnim); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfVulnerableAnim, 0.0f); } break; @@ -2586,8 +2587,8 @@ void BossGanon_Vulnerable(BossGanon* this, PlayState* play) { if (this->timers[0] == 0) { this->unk_1C2 = 5; - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfGetUp1Anim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfGetUp1Anim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfGetUp1Anim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfGetUp1Anim, 0.0f); this->unk_2D4 = 80; for (i = 1; i < 15; i++) { @@ -2605,8 +2606,8 @@ void BossGanon_Vulnerable(BossGanon* this, PlayState* play) { if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { this->unk_1C2 = 6; - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfGetUp2Anim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfGetUp2Anim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfGetUp2Anim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfGetUp2Anim, 0.0f); sCape->minDist = 20.0f; this->unk_19F = 1; } @@ -2624,8 +2625,8 @@ void BossGanon_Vulnerable(BossGanon* this, PlayState* play) { case 7: this->envLightMode = 0; Math_ApproachF(&this->actor.world.pos.y, 150.0f, 0.05f, 30.0f); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfGetUp3Anim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfGetUp3Anim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfGetUp3Anim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfGetUp3Anim, 0.0f); this->unk_1C2 = 8; SkelAnime_Update(&this->skelAnime); sCape->attachShouldersTimer = 18.0f; @@ -2658,8 +2659,8 @@ void BossGanon_Vulnerable(BossGanon* this, PlayState* play) { void BossGanon_SetupDamaged(BossGanon* this, PlayState* play) { BossGanon_SetAnimationObject(this, play, OBJECT_GANON_ANIME1); - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfDamageAnim); - Animation_MorphToPlayOnce(&this->skelAnime, &gDorfDamageAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfDamageAnim); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfDamageAnim, 0.0f); this->actionFunc = BossGanon_Damaged; } @@ -2676,8 +2677,8 @@ void BossGanon_Damaged(BossGanon* this, PlayState* play) { if (Animation_OnFrame(&this->skelAnime, this->fwork[GDF_FWORK_1])) { this->actionFunc = BossGanon_Vulnerable; this->unk_1C2 = 4; - this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gDorfVulnerableAnim); - Animation_MorphToLoop(&this->skelAnime, &gDorfVulnerableAnim, 0.0f); + this->fwork[GDF_FWORK_1] = Animation_GetLastFrame(&gGanondorfVulnerableAnim); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfVulnerableAnim, 0.0f); } } @@ -3191,40 +3192,40 @@ s32 BossGanon_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3 BossGanon* this = (BossGanon*)thisx; switch (limbIndex) { - case 10: + case GANONDORF_LIMB_RIGHT_HAND: if (this->useOpenHand) { - *dList = gDorfOpenHandDL; + *dList = gGanondorfRightHandOpenDL; } break; - case 20: + case GANONDORF_LIMB_LEFT_THIGH: rot->y += this->legRot.x + this->legRot.z; rot->z += this->legRot.y; break; - case 21: + case GANONDORF_LIMB_LEFT_SHIN: if (this->legRot.y > 0.0f) { rot->z += this->legRot.y; } break; - case 22: + case GANONDORF_LIMB_LEFT_FOOT: rot->y += this->legRot.x + this->legRot.z; rot->z += this->legRot.y; break; - case 23: + case GANONDORF_LIMB_RIGHT_THIGH: rot->y += this->legRot.x - this->legRot.z; rot->z += this->legRot.y; break; - case 24: + case GANONDORF_LIMB_RIGHT_SHIN: if (this->legRot.y > 0.0f) { rot->z += this->legRot.y; } break; - case 25: + case GANONDORF_LIMB_RIGHT_FOOT: rot->y += this->legRot.x - this->legRot.z; rot->z += this->legRot.y; break; @@ -3255,22 +3256,22 @@ void BossGanon_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* Matrix_MultVec3f(&D_808E4DB8, &this->unk_2EC[bodyPart]); } - if (limbIndex == 2) { + if (limbIndex == GANONDORF_LIMB_TORSO) { Matrix_MultVec3f(&D_808E4DB8, &this->unk_1FC); - } else if (limbIndex == 19) { + } else if (limbIndex == GANONDORF_LIMB_PELVIS) { Matrix_MultVec3f(&D_808E4DB8, &this->actor.focus.pos); - } else if (limbIndex == 11) { + } else if (limbIndex == GANONDORF_LIMB_JEWEL) { OPEN_DISPS(play->state.gfxCtx, "../z_boss_ganon.c", 7191); Matrix_MultVec3f(&D_808E4DB8, &this->unk_208); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon.c", 7196), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_ganon_DL_00BE90)); + gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gGanondorfEyesDL)); CLOSE_DISPS(play->state.gfxCtx, "../z_boss_ganon.c", 7198); - } else if (limbIndex == 6) { + } else if (limbIndex == GANONDORF_LIMB_LEFT_HAND) { Matrix_MultVec3f(&D_808E4DC4, &this->unk_238); - } else if (limbIndex == 10) { + } else if (limbIndex == GANONDORF_LIMB_RIGHT_HAND) { Matrix_MultVec3f(&D_808E4DD0, &this->unk_22C); if (this->unk_25C == 0) { @@ -3282,7 +3283,7 @@ void BossGanon_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* if (this->triforceType == GDF_TRIFORCE_DORF) { Matrix_MultVec3f(&D_808E4DE8, &this->triforcePos); } - } else if (limbIndex == 4) { + } else if (limbIndex == GANONDORF_LIMB_LEFT_UPPER_ARM) { Vec3f sp28 = D_808E4DA0; if (this->unk_198 == 1) { @@ -3295,7 +3296,7 @@ void BossGanon_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* } Matrix_MultVec3f(&sp28, &this->unk_220); - } else if (limbIndex == 8) { + } else if (limbIndex == GANONDORF_LIMB_RIGHT_UPPER_ARM) { Vec3f sp1C = D_808E4DAC; if (this->unk_198 == 1) { @@ -3346,7 +3347,7 @@ void BossGanon_DrawShock(BossGanon* this, PlayState* play) { Gfx_SetupDL_25Xlu(play->state.gfxCtx); gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255); gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 0, 0); - gSPDisplayList(POLY_XLU_DISP++, gDorfLightBallMaterialDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightBallMaterialDL); if (this->unk_2E8 != 0) { Player* player = GET_PLAYER(play); @@ -3359,7 +3360,7 @@ void BossGanon_DrawShock(BossGanon* this, PlayState* play) { Matrix_RotateZ(Rand_CenteredFloat(M_PI), MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 7384), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfSquareDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfSquareDL); } } else { for (i = 1; i < 15; i++) { @@ -3380,9 +3381,9 @@ void BossGanon_DrawShock(BossGanon* this, PlayState* play) { (this->unk_1A2 + i) * -15, 32, 64)); gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 200, 255, 170, 255); gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 0, 128); - gSPDisplayList(POLY_XLU_DISP++, gDorfShockGlowDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfShockGlowDL); } else { - gSPDisplayList(POLY_XLU_DISP++, gDorfSquareDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfSquareDL); } } } @@ -3408,7 +3409,7 @@ void BossGanon_DrawHandLightBall(BossGanon* this, PlayState* play) { gDPSetEnvColor(POLY_XLU_DISP++, 100, 255, 0, 0); } - gSPDisplayList(POLY_XLU_DISP++, gDorfLightBallMaterialDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightBallMaterialDL); Matrix_Translate(this->unk_260.x, this->unk_260.y, this->unk_260.z, MTXMODE_NEW); Matrix_ReplaceRotation(&play->billboardMtxF); @@ -3416,7 +3417,7 @@ void BossGanon_DrawHandLightBall(BossGanon* this, PlayState* play) { Matrix_RotateZ(this->unk_258, 1); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 7510), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfSquareDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfSquareDL); alpha = ((this->unk_1A2 % 2) != 0) ? 100 : 80; gDPPipeSync(POLY_XLU_DISP++); @@ -3425,7 +3426,7 @@ void BossGanon_DrawHandLightBall(BossGanon* this, PlayState* play) { Matrix_Scale(this->handLightBallScale * 0.75f, 1.0f, this->handLightBallScale * 0.75f, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon.c", 7531), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfLightCoreDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightCoreDL); CLOSE_DISPS(gfxCtx, "../z_boss_ganon.c", 7534); } @@ -3453,7 +3454,7 @@ void BossGanon_DrawBigMagicCharge(BossGanon* this, PlayState* play) { Matrix_Scale(this->unk_28C, this->unk_28C, this->unk_28C, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 7588), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfLightFlecksDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightFlecksDL); // background circle texture Matrix_Translate(this->unk_278.x, this->unk_278.y, this->unk_278.z, MTXMODE_NEW); @@ -3465,19 +3466,19 @@ void BossGanon_DrawBigMagicCharge(BossGanon* this, PlayState* play) { gSPSegment(POLY_XLU_DISP++, 0x09, Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, 0, 0, 0x20, 0x20, 1, 0, this->unk_1A2 * -4, 0x20, 0x20)); - gSPDisplayList(POLY_XLU_DISP++, gDorfBigMagicBGCircleDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfBigMagicBGCircleDL); // yellow background dot gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 150, 170, 0, (s8)this->unk_288); gSPSegment(POLY_XLU_DISP++, 0x0A, Gfx_TwoTexScroll(play->state.gfxCtx, G_TX_RENDERTILE, 0, 0, 0x20, 0x20, 1, this->unk_1A2 * 2, this->unk_1A2 * -0x14, 0x40, 0x40)); - gSPDisplayList(POLY_XLU_DISP++, gDorfDotDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfDotDL); // light ball material gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255); gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 100, 0); - gSPDisplayList(POLY_XLU_DISP++, gDorfLightBallMaterialDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightBallMaterialDL); // light ball geometry Matrix_Translate(this->unk_278.x, this->unk_278.y, this->unk_278.z, MTXMODE_NEW); @@ -3486,7 +3487,7 @@ void BossGanon_DrawBigMagicCharge(BossGanon* this, PlayState* play) { Matrix_RotateZ((this->unk_1A2 * 10.0f) / 1000.0f, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 7673), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfSquareDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfSquareDL); BossGanon_InitRand(this->unk_1AA + 1, 0x71AC, 0x263A); Matrix_Translate(this->unk_278.x, this->unk_278.y, this->unk_278.z, MTXMODE_NEW); @@ -3507,7 +3508,7 @@ void BossGanon_DrawBigMagicCharge(BossGanon* this, PlayState* play) { Matrix_Scale(4.0f, 4.0f, 1.0f, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 7713), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfLightRayTriDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightRayTriDL); Matrix_Pop(); } @@ -3560,7 +3561,7 @@ void BossGanon_DrawTriforce(BossGanon* this, PlayState* play) { Matrix_Scale(this->fwork[GDF_TRIFORCE_SCALE], this->fwork[GDF_TRIFORCE_SCALE], 1.0f, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon.c", 7779), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gDorfTriforceDL)); + gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gGanondorfTriforceDL)); Matrix_Pop(); @@ -3595,7 +3596,7 @@ void BossGanon_DrawDarkVortex(BossGanon* this, PlayState* play) { MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon.c", 7841), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gDorfVortexDL)); + gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gGanondorfVortexDL)); Matrix_Pop(); @@ -3769,10 +3770,10 @@ void BossGanon_DrawShadowTexture(void* tex, BossGanon* this, PlayState* play) { Matrix_Scale(0.95000005f, 1.0f, 0.95000005f, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon.c", 8396), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_OPA_DISP++, gDorfShadowSetupDL); + gSPDisplayList(POLY_OPA_DISP++, gGanondorfShadowSetupDL); gDPLoadTextureBlock(POLY_OPA_DISP++, tex, G_IM_FMT_I, G_IM_SIZ_8b, 64, 64, 0, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 6, 6, G_TX_NOLOD, G_TX_NOLOD); - gSPDisplayList(POLY_OPA_DISP++, gDorfShadowModelDL); + gSPDisplayList(POLY_OPA_DISP++, gGanondorfShadowModelDL); CLOSE_DISPS(gfxCtx, "../z_boss_ganon.c", 8426); } @@ -3793,7 +3794,7 @@ void BossGanon_Draw(Actor* thisx, PlayState* play) { POLY_OPA_DISP = Gfx_SetFog(POLY_OPA_DISP, 255, 50, 0, 0, 900, 1099); } - gSPSegment(POLY_XLU_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(gDorfEyeTex)); + gSPSegment(POLY_XLU_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(gGanondorfNormalEyeTex)); SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, BossGanon_OverrideLimbDraw, BossGanon_PostLimbDraw, &this->actor); @@ -4137,10 +4138,10 @@ void BossGanon_LightBall_Draw(Actor* thisx, PlayState* play) { Matrix_Scale(this->actor.scale.x * 0.75f, 1.0f, this->actor.scale.z * 0.75f, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon.c", 9875), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfLightCoreDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightCoreDL); Matrix_Pop(); - gSPDisplayList(POLY_XLU_DISP++, gDorfLightBallMaterialDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightBallMaterialDL); gDPPipeSync(POLY_XLU_DISP++); gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, (s8)this->fwork[GDF_FWORK_1]); @@ -4154,7 +4155,7 @@ void BossGanon_LightBall_Draw(Actor* thisx, PlayState* play) { gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon.c", 9899), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfSquareDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfSquareDL); Matrix_Pop(); } } else if (this->unk_1A8 == 0) { @@ -4162,7 +4163,7 @@ void BossGanon_LightBall_Draw(Actor* thisx, PlayState* play) { Matrix_RotateZ((this->actor.shape.rot.z / 32768.0f) * 3.1416f, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon.c", 9907), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfSquareDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfSquareDL); } CLOSE_DISPS(play->state.gfxCtx, "../z_boss_ganon.c", 9911); @@ -4276,7 +4277,7 @@ void func_808E229C(Actor* thisx, PlayState* play2) { Gfx_SetupDL_25Xlu(play->state.gfxCtx); gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, 255); gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 0, 0); - gSPDisplayList(POLY_XLU_DISP++, gDorfLightBallMaterialDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightBallMaterialDL); for (i = 9; i >= 0; i--) { temp = (s16)(((this->unk_1A6 - i) + 0xF) % 15); @@ -4287,7 +4288,7 @@ void func_808E229C(Actor* thisx, PlayState* play2) { Matrix_RotateZ(((2.0f * (i * M_PI)) / 10.0f) + BINANG_TO_RAD_ALT(this->actor.shape.rot.z), MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon.c", 10109), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfSquareDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfSquareDL); } CLOSE_DISPS(play->state.gfxCtx, "../z_boss_ganon.c", 10113); @@ -4541,9 +4542,9 @@ void func_808E2544(Actor* thisx, PlayState* play) { } static Gfx* sBigMagicLightStreakDLists[] = { - gDorfLightStreak12DL, gDorfLightStreak11DL, gDorfLightStreak10DL, gDorfLightStreak9DL, - gDorfLightStreak8DL, gDorfLightStreak7DL, gDorfLightStreak6DL, gDorfLightStreak5DL, - gDorfLightStreak4DL, gDorfLightStreak3DL, gDorfLightStreak2DL, gDorfLightStreak1DL, + gGanondorfLightStreak12DL, gGanondorfLightStreak11DL, gGanondorfLightStreak10DL, gGanondorfLightStreak9DL, + gGanondorfLightStreak8DL, gGanondorfLightStreak7DL, gGanondorfLightStreak6DL, gGanondorfLightStreak5DL, + gGanondorfLightStreak4DL, gGanondorfLightStreak3DL, gGanondorfLightStreak2DL, gGanondorfLightStreak1DL, }; void func_808E324C(Actor* thisx, PlayState* play) { @@ -4580,9 +4581,9 @@ void func_808E324C(Actor* thisx, PlayState* play) { Matrix_RotateZ(Rand_CenteredFloat(M_PI), MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon.c", 10534), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfLightBallMaterialDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightBallMaterialDL); - gSPDisplayList(POLY_XLU_DISP++, gDorfSquareDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfSquareDL); CLOSE_DISPS(play->state.gfxCtx, "../z_boss_ganon.c", 10541); } @@ -4786,9 +4787,10 @@ void BossGanon_UpdateEffects(PlayState* play) { } static void* sLightningTextures[] = { - gDorfLightning1Tex, gDorfLightning1Tex, gDorfLightning2Tex, gDorfLightning3Tex, gDorfLightning4Tex, - gDorfLightning5Tex, gDorfLightning6Tex, gDorfLightning7Tex, gDorfLightning8Tex, gDorfLightning9Tex, - gDorfLightning10Tex, gDorfLightning11Tex, gDorfLightning12Tex, + gGanondorfLightning1Tex, gGanondorfLightning1Tex, gGanondorfLightning2Tex, gGanondorfLightning3Tex, + gGanondorfLightning4Tex, gGanondorfLightning5Tex, gGanondorfLightning6Tex, gGanondorfLightning7Tex, + gGanondorfLightning8Tex, gGanondorfLightning9Tex, gGanondorfLightning10Tex, gGanondorfLightning11Tex, + gGanondorfLightning12Tex, }; static u8 sLightningPrimColors[] = { @@ -4817,7 +4819,7 @@ void BossGanon_DrawEffects(PlayState* play) { if (eff->type == GDF_EFF_WINDOW_SHARD) { gDPPipeSync(POLY_OPA_DISP++); if (materialFlag == 0) { - gSPDisplayList(POLY_OPA_DISP++, gDorfWindowShardMaterialDL); + gSPDisplayList(POLY_OPA_DISP++, gGanondorfWindowShardMaterialDL); materialFlag++; } if ((eff->timer & 7) != 0) { @@ -4831,7 +4833,7 @@ void BossGanon_DrawEffects(PlayState* play) { Matrix_RotateX(eff->unk_44, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 10898), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_OPA_DISP++, gDorfWindowShardModelDL); + gSPDisplayList(POLY_OPA_DISP++, gGanondorfWindowShardModelDL); } } @@ -4843,7 +4845,7 @@ void BossGanon_DrawEffects(PlayState* play) { gDPPipeSync(POLY_XLU_DISP++); if (materialFlag == 0) { gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 0, 0); - gSPDisplayList(POLY_XLU_DISP++, gDorfLightBallMaterialDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightBallMaterialDL); materialFlag++; } gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, eff->alpha); @@ -4853,7 +4855,7 @@ void BossGanon_DrawEffects(PlayState* play) { Matrix_RotateZ(eff->unk_3C, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 10932), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfSquareDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfSquareDL); } } @@ -4865,7 +4867,7 @@ void BossGanon_DrawEffects(PlayState* play) { gDPPipeSync(POLY_XLU_DISP++); if (materialFlag == 0) { gDPSetEnvColor(POLY_XLU_DISP++, 255, 255, 0, 0); - gSPDisplayList(POLY_XLU_DISP++, gDorfLightBallMaterialDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightBallMaterialDL); materialFlag++; } gDPSetPrimColor(POLY_XLU_DISP++, 0, 0, 255, 255, 255, eff->alpha); @@ -4877,7 +4879,7 @@ void BossGanon_DrawEffects(PlayState* play) { Matrix_RotateX(M_PI / 2, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 10971), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfSquareDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfSquareDL); } } @@ -4903,7 +4905,7 @@ void BossGanon_DrawEffects(PlayState* play) { Matrix_RotateZ(eff->unk_3C, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 11023), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfShockDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfShockDL); } } @@ -4925,7 +4927,7 @@ void BossGanon_DrawEffects(PlayState* play) { gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 11074), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPSegment(POLY_XLU_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(sLightningTextures[eff->timer])); - gSPDisplayList(POLY_XLU_DISP++, gDorfLightningDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfLightningDL); } } @@ -4943,7 +4945,7 @@ void BossGanon_DrawEffects(PlayState* play) { Matrix_Scale(eff->scale, eff->unk_40 * eff->scale, eff->scale, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 11121), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfImpactDarkDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfImpactDarkDL); } } @@ -4961,7 +4963,7 @@ void BossGanon_DrawEffects(PlayState* play) { Matrix_Scale(eff->scale, eff->unk_40 * eff->scale, eff->scale, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 11165), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfImpactLightDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfImpactLightDL); } } @@ -4980,7 +4982,7 @@ void BossGanon_DrawEffects(PlayState* play) { (eff->scale * 200.0f) / 1500.0f, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 11209), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfShockwaveDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfShockwaveDL); } } @@ -4999,7 +5001,7 @@ void BossGanon_DrawEffects(PlayState* play) { Matrix_Scale(eff->scale, eff->scale, 1.0f, MTXMODE_APPLY); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(gfxCtx, "../z_boss_ganon.c", 11250), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, gDorfDotDL); + gSPDisplayList(POLY_XLU_DISP++, gGanondorfDotDL); } } diff --git a/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.h b/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.h index 4884942f63..c1db637928 100644 --- a/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.h +++ b/src/overlays/actors/ovl_Boss_Ganon/z_boss_ganon.h @@ -8,6 +8,36 @@ struct BossGanon; typedef void (*BossGanonActionFunc)(struct BossGanon*, PlayState*); +typedef enum { + /* 0 */ GANONDORF_LIMB_NONE, + /* 1 */ GANONDORF_LIMB_ROOT, + /* 2 */ GANONDORF_LIMB_TORSO, + /* 3 */ GANONDORF_LIMB_LEFT_SHOULDER, + /* 4 */ GANONDORF_LIMB_LEFT_UPPER_ARM, + /* 5 */ GANONDORF_LIMB_LEFT_FOREARM, + /* 6 */ GANONDORF_LIMB_LEFT_HAND, + /* 7 */ GANONDORF_LIMB_RIGHT_SHOULDER, + /* 8 */ GANONDORF_LIMB_RIGHT_UPPER_ARM, + /* 9 */ GANONDORF_LIMB_RIGHT_FOREARM, + /* 10 */ GANONDORF_LIMB_RIGHT_HAND, + /* 11 */ GANONDORF_LIMB_JEWEL, + /* 12 */ GANONDORF_LIMB_LEFT_UPPER_LIP, + /* 13 */ GANONDORF_LIMB_MOUTH, + /* 14 */ GANONDORF_LIMB_JAW, + /* 15 */ GANONDORF_LIMB_UPPER_HAIR_END, + /* 16 */ GANONDORF_LIMB_LOWER_HAIR_END, + /* 17 */ GANONDORF_LIMB_RIGHT_UPPER_LIP, + /* 18 */ GANONDORF_LIMB_HEAD, + /* 19 */ GANONDORF_LIMB_PELVIS, + /* 20 */ GANONDORF_LIMB_LEFT_THIGH, + /* 21 */ GANONDORF_LIMB_LEFT_SHIN, + /* 22 */ GANONDORF_LIMB_LEFT_FOOT, + /* 23 */ GANONDORF_LIMB_RIGHT_THIGH, + /* 24 */ GANONDORF_LIMB_RIGHT_SHIN, + /* 25 */ GANONDORF_LIMB_RIGHT_FOOT, + /* 26 */ GANONDORF_LIMB_MAX +} GanondorfLimb; + typedef enum { /* 0 */ GDF_FWORK_0, /* 1 */ GDF_FWORK_1, diff --git a/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c b/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c index ccb443ea55..48644ffd13 100644 --- a/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c +++ b/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.c @@ -1,4 +1,5 @@ #include "z_boss_ganon2.h" +#include "overlays/actors/ovl_Boss_Ganon/z_boss_ganon.h" #include "overlays/actors/ovl_Demo_Gj/z_demo_gj.h" #include "overlays/actors/ovl_En_Zl3/z_en_zl3.h" #include "assets/objects/object_ganon/object_ganon.h" @@ -145,7 +146,7 @@ void BossGanon2_Init(Actor* thisx, PlayState* play) { Collider_InitJntSph(play, &this->unk_444); Collider_SetJntSph(play, &this->unk_444, &this->actor, &sJntSphInit2, this->unk_864); BossGanon2_SetObjectSegment(this, play, OBJECT_GANON, false); - SkelAnime_InitFlex(play, &this->skelAnime, &gDorfSkel, NULL, NULL, NULL, 0); + SkelAnime_InitFlex(play, &this->skelAnime, &gGanondorfSkel, NULL, NULL, NULL, 0); func_808FD5C4(this, play); this->actor.naviEnemyId = NAVI_ENEMY_GANON; this->actor.gravity = 0.0f; @@ -218,7 +219,7 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) { player->actor.world.pos.y = 1086.0f; player->actor.world.pos.z = -186.0f; player->actor.shape.rot.y = -0x5000; - Animation_MorphToLoop(&this->skelAnime, &object_ganon_anime3_Anim_002168, 0.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfBurstOutAnim, 0.0f); play->envCtx.lightBlend = 0.0f; // fake, tricks the compiler into allocating more stack if (zero) { @@ -406,8 +407,8 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) { if (this->unk_398 == 50) { this->unk_398 = 0; this->unk_39C = 12; - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime3_Anim_002168, 0.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon_anime3_Anim_002168); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfBurstOutAnim, 0.0f); + this->unk_194 = Animation_GetLastFrame(&gGanondorfBurstOutAnim); this->actor.world.pos.x = this->actor.world.pos.z = -200.0f; this->actor.world.pos.y = 1009.0f; this->actor.shape.yOffset = 7000.0f; @@ -440,7 +441,7 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) { this->subCamAt.y = this->actor.world.pos.y + 70.0f; } if (Animation_OnFrame(&this->skelAnime, this->unk_194)) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon_anime3_Anim_002E6C, 0.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfFloatingHeavyBreathingAnim, 0.0f); this->unk_39C = 14; this->unk_398 = 0; this->actor.world.pos.x = -200.0f; @@ -493,12 +494,12 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) { Math_ApproachF(&this->subCamAt.y, this->actor.world.pos.y + 77.0f, 0.05f, 5.0f); if (this->unk_398 >= 50) { if (this->unk_398 == 50) { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime3_Anim_000BFC, 0.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon_anime3_Anim_000BFC); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfShowTriforceStartAnim, 0.0f); + this->unk_194 = Animation_GetLastFrame(&gGanondorfShowTriforceStartAnim); this->unk_314 = 3; } if (Animation_OnFrame(&this->skelAnime, this->unk_194)) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon_anime3_Anim_003F38, 0.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanondorfShowTriforceLoopAnim, 0.0f); this->unk_194 = 1000.0f; } } @@ -508,8 +509,8 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) { if (this->unk_398 == 140) { this->unk_39C = 16; this->unk_398 = 0; - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime3_Anim_003754, 0.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon_anime3_Anim_003754); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfTransformStartAnim, 0.0f); + this->unk_194 = Animation_GetLastFrame(&gGanondorfTransformStartAnim); this->unk_339 = 55; play->envCtx.lightBlend = 1.0f; Audio_PlayActorSfx2(&this->actor, NA_SE_EN_GANON_CASBREAK); @@ -531,7 +532,7 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) { this->unk_1B4 = 0.0f; SkelAnime_Update(&this->skelAnime); if (Animation_OnFrame(&this->skelAnime, this->unk_194)) { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime3_Anim_0028A8, 0.0f); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanondorfTransformEndAnim, 0.0f); this->unk_194 = 1000.0f; } Math_ApproachF(&this->subCamEye.x, (this->actor.world.pos.x + 200.0f) - 90.0f, 0.1f, 6.3999996f); @@ -555,7 +556,7 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) { this->unk_337 = 2; BossGanon2_SetObjectSegment(this, play, OBJECT_GANON2, false); SkelAnime_Free(&this->skelAnime, play); - SkelAnime_InitFlex(play, &this->skelAnime, &object_ganon2_Skel_025970, NULL, NULL, NULL, 0); + SkelAnime_InitFlex(play, &this->skelAnime, &gGanonSkel, NULL, NULL, NULL, 0); BossGanon2_SetObjectSegment(this, play, OBJECT_GANON_ANIME3, false); func_8002DF54(play, &this->actor, 0x54); this->unk_314 = 3; @@ -577,7 +578,7 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) { if (this->unk_398 == 25) { this->unk_39C = 18; this->unk_398 = 0; - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime3_Anim_010380, 0.0f); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanonUncurlAndFlailAnim, 0.0f); this->skelAnime.playSpeed = 0.0f; this->subCamEye.x = ((this->actor.world.pos.x + 500.0f) - 350.0f) - 50.0f; this->subCamEye.y = this->actor.world.pos.y; @@ -640,7 +641,7 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) { this->unk_398 = 0; this->unk_420 = 10.0f; this->actor.velocity.y = 0.0f; - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime3_Anim_010380, 0.0f); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanonUncurlAndFlailAnim, 0.0f); func_808FD4D4(this, play, 0, 3); func_800A9F6C(0.0f, 0xC8, 0x14, 0x14); } @@ -673,8 +674,8 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) { } if (this->unk_398 == 80) { BossGanon2_SetObjectSegment(this, play, OBJECT_GANON2, false); - TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(object_ganon2_Tex_021A90), - 160, 180, 128, 40); + TitleCard_InitBossName(play, &play->actorCtx.titleCtx, SEGMENTED_TO_VIRTUAL(gGanonTitleCardTex), 160, + 180, 128, 40); } this->subCamEye.x = ((this->actor.world.pos.x + 500.0f) - 350.0f) + 100.0f; this->subCamEye.y = this->actor.world.pos.y; @@ -843,8 +844,8 @@ void func_808FD5F4(BossGanon2* this, PlayState* play) { if ((this->unk_398 > 40) && (Message_GetState(&play->msgCtx) == TEXT_STATE_NONE)) { this->unk_39C = 29; this->unk_398 = 0; - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon_anime3_Anim_0147E0, 0.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon_anime3_Anim_0147E0); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanonRoarAnim, 0.0f); + this->unk_194 = Animation_GetLastFrame(&gGanonRoarAnim); this->actor.shape.yOffset = 0.0f; this->actor.world.pos.y = 1086.0f; this->actor.gravity = -1.0f; @@ -1043,7 +1044,7 @@ void func_808FFDB0(BossGanon2* this, PlayState* play) { if (Object_IsLoaded(&play->objectCtx, objectIdx)) { gSegments[6] = VIRTUAL_TO_PHYSICAL(play->objectCtx.status[objectIdx].segment); - Animation_MorphToLoop(&this->skelAnime, &object_ganon2_Anim_00FFE4, -10.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanonGuardIdleAnim, -10.0f); this->actionFunc = func_808FFEBC; if (this->unk_334 != 0) { @@ -1081,7 +1082,7 @@ void func_808FFEBC(BossGanon2* this, PlayState* play) { } void func_808FFF90(BossGanon2* this, PlayState* play) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon2_Anim_00FFE4, -10.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanonGuardIdleAnim, -10.0f); this->actionFunc = func_808FFFE0; this->unk_1A2[0] = 40; } @@ -1106,8 +1107,8 @@ void func_808FFFE0(BossGanon2* this, PlayState* play) { } void func_809000A0(BossGanon2* this, PlayState* play) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon2_Anim_026510, -2.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon2_Anim_026510); + Animation_MorphToLoop(&this->skelAnime, &gGanonStunStartAnim, -2.0f); + this->unk_194 = Animation_GetLastFrame(&gGanonStunStartAnim); this->unk_1AC = 0; this->actionFunc = func_80900104; } @@ -1120,15 +1121,15 @@ void func_80900104(BossGanon2* this, PlayState* play) { case 0: if (Animation_OnFrame(&this->skelAnime, this->unk_194)) { this->unk_1AC = 1; - Animation_MorphToLoop(&this->skelAnime, &object_ganon2_Anim_026AF4, 0.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanonStunLoopAnim, 0.0f); this->unk_1A2[0] = 80; } break; case 1: if (this->unk_1A2[0] == 0) { this->unk_1AC = 2; - Animation_MorphToLoop(&this->skelAnime, &object_ganon2_Anim_027824, -5.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon2_Anim_027824); + Animation_MorphToLoop(&this->skelAnime, &gGanonStunEndAnim, -5.0f); + this->unk_194 = Animation_GetLastFrame(&gGanonStunEndAnim); } break; case 2: @@ -1140,8 +1141,8 @@ void func_80900104(BossGanon2* this, PlayState* play) { } void func_80900210(BossGanon2* this, PlayState* play) { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon2_Anim_00DFF0, -3.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon2_Anim_00DFF0); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanonDamageAnim, -3.0f); + this->unk_194 = Animation_GetLastFrame(&gGanonDamageAnim); this->actionFunc = func_8090026C; } @@ -1155,7 +1156,7 @@ void func_8090026C(BossGanon2* this, PlayState* play) { } void func_809002CC(BossGanon2* this, PlayState* play) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon2_Anim_00E8EC, -10.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanonGuardWalkAnim, -10.0f); this->actionFunc = func_80900344; this->unk_338 = 0; this->unk_1A2[0] = 100; @@ -1180,7 +1181,7 @@ void func_80900344(BossGanon2* this, PlayState* play) { } if (this->actor.xzDistToPlayer < 200.0f) { this->unk_338 = 0; - Animation_MorphToLoop(&this->skelAnime, &object_ganon2_Anim_00E8EC, -10.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanonGuardWalkAnim, -10.0f); } else { this->skelAnime.playSpeed = ((this->actor.xzDistToPlayer - 300.0f) * 0.005f) + 1.0f; if (this->skelAnime.playSpeed > 2.0f) { @@ -1195,7 +1196,7 @@ void func_80900344(BossGanon2* this, PlayState* play) { phi_f0 = 2.0f; if (this->actor.xzDistToPlayer >= 200.0f) { this->unk_338 = 1; - Animation_MorphToLoop(&this->skelAnime, &object_ganon2_Anim_0353C0, -10.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanonWalkAnim, -10.0f); } } @@ -1214,12 +1215,12 @@ void func_80900344(BossGanon2* this, PlayState* play) { void func_80900580(BossGanon2* this, PlayState* play) { if (this->unk_311 == 0) { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon2_Anim_00ADD0, -5.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon2_Anim_00ADD0); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanonLeftSwordSwingAnim, -5.0f); + this->unk_194 = Animation_GetLastFrame(&gGanonLeftSwordSwingAnim); this->unk_198 = (this->unk_194 - 15.0f) - 5.0f; } else { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon2_Anim_00CAF8, -5.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon2_Anim_00CAF8); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanonRightSwordSwingAnim, -5.0f); + this->unk_194 = Animation_GetLastFrame(&gGanonRightSwordSwingAnim); this->unk_198 = (this->unk_194 - 15.0f) - 5.0f; } @@ -1266,8 +1267,8 @@ void func_80900650(BossGanon2* this, PlayState* play) { } void func_80900818(BossGanon2* this, PlayState* play) { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon2_Anim_02A848, -5.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon2_Anim_02A848); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanonDownedStartAnim, -5.0f); + this->unk_194 = Animation_GetLastFrame(&gGanonDownedStartAnim); this->actionFunc = func_80900890; this->unk_1AC = 0; this->unk_39C = 0; @@ -1392,7 +1393,7 @@ void func_80900890(BossGanon2* this, PlayState* play) { switch (this->unk_1AC) { case 0: if (Animation_OnFrame(&this->skelAnime, this->unk_194)) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon2_Anim_034278, 0.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanonDownedLoopAnim, 0.0f); this->unk_1AC = 1; } break; @@ -1406,8 +1407,8 @@ void func_80900890(BossGanon2* this, PlayState* play) { temp_f12 = -200.0f - player->actor.world.pos.z; if (sqrtf(SQ(temp_f2) + SQ(temp_f12)) <= 784.0f) { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon2_Anim_0334F8, 0.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon2_Anim_0334F8); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanonGetUpAnim, 0.0f); + this->unk_194 = Animation_GetLastFrame(&gGanonGetUpAnim); this->unk_1AC = 2; this->unk_1A2[0] = 40; Audio_PlayActorSfx2(&this->actor, NA_SE_EN_MGANON_ROAR); @@ -1431,8 +1432,8 @@ void func_80900890(BossGanon2* this, PlayState* play) { } void func_80901020(BossGanon2* this, PlayState* play) { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon2_Anim_02A848, -5.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon2_Anim_02A848); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanonDownedStartAnim, -5.0f); + this->unk_194 = Animation_GetLastFrame(&gGanonDownedStartAnim); this->actionFunc = func_8090120C; this->unk_1AC = 0; this->unk_39C = 0; @@ -1642,8 +1643,8 @@ void func_8090120C(BossGanon2* this, PlayState* play) { Play_ChangeCameraStatus(play, this->subCamId, CAM_STAT_ACTIVE); this->unk_39C = 7; this->unk_398 = 0; - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon2_Anim_003B1C, 0.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon2_Anim_003B1C); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanonFinalBlowAnim, 0.0f); + this->unk_194 = Animation_GetLastFrame(&gGanonFinalBlowAnim); play->startPlayerCutscene(play, &this->actor, 0x61); } else { break; @@ -1709,8 +1710,8 @@ void func_8090120C(BossGanon2* this, PlayState* play) { case 75: this->unk_339 = 23; if (this->unk_398 == 55) { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon2_Anim_007288, 0.0f); - this->unk_194 = Animation_GetLastFrame(&object_ganon2_Anim_007288); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanonDeadStartAnim, 0.0f); + this->unk_194 = Animation_GetLastFrame(&gGanonDeadStartAnim); func_8002DF54(play, &this->actor, 0x62); this->unk_39C = 8; this->unk_398 = 1000; @@ -1734,7 +1735,7 @@ void func_8090120C(BossGanon2* this, PlayState* play) { play->envCtx.lightBlend = 0.0f; } if (Animation_OnFrame(&this->skelAnime, this->unk_194)) { - Animation_MorphToPlayOnce(&this->skelAnime, &object_ganon2_Anim_008EB8, 0.0f); + Animation_MorphToPlayOnce(&this->skelAnime, &gGanonDeadLoopAnim, 0.0f); this->unk_398 = 0; this->unk_194 = 1000.0f; } @@ -1819,7 +1820,7 @@ void func_8090120C(BossGanon2* this, PlayState* play) { switch (this->unk_1AC) { case 0: if (Animation_OnFrame(&this->skelAnime, this->unk_194)) { - Animation_MorphToLoop(&this->skelAnime, &object_ganon2_Anim_034278, 0.0f); + Animation_MorphToLoop(&this->skelAnime, &gGanonDownedLoopAnim, 0.0f); this->unk_1AC = 1; } break; @@ -2515,12 +2516,12 @@ s32 BossGanon2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec OPEN_DISPS(play->state.gfxCtx, "../z_boss_ganon2.c", 5355); - if (limbIndex == 15) { + if (limbIndex == GANON_LIMB_NECK) { rot->y += this->unk_31A; rot->z += this->unk_31C; } - if (limbIndex >= 42) { + if (limbIndex >= GANON_LIMB_TAIL1) { rot->x += this->unk_2F4[limbIndex] + this->unk_346; rot->y += this->unk_2FE[limbIndex]; @@ -2531,7 +2532,8 @@ s32 BossGanon2_OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec } } - if ((limbIndex == 7) || (limbIndex == 13) || (limbIndex == 33) || (limbIndex == 34)) { + if ((limbIndex == GANON_LIMB_LEFT_SWORD) || (limbIndex == GANON_LIMB_RIGHT_SWORD) || + (limbIndex == GANON_LIMB_LEFT_HORN) || (limbIndex == GANON_LIMB_RIGHT_HORN)) { *dList = NULL; } @@ -2554,17 +2556,17 @@ void BossGanon2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* Matrix_MultVec3f(&D_80906D60, &this->unk_234[D_809070CC[limbIndex]]); } - if (limbIndex == 15) { + if (limbIndex == GANON_LIMB_NECK) { Matrix_MultVec3f(&D_80906D60, &this->unk_1B8); - } else if (limbIndex == 3) { + } else if (limbIndex == GANON_LIMB_LEFT_SHOULDER) { Matrix_MultVec3f(&D_80907108, &this->unk_1F4); - } else if (limbIndex == 9) { + } else if (limbIndex == GANON_LIMB_RIGHT_SHOULDER) { Matrix_MultVec3f(&D_80907114, &this->unk_1E8); - } else if (limbIndex == 38) { + } else if (limbIndex == GANON_LIMB_LEFT_FOOT) { Matrix_MultVec3f(&D_80906D60, &this->unk_1DC); - } else if (limbIndex == 41) { + } else if (limbIndex == GANON_LIMB_RIGHT_FOOT) { Matrix_MultVec3f(&D_80906D60, &this->unk_1D0); - } else if (limbIndex == 45) { + } else if (limbIndex == GANON_LIMB_TAIL4) { Matrix_MultVec3f(&D_80907138, &this->unk_1C4); } @@ -2574,14 +2576,14 @@ void BossGanon2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* func_808FD080(temp_v0, &this->unk_424, &sp4C); } - if ((limbIndex == 7) || (limbIndex == 13)) { + if ((limbIndex == GANON_LIMB_LEFT_SWORD) || (limbIndex == GANON_LIMB_RIGHT_SWORD)) { Matrix_Push(); Matrix_Scale(this->unk_224, this->unk_224, this->unk_224, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon2.c", 5522), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(POLY_OPA_DISP++, *dList); Matrix_Pop(); - } else if ((limbIndex == 33) || (limbIndex == 34)) { + } else if ((limbIndex == GANON_LIMB_LEFT_HORN) || (limbIndex == GANON_LIMB_RIGHT_HORN)) { Matrix_Push(); Matrix_Scale(this->unk_228, this->unk_228, this->unk_228, MTXMODE_APPLY); gSPMatrix(POLY_OPA_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon2.c", 5533), @@ -2591,12 +2593,12 @@ void BossGanon2_PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* } if (*dList != NULL) { - if ((limbIndex == 7) && (this->unk_312 == 1)) { + if ((limbIndex == GANON_LIMB_LEFT_SWORD) && (this->unk_312 == 1)) { Matrix_MultVec3f(&D_809070FC, &this->unk_218); func_808FD080(0, &this->unk_444, &this->unk_218); Matrix_MultVec3f(&D_80907120, &this->unk_200); Matrix_MultVec3f(&D_8090712C, &this->unk_20C); - } else if ((limbIndex == 13) && (this->unk_312 == 2)) { + } else if ((limbIndex == GANON_LIMB_RIGHT_SWORD) && (this->unk_312 == 2)) { Matrix_MultVec3f(&D_809070FC, &this->unk_218); func_808FD080(1, &this->unk_444, &this->unk_218); Matrix_MultVec3f(&D_80907120, &this->unk_200); @@ -2709,15 +2711,15 @@ void BossGanon2_PostLimbDraw2(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s if (temp_v1 >= 0) { Matrix_MultVec3f(&D_80906D60, &this->unk_234[temp_v1]); } - if (limbIndex == 11) { + if (limbIndex == GANONDORF_LIMB_JEWEL) { OPEN_DISPS(play->state.gfxCtx, "../z_boss_ganon2.c", 5749); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_boss_ganon2.c", 5752), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_ganon_DL_00BE90)); + gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gGanondorfEyesDL)); CLOSE_DISPS(play->state.gfxCtx, "../z_boss_ganon2.c", 5754); - } else if (limbIndex == 10) { + } else if (limbIndex == GANONDORF_LIMB_RIGHT_HAND) { Matrix_MultVec3f(&D_80907164, &this->unk_1B8); } } @@ -2762,8 +2764,8 @@ void BossGanon2_Draw(Actor* thisx, PlayState* play) { switch (this->unk_337) { case 0: BossGanon2_SetObjectSegment(this, play, OBJECT_GANON, true); - gSPSegment(POLY_XLU_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(object_ganon_Tex_00A8E0)); - gSPSegment(POLY_XLU_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(object_ganon_Tex_00A8E0)); + gSPSegment(POLY_XLU_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(gGanondorfEmptyEyeTex)); + gSPSegment(POLY_XLU_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(gGanondorfEmptyEyeTex)); SkelAnime_DrawFlexOpa(play, this->skelAnime.skeleton, this->skelAnime.jointTable, this->skelAnime.dListCount, NULL, BossGanon2_PostLimbDraw2, this); break; diff --git a/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.h b/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.h index 90b30ab998..2248b41350 100644 --- a/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.h +++ b/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2.h @@ -8,6 +8,57 @@ struct BossGanon2; typedef void (*BossGanon2ActionFunc)(struct BossGanon2*, PlayState*); +typedef enum { + /* 0 */ GANON_LIMB_NONE, + /* 1 */ GANON_LIMB_ROOT, + /* 2 */ GANON_LIMB_TORSO, + /* 3 */ GANON_LIMB_LEFT_SHOULDER, + /* 4 */ GANON_LIMB_LEFT_UPPER_ARM, + /* 5 */ GANON_LIMB_LEFT_FOREARM, + /* 6 */ GANON_LIMB_LEFT_WRIST, + /* 7 */ GANON_LIMB_LEFT_SWORD, + /* 8 */ GANON_LIMB_LEFT_HAND, + /* 9 */ GANON_LIMB_RIGHT_SHOULDER, + /* 10 */ GANON_LIMB_RIGHT_UPPER_ARM, + /* 11 */ GANON_LIMB_RIGHT_FOREARM, + /* 12 */ GANON_LIMB_RIGHT_WRIST, + /* 13 */ GANON_LIMB_RIGHT_SWORD, + /* 14 */ GANON_LIMB_RIGHT_HAND, + /* 15 */ GANON_LIMB_NECK, + /* 16 */ GANON_LIMB_JEWEL, + /* 17 */ GANON_LIMB_SNOUT, + /* 18 */ GANON_LIMB_OUTER_TEETH, + /* 19 */ GANON_LIMB_MOUTH, + /* 20 */ GANON_LIMB_INNER_TEETH, + /* 21 */ GANON_LIMB_JAW, + /* 22 */ GANON_LIMB_MIDDLE_HAIR_1, + /* 23 */ GANON_LIMB_MIDDLE_HAIR_2, + /* 24 */ GANON_LIMB_MIDDLE_HAIR_3, + /* 25 */ GANON_LIMB_LEFT_HAIR_1, + /* 26 */ GANON_LIMB_LEFT_HAIR_2, + /* 27 */ GANON_LIMB_LEFT_HAIR_3, + /* 28 */ GANON_LIMB_RIGHT_HAIR_1, + /* 29 */ GANON_LIMB_RIGHT_HAIR_2, + /* 30 */ GANON_LIMB_RIGHT_HAIR_3, + /* 31 */ GANON_LIMB_EYES, + /* 32 */ GANON_LIMB_HEAD, + /* 33 */ GANON_LIMB_LEFT_HORN, + /* 34 */ GANON_LIMB_RIGHT_HORN, + /* 35 */ GANON_LIMB_PELVIS, + /* 36 */ GANON_LIMB_LEFT_THIGH, + /* 37 */ GANON_LIMB_LEFT_SHIN, + /* 38 */ GANON_LIMB_LEFT_FOOT, + /* 39 */ GANON_LIMB_RIGHT_THIGH, + /* 40 */ GANON_LIMB_RIGHT_SHIN, + /* 41 */ GANON_LIMB_RIGHT_FOOT, + /* 42 */ GANON_LIMB_TAIL1, + /* 43 */ GANON_LIMB_TAIL2, + /* 44 */ GANON_LIMB_TAIL3, + /* 45 */ GANON_LIMB_TAIL4, + /* 46 */ GANON_LIMB_TAIL5, + /* 47 */ GANON_LIMB_MAX +} GanonLimb; + typedef struct BossGanon2 { /* 0x0000 */ Actor actor; /* 0x014C */ SkelAnime skelAnime; diff --git a/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2_data.c b/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2_data.c index b65404695a..407e0f020d 100644 --- a/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2_data.c +++ b/src/overlays/actors/ovl_Boss_Ganon2/z_boss_ganon2_data.c @@ -309,9 +309,9 @@ static s8 D_80907144[] = { static Vec3f D_80907164 = { 800.0f, 420.0f, 100.0f }; static void* sEyeTextures[] = { - object_ganon2_Tex_01E188, - object_ganon2_Tex_01E988, - object_ganon2_Tex_01EA08, + gGanonEyeOpenTex, + gGanonEyeHalfTex, + gGanonEyeClosedTex, }; static Vec3f D_8090717C = { 0.0f, -2000.0f, 0.0f }; diff --git a/src/overlays/actors/ovl_Boss_Va/z_boss_va.c b/src/overlays/actors/ovl_Boss_Va/z_boss_va.c index cc26b44039..67a493c6d9 100644 --- a/src/overlays/actors/ovl_Boss_Va/z_boss_va.c +++ b/src/overlays/actors/ovl_Boss_Va/z_boss_va.c @@ -3291,19 +3291,11 @@ void BossVa_UpdateEffects(PlayState* play) { Player* player = GET_PLAYER(play); s16 spB6; s16 i; - f32 floorY; - s32 padAC; + f32 spB0; + f32 spAC; s16 pitch; - s16 yaw; BossVa* refActor2; BossVa* refActor; - Vec3f sp94; - CollisionPoly* sp90; - f32 pad8C; - Vec3f sp80; - CollisionPoly* sp7C; - f32 pad78; - f32 pad74; for (i = 0; i < BOSS_VA_EFFECT_COUNT; i++, effect++) { if (effect->type != VA_NONE) { @@ -3325,12 +3317,12 @@ void BossVa_UpdateEffects(PlayState* play) { if ((effect->mode == SPARK_TETHER) || (effect->mode == SPARK_UNUSED)) { pitch = effect->rot.x - Math_Vec3f_Pitch(&refActor->actor.world.pos, &GET_BODY(refActor)->unk_1D8); - pad8C = Math_SinS(refActor->actor.world.rot.y); - effect->pos.x = refActor->actor.world.pos.x - (effect->offset.x * pad8C); - pad74 = Math_CosS(refActor->actor.world.rot.y); - effect->pos.z = refActor->actor.world.pos.z - (effect->offset.x * pad74); - pad78 = Math_CosS(-pitch); - effect->pos.y = (effect->offset.y * pad78) + refActor->actor.world.pos.y; + spAC = Math_SinS(refActor->actor.world.rot.y); + effect->pos.x = refActor->actor.world.pos.x - (effect->offset.x * spAC); + spB0 = Math_CosS(refActor->actor.world.rot.y); + effect->pos.z = refActor->actor.world.pos.z - (effect->offset.x * spB0); + spB0 = Math_CosS(-pitch); + effect->pos.y = (effect->offset.y * spB0) + refActor->actor.world.pos.y; } else if ((effect->mode == SPARK_BARI) || (effect->mode == SPARK_BODY)) { effect->pos.x = effect->offset.x + refActor->actor.world.pos.x; effect->pos.y = effect->offset.y + refActor->actor.world.pos.y; @@ -3396,10 +3388,14 @@ void BossVa_UpdateEffects(PlayState* play) { if (effect->type == VA_BLOOD) { if (effect->mode < BLOOD_SPOT) { - sp94 = effect->pos; - sp94.y -= effect->velocity.y + 4.0f; - floorY = BgCheck_EntityRaycastFloor1(&play->colCtx, &sp90, &sp94); - if ((sp90 != NULL) && (effect->pos.y <= floorY)) { + Vec3f checkPos; + CollisionPoly* groundPoly; + f32 floorY; + + checkPos = effect->pos; + checkPos.y -= effect->velocity.y + 4.0f; + floorY = BgCheck_EntityRaycastDown1(&play->colCtx, &groundPoly, &checkPos); + if ((groundPoly != NULL) && (effect->pos.y <= floorY)) { effect->mode = BLOOD_SPOT; effect->pos.y = floorY + 1.0f; if (sCsState <= DEATH_SHELL_BURST) { @@ -3429,11 +3425,15 @@ void BossVa_UpdateEffects(PlayState* play) { if (effect->type == VA_GORE) { if (effect->mode == GORE_PERMANENT) { - sp80 = effect->pos; - sp80.y -= effect->velocity.y + 4.0f; + Vec3f checkPos; + CollisionPoly* groundPoly; + f32 floorY; + + checkPos = effect->pos; + checkPos.y -= effect->velocity.y + 4.0f; effect->rot.x += 0x1770; - floorY = BgCheck_EntityRaycastFloor1(&play->colCtx, &sp7C, &sp80); - if ((sp7C != NULL) && (effect->pos.y <= floorY)) { + floorY = BgCheck_EntityRaycastDown1(&play->colCtx, &groundPoly, &checkPos); + if ((groundPoly != NULL) && (effect->pos.y <= floorY)) { effect->mode = GORE_FLOOR; effect->timer = 30; effect->pos.y = floorY + 1.0f; @@ -3462,6 +3462,8 @@ void BossVa_UpdateEffects(PlayState* play) { } if (effect->type == VA_TUMOR) { + s16 yaw; + refActor = effect->parent; effect->rot.z += 0x157C; diff --git a/src/overlays/actors/ovl_En_Box/z_en_box.c b/src/overlays/actors/ovl_En_Box/z_en_box.c index a70632c1a5..b2a93fd43e 100644 --- a/src/overlays/actors/ovl_En_Box/z_en_box.c +++ b/src/overlays/actors/ovl_En_Box/z_en_box.c @@ -79,11 +79,11 @@ void EnBox_ClipToGround(EnBox* this, PlayState* play) { f32 newY; CollisionPoly* poly; s32 bgId; - Vec3f pos; + Vec3f checkPos; - pos = this->dyna.actor.world.pos; - pos.y += 1.0f; - newY = BgCheck_EntityRaycastFloor4(&play->colCtx, &poly, &bgId, &this->dyna.actor, &pos); + checkPos = this->dyna.actor.world.pos; + checkPos.y += 1.0f; + newY = BgCheck_EntityRaycastDown4(&play->colCtx, &poly, &bgId, &this->dyna.actor, &checkPos); if (newY != BGCHECK_Y_MIN) { this->dyna.actor.world.pos.y = newY; } diff --git a/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c b/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c index 6dcc182610..d1c4ee79f5 100644 --- a/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c +++ b/src/overlays/actors/ovl_En_Eiyer/z_en_eiyer.c @@ -402,8 +402,8 @@ void EnEiyer_Ambush(EnEiyer* this, PlayState* play) { this->collider.base.acFlags |= AC_ON; EnEiyer_SetupGlide(this); } else { - this->actor.floorHeight = BgCheck_EntityRaycastFloor4(&play->colCtx, &this->actor.floorPoly, &bgId, - &this->actor, &this->actor.world.pos); + this->actor.floorHeight = BgCheck_EntityRaycastDown4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, + &this->actor.world.pos); } } diff --git a/src/overlays/actors/ovl_En_Elf/z_en_elf.c b/src/overlays/actors/ovl_En_Elf/z_en_elf.c index 6679c8b59c..202a2910be 100644 --- a/src/overlays/actors/ovl_En_Elf/z_en_elf.c +++ b/src/overlays/actors/ovl_En_Elf/z_en_elf.c @@ -1209,9 +1209,9 @@ void func_80A04D90(EnElf* this, PlayState* play) { s32 pad; s32 bgId; - this->actor.floorHeight = BgCheck_EntityRaycastFloor5(play, &play->colCtx, &this->actor.floorPoly, &bgId, - &this->actor, &this->actor.world.pos); - this->actor.shape.shadowAlpha = 0x32; + this->actor.floorHeight = BgCheck_EntityRaycastDown5(play, &play->colCtx, &this->actor.floorPoly, &bgId, + &this->actor, &this->actor.world.pos); + this->actor.shape.shadowAlpha = 50; } // move to talk to player diff --git a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c index 7e5e1085a3..dfd0ddddd1 100644 --- a/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c +++ b/src/overlays/actors/ovl_En_Encount1/z_en_encount1.c @@ -131,7 +131,7 @@ void EnEncount1_SpawnLeevers(EnEncount1* this, PlayState* play) { spawnPos.y = player->actor.floorHeight + 120.0f; spawnPos.z = player->actor.world.pos.z + Math_CosS(spawnAngle) * spawnDist; - floorY = BgCheck_EntityRaycastFloor4(&play->colCtx, &floorPoly, &bgId, &this->actor, &spawnPos); + floorY = BgCheck_EntityRaycastDown4(&play->colCtx, &floorPoly, &bgId, &this->actor, &spawnPos); if (floorY <= BGCHECK_Y_MIN) { break; } @@ -192,7 +192,7 @@ void EnEncount1_SpawnTektites(EnEncount1* this, PlayState* play) { spawnPos.x = this->actor.world.pos.x + Rand_CenteredFloat(50.0f); spawnPos.y = this->actor.world.pos.y + 120.0f; spawnPos.z = this->actor.world.pos.z + Rand_CenteredFloat(50.0f); - floorY = BgCheck_EntityRaycastFloor4(&play->colCtx, &floorPoly, &bgId, &this->actor, &spawnPos); + floorY = BgCheck_EntityRaycastDown4(&play->colCtx, &floorPoly, &bgId, &this->actor, &spawnPos); if (floorY <= BGCHECK_Y_MIN) { return; } @@ -266,7 +266,7 @@ void EnEncount1_SpawnStalchildOrWolfos(EnEncount1* this, PlayState* play) { spawnPos.y = player->actor.floorHeight + 120.0f; spawnPos.z = player->actor.world.pos.z + (Math_CosS(spawnAngle) * spawnDist) + Rand_CenteredFloat(40.0f); - floorY = BgCheck_EntityRaycastFloor4(&play->colCtx, &floorPoly, &bgId, &this->actor, &spawnPos); + floorY = BgCheck_EntityRaycastDown4(&play->colCtx, &floorPoly, &bgId, &this->actor, &spawnPos); if (floorY <= BGCHECK_Y_MIN) { break; } diff --git a/src/overlays/actors/ovl_En_Fish/z_en_fish.c b/src/overlays/actors/ovl_En_Fish/z_en_fish.c index 0ac71aff75..f581c7cc1a 100644 --- a/src/overlays/actors/ovl_En_Fish/z_en_fish.c +++ b/src/overlays/actors/ovl_En_Fish/z_en_fish.c @@ -669,7 +669,7 @@ void EnFish_UpdateCutscene(EnFish* this, PlayState* play) { this->actor.world.pos.z = (endPos.z - startPos.z) * progress + startPos.z; this->actor.floorHeight = - BgCheck_EntityRaycastFloor4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &this->actor.world.pos); + BgCheck_EntityRaycastDown4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &this->actor.world.pos); } // Update functions and Draw diff --git a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c index eff775f2da..4a9636ef27 100644 --- a/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c +++ b/src/overlays/actors/ovl_En_Goroiwa/z_en_goroiwa.c @@ -360,7 +360,7 @@ s32 EnGoroiwa_MoveDownToNextWaypoint(EnGoroiwa* this, PlayState* play) { f32 yDistToFloor; s32 quakeIdx; CollisionPoly* floorPoly; - Vec3f raycastFrom; + Vec3f checkPos; f32 floorY; s32 pad2; s32 floorBgId; @@ -386,11 +386,11 @@ s32 EnGoroiwa_MoveDownToNextWaypoint(EnGoroiwa* this, PlayState* play) { } this->rollRotSpeed = 0.0f; if (!(this->stateFlags & ENGOROIWA_IN_WATER)) { - raycastFrom.x = this->actor.world.pos.x; - raycastFrom.y = this->actor.world.pos.y + 50.0f; - raycastFrom.z = this->actor.world.pos.z; - floorY = BgCheck_EntityRaycastFloor5(play, &play->colCtx, &floorPoly, &floorBgId, &this->actor, - &raycastFrom); + checkPos.x = this->actor.world.pos.x; + checkPos.y = this->actor.world.pos.y + 50.0f; + checkPos.z = this->actor.world.pos.z; + floorY = + BgCheck_EntityRaycastDown5(play, &play->colCtx, &floorPoly, &floorBgId, &this->actor, &checkPos); yDistToFloor = floorY - (this->actor.world.pos.y - 59.5f); if (fabsf(yDistToFloor) < 15.0f) { dustPos.x = this->actor.world.pos.x; @@ -723,7 +723,7 @@ void EnGoroiwa_Update(Actor* thisx, PlayState* play) { EnGoroiwa* this = (EnGoroiwa*)thisx; Player* player = GET_PLAYER(play); s32 pad; - s32 sp30; + s32 bgId; if (!(player->stateFlags1 & (PLAYER_STATE1_6 | PLAYER_STATE1_7 | PLAYER_STATE1_28 | PLAYER_STATE1_29))) { if (this->collisionDisabledTimer > 0) { @@ -736,8 +736,8 @@ void EnGoroiwa_Update(Actor* thisx, PlayState* play) { UPDBGCHECKINFO_FLAG_2 | UPDBGCHECKINFO_FLAG_3 | UPDBGCHECKINFO_FLAG_4); break; case 0: - this->actor.floorHeight = BgCheck_EntityRaycastFloor4(&play->colCtx, &this->actor.floorPoly, &sp30, - &this->actor, &this->actor.world.pos); + this->actor.floorHeight = BgCheck_EntityRaycastDown4(&play->colCtx, &this->actor.floorPoly, &bgId, + &this->actor, &this->actor.world.pos); break; } EnGoroiwa_UpdateRotation(this, play); diff --git a/src/overlays/actors/ovl_En_Horse/z_en_horse.c b/src/overlays/actors/ovl_En_Horse/z_en_horse.c index 42340622c7..982a95d3f3 100644 --- a/src/overlays/actors/ovl_En_Horse/z_en_horse.c +++ b/src/overlays/actors/ovl_En_Horse/z_en_horse.c @@ -2841,7 +2841,7 @@ s32 EnHorse_CalcFloorHeight(EnHorse* this, PlayState* play, Vec3f* pos, Collisio WaterBox* waterBox; *floorPoly = NULL; - *floorHeight = BgCheck_EntityRaycastFloor3(&play->colCtx, floorPoly, &bgId, pos); + *floorHeight = BgCheck_EntityRaycastDown3(&play->colCtx, floorPoly, &bgId, pos); if (*floorHeight == BGCHECK_Y_MIN) { return 1; // No floor @@ -2852,7 +2852,7 @@ s32 EnHorse_CalcFloorHeight(EnHorse* this, PlayState* play, Vec3f* pos, Collisio return 2; // Water } - if ((*floorPoly)->normal.y * COLPOLY_NORMAL_FRAC < 0.81915206f || // cos(35 degrees) + if (COLPOLY_GET_NORMAL((*floorPoly)->normal.y) < 0.81915206f || // cos(35 degrees) SurfaceType_IsHorseBlocked(&play->colCtx, *floorPoly, bgId) || SurfaceType_GetFloorType(&play->colCtx, *floorPoly, bgId) == FLOOR_TYPE_7) { return 3; // Horse blocked surface @@ -2957,9 +2957,9 @@ void EnHorse_CheckFloors(EnHorse* this, PlayState* play) { floorSlope = RAD_TO_BINANG(Math_FAtan2F(this->yBack - this->yFront, 60.0f)); if (this->actor.floorPoly != 0) { - nx = this->actor.floorPoly->normal.x * COLPOLY_NORMAL_FRAC; - ny = this->actor.floorPoly->normal.y * COLPOLY_NORMAL_FRAC; - nz = this->actor.floorPoly->normal.z * COLPOLY_NORMAL_FRAC; + nx = COLPOLY_GET_NORMAL(this->actor.floorPoly->normal.x); + ny = COLPOLY_GET_NORMAL(this->actor.floorPoly->normal.y); + nz = COLPOLY_GET_NORMAL(this->actor.floorPoly->normal.z); pos = frontPos; pos.y = this->yFront; dist = Math3D_DistPlaneToPos(nx, ny, nz, this->actor.floorPoly->dist, &pos); @@ -3225,7 +3225,7 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) { obstaclePos.y = this->actor.world.pos.y + 120.0f; obstaclePos.z += intersectDist * Math_CosS(this->actor.world.rot.y); obstacleTop = obstaclePos; - obstacleTop.y = BgCheck_EntityRaycastFloor3(&play->colCtx, &obstacleFloor, &bgId, &obstaclePos); + obstacleTop.y = BgCheck_EntityRaycastDown3(&play->colCtx, &obstacleFloor, &bgId, &obstaclePos); if (obstacleTop.y == BGCHECK_Y_MIN) { return; } @@ -3234,13 +3234,12 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) { return; } - if (Math3D_DistPlaneToPos(this->actor.floorPoly->normal.x * COLPOLY_NORMAL_FRAC, - this->actor.floorPoly->normal.y * COLPOLY_NORMAL_FRAC, - this->actor.floorPoly->normal.z * COLPOLY_NORMAL_FRAC, this->actor.floorPoly->dist, - &obstacleTop) < -40.0f && - Math3D_DistPlaneToPos( - obstacleFloor->normal.x * COLPOLY_NORMAL_FRAC, obstacleFloor->normal.y * COLPOLY_NORMAL_FRAC, - obstacleFloor->normal.z * COLPOLY_NORMAL_FRAC, obstacleFloor->dist, &this->actor.world.pos) > 40.0f) { + if (Math3D_DistPlaneToPos( + COLPOLY_GET_NORMAL(this->actor.floorPoly->normal.x), COLPOLY_GET_NORMAL(this->actor.floorPoly->normal.y), + COLPOLY_GET_NORMAL(this->actor.floorPoly->normal.z), this->actor.floorPoly->dist, &obstacleTop) < -40.0f && + Math3D_DistPlaneToPos(COLPOLY_GET_NORMAL(obstacleFloor->normal.x), COLPOLY_GET_NORMAL(obstacleFloor->normal.y), + COLPOLY_GET_NORMAL(obstacleFloor->normal.z), obstacleFloor->dist, + &this->actor.world.pos) > 40.0f) { if (movingFast == true && this->action != ENHORSE_ACT_STOPPING) { this->stateFlags |= ENHORSE_FORCE_REVERSING; EnHorse_StartBraking(this, play); @@ -3249,7 +3248,7 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) { return; } - ny = obstacleFloor->normal.y * COLPOLY_NORMAL_FRAC; + ny = COLPOLY_GET_NORMAL(obstacleFloor->normal.y); if (ny < 0.81915206f || // cos(35 degrees) (SurfaceType_IsHorseBlocked(&play->colCtx, obstacleFloor, bgId) != 0) || (SurfaceType_GetFloorType(&play->colCtx, obstacleFloor, bgId) == FLOOR_TYPE_7)) { @@ -3275,7 +3274,7 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) { } obstacleTop = obstaclePos; - obstacleTop.y = BgCheck_EntityRaycastFloor3(&play->colCtx, &obstacleFloor, &bgId, &obstaclePos); + obstacleTop.y = BgCheck_EntityRaycastDown3(&play->colCtx, &obstacleFloor, &bgId, &obstaclePos); if (obstacleTop.y == BGCHECK_Y_MIN) { return; } @@ -3286,7 +3285,7 @@ void EnHorse_UpdateBgCheckInfo(EnHorse* this, PlayState* play) { return; } - ny = obstacleFloor->normal.y * COLPOLY_NORMAL_FRAC; + ny = COLPOLY_GET_NORMAL(obstacleFloor->normal.y); if (ny < 0.81915206f || // cos(35 degrees) SurfaceType_IsHorseBlocked(&play->colCtx, obstacleFloor, bgId) || SurfaceType_GetFloorType(&play->colCtx, obstacleFloor, bgId) == FLOOR_TYPE_7) { 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 e502860872..0c7085b902 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 @@ -270,19 +270,16 @@ void func_80A68DB0(EnHorseGanon* this, PlayState* play) { void func_80A68E14(EnHorseGanon* this, PlayState* play) { s32 pad; - CollisionPoly* col; - f32 temp_ret; - Vec3f v; - s32 temp1; + CollisionPoly* poly; + s32 pad2; + Vec3f checkPos; + s32 bgId; - v.x = Math_SinS(this->actor.shape.rot.y) * 30.0f + this->actor.world.pos.x; - v.y = this->actor.world.pos.y + 60.0f; - v.z = Math_CosS(this->actor.shape.rot.y) * 30.0f + this->actor.world.pos.z; - - temp_ret = BgCheck_EntityRaycastFloor3(&play->colCtx, &col, &temp1, &v); - - this->unk_1F4 = temp_ret; - this->actor.shape.rot.x = RAD_TO_BINANG(Math_FAtan2F(this->actor.world.pos.y - temp_ret, 30.0f)); + checkPos.x = Math_SinS(this->actor.shape.rot.y) * 30.0f + this->actor.world.pos.x; + checkPos.y = this->actor.world.pos.y + 60.0f; + checkPos.z = Math_CosS(this->actor.shape.rot.y) * 30.0f + this->actor.world.pos.z; + this->unk_1F4 = BgCheck_EntityRaycastDown3(&play->colCtx, &poly, &bgId, &checkPos); + this->actor.shape.rot.x = RAD_TO_BINANG(Math_FAtan2F(this->actor.world.pos.y - this->unk_1F4, 30.0f)); } void EnHorseGanon_Update(Actor* thisx, PlayState* play) { diff --git a/src/overlays/actors/ovl_En_Horse_Normal/z_en_horse_normal.c b/src/overlays/actors/ovl_En_Horse_Normal/z_en_horse_normal.c index a3d0c2a05c..a61df481d4 100644 --- a/src/overlays/actors/ovl_En_Horse_Normal/z_en_horse_normal.c +++ b/src/overlays/actors/ovl_En_Horse_Normal/z_en_horse_normal.c @@ -557,15 +557,15 @@ void EnHorseNormal_WaitClone(EnHorseNormal* this, PlayState* play) { void func_80A6C8E0(EnHorseNormal* this, PlayState* play) { s32 pad; - CollisionPoly* sp38; + CollisionPoly* groundPoly; s32 pad2; - Vec3f sp28; - s32 sp24; + Vec3f checkPos; + s32 bgId; - sp28.x = (Math_SinS(this->actor.shape.rot.y) * 30.0f) + this->actor.world.pos.x; - sp28.y = this->actor.world.pos.y + 60.0f; - sp28.z = (Math_CosS(this->actor.shape.rot.y) * 30.0f) + this->actor.world.pos.z; - this->unk_220 = BgCheck_EntityRaycastFloor3(&play->colCtx, &sp38, &sp24, &sp28); + checkPos.x = (Math_SinS(this->actor.shape.rot.y) * 30.0f) + this->actor.world.pos.x; + checkPos.y = this->actor.world.pos.y + 60.0f; + checkPos.z = (Math_CosS(this->actor.shape.rot.y) * 30.0f) + this->actor.world.pos.z; + this->unk_220 = BgCheck_EntityRaycastDown3(&play->colCtx, &groundPoly, &bgId, &checkPos); this->actor.shape.rot.x = RAD_TO_BINANG(Math_FAtan2F(this->actor.world.pos.y - this->unk_220, 30.0f)); } diff --git a/src/overlays/actors/ovl_En_Horse_Zelda/z_en_horse_zelda.c b/src/overlays/actors/ovl_En_Horse_Zelda/z_en_horse_zelda.c index 8eaf3f3f86..d178b405a8 100644 --- a/src/overlays/actors/ovl_En_Horse_Zelda/z_en_horse_zelda.c +++ b/src/overlays/actors/ovl_En_Horse_Zelda/z_en_horse_zelda.c @@ -217,13 +217,13 @@ void func_80A6DE38(EnHorseZelda* this, PlayState* play) { s32 pad; CollisionPoly* poly; s32 pad2; - Vec3f pos; + Vec3f checkPos; s32 bgId; - pos.x = (Math_SinS(this->actor.shape.rot.y) * 30.0f) + this->actor.world.pos.x; - pos.y = this->actor.world.pos.y + 60.0f; - pos.z = (Math_CosS(this->actor.shape.rot.y) * 30.0f) + this->actor.world.pos.z; - this->unk_1F4 = BgCheck_EntityRaycastFloor3(&play->colCtx, &poly, &bgId, &pos); + checkPos.x = (Math_SinS(this->actor.shape.rot.y) * 30.0f) + this->actor.world.pos.x; + checkPos.y = this->actor.world.pos.y + 60.0f; + checkPos.z = (Math_CosS(this->actor.shape.rot.y) * 30.0f) + this->actor.world.pos.z; + this->unk_1F4 = BgCheck_EntityRaycastDown3(&play->colCtx, &poly, &bgId, &checkPos); this->actor.shape.rot.x = RAD_TO_BINANG(Math_FAtan2F(this->actor.world.pos.y - this->unk_1F4, 30.0f)); } diff --git a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c index 7ab7ca164d..5b24bc47e5 100644 --- a/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c +++ b/src/overlays/actors/ovl_En_Ishi/z_en_ishi.c @@ -112,14 +112,14 @@ void EnIshi_InitCollider(Actor* thisx, PlayState* play) { s32 EnIshi_SnapToFloor(EnIshi* this, PlayState* play, f32 arg2) { CollisionPoly* poly; - Vec3f pos; + Vec3f checkPos; s32 bgId; f32 floorY; - pos.x = this->actor.world.pos.x; - pos.y = this->actor.world.pos.y + 30.0f; - pos.z = this->actor.world.pos.z; - floorY = BgCheck_EntityRaycastFloor4(&play->colCtx, &poly, &bgId, &this->actor, &pos); + checkPos.x = this->actor.world.pos.x; + checkPos.y = this->actor.world.pos.y + 30.0f; + checkPos.z = this->actor.world.pos.z; + floorY = BgCheck_EntityRaycastDown4(&play->colCtx, &poly, &bgId, &this->actor, &checkPos); if (floorY > BGCHECK_Y_MIN) { this->actor.world.pos.y = floorY + arg2; Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.world.pos); diff --git a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c index e2f691e0af..0110d2ee19 100644 --- a/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c +++ b/src/overlays/actors/ovl_En_Kusa/z_en_kusa.c @@ -99,7 +99,7 @@ void EnKusa_SetupAction(EnKusa* this, EnKusaActionFunc actionFunc) { s32 EnKusa_SnapToFloor(EnKusa* this, PlayState* play, f32 yOffset) { s32 pad; - CollisionPoly* poly; + CollisionPoly* groundPoly; Vec3f pos; s32 bgId; f32 floorY; @@ -108,7 +108,7 @@ s32 EnKusa_SnapToFloor(EnKusa* this, PlayState* play, f32 yOffset) { pos.y = this->actor.world.pos.y + 30.0f; pos.z = this->actor.world.pos.z; - floorY = BgCheck_EntityRaycastFloor4(&play->colCtx, &poly, &bgId, &this->actor, &pos); + floorY = BgCheck_EntityRaycastDown4(&play->colCtx, &groundPoly, &bgId, &this->actor, &pos); if (floorY > BGCHECK_Y_MIN) { this->actor.world.pos.y = floorY + yOffset; diff --git a/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c b/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c index f04a4d3a2d..b6803702ad 100644 --- a/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c +++ b/src/overlays/actors/ovl_En_Nwc/z_en_nwc.c @@ -74,7 +74,7 @@ void EnNwc_ChickNoop(EnNwcChick* chick, EnNwc* this, PlayState* play) { } void EnNwc_ChickBgCheck(EnNwcChick* chick, PlayState* play) { - CollisionPoly* outPoly; + CollisionPoly* groundPoly; s32 bgId; Vec3f outPos; f32 dy; @@ -90,7 +90,7 @@ void EnNwc_ChickBgCheck(EnNwcChick* chick, PlayState* play) { //! @bug The use of outPos here is totally wrong. Even if it didn't get overwritten // by the wall check, it should add an offset to the y-value so the raycast // doesn't go through the floor and cause the chicks to ignore all floors. - chick->floorY = BgCheck_EntityRaycastFloor3(&play->colCtx, &outPoly, &bgId, &outPos); + chick->floorY = BgCheck_EntityRaycastDown3(&play->colCtx, &groundPoly, &bgId, &outPos); dy = chick->floorY - chick->pos.y; if ((0.0f <= dy) && (dy < 40.0f)) { chick->pos.y = chick->floorY; diff --git a/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c b/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c index 9bab150750..e8eec1126d 100644 --- a/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c +++ b/src/overlays/actors/ovl_En_Okuta/z_en_okuta.c @@ -133,7 +133,7 @@ void EnOkuta_Init(Actor* thisx, PlayState* play) { this->numShots = 1; } thisx->floorHeight = - BgCheck_EntityRaycastFloor4(&play->colCtx, &thisx->floorPoly, &floorBgId, thisx, &thisx->world.pos); + BgCheck_EntityRaycastDown4(&play->colCtx, &thisx->floorPoly, &floorBgId, thisx, &thisx->world.pos); //! @bug calls WaterBox_GetSurfaceImpl directly if (!WaterBox_GetSurfaceImpl(play, &play->colCtx, thisx->world.pos.x, thisx->world.pos.z, &ySurface, &outWaterBox) || diff --git a/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c b/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c index 688f1d8853..cd803523d4 100644 --- a/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c +++ b/src/overlays/actors/ovl_En_Po_Field/z_en_po_field.c @@ -424,8 +424,8 @@ void EnPoField_WaitForSpawn(EnPoField* this, PlayState* play) { this->actor.world.pos.x = Math_SinS(player->actor.shape.rot.y) * spawnDist + player->actor.world.pos.x; this->actor.world.pos.z = Math_CosS(player->actor.shape.rot.y) * spawnDist + player->actor.world.pos.z; this->actor.world.pos.y = player->actor.world.pos.y + 1000.0f; - this->actor.world.pos.y = BgCheck_EntityRaycastFloor4(&play->colCtx, &this->actor.floorPoly, &bgId, - &this->actor, &this->actor.world.pos); + this->actor.world.pos.y = BgCheck_EntityRaycastDown4(&play->colCtx, &this->actor.floorPoly, &bgId, + &this->actor, &this->actor.world.pos); if (this->actor.world.pos.y != BGCHECK_Y_MIN) { this->actor.shape.rot.y = Actor_WorldYawTowardActor(&this->actor, &player->actor); EnPoField_SetupAppear(this); diff --git a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c index e1b0f7f1dc..1ea543a43d 100644 --- a/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c +++ b/src/overlays/actors/ovl_En_Po_Sisters/z_en_po_sisters.c @@ -1195,14 +1195,14 @@ void EnPoSisters_Update(Actor* thisx, PlayState* play) { Actor_UpdateBgCheckInfo(play, &this->actor, 20.0f, 20.0f, 0.0f, UPDBGCHECKINFO_FLAG_0 | UPDBGCHECKINFO_FLAG_2); } else { - Vec3f vec; - s32 sp34; + Vec3f checkPos; + s32 bgId; - vec.x = this->actor.world.pos.x; - vec.y = this->actor.world.pos.y + 10.0f; - vec.z = this->actor.world.pos.z; + checkPos.x = this->actor.world.pos.x; + checkPos.y = this->actor.world.pos.y + 10.0f; + checkPos.z = this->actor.world.pos.z; this->actor.floorHeight = - BgCheck_EntityRaycastFloor4(&play->colCtx, &this->actor.floorPoly, &sp34, &this->actor, &vec); + BgCheck_EntityRaycastDown4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &checkPos); } Collider_UpdateCylinder(&this->actor, &this->collider); diff --git a/src/overlays/actors/ovl_En_Poh/z_en_poh.c b/src/overlays/actors/ovl_En_Poh/z_en_poh.c index 746dc74541..93e7a7857e 100644 --- a/src/overlays/actors/ovl_En_Poh/z_en_poh.c +++ b/src/overlays/actors/ovl_En_Poh/z_en_poh.c @@ -984,8 +984,8 @@ void func_80AE089C(EnPoh* this) { void EnPoh_UpdateLiving(Actor* thisx, PlayState* play) { EnPoh* this = (EnPoh*)thisx; s32 pad; - Vec3f vec; - s32 sp38; + Vec3f checkPos; + s32 bgId; if (this->colliderSph.base.atFlags & AT_HIT) { this->colliderSph.base.atFlags &= ~AT_HIT; @@ -1013,11 +1013,11 @@ void EnPoh_UpdateLiving(Actor* thisx, PlayState* play) { this->actor.shape.rot.y = this->actor.world.rot.y; } } - vec.x = this->actor.world.pos.x; - vec.y = this->actor.world.pos.y + 20.0f; - vec.z = this->actor.world.pos.z; + checkPos.x = this->actor.world.pos.x; + checkPos.y = this->actor.world.pos.y + 20.0f; + checkPos.z = this->actor.world.pos.z; this->actor.floorHeight = - BgCheck_EntityRaycastFloor4(&play->colCtx, &this->actor.floorPoly, &sp38, &this->actor, &vec); + BgCheck_EntityRaycastDown4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &checkPos); func_80AE089C(this); this->actor.shape.shadowAlpha = this->lightColor.a; } diff --git a/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c b/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c index c55be8f1a1..66e0a60591 100644 --- a/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c +++ b/src/overlays/actors/ovl_En_River_Sound/z_en_river_sound.c @@ -204,7 +204,7 @@ void EnRiverSound_Update(Actor* thisx, PlayState* play) { pos = &thisx->world.pos; if (EnRiverSound_GetSfxPos(SEGMENTED_TO_VIRTUAL(path->points), path->count, &player->actor.world.pos, pos)) { - if (BgCheck_EntityRaycastFloor4(&play->colCtx, &thisx->floorPoly, &bgId, thisx, pos) != BGCHECK_Y_MIN) { + if (BgCheck_EntityRaycastDown4(&play->colCtx, &thisx->floorPoly, &bgId, thisx, pos) != BGCHECK_Y_MIN) { // Get the river sfx frequency based on the speed of the river current under the actor this->sfxFreqIndex = SurfaceType_GetConveyorSpeed(&play->colCtx, thisx->floorPoly, bgId); } else { diff --git a/src/overlays/actors/ovl_En_Vali/z_en_vali.c b/src/overlays/actors/ovl_En_Vali/z_en_vali.c index b77d2da75c..697b31d86c 100644 --- a/src/overlays/actors/ovl_En_Vali/z_en_vali.c +++ b/src/overlays/actors/ovl_En_Vali/z_en_vali.c @@ -156,7 +156,7 @@ void EnVali_Init(Actor* thisx, PlayState* play) { this->actor.flags &= ~ACTOR_FLAG_0; this->actor.floorHeight = - BgCheck_EntityRaycastFloor4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &this->actor.world.pos); + BgCheck_EntityRaycastDown4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &this->actor.world.pos); this->actor.params = BARI_TYPE_NORMAL; if (this->actor.floorHeight == BGCHECK_Y_MIN) { diff --git a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c index cdc209d0c1..f0f256b5ca 100644 --- a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c +++ b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.c @@ -5,6 +5,7 @@ */ #include "z_en_viewer.h" +#include "overlays/actors/ovl_Boss_Ganon/z_boss_ganon.h" #include "overlays/actors/ovl_En_Ganon_Mant/z_en_ganon_mant.h" #include "assets/objects/object_zl4/object_zl4.h" #include "assets/objects/gameplay_keep/gameplay_keep.h" @@ -57,26 +58,26 @@ static EnViewerInitData sInitData[] = { { OBJECT_ZL4, OBJECT_OPENING_DEMO1, 1, 0, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_ZELDA, &gChildZeldaSkel, &object_opening_demo1_Anim_000450 }, /* ENVIEWER_TYPE_3_GANONDORF */ - { OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &object_gndd_Skel_0119E8, - &object_gndd_Anim_002928 }, + { OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &gYoungGanondorfSkel, + &gYoungGanondorfHorsebackIdleAnim }, /* ENVIEWER_TYPE_4_HORSE_GANONDORF */ { OBJECT_HORSE_GANON, OBJECT_HORSE_GANON, 1, 0, ENVIEWER_SHADOW_HORSE, 20, ENVIEWER_DRAW_HORSE, &gHorseGanonSkel, &gHorseGanonRearingAnim }, /* ENVIEWER_TYPE_5_GANONDORF */ - { OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &object_gndd_Skel_0119E8, - &object_gndd_Anim_0005B4 }, + { OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &gYoungGanondorfSkel, + &gYoungGanondorfHorsebackRideAnim }, /* ENVIEWER_TYPE_6_HORSE_GANONDORF */ { OBJECT_HORSE_GANON, OBJECT_HORSE_GANON, 1, 0, ENVIEWER_SHADOW_HORSE, 20, ENVIEWER_DRAW_HORSE, &gHorseGanonSkel, &gHorseGanonGallopingAnim }, /* ENVIEWER_TYPE_7_GANONDORF */ - { OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &object_gndd_Skel_0119E8, - &object_gndd_Anim_004260 }, + { OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &gYoungGanondorfSkel, + &gYoungGanondorfArmsCrossedAnim }, /* ENVIEWER_TYPE_8_GANONDORF */ - { OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &object_gndd_Skel_0119E8, - &object_gndd_Anim_0050A8 }, + { OBJECT_GNDD, OBJECT_GNDD, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &gYoungGanondorfSkel, + &gYoungGanondorfWalkAnim }, /* ENVIEWER_TYPE_9_GANONDORF */ - { OBJECT_GANON, OBJECT_GANON, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &gDorfSkel, - &object_ganon_Anim_011348 }, + { OBJECT_GANON, OBJECT_GANON, 1, -6, ENVIEWER_SHADOW_NONE, 10, ENVIEWER_DRAW_GANONDORF, &gGanondorfSkel, + &gGanondorfEndingFloatAnim }, }; static EnGanonMant* sGanondorfCape; @@ -281,8 +282,8 @@ void EnViewer_UpdateImpl(EnViewer* this, PlayState* play) { if (play->csCtx.state != CS_STATE_IDLE && play->csCtx.npcActions[1] != NULL) { if (play->csCtx.npcActions[1]->action == 2 && sTimer == 0) { if (type == ENVIEWER_TYPE_3_GANONDORF) { - if (this->skin.skelAnime.animation != &object_gndd_Anim_002928) { - Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &object_gndd_Anim_002928, 1.0f); + if (this->skin.skelAnime.animation != &gYoungGanondorfHorsebackIdleAnim) { + Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &gYoungGanondorfHorsebackIdleAnim, 1.0f); } } else if (this->skin.skelAnime.animation != &gHorseGanonIdleAnim) { Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &gHorseGanonIdleAnim, 1.0f); @@ -290,8 +291,8 @@ void EnViewer_UpdateImpl(EnViewer* this, PlayState* play) { } else if (play->csCtx.npcActions[1]->action == 1) { sTimer = 100; if (type == ENVIEWER_TYPE_3_GANONDORF) { - if (this->skin.skelAnime.animation != &object_gndd_Anim_001D28) { - Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &object_gndd_Anim_001D28, 1.0f); + if (this->skin.skelAnime.animation != &gYoungGanondorfHorsebackRearAnim) { + Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &gYoungGanondorfHorsebackRearAnim, 1.0f); } } else if (this->skin.skelAnime.animation != &gHorseGanonRearingAnim) { Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &gHorseGanonRearingAnim, 1.0f); @@ -300,44 +301,49 @@ void EnViewer_UpdateImpl(EnViewer* this, PlayState* play) { switch (this->state) { case 0: if (play->csCtx.npcActions[1]->action == 4) { - Animation_MorphToPlayOnce(&this->skin.skelAnime, &object_gndd_Anim_000F54, -5.0f); + Animation_MorphToPlayOnce(&this->skin.skelAnime, + &gYoungGanondorfHorsebackLookSidewaysStartAnim, -5.0f); this->state++; } break; case 1: if (animationEnded) { - Animation_MorphToLoop(&this->skin.skelAnime, &object_gndd_Anim_0014F4, -5.0f); + Animation_MorphToLoop(&this->skin.skelAnime, &gYoungGanondorfHorsebackLookSidewaysLoopAnim, + -5.0f); this->state++; } break; case 2: if (play->csCtx.npcActions[1]->action == 5) { - Animation_MorphToPlayOnce(&this->skin.skelAnime, &object_gndd_Anim_0008A0, -5.0f); + Animation_MorphToPlayOnce(&this->skin.skelAnime, + &gYoungGanondorfHorsebackMagicChargeUpStartAnim, -5.0f); this->state++; } break; case 3: if (animationEnded) { - Animation_MorphToLoop(&this->skin.skelAnime, &object_gndd_Anim_000BC8, -5.0f); + Animation_MorphToLoop(&this->skin.skelAnime, &gYoungGanondorfHorsebackMagicChargeUpLoopAnim, + -5.0f); this->state++; } break; case 4: if (play->csCtx.npcActions[1]->action == 11) { - Animation_MorphToLoop(&this->skin.skelAnime, &object_gndd_Anim_0014F4, -20.0f); + Animation_MorphToLoop(&this->skin.skelAnime, &gYoungGanondorfHorsebackLookSidewaysLoopAnim, + -20.0f); this->state++; } break; case 5: if (play->csCtx.npcActions[1]->action == 8) { - Animation_MorphToLoop(&this->skin.skelAnime, &object_gndd_Anim_002928, -15.0f); + Animation_MorphToLoop(&this->skin.skelAnime, &gYoungGanondorfHorsebackIdleAnim, -15.0f); this->state++; } break; case 6: if (play->csCtx.npcActions[1]->action == 12) { Audio_PlayActorSfx2(&this->actor, NA_SE_EN_GANON_VOICE_DEMO); - Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &object_gndd_Anim_0005B4, 3.0f); + Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &gYoungGanondorfHorsebackRideAnim, 3.0f); this->state++; } break; @@ -432,13 +438,13 @@ void EnViewer_UpdateImpl(EnViewer* this, PlayState* play) { play->csCtx.npcActions[1]->action == 7) { Audio_PlaySfxGeneral(NA_SE_EN_GANON_LAUGH, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - Animation_MorphToPlayOnce(&this->skin.skelAnime, &object_gndd_Anim_004534, -5.0f); + Animation_MorphToPlayOnce(&this->skin.skelAnime, &gYoungGanondorfLaughStartAnim, -5.0f); this->state++; } break; case 1: if (animationEnded) { - Animation_MorphToLoop(&this->skin.skelAnime, &object_gndd_Anim_0048B0, -5.0f); + Animation_MorphToLoop(&this->skin.skelAnime, &gYoungGanondorfLaughLoopAnim, -5.0f); this->state++; } break; @@ -448,26 +454,26 @@ void EnViewer_UpdateImpl(EnViewer* this, PlayState* play) { case 0: if (play->csCtx.state != CS_STATE_IDLE) { if (play->csCtx.npcActions[1] != NULL && play->csCtx.npcActions[1]->action == 9) { - Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &object_gndd_Anim_0050A8, 1.0f); + Animation_PlayLoopSetSpeed(&this->skin.skelAnime, &gYoungGanondorfWalkAnim, 1.0f); this->state++; } } break; case 1: if (play->csCtx.npcActions[1]->action == 10) { - Animation_MorphToPlayOnce(&this->skin.skelAnime, &object_gndd_Anim_003284, -10.0f); + Animation_MorphToPlayOnce(&this->skin.skelAnime, &gYoungGanondorfKneelStartAnim, -10.0f); this->state++; } break; case 2: if (animationEnded) { - Animation_MorphToLoop(&this->skin.skelAnime, &object_gndd_Anim_003D84, -5.0f); + Animation_MorphToLoop(&this->skin.skelAnime, &gYoungGanondorfKneelLoopAnim, -5.0f); this->state++; } break; case 3: if (play->csCtx.npcActions[1]->action == 4) { - Animation_MorphToPlayOnce(&this->skin.skelAnime, &object_gndd_Anim_003428, -5.0f); + Animation_MorphToPlayOnce(&this->skin.skelAnime, &gYoungGanondorfKneelLookSidewaysAnim, -5.0f); this->state++; } break; @@ -489,14 +495,14 @@ s32 EnViewer_Ganondorf3OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dL void* thisx) { if (gSaveContext.sceneLayer == 4) { if (play->csCtx.frames >= 400) { - if (limbIndex == 5) { - *dList = object_gndd_DL_00E1A8; + if (limbIndex == YOUNG_GANONDORF_LIMB_LEFT_HAND) { + *dList = gYoungGanondorfOpenLeftHandDL; } } } else { if (play->csCtx.frames >= 1510 && play->csCtx.frames <= 1650) { - if (limbIndex == 5) { - *dList = object_gndd_DL_00E1A8; + if (limbIndex == YOUNG_GANONDORF_LIMB_LEFT_HAND) { + *dList = gYoungGanondorfOpenLeftHandDL; } } } @@ -504,12 +510,12 @@ s32 EnViewer_Ganondorf3OverrideLimbDraw(PlayState* play, s32 limbIndex, Gfx** dL } void EnViewer_Ganondorf9PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { - if (limbIndex == 11) { + if (limbIndex == GANONDORF_LIMB_JEWEL) { OPEN_DISPS(play->state.gfxCtx, "../z_en_viewer.c", 1365); Gfx_SetupDL_25Xlu(play->state.gfxCtx); gSPMatrix(POLY_XLU_DISP++, Matrix_NewMtx(play->state.gfxCtx, "../z_en_viewer.c", 1370), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); - gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(object_ganon_DL_00BE90)); + gSPDisplayList(POLY_XLU_DISP++, SEGMENTED_TO_VIRTUAL(gGanondorfEyesDL)); CLOSE_DISPS(play->state.gfxCtx, "../z_en_viewer.c", 1372); } } @@ -517,7 +523,7 @@ void EnViewer_Ganondorf9PostLimbDraw(PlayState* play, s32 limbIndex, Gfx** dList void EnViewer_GanondorfPostLimbDrawUpdateCapeVec(PlayState* play, s32 limbIndex, Gfx** dList, Vec3s* rot, void* thisx) { static Vec3f zeroVec = { 0.0f, 0.0f, 0.0f }; - if (limbIndex == 15) { + if (limbIndex == YOUNG_GANONDORF_LIMB_HEAD) { Matrix_MultVec3f(&zeroVec, &sGanondorfNeckWorldPos); } } @@ -535,23 +541,23 @@ void EnViewer_DrawGanondorf(EnViewer* this, PlayState* play) { } if (frames + 1127 >= play->csCtx.frames) { - gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F178)); - gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F178)); + gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeOpenTex)); + gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeOpenTex)); } else if (frames + 1128 >= play->csCtx.frames) { - gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F378)); - gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F378)); + gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeHalfTex)); + gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeHalfTex)); } else if (frames + 1129 >= play->csCtx.frames) { - gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F578)); - gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F578)); + gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeClosedTex)); + gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeClosedTex)); } else { - gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F778)); - gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&object_gndd_Tex_00F778)); + gSPSegment(POLY_OPA_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeLookingDownTex)); + gSPSegment(POLY_OPA_DISP++, 0x09, SEGMENTED_TO_VIRTUAL(&gYoungGanondorfEyeLookingDownTex)); } } else if (type == ENVIEWER_TYPE_9_GANONDORF) { - gSPSegment(POLY_XLU_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&object_ganon_Tex_00A4E0)); + gSPSegment(POLY_XLU_DISP++, 0x08, SEGMENTED_TO_VIRTUAL(&gGanondorfCrazedEyeTex)); } if (type == ENVIEWER_TYPE_9_GANONDORF) { diff --git a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.h b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.h index 6d4cf91200..c24e0ff838 100644 --- a/src/overlays/actors/ovl_En_Viewer/z_en_viewer.h +++ b/src/overlays/actors/ovl_En_Viewer/z_en_viewer.h @@ -58,6 +58,34 @@ typedef struct { /* 0x30 */ u8 state; } EnViewerFireEffect; // size = 0x34 +typedef enum { + /* 0 */ YOUNG_GANONDORF_LIMB_NONE, + /* 1 */ YOUNG_GANONDORF_LIMB_ROOT, + /* 2 */ YOUNG_GANONDORF_LIMB_TORSO, + /* 3 */ YOUNG_GANONDORF_LIMB_LEFT_UPPER_ARM, + /* 4 */ YOUNG_GANONDORF_LIMB_LEFT_FOREARM, + /* 5 */ YOUNG_GANONDORF_LIMB_LEFT_HAND, + /* 6 */ YOUNG_GANONDORF_LIMB_RIGHT_UPPER_ARM, + /* 7 */ YOUNG_GANONDORF_LIMB_RIGHT_FOREARM, + /* 8 */ YOUNG_GANONDORF_LIMB_RIGHT_HAND, + /* 9 */ YOUNG_GANONDORF_LIMB_JEWEL, + /* 10 */ YOUNG_GANONDORF_LIMB_LEFT_UPPER_LIP, + /* 11 */ YOUNG_GANONDORF_LIMB_JAW, + /* 12 */ YOUNG_GANONDORF_LIMB_CHIN, + /* 13 */ YOUNG_GANONDORF_LIMB_RIGHT_UPPER_LIP, + /* 14 */ YOUNG_GANONDORF_LIMB_TEETH, + /* 15 */ YOUNG_GANONDORF_LIMB_HEAD, + /* 16 */ YOUNG_GANONDORF_LIMB_PELVIS, + /* 17 */ YOUNG_GANONDORF_LIMB_LEFT_THIGH, + /* 18 */ YOUNG_GANONDORF_LIMB_LEFT_SHIN, + /* 19 */ YOUNG_GANONDORF_LIMB_LEFT_FOOT, + /* 20 */ YOUNG_GANONDORF_LIMB_KNIFE, + /* 21 */ YOUNG_GANONDORF_LIMB_RIGHT_THIGH, + /* 22 */ YOUNG_GANONDORF_LIMB_RIGHT_SHIN, + /* 23 */ YOUNG_GANONDORF_LIMB_RIGHT_FOOT, + /* 24 */ YOUNG_GANONDORF_LIMB_MAX +} YoungGanondorfLimb; + typedef struct EnViewer { /* 0x0000 */ Actor actor; /* 0x014C */ Skin skin; diff --git a/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c b/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c index da9ed88c36..7a9aa3a7d7 100644 --- a/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c +++ b/src/overlays/actors/ovl_En_Weiyer/z_en_weiyer.c @@ -218,7 +218,7 @@ void func_80B32804(EnWeiyer* this, PlayState* play) { this->actor.world.pos.y += 0.5f; this->actor.floorHeight = - BgCheck_EntityRaycastFloor4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &this->actor.world.pos); + BgCheck_EntityRaycastDown4(&play->colCtx, &this->actor.floorPoly, &bgId, &this->actor, &this->actor.world.pos); if (!WaterBox_GetSurfaceImpl(play, &play->colCtx, this->actor.world.pos.x, this->actor.world.pos.z, &this->actor.home.pos.y, &waterBox) || diff --git a/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c b/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c index 2f6b6b0b54..0de5eb0265 100644 --- a/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c +++ b/src/overlays/actors/ovl_En_Wood02/z_en_wood02.c @@ -162,7 +162,7 @@ void EnWood02_Init(Actor* thisx, PlayState* play2) { f32 actorScale; PlayState* play = play2; EnWood02* this = (EnWood02*)thisx; - CollisionPoly* outPoly; + CollisionPoly* poly; s32 bgId; f32 floorY; s16 extraRot; @@ -280,7 +280,7 @@ void EnWood02_Init(Actor* thisx, PlayState* play2) { // Snap to floor, or remove if over void this->actor.world.pos.y += 200.0f; - floorY = BgCheck_EntityRaycastFloor4(&play->colCtx, &outPoly, &bgId, &this->actor, &this->actor.world.pos); + floorY = BgCheck_EntityRaycastDown4(&play->colCtx, &poly, &bgId, &this->actor, &this->actor.world.pos); if (floorY > BGCHECK_Y_MIN) { this->actor.world.pos.y = floorY; diff --git a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c index 083c67a663..55502e6be1 100644 --- a/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c +++ b/src/overlays/actors/ovl_Obj_Bean/z_obj_bean.c @@ -151,14 +151,14 @@ void ObjBean_InitDynaPoly(ObjBean* this, PlayState* play, CollisionHeader* colli } void ObjBean_FindFloor(ObjBean* this, PlayState* play) { - Vec3f vec; - s32 sp20; + Vec3f checkPos; + s32 bgId; - vec.x = this->dyna.actor.world.pos.x; - vec.y = this->dyna.actor.world.pos.y + 29.999998f; - vec.z = this->dyna.actor.world.pos.z; + checkPos.x = this->dyna.actor.world.pos.x; + checkPos.y = this->dyna.actor.world.pos.y + 29.999998f; + checkPos.z = this->dyna.actor.world.pos.z; this->dyna.actor.floorHeight = - BgCheck_EntityRaycastFloor4(&play->colCtx, &this->dyna.actor.floorPoly, &sp20, &this->dyna.actor, &vec); + BgCheck_EntityRaycastDown4(&play->colCtx, &this->dyna.actor.floorPoly, &bgId, &this->dyna.actor, &checkPos); } void func_80B8EBC8(ObjBean* this) { diff --git a/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c b/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c index 5e33f6c36e..172d96145c 100644 --- a/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c +++ b/src/overlays/actors/ovl_Obj_Lift/z_obj_lift.c @@ -189,13 +189,13 @@ void func_80B967C0(ObjLift* this) { void func_80B96840(ObjLift* this, PlayState* play) { s32 pad; s32 bgId; - Vec3f sp2C; + Vec3f pos; Actor_MoveForward(&this->dyna.actor); - Math_Vec3f_Copy(&sp2C, &this->dyna.actor.prevPos); - sp2C.y += sMaxFallDistances[(this->dyna.actor.params >> 1) & 1]; + Math_Vec3f_Copy(&pos, &this->dyna.actor.prevPos); + pos.y += sMaxFallDistances[(this->dyna.actor.params >> 1) & 1]; this->dyna.actor.floorHeight = - BgCheck_EntityRaycastFloor4(&play->colCtx, &this->dyna.actor.floorPoly, &bgId, &this->dyna.actor, &sp2C); + BgCheck_EntityRaycastDown4(&play->colCtx, &this->dyna.actor.floorPoly, &bgId, &this->dyna.actor, &pos); if ((this->dyna.actor.floorHeight - this->dyna.actor.world.pos.y) >= (sMaxFallDistances[(this->dyna.actor.params >> 1) & 1] - 0.001f)) { diff --git a/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c b/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c index 60b80fd0ce..f1c6d6df90 100644 --- a/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c +++ b/src/overlays/actors/ovl_Obj_Oshihiki/z_obj_oshihiki.c @@ -333,7 +333,7 @@ void ObjOshihiki_SetFloors(ObjOshihiki* this, PlayState* play) { floorPoly = &this->floorPolys[i]; floorBgId = &this->floorBgIds[i]; this->floorHeights[i] = - BgCheck_EntityRaycastFloor6(&play->colCtx, floorPoly, floorBgId, &this->dyna.actor, &colCheckPoint, 0.0f); + BgCheck_EntityRaycastDown6(&play->colCtx, floorPoly, floorBgId, &this->dyna.actor, &colCheckPoint, 0.0f); } } diff --git a/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c index c8fe29cc95..1d2d25d0d5 100644 --- a/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c +++ b/src/overlays/actors/ovl_Obj_Tsubo/z_obj_tsubo.c @@ -98,17 +98,17 @@ void ObjTsubo_ApplyGravity(ObjTsubo* this) { } s32 ObjTsubo_SnapToFloor(ObjTsubo* this, PlayState* play) { - CollisionPoly* floorPoly; + CollisionPoly* groundPoly; Vec3f pos; - s32 bgID; - f32 floorY; + s32 bgId; + f32 groundY; pos.x = this->actor.world.pos.x; pos.y = this->actor.world.pos.y + 20.0f; pos.z = this->actor.world.pos.z; - floorY = BgCheck_EntityRaycastFloor4(&play->colCtx, &floorPoly, &bgID, &this->actor, &pos); - if (floorY > BGCHECK_Y_MIN) { - this->actor.world.pos.y = floorY; + groundY = BgCheck_EntityRaycastDown4(&play->colCtx, &groundPoly, &bgId, &this->actor, &pos); + if (groundY > BGCHECK_Y_MIN) { + this->actor.world.pos.y = groundY; Math_Vec3f_Copy(&this->actor.home.pos, &this->actor.world.pos); return true; } else { diff --git a/src/overlays/actors/ovl_player_actor/z_player.c b/src/overlays/actors/ovl_player_actor/z_player.c index d4b17efa64..b82f11ce93 100644 --- a/src/overlays/actors/ovl_player_actor/z_player.c +++ b/src/overlays/actors/ovl_player_actor/z_player.c @@ -4274,7 +4274,7 @@ Actor* Player_SpawnFairy(PlayState* play, Player* this, Vec3f* arg2, Vec3f* arg3 f32 func_808396F4(PlayState* play, Player* this, Vec3f* arg2, Vec3f* arg3, CollisionPoly** arg4, s32* arg5) { func_808395DC(this, &this->actor.world.pos, arg2, arg3); - return BgCheck_EntityRaycastFloor3(&play->colCtx, arg4, arg5, arg3); + return BgCheck_EntityRaycastDown3(&play->colCtx, arg4, arg5, arg3); } f32 func_8083973C(PlayState* play, Player* this, Vec3f* arg2, Vec3f* arg3) { @@ -4309,8 +4309,8 @@ s32 func_80839800(Player* this, PlayState* play) { s32 frontRoom; Actor* attachedActor; LinkAnimationHeader* sp5C; - CollisionPoly* sp58; - Vec3f sp4C; + CollisionPoly* groundPoly; + Vec3f checkPos; if ((this->doorType != PLAYER_DOORTYPE_NONE) && (!(this->stateFlags1 & PLAYER_STATE1_11) || @@ -4428,13 +4428,14 @@ s32 func_80839800(Player* this, PlayState* play) { Actor_DisableLens(play); if (ENDOOR_GET_TYPE(doorActor) == DOOR_SCENEEXIT) { - sp4C.x = doorActor->world.pos.x - (sp6C * sp74); - sp4C.y = doorActor->world.pos.y + 10.0f; - sp4C.z = doorActor->world.pos.z - (sp6C * sp78); + checkPos.x = doorActor->world.pos.x - (sp6C * sp74); + checkPos.y = doorActor->world.pos.y + 10.0f; + checkPos.z = doorActor->world.pos.z - (sp6C * sp78); - BgCheck_EntityRaycastFloor1(&play->colCtx, &sp58, &sp4C); + BgCheck_EntityRaycastDown1(&play->colCtx, &groundPoly, &checkPos); - if (func_80839034(play, this, sp58, BGCHECK_SCENE)) { + //! @bug groundPoly's bgId is not guaranteed to be BGCHECK_SCENE + if (func_80839034(play, this, groundPoly, BGCHECK_SCENE)) { gSaveContext.entranceSpeed = 2.0f; gSaveContext.entranceSound = NA_SE_OC_DOOR_OPEN; } @@ -9766,7 +9767,7 @@ void func_80847BA0(PlayState* play, Player* this) { f32 wallPolyNormalY = COLPOLY_GET_NORMAL(wallPoly->normal.y); f32 wallPolyNormalZ = COLPOLY_GET_NORMAL(wallPoly->normal.z); f32 wallHeight; - CollisionPoly* sp7C; + CollisionPoly* groundPoly; CollisionPoly* sp78; s32 sp74; Vec3f sp68; @@ -9782,7 +9783,7 @@ void func_80847BA0(PlayState* play, Player* this) { sp68.z = this->actor.world.pos.z - (spB0 * wallPolyNormalZ); sp68.y = this->actor.world.pos.y + this->ageProperties->unk_0C; - sp64 = BgCheck_EntityRaycastFloor1(&play->colCtx, &sp7C, &sp68); + sp64 = BgCheck_EntityRaycastDown1(&play->colCtx, &groundPoly, &sp68); wallHeight = sp64 - this->actor.world.pos.y; this->wallHeight = wallHeight; @@ -9800,7 +9801,7 @@ void func_80847BA0(PlayState* play, Player* this) { this->wallHeight = 399.96002f; } else if (SurfaceType_CheckWallFlag0(&play->colCtx, wallPoly, this->actor.wallBgId) == 0) { if (this->ageProperties->unk_1C <= this->wallHeight) { - if (ABS(sp7C->normal.y) > 28000) { + if (ABS(groundPoly->normal.y) > 28000) { if (this->ageProperties->unk_14 <= this->wallHeight) { spC7 = 4; } else if (this->ageProperties->unk_18 <= this->wallHeight) { @@ -11386,7 +11387,7 @@ static struct_80832924 D_808548A8[] = { void func_8084C5F8(Player* this, PlayState* play) { s32 temp; f32* sp38; - CollisionPoly* sp34; + CollisionPoly* groundPoly; s32 sp30; Vec3f sp24; @@ -11416,8 +11417,8 @@ void func_8084C5F8(Player* this, PlayState* play) { sp24.x = this->actor.world.pos.x; sp24.y = this->actor.world.pos.y + 20.0f; sp24.z = this->actor.world.pos.z; - if (BgCheck_EntityRaycastFloor3(&play->colCtx, &sp34, &sp30, &sp24) != 0.0f) { - this->unk_89E = SurfaceType_GetSfxType(&play->colCtx, sp34, sp30); + if (BgCheck_EntityRaycastDown3(&play->colCtx, &groundPoly, &sp30, &sp24) != 0.0f) { + this->unk_89E = SurfaceType_GetSfxType(&play->colCtx, groundPoly, sp30); func_808328A0(this); } } diff --git a/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c b/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c index 0ac1b73e02..dabe791b77 100644 --- a/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c +++ b/src/overlays/effects/ovl_Effect_Ss_Dead_Ds/z_eff_ss_dead_ds.c @@ -51,9 +51,9 @@ void EffectSsDeadDs_Draw(PlayState* play, u32 index, EffectSs* this) { s32 pad1; s32 pad2; MtxF mf; - f32 temp; + f32 yIntersect; Vec3f pos; - CollisionPoly* floorPoly; + CollisionPoly* groundPoly; OPEN_DISPS(play->state.gfxCtx, "../z_eff_ss_dead_ds.c", 157); @@ -65,21 +65,21 @@ void EffectSsDeadDs_Draw(PlayState* play, u32 index, EffectSs* this) { if (this->rTimer == 0) { Vec3s rpy; - Vec3f sp44; + Vec3f prevPos; - sp44.x = pos.x - this->velocity.x; - sp44.y = pos.y - this->velocity.y; - sp44.z = pos.z - this->velocity.z; + prevPos.x = pos.x - this->velocity.x; + prevPos.y = pos.y - this->velocity.y; + prevPos.z = pos.z - this->velocity.z; - if (BgCheck_EntitySphVsWall1(&play->colCtx, &this->pos, &pos, &sp44, 1.5f, &floorPoly, 1.0f)) { - func_80038A28(floorPoly, this->pos.x, this->pos.y, this->pos.z, &mf); + if (BgCheck_EntitySphVsWall1(&play->colCtx, &this->pos, &pos, &prevPos, 1.5f, &groundPoly, 1.0f)) { + func_80038A28(groundPoly, this->pos.x, this->pos.y, this->pos.z, &mf); Matrix_Put(&mf); } else { pos.y++; - temp = BgCheck_EntityRaycastFloor1(&play->colCtx, &floorPoly, &pos); + yIntersect = BgCheck_EntityRaycastDown1(&play->colCtx, &groundPoly, &pos); - if (floorPoly != NULL) { - func_80038A28(floorPoly, this->pos.x, temp + 1.5f, this->pos.z, &mf); + if (groundPoly != NULL) { + func_80038A28(groundPoly, this->pos.x, yIntersect + 1.5f, this->pos.z, &mf); Matrix_Put(&mf); } else { Matrix_Translate(this->pos.x, this->pos.y, this->pos.z, MTXMODE_NEW); diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_choose.c b/src/overlays/gamestates/ovl_file_choose/z_file_choose.c index d614cfd167..ec1126b4d5 100644 --- a/src/overlays/gamestates/ovl_file_choose/z_file_choose.c +++ b/src/overlays/gamestates/ovl_file_choose/z_file_choose.c @@ -235,11 +235,11 @@ void FileSelect_UpdateMainMenu(GameState* thisx) { } } } else { - if (ABS(this->stickRelY) > 30) { + if (ABS(this->stickAdjY) > 30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - if (this->stickRelY > 30) { + if (this->stickAdjY > 30) { this->buttonIndex--; if (this->buttonIndex < FS_BTN_MAIN_FILE_1) { this->buttonIndex = FS_BTN_MAIN_OPTIONS; @@ -1337,7 +1337,7 @@ void FileSelect_ConfirmFile(GameState* thisx) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CLOSE, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); this->selectMode++; - } else if (ABS(this->stickRelY) >= 30) { + } else if (ABS(this->stickAdjY) >= 30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); this->confirmButtonIndex ^= 1; @@ -1611,28 +1611,28 @@ void FileSelect_Main(GameState* thisx) { Gfx_SetupFrame(this->state.gfxCtx, 0, 0, 0); - this->stickRelX = input->rel.stick_x; - this->stickRelY = input->rel.stick_y; + this->stickAdjX = input->rel.stick_x; + this->stickAdjY = input->rel.stick_y; - if (this->stickRelX < -30) { + if (this->stickAdjX < -30) { if (this->stickXDir == -1) { this->inputTimerX--; if (this->inputTimerX < 0) { this->inputTimerX = 2; } else { - this->stickRelX = 0; + this->stickAdjX = 0; } } else { this->inputTimerX = 10; this->stickXDir = -1; } - } else if (this->stickRelX > 30) { + } else if (this->stickAdjX > 30) { if (this->stickXDir == 1) { this->inputTimerX--; if (this->inputTimerX < 0) { this->inputTimerX = 2; } else { - this->stickRelX = 0; + this->stickAdjX = 0; } } else { this->inputTimerX = 10; @@ -1642,25 +1642,25 @@ void FileSelect_Main(GameState* thisx) { this->stickXDir = 0; } - if (this->stickRelY < -30) { + if (this->stickAdjY < -30) { if (this->stickYDir == -1) { this->inputTimerY -= 1; if (this->inputTimerY < 0) { this->inputTimerY = 2; } else { - this->stickRelY = 0; + this->stickAdjY = 0; } } else { this->inputTimerY = 10; this->stickYDir = -1; } - } else if (this->stickRelY > 30) { + } else if (this->stickAdjY > 30) { if (this->stickYDir == 1) { this->inputTimerY -= 1; if (this->inputTimerY < 0) { this->inputTimerY = 2; } else { - this->stickRelY = 0; + this->stickAdjY = 0; } } else { this->inputTimerY = 10; diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c b/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c index b8b6608a1d..130340cf52 100644 --- a/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c +++ b/src/overlays/gamestates/ovl_file_choose/z_file_copy_erase.c @@ -85,11 +85,11 @@ void FileSelect_SelectCopySource(GameState* thisx) { &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } } else { - if (ABS(this->stickRelY) >= 30) { + if (ABS(this->stickAdjY) >= 30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - if (this->stickRelY >= 30) { + if (this->stickAdjY >= 30) { this->buttonIndex--; if (this->buttonIndex < FS_BTN_COPY_FILE_1) { @@ -201,11 +201,11 @@ void FileSelect_SelectCopyDest(GameState* thisx) { } } else { - if (ABS(this->stickRelY) >= 30) { + if (ABS(this->stickAdjY) >= 30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - if (this->stickRelY >= 30) { + if (this->stickAdjY >= 30) { this->buttonIndex--; if (this->buttonIndex == this->selectedFileIndex) { @@ -387,7 +387,7 @@ void FileSelect_CopyConfirm(GameState* thisx) { func_800AA000(300.0f, 0xB4, 0x14, 0x64); Audio_PlaySfxGeneral(NA_SE_SY_FSEL_DECIDE_L, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - } else if (ABS(this->stickRelY) >= 30) { + } else if (ABS(this->stickAdjY) >= 30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); this->buttonIndex ^= 1; @@ -716,11 +716,11 @@ void FileSelect_EraseSelect(GameState* thisx) { &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); } } else { - if (ABS(this->stickRelY) >= 30) { + if (ABS(this->stickAdjY) >= 30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); - if (this->stickRelY >= 30) { + if (this->stickAdjY >= 30) { this->buttonIndex--; if (this->buttonIndex < FS_BTN_ERASE_FILE_1) { this->buttonIndex = FS_BTN_ERASE_QUIT; @@ -852,7 +852,7 @@ void FileSelect_EraseConfirm(GameState* thisx) { this->nextTitleLabel = FS_TITLE_ERASE_COMPLETE; func_800AA000(200.0f, 0xFF, 0x14, 0x96); sEraseDelayTimer = 15; - } else if (ABS(this->stickRelY) >= 30) { + } else if (ABS(this->stickAdjY) >= 30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); this->buttonIndex ^= 1; diff --git a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c index 21cb4b58b9..360c00175b 100644 --- a/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c +++ b/src/overlays/gamestates/ovl_file_choose/z_file_nameset_PAL.c @@ -520,7 +520,7 @@ void FileSelect_UpdateKeyboardCursor(GameState* thisx) { this->kbdButton = 99; if (this->kbdY != 5) { - if (this->stickRelX < -30) { + if (this->stickAdjX < -30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); this->charIndex--; @@ -529,7 +529,7 @@ void FileSelect_UpdateKeyboardCursor(GameState* thisx) { this->kbdX = 12; this->charIndex = (this->kbdY * 13) + this->kbdX; } - } else if (this->stickRelX > 30) { + } else if (this->stickAdjX > 30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); this->charIndex++; @@ -540,14 +540,14 @@ void FileSelect_UpdateKeyboardCursor(GameState* thisx) { } } } else { - if (this->stickRelX < -30) { + if (this->stickAdjX < -30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); this->kbdX--; if (this->kbdX < 3) { this->kbdX = 4; } - } else if (this->stickRelX > 30) { + } else if (this->stickAdjX > 30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); this->kbdX++; @@ -557,7 +557,7 @@ void FileSelect_UpdateKeyboardCursor(GameState* thisx) { } } - if (this->stickRelY > 30) { + if (this->stickAdjY > 30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); this->kbdY--; @@ -589,7 +589,7 @@ void FileSelect_UpdateKeyboardCursor(GameState* thisx) { this->charIndex += this->kbdX; } } - } else if (this->stickRelY < -30) { + } else if (this->stickAdjY < -30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); this->kbdY++; @@ -688,7 +688,7 @@ void FileSelect_UpdateOptionsMenu(GameState* thisx) { return; } - if (this->stickRelX < -30) { + if (this->stickAdjX < -30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -702,7 +702,7 @@ void FileSelect_UpdateOptionsMenu(GameState* thisx) { } else { gSaveContext.zTargetSetting ^= 1; } - } else if (this->stickRelX > 30) { + } else if (this->stickAdjX > 30) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); @@ -717,7 +717,7 @@ void FileSelect_UpdateOptionsMenu(GameState* thisx) { } } - if ((this->stickRelY < -30) || (this->stickRelY > 30)) { + if ((this->stickAdjY < -30) || (this->stickAdjY > 30)) { Audio_PlaySfxGeneral(NA_SE_SY_FSEL_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); sSelectedSetting ^= 1; diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c index 306feed39e..0398cf07fe 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_collect.c @@ -384,6 +384,10 @@ void KaleidoScope_DrawQuestStatus(PlayState* play, GraphicsContext* gfxCtx) { // QUEST_MEDALLION_FOREST, QUEST_MEDALLION_FIRE, QUEST_MEDALLION_WATER, QUEST_MEDALLION_SPIRIT, // QUEST_MEDALLION_SHADOW, QUEST_MEDALLION_LIGHT + // Draw medallions + // QUEST_MEDALLION_FOREST, QUEST_MEDALLION_FIRE, QUEST_MEDALLION_WATER, QUEST_MEDALLION_SPIRIT, + // QUEST_MEDALLION_SHADOW, QUEST_MEDALLION_LIGHT + gDPPipeSync(POLY_OPA_DISP++); gDPSetPrimColor(POLY_OPA_DISP++, 0, 0, 255, 255, 255, pauseCtx->alpha); gDPSetCombineLERP(POLY_OPA_DISP++, PRIMITIVE, ENVIRONMENT, TEXEL0, ENVIRONMENT, TEXEL0, 0, PRIMITIVE, 0, PRIMITIVE, diff --git a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_prompt.c b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_prompt.c index 875790a7cf..806bab8286 100644 --- a/src/overlays/misc/ovl_kaleido_scope/z_kaleido_prompt.c +++ b/src/overlays/misc/ovl_kaleido_scope/z_kaleido_prompt.c @@ -5,18 +5,18 @@ static s16 sKaleidoPromptCursorAlphaVals[] = { 100, 255 }; void KaleidoScope_UpdatePrompt(PlayState* play) { PauseContext* pauseCtx = &play->pauseCtx; Input* input = &play->state.input[0]; - s8 relStickX = input->rel.stick_x; + s8 stickAdjX = input->rel.stick_x; s16 step; if (((pauseCtx->state == PAUSE_STATE_SAVE_PROMPT) && (pauseCtx->savePromptSubState == PAUSE_SAVE_PROMPT_STATE_WAIT_CHOICE)) || (pauseCtx->state == PAUSE_STATE_14) || (pauseCtx->state == PAUSE_STATE_16)) { - if ((pauseCtx->promptChoice == 0) && (relStickX >= 30)) { + if ((pauseCtx->promptChoice == 0) && (stickAdjX >= 30)) { Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); pauseCtx->promptChoice = 4; - } else if ((pauseCtx->promptChoice != 0) && (relStickX <= -30)) { + } else if ((pauseCtx->promptChoice != 0) && (stickAdjX <= -30)) { Audio_PlaySfxGeneral(NA_SE_SY_CURSOR, &gSfxDefaultPos, 4, &gSfxDefaultFreqAndVolScale, &gSfxDefaultFreqAndVolScale, &gSfxDefaultReverb); pauseCtx->promptChoice = 0;