diff options
Diffstat (limited to 'src/code')
| -rw-r--r-- | src/code/z_actor.c | 10 | ||||
| -rw-r--r-- | src/code/z_bg_collect.c | 111 | ||||
| -rw-r--r-- | src/code/z_bg_item.c | 72 | ||||
| -rw-r--r-- | src/code/z_bgcheck.c | 95 | ||||
| -rw-r--r-- | src/code/z_player_call.c | 2 |
5 files changed, 153 insertions, 137 deletions
diff --git a/src/code/z_actor.c b/src/code/z_actor.c index b58f6700a..44d9053ec 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -1559,7 +1559,7 @@ s32 func_800B7678(PlayState* play, Actor* actor, Vec3f* pos, s32 updBgCheckInfoF } actor->bgCheckFlags |= BGCHECKFLAG_GROUND; - BgCheck2_AttachToMesh(&play->colCtx, actor, (s32)actor->floorBgId); + DynaPolyActor_AttachCarriedActor(&play->colCtx, actor, actor->floorBgId); } } else { return func_800B761C(actor, distToFloor, updBgCheckInfoFlags); @@ -1575,7 +1575,7 @@ void Actor_UpdateBgCheckInfo(PlayState* play, Actor* actor, f32 wallCheckHeight, Vec3f pos; if ((actor->floorBgId != BGCHECK_SCENE) && (actor->bgCheckFlags & BGCHECKFLAG_GROUND)) { - BgCheck2_UpdateActorAttachedToMesh(&play->colCtx, actor->floorBgId, actor); + DynaPolyActor_TransformCarriedActor(&play->colCtx, actor->floorBgId, actor); } if (updBgCheckInfoFlags & UPDBGCHECKINFO_FLAG_1) { @@ -2426,7 +2426,7 @@ Actor* Actor_UpdateActor(UpdateActor_Params* params) { } actor->update(actor, play); - BgCheck_ResetFlagsIfLoadedActor(play, &play->colCtx.dyna, actor); + DynaPoly_UnsetAllInteractFlags(play, &play->colCtx.dyna, actor); } CollisionCheck_ResetDamage(&actor->colChkInfo); @@ -2516,7 +2516,7 @@ void Actor_UpdateAll(PlayState* play, ActorContext* actorCtx) { } if (i == ACTORCAT_BG) { - DynaPoly_Setup(play, &play->colCtx.dyna); + DynaPoly_UpdateContext(play, &play->colCtx.dyna); } } @@ -3395,7 +3395,7 @@ void func_800BB604(GameState* gameState, ActorContext* actorCtx, Player* player, if ((actor != targetedActor) || (actor->flags & ACTOR_FLAG_80000)) { temp_f0_2 = func_800B82EC(actor, player, D_801ED8DC); - phi_s2_2 = (actor->flags & 1) != 0; + phi_s2_2 = (actor->flags & ACTOR_FLAG_1) != 0; if (phi_s2_2) { phi_s2_2 = temp_f0_2 < D_801ED8C8; } diff --git a/src/code/z_bg_collect.c b/src/code/z_bg_collect.c index 0d4f4a21f..b0c0971ea 100644 --- a/src/code/z_bg_collect.c +++ b/src/code/z_bg_collect.c @@ -1,103 +1,116 @@ #include "global.h" -void BgCheck2_UpdateActorPosition(CollisionContext* colCtx, s32 bgId, Actor* actor) { - MtxF prevMatrix; - MtxF prevMatrixInv; - MtxF currMatrix; - Vec3f newPos; - Vec3f posWithInv; +/** + * Update the `carriedActor`'s position based on the dynapoly actor identified by `bgId`. + */ +void DynaPolyActor_UpdateCarriedActorPos(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) { + MtxF prevTransform; + MtxF prevTransformInv; + MtxF curTransform; + Vec3f pos; + Vec3f tempPos; if (!DynaPoly_IsBgIdBgActor(bgId)) { return; } SkinMatrix_SetScaleRotateYRPTranslate( - &prevMatrix, colCtx->dyna.bgActors[bgId].prevTransform.scale.x, + &prevTransform, colCtx->dyna.bgActors[bgId].prevTransform.scale.x, colCtx->dyna.bgActors[bgId].prevTransform.scale.y, colCtx->dyna.bgActors[bgId].prevTransform.scale.z, colCtx->dyna.bgActors[bgId].prevTransform.rot.x, colCtx->dyna.bgActors[bgId].prevTransform.rot.y, colCtx->dyna.bgActors[bgId].prevTransform.rot.z, colCtx->dyna.bgActors[bgId].prevTransform.pos.x, colCtx->dyna.bgActors[bgId].prevTransform.pos.y, colCtx->dyna.bgActors[bgId].prevTransform.pos.z); - if (SkinMatrix_Invert(&prevMatrix, &prevMatrixInv) == 2) { + if (SkinMatrix_Invert(&prevTransform, &prevTransformInv) == 2) { return; } SkinMatrix_SetScaleRotateYRPTranslate( - &currMatrix, colCtx->dyna.bgActors[bgId].curTransform.scale.x, colCtx->dyna.bgActors[bgId].curTransform.scale.y, - colCtx->dyna.bgActors[bgId].curTransform.scale.z, colCtx->dyna.bgActors[bgId].curTransform.rot.x, - colCtx->dyna.bgActors[bgId].curTransform.rot.y, colCtx->dyna.bgActors[bgId].curTransform.rot.z, - colCtx->dyna.bgActors[bgId].curTransform.pos.x, colCtx->dyna.bgActors[bgId].curTransform.pos.y, - colCtx->dyna.bgActors[bgId].curTransform.pos.z); - - SkinMatrix_Vec3fMtxFMultXYZ(&prevMatrixInv, &actor->world.pos, &posWithInv); - SkinMatrix_Vec3fMtxFMultXYZ(&currMatrix, &posWithInv, &newPos); - - actor->world.pos = newPos; + &curTransform, colCtx->dyna.bgActors[bgId].curTransform.scale.x, + colCtx->dyna.bgActors[bgId].curTransform.scale.y, colCtx->dyna.bgActors[bgId].curTransform.scale.z, + colCtx->dyna.bgActors[bgId].curTransform.rot.x, colCtx->dyna.bgActors[bgId].curTransform.rot.y, + colCtx->dyna.bgActors[bgId].curTransform.rot.z, colCtx->dyna.bgActors[bgId].curTransform.pos.x, + colCtx->dyna.bgActors[bgId].curTransform.pos.y, colCtx->dyna.bgActors[bgId].curTransform.pos.z); + + // Apply the movement of the dynapoly actor `bgId` over the last frame to the `carriedActor` position + // pos = curTransform * prevTransformInv * pos + // Note (curTransform * prevTransformInv) represents the transform relative to the previous frame + SkinMatrix_Vec3fMtxFMultXYZ(&prevTransformInv, &carriedActor->world.pos, &tempPos); + SkinMatrix_Vec3fMtxFMultXYZ(&curTransform, &tempPos, &pos); + + carriedActor->world.pos = pos; } -void BgCheck2_UpdateActorYRotation(CollisionContext* colCtx, s32 bgId, Actor* actor) { - s16 angleChange; +/** + * Update the `carriedActor`'s Y rotation based on the dynapoly actor identified by `bgId`. + */ +void DynaPolyActor_UpdateCarriedActorRotY(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) { + s16 rotY; if (!DynaPoly_IsBgIdBgActor(bgId)) { return; } - angleChange = colCtx->dyna.bgActors[bgId].curTransform.rot.y - colCtx->dyna.bgActors[bgId].prevTransform.rot.y; + rotY = colCtx->dyna.bgActors[bgId].curTransform.rot.y - colCtx->dyna.bgActors[bgId].prevTransform.rot.y; - if (actor->id == 0) { - ((Player*)actor)->currentYaw += angleChange; + if (carriedActor->id == ACTOR_PLAYER) { + ((Player*)carriedActor)->currentYaw += rotY; } - actor->shape.rot.y += angleChange; - actor->world.rot.y += angleChange; + carriedActor->shape.rot.y += rotY; + carriedActor->world.rot.y += rotY; } -void BgCheck2_AttachToMesh(CollisionContext* colCtx, Actor* actor, s32 bgId) { - DynaPolyActor* meshActor; +void DynaPolyActor_AttachCarriedActor(CollisionContext* colCtx, Actor* carriedActor, s32 bgId) { + DynaPolyActor* dynaActor; if (!DynaPoly_IsBgIdBgActor(bgId)) { return; } - meshActor = DynaPoly_GetActor(colCtx, bgId); - if (meshActor != NULL) { - DynaPolyActor_SetRidingFallingState(meshActor); + dynaActor = DynaPoly_GetActor(colCtx, bgId); + if (dynaActor != NULL) { + DynaPolyActor_SetActorOnTop(dynaActor); - if ((actor->flags & 0x4000000) == 0x4000000) { - DynaPolyActor_SetSwitchPressedState(meshActor); + if (CHECK_FLAG_ALL(carriedActor->flags, ACTOR_FLAG_CAN_PRESS_SWITCH)) { + DynaPolyActor_SetActorOnSwitch(dynaActor); } - if ((actor->flags & 0x20000) == 0x20000) { - DynaPolyActor_SetHeavySwitchPressedState(meshActor); + if (CHECK_FLAG_ALL(carriedActor->flags, ACTOR_FLAG_CAN_PRESS_HEAVY_SWITCH)) { + DynaPolyActor_SetActorOnHeavySwitch(dynaActor); } } } -u32 BgCheck2_UpdateActorAttachedToMesh(CollisionContext* colCtx, s32 bgId, Actor* actor) { - u32 wasUpdated = 0; - DynaPolyActor* meshActor; +/** + * Update the `carriedActor`'s position and Y rotation based on the dynapoly actor identified by `bgId`, according to + * the dynapoly actor's move flags (see `DYNA_TRANSFORM_POS` and `DYNA_TRANSFORM_ROT_Y`). + */ +u32 DynaPolyActor_TransformCarriedActor(CollisionContext* colCtx, s32 bgId, Actor* carriedActor) { + u32 wasUpdated = false; + DynaPolyActor* dynaActor; if (!DynaPoly_IsBgIdBgActor(bgId)) { - return 0; + return false; } - if (colCtx->dyna.bgActorFlags[bgId] & 2 || !(colCtx->dyna.bgActorFlags[bgId] & 1)) { - return 0; + if ((colCtx->dyna.bgActorFlags[bgId] & BGACTOR_1) || !(colCtx->dyna.bgActorFlags[bgId] & BGACTOR_IN_USE)) { + return false; } - meshActor = DynaPoly_GetActor(colCtx, bgId); + dynaActor = DynaPoly_GetActor(colCtx, bgId); - if (meshActor == NULL) { - return 0; + if (dynaActor == NULL) { + return false; } - if (meshActor->flags & 1) { - BgCheck2_UpdateActorPosition(colCtx, bgId, actor); - wasUpdated = 1; + if (dynaActor->transformFlags & DYNA_TRANSFORM_POS) { + DynaPolyActor_UpdateCarriedActorPos(colCtx, bgId, carriedActor); + wasUpdated = true; } - if (meshActor->flags & 2) { - BgCheck2_UpdateActorYRotation(colCtx, bgId, actor); - wasUpdated = 1; + if (dynaActor->transformFlags & DYNA_TRANSFORM_ROT_Y) { + DynaPolyActor_UpdateCarriedActorRotY(colCtx, bgId, carriedActor); + wasUpdated = true; } return wasUpdated; diff --git a/src/code/z_bg_item.c b/src/code/z_bg_item.c index 79bdf2b82..cedd77194 100644 --- a/src/code/z_bg_item.c +++ b/src/code/z_bg_item.c @@ -1,18 +1,15 @@ #include "global.h" -#define DYNAPOLY_STATE_NONE 0 -#define DYNAPOLY_STATE_RIDING_FALLING (1 << 0) -#define DYNAPOLY_STATE_RIDING_MOVING (1 << 1) -#define DYNAPOLY_STATE_RIDING_ROTATING (1 << 2) -#define DYNAPOLY_STATE_SWITCH_PRESSED (1 << 3) -#define DYNAPOLY_STATE_HEAVY_SWITCH_PRESSED (1 << 4) - -void DynaPolyActor_Init(DynaPolyActor* dynaActor, s32 flags) { +/** + * @param transformFlags How other actors standing on the dynapoly actor's collision move when the dynapoly actor moves. + * See `DYNA_TRANSFORM_POS`, `DYNA_TRANSFORM_ROT_Y`. + */ +void DynaPolyActor_Init(DynaPolyActor* dynaActor, s32 transformFlags) { dynaActor->bgId = -1; dynaActor->pushForce = 0.0f; dynaActor->unk14C = 0.0f; - dynaActor->flags = flags; - dynaActor->stateFlags = DYNAPOLY_STATE_NONE; + dynaActor->transformFlags = transformFlags; + dynaActor->interactFlags = 0; } void DynaPolyActor_LoadMesh(PlayState* play, DynaPolyActor* dynaActor, CollisionHeader* meshHeader) { @@ -22,80 +19,80 @@ void DynaPolyActor_LoadMesh(PlayState* play, DynaPolyActor* dynaActor, Collision dynaActor->bgId = DynaPoly_SetBgActor(play, &play->colCtx.dyna, &dynaActor->actor, header); } -void DynaPolyActor_ResetState(DynaPolyActor* dynaActor) { - dynaActor->stateFlags = DYNAPOLY_STATE_NONE; +void DynaPolyActor_UnsetAllInteractFlags(DynaPolyActor* dynaActor) { + dynaActor->interactFlags = 0; } -void DynaPolyActor_SetRidingFallingState(DynaPolyActor* dynaActor) { - dynaActor->stateFlags |= DYNAPOLY_STATE_RIDING_FALLING; +void DynaPolyActor_SetActorOnTop(DynaPolyActor* dynaActor) { + dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_TOP; } -void DynaPolyActor_SetRidingMovingState(DynaPolyActor* dynaActor) { - dynaActor->stateFlags |= DYNAPOLY_STATE_RIDING_MOVING; +void DynaPolyActor_SetPlayerOnTop(DynaPolyActor* dynaActor) { + dynaActor->interactFlags |= DYNA_INTERACT_PLAYER_ON_TOP; } -void DynaPolyActor_SetRidingMovingStateByIndex(CollisionContext* colCtx, s32 bgId) { +void DynaPoly_SetPlayerOnTop(CollisionContext* colCtx, s32 bgId) { DynaPolyActor* dynaActor = DynaPoly_GetActor(colCtx, bgId); if (dynaActor != NULL) { - DynaPolyActor_SetRidingMovingState(dynaActor); + DynaPolyActor_SetPlayerOnTop(dynaActor); } } -void DynaPolyActor_SetRidingRotatingState(DynaPolyActor* dynaActor) { - dynaActor->stateFlags |= DYNAPOLY_STATE_RIDING_ROTATING; +void DynaPolyActor_SetPlayerAbove(DynaPolyActor* dynaActor) { + dynaActor->interactFlags |= DYNA_INTERACT_PLAYER_ABOVE; } -void DynaPolyActor_SetRidingRotatingStateByIndex(CollisionContext* colCtx, s32 bgId) { +void DynaPoly_SetPlayerAbove(CollisionContext* colCtx, s32 bgId) { DynaPolyActor* dynaActor = DynaPoly_GetActor(colCtx, bgId); if (dynaActor != NULL) { - DynaPolyActor_SetRidingRotatingState(dynaActor); + DynaPolyActor_SetPlayerAbove(dynaActor); } } -void DynaPolyActor_SetSwitchPressedState(DynaPolyActor* dynaActor) { - dynaActor->stateFlags |= DYNAPOLY_STATE_SWITCH_PRESSED; +void DynaPolyActor_SetActorOnSwitch(DynaPolyActor* dynaActor) { + dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_SWITCH; } -void DynaPolyActor_SetHeavySwitchPressedState(DynaPolyActor* dynaActor) { - dynaActor->stateFlags |= DYNAPOLY_STATE_HEAVY_SWITCH_PRESSED; +void DynaPolyActor_SetActorOnHeavySwitch(DynaPolyActor* dynaActor) { + dynaActor->interactFlags |= DYNA_INTERACT_ACTOR_ON_HEAVY_SWITCH; } -s32 DynaPolyActor_IsInRidingFallingState(DynaPolyActor* dynaActor) { - if (dynaActor->stateFlags & DYNAPOLY_STATE_RIDING_FALLING) { +s32 DynaPolyActor_IsActorOnTop(DynaPolyActor* dynaActor) { + if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_TOP) { return true; } else { return false; } } -s32 DynaPolyActor_IsInRidingMovingState(DynaPolyActor* dynaActor) { - if (dynaActor->stateFlags & DYNAPOLY_STATE_RIDING_MOVING) { +s32 DynaPolyActor_IsPlayerOnTop(DynaPolyActor* dynaActor) { + if (dynaActor->interactFlags & DYNA_INTERACT_PLAYER_ON_TOP) { return true; } else { return false; } } -s32 DynaPolyActor_IsInRidingRotatingState(DynaPolyActor* dynaActor) { - if (dynaActor->stateFlags & DYNAPOLY_STATE_RIDING_ROTATING) { +s32 DynaPolyActor_IsPlayerAbove(DynaPolyActor* dynaActor) { + if (dynaActor->interactFlags & DYNA_INTERACT_PLAYER_ABOVE) { return true; } else { return false; } } -s32 DynaPolyActor_IsInSwitchPressedState(DynaPolyActor* dynaActor) { - if (dynaActor->stateFlags & DYNAPOLY_STATE_SWITCH_PRESSED) { +s32 DynaPolyActor_IsSwitchPressed(DynaPolyActor* dynaActor) { + if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_SWITCH) { return true; } else { return false; } } -s32 DynaPolyActor_IsInHeavySwitchPressedState(DynaPolyActor* dynaActor) { - if (dynaActor->stateFlags & DYNAPOLY_STATE_HEAVY_SWITCH_PRESSED) { +s32 DynaPolyActor_IsHeavySwitchPressed(DynaPolyActor* dynaActor) { + if (dynaActor->interactFlags & DYNA_INTERACT_ACTOR_ON_HEAVY_SWITCH) { return true; } else { return false; @@ -129,13 +126,16 @@ s32 DynaPolyActor_ValidateMove(PlayState* play, DynaPolyActor* dynaActor, s16 st &bgId, &dynaActor->actor, 0.0f)) { return false; } + startPos.x = (dynaActor->actor.world.pos.x * 2.0f) - startPos.x; startPos.z = (dynaActor->actor.world.pos.z * 2.0f) - startPos.z; endPos.x = sign * adjustedEndRadius * sin + startPos.x; endPos.z = sign * adjustedEndRadius * cos + startPos.z; + if (BgCheck_EntityLineTest3(&play->colCtx, &startPos, &endPos, &intersectionPos, &poly, true, false, false, true, &bgId, &dynaActor->actor, 0.0f)) { return false; } + return true; } diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c index de0d5d12a..2fc1852ab 100644 --- a/src/code/z_bgcheck.c +++ b/src/code/z_bgcheck.c @@ -1665,7 +1665,7 @@ CollisionHeader* BgCheck_GetCollisionHeader(CollisionContext* colCtx, s32 bgId) if ((bgId < 0) || (bgId > BG_ACTOR_MAX)) { return NULL; } - if (!(colCtx->dyna.bgActorFlags[bgId] & 1)) { + if (!(colCtx->dyna.bgActorFlags[bgId] & BGACTOR_IN_USE)) { return NULL; } return colCtx->dyna.bgActors[bgId].colHeader; @@ -2719,8 +2719,8 @@ s32 DynaPoly_SetBgActor(PlayState* play, DynaCollisionContext* dyna, Actor* acto s32 foundSlot = false; for (bgId = 0; bgId < BG_ACTOR_MAX; bgId++) { - if (!(dyna->bgActorFlags[bgId] & 1)) { - dyna->bgActorFlags[bgId] |= 1; + if (!(dyna->bgActorFlags[bgId] & BGACTOR_IN_USE)) { + dyna->bgActorFlags[bgId] |= BGACTOR_IN_USE; foundSlot = true; break; } @@ -2733,7 +2733,7 @@ s32 DynaPoly_SetBgActor(PlayState* play, DynaCollisionContext* dyna, Actor* acto BgActor_SetActor(&dyna->bgActors[bgId], actor, colHeader); dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP; - dyna->bgActorFlags[bgId] &= ~2; + dyna->bgActorFlags[bgId] &= ~BGACTOR_1; return bgId; } @@ -2741,51 +2741,51 @@ s32 DynaPoly_SetBgActor(PlayState* play, DynaCollisionContext* dyna, Actor* acto * Gets the actor assigned to `bgId` */ DynaPolyActor* DynaPoly_GetActor(CollisionContext* colCtx, s32 bgId) { - if (!DynaPoly_IsBgIdBgActor(bgId) || !(colCtx->dyna.bgActorFlags[bgId] & 1) || - (colCtx->dyna.bgActorFlags[bgId] & 2)) { + if (!DynaPoly_IsBgIdBgActor(bgId) || !(colCtx->dyna.bgActorFlags[bgId] & BGACTOR_IN_USE) || + (colCtx->dyna.bgActorFlags[bgId] & BGACTOR_1)) { return NULL; } return (DynaPolyActor*)colCtx->dyna.bgActors[bgId].actor; } -void func_800C62BC(PlayState* play, DynaCollisionContext* dyna, s32 bgId) { +void DynaPoly_DisableCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) { if (DynaPoly_IsBgIdBgActor(bgId)) { - dyna->bgActorFlags[bgId] |= 4; + dyna->bgActorFlags[bgId] |= BGACTOR_COLLISION_DISABLED; dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP; } } -void func_800C6314(PlayState* play, DynaCollisionContext* dyna, s32 bgId) { +void DynaPoly_EnableCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) { if (DynaPoly_IsBgIdBgActor(bgId)) { - dyna->bgActorFlags[bgId] &= ~4; + dyna->bgActorFlags[bgId] &= ~BGACTOR_COLLISION_DISABLED; dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP; } } -void func_800C636C(PlayState* play, DynaCollisionContext* dyna, s32 bgId) { +void DynaPoly_DisableCeilingCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) { if (DynaPoly_IsBgIdBgActor(bgId)) { - dyna->bgActorFlags[bgId] |= 8; + dyna->bgActorFlags[bgId] |= BGACTOR_CEILING_COLLISION_DISABLED; dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP; } } -void func_800C63C4(PlayState* play, DynaCollisionContext* dyna, s32 bgId) { +void DynaPoly_EnableCeilingCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) { if (DynaPoly_IsBgIdBgActor(bgId)) { - dyna->bgActorFlags[bgId] &= ~8; + dyna->bgActorFlags[bgId] &= ~BGACTOR_CEILING_COLLISION_DISABLED; dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP; } } -void func_800C641C(PlayState* play, DynaCollisionContext* dyna, s32 bgId) { +void DynaPoly_DisableFloorCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) { if (DynaPoly_IsBgIdBgActor(bgId)) { - dyna->bgActorFlags[bgId] |= 0x20; + dyna->bgActorFlags[bgId] |= BGACTOR_FLOOR_COLLISION_DISABLED; dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP; } } -void func_800C6474(PlayState* play, DynaCollisionContext* dyna, s32 bgId) { +void DynaPoly_EnableFloorCollision(PlayState* play, DynaCollisionContext* dyna, s32 bgId) { if (DynaPoly_IsBgIdBgActor(bgId)) { - dyna->bgActorFlags[bgId] &= ~0x20; + dyna->bgActorFlags[bgId] &= ~BGACTOR_FLOOR_COLLISION_DISABLED; dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP; } } @@ -2804,11 +2804,11 @@ void DynaPoly_DeleteBgActor(PlayState* play, DynaCollisionContext* dyna, s32 bgI actor->bgId = BGACTOR_NEG_ONE; dyna->bgActors[bgId].actor = NULL; - dyna->bgActorFlags[bgId] |= 2; + dyna->bgActorFlags[bgId] |= BGACTOR_1; } } -void func_800C6554(PlayState* play, DynaCollisionContext* dyna) { +void DynaPoly_InvalidateLookup(PlayState* play, DynaCollisionContext* dyna) { dyna->bitFlag |= DYNAPOLY_INVALIDATE_LOOKUP; } @@ -2865,8 +2865,8 @@ void BgCheck_CalcWaterboxDimensions(Vec3f* minPos, Vec3f* maxXPos, Vec3f* maxZPo /** * original name: DynaPolyInfo_expandSRT */ -void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s32* vtxStartIndex, s32* polyStartIndex, - s32* waterBoxStartIndex) { +void DynaPoly_AddBgActorToLookup(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s32* vtxStartIndex, + s32* polyStartIndex, s32* waterBoxStartIndex) { Actor* actor; s32 i; s32 j; @@ -2899,7 +2899,7 @@ void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s ScaleRotPos_SetValue(&dyna->bgActors[bgId].curTransform, &actor->scale, &actor->shape.rot, &pos); - if (dyna->bgActorFlags[bgId] & 4) { + if (dyna->bgActorFlags[bgId] & BGACTOR_COLLISION_DISABLED) { return; } @@ -2929,13 +2929,13 @@ void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s s16 normalY = poly->normal.y; if (normalY > COLPOLY_SNORMAL(0.5f)) { - if (!(dyna->bgActorFlags[bgId] & 0x20)) { + if (!(dyna->bgActorFlags[bgId] & BGACTOR_FLOOR_COLLISION_DISABLED)) { s16 polyIndex = pi; DynaSSNodeList_SetSSListHead(&dyna->polyNodes, &dyna->bgActors[bgId].dynaLookup.floor, &polyIndex); } } else if (normalY < COLPOLY_SNORMAL(-0.8f)) { - if (!(dyna->bgActorFlags[bgId] & 8)) { + if (!(dyna->bgActorFlags[bgId] & BGACTOR_CEILING_COLLISION_DISABLED)) { s16 polyIndex = pi; DynaSSNodeList_SetSSListHead(&dyna->polyNodes, &dyna->bgActors[bgId].dynaLookup.ceiling, @@ -3091,16 +3091,16 @@ void DynaPoly_ExpandSRT(PlayState* play, DynaCollisionContext* dyna, s32 bgId, s *waterBoxStartIndex += pbgdata->numWaterBoxes; } -void BgCheck_ResetFlagsIfLoadedActor(PlayState* play, DynaCollisionContext* dyna, Actor* actor) { +void DynaPoly_UnsetAllInteractFlags(PlayState* play, DynaCollisionContext* dyna, Actor* actor) { DynaPolyActor* dynaActor; s32 i; for (i = 0; i < BG_ACTOR_MAX; i++) { - if ((dyna->bgActorFlags[i] & 1)) { + if ((dyna->bgActorFlags[i] & BGACTOR_IN_USE)) { dynaActor = DynaPoly_GetActor(&play->colCtx, i); if ((dynaActor != NULL) && (&dynaActor->actor == actor)) { - DynaPolyActor_ResetState((DynaPolyActor*)actor); - return; + DynaPolyActor_UnsetAllInteractFlags((DynaPolyActor*)actor); + break; } } } @@ -3109,7 +3109,7 @@ void BgCheck_ResetFlagsIfLoadedActor(PlayState* play, DynaCollisionContext* dyna /** * original name: DynaPolyInfo_setup */ -void DynaPoly_Setup(PlayState* play, DynaCollisionContext* dyna) { +void DynaPoly_UpdateContext(PlayState* play, DynaCollisionContext* dyna) { DynaPolyActor* actor; s32 vtxStartIndex; s32 polyStartIndex; @@ -3123,7 +3123,7 @@ void DynaPoly_Setup(PlayState* play, DynaCollisionContext* dyna) { } for (i = 0; i < BG_ACTOR_MAX; i++) { - if (dyna->bgActorFlags[i] & 2) { + if (dyna->bgActorFlags[i] & BGACTOR_1) { // Initialize BgActor dyna->bgActorFlags[i] = 0; BgActor_Init(play, &dyna->bgActors[i]); @@ -3146,8 +3146,8 @@ void DynaPoly_Setup(PlayState* play, DynaCollisionContext* dyna) { polyStartIndex = 0; waterBoxStartIndex = 0; for (i = 0; i < BG_ACTOR_MAX; i++) { - if ((dyna->bgActorFlags[i] & 1) && !(dyna->bgActorFlags[i] & 2)) { - DynaPoly_ExpandSRT(play, dyna, i, &vtxStartIndex, &polyStartIndex, &waterBoxStartIndex); + if ((dyna->bgActorFlags[i] & BGACTOR_IN_USE) && !(dyna->bgActorFlags[i] & BGACTOR_1)) { + DynaPoly_AddBgActorToLookup(play, dyna, i, &vtxStartIndex, &polyStartIndex, &waterBoxStartIndex); } } dyna->bitFlag &= ~DYNAPOLY_INVALIDATE_LOOKUP; @@ -3165,7 +3165,8 @@ void func_800C756C(DynaCollisionContext* dyna, s32* numPolygons, s32* numVertice *numWaterBoxes = 0; for (i = 0; i < BG_ACTOR_MAX; i++) { - if ((dyna->bgActorFlags[i] & 1) && !(dyna->bgActorFlags[i] & 2) && !(dyna->bgActorFlags[i] & 4)) { + if ((dyna->bgActorFlags[i] & BGACTOR_IN_USE) && !(dyna->bgActorFlags[i] & BGACTOR_1) && + !(dyna->bgActorFlags[i] & BGACTOR_COLLISION_DISABLED)) { colHeader = dyna->bgActors[i].colHeader; *numPolygons += colHeader->numPolygons; *numVertices += colHeader->numVertices; @@ -3181,7 +3182,7 @@ void DynaPoly_UpdateBgActorTransforms(PlayState* play, DynaCollisionContext* dyn s32 i; for (i = 0; i < BG_ACTOR_MAX; i++) { - if (dyna->bgActorFlags[i] & 1) { + if (dyna->bgActorFlags[i] & BGACTOR_IN_USE) { DynaPoly_SetBgActorPrevTransform(play, &dyna->bgActors[i]); } } @@ -3275,7 +3276,8 @@ f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast) { *dynaRaycast->bgId = BGCHECK_SCENE; for (i = 0; i < BG_ACTOR_MAX; i++) { - if (!(dynaRaycast->colCtx->dyna.bgActorFlags[i] & 1) || (dynaRaycast->colCtx->dyna.bgActorFlags[i] & 2)) { + if (!(dynaRaycast->colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || + (dynaRaycast->colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) { continue; } @@ -3328,7 +3330,7 @@ f32 BgCheck_RaycastFloorDyna(DynaRaycast* dynaRaycast) { if (!pauseState) { pauseState = dynaRaycast->play->pauseCtx.debugEditor != DEBUG_EDITOR_NONE; } - if (!pauseState && (dynaRaycast->colCtx->dyna.bgActorFlags[*dynaRaycast->bgId] & 2)) { + if (!pauseState && (dynaRaycast->colCtx->dyna.bgActorFlags[*dynaRaycast->bgId] & BGACTOR_1)) { curTransform = &dynaRaycast->dyna->bgActors[*dynaRaycast->bgId].curTransform; polyMin = &dynaRaycast->dyna ->polyList[(u16)dynaRaycast->dyna->bgActors[*dynaRaycast->bgId].dynaLookup.polyStartIndex]; @@ -3587,7 +3589,7 @@ s32 BgCheck_SphVsDynaWall(CollisionContext* colCtx, u16 xpFlags, f32* outX, f32* resultPos = *pos; for (i = 0; i < BG_ACTOR_MAX; i++) { - if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 2)) { + if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) { continue; } if ((colCtx->dyna.bgActors + i)->actor == actor) { @@ -3709,7 +3711,7 @@ s32 BgCheck_CheckDynaCeiling(CollisionContext* colCtx, u16 xpFlags, f32* outY, V resultY = tempY; for (i = 0; i < BG_ACTOR_MAX; i++) { - if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 2)) { + if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) { continue; } if (actor == colCtx->dyna.bgActors[i].actor) { @@ -3855,7 +3857,7 @@ s32 BgCheck_CheckLineAgainstDyna(CollisionContext* colCtx, u16 xpFlags, Vec3f* p f32 by; for (i = 0; i < BG_ACTOR_MAX; i++) { - if ((colCtx->dyna.bgActorFlags[i] & 1) && !(colCtx->dyna.bgActorFlags[i] & 2)) { + if ((colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) && !(colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) { if (actor != colCtx->dyna.bgActors[i].actor) { ay = posA->y; by = posB->y; @@ -3964,7 +3966,7 @@ s32 BgCheck_SphVsFirstDynaPoly(CollisionContext* colCtx, u16 xpFlags, CollisionP Sphere16 testSphere; for (i = 0; i < BG_ACTOR_MAX; i++) { - if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 2)) { + if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) { continue; } if (colCtx->dyna.bgActors[i].actor == actor) { @@ -4019,7 +4021,7 @@ void BgCheck_InitCollisionHeaders(CollisionContext* colCtx, PlayState* play) { for (i = 0; i < BG_ACTOR_MAX; i++) { flag = dyna->bgActorFlags[i]; - if ((flag & 1) && !(flag & 2)) { + if ((flag & BGACTOR_IN_USE) && !(flag & BGACTOR_1)) { Actor_SetObjectDependency(play, dyna->bgActors[i].actor); CollisionHeader_SegmentedToVirtual(dyna->bgActors[i].colHeader); } @@ -4399,7 +4401,8 @@ s32 WaterBox_GetSurfaceImpl(PlayState* play, CollisionContext* colCtx, f32 x, f3 } for (i = 0; i < BG_ACTOR_MAX; i++) { - if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 4)) { + if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || + (colCtx->dyna.bgActorFlags[i] & BGACTOR_COLLISION_DISABLED)) { continue; } bgActor = &colCtx->dyna.bgActors[i]; @@ -4484,8 +4487,8 @@ s32 WaterBox_GetSurface2(PlayState* play, CollisionContext* colCtx, Vec3f* pos, for (i = 0; i < BG_ACTOR_MAX; i++) { - if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 4) || - (colCtx->dyna.bgActorFlags[i] & 2)) { + if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || + (colCtx->dyna.bgActorFlags[i] & BGACTOR_COLLISION_DISABLED) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) { continue; } bgActor = &colCtx->dyna.bgActors[i]; @@ -4618,7 +4621,7 @@ s32 func_800CA6F0(PlayState* play, CollisionContext* colCtx, f32 x, f32 z, f32* } } for (i = 0; i < BG_ACTOR_MAX; i++) { - if (!(colCtx->dyna.bgActorFlags[i] & 1) || (colCtx->dyna.bgActorFlags[i] & 2)) { + if (!(colCtx->dyna.bgActorFlags[i] & BGACTOR_IN_USE) || (colCtx->dyna.bgActorFlags[i] & BGACTOR_1)) { continue; } bgActor = &colCtx->dyna.bgActors[i]; diff --git a/src/code/z_player_call.c b/src/code/z_player_call.c index bdc124708..a109dab17 100644 --- a/src/code/z_player_call.c +++ b/src/code/z_player_call.c @@ -3,7 +3,7 @@ #define FLAGS \ (ACTOR_FLAG_1 | ACTOR_FLAG_8 | ACTOR_FLAG_10 | ACTOR_FLAG_20 | ACTOR_FLAG_200000 | ACTOR_FLAG_2000000 | \ - ACTOR_FLAG_4000000 | ACTOR_FLAG_80000000) + ACTOR_FLAG_CAN_PRESS_SWITCH | ACTOR_FLAG_80000000) ActorFunc sPlayerCallInitFunc; ActorFunc sPlayerCallDestroyFunc; |
