diff --git a/include/functions.h b/include/functions.h index a4af2f236c..53ab3df24c 100644 --- a/include/functions.h +++ b/include/functions.h @@ -934,8 +934,8 @@ s32 BgCheck_PolygonGetMinY(BgPolygon* polygons, BgVertex* vertices); void BgCheck_PolygonGetNormal(BgPolygon* polygon, f32* normalX, f32* normalY, f32* normalZ); void func_800C0094(BgPolygon* param_1, f32 xOffset, f32 yOffset, f32 zOffset, z_Matrix* matrix); f32 func_800C01B8(BgPolygon* param_1, Vec3f* param_2); -void BgCheck_CreateColTriParamsFromPolygon(BgPolygon* polygon, BgVertex* vertices, ColTriParams* tri); -void func_800C02C0(BgPolygon* poly, s32 index, CollisionContext* bgCtxt, ColTriParams* tri); +void BgCheck_CreateTriNormFromPolygon(BgPolygon* polygon, BgVertex* vertices, TriNorm* tri); +void func_800C02C0(BgPolygon* poly, s32 index, CollisionContext* bgCtxt, TriNorm* tri); // void func_800C0340(BgPolygon* param_1, BgVertex* param_2, UNK_TYPE4 param_3, UNK_TYPE4 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); // UNK_TYPE4 func_800C0474(BgPolygon* param_1, BgVertex* param_2, UNK_TYPE4 param_3, UNK_TYPE4 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); // void func_800C0668(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); @@ -1317,217 +1317,217 @@ s16 Camera_ClearFlags(Camera* camera, s16 flags); // void func_800E0308(void); // void func_800E031C(void); void func_800E0348(Camera* camera); -s800E03A0* func_800E03A0(s32 a0); -void func_800E03CC(u8* param_1); -f32 Collision_GetDamageAndEffectOnBumper(ColCommon* toucher, ColBodyInfo* toucherBody, ColCommon* bumper, ColBodyInfo* bumperBody, u32* effect); -// void func_800E04BC(void); -u32 Collision_GetToucherDamage(ColCommon* toucher, ColBodyInfo* toucherBody, ColCommon* bumper); -s32 Collision_InitCommonDefault(GlobalContext* ctxt, ColCommon* shape); -s32 Collision_FiniCommon(GlobalContext* ctxt, ColCommon* shape); -// void func_800E0594(void); -// void func_800E05D4(void); -s32 Collision_InitCommonWithData(GlobalContext* ctxt, ColCommon* shape, Actor* actor, ColCommonInit* init); -void Collision_ResetCommonForAT(GlobalContext* ctxt, ColCommon* shape); -void Collision_ResetCommonForAC(GlobalContext* ctxt, ColCommon* shape); -void Collision_ResetCommonForOT(GlobalContext* ctxt, ColCommon* shape); -s32 Collision_InitTouchDefault(GlobalContext* ctxt, ColTouch* touch); -s32 Collision_FiniTouch(GlobalContext* ctxt, ColTouch* touch); -s32 Collision_InitTouchWithData(GlobalContext* ctxt, ColTouch* touch, ColTouchInit* init); -void Collision_nop800E0720(GlobalContext* ctxt, ColBodyInfo* body); -s32 Collision_InitBumpDefault(GlobalContext* ctxt, ColBump* bump); -s32 Collision_FiniBump(GlobalContext* ctxt, ColBump* bump); -s32 Collision_InitBumpWithData(GlobalContext* ctxt, ColBump* bump, ColBumpInit* init); -s32 Collision_InitBodyDefault(GlobalContext* ctxt, ColBodyInfo* body); -s32 Collision_FiniBody(GlobalContext* ctxt, ColBodyInfo* body); -s32 Collision_InitBodyWithData(GlobalContext* ctxt, ColBodyInfo* body, ColBodyInfoInit* init); -void Collision_ResetBodyForAT(GlobalContext* ctxt, ColBodyInfo* body); -void Collision_ResetBodyForAC(GlobalContext* ctxt, ColBodyInfo* body); -void Collision_ResetBodyForOT(GlobalContext* ctxt, ColBodyInfo* body); -s32 Collision_InitSphereParamsDefault(GlobalContext* ctxt, ColSphereParams* params); -s32 Collision_FiniSphereParams(GlobalContext* ctxt, ColSphereParams* params); -s32 Collision_InitSphereParamsWithData(GlobalContext* ctxt, ColSphereParams* params, ColSphereParamsInit* init); -s32 Collision_InitSphereGroupElemDefault(GlobalContext* pzParm1, ColSphereGroupElement* elem); -s32 Collision_FiniSphereGroupElem(GlobalContext* ctxt, ColSphereGroupElement* elem); -s32 Collision_InitSphereGroupElemWithData(GlobalContext* ctxt, ColSphereGroupElement* elem, ColSphereGroupElementInit* init); -s32 Collision_ResetSphereGroupElemForAT(GlobalContext* ctxt, ColSphereGroupElement* elem); -s32 Collision_ResetSphereGroupElemForAC(GlobalContext* ctxt, ColSphereGroupElement* elem); -s32 Collision_ResetSphereGroupElemForOT(GlobalContext* ctxt, ColSphereGroupElement* elem); -s32 Collision_InitSphereGroupDefault(GlobalContext* ctxt, ColSphereGroup* sphereGroup); -// void func_800E0B78(void); -s32 Collision_FiniSphereGroup(GlobalContext* ctxt, ColSphereGroup* sphereGroup); -// void func_800E0CA8(void); -// void func_800E0D84(void); -s32 Collision_InitSphereGroupWithData(GlobalContext* ctxt, ColSphereGroup* sphereGroup, Actor* actor, ColSphereGroupInit* init, ColSphereGroupElement* spheres); -s32 Collision_InitSphereGroup(GlobalContext* ctxt, ColSphereGroup* sphereGroup, Actor* actor, ColSphereGroupInit* init, ColSphereGroupElement* spheres); -s32 Collision_ResetSphereGroupForAT(GlobalContext* ctxt, ColSphereGroup* spheres); -s32 Collision_ResetSphereGroupForAC(GlobalContext* ctxt, ColSphereGroup* spheres); -s32 Collision_ResetSphereGroupForOT(GlobalContext* ctst, ColSphereGroup* spheres); -s32 Collision_InitCylinderParamsDefault(GlobalContext* ctxt, ColCylinderParams* params); -s32 Collision_FiniCylinderParams(GlobalContext* ctxt, ColCylinderParams* params); -s32 Collision_InitCylinderParamsWithData(GlobalContext* ctxt, ColCylinderParams* info, ColCylinderParams* init); -s32 Collision_InitCylinderDefault(GlobalContext* ctxt, ColCylinder* cylinder); -s32 Collision_FiniCylinder(GlobalContext* ctxt, ColCylinder* cylinder); -// void func_800E123C(void); -// void func_800E12A4(void); -s32 Collision_InitCylinderWithData(GlobalContext* ctxt, ColCylinder* cylinder, Actor* actor, ColCylinderInit* init); -s32 Collision_InitCylinder(GlobalContext* ctxt, ColCylinder* cylinder, Actor* actor, ColCylinderInit* init); -s32 Collision_ResetCylinderForAT(GlobalContext* ctxt, ColCylinder* cylinder); -s32 Collision_ResetCylinderForAC(GlobalContext* ctxt, ColCylinder* cylinder); -s32 Collision_ReseCylinderForOT(GlobalContext* ctxt, ColCylinder* cylinder); -s32 Collision_InitTriParamsDefault(GlobalContext* ctxt, ColTriParams* coords); -s32 Collision_FiniTriParams(GlobalContext* ctxt, ColTriParams* params); -s32 Collision_InitTriParamsWithData(GlobalContext* ctxt, ColTriParams* params, ColTriParamsInit* init); -s32 Collision_InitTriDefault(GlobalContext* ctxt, ColTri* elem); -s32 Collision_FiniTri(GlobalContext* ctxt, ColTri* elem); -s32 Collision_InitTriWithData(GlobalContext* ctxt, ColTri* elem, ColTriInit* init); -s32 Collision_ResetTriForAT(GlobalContext* ctxt, ColTri* tri); -s32 Collision_ResetTriForAC(GlobalContext* ctxt, ColTri* tri); -s32 func_800E16AC(GlobalContext* ctxt, ColTri* tri); -s32 Collision_InitTriGroupDefault(GlobalContext* ctxt, ColTriGroup* quadGroup); -// void func_800E16FC(void); -s32 Collision_FiniTriGroup(GlobalContext* ctxt, ColTriGroup* triGroup); -// void func_800E1858(void); -s32 Collision_InitTriGroupWithData(GlobalContext* ctxt, ColTriGroup* triGroup, Actor* actor, ColTriGroupInit* init, ColTri* tris); -s32 Collision_InitTriGroup(GlobalContext* ctxt, ColTriGroup* triGroup, Actor* actor, ColTriGroupInit* init, ColTri* tris); -s32 Collision_ResetTriGroupForAT(GlobalContext* ctxt, ColTriGroup* tris); -s32 Collision_ResetTriGroupForAC(GlobalContext* ctxt, ColTriGroup* tris); -s32 Collision_ResetTriGroupForOT(GlobalContext* ctxt, ColTriGroup* tris); -s32 Collision_InitQuadParamsDefault(GlobalContext* ctxt, ColQuadParams* params); -s32 Collision_FiniQuadParams(GlobalContext* ctxt, ColQuadParams* params); -s32 Collision_ResetQuadParamsForAT(GlobalContext* ctxt, ColQuadParams* params); -void Collision_QuadCalcMidpoints(ColQuadParams* params); -s32 Collision_InitQuadParamsWithData(GlobalContext* ctxt, ColQuadParams* params, ColQuadParams* init); -s32 Collision_InitQuadDefault(GlobalContext* ctxt, ColQuad* quad); -s32 Collision_FiniQuad(GlobalContext* ctxt, ColQuad* quad); -// void func_800E1EB8(void); -s32 Collision_InitQuadWithData(GlobalContext* ctxt, ColQuad* quad, Actor* actor, ColQuadInit* init); -s32 Collision_InitQuad(GlobalContext* ctxt, ColQuad* quad, Actor* actor, ColQuadInit* init); -s32 Collision_ResetQuadForAT(GlobalContext* ctxt, ColQuad* quad); -s32 Collision_ResetQuadForAC(GlobalContext* param_1, ColQuad* quad); -s32 Collision_ResetQuadForOT(GlobalContext* ctxt, ColCommon* quad); -// void func_800E20A4(void); -s32 Collision_InitSphereDefault(GlobalContext* ctxt, ColSphere* sphere); -s32 Collision_FiniSphere(GlobalContext* pzParm1, ColSphere* sphere); -s32 Collision_InitSphereWithData(GlobalContext* ctxt, ColSphere* sphere, Actor* actor, ColSphereInit* info); -s32 Collision_InitSphere(GlobalContext* ctxt, ColSphere* sphere, Actor* actor, ColSphereInit* init); -s32 Collision_ResetSphereForAT(GlobalContext* ctxt, ColSphere* sphere); -s32 Collision_ResetSphereForAC(GlobalContext* ctxt, ColSphere* sphere); -s32 Collision_ResetSphereForOT(GlobalContext* ctxt, ColSphere* sphere); -// void func_800E2368(void); -// UNK_TYPE4 func_800E23B0(void); -// void func_800E23C4(void); -// void func_800E2408(void); -s32 func_800E2434(GlobalContext* ctxt, s32 param_2); -void Collision_Init(GlobalContext* ctxt, CollisionCheckContext* colCtxt); -void Collision_Fini(GlobalContext* ctxt, CollisionCheckContext* colCtxt); -void Collision_Reset(GlobalContext* ctxt, CollisionCheckContext* colCtxt); -void Collision_EnableEditMode(GlobalContext* ctxt, CollisionCheckContext* colCtxt); -void Collision_EnableAppendMode(GlobalContext* ctxt, CollisionCheckContext* colCtxt); -s32 Collision_AddAT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCommon* shape); -s32 Collision_AddIndexAT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCommon* shape, s32 index); -s32 Collision_AddAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCommon* shape); -s32 collision_AddIndexAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCommon* shape, s32 index); -s32 Collision_AddOT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCommon* shape); -s32 Collision_AddIndexOT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCommon* shape, s32 index); -s32 Collision_AddGroup4(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCommon* shape); -s32 Collision_CantBeToucherAC(ColBodyInfo* iParm1); -s32 Collision_CantBeBumperAC(ColBodyInfo* iParm1); -s32 Collision_ToucherIsExcluded(ColBodyInfo* toucher, ColBodyInfo* bumper); -// void func_800E2C08(void); -// void func_800E2C1C(void); -// void func_800E2D88(void); -// void func_800E2EF4(void); -// void func_800E2F30(void); -// void func_800E2F54(void); -// void func_800E2F78(void); -// void func_800E30C8(void); -void func_800E3168(GlobalContext* ctxt, ColCommon* toucher, ColBodyInfo* toucherBody, ColCommon* bumper, ColBodyInfo* bumperBody, Vec3f* param_6); -void func_800E3304(ColCommon* toucher, ColCommon* bumper); -s32 Collision_HandleCollisionATWithAC(GlobalContext* ctxt, ColCommon* toucher, ColBodyInfo* toucherBody, Vec3f* toucherLoc, ColCommon* bumper, ColBodyInfo* bumperBody, Vec3f* bumperLoc, Vec3f* param_8); -void Collision_TriCalcAvgPoint(ColTri* tri, Vec3f* avg); -void collision_quad_cal_avg_point(ColQuadParams* quad, Vec3f* avg); -void Collision_SphereGroupWithSphereGroupAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphereGroup* toucher, ColSphereGroup* bumpee); -void Collision_SphereGroupWithCylinderAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphereGroup* toucher, ColCylinder* bumpee); -void Collision_SphereGroupWithTriGroupAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphereGroup* toucher, ColTriGroup* bumpee); -void Collision_SphereGroupWithQuadAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphereGroup* toucher, ColQuad* bumpee); -void Collision_SphereGroupWithSphereAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphereGroup* toucher, ColSphere* bumpee); -void Collision_CylinderWithSphereGroupAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCylinder* toucher, ColSphereGroup* bumpee); -void Collision_CylinderWithCylinderAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCylinder* toucher, ColCylinder* bumpee); -void Collision_CylinderWithTriGroupAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCylinder* toucher, ColTriGroup* bumpee); -void Collision_CylinderWithQuadAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCylinder* toucher, ColQuad* bumpee); -void Collision_CylinderWithSphereAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCylinder* toucher, ColSphere* bumpee); -void Collision_TriGroupWithSphereGroupAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColTriGroup* toucher, ColSphereGroup* bumpee); -void Collision_TriGroupWithCylinderAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColTriGroup* toucher, ColCylinder* bumpee); -void Collision_TriGroupWithTriGroupAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColTriGroup* toucher, ColTriGroup* bumpee); -void Collision_TriGroupWithQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColTriGroup* toucher, ColQuad* bumpee); -void Collision_TriGroupWithSphereAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColTriGroup* toucher, ColSphere* bumpee); -void Collision_QuadWithSphereGroupAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColQuad* toucher, ColSphereGroup* bumpee); -void Collision_QuadWithCylinderAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColQuad* toucher, ColCylinder* bumpee); -void Collision_QuadWithTriGroupAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColQuad* toucher, ColTriGroup* bumpee); -void Collision_QuadWithQuadAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColQuad* toucher, ColQuad* bumpee); -void Collision_QuadWithSphereAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColQuad* toucher, ColSphere* bumpee); -void Collision_SphereWithSphereGroupAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphere* toucher, ColSphereGroup* bumpee); -void Collision_SphereWithCylinderAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphere* toucher, ColCylinder* bumpee); -void Collision_SphereWithTriGroupAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphere* toucher, ColTriGroup* bumpee); -void Collision_SphereWithQuadAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphere* toucher, ColQuad* bumpee); -void Collision_SphereWithSphereAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphere* toucher, ColSphere* bumpee); -void func_800E60C0(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphereGroup* spheres); -// void func_800E61A0(void); -// void func_800E6238(void); -// void func_800E6320(void); -void func_800E63B8(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphere* sphere); -void func_800E6450(GlobalContext* ctxt, CollisionCheckContext* colCtxt); -void Collision_CollideWithAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCommon* colObj); -void Collision_DoATWithAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt); -// void func_800E6724(void); -void Collision_HandleCollisionOTWithOT(GlobalContext* ctxt, ColCommon* toucher, ColBodyInfo* toucherBody, Vec3f* toucherLoc, ColCommon* bumper, ColBodyInfo* bumperBody, Vec3f* bumperLoc, f32 param_8); -void Collision_SphereGroupWithSphereGroupOT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphereGroup* toucher, ColSphereGroup* bumpee); -void Collision_SphereGroupWithCylinderOT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphereGroup* toucher, ColCylinder* bumpee); -void Collision_SphereGroupWithSphereOT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphereGroup* toucher, ColSphere* bumpee); -void Collision_CylinderWithSphereGroupOT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCylinder* toucher, ColSphereGroup* bumpee); -void Collision_CylinderWithCylinderOT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCylinder* toucher, ColCylinder* bumpee); -void Collision_CylinderWithSphereOT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColCylinder* toucher, ColSphere* bumpee); -void Collision_SphereWithSphereGroupOT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphere* toucher, ColSphereGroup* bumpee); -void Collision_SphereWithCylinderOT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphere* toucher, ColCylinder* bumpee); -void Collision_SphereWithSphereOT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, ColSphere* toucher, ColSphere* bumpee); -// UNK_TYPE4 func_800E7264(ColCommon* iParm1); -// UNK_TYPE4 func_800E7288(ColCommon* piParm1, ColCommon* piParm2); -void Collision_DoOTWithOT(GlobalContext* ctxt, CollisionCheckContext* colCtxt); -void func_800E7494(CollisionCheckInfo* param_1); -void func_800E74DC(CollisionCheckInfo* param_1); -void func_800E7508(s32 param_1, UNK_PTR param_2); -void func_800E7530(CollisionCheckInfo* param_1, DamageTable* param_2, UNK_PTR param_3); -void func_800E755C(CollisionCheckInfo* puParm1, DamageTable* uParm2, UNK_PTR puParm3); -// void func_800E7590(void); -// void func_800E75C8(void); -// void func_800E77EC(void); -// void func_800E7894(void); -// void func_800E78B4(void); -// void func_800E7948(void); -// void func_800E7968(void); -void func_800E7988(GlobalContext* ctxt, CollisionCheckContext* colCtxt); -// void func_800E7A48(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -// void func_800E7B54(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -// void func_800E7BCC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -// void func_800E7C64(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); -// void func_800E7DA8(void); -s32 func_800E7DCC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Vec3f* param_3, Vec3f* param_4, Actor** param_5, s32 param_6); -void Collision_CylinderMoveToActor(Actor* actor, ColCylinder* cylinder); -void Collision_CylinderSetLoc(ColCylinder* cylinder, Vec3s* loc); -void Collision_QuadSetCoords(ColQuad* iParm1, Vec3f* pzParm2, Vec3f* pzParm3, Vec3f* pzParm4, Vec3f* param_5); -void Collision_TriGroupSetCoordsAtIndex(ColTriGroup* tris, s32 index, Vec3f* pzParm3, Vec3f* pzParm4, Vec3f* param_5); -void Collision_InitTriParamsAtIndex(GlobalContext* ctxt, ColTriGroup* tris, s32 index, ColTriParamsInit* init); -// void func_800E7FDC(void); -// void func_800E8160(void); -// void func_800E823C(void); -// void func_800E8318(void); -// void func_800E8478(void); -// void func_800E85D4(UNK_TYPE4 param_1, Vec3f* param_2); -void func_800E8668(GlobalContext* globalCtx, Vec3f* arg2); -// void func_800E8690(void); -// void func_800E86C0(void); -// void func_800E86E0(UNK_TYPE4 param_1, Vec3f* param_2, UNK_TYPE4 param_3); -// void func_800E8784(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8); +DamageTable* DamageTable_Get(s32 index); // func_800E03A0 +void DamageTable_Clear(DamageTable* damageTable); // func_800E03CC +f32 CollisionCheck_GetDamageAndEffectOnBumper(Collider* at, ColliderInfo* atInfo, Collider* ac, ColliderInfo* acInfo, u32* effect); +f32 CollisionCheck_ApplyBumperDefense(f32 damage, ColliderInfo* ac); +s32 CollisionCheck_GetToucherDamage(Collider* at, ColliderInfo* atInfo, Collider* ac, ColliderInfo* acInfo); +s32 Collider_InitBase(GlobalContext* ctxt, Collider* collider); +s32 Collider_DestroyBase(GlobalContext* ctxt, Collider* collider); +s32 Collider_SetBaseToActor(GlobalContext* ctxt, Collider* collider, ColliderInitToActor* src); +s32 Collider_SetBaseType1(GlobalContext* ctxt, Collider* collider, Actor* actor, ColliderInitType1* src); +s32 Collider_SetBase(GlobalContext* ctxt, Collider* collider, Actor* actor, ColliderInit* src); +void Collider_ResetATBase(GlobalContext* ctxt, Collider* collider); +void Collider_ResetACBase(GlobalContext* ctxt, Collider* collider); +void Collider_ResetOCBase(GlobalContext* ctxt, Collider* collider); +s32 Collider_InitTouch(GlobalContext* ctxt, ColliderTouch* touch); +s32 Collider_DestroyTouch(GlobalContext* ctxt, ColliderTouch* touch); +s32 Collider_SetTouch(GlobalContext* ctxt, ColliderTouch* touch, ColliderTouchInit* src); +void Collider_ResetATInfoUnk(GlobalContext* ctxt, ColliderInfo* info); +s32 Collider_InitBump(GlobalContext* ctxt, ColliderBump* bump); +s32 Collider_DestroyBump(GlobalContext* ctxt, ColliderBump* bump); +s32 Collider_SetBump(GlobalContext* ctxt, ColliderBump* bump, ColliderBumpInit* src); +s32 Collider_InitInfo(GlobalContext* ctxt, ColliderInfo* info); +s32 Collider_DestroyInfo(GlobalContext* ctxt, ColliderInfo* info); +s32 Collider_SetInfo(GlobalContext* ctxt, ColliderInfo* info, ColliderInfoInit* src); +void Collider_ResetATInfo(GlobalContext* ctxt, ColliderInfo* info); +void Collider_ResetACInfo(GlobalContext* ctxt, ColliderInfo* info); +void Collider_ResetOCInfo(GlobalContext* ctxt, ColliderInfo* info); +s32 Collider_InitJntSphElementDim(GlobalContext* ctxt, ColliderJntSphElementDim* dim); +s32 Collider_DestroyJntSphElementDim(GlobalContext* ctxt, ColliderJntSphElementDim* dim); +s32 Collider_SetJntSphElementDim(GlobalContext* ctxt, ColliderJntSphElementDim* dest, ColliderJntSphElementDimInit* src); +s32 Collider_InitJntSphElement(GlobalContext* ctxt, ColliderJntSphElement* element); +s32 Collider_DestroyJntSphElement(GlobalContext* ctxt, ColliderJntSphElement* element); +s32 Collider_SetJntSphElement(GlobalContext* ctxt, ColliderJntSphElement* dest, ColliderJntSphElementInit* src); +s32 Collider_ResetJntSphElementAT(GlobalContext* ctxt, ColliderJntSphElement* collider); +s32 Collider_ResetJntSphElementAC(GlobalContext* ctxt, ColliderJntSphElement* collider); +s32 Collider_ResetJntSphElementOC(GlobalContext* ctxt, ColliderJntSphElement* collider); +s32 Collider_InitJntSph(GlobalContext* ctxt, ColliderJntSph* collider); +s32 Collider_FreeJntSph(GlobalContext* ctxt, ColliderJntSph* collider); +s32 Collider_DestroyJntSph(GlobalContext* ctxt, ColliderJntSph* collider); +s32 Collider_SetJntSphToActor(GlobalContext* ctxt, ColliderJntSph* collider, ColliderJntSphInitToActor* src); +s32 Collider_SetJntSphAllocType1(GlobalContext* ctxt, ColliderJntSph* sphereGroup, Actor* actor, ColliderJntSphInitType1* src); +s32 Collider_SetJntSph(GlobalContext* ctxt, ColliderJntSph* sphereGroup, Actor* actor, ColliderJntSphInit* src, ColliderJntSphElement* elements); +s32 Collider_InitAndSetJntSph(GlobalContext* ctxt, ColliderJntSph* sphereGroup, Actor* actor, ColliderJntSphInit* src, ColliderJntSphElement* elements); +s32 Collider_ResetJntSphAT(GlobalContext* ctxt, Collider* collider); +s32 Collider_ResetJntSphAC(GlobalContext* ctxt, Collider* collider); +s32 Collider_ResetJntSphOC(GlobalContext* ctxt, Collider* collider); +s32 Collider_InitCylinderDim(GlobalContext* ctxt, Cylinder16* dim); +s32 Collider_DestroyCylinderDim(GlobalContext* ctxt, Cylinder16* dim); +s32 Collider_SetCylinderDim(GlobalContext* ctxt, Cylinder16* dim, Cylinder16* src); +s32 Collider_InitCylinder(GlobalContext* ctxt, ColliderCylinder* collider); +s32 Collider_DestroyCylinder(GlobalContext* ctxt, ColliderCylinder* collider); +s32 Collider_SetCylinderToActor(GlobalContext* ctxt, ColliderCylinder* collider, ColliderCylinderInitToActor* src); +s32 Collider_SetCylinderType1(GlobalContext* ctxt, ColliderCylinder* collider, Actor* actor, ColliderCylinderInitType1* src); +s32 Collider_SetCylinder(GlobalContext* ctxt, ColliderCylinder* collider, Actor* actor, ColliderCylinderInit* src); +s32 Collider_InitAndSetCylinder(GlobalContext* ctxt, ColliderCylinder* collider, Actor* actor, ColliderCylinderInit* src); +s32 Collider_ResetCylinderAT(GlobalContext* ctxt, Collider* collider); +s32 Collider_ResetCylinderAC(GlobalContext* ctxt, Collider* collider); +s32 Collider_ResetCylinderOC(GlobalContext* ctxt, Collider* collider); +s32 Collider_InitTrisElementDim(GlobalContext* ctxt, TriNorm* dim); +s32 Collider_DestroyTrisElementDim(GlobalContext* ctxt, TriNorm* dim); +s32 Collider_SetTrisElementDim(GlobalContext* ctxt, TriNorm* dim, ColliderTrisElementDimInit* src); +s32 Collider_InitTrisElement(GlobalContext* ctxt, ColliderTrisElement* element); +s32 Collider_DestroyTrisElement(GlobalContext* ctxt, ColliderTrisElement* element); +s32 Collider_SetTrisElement(GlobalContext* ctxt, ColliderTrisElement* element, ColliderTrisElementInit* src); +s32 Collider_ResetTrisElementAT(GlobalContext* ctxt, ColliderTrisElement* element); +s32 Collider_ResetTrisElementAC(GlobalContext* ctxt, ColliderTrisElement* element); +s32 Collider_ResetTrisElementOC(GlobalContext* ctxt, ColliderTrisElement* element); +s32 Collider_InitTris(GlobalContext* ctxt, ColliderTris* tris); +s32 Collider_FreeTris(GlobalContext* ctxt, ColliderTris* tris); +s32 Collider_DestroyTris(GlobalContext* ctxt, ColliderTris* tris); +s32 Collider_SetTrisAllocType1(GlobalContext* ctxt, ColliderTris* tris, Actor* actor, ColliderTrisInitType1* src); +s32 Collider_SetTris(GlobalContext* ctxt, ColliderTris* triGroup, Actor* actor, ColliderTrisInit* src, ColliderTrisElement* tris); +s32 Collider_InitAndSetTris(GlobalContext* ctxt, ColliderTris* tris, Actor* actor, ColliderTrisInit* src, ColliderTrisElement* elements); +s32 Collider_ResetTrisAT(GlobalContext* ctxt, Collider* collider); +s32 Collider_ResetTrisAC(GlobalContext* ctxt, Collider* collider); +s32 Collider_ResetTrisOC(GlobalContext* ctxt, Collider* collider); +s32 Collider_InitQuadDim(GlobalContext* ctxt, ColliderQuadDim* dim); +s32 Collider_DestroyQuadDim(GlobalContext* ctxt, ColliderQuadDim* dim); +s32 Collider_ResetQuadACDist(GlobalContext* ctxt, ColliderQuadDim* dim); +void Collider_SetQuadMidpoints(ColliderQuadDim* dim); +s32 Collider_SetQuadDim(GlobalContext* ctxt, ColliderQuadDim* dim, ColliderQuadDimInit* init); +s32 Collider_InitQuad(GlobalContext* ctxt, ColliderQuad* collider); +s32 Collider_DestroyQuad(GlobalContext* ctxt, ColliderQuad* collider); +s32 Collider_SetQuadType1(GlobalContext* ctxt, ColliderQuad* collider, Actor* actor, ColliderQuadInitType1* src); +s32 Collider_SetQuad(GlobalContext* ctxt, ColliderQuad* collider, Actor* actor, ColliderQuadInit* src); +s32 Collider_InitAndSetQuad(GlobalContext* ctxt, ColliderQuad* collider, Actor* actor, ColliderQuadInit* src); +s32 Collider_ResetQuadAT(GlobalContext* ctxt, Collider* collider); +s32 Collider_ResetQuadAC(GlobalContext* ctxt, Collider* collider); +s32 Collider_ResetQuadOC(GlobalContext* ctxt, Collider* collider); +s32 Collider_QuadSetNearestAC(GlobalContext* ctxt, ColliderQuad* quad, Vec3f* hitPos); +s32 Collider_InitSphere(GlobalContext* ctxt, ColliderSphere* collider); +s32 Collider_DestroySphere(GlobalContext* ctxt, ColliderSphere* collider); +s32 Collider_SetSphere(GlobalContext* ctxt, ColliderSphere* collider, Actor* actor, ColliderSphereInit* src); +s32 Collider_InitAndSetSphere(GlobalContext* ctxt, ColliderSphere* collider, Actor* actor, ColliderSphereInit* src); +s32 Collider_ResetSphereAT(GlobalContext* ctxt, Collider* collider); +s32 Collider_ResetSphereAC(GlobalContext* ctxt, Collider* collider); +s32 Collider_ResetSphereOC(GlobalContext* ctxt, Collider* collider); +s32 Collider_InitLine(GlobalContext* ctxt, OcLine* line); +s32 Collider_DestroyLine(GlobalContext* ctxt, OcLine* line); +s32 Collider_SetLinePoints(GlobalContext* ctxt, OcLine* line, Vec3f* a, Vec3f* b); +s32 Collider_SetLine(GlobalContext* ctxt, OcLine* line, OcLine* src); +s32 Collider_ResetLineOC(GlobalContext* ctxt, OcLine* line); +void CollisionCheck_InitContext(GlobalContext* ctxt, CollisionCheckContext* colCtxt); +void CollisionCheck_DestroyContext(GlobalContext* ctxt, CollisionCheckContext* colCtxt); +void CollisionCheck_ClearContext(GlobalContext* ctxt, CollisionCheckContext* colCtxt); +void CollisionCheck_EnableSAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt); +void CollisionCheck_DisableSAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt); +s32 CollisionCheck_SetAT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +s32 CollisionCheck_SetAT_SAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider, s32 index); +s32 CollisionCheck_SetAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +s32 CollisionCheck_SetAC_SAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider, s32 index); +s32 CollisionCheck_SetOC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +s32 CollisionCheck_SetOC_SAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider, s32 index); +s32 CollisionCheck_SetOCLine(GlobalContext* ctxt, CollisionCheckContext* colCtxt, OcLine* line); +s32 CollisionCheck_SkipTouch(ColliderInfo* info); +s32 CollisionCheck_SkipBump(ColliderInfo* info); +s32 CollisionCheck_NoSharedFlags(ColliderInfo* toucher, ColliderInfo* bumper); +void CollisionCheck_NoBlood(GlobalContext* ctxt, Collider* collider, Vec3f* v); +void CollisionCheck_BlueBlood(GlobalContext* ctxt, Collider* collider, Vec3f* v); +void CollisionCheck_GreenBlood(GlobalContext* ctxt, Collider* collider, Vec3f* v); +void CollisionCheck_WaterBurst(GlobalContext* ctxt, Collider* collider, Vec3f* v); +void CollisionCheck_RedBlood(GlobalContext* ctxt, Collider* collider, Vec3f* v); +void CollisionCheck_RedBloodUnused(GlobalContext* ctxt, Collider* collider, Vec3f* v); +void CollisionCheck_HitSolid(GlobalContext* ctxt, ColliderInfo* info, Collider* collider, Vec3f* hitPos); +s32 CollisionCheck_SwordHitAudio(Collider* at, ColliderInfo* acInfo); +void CollisionCheck_HitEffects(GlobalContext* ctxt, Collider* at, ColliderInfo* atInfo, Collider* ac, ColliderInfo* acInfo, Vec3f* hitPos); +void CollisionCheck_SetBounce(Collider* at, Collider* ac); +s32 CollisionCheck_SetATvsAC(GlobalContext* ctxt, Collider* at, ColliderInfo* atInfo, Vec3f* atPos, Collider* ac, ColliderInfo* acInfo, Vec3f* acPos, Vec3f* hitPos); +void CollisionCheck_TrisAvgPoint(ColliderTrisElement* tri, Vec3f* avg); +void CollisionCheck_QuadAvgPoint(ColliderQuad* quad, Vec3f* avg); +void CollisionCheck_AC_JntSphVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_JntSphVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_JntSphVsTris(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_JntSphVsQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_JntSphVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_CylVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_CylVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_CylVsTris(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_CylVsQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_CylVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_TrisVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_TrisVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_TrisVsTris(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_TrisVsQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_TrisVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_QuadVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_QuadVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_QuadVsTris(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_QuadVsQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_QuadVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_SphereVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_SphereVsCylinder(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_SphereVsTris(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_SphereVsQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_AC_SphereVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC); +void CollisionCheck_SetJntSphHitFX(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +void CollisionCheck_SetCylHitFX(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +void CollisionCheck_SetTrisHitFX(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +void CollisionCheck_SetQuadHitFX(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +void CollisionCheck_SetSphereHitFX(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +void CollisionCheck_SetHitEffects(GlobalContext* ctxt, CollisionCheckContext* colCtxt); +void CollisionCheck_AC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT); +void CollisionCheck_AT(GlobalContext* ctxt, CollisionCheckContext* colCtxt); +s32 CollisionCheck_GetMassType(u8 mass); +void CollisionCheck_SetOCvsOC(GlobalContext* ctxt, Collider* left, ColliderInfo* leftInfo, Vec3f* leftPos, Collider* right, ColliderInfo* rightInfo, Vec3f* rightPos, f32 overlap); +void CollisionCheck_OC_JntSphVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r); +void CollisionCheck_OC_JntSphVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r); +void CollisionCheck_OC_JntSphVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r); +void CollisionCheck_OC_CylVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r); +void CollisionCheck_OC_CylVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r); +void CollisionCheck_OC_CylVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r); +void CollisionCheck_OC_SphereVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r); +void CollisionCheck_OC_SphereVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r); +void CollisionCheck_OC_SphereVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r); +s32 CollisionCheck_SkipOC(Collider* collider); +s32 CollisionCheck_Incompatible(Collider* left, Collider* right); +void CollisionCheck_OC(GlobalContext* ctxt, CollisionCheckContext* colCtxt); +void CollisionCheck_InitInfo(CollisionCheckInfo* info); +void CollisionCheck_ResetDamage(CollisionCheckInfo* info); +void CollisionCheck_SetInfoNoDamageTable(CollisionCheckInfo* info, CollisionCheckInfoInit* init); +void CollisionCheck_SetInfo(CollisionCheckInfo* info, DamageTable* damageTable, CollisionCheckInfoInit* init); +void CollisionCheck_SetInfo2(CollisionCheckInfo* info, DamageTable* damageTable, CollisionCheckInfoInit2* init); +void CollisionCheck_SetInfoGetDamageTable(CollisionCheckInfo* info, s32 index, CollisionCheckInfoInit2* init); +void CollisionCheck_ApplyDamage(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider, ColliderInfo* info); +void CollisionCheck_ApplyDamageJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +void CollisionCheck_ApplyDamageCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +void CollisionCheck_ApplyDamageTris(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +void CollisionCheck_ApplyDamageQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +void CollisionCheck_ApplyDamageSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider); +void CollisionCheck_Damage(GlobalContext* ctxt, CollisionCheckContext* colCtxt); +s32 CollisionCheck_LineOC_JntSph(GlobalContext* globalCtx, CollisionCheckContext* colChkCtx, Collider* collider, Vec3f* a, Vec3f* b); +s32 CollisionCheck_LineOC_Cyl(GlobalContext* globalCtx, CollisionCheckContext* colChkCtx, Collider* collider, Vec3f* a, Vec3f* b); +s32 CollisionCheck_LineOC_Sphere(GlobalContext* globalCtx, CollisionCheckContext* colChkCtx, Collider* collider, Vec3f* a, Vec3f* b); +s32 CollisionCheck_LineOC(GlobalContext* globalCtx, CollisionCheckContext* colChkCtx, Vec3f* a, Vec3f* b, Actor** exclusions, s32 numExclusions); +s32 CollisionCheck_LineOCCheckAll(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Vec3f* a, Vec3f* b); +s32 CollisionCheck_LineOCCheck(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Vec3f* a, Vec3f* b, Actor** exclusions, s32 numExclusions); +void Collider_UpdateCylinder(Actor* actor, ColliderCylinder* collider); +void Collider_SetCylinderPosition(ColliderCylinder* collider, Vec3s* pos); +void Collider_SetQuadVertices(ColliderQuad* collider, Vec3f* a, Vec3f* b, Vec3f* c, Vec3f* d); +void Collider_SetTrisVertices(ColliderTris* collider, s32 index, Vec3f* a, Vec3f* b, Vec3f* c); +void Collider_SetTrisDim(GlobalContext* ctxt, ColliderTris* collider, s32 index, ColliderTrisElementDimInit* init); +void Collider_UpdateSpheres(s32 limb, ColliderJntSph* collider); +void Collider_UpdateSpheresElement(ColliderJntSph* collider, s32 index, Actor* actor); +void Collider_UpdateSphere(s32 limb, ColliderSphere* collider); +void CollisionCheck_SpawnRedBlood(GlobalContext* ctxt, Vec3f* v); +void CollisionCheck_SpawnWaterDroplets(GlobalContext* ctxt, Vec3f* v); +void CollisionCheck_SpawnShieldParticles(GlobalContext* ctxt, Vec3f* v); +void CollisionCheck_SpawnShieldParticlesMetal(GlobalContext* ctxt, Vec3f* v); +void CollisionCheck_SpawnShieldParticlesMetalSound(GlobalContext* ctxt, Vec3f* v, Vec3f* pos); +void CollisionCheck_SpawnShieldParticlesMetal2(GlobalContext* ctxt, Vec3f* v); +void CollisionCheck_SpawnShieldParticlesWood(GlobalContext* ctxt, Vec3f* v, Vec3f* pos); +s32 CollisionCheck_CylSideVsLineSeg(f32 radius, f32 height, f32 offset, Vec3f* actorPos, Vec3f* itemPos, Vec3f* itemProjPos, Vec3f* out1, Vec3f* out2); void func_800E8EA0(GlobalContext* ctxt, Actor* actor, u16 param_3); s32 nop_800E8ED0(UNK_TYPE4 param_1); void nop_800E8EE0(UNK_TYPE4 param_1); @@ -2268,7 +2268,7 @@ s32 func_801240C8(ActorPlayer* player); // void func_80125D4C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); // void func_801262C8(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); // void func_801263FC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6); -void func_80126440(GlobalContext* globalCtx, ColCommon* param_2, s32* param_3, Vec3f* param_4, Vec3f* param_5); +void func_80126440(GlobalContext* globalCtx, Collider* param_2, s32* param_3, Vec3f* param_4, Vec3f* param_5); // void func_801265C8(void); // void func_8012669C(void); // void func_80126808(void); @@ -2547,7 +2547,7 @@ void SkelAnime_DrawSV(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* limbD void func_80134148(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* limbDrawTable, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, UnkActorDraw unkDraw, Actor* actor, RSPMatrix** mtx); void func_801343C0(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* limbDrawTable, s32 dListCount, OverrideLimbDraw overrideLimbDraw, PostLimbDraw postLimbDraw, UnkActorDraw unkDraw, Actor* actor); void SkelAnime_AnimateFrame(AnimationHeader* animationSeg, s32 currentFrame, s32 limbCount, Vec3s* dst); -s16 SkelAnime_GetTotalFrames(GenericAnimationHeader *animationSeg); +s16 SkelAnime_GetTotalFrames(GenericAnimationHeader* animationSeg); s16 SkelAnime_GetFrameCount(GenericAnimationHeader* animationSeg); Gfx* SkelAnime_Draw2Limb(GlobalContext* globalCtx, s32 limbIndex, Skeleton* skeleton, Vec3s* limbDrawTable, OverrideLimbDraw2 overrideLimbDraw, PostLimbDraw2 postLimbDraw, Actor* actor, Gfx* gfx); Gfx* SkelAnime_Draw2(GlobalContext* globalCtx, Skeleton* skeleton, Vec3s* limbDrawTable, OverrideLimbDraw2 overrideLimbDraw, PostLimbDraw2 postLimbDraw, Actor* actor, Gfx* gfx); @@ -2559,8 +2559,8 @@ s16 SkelAnime_GetTotalFrames2(GenericAnimationHeader* animationSeg); s16 SkelAnime_GetFrameCount2(GenericAnimationHeader* animationSeg); void SkelAnime_InterpolateVec3s(s32 limbCount, Vec3s* dst, Vec3s* vec2, Vec3s* vec3, f32 unkf); void SkelAnime_AnimationCtxReset(AnimationContext* animationCtx); -void func_801358D4(GlobalContext *globalCtx); -void func_801358F4(GlobalContext *globalCtx); +void func_801358D4(GlobalContext* globalCtx); +void func_801358F4(GlobalContext* globalCtx); AnimationEntry* SkelAnime_NextEntry(AnimationContext* animationCtx, AnimationType type); void SkelAnime_LoadLinkAnimetion(GlobalContext* globalCtx, LinkAnimetionEntry* linkAnimetionSeg, s32 frame, s32 limbCount, void* ram); void SkelAnime_LoadAnimationType1(GlobalContext* globalCtx, s32 vecCount, Vec3s* dst, Vec3s* src); @@ -3336,28 +3336,28 @@ f32 Math3D_NormalizedSignedDistanceFromPlane(f32 normX, f32 normY, f32 normZ, f3 // void func_8017D220(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // void func_8017D2FC(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8); // void func_8017D404(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9, UNK_TYPE4 param_10, UNK_TYPE4 param_11); -void Math3D_TriSetCoords(ColTriParams* tri, Vec3f* pointA, Vec3f* pointB, Vec3f* pointC); -u32 Math3D_IsPointInSphere(ColSphereCollisionInfo* sphere, Vec3f* point); +void Math3D_TriSetCoords(TriNorm* tri, Vec3f* pointA, Vec3f* pointB, Vec3f* pointC); +u32 Math3D_IsPointInSphere(Sphere16* sphere, Vec3f* point); // void func_8017D668(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7, UNK_TYPE4 param_8, UNK_TYPE4 param_9); // void func_8017D7C0(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5, UNK_TYPE4 param_6, UNK_TYPE4 param_7); // void func_8017D814(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // void func_8017D91C(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); // void func_8017DA24(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -s32 Math3D_ColSphereLineSeg(ColSphereCollisionInfo* sphere, LineSegment* line); -void func_8017DD34(ColSphereCollisionInfo* sphere, ColTriParams* tri, Vec3f* pfParm3); -s32 Math3D_ColSphereTri(ColSphereCollisionInfo* sphere, ColTriParams* tri, Vec3f* uParm3); +s32 Math3D_ColSphereLineSeg(Sphere16* sphere, LineSegment* line); +void func_8017DD34(Sphere16* sphere, TriNorm* tri, Vec3f* pfParm3); +s32 Math3D_ColSphereTri(Sphere16* sphere, TriNorm* tri, Vec3f* uParm3); // void func_8017E294(void); // void func_8017E350(UNK_TYPE1 param_1, UNK_TYPE1 param_2, UNK_TYPE1 param_3, UNK_TYPE1 param_4, UNK_TYPE4 param_5); -s32 Math3D_ColCylinderTri(ColCylinderParams* cylinder, ColTriParams* tri, Vec3f* pzParm3); +s32 Math3D_ColCylinderTri(Cylinder16* cylinder, TriNorm* tri, Vec3f* pzParm3); // void func_8017F1A0(void); -s32 Math3D_ColSphereSphere(ColSphereCollisionInfo* sphere1, ColSphereCollisionInfo* sphere2); -s32 Math3D_ColSphereSphereIntersect(ColSphereCollisionInfo* sphere1, ColSphereCollisionInfo* sphere2, f32* intersectAmount); -s32 Math3D_ColSphereSphereIntersectAndDistance(ColSphereCollisionInfo* sphere1, ColSphereCollisionInfo* sphere2, f32* intersectAmount, f32* dist); -s32 Math3D_ColSphereCylinderDistance(ColSphereCollisionInfo* sphere, ColCylinderParams* cylinder, f32* dist); -s32 Math3D_ColSphereCylinderDistanceAndAmount(ColSphereCollisionInfo* sphere, ColCylinderParams* cylinder, f32* dist, f32* intersectAmount); -s32 Math3D_ColCylinderCylinderAmount(ColCylinderParams* cylinder1, ColCylinderParams* cylinder2, f32* intersectAmount); -s32 Math3D_ColCylinderCylinderAmountAndDistance(ColCylinderParams* cylinder1, ColCylinderParams* cylinder2, f32* intersectAmount, f32* dist); -s32 Math3d_ColTriTri(ColTriParams* tri1, ColTriParams* tri2, Vec3f* uParm3); +s32 Math3D_ColSphereSphere(Sphere16* sphere1, Sphere16* sphere2); +s32 Math3D_ColSphereSphereIntersect(Sphere16* sphere1, Sphere16* sphere2, f32* intersectAmount); +s32 Math3D_ColSphereSphereIntersectAndDistance(Sphere16* sphere1, Sphere16* sphere2, f32* intersectAmount, f32* dist); +s32 Math3D_ColSphereCylinderDistance(Sphere16* sphere, Cylinder16* cylinder, f32* dist); +s32 Math3D_ColSphereCylinderDistanceAndAmount(Sphere16* sphere, Cylinder16* cylinder, f32* dist, f32* intersectAmount); +s32 Math3D_ColCylinderCylinderAmount(Cylinder16* cylinder1, Cylinder16* cylinder2, f32* intersectAmount); +s32 Math3D_ColCylinderCylinderAmountAndDistance(Cylinder16* cylinder1, Cylinder16* cylinder2, f32* intersectAmount, f32* dist); +s32 Math3d_ColTriTri(TriNorm* tri1, TriNorm* tri2, Vec3f* uParm3); // void func_8017F9C0(void); // void func_8017FA34(void); // void func_8017FAA8(void); @@ -3833,7 +3833,7 @@ void func_8019E014(void); void play_sound(u16 param_1); void func_8019F128(u16 param_1); // void func_8019F170(void); -void func_8019F1C0(UNK_TYPE4 param_1, u16 param_2); +void func_8019F1C0(Vec3f* pos, u16 sfxId); // void func_8019F208(void); // void func_8019F230(void); // void func_8019F258(void); diff --git a/include/variables.h b/include/variables.h index ccb145a9a4..4f84130847 100644 --- a/include/variables.h +++ b/include/variables.h @@ -358,11 +358,11 @@ extern DmaEntry dmadata[1568]; // extern UNK_TYPE1 D_801AAAB0; // extern UNK_TYPE1 D_801AD370; extern ActorInit En_A_Obj_InitVars; -extern ColCylinderInit enAObjCylinderInit; +extern ColliderCylinderInit enAObjCylinderInit; extern InitChainEntry enAObjInitVar; extern u32 enAObjDisplayLists[2]; extern ActorInit En_Item00_InitVars; -extern ColCylinderInit enItem00CylinderInit; +extern ColliderCylinderInit enItem00CylinderInit; extern InitChainEntry enItem00InitVars[1]; // extern UNK_TYPE1 D_801ADF10; // extern UNK_TYPE1 D_801ADF14; @@ -856,39 +856,32 @@ extern camera_update_func cameraUpdateFuncs[71]; // extern UNK_TYPE4 D_801B9ED4; // extern UNK_TYPE4 D_801B9F04; // extern UNK_TYPE2 D_801B9F0C; -// extern UNK_TYPE4 D_801B9F10; -extern s800E03A0 D_801B9F20[23]; -extern f32 gDamageMultipliers[16]; -extern ColCommon defaultColCommon; -extern ColTouch defaultColTouch; -extern ColBump defaultColBump; -extern ColBodyInfo defaultColBodyInfo; -extern ColSphereParams defaultColSphereInfo; -extern ColCylinderParams defaultColCylinderInfo; -extern ColTriParams defaultColTriParams; -extern ColQuadParams defaultColQuadParams; -// extern UNK_TYPE1 D_801BA32C; -extern collision_add_func collisionAddATFuncs[5]; -extern collision_add_func collisionAddACFuncs[5]; -extern collision_add_func collisionAddOTFuncs[5]; -extern UNK_PTR D_801BA374; -// extern UNK_TYPE1 D_801BA38C; -// extern UNK_TYPE1 D_801BA38D; -extern UNK_PTR D_801BA3A8; -extern collision_func collisionFuncTableATwithAC[25]; -extern collision_func collisionFuncTableOTwithOT[25]; -extern CollisionCheckInfo D_801BA484; -extern UNK_PTR D_801BA4A0; -// extern UNK_TYPE1 D_801BA4B4; -extern EffShieldParticleInit D_801BA4C8; -// extern UNK_TYPE1 D_801BA4F6; -// extern UNK_TYPE1 D_801BA4F8; -// extern UNK_TYPE1 D_801BA4FA; -extern EffShieldParticleInit D_801BA508; -// extern UNK_TYPE1 D_801BA536; -// extern UNK_TYPE1 D_801BA538; -// extern UNK_TYPE1 D_801BA53A; -// extern UNK_TYPE1 D_801BA550; +extern UNK_TYPE4 D_801B9F10; +extern DamageTable sDamageTablePresets[23]; +extern f32 damageMultipliers[16]; +extern Collider defaultCollider; +extern ColliderTouch defaultColliderTouch; +extern ColliderBump defaultColliderBump; +extern ColliderInfo defaultColliderInfo; +extern ColliderJntSphElementDim defaultColliderJntSphElementDim; +extern Cylinder16 defaultColliderCylinderDim; +extern TriNorm defaultColliderTrisElementDim; +extern ColliderQuadDim defaultColliderQuadDim; +extern Vec3f defaultLinePoint; +extern ColChkResetFunc sATResetFuncs[COLSHAPE_MAX]; +extern ColChkResetFunc sACResetFuncs[COLSHAPE_MAX]; +extern ColChkResetFunc sOCResetFuncs[COLSHAPE_MAX]; +extern ColChkBloodFunc sBloodFuncs[6]; +extern HitInfo sHitInfo[14]; +extern ColChkApplyFunc sColChkApplyFuncs[COLSHAPE_MAX]; +extern ColChkVsFunc sACVsFuncs[COLSHAPE_MAX][COLSHAPE_MAX]; +extern ColChkVsFunc sOCVsFuncs[COLSHAPE_MAX][COLSHAPE_MAX]; +extern CollisionCheckInfo defaultColChkInfo; +extern ColChkApplyFunc sApplyDamageFuncs[COLSHAPE_MAX]; +extern ColChkLineFunc sOCLineCheckFuncs[COLSHAPE_MAX]; +extern EffShieldParticleInit shieldParticleInitMetal; +extern EffShieldParticleInit shieldParticleInitWood; +extern UNK_TYPE1 D_801BA550; // extern UNK_TYPE1 D_801BA750; // extern UNK_TYPE1 D_801BA790; // extern UNK_TYPE1 D_801BA7F0; @@ -940,7 +933,7 @@ extern Actor* actorCutsceneCurrentCutsceneActor; extern GlobalContext* actorCutscenesGlobalCtxt; extern s16 actorCutsceneReturnCamera; extern s16 D_801BD8C6; -extern ColCylinderInit fireObjCollisionInit; +extern ColliderCylinderInit fireObjCollisionInit; extern FireObjLightParams D_801BD8FC[2]; extern GameStateOverlay initialGameStateInfo; extern GameStateOverlay D_801BD940; @@ -3866,8 +3859,8 @@ extern f32 D_801EDB98; extern f32 D_801EDB9C; extern f32 D_801EDBA0; // extern UNK_TYPE1 D_801EDBA4; -extern ColSphereCollisionInfo D_801EDBA8; -extern ColTriParams D_801EDBB0; +extern Sphere16 D_801EDBA8; +extern TriNorm D_801EDBB0; // extern UNK_TYPE1 D_801EDBD4; // extern UNK_TYPE1 D_801EDBD8; // extern UNK_TYPE1 D_801EDBDC; @@ -3894,54 +3887,44 @@ extern s16 D_801EDBF0; // extern UNK_TYPE1 D_801EDDE0; // extern UNK_TYPE1 D_801EDDF0; extern Vec3f D_801EDE00; -// extern UNK_TYPE1 D_801EDE10; +extern Vec3f D_801EDE10; extern Vec3f D_801EDE20; -// extern UNK_TYPE1 D_801EDE30; -// extern UNK_TYPE1 D_801EDE40; -// extern UNK_TYPE1 D_801EDE78; -// extern UNK_TYPE1 D_801EDEB0; -// extern UNK_TYPE1 D_801EDEBC; -// extern UNK_TYPE1 D_801EDEC8; -// extern UNK_TYPE1 D_801EDF00; -// extern UNK_TYPE1 D_801EDF38; -// extern UNK_TYPE1 D_801EDF48; -// extern UNK_TYPE1 D_801EDF58; -// extern UNK_TYPE1 D_801EDF90; -// extern UNK_TYPE1 D_801EDFC8; -// extern UNK_TYPE1 D_801EDFD4; -// extern UNK_TYPE1 D_801EDFE0; -// extern UNK_TYPE1 D_801EDFF0; -// extern UNK_TYPE1 D_801EE000; -// extern UNK_TYPE1 D_801EE038; -// extern UNK_TYPE1 D_801EE070; -// extern UNK_TYPE1 D_801EE0A4; -// extern UNK_TYPE1 D_801EE0D8; -// extern UNK_TYPE1 D_801EE0E8; -// extern UNK_TYPE1 D_801EE11C; -// extern UNK_TYPE1 D_801EE150; -// extern UNK_TYPE1 D_801EE188; -// extern UNK_TYPE1 D_801EE1C0; -// extern UNK_TYPE1 D_801EE1C4; -// extern UNK_TYPE1 D_801EE1C8; -// extern UNK_TYPE1 D_801EE1D0; -// extern UNK_TYPE1 D_801EE1D4; -// extern UNK_TYPE1 D_801EE1D8; -// extern UNK_TYPE1 D_801EE1E0; -// extern UNK_TYPE1 D_801EE1E4; -// extern UNK_TYPE1 D_801EE1E8; -// extern UNK_TYPE1 D_801EE1F0; +extern Vec3f D_801EDE30; +extern TriNorm D_801EDE40; +extern TriNorm D_801EDE78; +extern LineSegment D_801EDEB0; +extern TriNorm D_801EDEC8; +extern TriNorm D_801EDF00; +extern Vec3f D_801EDF38; +extern Vec3f D_801EDF48; +extern TriNorm D_801EDF58; +extern TriNorm D_801EDF90; +extern LineSegment D_801EDFC8; +extern Vec3f D_801EDFE0; +extern Vec3f D_801EDFF0; +extern TriNorm D_801EE000; +extern TriNorm D_801EE038; +extern TriNorm D_801EE070[2]; +extern Vec3f D_801EE0D8; +extern TriNorm D_801EE0E8[2]; +extern TriNorm D_801EE150; +extern TriNorm D_801EE188; +extern Vec3f D_801EE1C0; +extern Vec3f D_801EE1D0; +extern Vec3f D_801EE1E0; +extern Vec3f D_801EE1F0; // extern UNK_TYPE1 D_801EE1F4; // extern UNK_TYPE1 D_801EE1F8; extern EffSparkParams D_801EE200; -extern ColTriParams D_801EE6C8; -extern ColTriParams D_801EE700; +extern TriNorm D_801EE6C8; +extern TriNorm D_801EE700; extern EffSparkParams D_801EE738; extern EffSparkParams D_801EEC00; extern EffSparkParams D_801EF0C8; -// extern UNK_TYPE1 D_801EF590; -// extern UNK_TYPE1 D_801EF5C8; -extern ColTriParams D_801EF600; -extern ColTriParams D_801EF638; +extern TriNorm D_801EF590; +extern TriNorm D_801EF5C8; +extern TriNorm D_801EF600; +extern TriNorm D_801EF638; // extern UNK_TYPE1 D_801EF66D; extern SaveContext gSaveContext; // extern UNK_TYPE2 D_801F3F38; diff --git a/include/z64.h b/include/z64.h index 962e9544ce..2a7fef08c1 100644 --- a/include/z64.h +++ b/include/z64.h @@ -446,10 +446,6 @@ typedef void(*osCreateThread_func)(void*); typedef void*(*printf_func)(void*, char*, size_t); -typedef struct { - /* 0x00 */ UNK_TYPE1 pad0[0x20]; -} s800E03A0; // size = 0x20 - typedef struct { /* 0x000 */ OSThread unk0; /* 0x1B0 */ s8 argCount; @@ -627,11 +623,6 @@ typedef struct { /* 0x12 */ OSContPad rel; // X/Y store adjusted } Input; // size = 0x18 -typedef struct { - /* 0x00 */ Vec3f a; - /* 0x0C */ Vec3f b; -} LineSegment; // size = 0x18 - // Permanent save context, kept in regular save files typedef struct { /* 0x0000 */ u32 entranceIndex; // bits 0-3 : offset; 4-8: spawn index; 9-15: scene index @@ -1264,6 +1255,12 @@ typedef struct AudioThreadStruct AudioThreadStruct; typedef struct GlobalContext GlobalContext; +typedef s32 (*ColChkResetFunc)(GlobalContext*, Collider*); +typedef void (*ColChkBloodFunc)(GlobalContext*, Collider*, Vec3f*); +typedef void (*ColChkApplyFunc)(GlobalContext*, CollisionCheckContext*, Collider*); +typedef void (*ColChkVsFunc)(GlobalContext*, CollisionCheckContext*, Collider*, Collider*); +typedef s32 (*ColChkLineFunc)(GlobalContext*, CollisionCheckContext*, Collider*, Vec3f*, Vec3f*); + typedef struct { /* 0x0 */ GlobalContext* ctxt; /* 0x4 */ s32 type; // bitfield, highest set bit determines type @@ -1271,10 +1268,6 @@ typedef struct { /* 0xA */ s16 state; // 0 - stopped, 1 - active, 2 - setup } Quake2Context; // size = 0xC -typedef s32(*collision_add_func)(GlobalContext*, ColCommon*); - -typedef void(*collision_func)(GlobalContext*, CollisionCheckContext*, ColCommon*, ColCommon*); - typedef void(*cutscene_update_func)(GlobalContext* ctxt, CutsceneContext* cCtxt); typedef void(*draw_func)(GlobalContext* ctxt, s16 index); @@ -1526,7 +1519,7 @@ struct FireObj { /* 0x28 */ u8 flags; // bit 0 - ?, bit 1 - ? /* 0x29 */ UNK_TYPE1 pad29[0x1]; /* 0x2A */ s16 ignitionDelay; - /* 0x2C */ ColCylinder collision; + /* 0x2C */ ColliderCylinder collision; /* 0x78 */ FireObjLight light; }; // size = 0x8B @@ -1687,8 +1680,8 @@ typedef struct { typedef struct { /* 0x000 */ Actor base; - /* 0x144 */ ColQuad unk144; - /* 0x1C4 */ ColQuad unk1C4; + /* 0x144 */ ColliderQuad unk144; + /* 0x1C4 */ ColliderQuad unk1C4; /* 0x244 */ Vec3f unk244; /* 0x250 */ f32 unk250; /* 0x254 */ f32 unk254; @@ -1711,9 +1704,9 @@ struct ActorEnBji01 { struct ActorEnBom { /* 0x000 */ Actor base; - /* 0x144 */ ColCylinder unk144; - /* 0x190 */ ColSphereGroup unk190; - /* 0x1B0 */ ColSphereGroupElement unk1B0[1]; + /* 0x144 */ ColliderCylinder unk144; + /* 0x190 */ ColliderJntSph unk190; + /* 0x1B0 */ ColliderJntSphElement unk1B0[1]; /* 0x1F0 */ s16 unk1F0; /* 0x1F2 */ UNK_TYPE1 pad1F2[0x6]; /* 0x1F8 */ u8 unk1F8; @@ -1741,7 +1734,7 @@ struct ActorEnFirefly { /* 0x2EC */ f32 unk2EC; /* 0x2F0 */ f32 unk2F0; /* 0x2F4 */ UNK_TYPE1 pad2F4[0x28]; - /* 0x31C */ ColSphere collision; + /* 0x31C */ ColliderSphere collision; }; // size = 0x374 struct ActorEnTest { @@ -1771,8 +1764,8 @@ typedef struct { struct ActorObjBell { /* 0x000 */ Actor base; /* 0x144 */ UNK_TYPE1 pad144[0x18]; - /* 0x15C */ ColSphere unk15C; - /* 0x1B4 */ ColSphere unk1B4; + /* 0x15C */ ColliderSphere unk15C; + /* 0x1B4 */ ColliderSphere unk1B4; /* 0x20C */ UNK_TYPE1 pad20C[0x2]; /* 0x20E */ s16 unk20E; /* 0x210 */ UNK_TYPE1 pad210[0x4]; @@ -1782,7 +1775,7 @@ struct ActorObjBell { struct ActorBgIknvObj { /* 0x000 */ DynaPolyActor bg; - /* 0x15C */ ColCylinder collision; + /* 0x15C */ ColliderCylinder collision; /* 0x1A8 */ u32 displayListAddr; /* 0x1AC */ ActorFunc updateFunc; }; // size = 0x1B0 diff --git a/include/z64actor.h b/include/z64actor.h index 334084feb4..1f97ac8b81 100644 --- a/include/z64actor.h +++ b/include/z64actor.h @@ -6,6 +6,9 @@ #include #include +#define MASS_IMMOVABLE 0xFF // Cannot be pushed by OC collisions +#define MASS_HEAVY 0xFE // Can only be pushed by OC collisions with IMMOVABLE and HEAVY objects. + struct Actor; struct GlobalContext; struct LightMapper; @@ -19,9 +22,38 @@ typedef struct { } PosRot; // size = 0x14 typedef struct { - /* 0x00 */ u8 table[32]; + /* 0x00 */ u8 attack[32]; } DamageTable; // size = 0x20 +typedef struct { + /* 0x00 */ u8 health; + /* 0x02 */ s16 cylRadius; + /* 0x04 */ s16 cylHeight; + /* 0x06 */ u8 mass; +} CollisionCheckInfoInit; + +typedef struct { + /* 0x00 */ u8 health; + /* 0x02 */ s16 cylRadius; + /* 0x04 */ s16 cylHeight; + /* 0x06 */ s16 cylYShift; + /* 0x08 */ u8 mass; +} CollisionCheckInfoInit2; + +typedef struct { + /* 0x00 */ DamageTable* damageTable; + /* 0x04 */ Vec3f displacement; + /* 0x10 */ s16 cylRadius; + /* 0x12 */ s16 cylHeight; + /* 0x14 */ s16 cylYShift; + /* 0x16 */ u8 mass; + /* 0x17 */ u8 health; + /* 0x18 */ u8 damage; + /* 0x19 */ u8 damageEffect; + /* 0x1A */ u8 atHitEffect; + /* 0x1B */ u8 acHitEffect; +} CollisionCheckInfo; // size = 0x1C + typedef struct { /* 0x00 */ s32 unk0; /* 0x04 */ s32 unk4; @@ -43,21 +75,6 @@ typedef struct { /* 0x3A */ s16 unk3A; } ActorEnTest20C; // size = 0x3C -// Related to collision? -typedef struct { - /* 0x00 */ DamageTable* damageTable; - /* 0x04 */ Vec3f displacement; // Amount to correct velocity (0x5C) by when colliding into a body - /* 0x10 */ s16 cylRadius; // Used for various purposes - /* 0x12 */ s16 cylHeight; // Used for various purposes - /* 0x14 */ s16 cylYShift; // Unused. Purpose inferred from Cylinder16 and CollisionCheck_CylSideVsLineSeg - /* 0x16 */ u8 mass; // Used to compute displacement for OC collisions - /* 0x17 */ u8 health; // Note: some actors may use their own health variable instead of this one - /* 0x18 */ u8 damage; // Amount to decrement health by - /* 0x19 */ u8 damageEffect; // Stores what effect should occur when hit by a weapon - /* 0x1A */ u8 atHitEffect; // Stores what effect should occur when AT connects with an AC - /* 0x1B */ u8 acHitEffect; // Stores what effect should occur when AC is touched by an AT -} CollisionCheckInfo; // size = 0x1C - typedef struct { /* 0x00 */ s16 id; /* 0x02 */ u8 type; @@ -248,14 +265,14 @@ typedef struct { /* 0x150 */ s16 unk150; /* 0x152 */ s16 unk152; /* 0x154 */ f32 unk154; - /* 0x158 */ ColCylinder collision; + /* 0x158 */ ColliderCylinder collision; /* 0x1A4 */ UNK_TYPE1 pad1A4[0x4]; } ActorEnItem00; // size = 0x1A8 typedef struct { /* 0x000 */ Actor base; /* 0x144 */ ActorFunc update; - /* 0x148 */ ColCylinder collision; + /* 0x148 */ ColliderCylinder collision; /* 0x194 */ UNK_TYPE1 pad194[0x14]; } ActorEnAObj; // size = 0x1A8 diff --git a/include/z64collision_check.h b/include/z64collision_check.h index 2000669aa6..ef421c4258 100644 --- a/include/z64collision_check.h +++ b/include/z64collision_check.h @@ -8,224 +8,387 @@ struct Actor; typedef struct { - /* 0x0 */ u32 unk0; - /* 0x4 */ u8 unk4; - /* 0x5 */ u8 unk5; -} ColBumpInit; // size = 0x8 + /* 0x00 */ struct Actor* actor; // Attached actor + /* 0x04 */ struct Actor* at; // Actor attached to what it collided with as an AT collider. + /* 0x08 */ struct Actor* ac; // Actor attached to what it collided with as an AC collider. + /* 0x0C */ struct Actor* oc; // Actor attached to what it collided with as an OC collider. + /* 0x10 */ u8 atFlags; // Information flags for AT collisions. + /* 0x11 */ u8 acFlags; // Information flags for AC collisions. + /* 0x12 */ u8 ocFlags1; // Information flags for OC collisions. + /* 0x13 */ u8 ocFlags2; // Flags related to which colliders it can OC collide with. + /* 0x14 */ u8 colType; // Determines hitmarks and sound effects during AC collisions. + /* 0x15 */ u8 shape; // JntSph, Cylinder, Tris, or Quad +} Collider; // size = 0x18 typedef struct { - /* 0x0 */ u8 unk0; - /* 0x1 */ u8 unk1; - /* 0x2 */ u8 unk2; - /* 0x3 */ u8 unk3; - /* 0x4 */ u8 unk4; - /* 0x5 */ u8 type; -} ColCommonInit; // size = 0x6 + /* 0x00 */ u8 colType; // Determines hitmarks and sound effects during AC collisions. + /* 0x01 */ u8 atFlags; // Information flags for AT collisions. + /* 0x02 */ u8 acFlags; // Information flags for OC collisions. + /* 0x03 */ u8 ocFlags1; // Information flags for OC collisions. + /* 0x04 */ u8 ocFlags2; // Flags related to which colliders it can OC collide with. + /* 0x05 */ u8 shape; // JntSph, Cylinder, Tris, or Quad +} ColliderInit; // size = 0x06 typedef struct { - /* 0x0 */ u32 collidesWith; - /* 0x4 */ u8 unk4; - /* 0x5 */ u8 damage; -} ColTouch; // size = 0x8 + /* 0x00 */ u8 colType; // Determines hitmarks and sound effects during AC collisions. + /* 0x01 */ u8 atFlags; // Information flags for AT collisions. + /* 0x02 */ u8 acFlags; // Information flags for AC collisions. + /* 0x03 */ u8 ocFlags1; // Information flags for OC collisions. + /* 0x04 */ u8 shape; // JntSph, Cylinder, Tris, or Quad +} ColliderInitType1; // size = 0x05 typedef struct { - /* 0x0 */ u32 unk0; - /* 0x4 */ u8 unk4; - /* 0x5 */ u8 unk5; -} ColTouchInit; // size = 0x8 + /* 0x00 */ struct Actor* actor; // Attached actor + /* 0x04 */ u8 atFlags; // Information flags for AT collisions. + /* 0x05 */ u8 acFlags; // Information flags for AC collisions. + /* 0x06 */ u8 ocFlags1; // Information flags for OC collisions. + /* 0x07 */ u8 shape; // JntSph, Cylinder, Tris, or Quad +} ColliderInitToActor; // size = 0x08 typedef struct { - /* 0x00 */ u8 unk0; - /* 0x04 */ ColTouchInit unk4; - /* 0x0C */ ColBumpInit unkC; - /* 0x14 */ u8 unk14; - /* 0x15 */ u8 unk15; - /* 0x16 */ u8 unk16; -} ColBodyInfoInit; // size = 0x18 + /* 0x00 */ u32 dmgFlags; // Toucher damage type flags. + /* 0x04 */ u8 effect; // Damage Effect (Knockback, Fire, etc.) + /* 0x05 */ u8 damage; // Damage or Stun Timer +} ColliderTouch; // size = 0x08 typedef struct { - /* 0x0 */ u32 collidesWith; - /* 0x4 */ u8 unk4; - /* 0x5 */ u8 unk5; - /* 0x6 */ Vec3s unk6; -} ColBump; // size = 0xC + /* 0x00 */ u32 dmgFlags; // Toucher damage type flags. + /* 0x04 */ u8 effect; // Damage Effect (Knockback, Fire, etc.) + /* 0x05 */ u8 damage; // Damage or Stun Timer +} ColliderTouchInit; // size = 0x08 typedef struct { - /* 0x0 */ s16 radius; - /* 0x2 */ s16 height; - /* 0x4 */ s16 yOffset; - /* 0x6 */ Vec3s loc; -} ColCylinderParams; // size = 0xC + /* 0x00 */ u32 dmgFlags; // Bumper damage type flags. + /* 0x04 */ u8 effect; // Damage Effect (Knockback, Fire, etc.) + /* 0x05 */ u8 defense; // Damage Resistance + /* 0x06 */ Vec3s hitPos; // Point of contact +} ColliderBump; // size = 0x0C typedef struct { - /* 0x00 */ Vec3f pointA; - /* 0x0C */ Vec3f pointB; - /* 0x18 */ Vec3f pointC; - /* 0x24 */ Vec3f pointD; - /* 0x30 */ Vec3s unk30; - /* 0x36 */ Vec3s unk36; - /* 0x3C */ f32 unk3C; -} ColQuadParams; // size = 0x40 + /* 0x00 */ u32 dmgFlags; // Bumper exclusion mask + /* 0x04 */ u8 effect; // Damage Effect (Knockback, Fire, etc.) + /* 0x05 */ u8 defense; // Damage Resistance +} ColliderBumpInit; // size = 0x08 + +typedef struct ColliderInfo { + /* 0x00 */ ColliderTouch toucher; // Damage properties when acting as an AT collider + /* 0x08 */ ColliderBump bumper; // Damage properties when acting as an AC collider + /* 0x14 */ u8 elemType; // Affects sfx reaction when attacked by Link and hookability. Full purpose unknown. + /* 0x15 */ u8 toucherFlags; // Information flags for AT collisions + /* 0x16 */ u8 bumperFlags; // Information flags for AC collisions + /* 0x17 */ u8 ocElemFlags; // Information flags for OC collisions + /* 0x18 */ Collider* atHit; // object touching this element's AT collider + /* 0x1C */ Collider* acHit; // object touching this element's AC collider + /* 0x20 */ struct ColliderInfo* atHitInfo; // element that hit the AT collider + /* 0x24 */ struct ColliderInfo* acHitInfo; // element that hit the AC collider +} ColliderInfo; // size = 0x28 typedef struct { - /* 0x00 */ Vec3f pointA; - /* 0x0C */ Vec3f pointB; - /* 0x18 */ Vec3f pointC; - /* 0x24 */ Vec3f pointD; -} ColQuadParamsInit; // size = 0x30 + /* 0x00 */ u8 elemType; // Affects sfx reaction when attacked by Link and hookability. Full purpose unknown. + /* 0x04 */ ColliderTouchInit toucher; // Damage properties when acting as an AT collider + /* 0x0C */ ColliderBumpInit bumper; // Damage properties when acting as an AC collider + /* 0x14 */ u8 toucherFlags; // Information flags for AT collisions + /* 0x15 */ u8 bumperFlags; // Information flags for AC collisions + /* 0x16 */ u8 ocElemFlags; // Information flags for OC collisions +} ColliderInfoInit; // size = 0x18 typedef struct { - /* 0x0 */ Vec3s loc; - /* 0x6 */ s16 radius; -} ColSphereCollisionInfo; // size = 0x8 + /* 0x00 */ Sphere16 modelSphere; // model space sphere + /* 0x08 */ Sphere16 worldSphere; // world space sphere + /* 0x10 */ f32 scale; // worldsphere = modelsphere * scale * 0.01 + /* 0x14 */ u8 limb; // attached limb +} ColliderJntSphElementDim; // size = 0x18 typedef struct { - /* 0x00 */ Vec3s unk0; - /* 0x06 */ s16 unk6; - /* 0x08 */ ColSphereCollisionInfo colInfo; - /* 0x10 */ f32 unk10; - /* 0x14 */ u8 unk14; - /* 0x15 */ UNK_TYPE1 pad15[0x3]; -} ColSphereParams; // size = 0x18 + /* 0x00 */ u8 limb; // attached limb + /* 0x02 */ Sphere16 modelSphere; // model space sphere + /* 0x0A */ s16 scale; // world space sphere = model * scale * 0.01 +} ColliderJntSphElementDimInit; // size = 0x0C typedef struct { - /* 0x0 */ u8 unk0; - /* 0x1 */ ColSphereCollisionInfo unk1; - /* 0xA */ s16 unkA; -} ColSphereParamsInit; // size = 0xC + /* 0x00 */ ColliderInfo info; + /* 0x28 */ ColliderJntSphElementDim dim; +} ColliderJntSphElement; // size = 0x40 typedef struct { - /* 0x00 */ Vec3f pointA; - /* 0x0C */ Vec3f pointB; - /* 0x18 */ Vec3f pointC; - /* 0x24 */ Vec3f unitNormal; - /* 0x30 */ f32 unk30; -} ColTriParams; // size = 0x34 + /* 0x00 */ ColliderInfoInit info; + /* 0x18 */ ColliderJntSphElementDimInit dim; +} ColliderJntSphElementInit; // size = 0x24 typedef struct { - /* 0x00 */ Vec3f unk0; - /* 0x0C */ Vec3f unkC; - /* 0x18 */ Vec3f unk18; -} ColTriParamsInit; // size = 0x24 + /* 0x00 */ Collider base; + /* 0x18 */ s32 count; + /* 0x1C */ ColliderJntSphElement* elements; +} ColliderJntSph; // size = 0x20 typedef struct { - /* 0x00 */ ColCommonInit base; - /* 0x08 */ ColBodyInfoInit body; - /* 0x20 */ ColCylinderParams info; -} ColCylinderInit; // size = 0x2C + /* 0x0 */ ColliderInit base; + /* 0x8 */ s32 count; + /* 0xC */ ColliderJntSphElementInit* elements; +} ColliderJntSphInit; // size = 0x10 typedef struct { - /* 0x00 */ ColCommonInit base; - /* 0x08 */ ColBodyInfoInit body; - /* 0x20 */ ColQuadParamsInit params; -} ColQuadInit; // size = 0x50 + /* 0x00 */ ColliderInitType1 base; + /* 0x08 */ s32 count; + /* 0x0C */ ColliderJntSphElementInit* elements; +} ColliderJntSphInitType1; // size = 0x10 typedef struct { - /* 0x00 */ ColBodyInfoInit body; - /* 0x18 */ ColSphereParamsInit params; -} ColSphereGroupElementInit; // size = 0x24 + /* 0x00 */ ColliderInitToActor base; + /* 0x08 */ s32 count; + /* 0x0C */ ColliderJntSphElementInit* elements; +} ColliderJntSphInitToActor; // size = 0x10 typedef struct { - /* 0x0 */ ColCommonInit base; - /* 0x6 */ UNK_TYPE1 pad6[0x2]; - /* 0x8 */ u32 count; - /* 0xC */ ColSphereGroupElementInit* init; -} ColSphereGroupInit; // size = 0x10 + /* 0x00 */ Collider base; + /* 0x18 */ ColliderInfo info; + /* 0x40 */ Cylinder16 dim; +} ColliderCylinder; // size = 0x4C typedef struct { - /* 0x00 */ ColCommonInit base; - /* 0x08 */ ColBodyInfoInit body; - /* 0x20 */ ColSphereParamsInit info; -} ColSphereInit; // size = 0x2C + /* 0x00 */ ColliderInit base; + /* 0x08 */ ColliderInfoInit info; + /* 0x20 */ Cylinder16 dim; +} ColliderCylinderInit; // size = 0x2C typedef struct { - /* 0x00 */ ColBodyInfoInit body; - /* 0x18 */ ColTriParamsInit params; -} ColTriInit; // size = 0x3C + /* 0x00 */ ColliderInitType1 base; + /* 0x08 */ ColliderInfoInit info; + /* 0x20 */ Cylinder16 dim; +} ColliderCylinderInitType1; // size = 0x2C typedef struct { - /* 0x0 */ ColCommonInit base; - /* 0x8 */ u32 count; - /* 0xC */ ColTriInit* elemInit; -} ColTriGroupInit; // size = 0x10 + /* 0x00 */ ColliderInitToActor base; + /* 0x08 */ ColliderInfoInit info; + /* 0x20 */ Cylinder16 dim; +} ColliderCylinderInitToActor; // size = 0x2C typedef struct { - /* 0x00 */ struct Actor* actor; - /* 0x04 */ struct Actor* collisionAT; - /* 0x08 */ struct Actor* collisionAC; - /* 0x0C */ struct Actor* collisionOT; - /* 0x10 */ u8 flagsAT; - /* 0x11 */ u8 flagsAC; // bit 1 - collision occured? - /* 0x12 */ u8 unk12; - /* 0x13 */ u8 unk13; - /* 0x14 */ u8 unk14; - /* 0x15 */ u8 type; - /* 0x16 */ UNK_TYPE1 pad16[0x2]; -} ColCommon; // size = 0x18 + /* 0x00 */ Vec3f vtx[3]; +} ColliderTrisElementDimInit; // size = 0x24 typedef struct { - /* 0x000 */ s16 ATgroupLength; - /* 0x002 */ u16 flags; // bit 0: collision bodies can't be added or removed, only swapped out - /* 0x004 */ ColCommon* ATgroup[50]; - /* 0x0CC */ s32 ACgroupLength; - /* 0x0D0 */ ColCommon* ACgroup[60]; - /* 0x1C0 */ s32 OTgroupLength; - /* 0x1C4 */ ColCommon* OTgroup[50]; - /* 0x28C */ s32 group4Length; - /* 0x290 */ ColCommon* group4[3]; + /* 0x00 */ ColliderInfo info; + /* 0x28 */ TriNorm dim; +} ColliderTrisElement; // size = 0x5C + +typedef struct { + /* 0x00 */ ColliderInfoInit info; + /* 0x18 */ ColliderTrisElementDimInit dim; +} ColliderTrisElementInit; // size = 0x3C + +typedef struct { + /* 0x00 */ Collider base; + /* 0x18 */ s32 count; + /* 0x1C */ ColliderTrisElement* elements; +} ColliderTris; // size = 0x20 + +typedef struct { + /* 0x0 */ ColliderInit base; + /* 0x8 */ s32 count; + /* 0xC */ ColliderTrisElementInit* elements; +} ColliderTrisInit; // size = 0x10 + +typedef struct { + /* 0x00 */ ColliderInitType1 base; + /* 0x08 */ s32 count; + /* 0x0C */ ColliderTrisElementInit* elements; +} ColliderTrisInitType1; // size = 0x10 + +typedef struct { + /* 0x00 */ Vec3f quad[4]; + /* 0x30 */ Vec3s dcMid; // midpoint of vectors d, c + /* 0x36 */ Vec3s baMid; // midpoint of vectors b, a + /* 0x3C */ f32 acDist; // distance to nearest AC collision this frame. +} ColliderQuadDim; // size = 0x40 + +typedef struct { + /* 0x00 */ Vec3f quad[4]; +} ColliderQuadDimInit; // size = 0x30 + +typedef struct { + /* 0x00 */ Collider base; + /* 0x18 */ ColliderInfo info; + /* 0x40 */ ColliderQuadDim dim; +} ColliderQuad; // size = 0x80 + +typedef struct { + /* 0x00 */ ColliderInit base; + /* 0x08 */ ColliderInfoInit info; + /* 0x20 */ ColliderQuadDimInit dim; +} ColliderQuadInit; // size = 0x50 + +typedef struct { + /* 0x00 */ ColliderInitType1 base; + /* 0x08 */ ColliderInfoInit info; + /* 0x20 */ ColliderQuadDimInit dim; +} ColliderQuadInitType1; // size = 0x50 + +typedef struct { + /* 0x00 */ Collider base; + /* 0x18 */ ColliderInfo info; + /* 0x40 */ ColliderJntSphElementDim dim; +} ColliderSphere; // size = 0x58 + +typedef struct { + /* 0x00 */ ColliderInit base; + /* 0x08 */ ColliderInfoInit info; + /* 0x20 */ ColliderJntSphElementDimInit dim; +} ColliderSphereInit; // size = 0x2C + +typedef struct { + /* 0x00 */ LineSegment line; + /* 0x18 */ u16 ocFlags; +} OcLine; // size = 0x1C + +typedef struct { + /* 0x000 */ s16 colATCount; + /* 0x002 */ u16 sacFlags; // Controls whether new collidors can be added or removed, or only swapped + /* 0x004 */ Collider* colAT[50]; + /* 0x0CC */ s32 colACCount; + /* 0x0D0 */ Collider* colAC[60]; + /* 0x1C0 */ s32 colOCCount; + /* 0x1C4 */ Collider* colOC[50]; + /* 0x28C */ s32 colLineCount; + /* 0x290 */ OcLine* colLine[3]; } CollisionCheckContext; // size = 0x29C -typedef struct ColBodyInfo_t { - /* 0x00 */ ColTouch toucher; - /* 0x08 */ ColBump bumper; - /* 0x14 */ u8 unk14; - /* 0x15 */ u8 unk15; // bit 0: can be toucher in AT-AC collision - /* 0x16 */ u8 unk16; // bit 0: can be bumper in AT-AC collision - /* 0x17 */ u8 unk17; - /* 0x18 */ ColCommon* unk18; - /* 0x1C */ ColCommon* unk1C; - /* 0x20 */ struct ColBodyInfo_t* unk20; - /* 0x24 */ struct ColBodyInfo_t* unk24; -} ColBodyInfo; // size = 0x28 - typedef struct { - /* 0x00 */ ColBodyInfo body; - /* 0x28 */ ColSphereParams params; -} ColSphereGroupElement; // size = 0x40 + /* 0 */ u8 blood; + /* 1 */ u8 effect; +} HitInfo; // size = 0x2 -typedef struct { - /* 0x00 */ ColBodyInfo body; - /* 0x28 */ ColTriParams params; -} ColTri; // size = 0x5C +typedef enum { + /* 0 */ BLOOD_NONE, + /* 1 */ BLOOD_BLUE, + /* 2 */ BLOOD_GREEN, + /* 3 */ BLOOD_WATER, + /* 4 */ BLOOD_RED, + /* 5 */ BLOOD_RED2 +} ColChkBloodType; -typedef struct { - /* 0x00 */ ColCommon base; - /* 0x18 */ ColBodyInfo body; - /* 0x40 */ ColCylinderParams params; -} ColCylinder; // size = 0x4C +typedef enum { + /* 0 */ HIT_WHITE, + /* 1 */ HIT_DUST, + /* 2 */ HIT_RED, + /* 3 */ HIT_SOLID, + /* 4 */ HIT_WOOD, + /* 5 */ HIT_NONE +} ColChkHitType; -typedef struct { - /* 0x00 */ ColCommon base; - /* 0x18 */ ColBodyInfo body; - /* 0x40 */ ColQuadParams params; -} ColQuad; // size = 0x80 +typedef enum { + /* 0 */ MASSTYPE_IMMOVABLE, + /* 1 */ MASSTYPE_HEAVY, + /* 2 */ MASSTYPE_NORMAL +} ColChkMassType; -typedef struct { - /* 0x00 */ ColCommon base; - /* 0x18 */ ColBodyInfo body; - /* 0x40 */ ColSphereParams params; -} ColSphere; // size = 0x58 +typedef enum { + /* 0 */ COLTYPE_HIT0, // Blue blood, white hitmark + /* 1 */ COLTYPE_HIT1, // No blood, dust hitmark + /* 2 */ COLTYPE_HIT2, // Green blood, dust hitmark + /* 3 */ COLTYPE_HIT3, // No blood, white hitmark + /* 4 */ COLTYPE_HIT4, // Water burst, no hitmark + /* 5 */ COLTYPE_HIT5, // No blood, red hitmark + /* 6 */ COLTYPE_HIT6, // Green blood, white hitmark + /* 7 */ COLTYPE_HIT7, // Red blood, white hitmark + /* 8 */ COLTYPE_HIT8, // Blue blood, red hitmark + /* 9 */ COLTYPE_METAL, + /* 10 */ COLTYPE_NONE, + /* 11 */ COLTYPE_WOOD, + /* 12 */ COLTYPE_HARD, + /* 13 */ COLTYPE_TREE +} ColliderType; -typedef struct { - /* 0x00 */ ColCommon base; - /* 0x18 */ u32 count; - /* 0x1C */ ColSphereGroupElement* spheres; -} ColSphereGroup; // size = 0x20 +typedef enum { + /* 0 */ COLSHAPE_JNTSPH, + /* 1 */ COLSHAPE_CYLINDER, + /* 2 */ COLSHAPE_TRIS, + /* 3 */ COLSHAPE_QUAD, + /* 4 */ COLSHAPE_SPHERE, + /* 5 */ COLSHAPE_MAX +} ColliderShape; -typedef struct { - /* 0x00 */ ColCommon base; - /* 0x18 */ u32 count; - /* 0x1C */ ColTri* tris; -} ColTriGroup; // size = 0x20 +typedef enum { + /* 0 */ ELEMTYPE_UNK0, + /* 1 */ ELEMTYPE_UNK1, + /* 2 */ ELEMTYPE_UNK2, + /* 3 */ ELEMTYPE_UNK3, + /* 4 */ ELEMTYPE_UNK4, + /* 5 */ ELEMTYPE_UNK5, + /* 6 */ ELEMTYPE_UNK6, + /* 7 */ ELEMTYPE_UNK7 +} ElementType; + +#define SAC_ON (1 << 0) // CollisionContext SAC Flag + +#define AT_NONE 0 // No flags set. Cannot have AT collisions when set as AT +#define AT_ON (1 << 0) // Can have AT collisions when set as AT +#define AT_HIT (1 << 1) // Had an AT collision +#define AT_BOUNCED (1 << 2) // Had an AT collision with an AC_HARD collider +#define AT_TYPE_PLAYER (1 << 3) // Has player-aligned damage +#define AT_TYPE_ENEMY (1 << 4) // Has enemy-aligned damage +#define AT_TYPE_OTHER (1 << 5) // Has non-aligned damage +#define AT_SELF (1 << 6) // Can have AT collisions with colliders attached to the same actor +#define AT_TYPE_ALL (AT_TYPE_PLAYER | AT_TYPE_ENEMY | AT_TYPE_OTHER) // Has all three damage alignments + +#define AC_NONE 0 // No flags set. Cannot have AC collisions when set as AC +#define AC_ON (1 << 0) // Can have AC collisions when set as AC +#define AC_HIT (1 << 1) // Had an AC collision +#define AC_HARD (1 << 2) // Causes AT colliders to bounce off it +#define AC_TYPE_PLAYER AT_TYPE_PLAYER // Takes player-aligned damage +#define AC_TYPE_ENEMY AT_TYPE_ENEMY // Takes enemy-aligned damage +#define AC_TYPE_OTHER AT_TYPE_OTHER // Takes non-aligned damage +#define AC_NO_DAMAGE (1 << 6) // Collider does not take damage +#define AC_BOUNCED (1 << 7) // Caused an AT collider to bounce off it +#define AC_TYPE_ALL (AC_TYPE_PLAYER | AC_TYPE_ENEMY | AC_TYPE_OTHER) // Takes damage from all three alignments + +#define OC1_NONE 0 // No flags set. Cannot have OC collisions when set as OC +#define OC1_ON (1 << 0) // Can have OC collisions when set as OC +#define OC1_HIT (1 << 1) // Had an OC collision +#define OC1_NO_PUSH (1 << 2) // Does not push other colliders away during OC collisions +#define OC1_TYPE_PLAYER (1 << 3) // Can have OC collisions with OC type player +#define OC1_TYPE_1 (1 << 4) // Can have OC collisions with OC type 1 +#define OC1_TYPE_2 (1 << 5) // Can have OC collisions with OC type 2 +#define OC1_TYPE_ALL (OC1_TYPE_PLAYER | OC1_TYPE_1 | OC1_TYPE_2) // Can have collisions with all three OC types + +#define OC2_NONE 0 // No flags set. Has no OC type +#define OC2_HIT_PLAYER (1 << 0) // Had an OC collision with OC type player +#define OC2_UNK1 (1 << 1) // Prevents OC collisions with OC2_UNK2. Some horses and toki_sword have it. +#define OC2_UNK2 (1 << 2) // Prevents OC collisions with OC2_UNK1. Nothing has it. +#define OC2_TYPE_PLAYER OC1_TYPE_PLAYER // Has OC type player +#define OC2_TYPE_1 OC1_TYPE_1 // Has OC type 1 +#define OC2_TYPE_2 OC1_TYPE_2 // Has OC type 2 +#define OC2_FIRST_ONLY (1 << 6) // Skips AC checks on elements after the first collision. Only used by Ganon + +#define TOUCH_NONE 0 // No flags set. Cannot have AT collisions +#define TOUCH_ON (1 << 0) // Can have AT collisions +#define TOUCH_HIT (1 << 1) // Had an AT collision +#define TOUCH_NEAREST (1 << 2) // If a Quad, only collides with the closest bumper +#define TOUCH_SFX_NORMAL (0 << 3) // Hit sound effect based on AC collider's type +#define TOUCH_SFX_HARD (1 << 3) // Always uses hard deflection sound +#define TOUCH_SFX_WOOD (2 << 3) // Always uses wood deflection sound +#define TOUCH_SFX_NONE (3 << 3) // No hit sound effect +#define TOUCH_AT_HITMARK (1 << 5) // Draw hitmarks for every AT collision +#define TOUCH_DREW_HITMARK (1 << 6) // Already drew hitmark for this frame +#define TOUCH_UNK7 (1 << 7) // Unknown purpose. Used by some enemy quads + +#define BUMP_NONE 0 // No flags set. Cannot have AC collisions +#define BUMP_ON (1 << 0) // Can have AC collisions +#define BUMP_HIT (1 << 1) // Had an AC collision +#define BUMP_HOOKABLE (1 << 2) // Can be hooked if actor has hookability flags set. +#define BUMP_NO_AT_INFO (1 << 3) // Does not give its info to the AT collider that hit it. +#define BUMP_NO_DAMAGE (1 << 4) // Does not take damage. +#define BUMP_NO_SWORD_SFX (1 << 5) // Does not have a sound when hit by player-attached AT colliders. +#define BUMP_NO_HITMARK (1 << 6) // Skips hit effects. +#define BUMP_DRAW_HITMARK (1 << 7) // Draw hitmark for AC collision this frame. + +#define OCELEM_NONE 0 // No flags set. Cannot have OC collisions +#define OCELEM_ON (1 << 0) // Can have OC collisions +#define OCELEM_HIT (1 << 1) // Had an OC collision +#define OCELEM_UNK2 (1 << 2) // Unknown purpose. +#define OCELEM_UNK3 (1 << 3) // Unknown purpose. Used by Dead Hand element 0 and Dodongo element 5 + +#define OCLINE_NONE 0 // Did not have an OcLine collision +#define OCLINE_HIT (1 << 0) // Had an OcLine collision #endif diff --git a/include/z64math.h b/include/z64math.h index d3794f4e41..b801ccc5ab 100644 --- a/include/z64math.h +++ b/include/z64math.h @@ -5,16 +5,94 @@ #define SHT_MAX 32767.0f -typedef struct { - /* 0x0 */ f32 x; - /* 0x4 */ f32 y; - /* 0x8 */ f32 z; -} Vec3f; // size = 0xC +#define VEC_SET(V,X,Y,Z) V.x=X;V.y=Y;V.z=Z typedef struct { - /* 0x0 */ s16 x; - /* 0x2 */ s16 y; - /* 0x4 */ s16 z; -} Vec3s; // size = 0x6 + /* 0x00 */ f32 x; + /* 0x04 */ f32 y; +} Vec2f; // size = 0x08 + +typedef struct { + /* 0x00 */ f32 x; + /* 0x04 */ f32 y; + /* 0x08 */ f32 z; +} Vec3f; // size = 0x0C + +typedef struct { + /* 0x00 */ u16 x; + /* 0x02 */ u16 y; + /* 0x04 */ u16 z; +} Vec3us; // size = 0x06 + +typedef struct { + /* 0x00 */ s16 x; + /* 0x02 */ s16 y; + /* 0x04 */ s16 z; +} Vec3s; // size = 0x06 + +typedef struct { + /* 0x00 */ s32 x; + /* 0x04 */ s32 y; + /* 0x08 */ s32 z; +} Vec3i; // size = 0x0C + +typedef struct { + /* 0x00 */ Vec3s center; + /* 0x06 */ s16 radius; +} Sphere16; // size = 0x08 + +typedef struct { + /* 0x00 */ Vec3f center; + /* 0x0C */ f32 radius; +} Spheref; // size = 0x10 + +typedef struct { + /* 0x00 */ Vec3f normal; + /* 0x0C */ f32 originDist; +} Plane; // size = 0x10 + +typedef struct { + /* 0x00 */ Vec3f vtx[3]; + /* 0x24 */ Plane plane; +} TriNorm; // size = 0x34 + +typedef struct { + /* 0x00 */ s16 radius; + /* 0x02 */ s16 height; + /* 0x04 */ s16 yShift; + /* 0x06 */ Vec3s pos; +} Cylinder16; // size = 0x0C + +typedef struct { + /* 0x00 */ f32 radius; + /* 0x04 */ f32 height; + /* 0x08 */ f32 yShift; + /* 0x0C */ Vec3f pos; +} Cylinderf; // size = 0x18 + +typedef struct { + /* 0x00 */ Vec3f point; + /* 0x0C */ Vec3f dir; +} InfiniteLine; // size = 0x18 + +typedef struct { + /* 0x00 */ Vec3f a; + /* 0x0C */ Vec3f b; +} LineSegment; // size = 0x18 + +// Defines a point in the spherical coordinate system +typedef struct { + /* 0x00 */ f32 r; // radius + /* 0x04 */ s16 pitch; // polar (zenith) angle + /* 0x06 */ s16 yaw; // azimuthal angle +} VecSph; // size = 0x08 + +#define IS_ZERO(f) (fabsf(f) < 0.008f) + +// Vector macros +#define SQXZ(vec) ((vec.x) * (vec.x) + (vec.z) * (vec.z)) +#define DOTXZ(vec1, vec2) ((vec1.x) * (vec2.x) + (vec1.z) * (vec2.z)) +#define SQXYZ(vec) ((vec.x) * (vec.x) + (vec.y) * (vec.y) + (vec.z) * (vec.z)) +#define DOTXYZ(vec1, vec2) ((vec1.x) * (vec2.x) + (vec1.y) * (vec2.y) + (vec1.z) * (vec2.z)) #endif diff --git a/linker_scripts/code_script.txt b/linker_scripts/code_script.txt index df24a2b9a0..590a774d72 100644 --- a/linker_scripts/code_script.txt +++ b/linker_scripts/code_script.txt @@ -337,9 +337,9 @@ SECTIONS build/src/code/code_0x800CAE10.o(.text) build/asm/code/code_0x800CB000.o(.text) build/asm/code/z_camera.o(.text) - build/src/code/code_0x800E03A0.o(.text) + build/src/code/z_collision_btltbls.o(.text) . += 0x10; - build/asm/code/z_collision_check.o(.text) + build/src/code/z_collision_check.o(.text) build/src/code/code_0x800E8EA0.o(.text) build/asm/code/code_0x800E9360.o(.text) build/asm/code/z_debug.o(.text) @@ -473,7 +473,8 @@ SECTIONS build/src/code/z_actor_dlftbls.o(.data) build/asm/code/code_data_z_bgcheck.o(.data) build/asm/code/code_data_z_camera.o(.data) - build/asm/code/code_data_z_collision_check.o(.data) + build/src/code/z_collision_btltbls.o(.data) + build/src/code/z_collision_check.o(.data) build/asm/code/code_data_z_debug_display.o(.data) build/asm/code/code_data_z_debug_mode.o(.data) build/asm/code/code_data_z_draw.o(.data) @@ -549,7 +550,7 @@ SECTIONS build/asm/code/code_rodata_z_bgcheck.o(.rodata) build/asm/code/code_rodata_0x800CB000.o(.rodata) build/asm/code/code_rodata_z_camera.o(.rodata) - build/asm/code/code_rodata_z_collision_check.o(.rodata) + build/src/code/z_collision_check.o(.rodata) build/asm/code/code_rodata_0x800E8EA0.o(.rodata) build/asm/code/code_rodata_z_debug_mode.o(.rodata) build/asm/code/code_rodata_z_draw.o(.rodata) diff --git a/src/code/code_0x800A5AC0.c b/src/code/code_0x800A5AC0.c index ae25f25b2d..b4af897f36 100644 --- a/src/code/code_0x800A5AC0.c +++ b/src/code/code_0x800A5AC0.c @@ -8,16 +8,18 @@ void EnAObj_Init(ActorEnAObj* this, GlobalContext* ctxt) { s0->base.textId = ((s0->base.params >> 8) & 0xFF) | 0x300; s0->base.params = (s0->base.params & 0xFF) - 9; Actor_ProcessInitChain((Actor*)s0, &enAObjInitVar); + Actor_SetDrawParams(&s0->base.shape, 0, (ActorShadowFunc)func_800B3FC0, 12); - Collision_InitCylinder(ctxt, &s0->collision, (Actor*)s0, &enAObjCylinderInit); - Collision_CylinderMoveToActor((Actor*)s0, &s0->collision); + Collider_InitAndSetCylinder(ctxt, &s0->collision, (Actor*)s0, &enAObjCylinderInit); + Collider_UpdateCylinder((Actor*)s0, &s0->collision); + s0->base.colChkInfo.mass = 255; s0->update = (ActorFunc)EnAObj_Update1; } void EnAObj_Destroy(ActorEnAObj* this, GlobalContext* ctxt) { - ColCylinder* a2 = &this->collision; - Collision_FiniCylinder(ctxt, a2); + ColliderCylinder* a2 = &this->collision; + Collider_DestroyCylinder(ctxt, a2); } void EnAObj_Update1(ActorEnAObj* this, GlobalContext* ctxt) { @@ -43,7 +45,7 @@ void EnAObj_Update2(ActorEnAObj* this, GlobalContext* ctxt) { void EnAObj_Update(ActorEnAObj* this, GlobalContext* ctxt) { (this->update)((Actor*)this, (GlobalContext*)ctxt); Actor_SetHeight((Actor*)this, 45.0f); - Collision_AddOT(ctxt, &ctxt->colCheckCtx, (ColCommon*)&this->collision); + CollisionCheck_SetOC(ctxt, &ctxt->colCheckCtx, (Collider*)&this->collision); } void EnAObj_Draw(ActorEnAObj* this, GlobalContext* ctxt) { diff --git a/src/code/code_0x800E03A0.c b/src/code/code_0x800E03A0.c deleted file mode 100644 index 7e091e1b24..0000000000 --- a/src/code/code_0x800E03A0.c +++ /dev/null @@ -1,17 +0,0 @@ -#include -#include - -s800E03A0* func_800E03A0(s32 a0) { - if ((a0 < 0) || (a0 > 22)) return 0; - return &(D_801B9F20[a0]); -} - -// Probably zeroes out a s800E03A0? -void func_800E03CC(u8* a0) { - s32 i; - u8* v1; - - for (i = 0, v1 = a0; i < 32; i++) { - *v1++ = 0; - } -} diff --git a/src/code/z_actor.c b/src/code/z_actor.c index 2a9b9af6e0..11a7a5ae53 100644 --- a/src/code/z_actor.c +++ b/src/code/z_actor.c @@ -230,7 +230,7 @@ void Actor_InitToDefaultValues(Actor* actor, GlobalContext* ctxt) { actor->meshAttachedTo = 0x32; actor->sqrdDistToLink = D_801DCA54; - func_800E7494(&actor->colChkInfo); + CollisionCheck_InitInfo(&actor->colChkInfo); actor->uncullZoneForward = 1000.0f; actor->uncullZoneScale = 350.0f; actor->uncullZoneDownward = 700.0f; diff --git a/src/code/z_bgcheck.c b/src/code/z_bgcheck.c index 36ce943f5d..2f839a6d83 100644 --- a/src/code/z_bgcheck.c +++ b/src/code/z_bgcheck.c @@ -76,7 +76,7 @@ void BgCheck_CreateVertexFromVec3f(BgVertex* vertex, Vec3f* vector) { #pragma GLOBAL_ASM("./asm/non_matchings/code/z_bgcheck/func_800C01B8.asm") -#pragma GLOBAL_ASM("./asm/non_matchings/code/z_bgcheck/BgCheck_CreateColTriParamsFromPolygon.asm") +#pragma GLOBAL_ASM("./asm/non_matchings/code/z_bgcheck/BgCheck_CreateTriNormFromPolygon.asm") #pragma GLOBAL_ASM("./asm/non_matchings/code/z_bgcheck/func_800C02C0.asm") diff --git a/src/code/z_collision_btltbls.c b/src/code/z_collision_btltbls.c new file mode 100644 index 0000000000..daa93e5673 --- /dev/null +++ b/src/code/z_collision_btltbls.c @@ -0,0 +1,74 @@ +#include +#include + +DamageTable sDamageTablePresets[] = { + { { 0x10, 0x01, 0x01, 0x02, 0xE0, 0x01, 0xF2, 0x10, 0xF1, 0xF2, 0xF2, 0x22, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x10, 0x01, 0x01, 0x02, 0xE0, 0x01, 0xF2, 0x10, 0xF1, 0xF2, 0xF2, 0x22, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x10, 0x02, 0x01, 0x02, 0x10, 0x02, 0x02, 0x02, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x04, 0x03, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x10, 0x01, 0x01, 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x10, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x10, 0x01, 0x01, 0x00, 0x10, 0x01, 0x01, 0x10, 0x01, 0x01, 0x01, 0x01, 0x31, 0x01, 0x00, 0x00, + 0x00, 0x00, 0x31, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x04, 0x00, 0x02, 0x06, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x00, 0x03, 0x00, 0x06, 0x00, 0x04, 0x04, 0x00, 0x02, 0x06, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x00, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x00, 0x02, 0x00, 0x00, 0x01, 0x00, 0x02, 0x02, 0x01, 0x02, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x10, 0x01, 0x00, 0xE2, 0x10, 0x01, 0x02, 0x10, 0xF1, 0xF2, 0xF2, 0x22, 0x32, 0x01, 0x00, 0x00, + 0x00, 0x22, 0x32, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x00, 0x01, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x02, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x10, 0x01, 0x01, 0x02, 0x10, 0x01, 0x02, 0x10, 0x01, 0x02, 0x02, 0x22, 0x01, 0x01, 0x00, 0x00, + 0x00, 0x22, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x01, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x00, 0x02, 0x01, 0x02, 0x01, 0x02, 0x02, 0x02, 0x01, 0x02, 0x04, 0x04, 0x04, 0x04, 0x00, 0x00, + 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x01, 0x02, 0x04, 0x02, 0x04, 0x08, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x10, 0x01, 0x00, 0x02, 0x10, 0x01, 0x02, 0x10, 0xF1, 0xF2, 0xF2, 0x22, 0x32, 0x01, 0x00, 0x00, + 0x00, 0x22, 0x32, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x10, 0x01, 0x01, 0xF2, 0xE0, 0x01, 0xD2, 0x10, 0x01, 0x02, 0x02, 0x00, 0x32, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x32, 0x00, 0x00, 0x00, 0x01, 0x02, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x10, 0x01, 0x00, 0xF0, 0x10, 0x01, 0xF0, 0x10, 0x01, 0x02, 0x02, 0x00, 0x12, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 } }, + { { 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, + 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01 } }, +}; + +/** + * Returns a pointer to one of the 23 damage table presets, or NULL if the index + * is out of range. + */ +DamageTable* DamageTable_Get(s32 index) { + if (index < 0 || index > ARRAY_COUNT(sDamageTablePresets)-1) { + return NULL; + } + + return &sDamageTablePresets[index]; +} + +/** + * Sets all entries in a damage table to 0 + */ +void DamageTable_Clear(DamageTable* damageTable) { + s32 i; + + for (i = 0; i < ARRAY_COUNT(damageTable->attack); i++) { + damageTable->attack[i] = 0; + } +} diff --git a/src/code/z_collision_check.c b/src/code/z_collision_check.c new file mode 100644 index 0000000000..4d1d0fbf96 --- /dev/null +++ b/src/code/z_collision_check.c @@ -0,0 +1,4032 @@ +#include +#include + +/** + * Gets the damage and effect that should be applied for the collision between + * `at` and `ac`, referring to the ac actor's damage chart if applicable. + */ +f32 CollisionCheck_GetDamageAndEffectOnBumper(Collider* at, ColliderInfo* atInfo, Collider* ac, ColliderInfo* acInfo, + u32* effect) { + static f32 damageMultipliers[] = { + 0.0f, 1.0f, 2.0f, 0.5f, 0.25f, 3.0f, 4.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, + }; + u32 dmgFlags; + s32 i; + f32 damage; + + *effect = 0; + damage = CollisionCheck_GetToucherDamage(at, atInfo, ac, acInfo); + + if (ac->actor->colChkInfo.damageTable != NULL) { + dmgFlags = atInfo->toucher.dmgFlags; + + for (i = 0; i != ARRAY_COUNT(ac->actor->colChkInfo.damageTable->attack); i++) { + if (dmgFlags == 1) { + break; + } + dmgFlags >>= 1; + } + + damage *= damageMultipliers[ac->actor->colChkInfo.damageTable->attack[i] & 0xF]; + *effect = (ac->actor->colChkInfo.damageTable->attack[i] >> 4) & 0xF; + } + return damage; +} + +/** + * Calculates damage after factoring in the ac collider's defense + */ +f32 CollisionCheck_ApplyBumperDefense(f32 damage, ColliderInfo* ac) { + f32 finalDamage = damage - ac->bumper.defense; + + return finalDamage; +} + +/** + * Gets the damage to be inflicted by `at` on `ac`, before applying other + * factors such as the ac collider's defense. + */ +s32 CollisionCheck_GetToucherDamage(Collider* at, ColliderInfo* atInfo, Collider* ac, ColliderInfo* acInfo) { + if (at->actor != NULL && at->actor->id == ACTOR_EN_BOM && ac->actor != NULL && ac->actor->id == ACTOR_PLAYER) { + return 8; + } + return atInfo->toucher.damage; +} + +s32 Collider_InitBase(GlobalContext* ctxt, Collider* collider) { + static Collider defaultCollider = { + NULL, NULL, NULL, NULL, AT_NONE, AC_NONE, OC1_NONE, OC2_NONE, COLTYPE_HIT3, COLSHAPE_MAX, + }; + + *collider = defaultCollider; + return 1; +} + +s32 Collider_DestroyBase(GlobalContext* ctxt, Collider* collider) { + return 1; +} + +/** + * Uses default OC2_TYPE_1 and COLTYPE_HIT0 + */ +s32 Collider_SetBaseToActor(GlobalContext* ctxt, Collider* collider, ColliderInitToActor* src) { + collider->actor = src->actor; + collider->atFlags = src->atFlags; + collider->acFlags = src->acFlags; + collider->ocFlags1 = src->ocFlags1; + collider->ocFlags2 = OC2_TYPE_1; + collider->shape = src->shape; + return 1; +} + +/** + * Uses default OC2_TYPE_1 + */ +s32 Collider_SetBaseType1(GlobalContext* ctxt, Collider* collider, Actor* actor, ColliderInitType1* src) { + collider->actor = actor; + collider->colType = src->colType; + collider->atFlags = src->atFlags; + collider->acFlags = src->acFlags; + collider->ocFlags1 = src->ocFlags1; + collider->ocFlags2 = OC2_TYPE_1; + collider->shape = src->shape; + return 1; +} + +s32 Collider_SetBase(GlobalContext* ctxt, Collider* collider, Actor* actor, ColliderInit* src) { + collider->actor = actor; + collider->colType = src->colType; + collider->atFlags = src->atFlags; + collider->acFlags = src->acFlags; + collider->ocFlags1 = src->ocFlags1; + collider->ocFlags2 = src->ocFlags2; + collider->shape = src->shape; + return 1; +} + +void Collider_ResetATBase(GlobalContext* ctxt, Collider* collider) { + collider->at = NULL; + collider->atFlags &= ~(AT_HIT | AT_BOUNCED); +} + +void Collider_ResetACBase(GlobalContext* ctxt, Collider* collider) { + collider->ac = NULL; + collider->acFlags &= ~(AC_HIT | AC_BOUNCED); +} + +void Collider_ResetOCBase(GlobalContext* ctxt, Collider* collider) { + collider->oc = NULL; + collider->ocFlags1 &= ~OC1_HIT; + collider->ocFlags2 &= ~OC2_HIT_PLAYER; +} + +s32 Collider_InitTouch(GlobalContext* ctxt, ColliderTouch* touch) { + static ColliderTouch defaultColliderTouch = { 0x00000000, 0, 0 }; + + *touch = defaultColliderTouch; + return 1; +} + +s32 Collider_DestroyTouch(GlobalContext* ctxt, ColliderTouch* touch) { + return 1; +} + +s32 Collider_SetTouch(GlobalContext* ctxt, ColliderTouch* touch, ColliderTouchInit* src) { + touch->dmgFlags = src->dmgFlags; + touch->effect = src->effect; + touch->damage = src->damage; + return 1; +} + +void Collider_ResetATInfoUnk(GlobalContext* ctxt, ColliderInfo* info) { +} + +s32 Collider_InitBump(GlobalContext* ctxt, ColliderBump* bump) { + static ColliderBump defaultColliderBump = { 0xF7CFFFFF, 0, 0, { 0, 0, 0 } }; + + *bump = defaultColliderBump; + return 1; +} + +s32 Collider_DestroyBump(GlobalContext* ctxt, ColliderBump* bump) { + return 1; +} + +s32 Collider_SetBump(GlobalContext* ctxt, ColliderBump* bump, ColliderBumpInit* src) { + bump->dmgFlags = src->dmgFlags; + bump->effect = src->effect; + bump->defense = src->defense; + return 1; +} + +s32 Collider_InitInfo(GlobalContext* ctxt, ColliderInfo* info) { + static ColliderInfo defaultColliderInfo = { + { 0, 0, 0 }, { 0xF7CFFFFF, 0, 0, { 0, 0, 0 } }, + ELEMTYPE_UNK0, TOUCH_NONE, + BUMP_NONE, OCELEM_NONE, + NULL, NULL, + NULL, NULL, + }; + + *info = defaultColliderInfo; + Collider_InitTouch(ctxt, &info->toucher); + Collider_InitBump(ctxt, &info->bumper); + return 1; +} + +s32 Collider_DestroyInfo(GlobalContext* ctxt, ColliderInfo* info) { + Collider_DestroyTouch(ctxt, &info->toucher); + Collider_DestroyBump(ctxt, &info->bumper); + return 1; +} + +s32 Collider_SetInfo(GlobalContext* ctxt, ColliderInfo* info, ColliderInfoInit* src) { + info->elemType = src->elemType; + Collider_SetTouch(ctxt, &info->toucher, &src->toucher); + Collider_SetBump(ctxt, &info->bumper, &src->bumper); + info->toucherFlags = src->toucherFlags; + info->bumperFlags = src->bumperFlags; + info->ocElemFlags = src->ocElemFlags; + return 1; +} + +void Collider_ResetATInfo(GlobalContext* ctxt, ColliderInfo* info) { + info->atHit = NULL; + info->atHitInfo = NULL; + info->toucherFlags &= ~TOUCH_HIT; + info->toucherFlags &= ~TOUCH_DREW_HITMARK; + Collider_ResetATInfoUnk(ctxt, info); +} + +void Collider_ResetACInfo(GlobalContext* ctxt, ColliderInfo* info) { + info->bumper.hitPos.x = info->bumper.hitPos.y = info->bumper.hitPos.z = 0; + info->bumperFlags &= ~BUMP_HIT; + info->bumperFlags &= ~BUMP_DRAW_HITMARK; + info->acHit = NULL; + info->acHitInfo = NULL; +} + +void Collider_ResetOCInfo(GlobalContext* ctxt, ColliderInfo* info) { + info->ocElemFlags &= ~OCELEM_HIT; +} + +s32 Collider_InitJntSphElementDim(GlobalContext* ctxt, ColliderJntSphElementDim* dim) { + static ColliderJntSphElementDim defaultColliderJntSphElementDim = { + { { 0, 0, 0 }, 0 }, + { { 0, 0, 0 }, 0 }, + 0.0f, + 0, + }; + + *dim = defaultColliderJntSphElementDim; + return 1; +} + +s32 Collider_DestroyJntSphElementDim(GlobalContext* ctxt, ColliderJntSphElementDim* dim) { + return 1; +} + +s32 Collider_SetJntSphElementDim(GlobalContext* ctxt, ColliderJntSphElementDim* dest, + ColliderJntSphElementDimInit* src) { + dest->limb = src->limb; + dest->modelSphere = src->modelSphere; + dest->scale = src->scale * 0.01f; + return 1; +} + +s32 Collider_InitJntSphElement(GlobalContext* ctxt, ColliderJntSphElement* element) { + Collider_InitInfo(ctxt, &element->info); + Collider_InitJntSphElementDim(ctxt, &element->dim); + return 1; +} + +s32 Collider_DestroyJntSphElement(GlobalContext* ctxt, ColliderJntSphElement* element) { + Collider_DestroyInfo(ctxt, &element->info); + Collider_DestroyJntSphElementDim(ctxt, &element->dim); + return 1; +} + +s32 Collider_SetJntSphElement(GlobalContext* ctxt, ColliderJntSphElement* dest, ColliderJntSphElementInit* src) { + Collider_SetInfo(ctxt, &dest->info, &src->info); + Collider_SetJntSphElementDim(ctxt, &dest->dim, &src->dim); + return 1; +} + +s32 Collider_ResetJntSphElementAT(GlobalContext* ctxt, ColliderJntSphElement* collider) { + Collider_ResetATInfo(ctxt, &collider->info); + return 1; +} + +s32 Collider_ResetJntSphElementAC(GlobalContext* ctxt, ColliderJntSphElement* collider) { + Collider_ResetACInfo(ctxt, &collider->info); + return 1; +} + +s32 Collider_ResetJntSphElementOC(GlobalContext* ctxt, ColliderJntSphElement* collider) { + Collider_ResetOCInfo(ctxt, &collider->info); + return 1; +} + +/** + * Initializes a ColliderJntSph to default values + */ +s32 Collider_InitJntSph(GlobalContext* ctxt, ColliderJntSph* collider) { + Collider_InitBase(ctxt, &collider->base); + collider->count = 0; + collider->elements = NULL; + return 1; +} + +/** + * Destroys a dynamically allocated ColliderJntSph + */ +s32 Collider_FreeJntSph(GlobalContext* ctxt, ColliderJntSph* collider) { + ColliderJntSphElement* element; + + Collider_DestroyBase(ctxt, &collider->base); + for (element = collider->elements; element < &collider->elements[collider->count]; element++) { + Collider_DestroyJntSphElement(ctxt, element); + } + + collider->count = 0; + if (collider->elements != NULL) { + zelda_free(collider->elements); + } + collider->elements = NULL; + return 1; +} + +/** + * Destroys a preallocated ColliderJntSph + */ +s32 Collider_DestroyJntSph(GlobalContext* ctxt, ColliderJntSph* collider) { + ColliderJntSphElement* element; + + Collider_DestroyBase(ctxt, &collider->base); + + for (element = collider->elements; element < &collider->elements[collider->count]; element++) { + Collider_DestroyJntSphElement(ctxt, element); + } + collider->count = 0; + collider->elements = NULL; + return 1; +} + +/** + * Sets up the ColliderJntSph using the values in src, sets it to the actor specified in src, and dynamically allocates + * the element array. Uses default OC2_TYPE_1 and COLTYPE_HIT0. + */ +s32 Collider_SetJntSphToActor(GlobalContext* ctxt, ColliderJntSph* collider, ColliderJntSphInitToActor* src) { + ColliderJntSphElement* destElem; + ColliderJntSphElementInit* srcElem; + + Collider_SetBaseToActor(ctxt, &collider->base, &src->base); + collider->count = src->count; + collider->elements = zelda_malloc(src->count * sizeof(ColliderJntSphElement)); + + if (collider->elements == NULL) { + collider->count = 0; + return 0; + } + + for (destElem = collider->elements, srcElem = src->elements; + destElem < &collider->elements[collider->count]; destElem++, srcElem++) { + Collider_InitJntSphElement(ctxt, destElem); + Collider_SetJntSphElement(ctxt, destElem, srcElem); + } + return 1; +} + +/** + * Sets up the ColliderJntSph using the values in src and dynamically allocates the element array. Uses default + * OC2_TYPE_1. + */ +s32 Collider_SetJntSphAllocType1(GlobalContext* ctxt, ColliderJntSph* sphereGroup, Actor* actor, + ColliderJntSphInitType1* src) { + ColliderJntSphElement* destElem; + ColliderJntSphElementInit* srcElem; + + Collider_SetBaseType1(ctxt, &sphereGroup->base, actor, &src->base); + sphereGroup->count = src->count; + sphereGroup->elements = zelda_malloc(src->count * sizeof(ColliderJntSphElement)); + + if (sphereGroup->elements == NULL) { + sphereGroup->count = 0; + return 0; + } + + for (destElem = sphereGroup->elements, srcElem = src->elements; + destElem < &sphereGroup->elements[sphereGroup->count]; destElem++, srcElem++) { + Collider_InitJntSphElement(ctxt, destElem); + Collider_SetJntSphElement(ctxt, destElem, srcElem); + } + return 1; +} + +/** + * Sets up the ColliderJntSph using the values in src, placing the element array in elements. + */ +s32 Collider_SetJntSph(GlobalContext* ctxt, ColliderJntSph* sphereGroup, Actor* actor, ColliderJntSphInit* src, + ColliderJntSphElement* elements) { + ColliderJntSphElement* destElem; + ColliderJntSphElementInit* srcElem; + + Collider_SetBase(ctxt, &sphereGroup->base, actor, &src->base); + sphereGroup->count = src->count; + sphereGroup->elements = elements; + + for (destElem = sphereGroup->elements, srcElem = src->elements; + destElem < &sphereGroup->elements[sphereGroup->count]; destElem++, srcElem++) { + Collider_InitJntSphElement(ctxt, destElem); + Collider_SetJntSphElement(ctxt, destElem, srcElem); + } + + return 1; +} + +/** + * Fully initializes a ColliderJntSph using the values in `src`, placing the element array in elements. + */ +s32 Collider_InitAndSetJntSph(GlobalContext* ctxt, ColliderJntSph* sphereGroup, Actor* actor, ColliderJntSphInit* src, + ColliderJntSphElement* elements) { + Collider_InitJntSph(ctxt, sphereGroup); + Collider_SetJntSph(ctxt, sphereGroup, actor, src, elements); + return 0; +} + +/** + * Resets the collider's AT collision flags. + */ +s32 Collider_ResetJntSphAT(GlobalContext* ctxt, Collider* collider) { + ColliderJntSphElement* element; + ColliderJntSph* jntSph = (ColliderJntSph*)collider; + + Collider_ResetATBase(ctxt, &jntSph->base); + + for (element = jntSph->elements; element < &jntSph->elements[jntSph->count]; element++) { + Collider_ResetJntSphElementAT(ctxt, element); + } + return 1; +} + +/** + * Resets the collider's AC collision flags. + */ +s32 Collider_ResetJntSphAC(GlobalContext* ctxt, Collider* collider) { + ColliderJntSphElement* element; + ColliderJntSph* jntSph = (ColliderJntSph*)collider; + + Collider_ResetACBase(ctxt, &jntSph->base); + + for (element = jntSph->elements; element < &jntSph->elements[jntSph->count]; element++) { + Collider_ResetJntSphElementAC(ctxt, element); + } + return 1; +} + +/** + * Resets the collider's OC collision flags. + */ +s32 Collider_ResetJntSphOC(GlobalContext* ctxt, Collider* collider) { + ColliderJntSphElement* element; + ColliderJntSph* jntSph = (ColliderJntSph*)collider; + + Collider_ResetOCBase(ctxt, &jntSph->base); + + for (element = jntSph->elements; element < &jntSph->elements[jntSph->count]; element++) { + Collider_ResetJntSphElementOC(ctxt, element); + } + return 1; +} + +s32 Collider_InitCylinderDim(GlobalContext* ctxt, Cylinder16* dim) { + static Cylinder16 defaultColliderCylinderDim = { 0, 0, 0, { 0, 0, 0 } }; + + *dim = defaultColliderCylinderDim; + return 1; +} + +s32 Collider_DestroyCylinderDim(GlobalContext* ctxt, Cylinder16* dim) { + return 1; +} + +s32 Collider_SetCylinderDim(GlobalContext* ctxt, Cylinder16* dim, Cylinder16* src) { + *dim = *src; + return 1; +} + +/** + * Initializes a ColliderCylinder to default values + */ +s32 Collider_InitCylinder(GlobalContext* ctxt, ColliderCylinder* collider) { + Collider_InitBase(ctxt, &collider->base); + Collider_InitInfo(ctxt, &collider->info); + Collider_InitCylinderDim(ctxt, &collider->dim); + return 1; +} + +/** + * Destroys a ColliderCylinder + */ +s32 Collider_DestroyCylinder(GlobalContext* ctxt, ColliderCylinder* collider) { + Collider_DestroyBase(ctxt, &collider->base); + Collider_DestroyInfo(ctxt, &collider->info); + Collider_DestroyCylinderDim(ctxt, &collider->dim); + return 1; +} + +/** + * Sets up the ColliderCylinder using the values in src and sets it to the actor specified in src. Uses default + * OC2_TYPE_1 and COLTYPE_0. + */ +s32 Collider_SetCylinderToActor(GlobalContext* ctxt, ColliderCylinder* collider, ColliderCylinderInitToActor* src) { + Collider_SetBaseToActor(ctxt, &collider->base, &src->base); + Collider_SetInfo(ctxt, &collider->info, &src->info); + Collider_SetCylinderDim(ctxt, &collider->dim, &src->dim); + return 1; +} + +/** + * Sets up the ColliderCylinder using the values in src. Uses default OC2_TYPE_1 + */ +s32 Collider_SetCylinderType1(GlobalContext* ctxt, ColliderCylinder* collider, Actor* actor, + ColliderCylinderInitType1* src) { + Collider_SetBaseType1(ctxt, &collider->base, actor, &src->base); + Collider_SetInfo(ctxt, &collider->info, &src->info); + Collider_SetCylinderDim(ctxt, &collider->dim, &src->dim); + return 1; +} + +/** + * Sets up the ColliderCylinder using the values in src. + */ +s32 Collider_SetCylinder(GlobalContext* ctxt, ColliderCylinder* collider, Actor* actor, ColliderCylinderInit* src) { + Collider_SetBase(ctxt, &collider->base, actor, &src->base); + Collider_SetInfo(ctxt, &collider->info, &src->info); + Collider_SetCylinderDim(ctxt, &collider->dim, &src->dim); + return 1; +} + +/** + * Fully initializes a ColliderCylinder using the values in src. + */ +s32 Collider_InitAndSetCylinder(GlobalContext* ctxt, ColliderCylinder* collider, Actor* actor, + ColliderCylinderInit* src) { + Collider_InitCylinder(ctxt, collider); + Collider_SetCylinder(ctxt, collider, actor, src); + return 1; +} + +/** + * Resets the collider's AT collision flags. + */ +s32 Collider_ResetCylinderAT(GlobalContext* ctxt, Collider* collider) { + ColliderCylinder* cylinder = (ColliderCylinder*)collider; + + Collider_ResetATBase(ctxt, &cylinder->base); + Collider_ResetATInfo(ctxt, &cylinder->info); + return 1; +} + +/** + * Resets the collider's AC collision flags. + */ +s32 Collider_ResetCylinderAC(GlobalContext* ctxt, Collider* collider) { + ColliderCylinder* cylinder = (ColliderCylinder*)collider; + + Collider_ResetACBase(ctxt, &cylinder->base); + Collider_ResetACInfo(ctxt, &cylinder->info); + return 1; +} + +/** + * Resets the collider's OC collision flags. + */ +s32 Collider_ResetCylinderOC(GlobalContext* ctxt, Collider* collider) { + ColliderCylinder* cylinder = (ColliderCylinder*)collider; + + Collider_ResetOCBase(ctxt, &cylinder->base); + Collider_ResetOCInfo(ctxt, &cylinder->info); + return 1; +} + +s32 Collider_InitTrisElementDim(GlobalContext* ctxt, TriNorm* dim) { + static TriNorm defaultColliderTrisElementDim = { + { { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } }, + { { 0.0f, 0.0f, 0.0f }, 0.0f }, + }; + + *dim = defaultColliderTrisElementDim; + return 1; +} + +s32 Collider_DestroyTrisElementDim(GlobalContext* ctxt, TriNorm* dim) { + return 1; +} + +s32 Collider_SetTrisElementDim(GlobalContext* ctxt, TriNorm* dim, ColliderTrisElementDimInit* src) { + Vec3f* destVtx; + Vec3f* srcVtx; + f32 nx; + f32 ny; + f32 nz; + f32 originDist; + + for (destVtx = dim->vtx, srcVtx = &src->vtx[0]; destVtx < &dim->vtx[3]; destVtx++, srcVtx++) { + *destVtx = *srcVtx; + } + + Math3D_UnitNormalVector(&src->vtx[0], &src->vtx[1], &src->vtx[2], &nx, &ny, &nz, &originDist); + + dim->plane.normal.x = nx; + dim->plane.normal.y = ny; + dim->plane.normal.z = nz; + dim->plane.originDist = originDist; + return 1; +} + +s32 Collider_InitTrisElement(GlobalContext* ctxt, ColliderTrisElement* element) { + Collider_InitInfo(ctxt, &element->info); + Collider_InitTrisElementDim(ctxt, &element->dim); + return 1; +} + +s32 Collider_DestroyTrisElement(GlobalContext* ctxt, ColliderTrisElement* element) { + Collider_DestroyInfo(ctxt, &element->info); + Collider_DestroyTrisElementDim(ctxt, &element->dim); + return 1; +} + +s32 Collider_SetTrisElement(GlobalContext* ctxt, ColliderTrisElement* element, ColliderTrisElementInit* src) { + Collider_SetInfo(ctxt, &element->info, &src->info); + Collider_SetTrisElementDim(ctxt, &element->dim, &src->dim); + return 1; +} + +s32 Collider_ResetTrisElementAT(GlobalContext* ctxt, ColliderTrisElement* element) { + Collider_ResetATInfo(ctxt, &element->info); + return 1; +} + +s32 Collider_ResetTrisElementAC(GlobalContext* ctxt, ColliderTrisElement* element) { + Collider_ResetACInfo(ctxt, &element->info); + return 1; +} + +s32 Collider_ResetTrisElementOC(GlobalContext* ctxt, ColliderTrisElement* element) { + Collider_ResetOCInfo(ctxt, &element->info); + return 1; +} + +/** + * Initializes a ColliderTris to default values + */ +s32 Collider_InitTris(GlobalContext* ctxt, ColliderTris* tris) { + Collider_InitBase(ctxt, &tris->base); + tris->count = 0; + tris->elements = NULL; + return 1; +} + +/** + * Destroys a dynamically allocated ColliderTris + */ +s32 Collider_FreeTris(GlobalContext* ctxt, ColliderTris* tris) { + ColliderTrisElement* element; + + Collider_DestroyBase(ctxt, &tris->base); + + for (element = tris->elements; element < &tris->elements[tris->count]; element++) { + Collider_DestroyTrisElement(ctxt, element); + } + + tris->count = 0; + if (tris->elements != NULL) { + zelda_free(tris->elements); + } + tris->elements = NULL; + + return 1; +} + +/** + * Destroys a preallocated ColliderTris + */ +s32 Collider_DestroyTris(GlobalContext* ctxt, ColliderTris* tris) { + ColliderTrisElement* element; + + Collider_DestroyBase(ctxt, &tris->base); + + for (element = tris->elements; element < &tris->elements[tris->count]; element++) { + Collider_DestroyTrisElement(ctxt, element); + } + tris->count = 0; + tris->elements = NULL; + return 1; +} + +/** + * Sets up the ColliderTris using the values in src and dynamically allocates the element array. Uses default + * OC2_TYPE_1. + */ +s32 Collider_SetTrisAllocType1(GlobalContext* ctxt, ColliderTris* tris, Actor* actor, ColliderTrisInitType1* src) { + ColliderTrisElement* element; + ColliderTrisElementInit* srcElem; + + Collider_SetBaseType1(ctxt, &tris->base, actor, &src->base); + tris->count = src->count; + tris->elements = zelda_malloc(tris->count * sizeof(ColliderTrisElement)); + + if (tris->elements == NULL) { + tris->count = 0; + return 0; + } + + for (element = tris->elements, srcElem = src->elements; element < &tris->elements[tris->count]; + element++, srcElem++) { + Collider_InitTrisElement(ctxt, element); + Collider_SetTrisElement(ctxt, element, srcElem); + } + + return 1; +} + +/** + * Sets up the ColliderTris using the values in src, placing the element array in elements. + */ +s32 Collider_SetTris(GlobalContext* ctxt, ColliderTris* triGroup, Actor* actor, ColliderTrisInit* src, + ColliderTrisElement* tris) { + ColliderTrisElement* element; + ColliderTrisElementInit* srcElem; + + Collider_SetBase(ctxt, &triGroup->base, actor, &src->base); + triGroup->count = src->count; + triGroup->elements = tris; + + for (element = triGroup->elements, srcElem = src->elements; element < &triGroup->elements[triGroup->count]; + element++, srcElem++) { + Collider_InitTrisElement(ctxt, element); + Collider_SetTrisElement(ctxt, element, srcElem); + } + + return 1; +} + +/** + * Fully initializes a ColliderTris using the values in src, placing the element array in elements. + */ +s32 Collider_InitAndSetTris(GlobalContext* ctxt, ColliderTris* tris, Actor* actor, ColliderTrisInit* src, + ColliderTrisElement* elements) { + Collider_InitTris(ctxt, tris); + Collider_SetTris(ctxt, tris, actor, src, elements); + return 0; +} + +/** + * Resets the collider's AT collision flags. + */ +s32 Collider_ResetTrisAT(GlobalContext* ctxt, Collider* collider) { + ColliderTrisElement* element; + ColliderTris* tris = (ColliderTris*)collider; + + Collider_ResetATBase(ctxt, &tris->base); + + for (element = tris->elements; element < &tris->elements[tris->count]; element++) { + Collider_ResetTrisElementAT(ctxt, element); + } + return 1; +} + +/** + * Resets the collider's AC collision flags. + */ +s32 Collider_ResetTrisAC(GlobalContext* ctxt, Collider* collider) { + ColliderTrisElement* element; + ColliderTris* tris = (ColliderTris*)collider; + + Collider_ResetACBase(ctxt, &tris->base); + + for (element = tris->elements; element < &tris->elements[tris->count]; element++) { + Collider_ResetTrisElementAC(ctxt, element); + } + return 1; +} + +/** + * Resets the collider's OC collision flags. + */ +s32 Collider_ResetTrisOC(GlobalContext* ctxt, Collider* collider) { + ColliderTrisElement* element; + ColliderTris* tris = (ColliderTris*)collider; + + Collider_ResetOCBase(ctxt, &tris->base); + + for (element = tris->elements; element < &tris->elements[tris->count]; element++) { + Collider_ResetTrisElementOC(ctxt, element); + } + return 1; +} + +s32 Collider_InitQuadDim(GlobalContext* ctxt, ColliderQuadDim* dim) { + static ColliderQuadDim defaultColliderQuadDim = { + { { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } }, + { 0, 0, 0 }, + { 0, 0, 0 }, + 1.0E38f, + }; + + *dim = defaultColliderQuadDim; + return 1; +} + +s32 Collider_DestroyQuadDim(GlobalContext* ctxt, ColliderQuadDim* dim) { + return 1; +} + +s32 Collider_ResetQuadACDist(GlobalContext* ctxt, ColliderQuadDim* dim) { + dim->acDist = 1.0E38f; + return 1; +} + +void Collider_SetQuadMidpoints(ColliderQuadDim* dim) { + dim->dcMid.x = (dim->quad[3].x + dim->quad[2].x) * 0.5f; + dim->dcMid.y = (dim->quad[3].y + dim->quad[2].y) * 0.5f; + dim->dcMid.z = (dim->quad[3].z + dim->quad[2].z) * 0.5f; + dim->baMid.x = (dim->quad[1].x + dim->quad[0].x) * 0.5f; + dim->baMid.y = (dim->quad[1].y + dim->quad[0].y) * 0.5f; + dim->baMid.z = (dim->quad[1].z + dim->quad[0].z) * 0.5f; +} + +s32 Collider_SetQuadDim(GlobalContext* ctxt, ColliderQuadDim* dim, ColliderQuadDimInit* init) { + dim->quad[0] = init->quad[0]; + dim->quad[1] = init->quad[1]; + dim->quad[2] = init->quad[2]; + dim->quad[3] = init->quad[3]; + + Collider_SetQuadMidpoints(dim); + return 1; +} + +/** + * Initializes a ColliderQuad to default values. + */ +s32 Collider_InitQuad(GlobalContext* ctxt, ColliderQuad* collider) { + Collider_InitBase(ctxt, &collider->base); + Collider_InitInfo(ctxt, &collider->info); + Collider_InitQuadDim(ctxt, &collider->dim); + return 1; +} + +/** + * Destroys a ColliderQuad. + */ +s32 Collider_DestroyQuad(GlobalContext* ctxt, ColliderQuad* collider) { + Collider_DestroyBase(ctxt, &collider->base); + Collider_DestroyInfo(ctxt, &collider->info); + Collider_DestroyQuadDim(ctxt, &collider->dim); + return 1; +} + +/** + * Sets up the ColliderQuad using the values in src. Uses the default OC2_TYPE_1 + */ +s32 Collider_SetQuadType1(GlobalContext* ctxt, ColliderQuad* collider, Actor* actor, ColliderQuadInitType1* src) { + Collider_SetBaseType1(ctxt, &collider->base, actor, &src->base); + Collider_SetInfo(ctxt, &collider->info, &src->info); + Collider_SetQuadDim(ctxt, &collider->dim, &src->dim); + return 1; +} + +/** + * Sets up the ColliderQuad using the values in src. + */ +s32 Collider_SetQuad(GlobalContext* ctxt, ColliderQuad* collider, Actor* actor, ColliderQuadInit* src) { + Collider_SetBase(ctxt, &collider->base, actor, &src->base); + Collider_SetInfo(ctxt, &collider->info, &src->info); + Collider_SetQuadDim(ctxt, &collider->dim, &src->dim); + return 1; +} + +/** + * Fully initializes a ColliderQuad using the values in src. + */ +s32 Collider_InitAndSetQuad(GlobalContext* ctxt, ColliderQuad* collider, Actor* actor, ColliderQuadInit* src) { + Collider_InitQuad(ctxt, collider); + Collider_SetQuad(ctxt, collider, actor, src); + return 0; +} + +/** + * Resets the collider's AT collision flags. + */ +s32 Collider_ResetQuadAT(GlobalContext* ctxt, Collider* collider) { + ColliderQuad* quad = (ColliderQuad*)collider; + + Collider_ResetATBase(ctxt, &quad->base); + Collider_ResetATInfo(ctxt, &quad->info); + Collider_ResetQuadACDist(ctxt, &quad->dim); + return 1; +} + +/** + * Resets the collider's AC collision flags. + */ +s32 Collider_ResetQuadAC(GlobalContext* ctxt, Collider* collider) { + ColliderQuad* quad = (ColliderQuad*)collider; + + Collider_ResetACBase(ctxt, &quad->base); + Collider_ResetACInfo(ctxt, &quad->info); + return 1; +} + +/** + * Resets the collider's OC collision flags. + */ +s32 Collider_ResetQuadOC(GlobalContext* ctxt, Collider* collider) { + ColliderQuad* quad = (ColliderQuad*)collider; + + Collider_ResetOCBase(ctxt, &quad->base); + Collider_ResetOCInfo(ctxt, &quad->info); + return 1; +} + +/** + * For quad colliders with TOUCH_NEAREST, resets the previous AC collider it hit if the current element is closer, + * otherwise returns false. Used on player AT colliders to prevent multiple collisions from registering. + */ +s32 Collider_QuadSetNearestAC(GlobalContext* ctxt, ColliderQuad* quad, Vec3f* hitPos) { + f32 acDist; + Vec3f dcMid; + + if (!(quad->info.toucherFlags & TOUCH_NEAREST)) { + return 1; + } + Math_Vec3s_ToVec3f(&dcMid, &quad->dim.dcMid); + acDist = Math3D_DistanceSquared(&dcMid, hitPos); + + if (acDist < quad->dim.acDist) { + quad->dim.acDist = acDist; + + if (quad->info.atHit != NULL) { + Collider_ResetACBase(ctxt, quad->info.atHit); + } + if (quad->info.atHitInfo != NULL) { + Collider_ResetACInfo(ctxt, quad->info.atHitInfo); + } + return 1; + } else { + return 0; + } +} + +/** + * Initializes a ColliderSphere to default values. + */ +s32 Collider_InitSphere(GlobalContext* ctxt, ColliderSphere* collider) { + Collider_InitBase(ctxt, &collider->base); + Collider_InitInfo(ctxt, &collider->info); + Collider_InitJntSphElementDim(ctxt, &collider->dim); + return 1; +} + +/** + * Destroys a ColliderSphere. + */ +s32 Collider_DestroySphere(GlobalContext* ctxt, ColliderSphere* collider) { + Collider_DestroyBase(ctxt, &collider->base); + Collider_DestroyInfo(ctxt, &collider->info); + Collider_DestroyJntSphElementDim(ctxt, &collider->dim); + return 1; +} + +/** + * Sets up the ColliderSphere using the values in src. + */ +s32 Collider_SetSphere(GlobalContext* ctxt, ColliderSphere* collider, Actor* actor, ColliderSphereInit* src) { + Collider_SetBase(ctxt, &collider->base, actor, &src->base); + Collider_SetInfo(ctxt, &collider->info, &src->info); + Collider_SetJntSphElementDim(ctxt, &collider->dim, &src->dim); + return 1; +} + +/** + * Fully initializes a ColliderSphere using the values in src. + */ +s32 Collider_InitAndSetSphere(GlobalContext* ctxt, ColliderSphere* collider, Actor* actor, ColliderSphereInit* src) { + Collider_InitSphere(ctxt, collider); + Collider_SetSphere(ctxt, collider, actor, src); + return 0; +} + +/** + * Resets the collider's AT collision flags. + */ +s32 Collider_ResetSphereAT(GlobalContext* ctxt, Collider* collider) { + ColliderSphere* sphere = (ColliderSphere*)collider; + + Collider_ResetATBase(ctxt, &sphere->base); + Collider_ResetATInfo(ctxt, &sphere->info); + return 1; +} + +/** + * Resets the collider's AC collision flags. + */ +s32 Collider_ResetSphereAC(GlobalContext* ctxt, Collider* collider) { + ColliderSphere* sphere = (ColliderSphere*)collider; + + Collider_ResetACBase(ctxt, &sphere->base); + Collider_ResetACInfo(ctxt, &sphere->info); + return 1; +} + +/** + * Resets the collider's OC collision flags. + */ +s32 Collider_ResetSphereOC(GlobalContext* ctxt, Collider* collider) { + ColliderSphere* sphere = (ColliderSphere*)collider; + + Collider_ResetOCBase(ctxt, &sphere->base); + Collider_ResetOCInfo(ctxt, &sphere->info); + return 1; +} + +/** + * Initializes an OcLine to default values + */ +s32 Collider_InitLine(GlobalContext* ctxt, OcLine* line) { + static Vec3f defaultLinePoint = { 0.0f, 0.0f, 0.0f }; + + Math_Vec3f_Copy(&line->line.a, &defaultLinePoint); + Math_Vec3f_Copy(&line->line.b, &defaultLinePoint); + return 1; +} + +/** + * Destroys an OcLine + */ +s32 Collider_DestroyLine(GlobalContext* ctxt, OcLine* line) { + return 1; +} + +/** + * Sets up an OcLine with endpoints a and b. + */ +s32 Collider_SetLinePoints(GlobalContext* ctxt, OcLine* line, Vec3f* a, Vec3f* b) { + Math_Vec3f_Copy(&line->line.a, a); + Math_Vec3f_Copy(&line->line.b, b); + return 1; +} + +/** + * Sets up an OcLine using the values in src. + */ +s32 Collider_SetLine(GlobalContext* ctxt, OcLine* line, OcLine* src) { + line->ocFlags = src->ocFlags; + Collider_SetLinePoints(ctxt, line, &src->line.a, &src->line.b); + return 1; +} + +/** + * Resets the OcLine's collision flags. + */ +s32 Collider_ResetLineOC(GlobalContext* ctxt, OcLine* line) { + line->ocFlags &= ~OCLINE_HIT; + return 1; +} + +/** + * Initializes CollisionCheckContext. + * Clears all collider arrays, disables SAC, and sets flags for drawing colliders. + */ +void CollisionCheck_InitContext(GlobalContext* ctxt, CollisionCheckContext* colCtxt) { + colCtxt->sacFlags = 0; + CollisionCheck_ClearContext(ctxt, colCtxt); +} + +void CollisionCheck_DestroyContext(GlobalContext* ctxt, CollisionCheckContext* colCtxt) { +} + +/** + * Clears all collider lists in CollisionCheckContext when not in SAC mode. + */ +void CollisionCheck_ClearContext(GlobalContext* ctxt, CollisionCheckContext* colCtxt) { + Collider** col; + OcLine** line; + + if (colCtxt->sacFlags & SAC_ON) { + return; + } + + colCtxt->colATCount = 0; + colCtxt->colACCount = 0; + colCtxt->colOCCount = 0; + colCtxt->colLineCount = 0; + + for (col = &colCtxt->colAT[0]; col < &colCtxt->colAT[ARRAY_COUNT(colCtxt->colAT)]; col++) { + *col = NULL; + } + + for (col = &colCtxt->colAC[0]; col < &colCtxt->colAC[ARRAY_COUNT(colCtxt->colAC)]; col++) { + *col = NULL; + } + + for (col = &colCtxt->colOC[0]; col < &colCtxt->colOC[ARRAY_COUNT(colCtxt->colOC)]; col++) { + *col = NULL; + } + + for (line = &colCtxt->colLine[0]; line < &colCtxt->colLine[ARRAY_COUNT(colCtxt->colLine)]; line++) { + *line = NULL; + } +} + +/** + * Enables SAC, an alternate collision check mode that allows direct management of collider lists. + */ +void CollisionCheck_EnableSAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt) { + colCtxt->sacFlags |= SAC_ON; +} + +/** + * Disables SAC, an alternate collision check mode that allows direct management of collider lists. + */ +void CollisionCheck_DisableSAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt) { + colCtxt->sacFlags &= ~SAC_ON; +} + +ColChkResetFunc sATResetFuncs[] = { + Collider_ResetJntSphAT, Collider_ResetCylinderAT, Collider_ResetTrisAT, + Collider_ResetQuadAT, Collider_ResetSphereAT, +}; + +/** + * Sets collider as an AT (attack) for the current frame, which will be checked against ACs (attack colliders) + */ +s32 CollisionCheck_SetAT(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + s32 index; + + if (func_8016A01C(ctxt)) { + return -1; + } + sATResetFuncs[collider->shape](ctxt, collider); + + if (collider->actor != NULL && collider->actor->update == NULL) { + return -1; + } + if (colCtxt->colATCount >= ARRAY_COUNT(colCtxt->colAT)) { + return -1; + } + if (colCtxt->sacFlags & SAC_ON) { + return -1; + } + index = colCtxt->colATCount; + colCtxt->colAT[colCtxt->colATCount++] = collider; + + return index; +} + +/** + * Sets collider as an AT (attack) for the current frame, which will be checked against ACs (attack colliders). + * If CollisionCheck_SAC is enabled, the collider will be inserted into the list at the specified index, otherwise it + * will be inserted into the next slot. + */ +s32 CollisionCheck_SetAT_SAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider, s32 index) { + if (func_8016A01C(ctxt)) { + return -1; + } + sATResetFuncs[collider->shape](ctxt, collider); + + if (collider->actor != NULL && collider->actor->update == NULL) { + return -1; + } + if (colCtxt->sacFlags & SAC_ON) { + if (index >= colCtxt->colATCount) { + return -1; + } + colCtxt->colAT[index] = collider; + } else { + if (colCtxt->colATCount >= ARRAY_COUNT(colCtxt->colAT)) { + return -1; + } + index = colCtxt->colATCount; + colCtxt->colAT[colCtxt->colATCount++] = collider; + } + return index; +} + +ColChkResetFunc sACResetFuncs[] = { + Collider_ResetJntSphAC, Collider_ResetCylinderAC, Collider_ResetTrisAC, + Collider_ResetQuadAC, Collider_ResetSphereAC, +}; + +/** + * Sets collider as an AC (attack collider) for the current frame, allowing it to detect ATs (attacks) + */ +s32 CollisionCheck_SetAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + s32 index; + + if (func_8016A01C(ctxt)) { + return -1; + } + sACResetFuncs[collider->shape](ctxt, collider); + + if (collider->actor != NULL && collider->actor->update == NULL) { + return -1; + } + if (colCtxt->colACCount >= ARRAY_COUNT(colCtxt->colAC)) { + return -1; + } + if (colCtxt->sacFlags & SAC_ON) { + return -1; + } + index = colCtxt->colACCount; + colCtxt->colAC[colCtxt->colACCount++] = collider; + + return index; +} + +/** + * Sets collider as an AC (attack collider) for the current frame, allowing it to detect ATs (attacks). + * If CollisionCheck_SAC is enabled, the collider will be inserted into the list at the specified index, otherwise it + * will be inserted into the next slot + */ +s32 CollisionCheck_SetAC_SAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider, s32 index) { + if (func_8016A01C(ctxt)) { + return -1; + } + sACResetFuncs[collider->shape](ctxt, collider); + + if (collider->actor != NULL && collider->actor->update == NULL) { + return -1; + } + if (colCtxt->sacFlags & SAC_ON) { + if (index >= colCtxt->colACCount) { + return -1; + } + colCtxt->colAC[index] = collider; + } else { + if (colCtxt->colACCount >= ARRAY_COUNT(colCtxt->colAC)) { + return -1; + } + index = colCtxt->colACCount; + colCtxt->colAC[colCtxt->colACCount++] = collider; + } + return index; +} + +ColChkResetFunc sOCResetFuncs[] = { + Collider_ResetJntSphOC, Collider_ResetCylinderOC, Collider_ResetTrisOC, + Collider_ResetQuadOC, Collider_ResetSphereOC, +}; + +/** + * Sets collider as an OC (object collider) for the current frame, allowing it to detect other OCs. + */ +s32 CollisionCheck_SetOC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + s32 index; + + if (func_8016A01C(ctxt)) { + return -1; + } + sOCResetFuncs[collider->shape](ctxt, collider); + + if (collider->actor != NULL && collider->actor->update == NULL) { + return -1; + } + if (colCtxt->colOCCount >= ARRAY_COUNT(colCtxt->colOC)) { + return -1; + } + if (colCtxt->sacFlags & SAC_ON) { + return -1; + } + index = colCtxt->colOCCount; + colCtxt->colOC[colCtxt->colOCCount++] = collider; + + return index; +} + +/** + * Sets collider as an OC (object collider) for the current frame, allowing it to detect other OCs. + * If CollisionCheck_SAC is enabled, the collider will be inserted into the list at the specified index, otherwise it + * will be inserted into the next slot. + */ +s32 CollisionCheck_SetOC_SAC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider, s32 index) { + if (func_8016A01C(ctxt)) { + return -1; + } + sOCResetFuncs[collider->shape](ctxt, collider); + + if (collider->actor != NULL && collider->actor->update == NULL) { + return -1; + } + if (colCtxt->sacFlags & SAC_ON) { + if (index >= colCtxt->colOCCount) { + return -1; + } + //! @bug should be colOC + colCtxt->colAT[index] = collider; + } else { + if (colCtxt->colOCCount >= ARRAY_COUNT(colCtxt->colOC)) { + return -1; + } + index = colCtxt->colOCCount; + + colCtxt->colOC[colCtxt->colOCCount] = collider; + colCtxt->colOCCount++; + } + return index; +} + +/** + * Sets a line as an OC collider for this frame. + */ +s32 CollisionCheck_SetOCLine(GlobalContext* ctxt, CollisionCheckContext* colCtxt, OcLine* line) { + s32 index; + + if (func_8016A01C(ctxt)) { + return -1; + } + + Collider_ResetLineOC(ctxt, line); + + if (colCtxt->colLineCount >= ARRAY_COUNT(colCtxt->colLine)) { + return -1; + } + index = colCtxt->colLineCount; + colCtxt->colLine[colCtxt->colLineCount++] = line; + + return index; +} + +/** + * Skips AT elements that are off. + */ +s32 CollisionCheck_SkipTouch(ColliderInfo* info) { + if (!(info->toucherFlags & TOUCH_ON)) { + return 1; + } + return 0; +} + +/** + * Skips AC elements that are off. + */ +s32 CollisionCheck_SkipBump(ColliderInfo* info) { + if (!(info->bumperFlags & BUMP_ON)) { + return 1; + } + return 0; +} + +/** + * If the AT element has no dmgFlags in common with the AC element, no collision happens. + */ +s32 CollisionCheck_NoSharedFlags(ColliderInfo* toucher, ColliderInfo* bumper) { + if (!(toucher->toucher.dmgFlags & bumper->bumper.dmgFlags)) { + return 1; + } + return 0; +} + +/** + * Spawns no blood drops. + * Used by collider types HIT1, HIT3, HIT5, METAL, NONE, WOOD, HARD, and TREE + */ +void CollisionCheck_NoBlood(GlobalContext* ctxt, Collider* collider, Vec3f* v) { +} + +/** + * Spawns blue blood drops. + * Used by collider types HIT0 and HIT8. + */ +#ifdef NON_MATCHING +// needs in-function static bss +void CollisionCheck_BlueBlood(GlobalContext* ctxt, Collider* collider, Vec3f* v) { + static EffSparkParams D_801EEC00; + s32 effectIndex; + + D_801EEC00.position.x = v->x; + D_801EEC00.position.x = v->y; + D_801EEC00.position.x = v->z; + D_801EEC00.particleFactor1 = 5; + D_801EEC00.particleFactor2 = 5; + D_801EEC00.colorStart[0].red = 10; + D_801EEC00.colorStart[0].green = 10; + D_801EEC00.colorStart[0].blue = 200; + D_801EEC00.colorStart[0].alpha = 255; + D_801EEC00.colorStart[1].red = 0; + D_801EEC00.colorStart[1].green = 0; + D_801EEC00.colorStart[1].blue = 128; + D_801EEC00.colorStart[1].alpha = 255; + D_801EEC00.colorStart[2].red = 0; + D_801EEC00.colorStart[2].green = 0; + D_801EEC00.colorStart[2].blue = 128; + D_801EEC00.colorStart[2].alpha = 255; + D_801EEC00.colorStart[3].red = 0; + D_801EEC00.colorStart[3].green = 0; + D_801EEC00.colorStart[3].blue = 128; + D_801EEC00.colorStart[3].alpha = 255; + D_801EEC00.colorEnd[0].red = 0; + D_801EEC00.colorEnd[0].green = 0; + D_801EEC00.colorEnd[0].blue = 32; + D_801EEC00.colorEnd[0].alpha = 0; + D_801EEC00.colorEnd[1].red = 0; + D_801EEC00.colorEnd[1].green = 0; + D_801EEC00.colorEnd[1].blue = 32; + D_801EEC00.colorEnd[1].alpha = 0; + D_801EEC00.colorEnd[2].red = 0; + D_801EEC00.colorEnd[2].green = 0; + D_801EEC00.colorEnd[2].blue = 64; + D_801EEC00.colorEnd[2].alpha = 0; + D_801EEC00.colorEnd[3].red = 0; + D_801EEC00.colorEnd[3].green = 0; + D_801EEC00.colorEnd[3].blue = 64; + D_801EEC00.colorEnd[3].alpha = 0; + D_801EEC00.age = 0; + D_801EEC00.duration = 16; + D_801EEC00.velocity = 8.0f; + D_801EEC00.gravity = -1.0f; + + Effect_Add(ctxt, &effectIndex, 0, 0, 1, &D_801EEC00); +} +#else +#pragma GLOBAL_ASM("./asm/non_matchings/code/z_collision_check/CollisionCheck_BlueBlood.asm") +#endif + +/** + * Spawns green blood drops. + * Used by collider types HIT2 and HIT6. No actor has type HIT2. + */ +#ifdef NON_MATCHING +// needs in-function static bss +void CollisionCheck_GreenBlood(GlobalContext* ctxt, Collider* collider, Vec3f* v) { + static EffSparkParams D_801EF0C8; + s32 effectIndex; + + D_801EF0C8.position.x = v->x; + D_801EF0C8.position.x = v->y; + D_801EF0C8.position.x = v->z; + D_801EF0C8.particleFactor1 = 5; + D_801EF0C8.particleFactor2 = 5; + D_801EF0C8.colorStart[0].red = 10; + D_801EF0C8.colorStart[0].green = 200; + D_801EF0C8.colorStart[0].blue = 10; + D_801EF0C8.colorStart[0].alpha = 255; + D_801EF0C8.colorStart[1].red = 0; + D_801EF0C8.colorStart[1].green = 128; + D_801EF0C8.colorStart[1].blue = 0; + D_801EF0C8.colorStart[1].alpha = 255; + D_801EF0C8.colorStart[2].red = 0; + D_801EF0C8.colorStart[2].green = 128; + D_801EF0C8.colorStart[2].blue = 0; + D_801EF0C8.colorStart[2].alpha = 255; + D_801EF0C8.colorStart[3].red = 0; + D_801EF0C8.colorStart[3].green = 128; + D_801EF0C8.colorStart[3].blue = 0; + D_801EF0C8.colorStart[3].alpha = 255; + D_801EF0C8.colorEnd[0].red = 0; + D_801EF0C8.colorEnd[0].green = 32; + D_801EF0C8.colorEnd[0].blue = 0; + D_801EF0C8.colorEnd[0].alpha = 0; + D_801EF0C8.colorEnd[1].red = 0; + D_801EF0C8.colorEnd[1].green = 32; + D_801EF0C8.colorEnd[1].blue = 0; + D_801EF0C8.colorEnd[1].alpha = 0; + D_801EF0C8.colorEnd[2].red = 0; + D_801EF0C8.colorEnd[2].green = 64; + D_801EF0C8.colorEnd[2].blue = 0; + D_801EF0C8.colorEnd[2].alpha = 0; + D_801EF0C8.colorEnd[3].red = 0; + D_801EF0C8.colorEnd[3].green = 64; + D_801EF0C8.colorEnd[3].blue = 0; + D_801EF0C8.colorEnd[3].alpha = 0; + D_801EF0C8.age = 0; + D_801EF0C8.duration = 16; + D_801EF0C8.velocity = 8.0f; + D_801EF0C8.gravity = -1.0f; + Effect_Add(ctxt, &effectIndex, 0, 0, 1, &D_801EF0C8); +} +#else +#pragma GLOBAL_ASM("./asm/non_matchings/code/z_collision_check/CollisionCheck_GreenBlood.asm") +#endif + +/** + * Spawns a burst of water. + * Used by collider type HIT4. + */ +void CollisionCheck_WaterBurst(GlobalContext* ctxt, Collider* collider, Vec3f* v) { + func_800B249C(ctxt, v); + CollisionCheck_SpawnWaterDroplets(ctxt, v); +} + +/** + * Spawns red blood drops. + * Used by collider type HIT7. + */ +void CollisionCheck_RedBlood(GlobalContext* ctxt, Collider* collider, Vec3f* v) { + CollisionCheck_SpawnRedBlood(ctxt, v); +} + +/** + * Spawns red blood drops. + */ +void CollisionCheck_RedBloodUnused(GlobalContext* ctxt, Collider* collider, Vec3f* v) { + CollisionCheck_SpawnRedBlood(ctxt, v); +} + +/** + * Plays sound effects and displays hitmarks for solid-type AC colliders (METAL, WOOD, HARD, and TREE) + */ +void CollisionCheck_HitSolid(GlobalContext* ctxt, ColliderInfo* info, Collider* collider, Vec3f* hitPos) { + s32 flags = info->toucherFlags & TOUCH_SFX_NONE; + + if (flags == TOUCH_SFX_NORMAL && collider->colType != COLTYPE_METAL) { + func_800B2684(ctxt, 0, hitPos); + if (collider->actor == NULL) { + play_sound(0x1806); + } else { + func_8019F1C0(&collider->actor->projectedPos, 0x1806); + } + } else if (flags == TOUCH_SFX_NORMAL) { + func_800B2684(ctxt, 3, hitPos); + if (collider->actor == NULL) { + CollisionCheck_SpawnShieldParticlesMetal(ctxt, hitPos); + } else { + CollisionCheck_SpawnShieldParticlesMetalSound(ctxt, hitPos, &collider->actor->projectedPos); + } + } else if (flags == TOUCH_SFX_HARD) { + func_800B2684(ctxt, 0, hitPos); + if (collider->actor == NULL) { + play_sound(0x1806); + } else { + func_8019F1C0(&collider->actor->projectedPos, 0x1806); + } + } else if (flags == TOUCH_SFX_WOOD) { + func_800B2684(ctxt, 1, hitPos); + if (collider->actor == NULL) { + play_sound(0x1837); + } else { + func_8019F1C0(&collider->actor->projectedPos, 0x1837); + } + } +} + +/** + * Plays a hit sound effect for AT colliders attached to Player based on the AC element's elemType. + */ +s32 CollisionCheck_SwordHitAudio(Collider* at, ColliderInfo* acInfo) { + if (at->actor != NULL && at->actor->category == ACTORCAT_PLAYER) { + if (acInfo->elemType == ELEMTYPE_UNK0) { + func_8019F1C0(&at->actor->projectedPos, 0x1811); + } else if (acInfo->elemType == ELEMTYPE_UNK1) { + func_8019F1C0(&at->actor->projectedPos, 0x1824); + } else if (acInfo->elemType == ELEMTYPE_UNK2) { + func_8019F1C0(&at->actor->projectedPos, 0); + } else if (acInfo->elemType == ELEMTYPE_UNK3) { + func_8019F1C0(&at->actor->projectedPos, 0); + } + } + return 1; +} + +ColChkBloodFunc sBloodFuncs[] = { + CollisionCheck_NoBlood, CollisionCheck_BlueBlood, CollisionCheck_GreenBlood, + CollisionCheck_WaterBurst, CollisionCheck_RedBlood, CollisionCheck_RedBloodUnused, +}; + +HitInfo sHitInfo[] = { + { BLOOD_BLUE, HIT_WHITE }, { BLOOD_NONE, HIT_DUST }, { BLOOD_GREEN, HIT_DUST }, { BLOOD_NONE, HIT_WHITE }, + { BLOOD_WATER, HIT_NONE }, { BLOOD_NONE, HIT_RED }, { BLOOD_GREEN, HIT_WHITE }, { BLOOD_RED, HIT_WHITE }, + { BLOOD_BLUE, HIT_RED }, { BLOOD_NONE, HIT_SOLID }, { BLOOD_NONE, HIT_NONE }, { BLOOD_NONE, HIT_SOLID }, + { BLOOD_NONE, HIT_SOLID }, { BLOOD_NONE, HIT_WOOD }, +}; + +/** + * Handles hitmarks, blood, and sound effects for each AC collision, determined by the AC collider's colType + */ +void CollisionCheck_HitEffects(GlobalContext* ctxt, Collider* at, ColliderInfo* atInfo, Collider* ac, + ColliderInfo* acInfo, Vec3f* hitPos) { + if (acInfo->bumperFlags & BUMP_NO_HITMARK) { + return; + } + + if (!(atInfo->toucherFlags & TOUCH_AT_HITMARK) && (atInfo->toucherFlags & TOUCH_DREW_HITMARK)) { + return; + } + + if (ac->actor != NULL) { + sBloodFuncs[sHitInfo[ac->colType].blood](ctxt, ac, hitPos); + } + if (ac->actor != NULL) { + if (sHitInfo[ac->colType].effect == HIT_SOLID) { + CollisionCheck_HitSolid(ctxt, atInfo, ac, hitPos); + } else if (sHitInfo[ac->colType].effect == HIT_WOOD) { + if (at->actor == NULL) { + CollisionCheck_SpawnShieldParticles(ctxt, hitPos); + play_sound(0x1837); + } else { + CollisionCheck_SpawnShieldParticlesWood(ctxt, hitPos, &at->actor->projectedPos); + } + } else if (sHitInfo[ac->colType].effect != HIT_NONE) { + func_800B2684(ctxt, sHitInfo[ac->colType].effect, hitPos); + if (!(acInfo->bumperFlags & BUMP_NO_SWORD_SFX)) { + CollisionCheck_SwordHitAudio(at, acInfo); + } + } + } else { + func_800B2684(ctxt, 0, hitPos); + if (ac->actor == NULL) { + play_sound(0x1806); + } else { + func_8019F1C0(&ac->actor->projectedPos, 0x1806); + } + } +} + +/** + * Sets the flags to indicate an attack bounced off an AC_HARD collider. + */ +void CollisionCheck_SetBounce(Collider* at, Collider* ac) { + at->atFlags |= AT_BOUNCED; + ac->acFlags |= AC_BOUNCED; +} + +/** + * Performs the AC collision between the AT element and AC element that collided. + */ +s32 CollisionCheck_SetATvsAC(GlobalContext* ctxt, Collider* at, ColliderInfo* atInfo, Vec3f* atPos, Collider* ac, + ColliderInfo* acInfo, Vec3f* acPos, Vec3f* hitPos) { + f32 damage; + u32 effect; + + if (CollisionCheck_GetToucherDamage(at, atInfo, ac, acInfo) != 0) { + damage = CollisionCheck_GetDamageAndEffectOnBumper(at, atInfo, ac, acInfo, &effect); + if (damage < 1.0f) { + if (effect == 0) { + return 0; + } + } else if (CollisionCheck_ApplyBumperDefense(damage, acInfo) < 1.0f && effect == 0) { + return 0; + } + } + if ((ac->acFlags & AC_HARD) && at->actor != NULL && ac->actor != NULL) { + CollisionCheck_SetBounce(at, ac); + } + if (!(acInfo->bumperFlags & BUMP_NO_AT_INFO)) { + at->atFlags |= AT_HIT; + at->at = ac->actor; + atInfo->atHit = ac; + atInfo->toucherFlags |= TOUCH_HIT; + atInfo->atHitInfo = acInfo; + if (!(atInfo->bumperFlags & BUMP_HIT)) { + atInfo->bumper.hitPos.x = hitPos->x; + atInfo->bumper.hitPos.y = hitPos->y; + atInfo->bumper.hitPos.z = hitPos->z; + } + if (at->actor != NULL) { + at->actor->colChkInfo.atHitEffect = acInfo->bumper.effect; + } + } + if (!(atInfo->ocElemFlags & OCELEM_UNK2)) { + ac->acFlags |= AC_HIT; + ac->ac = at->actor; + acInfo->acHit = at; + acInfo->acHitInfo = atInfo; + acInfo->bumperFlags |= BUMP_HIT; + if (ac->actor != NULL) { + ac->actor->colChkInfo.acHitEffect = atInfo->toucher.effect; + } + acInfo->bumper.hitPos.x = hitPos->x; + acInfo->bumper.hitPos.y = hitPos->y; + acInfo->bumper.hitPos.z = hitPos->z; + } + if (!(atInfo->toucherFlags & TOUCH_AT_HITMARK) && ac->colType != COLTYPE_METAL && ac->colType != COLTYPE_WOOD && + ac->colType != COLTYPE_HARD) { + acInfo->bumperFlags |= BUMP_DRAW_HITMARK; + } else { + CollisionCheck_HitEffects(ctxt, at, atInfo, ac, acInfo, hitPos); + atInfo->toucherFlags |= TOUCH_DREW_HITMARK; + } + return 1; +} + +void CollisionCheck_TrisAvgPoint(ColliderTrisElement* tri, Vec3f* avg) { + f32 oneThird = 1.0f / 3; + + avg->x = (tri->dim.vtx[0].x + tri->dim.vtx[1].x + tri->dim.vtx[2].x) * oneThird; + avg->y = (tri->dim.vtx[0].y + tri->dim.vtx[1].y + tri->dim.vtx[2].y) * oneThird; + avg->z = (tri->dim.vtx[0].z + tri->dim.vtx[1].z + tri->dim.vtx[2].z) * oneThird; +} + +void CollisionCheck_QuadAvgPoint(ColliderQuad* quad, Vec3f* avg) { + avg->x = (quad->dim.quad[0].x + (quad->dim.quad[1].x + (quad->dim.quad[3].x + quad->dim.quad[2].x))) / 4.0f; + avg->y = (quad->dim.quad[0].y + (quad->dim.quad[1].y + (quad->dim.quad[3].y + quad->dim.quad[2].y))) / 4.0f; + avg->z = (quad->dim.quad[0].z + (quad->dim.quad[1].z + (quad->dim.quad[3].z + quad->dim.quad[2].z))) / 4.0f; +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_JntSphVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderJntSph* at = (ColliderJntSph*)colAT; + ColliderJntSphElement* atElem; + ColliderJntSph* ac = (ColliderJntSph*)colAC; + ColliderJntSphElement* acElem; + f32 overlapSize; + f32 centerDist; + + if (at->count > 0 && at->elements != NULL && ac->count > 0 && ac->elements != NULL) { + for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) { + if (CollisionCheck_SkipTouch(&atElem->info)) { + continue; + } + + for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) { + if (CollisionCheck_SkipBump(&acElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&atElem->info, &acElem->info)) { + continue; + } + + if (Math3D_ColSphereSphereIntersectAndDistance(&atElem->dim.worldSphere, &acElem->dim.worldSphere, + &overlapSize, ¢erDist) != 0) { + f32 acToHit; + Vec3f hitPos; + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &atElem->dim.worldSphere.center); + Math_Vec3s_ToVec3f(&acPos, &acElem->dim.worldSphere.center); + + if (!IS_ZERO(centerDist)) { + acToHit = acElem->dim.worldSphere.radius / centerDist; + hitPos.x = ((atPos.x - acPos.x) * acToHit) + acPos.x; + hitPos.y = ((atPos.y - acPos.y) * acToHit) + acPos.y; + hitPos.z = ((atPos.z - acPos.z) * acToHit) + acPos.z; + } else { + Math_Vec3f_Copy(&hitPos, &atPos); + } + CollisionCheck_SetATvsAC(ctxt, &at->base, &atElem->info, &atPos, &ac->base, &acElem->info, &acPos, + &hitPos); + + if (!(ac->base.ocFlags2 & OC2_FIRST_ONLY)) { + return; + } + } + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_JntSphVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderJntSph* at = (ColliderJntSph*)colAT; + ColliderJntSphElement* atElem; + ColliderCylinder* ac = (ColliderCylinder*)colAC; + f32 overlapSize; + f32 centerDist; + + if (at->count > 0 && at->elements != NULL && ac->dim.radius > 0 && ac->dim.height > 0) { + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) { + if (CollisionCheck_SkipTouch(&atElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&atElem->info, &ac->info)) { + continue; + } + if (Math3D_ColSphereCylinderDistanceAndAmount(&atElem->dim.worldSphere, &ac->dim, &overlapSize, + ¢erDist)) { + Vec3f hitPos; + Vec3f atPos; + Vec3f acPos; + f32 acToHit; + + Math_Vec3s_ToVec3f(&atPos, &atElem->dim.worldSphere.center); + Math_Vec3s_ToVec3f(&acPos, &ac->dim.pos); + if (!IS_ZERO(centerDist)) { + acToHit = ac->dim.radius / centerDist; + if (acToHit <= 1.0f) { + hitPos.x = ((atPos.x - acPos.x) * acToHit) + acPos.x; + hitPos.y = ((atPos.y - acPos.y) * acToHit) + acPos.y; + hitPos.z = ((atPos.z - acPos.z) * acToHit) + acPos.z; + } else { + Math_Vec3f_Copy(&hitPos, &atPos); + } + } else { + Math_Vec3f_Copy(&hitPos, &atPos); + } + CollisionCheck_SetATvsAC(ctxt, &at->base, &atElem->info, &atPos, &ac->base, &ac->info, &acPos, &hitPos); + return; + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_JntSphVsTris(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderJntSph* at = (ColliderJntSph*)colAT; + ColliderJntSphElement* atElem; + ColliderTris* ac = (ColliderTris*)colAC; + ColliderTrisElement* acElem; + Vec3f hitPos; + + if (at->count > 0 && at->elements != NULL && ac->count > 0 && ac->elements != NULL) { + for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) { + if (CollisionCheck_SkipTouch(&atElem->info)) { + continue; + } + for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) { + if (CollisionCheck_SkipBump(&acElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&atElem->info, &acElem->info)) { + continue; + } + if (Math3D_ColSphereTri(&atElem->dim.worldSphere, &acElem->dim, &hitPos) != 0) { + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &atElem->dim.worldSphere.center); + CollisionCheck_TrisAvgPoint(acElem, &acPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &atElem->info, &atPos, &ac->base, &acElem->info, &acPos, + &hitPos); + return; + } + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_JntSphVsQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderJntSph* at = (ColliderJntSph*)colAT; + ColliderQuad* ac = (ColliderQuad*)colAC; + Vec3f hitPos; + ColliderJntSphElement* sphElem; + + if (at->count > 0 && at->elements != NULL) { + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + Math3D_TriSetCoords(&D_801EF590, &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]); + Math3D_TriSetCoords(&D_801EF5C8, &ac->dim.quad[1], &ac->dim.quad[0], &ac->dim.quad[2]); + + for (sphElem = at->elements; sphElem < &at->elements[at->count]; sphElem++) { + if (CollisionCheck_SkipTouch(&sphElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&sphElem->info, &ac->info)) { + continue; + } + if (Math3D_ColSphereTri(&sphElem->dim.worldSphere, &D_801EF590, &hitPos) != 0 || + Math3D_ColSphereTri(&sphElem->dim.worldSphere, &D_801EF5C8, &hitPos) != 0) { + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &sphElem->dim.worldSphere.center); + CollisionCheck_QuadAvgPoint(ac, &acPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &sphElem->info, &atPos, &ac->base, &ac->info, &acPos, + &hitPos); + return; + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_JntSphVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderJntSph* at = (ColliderJntSph*)colAT; + ColliderSphere* ac = (ColliderSphere*)colAC; + ColliderJntSphElement* sphElem; + f32 overlapSize; + f32 centerDist; + + if (at->count > 0 && at->elements != NULL) { + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + for (sphElem = at->elements; sphElem < &at->elements[at->count]; sphElem++) { + if (CollisionCheck_SkipTouch(&sphElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&sphElem->info, &ac->info)) { + continue; + } + if (Math3D_ColSphereSphereIntersectAndDistance(&sphElem->dim.worldSphere, &ac->dim.worldSphere, + &overlapSize, ¢erDist) != 0) { + f32 acToHit; + Vec3f hitPos; + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &sphElem->dim.worldSphere.center); + Math_Vec3s_ToVec3f(&acPos, &ac->dim.worldSphere.center); + if (!IS_ZERO(centerDist)) { + acToHit = ac->dim.worldSphere.radius / centerDist; + hitPos.x = ((atPos.x - acPos.x) * acToHit) + acPos.x; + hitPos.y = ((atPos.y - acPos.y) * acToHit) + acPos.y; + hitPos.z = ((atPos.z - acPos.z) * acToHit) + acPos.z; + } else { + Math_Vec3f_Copy(&hitPos, &atPos); + } + CollisionCheck_SetATvsAC(ctxt, &at->base, &sphElem->info, &atPos, &ac->base, &ac->info, &acPos, + &hitPos); + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_CylVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderCylinder* at = (ColliderCylinder*)colAT; + ColliderJntSph* ac = (ColliderJntSph*)colAC; + f32 overlapSize; + f32 centerDist; + ColliderJntSphElement* sphElem; + + if (ac->count > 0 && ac->elements != NULL && at->dim.radius > 0 && at->dim.height > 0) { + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + for (sphElem = ac->elements; sphElem < &ac->elements[ac->count]; sphElem++) { + if (CollisionCheck_SkipBump(&sphElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&at->info, &sphElem->info)) { + continue; + } + if (Math3D_ColSphereCylinderDistanceAndAmount(&sphElem->dim.worldSphere, &at->dim, &overlapSize, + ¢erDist) != 0) { + Vec3f hitPos; + Vec3f atPos; + Vec3f acPos; + f32 acToHit; + + Math_Vec3s_ToVec3f(&atPos, &at->dim.pos); + Math_Vec3s_ToVec3f(&acPos, &sphElem->dim.worldSphere.center); + if (!IS_ZERO(centerDist)) { + acToHit = sphElem->dim.worldSphere.radius / centerDist; + if (acToHit <= 1.0f) { + hitPos.x = ((atPos.x - acPos.x) * acToHit) + acPos.x; + hitPos.y = ((atPos.y - acPos.y) * acToHit) + acPos.y; + hitPos.z = ((atPos.z - acPos.z) * acToHit) + acPos.z; + } else { + Math_Vec3f_Copy(&hitPos, &atPos); + } + } else { + Math_Vec3f_Copy(&hitPos, &atPos); + } + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &sphElem->info, &acPos, + &hitPos); + if (!(ac->base.ocFlags2 & OC2_FIRST_ONLY)) { + break; + } + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_CylVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, Collider* colAC) { + ColliderCylinder* at = (ColliderCylinder*)colAT; + ColliderCylinder* ac = (ColliderCylinder*)colAC; + f32 overlapSize; + f32 centerDist; + + if (at->dim.radius > 0 && at->dim.height > 0 && ac->dim.radius > 0 && ac->dim.height > 0) { + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + if (CollisionCheck_NoSharedFlags(&at->info, &ac->info)) { + return; + } + + if (Math3D_ColCylinderCylinderAmountAndDistance(&at->dim, &ac->dim, &overlapSize, ¢erDist) != 0) { + Vec3f hitPos; + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &at->dim.pos); + Math_Vec3s_ToVec3f(&acPos, &ac->dim.pos); + if (!IS_ZERO(centerDist)) { + f32 acToHit = ac->dim.radius / centerDist; + f32 height; + + hitPos.y = (f32)at->dim.pos.y + at->dim.yShift + at->dim.height * 0.5f; + height = (f32)ac->dim.pos.y + ac->dim.yShift; + + if (hitPos.y < height) { + hitPos.y = height; + } else { + height += ac->dim.height; + if (hitPos.y > height) { + hitPos.y = height; + } + } + hitPos.x = ((f32)at->dim.pos.x - ac->dim.pos.x) * acToHit + ac->dim.pos.x; + hitPos.z = ((f32)at->dim.pos.z - ac->dim.pos.z) * acToHit + ac->dim.pos.z; + } else { + Math_Vec3s_ToVec3f(&hitPos, &ac->dim.pos); + } + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &ac->info, &acPos, &hitPos); + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_CylVsTris(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderCylinder* at = (ColliderCylinder*)colAT; + ColliderTris* ac = (ColliderTris*)colAC; + ColliderTrisElement* acElem; + Vec3f hitPos; + + if (at->dim.radius > 0 && at->dim.height > 0 && ac->count > 0 && ac->elements != NULL) { + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + + for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) { + if (CollisionCheck_SkipBump(&acElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&at->info, &acElem->info)) { + continue; + } + + if (Math3D_ColCylinderTri(&at->dim, &acElem->dim, &hitPos) != 0) { + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &at->dim.pos); + CollisionCheck_TrisAvgPoint(acElem, &acPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &acElem->info, &acPos, &hitPos); + return; + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_CylVsQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderCylinder* at = (ColliderCylinder*)colAT; + ColliderQuad* ac = (ColliderQuad*)colAC; + + if (at->dim.height > 0 && at->dim.radius > 0) { + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + if (CollisionCheck_NoSharedFlags(&at->info, &ac->info)) { + return; + } + Math3D_TriSetCoords(&D_801EF600, &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]); + Math3D_TriSetCoords(&D_801EF638, &ac->dim.quad[1], &ac->dim.quad[0], &ac->dim.quad[2]); + + if (Math3D_ColCylinderTri(&at->dim, &D_801EF600, &D_801EDE00) != 0) { + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &at->dim.pos); + CollisionCheck_QuadAvgPoint(ac, &acPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &ac->info, &acPos, &D_801EDE00); + } else if (Math3D_ColCylinderTri(&at->dim, &D_801EF638, &D_801EDE00) != 0) { + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &at->dim.pos); + CollisionCheck_QuadAvgPoint(ac, &acPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &ac->info, &acPos, &D_801EDE00); + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_CylVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderCylinder* at = (ColliderCylinder*)colAT; + ColliderSphere* ac = (ColliderSphere*)colAC; + f32 overlapSize; + f32 centerDist; + + if (at->dim.radius > 0 && at->dim.height > 0) { + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + if (CollisionCheck_NoSharedFlags(&at->info, &ac->info)) { + return; + } + + if (Math3D_ColSphereCylinderDistanceAndAmount(&ac->dim.worldSphere, &at->dim, &overlapSize, ¢erDist) != 0) { + Vec3f hitPos; + Vec3f atPos; + Vec3f acPos; + f32 acToHit; + + Math_Vec3s_ToVec3f(&atPos, &at->dim.pos); + Math_Vec3s_ToVec3f(&acPos, &ac->dim.worldSphere.center); + + if (!IS_ZERO(centerDist)) { + acToHit = ac->dim.worldSphere.radius / centerDist; + if (acToHit <= 1.0f) { + hitPos.x = ((atPos.x - acPos.x) * acToHit) + acPos.x; + hitPos.y = ((atPos.y - acPos.y) * acToHit) + acPos.y; + hitPos.z = ((atPos.z - acPos.z) * acToHit) + acPos.z; + } else { + Math_Vec3f_Copy(&hitPos, &atPos); + } + } else { + Math_Vec3f_Copy(&hitPos, &atPos); + } + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &ac->info, &acPos, &hitPos); + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_TrisVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderTris* at = (ColliderTris*)colAT; + ColliderJntSphElement* acElem; + ColliderJntSph* ac = (ColliderJntSph*)colAC; + ColliderTrisElement* atElem; + Vec3f hitPos; + + if (ac->count > 0 && ac->elements != NULL && at->count > 0 && at->elements != NULL) { + for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) { + if (CollisionCheck_SkipBump(&acElem->info)) { + continue; + } + for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) { + if (CollisionCheck_SkipTouch(&atElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&atElem->info, &acElem->info)) { + continue; + } + if (Math3D_ColSphereTri(&acElem->dim.worldSphere, &atElem->dim, &hitPos)) { + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&acPos, &acElem->dim.worldSphere.center); + CollisionCheck_TrisAvgPoint(atElem, &atPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &atElem->info, &atPos, &ac->base, &acElem->info, &acPos, + &hitPos); + + if (!(ac->base.ocFlags2 & OC2_FIRST_ONLY)) { + return; + } + } + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_TrisVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderTris* at = (ColliderTris*)colAT; + ColliderCylinder* ac = (ColliderCylinder*)colAC; + ColliderTrisElement* atElem; + + if (ac->dim.radius > 0 && ac->dim.height > 0 && at->count > 0 && at->elements != NULL) { + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) { + if (CollisionCheck_SkipTouch(&atElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&atElem->info, &ac->info)) { + continue; + } + if (Math3D_ColCylinderTri(&ac->dim, &atElem->dim, &D_801EDE10) != 0) { + Vec3f atPos; + Vec3f acPos; + + CollisionCheck_TrisAvgPoint(atElem, &atPos); + Math_Vec3s_ToVec3f(&acPos, &ac->dim.pos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &atElem->info, &atPos, &ac->base, &ac->info, &acPos, + &D_801EDE10); + return; + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_TrisVsTris(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderTris* at = (ColliderTris*)colAT; + ColliderTrisElement* atElem; + ColliderTris* ac = (ColliderTris*)colAC; + ColliderTrisElement* acElem; + + if (ac->count > 0 && ac->elements != NULL && at->count > 0 && at->elements != NULL) { + for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) { + if (CollisionCheck_SkipBump(&acElem->info)) { + continue; + } + for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) { + if (CollisionCheck_SkipTouch(&atElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&atElem->info, &acElem->info)) { + continue; + } + if (Math3d_ColTriTri(&atElem->dim, &acElem->dim, &D_801EDE20) != 0) { + Vec3f atPos; + Vec3f acPos; + + CollisionCheck_TrisAvgPoint(atElem, &atPos); + CollisionCheck_TrisAvgPoint(acElem, &acPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &atElem->info, &atPos, &ac->base, &acElem->info, &acPos, + &D_801EDE20); + return; + } + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_TrisVsQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderTris* at = (ColliderTris*)colAT; + ColliderQuad* ac = (ColliderQuad*)colAC; + ColliderTrisElement* atElem; + + if (at->count > 0 && at->elements != NULL) { + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + + Math3D_TriSetCoords(&D_801EDE40, &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]); + Math3D_TriSetCoords(&D_801EDE78, &ac->dim.quad[1], &ac->dim.quad[0], &ac->dim.quad[2]); + + for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) { + if (CollisionCheck_SkipTouch(&atElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&atElem->info, &ac->info)) { + continue; + } + if (Math3d_ColTriTri(&D_801EDE40, &atElem->dim, &D_801EDE30) != 0 || + Math3d_ColTriTri(&D_801EDE78, &atElem->dim, &D_801EDE30) != 0) { + Vec3f atPos; + Vec3f acPos; + + CollisionCheck_TrisAvgPoint(atElem, &atPos); + CollisionCheck_QuadAvgPoint(ac, &acPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &atElem->info, &atPos, &ac->base, &ac->info, &acPos, + &D_801EDE30); + return; + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_TrisVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderTris* at = (ColliderTris*)colAT; + ColliderTrisElement* atElem; + ColliderSphere* ac = (ColliderSphere*)colAC; + Vec3f hitPos; + + if (at->count > 0 && at->elements != NULL) { + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + for (atElem = at->elements; atElem < &at->elements[at->count]; atElem++) { + if (CollisionCheck_SkipTouch(&atElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&atElem->info, &ac->info)) { + continue; + } + if (Math3D_ColSphereTri(&ac->dim.worldSphere, &atElem->dim, &hitPos) != 0) { + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&acPos, &ac->dim.worldSphere.center); + CollisionCheck_TrisAvgPoint(atElem, &atPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &atElem->info, &atPos, &ac->base, &ac->info, &acPos, &hitPos); + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_QuadVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderJntSphElement* acElem; + Vec3f hitPos; + ColliderQuad* at = (ColliderQuad*)colAT; + ColliderJntSph* ac = (ColliderJntSph*)colAC; + + if (ac->count > 0 && ac->elements != NULL) { + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + Math3D_TriSetCoords(&D_801EDEC8, &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]); + Math3D_TriSetCoords(&D_801EDF00, &at->dim.quad[2], &at->dim.quad[1], &at->dim.quad[0]); + + for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) { + if (CollisionCheck_SkipBump(&acElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&at->info, &acElem->info)) { + continue; + } + if (Math3D_ColSphereTri(&acElem->dim.worldSphere, &D_801EDEC8, &hitPos) != 0 || + Math3D_ColSphereTri(&acElem->dim.worldSphere, &D_801EDF00, &hitPos) != 0) { + Vec3f atPos; + Vec3f acPos; + + if (!Collider_QuadSetNearestAC(ctxt, at, &hitPos)) { + continue; + } + Math_Vec3s_ToVec3f(&acPos, &acElem->dim.worldSphere.center); + CollisionCheck_QuadAvgPoint(at, &atPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &acElem->info, &acPos, &hitPos); + + if (!(ac->base.ocFlags2 & OC2_FIRST_ONLY)) { + break; + } + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_QuadVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderQuad* at = (ColliderQuad*)colAT; + ColliderCylinder* ac = (ColliderCylinder*)colAC; + + if (ac->dim.height > 0 && ac->dim.radius > 0) { + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + if (CollisionCheck_NoSharedFlags(&at->info, &ac->info)) { + return; + } + + Math3D_TriSetCoords(&D_801EDF58, &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]); + Math3D_TriSetCoords(&D_801EDF90, &at->dim.quad[2], &at->dim.quad[1], &at->dim.quad[0]); + + if (Math3D_ColCylinderTri(&ac->dim, &D_801EDF58, &D_801EDFE0) != 0) { + if (Collider_QuadSetNearestAC(ctxt, at, &D_801EDFE0)) { + Vec3f atPos; + Vec3f acPos; + + CollisionCheck_QuadAvgPoint(at, &atPos); + Math_Vec3s_ToVec3f(&acPos, &ac->dim.pos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &ac->info, &acPos, &D_801EDFE0); + return; + } + } + if (Math3D_ColCylinderTri(&ac->dim, &D_801EDF90, &D_801EDFE0) != 0) { + if (Collider_QuadSetNearestAC(ctxt, at, &D_801EDFE0)) { + Vec3f atPos; + Vec3f acPos; + + CollisionCheck_QuadAvgPoint(at, &atPos); + Math_Vec3s_ToVec3f(&acPos, &ac->dim.pos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &ac->info, &acPos, &D_801EDFE0); + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_QuadVsTris(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderQuad* at = (ColliderQuad*)colAT; + ColliderTris* ac = (ColliderTris*)colAC; + ColliderTrisElement* acElem; + + if (ac->count > 0 && ac->elements != NULL) { + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + + Math3D_TriSetCoords(&D_801EE000, &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]); + Math3D_TriSetCoords(&D_801EE038, &at->dim.quad[1], &at->dim.quad[0], &at->dim.quad[2]); + + for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) { + if (CollisionCheck_SkipBump(&acElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&at->info, &acElem->info)) { + continue; + } + + if ((Math3d_ColTriTri(&D_801EE000, &acElem->dim, &D_801EDFF0) != 0) || + (Math3d_ColTriTri(&D_801EE038, &acElem->dim, &D_801EDFF0) != 0)) { + if (Collider_QuadSetNearestAC(ctxt, at, &D_801EDFF0)) { + Vec3f atPos; + Vec3f acPos; + + CollisionCheck_TrisAvgPoint(acElem, &acPos); + CollisionCheck_QuadAvgPoint(at, &atPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &acElem->info, &acPos, + &D_801EDFF0); + return; + } + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_QuadVsQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderQuad* at = (ColliderQuad*)colAT; + ColliderQuad* ac = (ColliderQuad*)colAC; + s32 i; + s32 j; + + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + if (CollisionCheck_NoSharedFlags(&at->info, &ac->info)) { + return; + } + + Math3D_TriSetCoords(&D_801EE0E8[0], &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]); + Math3D_TriSetCoords(&D_801EE0E8[1], &at->dim.quad[2], &at->dim.quad[1], &at->dim.quad[0]); + Math3D_TriSetCoords(&D_801EE070[0], &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]); + Math3D_TriSetCoords(&D_801EE070[1], &ac->dim.quad[2], &ac->dim.quad[1], &ac->dim.quad[0]); + + for (i = 0; i < 2; i++) { + for (j = 0; j < 2; j++) { + if (Math3d_ColTriTri(&D_801EE0E8[j], &D_801EE070[i], &D_801EE0D8) != 0 && + Collider_QuadSetNearestAC(ctxt, at, &D_801EE0D8) != 0) { + Vec3f atPos; + Vec3f acPos; + + CollisionCheck_QuadAvgPoint(at, &atPos); + CollisionCheck_QuadAvgPoint(ac, &acPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &ac->info, &acPos, &D_801EE0D8); + return; + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_QuadVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderQuad* at = (ColliderQuad*)colAT; + Vec3f hitPos; + ColliderSphere* ac = (ColliderSphere*)colAC; + + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + if (CollisionCheck_SkipBump(&ac->info) || CollisionCheck_NoSharedFlags(&at->info, &ac->info)) { + return; + } + + Math3D_TriSetCoords(&D_801EE150, &at->dim.quad[2], &at->dim.quad[3], &at->dim.quad[1]); + Math3D_TriSetCoords(&D_801EE188, &at->dim.quad[2], &at->dim.quad[1], &at->dim.quad[0]); + + if ((Math3D_ColSphereTri(&ac->dim.worldSphere, &D_801EE150, &hitPos) != 0) || + (Math3D_ColSphereTri(&ac->dim.worldSphere, &D_801EE188, &hitPos) != 0)) { + if (Collider_QuadSetNearestAC(ctxt, at, &hitPos)) { + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&acPos, &ac->dim.worldSphere.center); + CollisionCheck_QuadAvgPoint(at, &atPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &ac->info, &acPos, &hitPos); + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_SphereVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderSphere* at = (ColliderSphere*)colAT; + ColliderJntSph* ac = (ColliderJntSph*)colAC; + ColliderJntSphElement* acElem; + f32 overlapSize; + f32 centerDist; + + if (ac->count > 0 && ac->elements != NULL) { + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + + for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) { + if (CollisionCheck_SkipBump(&acElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&at->info, &acElem->info)) { + continue; + } + + if (Math3D_ColSphereSphereIntersectAndDistance(&at->dim.worldSphere, &acElem->dim.worldSphere, &overlapSize, + ¢erDist) != 0) { + f32 acToHit; + Vec3f hitPos; + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &at->dim.worldSphere.center); + Math_Vec3s_ToVec3f(&acPos, &acElem->dim.worldSphere.center); + if (!IS_ZERO(centerDist)) { + acToHit = acElem->dim.worldSphere.radius / centerDist; + hitPos.x = (atPos.x - acPos.x) * acToHit + acPos.x; + hitPos.y = (atPos.y - acPos.y) * acToHit + acPos.y; + hitPos.z = (atPos.z - acPos.z) * acToHit + acPos.z; + } else { + Math_Vec3f_Copy(&hitPos, &atPos); + } + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &acElem->info, &acPos, &hitPos); + } + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_SphereVsCylinder(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderCylinder* ac = (ColliderCylinder*)colAC; + ColliderSphere* at = (ColliderSphere*)colAT; + f32 overlapSize; + f32 centerDist; + + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + if (CollisionCheck_NoSharedFlags(&at->info, &ac->info)) { + return; + } + + if (Math3D_ColSphereCylinderDistanceAndAmount(&at->dim.worldSphere, &ac->dim, &overlapSize, ¢erDist) != 0) { + Vec3f hitPos; + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &at->dim.worldSphere.center); + Math_Vec3s_ToVec3f(&acPos, &ac->dim.pos); + + if (!IS_ZERO(centerDist)) { + f32 acToHit = ac->dim.radius / centerDist; + + if (acToHit <= 1.0f) { + hitPos.x = (atPos.x - acPos.x) * acToHit + acPos.x; + hitPos.y = (atPos.y - acPos.y) * acToHit + acPos.y; + hitPos.z = (atPos.z - acPos.z) * acToHit + acPos.z; + } else { + Math_Vec3f_Copy(&hitPos, &atPos); + } + } else { + Math_Vec3f_Copy(&hitPos, &atPos); + } + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &ac->info, &acPos, &hitPos); + } + + if (at) {} +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_SphereVsTris(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderSphere* at = (ColliderSphere*)colAT; + ColliderTris* ac = (ColliderTris*)colAC; + ColliderTrisElement* acElem; + Vec3f hitPos; + + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + + for (acElem = ac->elements; acElem < &ac->elements[ac->count]; acElem++) { + if (CollisionCheck_SkipBump(&acElem->info)) { + continue; + } + if (CollisionCheck_NoSharedFlags(&at->info, &acElem->info)) { + continue; + } + if (Math3D_ColSphereTri(&at->dim.worldSphere, &acElem->dim, &hitPos) != 0) { + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &at->dim.worldSphere.center); + CollisionCheck_TrisAvgPoint(acElem, &acPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &acElem->info, &acPos, &hitPos); + return; + } + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_SphereVsQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderSphere* at = (ColliderSphere*)colAT; + Vec3f hitPos; + ColliderQuad* ac = (ColliderQuad*)colAC; + + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + if (CollisionCheck_SkipBump(&ac->info) || CollisionCheck_NoSharedFlags(&at->info, &ac->info)) { + return; + } + + Math3D_TriSetCoords(&D_801EE6C8, &ac->dim.quad[2], &ac->dim.quad[3], &ac->dim.quad[1]); + Math3D_TriSetCoords(&D_801EE700, &ac->dim.quad[1], &ac->dim.quad[0], &ac->dim.quad[2]); + + if (Math3D_ColSphereTri(&at->dim.worldSphere, &D_801EE6C8, &hitPos) != 0 || + Math3D_ColSphereTri(&at->dim.worldSphere, &D_801EE700, &hitPos) != 0) { + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &at->dim.worldSphere.center); + CollisionCheck_QuadAvgPoint(ac, &acPos); + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &ac->info, &acPos, &hitPos); + } +} + +/** + * AC overlap check. Calculates the center of each collider element and the point of contact. + */ +void CollisionCheck_AC_SphereVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT, + Collider* colAC) { + ColliderSphere* at = (ColliderSphere*)colAT; + ColliderSphere* ac = (ColliderSphere*)colAC; + f32 overlapSize; + f32 centerDist; + + if (CollisionCheck_SkipTouch(&at->info)) { + return; + } + if (CollisionCheck_SkipBump(&ac->info)) { + return; + } + if (CollisionCheck_NoSharedFlags(&at->info, &ac->info)) { + return; + } + + if (Math3D_ColSphereSphereIntersectAndDistance(&at->dim.worldSphere, &ac->dim.worldSphere, &overlapSize, + ¢erDist) != 0) { + f32 acToHit; + Vec3f hitPos; + Vec3f atPos; + Vec3f acPos; + + Math_Vec3s_ToVec3f(&atPos, &at->dim.worldSphere.center); + Math_Vec3s_ToVec3f(&acPos, &ac->dim.worldSphere.center); + if (!IS_ZERO(centerDist)) { + acToHit = ac->dim.worldSphere.radius / centerDist; + hitPos.x = (atPos.x - acPos.x) * acToHit + acPos.x; + hitPos.y = (atPos.y - acPos.y) * acToHit + acPos.y; + hitPos.z = (atPos.z - acPos.z) * acToHit + acPos.z; + } else { + Math_Vec3f_Copy(&hitPos, &atPos); + } + CollisionCheck_SetATvsAC(ctxt, &at->base, &at->info, &atPos, &ac->base, &ac->info, &acPos, &hitPos); + } +} + +/** + * Sets a ColliderJntSph's hit effects + */ +void CollisionCheck_SetJntSphHitFX(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + ColliderJntSph* jntSph = (ColliderJntSph*)collider; + ColliderJntSphElement* element; + + for (element = jntSph->elements; element < &jntSph->elements[jntSph->count]; element++) { + if ((element->info.bumperFlags & BUMP_DRAW_HITMARK) && element->info.acHitInfo != NULL && + !(element->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) { + Vec3f hitPos; + + Math_Vec3s_ToVec3f(&hitPos, &element->info.bumper.hitPos); + CollisionCheck_HitEffects(ctxt, element->info.acHit, element->info.acHitInfo, &jntSph->base, &element->info, + &hitPos); + element->info.acHitInfo->toucherFlags |= TOUCH_DREW_HITMARK; + return; + } + } +} + +/** + * Sets a ColliderCylinder's hit effects + */ +void CollisionCheck_SetCylHitFX(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + ColliderCylinder* cylinder = (ColliderCylinder*)collider; + + if ((cylinder->info.bumperFlags & BUMP_DRAW_HITMARK) && cylinder->info.acHitInfo != NULL && + !(cylinder->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) { + Vec3f hitPos; + + Math_Vec3s_ToVec3f(&hitPos, &cylinder->info.bumper.hitPos); + CollisionCheck_HitEffects(ctxt, cylinder->info.acHit, cylinder->info.acHitInfo, &cylinder->base, + &cylinder->info, &hitPos); + cylinder->info.acHitInfo->toucherFlags |= TOUCH_DREW_HITMARK; + } +} + +/** + * Sets a ColliderTris's hit effects + */ +void CollisionCheck_SetTrisHitFX(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + ColliderTris* tris = (ColliderTris*)collider; + ColliderTrisElement* element; + + for (element = tris->elements; element < &tris->elements[tris->count]; element++) { + if ((element->info.bumperFlags & BUMP_DRAW_HITMARK) && element->info.acHitInfo != NULL && + !(element->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) { + Vec3f hitPos; + + Math_Vec3s_ToVec3f(&hitPos, &element->info.bumper.hitPos); + CollisionCheck_HitEffects(ctxt, element->info.acHit, element->info.acHitInfo, &tris->base, &element->info, + &hitPos); + element->info.acHitInfo->toucherFlags |= TOUCH_DREW_HITMARK; + return; + } + } +} + +/** + * Sets a ColliderQuad's hit effects + */ +void CollisionCheck_SetQuadHitFX(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + ColliderQuad* quad = (ColliderQuad*)collider; + + if ((quad->info.bumperFlags & BUMP_DRAW_HITMARK) && quad->info.acHitInfo != NULL && + !(quad->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) { + Vec3f hitPos; + + Math_Vec3s_ToVec3f(&hitPos, &quad->info.bumper.hitPos); + CollisionCheck_HitEffects(ctxt, quad->info.acHit, quad->info.acHitInfo, &quad->base, &quad->info, &hitPos); + quad->info.acHitInfo->toucherFlags |= TOUCH_DREW_HITMARK; + } +} + +/** + * Sets a ColliderSphere's hit effects + */ +void CollisionCheck_SetSphereHitFX(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + ColliderSphere* sphere = (ColliderSphere*)collider; + + if ((sphere->info.bumperFlags & BUMP_DRAW_HITMARK) && sphere->info.acHitInfo != NULL && + !(sphere->info.acHitInfo->toucherFlags & TOUCH_DREW_HITMARK)) { + Vec3f hitPos; + + Math_Vec3s_ToVec3f(&hitPos, &sphere->info.bumper.hitPos); + CollisionCheck_HitEffects(ctxt, sphere->info.acHit, sphere->info.acHitInfo, &sphere->base, &sphere->info, + &hitPos); + sphere->info.acHitInfo->toucherFlags |= TOUCH_DREW_HITMARK; + } +} + +ColChkApplyFunc sColChkApplyFuncs[] = { + CollisionCheck_SetJntSphHitFX, CollisionCheck_SetCylHitFX, CollisionCheck_SetTrisHitFX, + CollisionCheck_SetQuadHitFX, CollisionCheck_SetSphereHitFX, +}; + +/** + * Handles hit effects for each AC collider that had an AC collision. Spawns hitmarks and plays sound effects. + */ +void CollisionCheck_SetHitEffects(GlobalContext* ctxt, CollisionCheckContext* colCtxt) { + Collider** col; + + for (col = &colCtxt->colAC[0]; col < &colCtxt->colAC[colCtxt->colACCount]; col++) { + Collider* colAC = *col; + + if (colAC != NULL && (colAC->acFlags & AC_ON)) { + if (colAC->actor != NULL && colAC->actor->update == NULL) { + continue; + } + sColChkApplyFuncs[colAC->shape](ctxt, colCtxt, colAC); + } + } +} + +ColChkVsFunc sACVsFuncs[COLSHAPE_MAX][COLSHAPE_MAX] = { + { CollisionCheck_AC_JntSphVsJntSph, CollisionCheck_AC_JntSphVsCyl, CollisionCheck_AC_JntSphVsTris, + CollisionCheck_AC_JntSphVsQuad, CollisionCheck_AC_JntSphVsSphere }, + { CollisionCheck_AC_CylVsJntSph, CollisionCheck_AC_CylVsCyl, CollisionCheck_AC_CylVsTris, + CollisionCheck_AC_CylVsQuad, CollisionCheck_AC_CylVsSphere }, + { CollisionCheck_AC_TrisVsJntSph, CollisionCheck_AC_TrisVsCyl, CollisionCheck_AC_TrisVsTris, + CollisionCheck_AC_TrisVsQuad, CollisionCheck_AC_TrisVsSphere }, + { CollisionCheck_AC_QuadVsJntSph, CollisionCheck_AC_QuadVsCyl, CollisionCheck_AC_QuadVsTris, + CollisionCheck_AC_QuadVsQuad, CollisionCheck_AC_QuadVsSphere }, + { CollisionCheck_AC_SphereVsJntSph, CollisionCheck_AC_SphereVsCylinder, CollisionCheck_AC_SphereVsTris, + CollisionCheck_AC_SphereVsQuad, CollisionCheck_AC_SphereVsSphere }, +}; + +/** + * Iterates through all AC colliders, performing AC collisions with the AT collider. + */ +void CollisionCheck_AC(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* colAT) { + Collider** col; + + for (col = &colCtxt->colAC[0]; col < &colCtxt->colAC[colCtxt->colACCount]; col++) { + Collider* colAC = *col; + + if (colAC != NULL && (colAC->acFlags & AC_ON)) { + if (colAC->actor != NULL && colAC->actor->update == NULL) { + continue; + } + if ((colAC->acFlags & colAT->atFlags & AC_TYPE_ALL) && colAT != colAC) { + if (!(colAT->atFlags & AT_SELF) && colAT->actor != NULL && colAC->actor == colAT->actor) { + continue; + } + sACVsFuncs[colAT->shape][colAC->shape](ctxt, colCtxt, colAT, colAC); + } + } + } +} + +/** + * Iterates through all AT colliders, testing them for AC collisions with each AC collider, setting the info regarding + * the collision for each AC and AT collider that collided. Then spawns hitmarks and plays sound effects for each + * successful collision. To collide, an AT collider must share a type (PLAYER, ENEMY, or BOMB) with the AC collider and + * the toucher and bumper elements that overlapped must share a dmgFlag. + */ +void CollisionCheck_AT(GlobalContext* ctxt, CollisionCheckContext* colCtxt) { + Collider** col; + + if (colCtxt->colATCount == 0 || colCtxt->colACCount == 0) { + return; + } + + for (col = &colCtxt->colAT[0]; col < &colCtxt->colAT[colCtxt->colATCount]; col++) { + Collider* colAC = *col; + + if (colAC != NULL && (colAC->atFlags & AT_ON)) { + if (colAC->actor != NULL && colAC->actor->update == NULL) { + continue; + } + CollisionCheck_AC(ctxt, colCtxt, colAC); + } + } + + CollisionCheck_SetHitEffects(ctxt, colCtxt); +} + +/** + * Get mass type. Immobile colliders cannot be pushed, while heavy colliders can only be pushed by heavy and immobile + * colliders. + */ +s32 CollisionCheck_GetMassType(u8 mass) { + if (mass == MASS_IMMOVABLE) { + return MASSTYPE_IMMOVABLE; + } + if (mass == MASS_HEAVY) { + return MASSTYPE_HEAVY; + } + return MASSTYPE_NORMAL; +} + +/** + * Sets OC collision flags for OC collider overlaps. If both colliders are attached to actors and can push, + * also performs an elastic collision where both colliders are moved apart in proportion to their masses. + */ +void CollisionCheck_SetOCvsOC(GlobalContext* ctxt, Collider* left, ColliderInfo* leftInfo, Vec3f* leftPos, + Collider* right, ColliderInfo* rightInfo, Vec3f* rightPos, f32 overlap) { + f32 pad; + f32 leftDispRatio; + f32 rightDispRatio; + f32 xzDist; + f32 leftMass; + f32 rightMass; + f32 totalMass; + f32 inverseTotalMass; + f32 xDelta; + f32 zDelta; + Actor* leftActor = left->actor; + Actor* rightActor = right->actor; + s32 leftMassType; + s32 rightMassType; + + left->ocFlags1 |= OC1_HIT; + left->oc = rightActor; + leftInfo->ocElemFlags |= OCELEM_HIT; + if (right->ocFlags2 & OC2_TYPE_PLAYER) { + left->ocFlags2 |= OC2_HIT_PLAYER; + } + + right->ocFlags1 |= OC1_HIT; + right->oc = leftActor; + rightInfo->ocElemFlags |= OCELEM_HIT; + if (left->ocFlags2 & OC2_TYPE_PLAYER) { + right->ocFlags2 |= OC2_HIT_PLAYER; + } + + if (leftActor == NULL || rightActor == NULL || (left->ocFlags1 & OC1_NO_PUSH) || (right->ocFlags1 & OC1_NO_PUSH)) { + return; + } + + rightMassType = CollisionCheck_GetMassType(leftActor->colChkInfo.mass); + leftMassType = CollisionCheck_GetMassType(rightActor->colChkInfo.mass); + leftMass = leftActor->colChkInfo.mass; + rightMass = rightActor->colChkInfo.mass; + totalMass = leftMass + rightMass; + + if (IS_ZERO(totalMass)) { + leftMass = rightMass = 1.0f; + totalMass = 2.0f; + } + xDelta = rightPos->x - leftPos->x; + zDelta = rightPos->z - leftPos->z; + + xzDist = sqrtf(SQ(xDelta) + SQ(zDelta)); + + if (rightMassType == MASSTYPE_IMMOVABLE) { + if (leftMassType == MASSTYPE_IMMOVABLE) { + return; + } else { + leftDispRatio = 0; + rightDispRatio = 1; + } + } else if (rightMassType == MASSTYPE_HEAVY) { + if (leftMassType == MASSTYPE_IMMOVABLE) { + leftDispRatio = 1; + rightDispRatio = 0; + } else if (leftMassType == MASSTYPE_HEAVY) { + leftDispRatio = 0.5f; + rightDispRatio = 0.5f; + } else { + leftDispRatio = 0; + rightDispRatio = 1; + } + } else { + if (leftMassType == MASSTYPE_NORMAL) { + inverseTotalMass = 1.0f / totalMass; + leftDispRatio = rightMass * inverseTotalMass; + rightDispRatio = leftMass * inverseTotalMass; + } else { + leftDispRatio = 1; + rightDispRatio = 0; + } + } + + if (!IS_ZERO(xzDist)) { + xDelta *= overlap / xzDist; + zDelta *= overlap / xzDist; + leftActor->colChkInfo.displacement.x += -xDelta * leftDispRatio; + leftActor->colChkInfo.displacement.z += -zDelta * leftDispRatio; + rightActor->colChkInfo.displacement.x += xDelta * rightDispRatio; + rightActor->colChkInfo.displacement.z += zDelta * rightDispRatio; + } else if (overlap != 0.0f) { + leftActor->colChkInfo.displacement.x += -overlap * leftDispRatio; + rightActor->colChkInfo.displacement.x += overlap * rightDispRatio; + } else { + leftActor->colChkInfo.displacement.x += -leftDispRatio; + rightActor->colChkInfo.displacement.x += rightDispRatio; + } +} + +/** + * OC overlap check for two JntSphs + */ +void CollisionCheck_OC_JntSphVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r) { + ColliderJntSph* left = (ColliderJntSph*)l; + ColliderJntSph* right = (ColliderJntSph*)r; + ColliderJntSphElement* leftElem; + ColliderJntSphElement* rightElem; + f32 overlap; + + if (left->count > 0 && left->elements != NULL && right->count > 0 && right->elements != NULL && + (left->base.ocFlags1 & OCELEM_ON) && (right->base.ocFlags1 & OCELEM_ON)) { + + for (leftElem = left->elements; leftElem < &left->elements[left->count]; leftElem++) { + if (!(leftElem->info.ocElemFlags & OCELEM_ON)) { + continue; + } + for (rightElem = right->elements; rightElem < &right->elements[right->count]; rightElem++) { + if (!(rightElem->info.ocElemFlags & OCELEM_ON)) { + continue; + } + if (Math3D_ColSphereSphereIntersect(&leftElem->dim.worldSphere, &rightElem->dim.worldSphere, + &overlap) != 0) { + Vec3f leftPos; + Vec3f rightPos; + + Math_Vec3s_ToVec3f(&leftPos, &leftElem->dim.worldSphere.center); + Math_Vec3s_ToVec3f(&rightPos, &rightElem->dim.worldSphere.center); + CollisionCheck_SetOCvsOC(ctxt, &left->base, &leftElem->info, &leftPos, &right->base, + &rightElem->info, &rightPos, overlap); + } + } + } + } +} + +/** + * OC overlap check for a JntSph and Cylinder + */ +void CollisionCheck_OC_JntSphVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r) { + ColliderJntSph* left = (ColliderJntSph*)l; + ColliderCylinder* right = (ColliderCylinder*)r; + ColliderJntSphElement* leftElem; + f32 overlap; + + if (left->count > 0 && left->elements != NULL && (left->base.ocFlags1 & OCELEM_ON) && + (right->base.ocFlags1 & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) { + + for (leftElem = left->elements; leftElem < &left->elements[left->count]; leftElem++) { + if (!(leftElem->info.ocElemFlags & OCELEM_ON)) { + continue; + } + if (Math3D_ColSphereCylinderDistance(&leftElem->dim.worldSphere, &right->dim, &overlap) != 0) { + Vec3f leftPos; + Vec3f rightPos; + + Math_Vec3s_ToVec3f(&leftPos, &leftElem->dim.worldSphere.center); + Math_Vec3s_ToVec3f(&rightPos, &right->dim.pos); + CollisionCheck_SetOCvsOC(ctxt, &left->base, &leftElem->info, &leftPos, &right->base, &right->info, + &rightPos, overlap); + } + } + } +} + +/** + * OC overlap check for a JntSph and Sphere + */ +void CollisionCheck_OC_JntSphVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r) { + ColliderJntSph* left = (ColliderJntSph*)l; + ColliderSphere* right = (ColliderSphere*)r; + ColliderJntSphElement* leftElem; + f32 overlap; + + if (left->count > 0 && left->elements != NULL && (left->base.ocFlags1 & OCELEM_ON) && + (right->base.ocFlags1 & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) { + + for (leftElem = left->elements; leftElem < &left->elements[left->count]; leftElem++) { + if (!(leftElem->info.ocElemFlags & OCELEM_ON)) { + continue; + } + if (Math3D_ColSphereSphereIntersect(&leftElem->dim.worldSphere, &right->dim.worldSphere, &overlap) != 0) { + Vec3f leftPos; + Vec3f rightPos; + + Math_Vec3s_ToVec3f(&leftPos, &leftElem->dim.worldSphere.center); + Math_Vec3s_ToVec3f(&rightPos, &right->dim.worldSphere.center); + CollisionCheck_SetOCvsOC(ctxt, &left->base, &leftElem->info, &leftPos, &right->base, &right->info, + &rightPos, overlap); + } + } + } +} + +/** + * OC overlap check for a Cylinder and JntSph + */ +void CollisionCheck_OC_CylVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r) { + CollisionCheck_OC_JntSphVsCyl(ctxt, colCtxt, r, l); +} + +/** + * OC overlap check for two Cylinders + */ +void CollisionCheck_OC_CylVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r) { + ColliderCylinder* left = (ColliderCylinder*)l; + ColliderCylinder* right = (ColliderCylinder*)r; + f32 overlap; + + if ((left->base.ocFlags1 & OCELEM_ON) && (right->base.ocFlags1 & OCELEM_ON) && + (left->info.ocElemFlags & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) { + if (Math3D_ColCylinderCylinderAmount(&left->dim, &right->dim, &overlap) != 0) { + Vec3f leftPos; + Vec3f rightPos; + + Math_Vec3s_ToVec3f(&leftPos, &left->dim.pos); + Math_Vec3s_ToVec3f(&rightPos, &right->dim.pos); + CollisionCheck_SetOCvsOC(ctxt, &left->base, &left->info, &leftPos, &right->base, &right->info, &rightPos, + overlap); + } + } +} + +/** + * OC overlap check for a Cylinder and Sphere + */ +void CollisionCheck_OC_CylVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r) { + ColliderCylinder* left = (ColliderCylinder*)l; + ColliderSphere* right = (ColliderSphere*)r; + f32 overlap; + + if ((left->base.ocFlags1 & OCELEM_ON) && (left->info.ocElemFlags & OCELEM_ON) && + (right->base.ocFlags1 & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) { + if (Math3D_ColSphereCylinderDistance(&right->dim.worldSphere, &left->dim, &overlap) != 0) { + Vec3f leftPos; + Vec3f rightPos; + + Math_Vec3s_ToVec3f(&leftPos, &left->dim.pos); + Math_Vec3s_ToVec3f(&rightPos, &right->dim.worldSphere.center); + CollisionCheck_SetOCvsOC(ctxt, &left->base, &left->info, &leftPos, &right->base, &right->info, &rightPos, + overlap); + } + } +} + +/** + * OC overlap check for a Sphere and JntSph + */ +void CollisionCheck_OC_SphereVsJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r) { + CollisionCheck_OC_JntSphVsSphere(ctxt, colCtxt, r, l); +} + +/** + * OC overlap check for a Sphere and Cylinder + */ +void CollisionCheck_OC_SphereVsCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r) { + CollisionCheck_OC_CylVsSphere(ctxt, colCtxt, r, l); +} + +/** + * OC overlap check for two Spheres + */ +void CollisionCheck_OC_SphereVsSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* l, Collider* r) { + ColliderSphere* left = (ColliderSphere*)l; + ColliderSphere* right = (ColliderSphere*)r; + f32 overlap; + + if ((left->base.ocFlags1 & OCELEM_ON) && (left->info.ocElemFlags & OCELEM_ON) && + (right->base.ocFlags1 & OCELEM_ON) && (right->info.ocElemFlags & OCELEM_ON)) { + if (Math3D_ColSphereSphereIntersect(&left->dim.worldSphere, &right->dim.worldSphere, &overlap) != 0) { + Vec3f leftPos; + Vec3f rightPos; + + Math_Vec3s_ToVec3f(&leftPos, &left->dim.worldSphere.center); + Math_Vec3s_ToVec3f(&rightPos, &right->dim.worldSphere.center); + CollisionCheck_SetOCvsOC(ctxt, &left->base, &left->info, &leftPos, &right->base, &right->info, &rightPos, + overlap); + } + } +} + +/** + * Skip any OC colliders that are off + */ +s32 CollisionCheck_SkipOC(Collider* collider) { + if (!(collider->ocFlags1 & OCELEM_ON)) { + return 1; + } + return 0; +} + +/** + * Checks for OC compatibility. There are three conditions: + * First, each collider must have an OC flag corresponding to the other's OC type. + * Second, OC2_UNK1 and OC2_UNK2 can't collide with each other (has something to do with horses?) + * Third, the colliders can't collide if they belong to the same actor + */ +s32 CollisionCheck_Incompatible(Collider* left, Collider* right) { + if (!(left->ocFlags1 & right->ocFlags2 & OC1_TYPE_ALL) || !(left->ocFlags2 & right->ocFlags1 & OC1_TYPE_ALL) || + ((left->ocFlags2 & OC2_UNK1) && (right->ocFlags2 & OC2_UNK2)) || + ((right->ocFlags2 & OC2_UNK1) && (left->ocFlags2 & OC2_UNK2))) { + return 1; + } + if (left->actor == right->actor) { + return 1; + } + return 0; +} + +ColChkVsFunc sOCVsFuncs[COLSHAPE_MAX][COLSHAPE_MAX] = { + { CollisionCheck_OC_JntSphVsJntSph, CollisionCheck_OC_JntSphVsCyl, NULL, NULL, CollisionCheck_OC_JntSphVsSphere }, + { CollisionCheck_OC_CylVsJntSph, CollisionCheck_OC_CylVsCyl, NULL, NULL, CollisionCheck_OC_CylVsSphere }, + { NULL, NULL, NULL, NULL, NULL }, + { NULL, NULL, NULL, NULL, NULL }, + { CollisionCheck_OC_SphereVsJntSph, CollisionCheck_OC_SphereVsCyl, NULL, NULL, CollisionCheck_OC_SphereVsSphere }, +}; + +/** + * Iterates through all OC colliders and collides them with all subsequent OC colliders on the list. During an OC + * collision, colliders with overlapping elements move away from each other so that their elements no longer overlap. + * The relative amount each collider is pushed is determined by the collider's mass. Only JntSph, Cylinder and Sphere + * colliders can collide, and each collider must have the OC flag corresponding to the other's OC type. Additionally, + * OC2_UNK1 cannot collide with OC2_UNK2, nor can two colliders that share an actor. + */ +void CollisionCheck_OC(GlobalContext* ctxt, CollisionCheckContext* colCtxt) { + Collider** left; + Collider** right; + ColChkVsFunc vsFunc; + + for (left = colCtxt->colOC; left < colCtxt->colOC + colCtxt->colOCCount; left++) { + if (*left == NULL || CollisionCheck_SkipOC(*left)) { + continue; + } + for (right = left + 1; right < colCtxt->colOC + colCtxt->colOCCount; right++) { + if (*right == NULL || CollisionCheck_SkipOC(*right) || CollisionCheck_Incompatible(*left, *right)) { + continue; + } + vsFunc = sOCVsFuncs[(*left)->shape][(*right)->shape]; + if (vsFunc == NULL) { + continue; + } + vsFunc(ctxt, colCtxt, *left, *right); + } + } +} + +/** + * Initializes CollisionCheckInfo to default values + */ +void CollisionCheck_InitInfo(CollisionCheckInfo* info) { + static CollisionCheckInfo defaultColChkInfo = { + NULL, { 0.0f, 0.0f, 0.0f }, 10, 10, 0, MASS_IMMOVABLE, 8, 0, 0, 0, 0, + }; + + *info = defaultColChkInfo; +} + +/** + * Resets ColisionCheckInfo fields other than DamageTable, mass, and dim. + */ +void CollisionCheck_ResetDamage(CollisionCheckInfo* info) { + info->damage = 0; + info->damageEffect = 0; + info->atHitEffect = 0; + info->acHitEffect = 0; + info->displacement.x = info->displacement.y = info->displacement.z = 0.0f; +} + +/** + * Sets up CollisionCheckInfo using the values in init. Does not set a damage table or the unused unk_14. + */ +void CollisionCheck_SetInfoNoDamageTable(CollisionCheckInfo* info, CollisionCheckInfoInit* init) { + info->health = init->health; + info->cylRadius = init->cylRadius; + info->cylHeight = init->cylHeight; + info->mass = init->mass; +} + +/** + * Sets up CollisionCheckInfo using the values in init. Does not set the unused unk_14 + */ +void CollisionCheck_SetInfo(CollisionCheckInfo* info, DamageTable* damageTable, CollisionCheckInfoInit* init) { + info->health = init->health; + info->damageTable = damageTable; + info->cylRadius = init->cylRadius; + info->cylHeight = init->cylHeight; + info->mass = init->mass; +} + +/** + * Sets up CollisionCheckInfo using the values in init. Sets the unused unk_14 + */ +void CollisionCheck_SetInfo2(CollisionCheckInfo* info, DamageTable* damageTable, CollisionCheckInfoInit2* init) { + info->health = init->health; + info->damageTable = damageTable; + info->cylRadius = init->cylRadius; + info->cylHeight = init->cylHeight; + info->cylYShift = init->cylYShift; + info->mass = init->mass; +} + +/** + * Sets up CollisionCheckInfo using the values in Init and a preset damage table. Sets the unused unk_14. + */ +void CollisionCheck_SetInfoGetDamageTable(CollisionCheckInfo* info, s32 index, CollisionCheckInfoInit2* init) { + CollisionCheck_SetInfo2(info, DamageTable_Get(index), init); +} + +/** + * Apply AC damage effect + */ +void CollisionCheck_ApplyDamage(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider, + ColliderInfo* info) { + f32 damage; + f32 finalDamage = 0.0f; + s32 pad; + Collider* at; + ColliderInfo* atInfo; + s32 pad1; + u32 effect; + + if ((collider->actor == NULL) || !(collider->acFlags & AC_HIT)) { + return; + } + if (!(info->bumperFlags & BUMP_HIT) || (info->bumperFlags & BUMP_NO_DAMAGE)) { + return; + } + + at = info->acHit; + atInfo = info->acHitInfo; + + if (at != NULL && atInfo != NULL && collider != NULL && info != NULL) { + damage = CollisionCheck_GetDamageAndEffectOnBumper(at, atInfo, collider, info, &effect); + + if (CollisionCheck_GetToucherDamage(at, atInfo, collider, info) != 0) { + if (damage < 1.0f) { + finalDamage = 0.0f; + if (effect == 0) { + return; + } + } else { + finalDamage = CollisionCheck_ApplyBumperDefense(damage, info); + if (finalDamage < 1.0f && effect == 0) { + return; + } + } + } + if (collider->actor->colChkInfo.damageTable != NULL) { + collider->actor->colChkInfo.damageEffect = effect; + } + if (!(collider->acFlags & AC_HARD) || + ((collider->acFlags & AC_HARD) && atInfo->toucher.dmgFlags == 0x20000000)) { + if (collider->actor->colChkInfo.damage < finalDamage) { + collider->actor->colChkInfo.damage = finalDamage; + } + } + } +} + +/** + * Apply ColliderJntSph AC damage effect + */ +void CollisionCheck_ApplyDamageJntSph(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + ColliderJntSph* jntSph = (ColliderJntSph*)collider; + s32 i; + + if (jntSph->count > 0 && jntSph->elements != NULL) { + for (i = 0; i < jntSph->count; i++) { + CollisionCheck_ApplyDamage(ctxt, colCtxt, &jntSph->base, &jntSph->elements[i].info); + } + } +} + +/** + * Apply ColliderCylinder AC damage effect + */ +void CollisionCheck_ApplyDamageCyl(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + ColliderCylinder* cylinder = (ColliderCylinder*)collider; + + CollisionCheck_ApplyDamage(ctxt, colCtxt, &cylinder->base, &cylinder->info); +} + +/** + * Apply ColliderTris AC damage effect + */ +void CollisionCheck_ApplyDamageTris(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + ColliderTris* tris = (ColliderTris*)collider; + s32 i; + + // unlike sphere groups above, tri groups are not guarded against + // tris->elements being NULL + for (i = 0; i < tris->count; i++) { + CollisionCheck_ApplyDamage(ctxt, colCtxt, &tris->base, &tris->elements[i].info); + } +} + +/** + * Apply ColliderQuad AC damage effect + */ +void CollisionCheck_ApplyDamageQuad(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + ColliderQuad* quad = (ColliderQuad*)collider; + + CollisionCheck_ApplyDamage(ctxt, colCtxt, &quad->base, &quad->info); +} + +/** + * Apply ColliderSphere AC damage effect + */ +void CollisionCheck_ApplyDamageSphere(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Collider* collider) { + ColliderSphere* sphere = (ColliderSphere*)collider; + + CollisionCheck_ApplyDamage(ctxt, colCtxt, &sphere->base, &sphere->info); +} + +ColChkApplyFunc sApplyDamageFuncs[] = { + CollisionCheck_ApplyDamageJntSph, CollisionCheck_ApplyDamageCyl, CollisionCheck_ApplyDamageTris, + CollisionCheck_ApplyDamageQuad, CollisionCheck_ApplyDamageSphere, +}; + +/** + * For all AC colliders, sets any damage effects from collisions with AT colliders to their corresponding actor's + * CollisionCheckInfo. + */ +void CollisionCheck_Damage(GlobalContext* ctxt, CollisionCheckContext* colCtxt) { + s32 i; + + for (i = 0; i < colCtxt->colACCount; i++) { + Collider* col = colCtxt->colAC[i]; + + if (col == NULL) { + continue; + } + if (col->acFlags & AC_NO_DAMAGE) { + continue; + } + sApplyDamageFuncs[col->shape](ctxt, colCtxt, col); + } +} + +/** + * Checks if the line segment ab intersects any of the ColliderJntSph's elements + */ +s32 CollisionCheck_LineOC_JntSph(GlobalContext* globalCtx, CollisionCheckContext* colChkCtx, Collider* collider, + Vec3f* a, Vec3f* b) { + ColliderJntSph* jntSph = (ColliderJntSph*)collider; + s32 i; + + for (i = 0; i < jntSph->count; i++) { + ColliderJntSphElement* element = &jntSph->elements[i]; + + if (!(element->info.ocElemFlags & OCELEM_ON)) { + continue; + } + + D_801EDEB0.a = *a; + D_801EDEB0.b = *b; + if (Math3D_ColSphereLineSeg(&element->dim.worldSphere, &D_801EDEB0) != 0) { + return 1; + } + } + return 0; +} + +/** + * Checks if the line segment ab intersects the ColliderCylinder + */ +s32 CollisionCheck_LineOC_Cyl(GlobalContext* globalCtx, CollisionCheckContext* colChkCtx, Collider* collider, Vec3f* a, + Vec3f* b) { + ColliderCylinder* cylinder = (ColliderCylinder*)collider; + + if (!(cylinder->info.ocElemFlags & OCELEM_ON)) { + return 0; + } + + if (func_8017E350(&cylinder->dim, a, b, &D_801EDF38, &D_801EDF48) != 0) { + return 1; + } + + return 0; +} + +/** + * Checks if the line segment ab intersects the ColliderSphere + */ +s32 CollisionCheck_LineOC_Sphere(GlobalContext* globalCtx, CollisionCheckContext* colChkCtx, Collider* collider, + Vec3f* a, Vec3f* b) { + ColliderSphere* sphere = (ColliderSphere*)collider; + + if (!(sphere->info.ocElemFlags & OCELEM_ON)) { + return 0; + } + + D_801EDFC8.a = *a; + D_801EDFC8.b = *b; + if (Math3D_ColSphereLineSeg(&sphere->dim.worldSphere, &D_801EDFC8) != 0) { + return 1; + } + + return 0; +} + +ColChkLineFunc sOCLineCheckFuncs[] = { + CollisionCheck_LineOC_JntSph, CollisionCheck_LineOC_Cyl, NULL, NULL, CollisionCheck_LineOC_Sphere, +}; + +/** + * Checks if the line segment ab intersects any OC colliders, excluding those attached to actors + * on the exclusion list. Returns true if there are any intersections and false otherwise. + */ +s32 CollisionCheck_LineOC(GlobalContext* globalCtx, CollisionCheckContext* colChkCtx, Vec3f* a, Vec3f* b, + Actor** exclusions, s32 numExclusions) { + ColChkLineFunc lineCheck; + Collider** col; + s32 i; + s32 exclude; + s32 result = 0; + + for (col = colChkCtx->colOC; col < &colChkCtx->colOC[colChkCtx->colOCCount]; col++) { + if (CollisionCheck_SkipOC(*col)) { + continue; + } + + exclude = 0; + for (i = 0; i < numExclusions; i++) { + if ((*col)->actor == exclusions[i]) { + exclude = 1; + break; + } + } + if (exclude) { + continue; + } + + lineCheck = sOCLineCheckFuncs[(*col)->shape]; + if (lineCheck == NULL) { + continue; + } + + result = lineCheck(globalCtx, colChkCtx, (*col), a, b); + if (result) { + break; + } + } + return result; +} + +/** + * Checks if the line segment ab intersects any OC colliders. Returns true if there are any intersections and false + * otherwise. + */ +s32 CollisionCheck_LineOCCheckAll(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Vec3f* a, Vec3f* b) { + return CollisionCheck_LineOC(ctxt, colCtxt, a, b, NULL, 0); +} + +/** + * Checks if the line segment ab intersects any OC colliders, excluding those attached to actors on the exclusion list. + * Returns true if there are any intersections and false otherwise. + */ +s32 CollisionCheck_LineOCCheck(GlobalContext* ctxt, CollisionCheckContext* colCtxt, Vec3f* a, Vec3f* b, + Actor** exclusions, s32 numExclusions) { + return CollisionCheck_LineOC(ctxt, colCtxt, a, b, exclusions, numExclusions); +} + +/** + * Moves the ColliderCylinder's position to the actor's position + */ +void Collider_UpdateCylinder(Actor* actor, ColliderCylinder* collider) { + collider->dim.pos.x = actor->world.pos.x; + collider->dim.pos.y = actor->world.pos.y; + collider->dim.pos.z = actor->world.pos.z; +} + +/** + * Sets the ColliderCylinder's position + */ +void Collider_SetCylinderPosition(ColliderCylinder* collider, Vec3s* pos) { + collider->dim.pos.x = pos->x; + collider->dim.pos.y = pos->y; + collider->dim.pos.z = pos->z; +} + +/** + * Sets the ColliderQuad's vertices + */ +void Collider_SetQuadVertices(ColliderQuad* collider, Vec3f* a, Vec3f* b, Vec3f* c, Vec3f* d) { + Math_Vec3f_Copy(&collider->dim.quad[2], c); + Math_Vec3f_Copy(&collider->dim.quad[3], d); + Math_Vec3f_Copy(&collider->dim.quad[0], a); + Math_Vec3f_Copy(&collider->dim.quad[1], b); + Collider_SetQuadMidpoints(&collider->dim); +} + +/** + * Sets the specified ColliderTrisElement's vertices + */ +void Collider_SetTrisVertices(ColliderTris* collider, s32 index, Vec3f* a, Vec3f* b, Vec3f* c) { + ColliderTrisElement* element = &collider->elements[index]; + f32 nx; + f32 ny; + f32 nz; + f32 originDist; + + Math_Vec3f_Copy(&element->dim.vtx[0], a); + Math_Vec3f_Copy(&element->dim.vtx[1], b); + Math_Vec3f_Copy(&element->dim.vtx[2], c); + Math3D_UnitNormalVector(a, b, c, &nx, &ny, &nz, &originDist); + element->dim.plane.normal.x = nx; + element->dim.plane.normal.y = ny; + element->dim.plane.normal.z = nz; + element->dim.plane.originDist = originDist; +} + +/** + * Sets the specified ColliderTrisElement's dim using the values in src + */ +void Collider_SetTrisDim(GlobalContext* ctxt, ColliderTris* collider, s32 index, ColliderTrisElementDimInit* init) { + ColliderTrisElement* element = &collider->elements[index]; + + Collider_SetTrisElementDim(ctxt, &element->dim, init); +} + +/** + * Updates the world spheres for all of the collider's JntSph elements attached to the specified limb + */ +#ifdef NON_MATCHING +// needs in-function static bss +void Collider_UpdateSpheres(s32 limb, ColliderJntSph* collider) { + static Vec3f D_801EE1C0; + static Vec3f D_801EE1D0; + s32 i; + + for (i = 0; i < collider->count; i++) { + if (limb == collider->elements[i].dim.limb) { + D_801EE1C0.x = collider->elements[i].dim.modelSphere.center.x; + D_801EE1C0.y = collider->elements[i].dim.modelSphere.center.y; + D_801EE1C0.z = collider->elements[i].dim.modelSphere.center.z; + SysMatrix_MultiplyVector3fByState(&D_801EE1C0, &D_801EE1D0); + collider->elements[i].dim.worldSphere.center.x = D_801EE1D0.x; + collider->elements[i].dim.worldSphere.center.y = D_801EE1D0.y; + collider->elements[i].dim.worldSphere.center.z = D_801EE1D0.z; + collider->elements[i].dim.worldSphere.radius = + collider->elements[i].dim.modelSphere.radius * collider->elements[i].dim.scale; + } + } +} +#else +#pragma GLOBAL_ASM("./asm/non_matchings/code/z_collision_check/Collider_UpdateSpheres.asm") +#endif + +/** + * Updates the world spheres for the specified ColliderJntSph element + */ +void Collider_UpdateSpheresElement(ColliderJntSph* collider, s32 index, Actor* actor) { + if (index < collider->count) { + collider->elements[index].dim.worldSphere.center.x = + collider->elements[index].dim.modelSphere.center.x + actor->world.pos.x; + collider->elements[index].dim.worldSphere.center.y = + collider->elements[index].dim.modelSphere.center.y + actor->world.pos.y; + collider->elements[index].dim.worldSphere.center.z = + collider->elements[index].dim.modelSphere.center.z + actor->world.pos.z; + collider->elements[index].dim.worldSphere.radius = + collider->elements[index].dim.modelSphere.radius * collider->elements[index].dim.scale; + } +} + +/** + * Updates the world sphere for the ColliderSphere if it is attached to the specified limb + */ +#ifdef NON_MATCHING +// needs in-function static bss +void Collider_UpdateSphere(s32 limb, ColliderSphere* collider) { + static Vec3f D_801EE1E0; + static Vec3f D_801EE1F0; + + if (limb == collider->dim.limb) { + D_801EE1E0.x = collider->dim.modelSphere.center.x; + D_801EE1E0.y = collider->dim.modelSphere.center.y; + D_801EE1E0.z = collider->dim.modelSphere.center.z; + SysMatrix_MultiplyVector3fByState(&D_801EE1E0, &D_801EE1F0); + collider->dim.worldSphere.center.x = D_801EE1F0.x; + collider->dim.worldSphere.center.y = D_801EE1F0.y; + collider->dim.worldSphere.center.z = D_801EE1F0.z; + collider->dim.worldSphere.radius = collider->dim.modelSphere.radius * collider->dim.scale; + } +} +#else +#pragma GLOBAL_ASM("./asm/non_matchings/code/z_collision_check/Collider_UpdateSphere.asm") +#endif + +/** + * Spawns red blood droplets. + * No actor has a collision type that spawns red blood. + */ +#ifdef NON_MATCHING +// needs in-function static bss +void CollisionCheck_SpawnRedBlood(GlobalContext* ctxt, Vec3f* v) { + static EffSparkParams D_801EE200; + s32 effectIndex; + + D_801EE200.position.x = v->x; + D_801EE200.position.x = v->y; + D_801EE200.position.x = v->z; + D_801EE200.particleFactor1 = 5; + D_801EE200.particleFactor2 = 5; + D_801EE200.colorStart[0].red = 128; + D_801EE200.colorStart[0].green = 0; + D_801EE200.colorStart[0].blue = 64; + D_801EE200.colorStart[0].alpha = 255; + D_801EE200.colorStart[1].red = 128; + D_801EE200.colorStart[1].green = 0; + D_801EE200.colorStart[1].blue = 64; + D_801EE200.colorStart[1].alpha = 255; + D_801EE200.colorStart[2].red = 255; + D_801EE200.colorStart[2].green = 128; + D_801EE200.colorStart[2].blue = 0; + D_801EE200.colorStart[2].alpha = 255; + D_801EE200.colorStart[3].red = 255; + D_801EE200.colorStart[3].green = 128; + D_801EE200.colorStart[3].blue = 0; + D_801EE200.colorStart[3].alpha = 255; + D_801EE200.colorEnd[0].red = 64; + D_801EE200.colorEnd[0].green = 0; + D_801EE200.colorEnd[0].blue = 32; + D_801EE200.colorEnd[0].alpha = 0; + D_801EE200.colorEnd[1].red = 64; + D_801EE200.colorEnd[1].green = 0; + D_801EE200.colorEnd[1].blue = 32; + D_801EE200.colorEnd[1].alpha = 0; + D_801EE200.colorEnd[2].red = 128; + D_801EE200.colorEnd[2].green = 0; + D_801EE200.colorEnd[2].blue = 64; + D_801EE200.colorEnd[2].alpha = 0; + D_801EE200.colorEnd[3].red = 128; + D_801EE200.colorEnd[3].green = 0; + D_801EE200.colorEnd[3].blue = 64; + D_801EE200.colorEnd[3].alpha = 0; + D_801EE200.age = 0; + D_801EE200.duration = 16; + D_801EE200.velocity = 8.0f; + D_801EE200.gravity = -1.0f; + + Effect_Add(ctxt, &effectIndex, 0, 0, 1, &D_801EE200); +} +#else +#pragma GLOBAL_ASM("./asm/non_matchings/code/z_collision_check/CollisionCheck_SpawnRedBlood.asm") +#endif + +/** + * Spawns water droplets. + * No actor has a collision type that spawns water droplets. + */ +#ifdef NON_MATCHING +// needs in-function static bss +void CollisionCheck_SpawnWaterDroplets(GlobalContext* ctxt, Vec3f* v) { + static EffSparkParams D_801EE738; + s32 effectIndex; + + D_801EE738.position.x = v->x; + D_801EE738.position.x = v->y; + D_801EE738.position.x = v->z; + D_801EE738.particleFactor1 = 5; + D_801EE738.particleFactor2 = 5; + D_801EE738.colorStart[0].red = 255; + D_801EE738.colorStart[0].green = 255; + D_801EE738.colorStart[0].blue = 255; + D_801EE738.colorStart[0].alpha = 255; + D_801EE738.colorStart[1].red = 100; + D_801EE738.colorStart[1].green = 100; + D_801EE738.colorStart[1].blue = 100; + D_801EE738.colorStart[1].alpha = 100; + D_801EE738.colorStart[2].red = 100; + D_801EE738.colorStart[2].green = 100; + D_801EE738.colorStart[2].blue = 100; + D_801EE738.colorStart[2].alpha = 100; + D_801EE738.colorStart[3].red = 100; + D_801EE738.colorStart[3].green = 100; + D_801EE738.colorStart[3].blue = 100; + D_801EE738.colorStart[3].alpha = 100; + D_801EE738.colorEnd[0].red = 50; + D_801EE738.colorEnd[0].green = 50; + D_801EE738.colorEnd[0].blue = 50; + D_801EE738.colorEnd[0].alpha = 50; + D_801EE738.colorEnd[1].red = 50; + D_801EE738.colorEnd[1].green = 50; + D_801EE738.colorEnd[1].blue = 50; + D_801EE738.colorEnd[1].alpha = 50; + D_801EE738.colorEnd[2].red = 50; + D_801EE738.colorEnd[2].green = 50; + D_801EE738.colorEnd[2].blue = 50; + D_801EE738.colorEnd[2].alpha = 50; + D_801EE738.colorEnd[3].red = 0; + D_801EE738.colorEnd[3].green = 0; + D_801EE738.colorEnd[3].blue = 0; + D_801EE738.colorEnd[3].alpha = 0; + D_801EE738.age = 0; + D_801EE738.duration = 16; + D_801EE738.velocity = 8.0f; + D_801EE738.gravity = -1.0f; + + Effect_Add(ctxt, &effectIndex, 0, 0, 1, &D_801EE738); +} +#else +#pragma GLOBAL_ASM("./asm/non_matchings/code/z_collision_check/CollisionCheck_SpawnWaterDroplets.asm") +#endif + +/** + * Spawns streaks of light from hits against solid objects + */ +void CollisionCheck_SpawnShieldParticles(GlobalContext* ctxt, Vec3f* v) { + static EffShieldParticleInit shieldParticleInitMetal = { + 16, + { 0, 0, 0 }, + { 0, 200, 255, 255 }, + { 255, 255, 255, 255 }, + { 255, 255, 128, 255 }, + { 255, 255, 0, 255 }, + { 255, 64, 0, 200 }, + { 255, 0, 0, 255 }, + 2.1f, + 35.0f, + 30.0f, + 8, + { 0, 0, 0, 0, 128, 255, 0, 300 }, + 1, + }; + s32 effectIndex; + + shieldParticleInitMetal.position.x = v->x; + shieldParticleInitMetal.position.y = v->y; + shieldParticleInitMetal.position.z = v->z; + shieldParticleInitMetal.lightParams.posX = shieldParticleInitMetal.position.x; + shieldParticleInitMetal.lightParams.posY = shieldParticleInitMetal.position.y; + shieldParticleInitMetal.lightParams.posZ = shieldParticleInitMetal.position.z; + + Effect_Add(ctxt, &effectIndex, 3, 0, 1, &shieldParticleInitMetal); +} + +/** + * Spawns streaks of light and makes a metallic sound + */ +void CollisionCheck_SpawnShieldParticlesMetal(GlobalContext* ctxt, Vec3f* v) { + CollisionCheck_SpawnShieldParticles(ctxt, v); + play_sound(0x1808); +} + +/** + * Spawns streaks of light and makes a metallic sound at the specified position + */ +void CollisionCheck_SpawnShieldParticlesMetalSound(GlobalContext* ctxt, Vec3f* v, Vec3f* pos) { + CollisionCheck_SpawnShieldParticles(ctxt, v); + func_8019F1C0(pos, 0x1808); +} + +/** + * Spawns streaks of light and makes a metallic sound + */ +void CollisionCheck_SpawnShieldParticlesMetal2(GlobalContext* ctxt, Vec3f* v) { + CollisionCheck_SpawnShieldParticlesMetal(ctxt, v); +} + +/** + * Spawns streaks of light and makes a wooden sound + */ +void CollisionCheck_SpawnShieldParticlesWood(GlobalContext* ctxt, Vec3f* v, Vec3f* pos) { + static EffShieldParticleInit shieldParticleInitWood = { + 16, + { 0, 0, 0 }, + { 0, 200, 255, 255 }, + { 255, 255, 255, 255 }, + { 255, 255, 128, 255 }, + { 255, 255, 0, 255 }, + { 255, 64, 0, 200 }, + { 255, 0, 0, 255 }, + 2.1f, + 35.0f, + 30.0f, + 8, + { 0, 0, 0, 0, 128, 255, 0, 300 }, + 0, + }; + s32 effectIndex; + + shieldParticleInitWood.position.x = v->x; + shieldParticleInitWood.position.y = v->y; + shieldParticleInitWood.position.z = v->z; + shieldParticleInitWood.lightParams.posX = shieldParticleInitWood.position.x; + shieldParticleInitWood.lightParams.posY = shieldParticleInitWood.position.y; + shieldParticleInitWood.lightParams.posZ = shieldParticleInitWood.position.z; + + Effect_Add(ctxt, &effectIndex, 3, 0, 1, &shieldParticleInitWood); + func_8019F1C0(pos, 0x1837); +} + +/** + * Determines if the line segment connecting `itemPos` and `itemProjPos` intersects the side of a cylinder with the + * given `radius`, `height`, and `offset` at `actorPos`. Returns 3 if either endpoint is inside the cylinder, otherwise + * returns the number of points of intersection with the side of the cylinder. The locations of those points are put in + * `out1` and `out2`, with `out1` being closer to `itemPos`. Line segments that pass through both bases of the cylinder + * are not detected. + */ +s32 CollisionCheck_CylSideVsLineSeg(f32 radius, f32 height, f32 offset, Vec3f* actorPos, Vec3f* itemPos, + Vec3f* itemProjPos, Vec3f* out1, Vec3f* out2) { + Vec3f actorToItem; + Vec3f actorToItemProj; + Vec3f itemStep; + f32 frac1 = 0.0f; + f32 frac2 = 0.0f; + u32 intersect2; + u32 intersect1; + u32 test1; + u32 test2; + f32 radSqDiff; + f32 actorDotItemXZ; + f32 zero = 0.0f; + f32 closeDist; + s32 pad1; + s32 pad2; + + actorToItem.x = itemPos->x - actorPos->x; + actorToItem.y = itemPos->y - actorPos->y - offset; + actorToItem.z = itemPos->z - actorPos->z; + + actorToItemProj.x = itemProjPos->x - actorPos->x; + actorToItemProj.y = itemProjPos->y - actorPos->y - offset; + actorToItemProj.z = itemProjPos->z - actorPos->z; + + itemStep.x = actorToItemProj.x - actorToItem.x; + itemStep.y = actorToItemProj.y - actorToItem.y; + itemStep.z = actorToItemProj.z - actorToItem.z; + + if ((actorToItem.y > 0.0f) && (actorToItem.y < height) && (sqrtf(SQXZ(actorToItem)) < radius)) { + return 3; + } + + if ((actorToItemProj.y > 0.0f) && (actorToItemProj.y < height) && (sqrtf(SQXZ(actorToItemProj)) < radius)) { + return 3; + } + radSqDiff = SQXZ(actorToItem) - SQ(radius); + if (!IS_ZERO(SQXZ(itemStep))) { + actorDotItemXZ = DOTXZ(2.0f * itemStep, actorToItem); + if (SQ(actorDotItemXZ) < (4.0f * SQXZ(itemStep) * radSqDiff)) { + return 0; + } + if (SQ(actorDotItemXZ) - (4.0f * SQXZ(itemStep) * radSqDiff) > zero) { + intersect1 = intersect2 = 1; + } else { + intersect1 = 1; + intersect2 = 0; + } + closeDist = sqrtf(SQ(actorDotItemXZ) - (4.0f * SQXZ(itemStep) * radSqDiff)); + if (intersect1 != 0) { + frac1 = (closeDist - actorDotItemXZ) / (2.0f * SQXZ(itemStep)); + } + if (intersect2 != 0) { + frac2 = (-actorDotItemXZ - closeDist) / (2.0f * SQXZ(itemStep)); + } + } else if (!IS_ZERO(DOTXZ(2.0f * itemStep, actorToItem))) { + intersect1 = 1; + intersect2 = 0; + frac1 = -radSqDiff / DOTXZ(2.0f * itemStep, actorToItem); + } else { + if (radSqDiff <= 0.0f) { + test1 = (0.0f < actorToItem.y) && (actorToItem.y < height); + test2 = (0.0f < actorToItemProj.y) && (actorToItemProj.y < height); + + if (test1 && test2) { + *out1 = actorToItem; + *out2 = actorToItemProj; + return 2; + } + if (test1) { + *out1 = actorToItem; + return 1; + } + if (test2) { + *out1 = actorToItemProj; + return 1; + } + } + return 0; + } + + if (intersect2 == 0) { + if (frac1 < 0.0f || 1.0f < frac1) { + return 0; + } + } else { + test1 = (frac1 < 0.0f || 1.0f < frac1); + test2 = (frac2 < 0.0f || 1.0f < frac2); + + if (test1 && test2) { + return 0; + } + if (test1) { + intersect1 = 0; + } + if (test2) { + intersect2 = 0; + } + } + + if ((intersect1 != 0) && + ((frac1 * itemStep.y + actorToItem.y < 0.0f) || (height < frac1 * itemStep.y + actorToItem.y))) { + intersect1 = 0; + } + if ((intersect2 != 0) && + ((frac2 * itemStep.y + actorToItem.y < 0.0f) || (height < frac2 * itemStep.y + actorToItem.y))) { + intersect2 = 0; + } + if (intersect1 == 0 && intersect2 == 0) { + return 0; + } else if ((intersect1 != 0) && (intersect2 != 0)) { + out1->x = frac1 * itemStep.x + actorToItem.x + actorPos->x; + out1->y = frac1 * itemStep.y + actorToItem.y + actorPos->y; + out1->z = frac1 * itemStep.z + actorToItem.z + actorPos->z; + out2->x = frac2 * itemStep.x + actorToItem.x + actorPos->x; + out2->y = frac2 * itemStep.y + actorToItem.y + actorPos->y; + out2->z = frac2 * itemStep.z + actorToItem.z + actorPos->z; + return 2; + } else if (intersect1 != 0) { + out1->x = frac1 * itemStep.x + actorToItem.x + actorPos->x; + out1->y = frac1 * itemStep.y + actorToItem.y + actorPos->y; + out1->z = frac1 * itemStep.z + actorToItem.z + actorPos->z; + return 1; + } else if (intersect2 != 0) { + out1->x = frac2 * itemStep.x + actorToItem.x + actorPos->x; + out1->y = frac2 * itemStep.y + actorToItem.y + actorPos->y; + out1->z = frac2 * itemStep.z + actorToItem.z + actorPos->z; + return 1; + } + return 1; +} diff --git a/src/code/z_snap.c b/src/code/z_snap.c index ee015f2708..4e12136c7d 100644 --- a/src/code/z_snap.c +++ b/src/code/z_snap.c @@ -146,7 +146,7 @@ s32 func_8013A530(GlobalContext* globalCtx, Actor* actor, s32 flag, Vec3f* pos, actors[0] = actor; actors[1] = globalCtx->actorCtx.actorList[2].first; // TODO PLAYER macro - if (func_800E7DCC(globalCtx, &globalCtx->colCheckCtx, pos, &camera->eye, actors, 2) != 0) { + if (CollisionCheck_LineOCCheck(globalCtx, &globalCtx->colCheckCtx, pos, &camera->eye, actors, 2) != 0) { func_8013A41C(0x3b); ret |= 0x3b; } diff --git a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c index 8c382240ce..db60166dd8 100644 --- a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c +++ b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.c @@ -24,10 +24,24 @@ const ActorInit Arms_Hook_InitVars = { (ActorFunc)ArmsHook_Draw }; -ColQuadInit D_808C1BC0 = { - { 10, 0x09, 0x00, 0x00, 0x08, 3 }, - { 0x02, { 0x00000080, 0x00, 0x02 }, { 0xF7CFFFFF, 0x00, 0x00 }, 0x05, 0x00, 0x00 }, - { 0 }, +ColliderQuadInit D_808C1BC0 = { + { + COLTYPE_NONE, + AT_ON | AT_TYPE_PLAYER, + AC_NONE, + OC1_NONE, + OC2_TYPE_PLAYER, + COLSHAPE_QUAD, + }, + { + ELEMTYPE_UNK2, + { 0x00000080, 0x00, 0x02 }, + { 0xF7CFFFFF, 0x00, 0x00 }, + TOUCH_ON | TOUCH_NEAREST | TOUCH_SFX_NORMAL, + BUMP_NONE, + OCELEM_NONE, + }, + { { { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f } } }, }; Vec3f D_808C1C10 = { 0.0f, 0.0f, 0.0f }; @@ -47,8 +61,8 @@ void ArmsHook_SetupAction(ArmsHook* this, ArmsHookActionFunc actionFunc) { void ArmsHook_Init(Actor* thisx, GlobalContext* globalCtx) { ArmsHook* this = THIS; - Collision_InitQuadDefault(globalCtx, &this->collider); - Collision_InitQuadWithData(globalCtx, &this->collider, &this->actor, &D_808C1BC0); + Collider_InitQuad(globalCtx, &this->collider); + Collider_SetQuad(globalCtx, &this->collider, &this->actor, &D_808C1BC0); ArmsHook_SetupAction(this, ArmsHook_Wait); this->unk1E0 = this->actor.world.pos; } @@ -59,7 +73,7 @@ void ArmsHook_Destroy(Actor* thisx, GlobalContext* globalCtx) { if (this->grabbed != NULL) { this->grabbed->flags &= ~0x2000; } - Collision_FiniQuad(globalCtx, &this->collider); + Collider_DestroyQuad(globalCtx, &this->collider); } void ArmsHook_Wait(ArmsHook* this, GlobalContext* globalCtx) { @@ -125,10 +139,11 @@ void ArmsHook_Shoot(ArmsHook* this, GlobalContext* globalCtx) { func_800B8F98(&player->base, 0x100B); ArmsHook_CheckForCancel(this); - if (this->timer != 0 && (this->collider.base.flagsAT & 2) && (this->collider.body.unk20->unk14 != 4)) { - Actor* touchedActor = this->collider.base.collisionAT; + if (this->timer != 0 && (this->collider.base.atFlags & AT_HIT) && + (this->collider.info.atHitInfo->elemType != ELEMTYPE_UNK4)) { + Actor* touchedActor = this->collider.base.at; if ((touchedActor->update != NULL) && (touchedActor->flags & 0x600)) { - if (this->collider.body.unk20->unk16 & 4) { + if (this->collider.info.atHitInfo->bumperFlags & BUMP_HOOKABLE) { ArmsHook_AttachHookToActor(this, touchedActor); if ((touchedActor->flags & 0x400) == 0x400) { func_808C1154(this); @@ -170,8 +185,7 @@ void ArmsHook_Shoot(ArmsHook* this, GlobalContext* globalCtx) { { f32 velocity; - bodyDistDiff = - Math_Vec3f_DistXYZAndStoreDiff(&player->unk368, &this->actor.world.pos, &bodyDistDiffVec); + bodyDistDiff = Math_Vec3f_DistXYZAndStoreDiff(&player->unk368, &this->actor.world.pos, &bodyDistDiffVec); if (bodyDistDiff < 30.0f) { velocity = 0.0f; phi_f16 = 0.0f; @@ -244,15 +258,14 @@ void ArmsHook_Shoot(ArmsHook* this, GlobalContext* globalCtx) { if (func_800C9CEC(&globalCtx->colCtx, poly, bgId)) { { DynaPolyActor* dynaPolyActor; - if (bgId != 0x32 && - (dynaPolyActor = BgCheck_GetActorOfMesh(&globalCtx->colCtx, bgId)) != NULL) { + if (bgId != 0x32 && (dynaPolyActor = BgCheck_GetActorOfMesh(&globalCtx->colCtx, bgId)) != NULL) { ArmsHook_AttachHookToActor(this, &dynaPolyActor->actor); } } func_808C1154(this); func_8019F1C0(&this->actor.projectedPos, 0x1829); } else { - func_800E8668(globalCtx, &this->actor.world.pos); + CollisionCheck_SpawnShieldParticlesMetal(globalCtx, &this->actor.world.pos); func_8019F1C0(&this->actor.projectedPos, 0x1813); } } else { @@ -305,8 +318,8 @@ void ArmsHook_Draw(Actor* thisx, GlobalContext* globalCtx) { gSPMatrix(sp44->polyOpa.p++, SysMatrix_AppendStateToPolyOpaDisp(globalCtx->state.gfxCtx), G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW); gSPDisplayList(sp44->polyOpa.p++, D_0601D960); - SysMatrix_InsertTranslation(this->actor.world.pos.x, this->actor.world.pos.y, - this->actor.world.pos.z, MTXMODE_NEW); + SysMatrix_InsertTranslation(this->actor.world.pos.x, this->actor.world.pos.y, this->actor.world.pos.z, + MTXMODE_NEW); Math_Vec3f_Diff(&player->unk368, &this->actor.world.pos, &sp68); sp48 = SQ(sp68.x) + SQ(sp68.z); sp4C = sqrtf(sp48); diff --git a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h index 1a6fa04384..18431ee663 100644 --- a/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h +++ b/src/overlays/actors/ovl_Arms_Hook/z_arms_hook.h @@ -9,7 +9,7 @@ typedef void (*ArmsHookActionFunc)(struct ArmsHook*, GlobalContext*); typedef struct ArmsHook { /* 0x000 */ Actor actor; - /* 0x144 */ ColQuad collider; + /* 0x144 */ ColliderQuad collider; /* 0x1C4 */ s32 unk1C4; /* 0x1C8 */ char unk1C8[0x18]; /* 0x1E0 */ Vec3f unk1E0; diff --git a/src/overlays/actors/ovl_Bg_Ikana_Ray/z_bg_ikana_ray.c b/src/overlays/actors/ovl_Bg_Ikana_Ray/z_bg_ikana_ray.c index cb2fa982d9..03c1541cb3 100644 --- a/src/overlays/actors/ovl_Bg_Ikana_Ray/z_bg_ikana_ray.c +++ b/src/overlays/actors/ovl_Bg_Ikana_Ray/z_bg_ikana_ray.c @@ -26,30 +26,28 @@ const ActorInit Bg_Ikana_Ray_InitVars = { (ActorFunc)BgIkanaRay_Draw }; -// TODO better formatting -ColCylinderInit bgIkanaRayCylinderInit = { - { 10, 33, 0, 0, 0, 1 }, - { 0, { 0x00200000, 0, 0 }, { 0, 0, 0 }, 25, 0, 1 }, - { 90, 420, 65116} +ColliderCylinderInit bgIkanaRayCylinderInit = { + { COLTYPE_NONE, AT_ON | AT_TYPE_OTHER, AC_NONE, OC1_NONE, OC2_NONE, COLSHAPE_CYLINDER, }, + { ELEMTYPE_UNK0, { 0x00200000, 0x00, 0x00 }, { 0x00000000, 0x00, 0x00 }, TOUCH_ON | TOUCH_SFX_NONE, BUMP_NONE, OCELEM_ON, }, + { 90, 420, -420, { 0, 0, 0 } }, }; -// TODO macro -InitChainEntry bgIkanaRayCompInit[] = { - {1, 6, 0x0FC, 4000}, - {1, 6, 0x100, 1000}, - {1, 6, 0x104, 1000}, - {0, 9, 0x058, 100} +InitChainEntry bgIkanaRayCompInit[] = { + ICHAIN_F32(uncullZoneForward, 4000, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneScale, 1000, ICHAIN_CONTINUE), + ICHAIN_F32(uncullZoneDownward, 1000, ICHAIN_CONTINUE), + ICHAIN_VEC3F_DIV1000(scale, 100, ICHAIN_STOP), }; void BgIkanaRay_Init(Actor* thisx, GlobalContext* globalCtx) { - ColCylinder* collision = &THIS->collision; + ColliderCylinder* collision = &THIS->collision; u32 pad; Actor_ProcessInitChain(thisx, bgIkanaRayCompInit); - Collision_InitCylinderDefault(globalCtx, collision); - Collision_InitCylinderWithData(globalCtx, collision, thisx, &bgIkanaRayCylinderInit); - Collision_CylinderMoveToActor(thisx, &THIS->collision); + Collider_InitCylinder(globalCtx, collision); + Collider_SetCylinder(globalCtx, collision, thisx, &bgIkanaRayCylinderInit); + Collider_UpdateCylinder(thisx, &THIS->collision); THIS->animatedTextures = (AnimatedTexture*)Lib_PtrSegToVirt(object_ikana_obj_001228); @@ -61,8 +59,8 @@ void BgIkanaRay_Init(Actor* thisx, GlobalContext* globalCtx) { } void BgIkanaRay_Destroy(Actor* thisx, GlobalContext* globalCtx) { - ColCylinder* collision = &THIS->collision; - Collision_FiniCylinder(globalCtx, collision); + ColliderCylinder* collision = &THIS->collision; + Collider_DestroyCylinder(globalCtx, collision); } void BgIkanaRay_SetDeactivated(BgIkanaRay* this) { @@ -84,7 +82,7 @@ void BgIkanaRay_SetActivated(BgIkanaRay* this) { } void BgIkanaRay_UpdateActivated(BgIkanaRay* this, GlobalContext* globalCtx) { - Collision_AddAT(globalCtx, &globalCtx->colCheckCtx, &this->collision.base); + CollisionCheck_SetAT(globalCtx, &globalCtx->colCheckCtx, &this->collision.base); } void BgIkanaRay_Update(Actor* thisx, GlobalContext* globalCtx) { diff --git a/src/overlays/actors/ovl_Bg_Ikana_Ray/z_bg_ikana_ray.h b/src/overlays/actors/ovl_Bg_Ikana_Ray/z_bg_ikana_ray.h index cfb1687f4a..fd0a69b1d3 100644 --- a/src/overlays/actors/ovl_Bg_Ikana_Ray/z_bg_ikana_ray.h +++ b/src/overlays/actors/ovl_Bg_Ikana_Ray/z_bg_ikana_ray.h @@ -7,7 +7,7 @@ struct BgIkanaRay; typedef struct BgIkanaRay { /* 0x000 */ Actor base; - /* 0x144 */ ColCylinder collision; + /* 0x144 */ ColliderCylinder collision; /* 0x190 */ AnimatedTexture* animatedTextures; /* 0x194 */ void (*update)(struct BgIkanaRay*, GlobalContext*); } BgIkanaRay; // size = 0x198 diff --git a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c index 8b6de69fe6..cf24340198 100644 --- a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c +++ b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.c @@ -26,10 +26,9 @@ const ActorInit En_Nnh_InitVars = { (ActorFunc)EnNnh_Draw }; -ColCylinderInit D_80C08A00 = -{ - { 0x0D, 0x00, 0x09, 0x39, 0x10, 0x01 }, - { 0x01, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, 0x00, 0x01, 0x01 }, +ColliderCylinderInit D_80C08A00 = { + { COLTYPE_TREE, AT_NONE, AC_ON | AC_TYPE_PLAYER, OC1_ON | OC1_TYPE_ALL, OC2_TYPE_1, COLSHAPE_CYLINDER, }, + { ELEMTYPE_UNK1, { 0x00000000, 0x00, 0x00 }, { 0xF7CFFFFF, 0x00, 0x00 }, TOUCH_NONE | TOUCH_SFX_NORMAL, BUMP_ON, OCELEM_ON, }, { 20, 50, 0, { 0, 0, 0 } }, }; @@ -39,8 +38,8 @@ void EnNnh_Init(Actor *thisx, GlobalContext *globalCtx) { EnNnh* this = THIS; Actor_SetScale(&this->actor, 0.01f); - Collision_InitCylinderDefault(globalCtx, &this->collider); - Collision_InitCylinderWithData(globalCtx, &this->collider, &this->actor, &D_80C08A00); + Collider_InitCylinder(globalCtx, &this->collider); + Collider_SetCylinder(globalCtx, &this->collider, &this->actor, &D_80C08A00); this->actor.targetMode = 1; this->actor.focus.pos = this->actor.world.pos; this->actor.focus.pos.y += 30.0f; @@ -50,7 +49,7 @@ void EnNnh_Init(Actor *thisx, GlobalContext *globalCtx) { void EnNnh_Destroy(Actor *thisx, GlobalContext *globalCtx) { EnNnh* this = THIS; - Collision_FiniCylinder(globalCtx, &this->collider); + Collider_DestroyCylinder(globalCtx, &this->collider); } void func_80C08828(EnNnh* this) { @@ -81,8 +80,8 @@ void EnNnh_Update(Actor *thisx, GlobalContext *globalCtx) { s32 pad; this->actionFunc(this, globalCtx); - Collision_CylinderMoveToActor(&this->actor, &this->collider); - Collision_AddOT(globalCtx, &globalCtx->colCheckCtx, &this->collider.base); + Collider_UpdateCylinder(&this->actor, &this->collider); + CollisionCheck_SetOC(globalCtx, &globalCtx->colCheckCtx, &this->collider.base); } void EnNnh_Draw(Actor *thisx, GlobalContext *globalCtx) { diff --git a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.h b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.h index a019fe6c77..018890de8a 100644 --- a/src/overlays/actors/ovl_En_Nnh/z_en_nnh.h +++ b/src/overlays/actors/ovl_En_Nnh/z_en_nnh.h @@ -9,7 +9,7 @@ typedef void (*EnNnhActionFunc)(struct EnNnh*, GlobalContext*); typedef struct EnNnh { /* 0x000 */ Actor actor; - /* 0x144 */ ColCylinder collider; + /* 0x144 */ ColliderCylinder collider; /* 0x190 */ EnNnhActionFunc actionFunc; } EnNnh; // size = 0x194 diff --git a/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c b/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c index d5d69b893e..d8c9ddbabe 100644 --- a/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c +++ b/src/overlays/actors/ovl_En_Tanron6/z_en_tanron6.c @@ -24,14 +24,15 @@ const ActorInit En_Tanron6_InitVars = { (ActorFunc)EnTanron6_Draw }; -DamageTable D_80BE6170 = { 0xF0, 0xF0, 0x00, 0xF1, 0xE1, 0xE1, 0x00, 0xE1, 0xF0, 0xF0, 0xF0, - 0xE1, 0xE1, 0x46, 0xF0, 0xF0, 0xE1, 0xF0, 0xF0, 0x00, 0x00, 0xF0, - 0xE1, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0 }; +DamageTable D_80BE6170 = { + 0xF0, 0xF0, 0x00, 0xF1, 0xE1, 0xE1, 0x00, 0xE1, 0xF0, 0xF0, 0xF0, 0xE1, 0xE1, 0x46, 0xF0, 0xF0, + 0xE1, 0xF0, 0xF0, 0x00, 0x00, 0xF0, 0xE1, 0x00, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, +}; void EnTanron6_Init(Actor* thisx, GlobalContext* globalCtx) { EnTanron6* this = THIS; - this->actor.colChkInfo.mass = 0xA; + this->actor.colChkInfo.mass = 10; Actor_SetDrawParams(&this->actor.shape, 0, func_800B3FC0, 19.0f); this->actor.colChkInfo.health = 1; this->actor.colChkInfo.damageTable = &D_80BE6170; diff --git a/tables/functions.txt b/tables/functions.txt index 88f0332b74..9231e8f14e 100644 --- a/tables/functions.txt +++ b/tables/functions.txt @@ -924,7 +924,7 @@ 0x800C003C:("BgCheck_PolygonGetNormal",), 0x800C0094:("func_800C0094",), 0x800C01B8:("func_800C01B8",), - 0x800C0220:("BgCheck_CreateColTriParamsFromPolygon",), + 0x800C0220:("BgCheck_CreateTriNormFromPolygon",), 0x800C02C0:("func_800C02C0",), 0x800C0340:("func_800C0340",), 0x800C0474:("func_800C0474",), @@ -1307,217 +1307,217 @@ 0x800E0308:("func_800E0308",), 0x800E031C:("func_800E031C",), 0x800E0348:("func_800E0348",), - 0x800E03A0:("func_800E03A0",), - 0x800E03CC:("func_800E03CC",), - 0x800E0410:("Collision_GetDamageAndEffectOnBumper",), - 0x800E04BC:("func_800E04BC",), - 0x800E04EC:("Collision_GetToucherDamage",), - 0x800E0538:("Collision_InitCommonDefault",), - 0x800E0580:("Collision_FiniCommon",), - 0x800E0594:("func_800E0594",), - 0x800E05D4:("func_800E05D4",), - 0x800E0618:("Collision_InitCommonWithData",), - 0x800E065C:("Collision_ResetCommonForAT",), - 0x800E0678:("Collision_ResetCommonForAC",), - 0x800E0694:("Collision_ResetCommonForOT",), - 0x800E06BC:("Collision_InitTouchDefault",), - 0x800E06E4:("Collision_FiniTouch",), - 0x800E06F8:("Collision_InitTouchWithData",), - 0x800E0720:("Collision_nop800E0720",), - 0x800E0730:("Collision_InitBumpDefault",), - 0x800E0760:("Collision_FiniBump",), - 0x800E0774:("Collision_InitBumpWithData",), - 0x800E079C:("Collision_InitBodyDefault",), - 0x800E081C:("Collision_FiniBody",), - 0x800E085C:("Collision_InitBodyWithData",), - 0x800E08D4:("Collision_ResetBodyForAT",), - 0x800E090C:("Collision_ResetBodyForAC",), - 0x800E0944:("Collision_ResetBodyForOT",), - 0x800E095C:("Collision_InitSphereParamsDefault",), - 0x800E09A4:("Collision_FiniSphereParams",), - 0x800E09B8:("Collision_InitSphereParamsWithData",), - 0x800E0A10:("Collision_InitSphereGroupElemDefault",), - 0x800E0A50:("Collision_FiniSphereGroupElem",), - 0x800E0A90:("Collision_InitSphereGroupElemWithData",), - 0x800E0AE0:("Collision_ResetSphereGroupElemForAT",), - 0x800E0B04:("Collision_ResetSphereGroupElemForAC",), - 0x800E0B28:("Collision_ResetSphereGroupElemForOT",), - 0x800E0B4C:("Collision_InitSphereGroupDefault",), - 0x800E0B78:("func_800E0B78",), - 0x800E0C18:("Collision_FiniSphereGroup",), - 0x800E0CA8:("func_800E0CA8",), - 0x800E0D84:("func_800E0D84",), - 0x800E0E60:("Collision_InitSphereGroupWithData",), - 0x800E0F14:("Collision_InitSphereGroup",), - 0x800E0F68:("Collision_ResetSphereGroupForAT",), - 0x800E0FF4:("Collision_ResetSphereGroupForAC",), - 0x800E1080:("Collision_ResetSphereGroupForOT",), - 0x800E110C:("Collision_InitCylinderParamsDefault",), - 0x800E1148:("Collision_FiniCylinderParams",), - 0x800E115C:("Collision_InitCylinderParamsWithData",), - 0x800E119C:("Collision_InitCylinderDefault",), - 0x800E11EC:("Collision_FiniCylinder",), - 0x800E123C:("func_800E123C",), - 0x800E12A4:("func_800E12A4",), - 0x800E130C:("Collision_InitCylinderWithData",), - 0x800E1374:("Collision_InitCylinder",), - 0x800E13C0:("Collision_ResetCylinderForAT",), - 0x800E1400:("Collision_ResetCylinderForAC",), - 0x800E1440:("Collision_ReseCylinderForOT",), - 0x800E1480:("Collision_InitTriParamsDefault",), - 0x800E14CC:("Collision_FiniTriParams",), - 0x800E14E0:("Collision_InitTriParamsWithData",), - 0x800E1594:("Collision_InitTriDefault",), - 0x800E15D4:("Collision_FiniTri",), - 0x800E1614:("Collision_InitTriWithData",), - 0x800E1664:("Collision_ResetTriForAT",), - 0x800E1688:("Collision_ResetTriForAC",), - 0x800E16AC:("func_800E16AC",), - 0x800E16D0:("Collision_InitTriGroupDefault",), - 0x800E16FC:("func_800E16FC",), - 0x800E17B4:("Collision_FiniTriGroup",), - 0x800E1858:("func_800E1858",), - 0x800E1958:("Collision_InitTriGroupWithData",), - 0x800E1A24:("Collision_InitTriGroup",), - 0x800E1A78:("Collision_ResetTriGroupForAT",), - 0x800E1B18:("Collision_ResetTriGroupForAC",), - 0x800E1BB8:("Collision_ResetTriGroupForOT",), - 0x800E1C58:("Collision_InitQuadParamsDefault",), - 0x800E1CA4:("Collision_FiniQuadParams",), - 0x800E1CB8:("Collision_ResetQuadParamsForAT",), - 0x800E1CD4:("Collision_QuadCalcMidpoints",), - 0x800E1D90:("Collision_InitQuadParamsWithData",), - 0x800E1E18:("Collision_InitQuadDefault",), - 0x800E1E68:("Collision_FiniQuad",), - 0x800E1EB8:("func_800E1EB8",), - 0x800E1F20:("Collision_InitQuadWithData",), - 0x800E1F88:("Collision_InitQuad",), - 0x800E1FD4:("Collision_ResetQuadForAT",), - 0x800E2024:("Collision_ResetQuadForAC",), - 0x800E2064:("Collision_ResetQuadForOT",), - 0x800E20A4:("func_800E20A4",), - 0x800E2154:("Collision_InitSphereDefault",), - 0x800E21A4:("Collision_FiniSphere",), - 0x800E21F4:("Collision_InitSphereWithData",), - 0x800E225C:("Collision_InitSphere",), - 0x800E22A8:("Collision_ResetSphereForAT",), - 0x800E22E8:("Collision_ResetSphereForAC",), - 0x800E2328:("Collision_ResetSphereForOT",), - 0x800E2368:("func_800E2368",), - 0x800E23B0:("func_800E23B0",), - 0x800E23C4:("func_800E23C4",), - 0x800E2408:("func_800E2408",), - 0x800E2434:("func_800E2434",), - 0x800E2450:("Collision_Init",), - 0x800E2470:("Collision_Fini",), - 0x800E2480:("Collision_Reset",), - 0x800E2528:("Collision_EnableEditMode",), - 0x800E2540:("Collision_EnableAppendMode",), - 0x800E2558:("Collision_AddAT",), - 0x800E2634:("Collision_AddIndexAT",), - 0x800E2740:("Collision_AddAC",), - 0x800E281C:("collision_AddIndexAC",), - 0x800E2928:("Collision_AddOT",), - 0x800E2A04:("Collision_AddIndexOT",), - 0x800E2B10:("Collision_AddGroup4",), - 0x800E2B98:("Collision_CantBeToucherAC",), - 0x800E2BBC:("Collision_CantBeBumperAC",), - 0x800E2BE0:("Collision_ToucherIsExcluded",), - 0x800E2C08:("func_800E2C08",), - 0x800E2C1C:("func_800E2C1C",), - 0x800E2D88:("func_800E2D88",), - 0x800E2EF4:("func_800E2EF4",), - 0x800E2F30:("func_800E2F30",), - 0x800E2F54:("func_800E2F54",), - 0x800E2F78:("func_800E2F78",), - 0x800E30C8:("func_800E30C8",), - 0x800E3168:("func_800E3168",), - 0x800E3304:("func_800E3304",), - 0x800E3324:("Collision_HandleCollisionATWithAC",), - 0x800E35C8:("Collision_TriCalcAvgPoint",), - 0x800E362C:("collision_quad_cal_avg_point",), - 0x800E36AC:("Collision_SphereGroupWithSphereGroupAC",), - 0x800E38F8:("Collision_SphereGroupWithCylinderAC",), - 0x800E3B18:("Collision_SphereGroupWithTriGroupAC",), - 0x800E3CC0:("Collision_SphereGroupWithQuadAC",), - 0x800E3E6C:("Collision_SphereGroupWithSphereAC",), - 0x800E4058:("Collision_CylinderWithSphereGroupAC",), - 0x800E4298:("Collision_CylinderWithCylinderAC",), - 0x800E44C0:("Collision_CylinderWithTriGroupAC",), - 0x800E4628:("Collision_CylinderWithQuadAC",), - 0x800E47B8:("Collision_CylinderWithSphereAC",), - 0x800E494C:("Collision_TriGroupWithSphereGroupAC",), - 0x800E4B08:("Collision_TriGroupWithCylinderAC",), - 0x800E4C70:("Collision_TriGroupWithTriGroupAC",), - 0x800E4E24:("Collision_TriGroupWithQuad",), - 0x800E4FE4:("Collision_TriGroupWithSphereAC",), - 0x800E5154:("Collision_QuadWithSphereGroupAC",), - 0x800E531C:("Collision_QuadWithCylinderAC",), - 0x800E54DC:("Collision_QuadWithTriGroupAC",), - 0x800E56B8:("Collision_QuadWithQuadAC",), - 0x800E5874:("Collision_QuadWithSphereAC",), - 0x800E59A4:("Collision_SphereWithSphereGroupAC",), - 0x800E5B94:("Collision_SphereWithCylinderAC",), - 0x800E5D10:("Collision_SphereWithTriGroupAC",), - 0x800E5E54:("Collision_SphereWithQuadAC",), - 0x800E5F6C:("Collision_SphereWithSphereAC",), - 0x800E60C0:("func_800E60C0",), - 0x800E61A0:("func_800E61A0",), - 0x800E6238:("func_800E6238",), - 0x800E6320:("func_800E6320",), - 0x800E63B8:("func_800E63B8",), - 0x800E6450:("func_800E6450",), - 0x800E6524:("Collision_CollideWithAC",), - 0x800E6654:("Collision_DoATWithAC",), - 0x800E6724:("func_800E6724",), - 0x800E6760:("Collision_HandleCollisionOTWithOT",), - 0x800E6A9C:("Collision_SphereGroupWithSphereGroupOT",), - 0x800E6C84:("Collision_SphereGroupWithCylinderOT",), - 0x800E6DF4:("Collision_SphereGroupWithSphereOT",), - 0x800E6F64:("Collision_CylinderWithSphereGroupOT",), - 0x800E6F90:("Collision_CylinderWithCylinderOT",), - 0x800E7060:("Collision_CylinderWithSphereOT",), - 0x800E7130:("Collision_SphereWithSphereGroupOT",), - 0x800E715C:("Collision_SphereWithCylinderOT",), - 0x800E7188:("Collision_SphereWithSphereOT",), - 0x800E7264:("func_800E7264",), - 0x800E7288:("func_800E7288",), - 0x800E7308:("Collision_DoOTWithOT",), - 0x800E7494:("func_800E7494",), - 0x800E74DC:("func_800E74DC",), - 0x800E7508:("func_800E7508",), - 0x800E7530:("func_800E7530",), - 0x800E755C:("func_800E755C",), - 0x800E7590:("func_800E7590",), - 0x800E75C8:("func_800E75C8",), - 0x800E77EC:("func_800E77EC",), - 0x800E7894:("func_800E7894",), - 0x800E78B4:("func_800E78B4",), - 0x800E7948:("func_800E7948",), - 0x800E7968:("func_800E7968",), - 0x800E7988:("func_800E7988",), - 0x800E7A48:("func_800E7A48",), - 0x800E7B54:("func_800E7B54",), - 0x800E7BCC:("func_800E7BCC",), - 0x800E7C64:("func_800E7C64",), - 0x800E7DA8:("func_800E7DA8",), - 0x800E7DCC:("func_800E7DCC",), - 0x800E7DF8:("Collision_CylinderMoveToActor",), - 0x800E7E3C:("Collision_CylinderSetLoc",), - 0x800E7E5C:("Collision_QuadSetCoords",), - 0x800E7ECC:("Collision_TriGroupSetCoordsAtIndex",), - 0x800E7F8C:("Collision_InitTriParamsAtIndex",), - 0x800E7FDC:("func_800E7FDC",), - 0x800E8160:("func_800E8160",), - 0x800E823C:("func_800E823C",), - 0x800E8318:("func_800E8318",), - 0x800E8478:("func_800E8478",), - 0x800E85D4:("func_800E85D4",), - 0x800E8668:("func_800E8668",), - 0x800E8690:("func_800E8690",), - 0x800E86C0:("func_800E86C0",), - 0x800E86E0:("func_800E86E0",), - 0x800E8784:("func_800E8784",), + 0x800E03A0:("DamageTable_Get",), + 0x800E03CC:("DamageTable_Clear",), + 0x800E0410:("CollisionCheck_GetDamageAndEffectOnBumper",), + 0x800E04BC:("CollisionCheck_ApplyBumperDefense",), + 0x800E04EC:("CollisionCheck_GetToucherDamage",), + 0x800E0538:("Collider_InitBase",), + 0x800E0580:("Collider_DestroyBase",), + 0x800E0594:("Collider_SetBaseToActor",), + 0x800E05D4:("Collider_SetBaseType1",), + 0x800E0618:("Collider_SetBase",), + 0x800E065C:("Collider_ResetATBase",), + 0x800E0678:("Collider_ResetACBase",), + 0x800E0694:("Collider_ResetOCBase",), + 0x800E06BC:("Collider_InitTouch",), + 0x800E06E4:("Collider_DestroyTouch",), + 0x800E06F8:("Collider_SetTouch",), + 0x800E0720:("Collider_ResetATInfoUnk",), + 0x800E0730:("Collider_InitBump",), + 0x800E0760:("Collider_DestroyBump",), + 0x800E0774:("Collider_SetBump",), + 0x800E079C:("Collider_InitInfo",), + 0x800E081C:("Collider_DestroyInfo",), + 0x800E085C:("Collider_SetInfo",), + 0x800E08D4:("Collider_ResetATInfo",), + 0x800E090C:("Collider_ResetACInfo",), + 0x800E0944:("Collider_ResetOCInfo",), + 0x800E095C:("Collider_InitJntSphElementDim",), + 0x800E09A4:("Collider_DestroyJntSphElementDim",), + 0x800E09B8:("Collider_SetJntSphElementDim",), + 0x800E0A10:("Collider_InitJntSphElement",), + 0x800E0A50:("Collider_DestroyJntSphElement",), + 0x800E0A90:("Collider_SetJntSphElement",), + 0x800E0AE0:("Collider_ResetJntSphElementAT",), + 0x800E0B04:("Collider_ResetJntSphElementAC",), + 0x800E0B28:("Collider_ResetJntSphElementOC",), + 0x800E0B4C:("Collider_InitJntSph",), + 0x800E0B78:("Collider_FreeJntSph",), + 0x800E0C18:("Collider_DestroyJntSph",), + 0x800E0CA8:("Collider_SetJntSphToActor",), + 0x800E0D84:("Collider_SetJntSphAllocType1",), + 0x800E0E60:("Collider_SetJntSph",), + 0x800E0F14:("Collider_InitAndSetJntSph",), + 0x800E0F68:("Collider_ResetJntSphAT",), + 0x800E0FF4:("Collider_ResetJntSphAC",), + 0x800E1080:("Collider_ResetJntSphOC",), + 0x800E110C:("Collider_InitCylinderDim",), + 0x800E1148:("Collider_DestroyCylinderDim",), + 0x800E115C:("Collider_SetCylinderDim",), + 0x800E119C:("Collider_InitCylinder",), + 0x800E11EC:("Collider_DestroyCylinder",), + 0x800E123C:("Collider_SetCylinderToActor",), + 0x800E12A4:("Collider_SetCylinderType1",), + 0x800E130C:("Collider_SetCylinder",), + 0x800E1374:("Collider_InitAndSetCylinder",), + 0x800E13C0:("Collider_ResetCylinderAT",), + 0x800E1400:("Collider_ResetCylinderAC",), + 0x800E1440:("Collider_ResetCylinderOC",), + 0x800E1480:("Collider_InitTrisElementDim",), + 0x800E14CC:("Collider_DestroyTrisElementDim",), + 0x800E14E0:("Collider_SetTrisElementDim",), + 0x800E1594:("Collider_InitTrisElement",), + 0x800E15D4:("Collider_DestroyTrisElement",), + 0x800E1614:("Collider_SetTrisElement",), + 0x800E1664:("Collider_ResetTrisElementAT",), + 0x800E1688:("Collider_ResetTrisElementAC",), + 0x800E16AC:("Collider_ResetTrisElementOC",), + 0x800E16D0:("Collider_InitTris",), + 0x800E16FC:("Collider_FreeTris",), + 0x800E17B4:("Collider_DestroyTris",), + 0x800E1858:("Collider_SetTrisAllocType1",), + 0x800E1958:("Collider_SetTris",), + 0x800E1A24:("Collider_InitAndSetTris",), + 0x800E1A78:("Collider_ResetTrisAT",), + 0x800E1B18:("Collider_ResetTrisAC",), + 0x800E1BB8:("Collider_ResetTrisOC",), + 0x800E1C58:("Collider_InitQuadDim",), + 0x800E1CA4:("Collider_DestroyQuadDim",), + 0x800E1CB8:("Collider_ResetQuadACDist",), + 0x800E1CD4:("Collider_SetQuadMidpoints",), + 0x800E1D90:("Collider_SetQuadDim",), + 0x800E1E18:("Collider_InitQuad",), + 0x800E1E68:("Collider_DestroyQuad",), + 0x800E1EB8:("Collider_SetQuadType1",), + 0x800E1F20:("Collider_SetQuad",), + 0x800E1F88:("Collider_InitAndSetQuad",), + 0x800E1FD4:("Collider_ResetQuadAT",), + 0x800E2024:("Collider_ResetQuadAC",), + 0x800E2064:("Collider_ResetQuadOC",), + 0x800E20A4:("Collider_QuadSetNearestAC",), + 0x800E2154:("Collider_InitSphere",), + 0x800E21A4:("Collider_DestroySphere",), + 0x800E21F4:("Collider_SetSphere",), + 0x800E225C:("Collider_InitAndSetSphere",), + 0x800E22A8:("Collider_ResetSphereAT",), + 0x800E22E8:("Collider_ResetSphereAC",), + 0x800E2328:("Collider_ResetSphereOC",), + 0x800E2368:("Collider_InitLine",), + 0x800E23B0:("Collider_DestroyLine",), + 0x800E23C4:("Collider_SetLinePoints",), + 0x800E2408:("Collider_SetLine",), + 0x800E2434:("Collider_ResetLineOC",), + 0x800E2450:("CollisionCheck_InitContext",), + 0x800E2470:("CollisionCheck_DestroyContext",), + 0x800E2480:("CollisionCheck_ClearContext",), + 0x800E2528:("CollisionCheck_EnableSAC",), + 0x800E2540:("CollisionCheck_DisableSAC",), + 0x800E2558:("CollisionCheck_SetAT",), + 0x800E2634:("CollisionCheck_SetAT_SAC",), + 0x800E2740:("CollisionCheck_SetAC",), + 0x800E281C:("CollisionCheck_SetAC_SAC",), + 0x800E2928:("CollisionCheck_SetOC",), + 0x800E2A04:("CollisionCheck_SetOC_SAC",), + 0x800E2B10:("CollisionCheck_SetOCLine",), + 0x800E2B98:("CollisionCheck_SkipTouch",), + 0x800E2BBC:("CollisionCheck_SkipBump",), + 0x800E2BE0:("CollisionCheck_NoSharedFlags",), + 0x800E2C08:("CollisionCheck_NoBlood",), + 0x800E2C1C:("CollisionCheck_BlueBlood",), + 0x800E2D88:("CollisionCheck_GreenBlood",), + 0x800E2EF4:("CollisionCheck_WaterBurst",), + 0x800E2F30:("CollisionCheck_RedBlood",), + 0x800E2F54:("CollisionCheck_RedBloodUnused",), + 0x800E2F78:("CollisionCheck_HitSolid",), + 0x800E30C8:("CollisionCheck_SwordHitAudio",), + 0x800E3168:("CollisionCheck_HitEffects",), + 0x800E3304:("CollisionCheck_SetBounce",), + 0x800E3324:("CollisionCheck_SetATvsAC",), + 0x800E35C8:("CollisionCheck_TrisAvgPoint",), + 0x800E362C:("CollisionCheck_QuadAvgPoint",), + 0x800E36AC:("CollisionCheck_AC_JntSphVsJntSph",), + 0x800E38F8:("CollisionCheck_AC_JntSphVsCyl",), + 0x800E3B18:("CollisionCheck_AC_JntSphVsTris",), + 0x800E3CC0:("CollisionCheck_AC_JntSphVsQuad",), + 0x800E3E6C:("CollisionCheck_AC_JntSphVsSphere",), + 0x800E4058:("CollisionCheck_AC_CylVsJntSph",), + 0x800E4298:("CollisionCheck_AC_CylVsCyl",), + 0x800E44C0:("CollisionCheck_AC_CylVsTris",), + 0x800E4628:("CollisionCheck_AC_CylVsQuad",), + 0x800E47B8:("CollisionCheck_AC_CylVsSphere",), + 0x800E494C:("CollisionCheck_AC_TrisVsJntSph",), + 0x800E4B08:("CollisionCheck_AC_TrisVsCyl",), + 0x800E4C70:("CollisionCheck_AC_TrisVsTris",), + 0x800E4E24:("CollisionCheck_AC_TrisVsQuad",), + 0x800E4FE4:("CollisionCheck_AC_TrisVsSphere",), + 0x800E5154:("CollisionCheck_AC_QuadVsJntSph",), + 0x800E531C:("CollisionCheck_AC_QuadVsCyl",), + 0x800E54DC:("CollisionCheck_AC_QuadVsTris",), + 0x800E56B8:("CollisionCheck_AC_QuadVsQuad",), + 0x800E5874:("CollisionCheck_AC_QuadVsSphere",), + 0x800E59A4:("CollisionCheck_AC_SphereVsJntSph",), + 0x800E5B94:("CollisionCheck_AC_SphereVsCylinder",), + 0x800E5D10:("CollisionCheck_AC_SphereVsTris",), + 0x800E5E54:("CollisionCheck_AC_SphereVsQuad",), + 0x800E5F6C:("CollisionCheck_AC_SphereVsSphere",), + 0x800E60C0:("CollisionCheck_SetJntSphHitFX",), + 0x800E61A0:("CollisionCheck_SetCylHitFX",), + 0x800E6238:("CollisionCheck_SetTrisHitFX",), + 0x800E6320:("CollisionCheck_SetQuadHitFX",), + 0x800E63B8:("CollisionCheck_SetSphereHitFX",), + 0x800E6450:("CollisionCheck_SetHitEffects",), + 0x800E6524:("CollisionCheck_AC",), + 0x800E6654:("CollisionCheck_AT",), + 0x800E6724:("CollisionCheck_GetMassType",), + 0x800E6760:("CollisionCheck_SetOCvsOC",), + 0x800E6A9C:("CollisionCheck_OC_JntSphVsJntSph",), + 0x800E6C84:("CollisionCheck_OC_JntSphVsCyl",), + 0x800E6DF4:("CollisionCheck_OC_JntSphVsSphere",), + 0x800E6F64:("CollisionCheck_OC_CylVsJntSph",), + 0x800E6F90:("CollisionCheck_OC_CylVsCyl",), + 0x800E7060:("CollisionCheck_OC_CylVsSphere",), + 0x800E7130:("CollisionCheck_OC_SphereVsJntSph",), + 0x800E715C:("CollisionCheck_OC_SphereVsCyl",), + 0x800E7188:("CollisionCheck_OC_SphereVsSphere",), + 0x800E7264:("CollisionCheck_SkipOC",), + 0x800E7288:("CollisionCheck_Incompatible",), + 0x800E7308:("CollisionCheck_OC",), + 0x800E7494:("CollisionCheck_InitInfo",), + 0x800E74DC:("CollisionCheck_ResetDamage",), + 0x800E7508:("CollisionCheck_SetInfoNoDamageTable",), + 0x800E7530:("CollisionCheck_SetInfo",), + 0x800E755C:("CollisionCheck_SetInfo2",), + 0x800E7590:("CollisionCheck_SetInfoGetDamageTable",), + 0x800E75C8:("CollisionCheck_ApplyDamage",), + 0x800E77EC:("CollisionCheck_ApplyDamageJntSph",), + 0x800E7894:("CollisionCheck_ApplyDamageCyl",), + 0x800E78B4:("CollisionCheck_ApplyDamageTris",), + 0x800E7948:("CollisionCheck_ApplyDamageQuad",), + 0x800E7968:("CollisionCheck_ApplyDamageSphere",), + 0x800E7988:("CollisionCheck_Damage",), + 0x800E7A48:("CollisionCheck_LineOC_JntSph",), + 0x800E7B54:("CollisionCheck_LineOC_Cyl",), + 0x800E7BCC:("CollisionCheck_LineOC_Sphere",), + 0x800E7C64:("CollisionCheck_LineOC",), + 0x800E7DA8:("CollisionCheck_LineOCCheckAll",), + 0x800E7DCC:("CollisionCheck_LineOCCheck",), + 0x800E7DF8:("Collider_UpdateCylinder",), + 0x800E7E3C:("Collider_SetCylinderPosition",), + 0x800E7E5C:("Collider_SetQuadVertices",), + 0x800E7ECC:("Collider_SetTrisVertices",), + 0x800E7F8C:("Collider_SetTrisDim",), + 0x800E7FDC:("Collider_UpdateSpheres",), + 0x800E8160:("Collider_UpdateSpheresElement",), + 0x800E823C:("Collider_UpdateSphere",), + 0x800E8318:("CollisionCheck_SpawnRedBlood",), + 0x800E8478:("CollisionCheck_SpawnWaterDroplets",), + 0x800E85D4:("CollisionCheck_SpawnShieldParticles",), + 0x800E8668:("CollisionCheck_SpawnShieldParticlesMetal",), + 0x800E8690:("CollisionCheck_SpawnShieldParticlesMetalSound",), + 0x800E86C0:("CollisionCheck_SpawnShieldParticlesMetal2",), + 0x800E86E0:("CollisionCheck_SpawnShieldParticlesWood",), + 0x800E8784:("CollisionCheck_CylSideVsLineSeg",), 0x800E8EA0:("func_800E8EA0",), 0x800E8ED0:("nop_800E8ED0",), 0x800E8EE0:("nop_800E8EE0",), diff --git a/tables/objects.txt b/tables/objects.txt index a80b2ed57a..56bfc5aa5b 100644 --- a/tables/objects.txt +++ b/tables/objects.txt @@ -274,7 +274,7 @@ 0x800CAE10:"", 0x800CB000:"", 0x800CB210:"z_camera", - 0x800E03A0:"", + 0x800E03A0:"z_collision_btltbls", 0x800E0410:"z_collision_check", 0x800E8EA0:"", 0x800E9360:"", @@ -405,7 +405,8 @@ 0x801AEFD0:"code_data_z_actor_dlftbls", 0x801B4620:"code_data_z_bgcheck", 0x801B4710:"code_data_z_camera", - 0x801B9F20:"code_data_z_collision_check", + 0x801B9F20:"code_data_z_collision_btltbls", + 0x801BA200:"code_data_z_collision_check", 0x801BA550:"code_data_z_debug_display", 0x801BB090:"code_data_z_debug_mode", 0x801BB170:"code_data_z_draw", diff --git a/tables/variables.txt b/tables/variables.txt index 34138bc278..b4779f2a63 100644 --- a/tables/variables.txt +++ b/tables/variables.txt @@ -354,11 +354,11 @@ 0x801AAAB0:("D_801AAAB0","UNK_TYPE1","",0x1), 0x801AD370:("D_801AD370","UNK_TYPE1","",0x1), 0x801ADE60:("En_A_Obj_InitVars","ActorInit","",0x20), - 0x801ADE80:("enAObjCylinderInit","ColCylinderInit","",0x2c), + 0x801ADE80:("enAObjCylinderInit","ColliderCylinderInit","",0x2c), 0x801ADEAC:("enAObjInitVar","ActorInitVar","",0x4), 0x801ADEB0:("enAObjDisplayLists","u32","[2]",0x8), 0x801ADEC0:("En_Item00_InitVars","ActorInit","",0x20), - 0x801ADEE0:("enItem00CylinderInit","ColCylinderInit","",0x2c), + 0x801ADEE0:("enItem00CylinderInit","ColliderCylinderInit","",0x2c), 0x801ADF0C:("enItem00InitVars","ActorInitVar","[1]",0x4), 0x801ADF10:("D_801ADF10","UNK_TYPE1","",0x1), 0x801ADF14:("D_801ADF14","UNK_TYPE1","",0x1), @@ -853,37 +853,30 @@ 0x801B9F04:("D_801B9F04","UNK_TYPE4","",0x4), 0x801B9F0C:("D_801B9F0C","UNK_TYPE2","",0x2), 0x801B9F10:("D_801B9F10","UNK_TYPE4","",0x4), - 0x801B9F20:("D_801B9F20","s800E03A0","[23]",0x2e0), - 0x801BA200:("gDamageMultipliers","f32","[16]",0x40), - 0x801BA240:("defaultColCommon","ColCommon","",0x18), - 0x801BA258:("defaultColTouch","ColTouch","",0x8), - 0x801BA260:("defaultColBump","ColBump","",0xc), - 0x801BA26C:("defaultColBodyInfo","ColBodyInfo","",0x28), - 0x801BA294:("defaultColSphereInfo","ColSphereParams","",0x18), - 0x801BA2AC:("defaultColCylinderInfo","ColCylinderParams","",0xc), - 0x801BA2B8:("defaultColTriParams","ColTriParams","",0x34), - 0x801BA2EC:("defaultColQuadParams","ColQuadParams","",0x40), - 0x801BA32C:("D_801BA32C","UNK_TYPE1","",0x1), - 0x801BA338:("collisionAddATFuncs","collision_add_func","[5]",0x14), - 0x801BA34C:("collisionAddACFuncs","collision_add_func","[5]",0x14), - 0x801BA360:("collisionAddOTFuncs","collision_add_func","[5]",0x14), - 0x801BA374:("D_801BA374","UNK_PTR","",0x4), - 0x801BA38C:("D_801BA38C","UNK_TYPE1","",0x1), - 0x801BA38D:("D_801BA38D","UNK_TYPE1","",0x1), - 0x801BA3A8:("D_801BA3A8","UNK_PTR","",0x4), - 0x801BA3BC:("collisionFuncTableATwithAC","collision_func","[25]",0x64), - 0x801BA420:("collisionFuncTableOTwithOT","collision_func","[25]",0x64), - 0x801BA484:("D_801BA484","CollisionCheckInfo","",0x1c), - 0x801BA4A0:("D_801BA4A0","UNK_PTR","",0x4), - 0x801BA4B4:("D_801BA4B4","UNK_TYPE1","",0x1), - 0x801BA4C8:("D_801BA4C8","EffShieldParticleInit","",0x40), - 0x801BA4F6:("D_801BA4F6","UNK_TYPE1","",0x1), - 0x801BA4F8:("D_801BA4F8","UNK_TYPE1","",0x1), - 0x801BA4FA:("D_801BA4FA","UNK_TYPE1","",0x1), - 0x801BA508:("D_801BA508","EffShieldParticleInit","",0x40), - 0x801BA536:("D_801BA536","UNK_TYPE1","",0x1), - 0x801BA538:("D_801BA538","UNK_TYPE1","",0x1), - 0x801BA53A:("D_801BA53A","UNK_TYPE1","",0x1), + 0x801B9F20:("sDamageTablePresets","DamageTable","[23]",0x2e0), + 0x801BA200:("damageMultipliers","f32","[16]",0x40), + 0x801BA240:("defaultCollider","Collider","",0x18), + 0x801BA258:("defaultColliderTouch","ColliderTouch","",0x8), + 0x801BA260:("defaultColliderBump","ColliderBump","",0xc), + 0x801BA26C:("defaultColliderInfo","ColliderInfo","",0x28), + 0x801BA294:("defaultColliderJntSphElementDim","ColliderJntSphElementDim","",0x18), + 0x801BA2AC:("defaultColliderCylinderDim","Cylinder16","",0xc), + 0x801BA2B8:("defaultColliderTrisElementDim","TriNorm","",0x34), + 0x801BA2EC:("defaultColliderQuadDim","ColliderQuadDim","",0x40), + 0x801BA32C:("defaultLinePoint","Vec3f","",0xC), + 0x801BA338:("sATResetFuncs","ColChkResetFunc","[5]",0x14), + 0x801BA34C:("sACResetFuncs","ColChkResetFunc","[5]",0x14), + 0x801BA360:("sOCResetFuncs","ColChkResetFunc","[5]",0x14), + 0x801BA374:("sBloodFuncs","ColChkBloodFunc","[]",0x18), + 0x801BA38C:("sHitInfo","HitInfo","[]",0x1C), + 0x801BA3A8:("sColChkApplyFuncs","ColChkApplyFunc","",0x14), + 0x801BA3BC:("sACVsFuncs","ColChkVsFunc","[5][5]",0x64), + 0x801BA420:("sOCVsFuncs","ColChkVsFunc","[5][5]",0x64), + 0x801BA484:("defaultColChkInfo","CollisionCheckInfo","",0x1c), + 0x801BA4A0:("sApplyDamageFuncs","ColChkApplyFunc","",0x14), + 0x801BA4B4:("sOCLineCheckFuncs","ColChkLineFunc","",0x14), + 0x801BA4C8:("shieldParticleInitMetal","EffShieldParticleInit","",0x40), + 0x801BA508:("shieldParticleInitWood","EffShieldParticleInit","",0x40), 0x801BA550:("D_801BA550","UNK_TYPE1","",0x1), 0x801BA750:("D_801BA750","UNK_TYPE1","",0x1), 0x801BA790:("D_801BA790","UNK_TYPE1","",0x1), @@ -936,7 +929,7 @@ 0x801BD8C0:("actorCutscenesGlobalCtxt","GlobalContext*","",0x4), 0x801BD8C4:("actorCutsceneReturnCamera","s16","",0x2), 0x801BD8C6:("D_801BD8C6","s16","",0x2), - 0x801BD8D0:("fireObjCollisionInit","ColCylinderInit","",0x2c), + 0x801BD8D0:("fireObjCollisionInit","ColliderCylinderInit","",0x2c), 0x801BD8FC:("D_801BD8FC","FireObjLightParams","[2]",0x10), 0x801BD910:("initialGameStateInfo","GameStateOverlay","",0x30), 0x801BD940:("D_801BD940","GameStateOverlay","",0x30), @@ -3980,8 +3973,8 @@ 0x801EDB9C:("D_801EDB9C","f32","",0x4), 0x801EDBA0:("D_801EDBA0","f32","",0x4), 0x801EDBA4:("D_801EDBA4","UNK_TYPE1","",0x1), - 0x801EDBA8:("D_801EDBA8","ColSphereCollisionInfo","",0x8), - 0x801EDBB0:("D_801EDBB0","ColTriParams","",0x34), + 0x801EDBA8:("D_801EDBA8","Sphere16","",0x8), + 0x801EDBB0:("D_801EDBB0","TriNorm","",0x34), 0x801EDBD4:("D_801EDBD4","UNK_TYPE1","",0x1), 0x801EDBD8:("D_801EDBD8","UNK_TYPE1","",0x1), 0x801EDBDC:("D_801EDBDC","UNK_TYPE1","",0x1), @@ -4008,54 +4001,42 @@ 0x801EDDE0:("D_801EDDE0","UNK_TYPE1","",0x1), 0x801EDDF0:("D_801EDDF0","UNK_TYPE1","",0x1), 0x801EDE00:("D_801EDE00","Vec3f","",0xc), - 0x801EDE10:("D_801EDE10","UNK_TYPE1","",0x1), + 0x801EDE10:("D_801EDE10","Vec3f","",0xc), 0x801EDE20:("D_801EDE20","Vec3f","",0xc), - 0x801EDE30:("D_801EDE30","UNK_TYPE1","",0x1), - 0x801EDE40:("D_801EDE40","UNK_TYPE1","",0x1), - 0x801EDE78:("D_801EDE78","UNK_TYPE1","",0x1), - 0x801EDEB0:("D_801EDEB0","UNK_TYPE1","",0x1), - 0x801EDEBC:("D_801EDEBC","UNK_TYPE1","",0x1), - 0x801EDEC8:("D_801EDEC8","UNK_TYPE1","",0x1), - 0x801EDF00:("D_801EDF00","UNK_TYPE1","",0x1), - 0x801EDF38:("D_801EDF38","UNK_TYPE1","",0x1), - 0x801EDF48:("D_801EDF48","UNK_TYPE1","",0x1), - 0x801EDF58:("D_801EDF58","UNK_TYPE1","",0x1), - 0x801EDF90:("D_801EDF90","UNK_TYPE1","",0x1), - 0x801EDFC8:("D_801EDFC8","UNK_TYPE1","",0x1), - 0x801EDFD4:("D_801EDFD4","UNK_TYPE1","",0x1), - 0x801EDFE0:("D_801EDFE0","UNK_TYPE1","",0x1), - 0x801EDFF0:("D_801EDFF0","UNK_TYPE1","",0x1), - 0x801EE000:("D_801EE000","UNK_TYPE1","",0x1), - 0x801EE038:("D_801EE038","UNK_TYPE1","",0x1), - 0x801EE070:("D_801EE070","UNK_TYPE1","",0x1), - 0x801EE0A4:("D_801EE0A4","UNK_TYPE1","",0x1), - 0x801EE0D8:("D_801EE0D8","UNK_TYPE1","",0x1), - 0x801EE0E8:("D_801EE0E8","UNK_TYPE1","",0x1), - 0x801EE11C:("D_801EE11C","UNK_TYPE1","",0x1), - 0x801EE150:("D_801EE150","UNK_TYPE1","",0x1), - 0x801EE188:("D_801EE188","UNK_TYPE1","",0x1), - 0x801EE1C0:("D_801EE1C0","UNK_TYPE1","",0x1), - 0x801EE1C4:("D_801EE1C4","UNK_TYPE1","",0x1), - 0x801EE1C8:("D_801EE1C8","UNK_TYPE1","",0x1), - 0x801EE1D0:("D_801EE1D0","UNK_TYPE1","",0x1), - 0x801EE1D4:("D_801EE1D4","UNK_TYPE1","",0x1), - 0x801EE1D8:("D_801EE1D8","UNK_TYPE1","",0x1), - 0x801EE1E0:("D_801EE1E0","UNK_TYPE1","",0x1), - 0x801EE1E4:("D_801EE1E4","UNK_TYPE1","",0x1), - 0x801EE1E8:("D_801EE1E8","UNK_TYPE1","",0x1), - 0x801EE1F0:("D_801EE1F0","UNK_TYPE1","",0x1), - 0x801EE1F4:("D_801EE1F4","UNK_TYPE1","",0x1), - 0x801EE1F8:("D_801EE1F8","UNK_TYPE1","",0x1), + 0x801EDE30:("D_801EDE30","Vec3f","",0xc), + 0x801EDE40:("D_801EDE40","TriNorm","",0x34), + 0x801EDE78:("D_801EDE78","TriNorm","",0x34), + 0x801EDEB0:("D_801EDEB0","LineSegment","",0x18), + 0x801EDEC8:("D_801EDEC8","TriNorm","",0x34), + 0x801EDF00:("D_801EDF00","TriNorm","",0x34), + 0x801EDF38:("D_801EDF38","Vec3f","",0xC), + 0x801EDF48:("D_801EDF48","Vec3f","",0xC), + 0x801EDF58:("D_801EDF58","TriNorm","",0x34), + 0x801EDF90:("D_801EDF90","TriNorm","",0x34), + 0x801EDFC8:("D_801EDFC8","LineSegment","",0x18), + 0x801EDFE0:("D_801EDFE0","Vec3f","",0xC), + 0x801EDFF0:("D_801EDFF0","Vec3f","",0xC), + 0x801EE000:("D_801EE000","TriNorm","",0x34), + 0x801EE038:("D_801EE038","TriNorm","",0x34), + 0x801EE070:("D_801EE070","TriNorm","[]",0x68), + 0x801EE0D8:("D_801EE0D8","Vec3f","",0xC), + 0x801EE0E8:("D_801EE0E8","TriNorm","[]",0x68), + 0x801EE150:("D_801EE150","TriNorm","",0x34), + 0x801EE188:("D_801EE188","TriNorm","",0x34), + 0x801EE1C0:("D_801EE1C0","Vec3f","",0xC), + 0x801EE1D0:("D_801EE1D0","Vec3f","",0xC), + 0x801EE1E0:("D_801EE1E0","Vec3f","",0xC), + 0x801EE1F0:("D_801EE1F0","Vec3f","",0xC), 0x801EE200:("D_801EE200","EffSparkParams","",0x4c4), - 0x801EE6C8:("D_801EE6C8","ColTriParams","",0x34), - 0x801EE700:("D_801EE700","ColTriParams","",0x34), + 0x801EE6C8:("D_801EE6C8","TriNorm","",0x34), + 0x801EE700:("D_801EE700","TriNorm","",0x34), 0x801EE738:("D_801EE738","EffSparkParams","",0x4c4), 0x801EEC00:("D_801EEC00","EffSparkParams","",0x4c4), 0x801EF0C8:("D_801EF0C8","EffSparkParams","",0x4c4), - 0x801EF590:("D_801EF590","UNK_TYPE1","",0x1), - 0x801EF5C8:("D_801EF5C8","UNK_TYPE1","",0x1), - 0x801EF600:("D_801EF600","ColTriParams","",0x34), - 0x801EF638:("D_801EF638","ColTriParams","",0x34), + 0x801EF590:("D_801EF590","TriNorm","",0x34), + 0x801EF5C8:("D_801EF5C8","TriNorm","",0x34), + 0x801EF600:("D_801EF600","TriNorm","",0x34), + 0x801EF638:("D_801EF638","TriNorm","",0x34), 0x801EF66D:("D_801EF66D","UNK_TYPE1","",0x1), 0x801EF670:("gSaveContext","SaveContext","",0x48c8), 0x801F3F38:("D_801F3F38","UNK_TYPE2","",0x2), @@ -6015,9 +5996,9 @@ 0x80870DAC:("enOkutaOverlayInfoOffset","u32","",0x4), 0x80872DA0:("En_Bom_InitVars","ActorInit","",0x20), 0x80872DC0:("enBomScales","f32","[2]",0x8), - 0x80872DC8:("D_80872DC8","ColCylinderInit","",0x2c), - 0x80872DF4:("D_80872DF4","ColSphereGroupElementInit","[1]",0x24), - 0x80872E18:("D_80872E18","ColSphereGroupInit","",0x10), + 0x80872DC8:("D_80872DC8","ColliderCylinderInit","",0x2c), + 0x80872DF4:("D_80872DF4","ColliderJntSphElementInit","[1]",0x24), + 0x80872E18:("D_80872E18","ColliderJntSphInit","",0x10), 0x80872E28:("D_80872E28","UNK_TYPE1","",0x1), 0x80872E4C:("D_80872E4C","UNK_TYPE1","",0x1), 0x80872E5C:("D_80872E5C","ActorInitVar","[3]",0xc), @@ -6154,7 +6135,7 @@ 0x80879414:("enDodongoOverlayRelocations","u32","[182]",0x2d8), 0x808796EC:("enDodongoOverlayInfoOffset","u32","",0x4), 0x8087B450:("En_Firefly_InitVars","ActorInit","",0x20), - 0x8087B470:("enFireflyCollisionInit","ColSphereInit","",0x2c), + 0x8087B470:("enFireflyCollisionInit","ColliderSphereInit","",0x2c), 0x8087B498:("D_8087B498","UNK_TYPE1","",0x1), 0x8087B49C:("D_8087B49C","UNK_TYPE1","",0x1), 0x8087B4A4:("enFireflyDamageTable","DamageTable","",0x20), @@ -17805,7 +17786,7 @@ 0x80BD5314:("bgIkanaBombwallOverlayRelocations","u32","[39]",0x9c), 0x80BD53BC:("bgIkanaBombwallOverlayInfoOffset","u32","",0x4), 0x80BD55D0:("Bg_Ikana_Ray_InitVars","ActorInit","",0x20), - 0x80BD55F0:("bgIkanaRayCylinderInit","ColCylinderInit","",0x2c), + 0x80BD55F0:("bgIkanaRayCylinderInit","ColliderCylinderInit","",0x2c), 0x80BD561C:("bgIkanaRayCompInit","ActorInitVar","[4]",0x10), 0x80BD5630:("bgIkanaRayOverlayInfo","OverlayRelocationSection","",0x14), 0x80BD5644:("bgIkanaRayOverlayRelocations","u32","[17]",0x44), @@ -17849,7 +17830,7 @@ 0x80BD7A04:("bgIknvDoukutuOverlayRelocations","u32","[39]",0x9c), 0x80BD7AAC:("bgIknvDoukutuOverlayInfoOffset","u32","",0x4), 0x80BD81D0:("Bg_Iknv_Obj_InitVars","ActorInit","",0x20), - 0x80BD81F0:("BgIknvObjCollisionInit","ColCylinderInit","",0x2c), + 0x80BD81F0:("BgIknvObjCollisionInit","ColliderCylinderInit","",0x2c), 0x80BD8220:("bgIknvObjOverlayInfo","OverlayRelocationSection","",0x14), 0x80BD8234:("bgIknvObjOverlayRelocations","u32","[27]",0x6c), 0x80BD82AC:("bgIknvObjOverlayInfoOffset","u32","",0x4), diff --git a/tools/overlayhelpers/actor_symbols.py b/tools/overlayhelpers/actor_symbols.py new file mode 100644 index 0000000000..f1bf51f0fc --- /dev/null +++ b/tools/overlayhelpers/actor_symbols.py @@ -0,0 +1,750 @@ +#!/usr/bin/env python3 + +import argparse, os, struct + +actor_names = [ + "ovl_Player_Actor", + "ovl_En_Test", + "ovl_En_GirlA", + "ovl_En_Part", + "ovl_En_Light", + "ovl_En_Door", + "ovl_En_Box", + "ovl_En_Pametfrog", + "ovl_En_Okuta", + "ovl_En_Bom", + "ovl_En_Wallmas", + "ovl_En_Dodongo", + "ovl_En_Firefly", + "ovl_En_Horse", + "ovl_En_Item00", + "ovl_En_Arrow", + "ovl_En_Elf", + "ovl_En_Niw", + "ovl_En_Tite", + "", + "ovl_En_Peehat", + "ovl_En_Butte", + "ovl_En_Insect", + "ovl_En_Fish", + "ovl_En_Holl", + "ovl_En_Dinofos", + "ovl_En_Hata", + "ovl_En_Zl1", + "ovl_En_Viewer", + "ovl_En_Bubble", + "ovl_Door_Shutter", + "", + "ovl_En_Boom", + "ovl_En_Torch2", + "ovl_En_Minifrog", + "", + "ovl_En_St", + "", + "ovl_En_A_Obj", + "ovl_Obj_Wturn", + "ovl_En_River_Sound", + "", + "ovl_En_Ossan", + "", + "", + "ovl_En_Famos", + "", + "ovl_En_Bombf", + "", + "", + "ovl_En_Am", + "ovl_En_Dekubaba", + "ovl_En_M_Fire1", + "ovl_ovl_En_M_Thunder", + "ovl_Bg_Breakwall", + "", + "ovl_Door_Warp1", + "ovl_Obj_Syokudai", + "ovl_Item_B_Heart", + "ovl_En_Dekunuts", + "ovl_En_Bbfall", + "ovl_Arms_Hook", + "ovl_En_Bb", + "ovl_Bg_Keikoku_Spr", + "", + "ovl_En_Wood02", + "", + "ovl_En_Death", + "ovl_En_Minideath", + "", + "", + "ovl_En_Vm", + "ovl_Demo_Effect", + "ovl_Demo_Kankyo", + "ovl_En_Floormas", + "", + "ovl_En_Rd", + "ovl_Bg_F40_Flift", + "", + "ovl_Obj_Mure", + "ovl_En_Sw", + "ovl_Object_Kankyo", + "", + "", + "ovl_En_Horse_Link_Child", + "ovl_Door_Ana", + "", + "", + "", + "", + "", + "ovl_En_Encount1", + "ovl_Demo_Tre_Lgt", + "", + "", + "ovl_En_Encount2", + "ovl_En_Fire_Rock", + "ovl_Bg_Ctower_Rot", + "ovl_Mir_Ray", + "", + "ovl_En_Sb", + "ovl_En_Bigslime", + "ovl_En_Karebaba", + "ovl_En_In", + "", + "ovl_En_Ru", + "ovl_En_Bom_Chu", + "ovl_En_Horse_Game_Check", + "ovl_En_Rr", + "", + "", + "", + "", + "", + "", + "ovl_En_Fr", + "", + "", + "", + "", + "", + "", + "ovl_Obj_Oshihiki", + "ovl_Eff_Dust", + "ovl_Bg_Umajump", + "ovl_Arrow_Fire", + "ovl_Arrow_Ice", + "ovl_Arrow_Light", + "ovl_Item_Etcetera", + "ovl_Obj_Kibako", + "ovl_Obj_Tsubo", + "", + "ovl_En_Ik", + "", + "", + "", + "", + "ovl_Demo_Shd", + "ovl_En_Dns", + "ovl_Elf_Msg", + "ovl_En_Honotrap", + "ovl_En_Tubo_Trap", + "ovl_Obj_Ice_Poly", + "ovl_En_Fz", + "ovl_En_Kusa", + "ovl_Obj_Bean", + "ovl_Obj_Bombiwa", + "ovl_Obj_Switch", + "", + "ovl_Obj_Lift", + "ovl_Obj_Hsblock", + "ovl_En_Okarina_Tag", + "", + "ovl_En_Goroiwa", + "", + "", + "ovl_En_Daiku", + "ovl_En_Nwc", + "ovl_Item_Inbox", + "ovl_En_Ge1", + "ovl_Obj_Blockstop", + "ovl_En_Sda", + "ovl_En_Clear_Tag", + "", + "ovl_En_Gm", + "ovl_En_Ms", + "ovl_En_Hs", + "ovl_Bg_Ingate", + "ovl_En_Kanban", + "", + "ovl_En_Attack_Niw", + "", + "", + "", + "ovl_En_Mk", + "ovl_En_Owl", + "ovl_En_Ishi", + "ovl_Obj_Hana", + "ovl_Obj_Lightswitch", + "ovl_Obj_Mure2", + "", + "ovl_En_Fu", + "", + "", + "ovl_En_Stream", + "ovl_En_Mm", + "", + "", + "ovl_En_Weather_Tag", + "ovl_En_Ani", + "", + "ovl_En_Js", + "", + "", + "", + "", + "ovl_En_Okarina_Effect", + "ovl_En_Mag", + "ovl_Elf_Msg2", + "ovl_Bg_F40_Swlift", + "", + "", + "ovl_En_Kakasi", + "ovl_Obj_Makeoshihiki", + "ovl_Oceff_Spot", + "", + "ovl_En_Torch", + "", + "ovl_Shot_Sun", + "", + "", + "ovl_Obj_Roomtimer", + "ovl_En_Ssh", + "", + "ovl_Oceff_Wipe", + "ovl_Oceff_Storm", + "ovl_Obj_Demo", + "ovl_En_Minislime", + "ovl_En_Nutsball", + "", + "", + "", + "", + "ovl_Oceff_Wipe2", + "ovl_Oceff_Wipe3", + "", + "ovl_En_Dg", + "ovl_En_Si", + "ovl_Obj_Comb", + "ovl_Obj_Kibako2", + "", + "ovl_En_Hs2", + "ovl_Obj_Mure3", + "ovl_En_Tg", + "", + "", + "ovl_En_Wf", + "ovl_En_Skb", + "", + "ovl_En_Gs", + "ovl_Obj_Sound", + "ovl_En_Crow", + "", + "ovl_En_Cow", + "", + "", + "ovl_Oceff_Wipe4", + "", + "ovl_En_Zo", + "ovl_Obj_Makekinsuta", + "ovl_En_Ge3", + "", + "ovl_Obj_Hamishi", + "ovl_En_Zl4", + "ovl_En_Mm2", + "", + "ovl_Door_Spiral", + "", + "ovl_Obj_Pzlblock", + "ovl_Obj_Toge", + "", + "ovl_Obj_Armos", + "ovl_Obj_Boyo", + "", + "", + "ovl_En_Grasshopper", + "", + "ovl_Obj_Grass", + "ovl_Obj_Grass_Carry", + "ovl_Obj_Grass_Unit", + "", + "", + "ovl_Bg_Fire_Wall", + "ovl_En_Bu", + "ovl_En_Encount3", + "ovl_En_Jso", + "ovl_Obj_Chikuwa", + "ovl_En_Knight", + "ovl_En_Warp_tag", + "ovl_En_Aob_01", + "ovl_En_Boj_01", + "ovl_En_Boj_02", + "ovl_En_Boj_03", + "ovl_En_Encount4", + "ovl_En_Bom_Bowl_Man", + "ovl_En_Syateki_Man", + "", + "ovl_Bg_Icicle", + "ovl_En_Syateki_Crow", + "ovl_En_Boj_04", + "ovl_En_Cne_01", + "ovl_En_Bba_01", + "ovl_En_Bji_01", + "ovl_Bg_Spdweb", + "", + "", + "ovl_En_Mt_tag", + "ovl_Boss_01", + "ovl_Boss_02", + "ovl_Boss_03", + "ovl_Boss_04", + "ovl_Boss_05", + "ovl_Boss_06", + "ovl_Boss_07", + "ovl_Bg_Dy_Yoseizo", + "", + "ovl_En_Boj_05", + "", + "", + "ovl_En_Sob1", + "", + "", + "ovl_En_Go", + "", + "ovl_En_Raf", + "ovl_Obj_Funen", + "ovl_Obj_Raillift", + "ovl_Bg_Numa_Hana", + "ovl_Obj_Flowerpot", + "ovl_Obj_Spinyroll", + "ovl_Dm_Hina", + "ovl_En_Syateki_Wf", + "ovl_Obj_Skateblock", + "ovl_Obj_Iceblock", + "ovl_En_Bigpamet", + "ovl_En_Syateki_Dekunuts", + "ovl_Elf_Msg3", + "ovl_En_Fg", + "ovl_Dm_Ravine", + "ovl_Dm_Sa", + "ovl_En_Slime", + "ovl_En_Pr", + "ovl_Obj_Toudai", + "ovl_Obj_Entotu", + "ovl_Obj_Bell", + "ovl_En_Syateki_Okuta", + "", + "ovl_Obj_Shutter", + "ovl_Dm_Zl", + "ovl_En_Elfgrp", + "ovl_Dm_Tsg", + "ovl_En_Baguo", + "ovl_Obj_Vspinyroll", + "ovl_Obj_Smork", + "ovl_En_Test2", + "ovl_En_Test3", + "ovl_En_Test4", + "ovl_En_Bat", + "ovl_En_Sekihi", + "ovl_En_Wiz", + "ovl_En_Wiz_Brock", + "ovl_En_Wiz_Fire", + "ovl_Eff_Change", + "ovl_Dm_Statue", + "ovl_Obj_Fireshield", + "ovl_Bg_Ladder", + "ovl_En_Mkk", + "ovl_Demo_Getitem", + "", + "ovl_En_Dnb", + "ovl_En_Dnh", + "ovl_En_Dnk", + "ovl_En_Dnq", + "", + "ovl_Bg_Keikoku_Saku", + "ovl_Obj_Hugebombiwa", + "ovl_En_Firefly2", + "ovl_En_Rat", + "ovl_En_Water_Effect", + "ovl_En_Kusa2", + "ovl_Bg_Spout_Fire", + "", + "ovl_Bg_Dblue_Movebg", + "ovl_En_Dy_Extra", + "ovl_En_Bal", + "ovl_En_Ginko_Man", + "ovl_En_Warp_Uzu", + "ovl_Obj_Driftice", + "ovl_En_Look_Nuts", + "ovl_En_Mushi2", + "ovl_En_Fall", + "ovl_En_Mm3", + "ovl_Bg_Crace_Movebg", + "ovl_En_Dno", + "ovl_En_Pr2", + "ovl_En_Prz", + "ovl_En_Jso2", + "ovl_Obj_Etcetera", + "ovl_En_Egol", + "ovl_Obj_Mine", + "ovl_Obj_Purify", + "ovl_En_Tru", + "ovl_En_Trt", + "", + "", + "ovl_En_Test5", + "ovl_En_Test6", + "ovl_En_Az", + "ovl_En_Estone", + "ovl_Bg_Hakugin_Post", + "ovl_Dm_Opstage", + "ovl_Dm_Stk", + "ovl_Dm_Char00", + "ovl_Dm_Char01", + "ovl_Dm_Char02", + "ovl_Dm_Char03", + "ovl_Dm_Char04", + "ovl_Dm_Char05", + "ovl_Dm_Char06", + "ovl_Dm_Char07", + "ovl_Dm_Char08", + "ovl_Dm_Char09", + "ovl_Obj_Tokeidai", + "", + "ovl_En_Mnk", + "ovl_En_Egblock", + "ovl_En_Guard_Nuts", + "ovl_Bg_Hakugin_Bombwall", + "ovl_Obj_Tokei_Tobira", + "ovl_Bg_Hakugin_Elvpole", + "ovl_En_Ma4", + "ovl_En_Twig", + "ovl_En_Po_Fusen", + "ovl_En_Door_Etc", + "ovl_En_Bigokuta", + "ovl_Bg_Icefloe", + "ovl_Obj_Ocarinalift", + "ovl_En_Time_Tag", + "ovl_Bg_Open_Shutter", + "ovl_Bg_Open_Spot", + "ovl_Bg_Fu_Kaiten", + "ovl_Obj_Aqua", + "ovl_En_Elforg", + "ovl_En_Elfbub", + "", + "ovl_En_Fu_Mato", + "ovl_En_Fu_Kago", + "ovl_En_Osn", + "ovl_Bg_Ctower_Gear", + "ovl_En_Trt2", + "ovl_Obj_Tokei_Step", + "ovl_Bg_Lotus", + "ovl_En_Kame", + "ovl_Obj_Takaraya_Wall", + "ovl_Bg_Fu_Mizu", + "ovl_En_Sellnuts", + "ovl_Bg_Dkjail_Ivy", + "", + "ovl_Obj_Visiblock", + "ovl_En_Takaraya", + "ovl_En_Tsn", + "ovl_En_Ds2n", + "ovl_En_Fsn", + "ovl_En_Shn", + "", + "ovl_En_Stop_heishi", + "ovl_Obj_Bigicicle", + "ovl_En_Lift_Nuts", + "ovl_En_Tk", + "", + "ovl_Bg_Market_Step", + "ovl_Obj_Lupygamelift", + "ovl_En_Test7", + "ovl_Obj_Lightblock", + "ovl_Mir_Ray2", + "ovl_En_Wdhand", + "ovl_En_Gamelupy", + "ovl_Bg_Danpei_Movebg", + "ovl_En_Snowwd", + "ovl_En_Pm", + "ovl_En_Gakufu", + "ovl_Elf_Msg4", + "ovl_Elf_Msg5", + "ovl_En_Col_Man", + "ovl_En_Talk_Gibud", + "ovl_En_Giant", + "ovl_Obj_Snowball", + "ovl_Boss_Hakugin", + "ovl_En_Gb2", + "ovl_En_Onpuman", + "ovl_Bg_Tobira01", + "ovl_En_Tag_Obj", + "ovl_Obj_Dhouse", + "ovl_Obj_Hakaisi", + "ovl_Bg_Hakugin_Switch", + "", + "ovl_En_Snowman", + "ovl_TG_Sw", + "ovl_En_Po_Sisters", + "ovl_En_Pp", + "ovl_En_Hakurock", + "ovl_En_Hanabi", + "ovl_Obj_Dowsing", + "ovl_Obj_Wind", + "ovl_En_Racedog", + "ovl_En_Kendo_Js", + "ovl_Bg_Botihasira", + "ovl_En_Fish2", + "ovl_En_Pst", + "ovl_En_Poh", + "ovl_Obj_Spidertent", + "ovl_En_Zoraegg", + "ovl_En_Kbt", + "ovl_En_Gg", + "ovl_En_Maruta", + "ovl_Obj_Snowball2", + "ovl_En_Gg2", + "ovl_Obj_Ghaka", + "ovl_En_Dnp", + "ovl_En_Dai", + "ovl_Bg_Goron_Oyu", + "ovl_En_Kgy", + "ovl_En_Invadepoh", + "ovl_En_Gk", + "ovl_En_An", + "", + "ovl_En_Bee", + "ovl_En_Ot", + "ovl_En_Dragon", + "ovl_Obj_Dora", + "ovl_En_Bigpo", + "ovl_Obj_Kendo_Kanban", + "ovl_Obj_Hariko", + "ovl_En_Sth", + "ovl_Bg_Sinkai_Kabe", + "ovl_Bg_Haka_Curtain", + "ovl_Bg_Kin2_Bombwall", + "ovl_Bg_Kin2_Fence", + "ovl_Bg_Kin2_Picture", + "ovl_Bg_Kin2_Shelf", + "ovl_En_Rail_Skb", + "ovl_En_Jg", + "ovl_En_Tru_Mt", + "ovl_Obj_Um", + "ovl_En_Neo_Reeba", + "ovl_Bg_Mbar_Chair", + "ovl_Bg_Ikana_Block", + "ovl_Bg_Ikana_Mirror", + "ovl_Bg_Ikana_Rotaryroom", + "ovl_Bg_Dblue_Balance", + "ovl_Bg_Dblue_Waterfall", + "ovl_En_Kaizoku", + "ovl_En_Ge2", + "ovl_En_Ma_Yts", + "ovl_En_Ma_Yto", + "ovl_Obj_Tokei_Turret", + "ovl_Bg_Dblue_Elevator", + "ovl_Obj_Warpstone", + "ovl_En_Zog", + "ovl_Obj_Rotlift", + "ovl_Obj_Jg_Gakki", + "ovl_Bg_Inibs_Movebg", + "ovl_En_Zot", + "ovl_Obj_Tree", + "ovl_Obj_Y2lift", + "ovl_Obj_Y2shutter", + "ovl_Obj_Boat", + "ovl_Obj_Taru", + "ovl_Obj_Hunsui", + "ovl_En_Jc_Mato", + "ovl_Mir_Ray3", + "ovl_En_Zob", + "ovl_Elf_Msg6", + "ovl_Obj_Nozoki", + "ovl_En_Toto", + "ovl_En_Railgibud", + "ovl_En_Baba", + "ovl_En_Suttari", + "ovl_En_Zod", + "ovl_En_Kujiya", + "ovl_En_Geg", + "ovl_Obj_Kinoko", + "ovl_Obj_Yasi", + "ovl_En_Tanron1", + "ovl_En_Tanron2", + "ovl_En_Tanron3", + "ovl_Obj_Chan", + "ovl_En_Zos", + "ovl_En_S_Goro", + "ovl_En_Nb", + "ovl_En_Ja", + "ovl_Bg_F40_Block", + "ovl_Bg_F40_Switch", + "ovl_En_Po_Composer", + "ovl_En_Guruguru", + "ovl_Oceff_Wipe5", + "ovl_En_Stone_heishi", + "ovl_Oceff_Wipe6", + "ovl_En_Scopenuts", + "ovl_En_Scopecrow", + "ovl_Oceff_Wipe7", + "ovl_Eff_Kamejima_Wave", + "ovl_En_Hg", + "ovl_En_Hgo", + "ovl_En_Zov", + "ovl_En_Ah", + "ovl_Obj_Hgdoor", + "ovl_Bg_Ikana_Bombwall", + "ovl_Bg_Ikana_Ray", + "ovl_Bg_Ikana_Shutter", + "ovl_Bg_Haka_Bombwall", + "ovl_Bg_Haka_Tomb", + "ovl_En_Sc_Ruppe", + "ovl_Bg_Iknv_Doukutu", + "ovl_Bg_Iknv_Obj", + "ovl_En_Pamera", + "ovl_Obj_HsStump", + "ovl_En_Hidden_Nuts", + "ovl_En_Zow", + "ovl_En_Talk", + "ovl_En_Al", + "ovl_En_Tab", + "ovl_En_Nimotsu", + "ovl_En_Hit_Tag", + "ovl_En_Ruppecrow", + "ovl_En_Tanron4", + "ovl_En_Tanron5", + "ovl_En_Tanron6", + "ovl_En_Daiku2", + "ovl_En_Muto", + "ovl_En_Baisen", + "ovl_En_Heishi", + "ovl_En_Demo_heishi", + "ovl_En_Dt", + "ovl_En_Cha", + "ovl_Obj_Dinner", + "ovl_Eff_Lastday", + "ovl_Bg_Ikana_Dharma", + "ovl_En_Akindonuts", + "ovl_Eff_Stk", + "ovl_En_Ig", + "ovl_En_Rg", + "ovl_En_Osk", + "ovl_En_Sth2", + "ovl_En_Yb", + "ovl_En_Rz", + "ovl_En_Scopecoin", + "ovl_En_Bjt", + "ovl_En_Bomjima", + "ovl_En_Bomjimb", + "ovl_En_Bombers", + "ovl_En_Bombers2", + "ovl_En_Bombal", + "ovl_Obj_Moon_Stone", + "ovl_Obj_Mu_Pict", + "ovl_Bg_Ikninside", + "ovl_Eff_Zoraband", + "ovl_Obj_Kepn_Koya", + "ovl_Obj_Usiyane", + "ovl_En_Nnh", + "ovl_Obj_Kzsaku", + "ovl_Obj_Milk_Bin", + "ovl_En_Kitan", + "ovl_Bg_Astr_Bombwall", + "ovl_Bg_Iknin_Susceil", + "ovl_En_Bsb", + "ovl_En_Recepgirl", + "ovl_En_Thiefbird", + "ovl_En_Jgame_Tsn", + "ovl_Obj_Jgame_Light", + "ovl_Obj_Yado", + "ovl_Demo_Syoten", + "ovl_Demo_Moonend", + "ovl_Bg_Lbfshot", + "ovl_Bg_Last_Bwall", + "ovl_En_And", + "ovl_En_Invadepoh_Demo", + "ovl_Obj_Danpeilift", + "ovl_En_Fall2", + "ovl_Dm_Al", + "ovl_Dm_An", + "ovl_Dm_Ah", + "ovl_Dm_Nb", + "ovl_En_Drs", + "ovl_En_Ending_Hero", + "ovl_Dm_Bal", + "ovl_En_Paper", + "ovl_En_Hint_Skb", + "ovl_Dm_Tag", + "ovl_En_Bh", + "ovl_En_Ending_Hero2", + "ovl_En_Ending_Hero3", + "ovl_En_Ending_Hero4", + "ovl_En_Ending_Hero5", + "ovl_En_Ending_Hero6", + "ovl_Dm_Gm", + "ovl_Obj_Swprize", + "ovl_En_Invisible_Ruppe", + "ovl_Obj_Ending", + "ovl_En_Rsn", +] + +script_dir = os.path.dirname(os.path.realpath(__file__)) +repo = script_dir + os.sep + ".." + os.sep + ".." + os.sep + +def as_word(b, off=0): + return struct.unpack(">I", b[off:off+4])[0] + +def as_word_list(b): + return [i[0] for i in struct.iter_unpack(">I", b)] + +def null_or_ptr(w): + return (w == 0) or (w >= 0x80000000 and w < 0x81000000) + +# (name, vrom_st, vrom_end, vram_st, vram_end) +def read_actor_ovl_tbl(): + actortbl = [] + with open(repo + "decomp/code","rb") as codefile: + codefile.seek(0x109510) # actor overlay table offset into code + entry = as_word_list(codefile.read(0x20)) + i = 0 + while (entry[4] == 0x00000000 and all([null_or_ptr(e) for e in entry[2:4]]) and + ((entry[7] & 0xFFFF) == 0) and (null_or_ptr(entry[5]))): + actortbl.append((actor_names[i], entry[0], entry[1], entry[2], entry[3])) + entry = as_word_list(codefile.read(0x20)) + i += 1 + return actortbl + +actor_tbl = read_actor_ovl_tbl() + +def resolve_symbol(address): + """ + Returns (overlay file path, file offset) from a given VRAM address + """ + for entry in actor_tbl: + if address >= 0x80000000: + if entry[3] <= address < entry[4]: + return repo + "decomp" + os.sep + entry[0], address - entry[3] + else: + if entry[1] <= address < entry[2]: + return repo + "decomp" + os.sep + entry[0], address - entry[1] + else: + return None, None + +def HexParse(s): + return int(s, 16) + +if __name__ == '__main__': + parser = argparse.ArgumentParser() + parser.add_argument('address', help="VRAM or VROM address to get overlay file and offset for", type=HexParse) + + args = parser.parse_args() + + file_path,offset = resolve_symbol(args.address) + print(f"0x{args.address:08X} is 0x{offset:X} into {file_path}") diff --git a/tools/overlayhelpers/colliderinit.py b/tools/overlayhelpers/colliderinit.py new file mode 100644 index 0000000000..44b8444775 --- /dev/null +++ b/tools/overlayhelpers/colliderinit.py @@ -0,0 +1,452 @@ +#!/usr/bin/env python3 + +import os +import struct +import argparse +from actor_symbols import resolve_symbol + +T_DEFAULT = '' +TType1 = 'Type1' +T_ACTOR = '_Actor' + +TYPE_ENUM = [ + "COLTYPE_HIT0", + "COLTYPE_HIT1", + "COLTYPE_HIT2", + "COLTYPE_HIT3", + "COLTYPE_HIT4", + "COLTYPE_HIT5", + "COLTYPE_HIT6", + "COLTYPE_HIT7", + "COLTYPE_HIT8", + "COLTYPE_METAL", + "COLTYPE_NONE", + "COLTYPE_WOOD", + "COLTYPE_HARD", + "COLTYPE_TREE" ] + +SHAPE_ENUM = [ + "COLSHAPE_JNTSPH", + "COLSHAPE_CYLINDER", + "COLSHAPE_TRIS", + "COLSHAPE_QUAD", + "COLSHAPE_SPHERE" ] + +ELEMTYPE_UNKENUM = [ + "ELEMTYPE_UNK0", + "ELEMTYPE_UNK1", + "ELEMTYPE_UNK2", + "ELEMTYPE_UNK3", + "ELEMTYPE_UNK4", + "ELEMTYPE_UNK5", + "ELEMTYPE_UNK6"] + +ATFLAGS_ENUM = [ + "AT_ON", + "AT_HIT", + "AT_BOUNCED", + "AT_TYPE_PLAYER", + "AT_TYPE_ENEMY", + "AT_TYPE_OTHER", + "AT_SELF"] + +ACFLAGS_ENUM = [ + "AC_ON", + "AC_HIT", + "AC_HARD", + "AC_TYPE_PLAYER", + "AC_TYPE_ENEMY", + "AC_TYPE_OTHER", + "AC_NO_DAMAGE", + "AC_BOUNCED"] + +OCFLAGS_ENUM = [ + "OC1_ON", + "OC1_HIT", + "OC1_NO_PUSH", + "OC1_TYPE_PLAYER", + "OC1_TYPE_1", + "OC1_TYPE_2"] + +OCTYPE_ENUM = [ + "OC2_HIT_PLAYER", + "OC2_UNK1", + "OC2_UNK2", + "OC2_TYPE_PLAYER", + "OC2_TYPE_1", + "OC2_TYPE_2", + "OC2_FIRST_ONLY"] + +TOUCHERFLAGS_ENUM = [ + "TOUCH_ON", + "TOUCH_HIT", + "TOUCH_NEAREST", + "TOUCH_SFX_HARD", + "TOUCH_SFX_WOOD", + "TOUCH_AT_HITMARK", + "TOUCH_DREW_HITMARK", + "TOUCH_UNK7"] + +BUMPERFLAGS_ENUM = [ + "BUMP_ON", + "BUMP_HIT", + "BUMP_HOOKABLE", + "BUMP_NO_AT_INFO", + "BUMP_NO_DAMAGE", + "BUMP_NO_SWORD_SFX", + "BUMP_NO_HITMARK", + "BUMP_DRAW_HITMARK"] + +OCELEMFLAGS_ENUM = [ + "OCELEM_ON", + "OCELEM_HIT", + "OCELEM_UNK2", + "OCELEM_UNK3", + "OCELEM_UNK4", + "OCELEM_UNK5", + "OCELEM_UNK6", + "OCELEM_UNK7",] + +sf_ColliderInit = ">BBBBBB" +sf_ColliderInitType1 = ">BBBBB" +sf_ColliderInitToActor = ">IBBBB" +sf_ColliderBodyInit = ">B3xIBB2xIBB2xBBB" +sf_JntSph = ">II" +sf_JntSphElement = ">Bx5h" +sf_Cylinder16 = ">6h" +sf_Tris = ">II" +sf_TrisElement = ">9f" +sf_Quad = ">12f" +sf_Sphere = sf_JntSphElement + +f_ColliderInit = "{{ {0}, {1}, {2}, {3}, {4}, {5}, }}" +f_ColliderInitType1 = "{{ {0}, {1}, {2}, {3}, {4}, }}" +f_ColliderInitToActor = "{{ {0}, {1}, {2}, {3}, {4}, }}" +f_ColliderBodyInit = "{{ {0}, {{ 0x{1:08X}, 0x{2:02X}, 0x{3:02X} }}, {{ 0x{4:08X}, 0x{5:02X}, 0x{6:02X} }}, {7}, {8}, {9}, }}" +f_JntSph = "{0}, D_{1:08X}" +f_JntSphElement = "{{ {0}, {{ {{ {1}, {2}, {3} }}, {4} }}, {5} }}" +f_Cylinder16 = "{{ {0}, {1}, {2}, {{ {3}, {4}, {5} }} }}" +f_Tris = "{0}, D_{1:08X}" +f_TrisElement = "{{ {{ {{ {0}f, {1}f, {2}f }}, {{ {3}f, {4}f, {5}f }}, {{ {6}f, {7}f, {8}f }} }} }}" +f_Quad = "{{ {{ {{ {0}f, {1}f, {2}f }}, {{ {3}f, {4}f, {5}f }}, {{ {6}f, {7}f, {8}f }}, {{ {9}f, {10}f, {11}f }} }} }}" +f_Sphere = f_JntSphElement + +def GetATflags(at): + for i, flag in enumerate(ATFLAGS_ENUM): + if(i == 0): + if(at & (1 << i)): + output = "AT_ON" + else: + output = "AT_NONE" + elif(at & (1 << i)): + output += " | " + flag + return output.replace("AT_TYPE_PLAYER | AT_TYPE_ENEMY | AT_TYPE_OTHER","AT_TYPE_ALL") + +def GetACflags(at): + for i, flag in enumerate(ACFLAGS_ENUM): + if(i == 0): + if(at & (1 << i)): + output = "AC_ON" + else: + output = "AC_NONE" + elif(at & (1 << i)): + output += " | " + flag + return output.replace("AC_TYPE_OTHER | AC_TYPE_ENEMY | AC_TYPE_PLAYER","AC_TYPE_ALL") + +def GetOCflags(at): + for i, flag in enumerate(OCFLAGS_ENUM): + if(i == 0): + if(at & (1 << i)): + output = "OC1_ON" + else: + output = "OC1_NONE" + elif(at & (1 << i)): + output += " | " + flag + return output.replace("OC1_TYPE_PLAYER | OC1_TYPE_1 | OC1_TYPE_2","OC1_TYPE_ALL") + +def GetOCtype(at): + output = "" + for i, flag in enumerate(OCTYPE_ENUM): + if(at & (1 << i)): + output = " | " + flag + output + if(output == ""): + return "OC2_NONE" + else: + return output.strip(" | ") + +def GetToucherFlags(at): + for i, flag in enumerate(TOUCHERFLAGS_ENUM): + if(i == 0): + if(at & (1 << i)): + output = "TOUCH_ON" + else: + output = "TOUCH_NONE" + elif(at & (1 << i)): + output += " | " + flag + if(i == 4 and output.find("SFX") == -1 and output.find("OFF") == -1): + output += " | TOUCH_SFX_NORMAL" + return output.replace("TOUCH_SFX_HARD | TOUCH_SFX_WOOD", "TOUCH_SFX_NONE") + +def GetBumperFlags(at): + for i, flag in enumerate(BUMPERFLAGS_ENUM): + if(i == 0): + if(at & (1 << i)): + output = "BUMP_ON" + else: + output = "BUMP_NONE" + elif(at & (1 << i)): + output += " | " + flag + return output + +def GetOcElemFlags(at): + for i, flag in enumerate(OCELEMFLAGS_ENUM): + if(i == 0): + if(at & (1 << i)): + output = "OCELEM_ON" + else: + output = "OCELEM_NONE" + elif(at & (1 << i)): + output += " | " + flag + return output + +def GetColliderFormat(type): + if type == T_DEFAULT: + return (sf_ColliderInit, f_ColliderInit) + if type == TType1: + return (sf_ColliderInitType1, f_ColliderInitType1) + if type == T_ACTOR: + return (sf_ColliderInitToActor, f_ColliderInitToActor) + return None + +def GetColliderStr(data, off, type): + cf = GetColliderFormat(type) + cBase = list(struct.unpack_from(cf[0], data, off)) + if type == T_ACTOR: + if cBase[0] == 0: + cBase[0] = 'NULL' + else: + cBase[0] = '0x{0:08X}'.format(cBase[0]) + else: + if cBase[0] < 14: + cBase[0] = TYPE_ENUM[cBase[0]] + else: + cBase[0] = '0x{0:02X}'.format(cBase[0]) + + cBase[1] = GetATflags(cBase[1]) + cBase[2] = GetACflags(cBase[2]) + cBase[3] = GetOCflags(cBase[3]) + + if type == T_DEFAULT: + cBase[4] = GetOCtype(cBase[4]) + i = 5 + else: + i = 4 + + if cBase[i] < 5: + cBase[i] = SHAPE_ENUM[cBase[i]] + else: + cBase[i] = '0x{0:02X}'.format(cBase[i]) + + return cf[1].format(*cBase) + +def GetItems(data, off, count, structf, fmt, size): + result = '' + for i in range(count): + ioff = (i * size) + cBody = list(struct.unpack_from(sf_ColliderBodyInit, data, off + ioff)) + cItem = struct.unpack_from(structf, data, off + 0x18 + ioff) + + if cBody[0] < 7: + cBody[0] = ELEMTYPE_UNKENUM[cBody[0]] + else: + cBody[0] = '0x{0:02X}'.format(cBody[0]) + + cBody[7] = GetToucherFlags(cBody[7]) + cBody[8] = GetBumperFlags(cBody[8]) + cBody[9] = GetOcElemFlags(cBody[9]) + + result += ''' + {{ + {0}, + {1}, + }},'''.format(f_ColliderBodyInit.format(*cBody), fmt.format(*cItem)) + return result + +def GetJntSphElements(data, off, count): + items = GetItems(data, off, count, sf_JntSphElement, f_JntSphElement, 0x24) + return(''' +static ColliderJntSphElementInit sJntSphElementsInit[{0}] = {{{1} +}}; +'''.format(count, items)) + +def GetJntSph(data, off, type): + sBase = GetColliderStr(data, off, type) + cJntSph = struct.unpack_from(sf_JntSph, data, off + 8) + + return(''' +static ColliderJntSphInit{0} sJntSphInit = {{ + {1}, + {2}, +}}; +'''.format(type, sBase, f_JntSph.format(*cJntSph))) + + +def GetTrisElements(data, off, count): + items = GetItems(data, off, count, sf_TrisElement, f_TrisElement, 0x3C) + return(''' +static ColliderTrisElementInit sTrisElementsInit[{0}] = {{{1} +}}; +'''.format(count, items)) + + +def GetCylinder(data, off, type): + sBase = GetColliderStr(data, off, type) + cBody = list(struct.unpack_from(sf_ColliderBodyInit, data, off + 0x08)) + cCyl16 = struct.unpack_from(sf_Cylinder16, data, off + 0x20) + + if cBody[0] < 7: + cBody[0] = ELEMTYPE_UNKENUM[cBody[0]] + else: + cBody[0] = '0x{0:02X}'.format(cBody[0]) + + cBody[7] = GetToucherFlags(cBody[7]) + cBody[8] = GetBumperFlags(cBody[8]) + cBody[9] = GetOcElemFlags(cBody[9]) + + return(''' +static ColliderCylinderInit{0} sCylinderInit = {{ + {1}, + {2}, + {3}, +}}; +'''.format(type,sBase,f_ColliderBodyInit.format(*cBody),f_Cylinder16.format(*cCyl16))) + +def GetTris(data, off, type): + sBase = GetColliderStr(data, off, type) + cTris = struct.unpack_from(sf_Tris, data, off + 8) + + return(''' +static ColliderTrisInit{0} sTrisInit = {{ + {1}, + {2}, +}}; +'''.format(type, sBase, f_Tris.format(*cTris))) + +def GetQuad(data, off, type): + sBase = GetColliderStr(data, off, type) + cBody = list(struct.unpack_from(sf_ColliderBodyInit, data, off + 0x08)) + cQuad = struct.unpack_from(sf_Quad, data, off + 0x20) + + if cBody[0] < 7: + cBody[0] = ELEMTYPE_UNKENUM[cBody[0]] + else: + cBody[0] = '0x{0:02X}'.format(cBody[0]) + + cBody[7] = GetToucherFlags(cBody[7]) + cBody[8] = GetBumperFlags(cBody[8]) + cBody[9] = GetOcElemFlags(cBody[9]) + + return(''' +static ColliderQuadInit{0} sQuadInit = {{ + {1}, + {2}, + {3}, +}}; +'''.format(type, sBase, f_ColliderBodyInit.format(*cBody), f_Quad.format(*cQuad))) + +def GetSphere(data, off, type): + sBase = GetColliderStr(data, off, type) + cBody = list(struct.unpack_from(sf_ColliderBodyInit, data, off + 0x08)) + cSphere = struct.unpack_from(sf_Sphere, data, off + 0x20) + + if cBody[0] < 7: + cBody[0] = ELEMTYPE_UNKENUM[cBody[0]] + else: + cBody[0] = '0x{0:02X}'.format(cBody[0]) + + cBody[7] = GetToucherFlags(cBody[7]) + cBody[8] = GetBumperFlags(cBody[8]) + cBody[9] = GetOcElemFlags(cBody[9]) + + return(''' +static ColliderSphereInit{0} sSphereInit = {{ + {1}, + {2}, + {3}, +}}; +'''.format(type, sBase, f_ColliderBodyInit.format(*cBody), f_Sphere.format(*cSphere))) + +def GetColliderInit(address, type, num): + TYPE_DICT = { + 'ColliderJntSphInit' : (GetJntSph, 'Shape', T_DEFAULT), + 'ColliderCylinderInit' : (GetCylinder, 'Shape', T_DEFAULT), + 'ColliderTrisInit': (GetTris, 'Shape', T_DEFAULT), + 'ColliderQuadInit': (GetQuad, 'Shape', T_DEFAULT), + 'ColliderSphereInit': (GetSphere, 'Shape', T_DEFAULT), + 'ColliderJntSphElementInit' : (GetJntSphElements, 'Item'), + 'ColliderTrisElementInit' : (GetTrisElements, 'Item') + } + + update = [(k, v[0]) for k,v in TYPE_DICT.items() if v[1] == 'Shape'] + for i in update: + for j in (TType1, T_ACTOR): + TYPE_DICT[i[0] + j] = (i[1], 'Shape', j) + + fileResult = resolve_symbol(address) + + if fileResult[0] is None: + return("Invalid address") + + print(hex(fileResult[1]), "in", fileResult[0].split(os.sep)[-1]) + + selectedType = TYPE_DICT[type] + arg2 = None + if selectedType[1] == 'Shape': + arg2 = selectedType[2] + elif num > 0: + arg2 = num + else: + return("ItemInit type must specify number of elements") + + ovlFile = open(fileResult[0], "rb") + ovlData = bytearray(ovlFile.read()) + ovlFile.close() + + return selectedType[0](ovlData, fileResult[1], arg2) + +def GetColliderInitFull(address, type, num): + if(type.find('Element') != -1): + return GetColliderInit(address, type, num) + + base = GetColliderInit(address, type, 0) + + if(type.find('JntSph') != -1): + [num, address2, dummy] = base.split('\n')[3].split(',') + hexaddress = int(address2.strip(' D_'), 16) + if(hexaddress == 0): + return base.replace(address2,' NULL') + else: + elements = GetColliderInit(hexaddress, 'ColliderJntSphElementInit', int(num)) + return elements + base.replace(address2,' sJntSphElementsInit') + elif(type.find('Tris') != -1): + [num, address2, dummy] = base.split('\n')[3].split(',') + hexaddress = int(address2.strip(' D_'), 16) + if(hexaddress == 0): + return base.replace(address2,' NULL') + else: + elements = GetColliderInit(hexaddress, 'ColliderTrisElementInit', int(num)) + return elements + base.replace(address2,' sTrisElementsInit') + else: + return base + +def HexParse(s): + return int(s, 16) + +parser = argparse.ArgumentParser() +parser.add_argument('address', help="VRAM or VROM address of the struct", type=HexParse) +parser.add_argument('type', help="Type name (e.g. ColliderQuadInit)") +parser.add_argument('num', nargs='?', default=0, type=HexParse, help="Number of elements. Only applies to ItemInit types") + +args = parser.parse_args() + +print(GetColliderInitFull(args.address, args.type, args.num)) diff --git a/tools/overlayhelpers/ichaindis.py b/tools/overlayhelpers/ichaindis.py new file mode 100644 index 0000000000..7b5767e111 --- /dev/null +++ b/tools/overlayhelpers/ichaindis.py @@ -0,0 +1,93 @@ +#!/usr/bin/python3 + +import os +import sys +import struct +import argparse +import re +from actor_symbols import resolve_symbol + +ICHAIN_MACROS = [ + 'ICHAIN_U8', + 'ICHAIN_S8', + 'ICHAIN_U16', + 'ICHAIN_S16', + 'ICHAIN_U32', + 'ICHAIN_S32', + 'ICHAIN_F32', + 'ICHAIN_F32_DIV1000', + 'ICHAIN_VEC3F', + 'ICHAIN_VEC3F_DIV1000', + 'ICHAIN_VEC3S', +] + +Z64_ACTOR_PATH = "../../include/z64actor.h" + +def get_actor_var_names(): + in_actor = False + actor_vars = {} + with open(os.path.dirname(os.path.realpath(__file__)) + os.sep + Z64_ACTOR_PATH) as actor_h: + for line in actor_h: + if in_actor: + if "}" in line: + # Reached the end of the actor struct so break out + break + + # Parse out the memory address (from the comment) and the variable name + regex = r'.*\/\* (.*) \*\/\s+(struct)?\s*.+\s+(.+);.*' + actor_var_info = re.match(regex, line) + + if actor_var_info: + # Strip off the 0x0* part and store it + new_var_index = re.sub('0x0*', '', actor_var_info[1]) + actor_vars[new_var_index] = actor_var_info[3] + + elif "typedef struct Actor {" in line: + # Found the Actor struct + in_actor = True + return actor_vars + +def HexParse(s): + return int(s, 16) + +def main(): + parser = argparse.ArgumentParser(description='Decompiles an InitChain') + parser.add_argument('address', help='VRAM or VROM address of an InitChain', type=HexParse) + parser.add_argument('--names', action="store_true", help='Retrieve variable names from the actor struct') + args = parser.parse_args() + + file_path, file_offset = resolve_symbol(args.address) + + with open(file_path, 'rb') as f: + filedata = f.read() + + print ('static InitChainEntry sInitChain[] = {') + + if args.names: + actor_variable_names = get_actor_var_names() + + while True: + entry = struct.unpack('>I', filedata[file_offset:file_offset+4])[0] + file_offset += 4 + + cont = entry >> 31 + t = (entry >> 27) & 0xF + offset = ((entry) >> 16) & 0x7FF + value = (entry) & 0xFFFF + if value >= 0x8000 and not ICHAIN_MACROS[t].startswith('ICHAIN_U'): + value -= 0x10000 + + var_name = '{0:X}'.format(offset) + + if args.names and var_name in actor_variable_names: + var_name = actor_variable_names[var_name] + else: + var_name = "unk_" + var_name + + print(' {0}({1}, {2}, {3}),'.format(ICHAIN_MACROS[t], var_name, value, ('ICHAIN_CONTINUE' if cont == 1 else 'ICHAIN_STOP'))) + if cont == 0: + break + print ('};') + +if __name__ == "__main__": + main() diff --git a/undef.txt b/undef.txt index 3eafbaecd2..06ede1c635 100644 --- a/undef.txt +++ b/undef.txt @@ -174,7 +174,6 @@ D_801EDE30 = code_bss_start + 0x00009E90; D_801EDE40 = code_bss_start + 0x00009EA0; D_801EDE78 = code_bss_start + 0x00009ED8; D_801EDEB0 = code_bss_start + 0x00009F10; -D_801EDEBC = code_bss_start + 0x00009F1C; D_801EDEC8 = code_bss_start + 0x00009F28; D_801EDF00 = code_bss_start + 0x00009F60; D_801EDF38 = code_bss_start + 0x00009F98; @@ -182,30 +181,19 @@ D_801EDF48 = code_bss_start + 0x00009FA8; D_801EDF58 = code_bss_start + 0x00009FB8; D_801EDF90 = code_bss_start + 0x00009FF0; D_801EDFC8 = code_bss_start + 0x0000A028; -D_801EDFD4 = code_bss_start + 0x0000A034; D_801EDFE0 = code_bss_start + 0x0000A040; D_801EDFF0 = code_bss_start + 0x0000A050; D_801EE000 = code_bss_start + 0x0000A060; D_801EE038 = code_bss_start + 0x0000A098; D_801EE070 = code_bss_start + 0x0000A0D0; -D_801EE0A4 = code_bss_start + 0x0000A104; D_801EE0D8 = code_bss_start + 0x0000A138; D_801EE0E8 = code_bss_start + 0x0000A148; -D_801EE11C = code_bss_start + 0x0000A17C; D_801EE150 = code_bss_start + 0x0000A1B0; D_801EE188 = code_bss_start + 0x0000A1E8; D_801EE1C0 = code_bss_start + 0x0000A220; -D_801EE1C4 = code_bss_start + 0x0000A224; -D_801EE1C8 = code_bss_start + 0x0000A228; D_801EE1D0 = code_bss_start + 0x0000A230; -D_801EE1D4 = code_bss_start + 0x0000A234; -D_801EE1D8 = code_bss_start + 0x0000A238; D_801EE1E0 = code_bss_start + 0x0000A240; -D_801EE1E4 = code_bss_start + 0x0000A244; -D_801EE1E8 = code_bss_start + 0x0000A248; D_801EE1F0 = code_bss_start + 0x0000A250; -D_801EE1F4 = code_bss_start + 0x0000A254; -D_801EE1F8 = code_bss_start + 0x0000A258; D_801EE200 = code_bss_start + 0x0000A260; D_801EE6C8 = code_bss_start + 0x0000A728; D_801EE700 = code_bss_start + 0x0000A760;