#include "COL.h" #include "CBall.h" #include "CPlayer.h" #include "GM.h" #include "XMATH.h" #include "GU.h" #include "GL.h" #include "SNDGAME.h" #include "Util.h" struct TLimbInfo { int field_0; int field_4; }; struct tBoneNodeInfo { int i_0; int i_4; }; // 0033E918 TLimbInfo COL_tLimbInfo[14] = { {20, 2}, {21, 20}, {5, 15}, {15, 9}, {9, 11}, {24, 34}, {34, 28}, {28, 30}, {12, 4}, {4, 8}, {8, 13}, {31, 23}, {23, 27}, {27, 32}}; tBoneNodeInfo COL_tBoneNodeInfo[42] = { {0, 0}, {0, 0}, {1, 4096}, {0, 0}, {1, 3276}, {1, 3072}, {0, 0}, {0, 0}, {1, 2730}, {1, 3072}, {0, 0}, {1, 3072}, {1, 4096}, {1, 3276}, {0, 0}, {1, 3072}, {0, 0}, {0, 0}, {0, 3072}, {0, 3072}, {1, 4096}, {1, 8192}, {0, 0}, {1, 3276}, {1, 3072}, {0, 0}, {0, 0}, {1, 2730}, {1, 3072}, {0, 0}, {1, 3072}, {1, 4096}, {1, 3276}, {0, 0}, {1, 3072}, {0, 0}, {0, 0}, {0, 3072}, {0, 3072}, {0, 0}, {0, 0}, {0, 0}}; void COL_PlayerBallCollideEvent(CPlayer *pPlayer_0, int i_1, bool &b_2) { TAnimData *tAnimData_r7; // r7 CPlayer *pPlarer_r0; // r0 CPlayer *pPlayer_r8 = 0; // r8 int iStance_r0; // r0 int i_r1; // r1 TPoint v18; // r2 TPoint v20; // r2 TPoint tPoint_r0; // r0 int i_v23_54; // [sp+Ch] [bp-54h] TPoint tPoint_4C; // [sp+14h] [bp-4Ch] BYREF int i_mag_44; // [sp+1Ch] [bp-44h] BYREF TPoint3D t_Point3D_40; // [sp+20h] [bp-40h] BYREF TPoint3D tPoint_30; // [sp+30h] [bp-30h] BYREF // 00171E98 tAnimData_r7 = pPlayer_0->GetAnimData(); // call 001704DC pPlarer_r0 = tGame.allplay_14[tGame.mTLogic_6678.team_40] .teamlist_0[tGame.mTLogic_6678.player_3C]; if (pPlarer_r0->uc_88) pPlayer_r8 = tGame.allplay_14[tGame.mTLogic_6678.team_40] .teamlist_0[tGame.mTLogic_6678.player_3C]; // 00171ED8 if (i_1 != -1) { // 00171EDC i_v23_54 = pPlayer_0->tStr32_44.uc_0; if (XMATH_Distance3D(&cBall.ballPosPrev_4, &tGame.mTMath_6734.field_370) < tGame.mTMath_6734.field_388[0] + tGame.mTMath_6734.field_388[1]) // call 001F3490 { // 00171F0E tPoint_30.point_0.dx_0 = cBall.ballPosPrev_4.point_0.dx_0 - tGame.mTMath_6734.field_370.point_0.dx_0; tPoint_30.point_0.dy_4 = cBall.ballPosPrev_4.point_0.dy_4 - tGame.mTMath_6734.field_370.point_0.dy_4; tPoint_30.dz_8 = cBall.ballPosPrev_4.dz_8 - tGame.mTMath_6734.field_370.dz_8; XMATH_Normalize(&tPoint_30, tGame.mTMath_6734.field_388[0] + tGame.mTMath_6734.field_388[1]); // call 001F2586 cBall.ballPosPrev_4.point_0.dx_0 = tGame.mTMath_6734.field_370.point_0.dx_0 + tPoint_30.point_0.dx_0; cBall.ballPosPrev_4.point_0.dy_4 = tGame.mTMath_6734.field_370.point_0.dy_4 + tPoint_30.point_0.dy_4; cBall.ballPosPrev_4.dz_8 = tPoint_30.dz_8 + tGame.mTMath_6734.field_370.dz_8; } /// 171F58 if (tGame.field_6C34 <= 2 && tGame.mTLogic_6678.field_48 == 11 && tGame.mTLogic_6678.field_44 == pPlayer_0->tStr32_44.uc_0 && tGame.mTLogic_6678.field_50 == pPlayer_0->tStr32_44.uc_1 /// 00171F88 && (tGame.mTMath_6734.field_370.point_0.dy_4 - tGame.mTMath_6734.field_37C.point_0.dy_4) / 1024 * cBall.ballMovePrev_10.point_0.dy_4 / 256 + cBall.ballMovePrev_10.point_0.dx_0 * ((tGame.mTMath_6734.field_370.point_0.dx_0 - tGame.mTMath_6734.field_37C.point_0.dx_0) / 1024) / 256 + cBall.ballMovePrev_10.dz_8 * ((tGame.mTMath_6734.field_370.dz_8 - tGame.mTMath_6734.field_37C.dz_8) / 1024) / 256 <= -1) { tGame.field_6C34 = 0; } else { // 0017200A pPlayer_0->field_14C = i_1; i_mag_44 = XMATH_Mag3D(&cBall.ballMovePrev_10); // call 001F3274 if ((pPlayer_0->tStr32_44.field_8 & 0xFFFFFFFE) == 8) // 00172024 { // 00172024 iStance_r0 = (pPlayer_0->tStr32_44.field_14 - tAnimData_r7->filed_20[0].filed_0) / pPlayer_0->tStr32_44.field_1C; // call 002A3CC0 if (iStance_r0 < 0) { iStance_r0 = -iStance_r0; // 00172036 } // 00172038 if (iStance_r0 > 3) { // 001720A4 tPoint_4C = XMATH_Project(pPlayer_0->u_0.s_2_0.s_2, 0x8000); // 001F32DC if (i_mag_44 <= 2136) i_mag_44 = 2136; // 001720C8 t_Point3D_40.point_0 = tPoint_4C; t_Point3D_40.dz_8 = (tGame.mTMath_6734.field_37C.dz_8 - tGame.mTMath_6734.field_370.dz_8) / 8; XMATH_Normalize( &t_Point3D_40, (4 * (uint)i_mag_44) / 5u); // call 002A3C14 //call 001F2586 } else { // 0017203C t_Point3D_40.dz_8 = pPlayer_0->aPoint3D_178[1].dz_8; t_Point3D_40.point_0 = pPlayer_0->aPoint3D_178[1].point_0; } // 001720EE cBall.SetVel(t_Point3D_40.point_0.dx_0, t_Point3D_40.point_0.dy_4, t_Point3D_40.dz_8); // 00157668 b_2 = 1; } else { // 0017204C t_Point3D_40.point_0.dx_0 = tGame.mTMath_6734.field_37C.point_0.dx_0 - tGame.mTMath_6734.field_370.point_0.dx_0; t_Point3D_40.point_0.dy_4 = tGame.mTMath_6734.field_37C.point_0.dy_4 - tGame.mTMath_6734.field_370.point_0.dy_4; t_Point3D_40.dz_8 = (tGame.mTMath_6734.field_37C.dz_8 - tGame.mTMath_6734.field_370.dz_8) / 8; XMATH_Normalize(&t_Point3D_40, i_mag_44); // call 001F2586 // 0017208C if ((pPlayer_r8 == 0 || pPlayer_r8 == pPlayer_0)) // call 001F328A { // 00172098 cBall.SetVel(t_Point3D_40.point_0.dx_0, t_Point3D_40.point_0.dy_4, t_Point3D_40.dz_8); // call 00157668 } else { // loc_1721CE if(XMATH_Mag(&pPlayer_r8->Point3D_14.point_0)>(i_mag_44/2)){ GM_DeflectBallFromDribbler(pPlayer_0, &i_mag_44); // 00171E50 b_2 = 1; }else{ // 00172098 cBall.SetVel(t_Point3D_40.point_0.dx_0, t_Point3D_40.point_0.dy_4, t_Point3D_40.dz_8); // call 00157668 } } } // 001720FE i_r1 = 0xFA5; if (i_mag_44 / 2 > 0xFA5) i_r1 = i_mag_44 / 2; // 0017210C XMATH_Normalize(&cBall.ballMovePrev_10, i_r1); if (pPlayer_r8 == 0 || pPlayer_r8 == pPlayer_0) { cBall.SetVelRel(pPlayer_0->point_20.dx_0 / 4, pPlayer_0->point_20.dy_4 / 4, 0); // call 00157678 } // 0017213A if (pPlayer_0->tStr32_44.uc_0 == 2) { // 00172142 tGame.field_6C34 = 0; tGame.mTLogic_6678.field_48 = 11; } else { // 00172154 GL_SetTouch(i_v23_54, pPlayer_0->tStr32_44.uc_1, (pPlayer_0->tStr32_44.field_8 | 1) == 9, EKickType_11, "Deflection"); } // 00172174 if (pPlayer_0->tStr32_44.field_8 != 8 && pPlayer_0->tStr32_44.field_8 != 15) { // 00172190 if ((int)cBall.speedXY_28 < 16021) { // 001721F6 if ((int)cBall.speedXY_28 < 10681) { // 00172230 tPoint_r0.dx_0 = cBall.point3D_44.point_0.dx_0 / 8 + pPlayer_0->Point3D_14.point_0.dx_0 / 2; tPoint_r0.dy_4 = cBall.point3D_44.point_0.dy_4 / 8 + pPlayer_0->Point3D_14.point_0.dy_4 / 2; pPlayer_0->Point3D_14.point_0 = tPoint_r0; } else { // 001721FE v20 = pPlayer_0->point_20; tPoint_4C.dx_0 = v20.dx_0 + cBall.point3D_44.point_0.dx_0 / 8; tPoint_4C.dy_4 = v20.dy_4 + cBall.point3D_44.point_0.dy_4 / 8; pPlayer_0->Trip(0, GU_GetRot(&tPoint_4C)); } } else { // 0017219C v18 = pPlayer_0->point_20; tPoint_4C.dx_0 = v18.dx_0 + cBall.point3D_44.point_0.dx_0 / 8; tPoint_4C.dy_4 = v18.dy_4 + cBall.point3D_44.point_0.dy_4 / 8; pPlayer_0->Fell(GU_GetRot(&tPoint_4C), 0); } } // 0017217E cBall.Deflect(); SNDGAME_PlaySFX(0x14u); } } } //00171878 uint COL_PlayerBallCollision(CPlayer *player_0) { unsigned int iIndex_r4; // r4 int i_x_r1; // r1 TLimbInfo *pTLimbInfo_r10; // r10 int i_y_r3; // r3 TPoint v8; // d16 int i_r9; // r12 int i_r7; // r7 int i_Distance_3D; // [sp+3Ch] [bp-29Ch] TPoint3D tTPoint3Ds_48[42]; // [sp+48h] [bp-290h] BYREF TPoint3D tPoint_240; // [sp+240h] [bp-98h] BYREF TPoint3D tPoint_250; // [sp+250h] [bp-88h] BYREF TPoint3D tPoint_260; // [sp+260h] [bp-78h] BYREF TPoint3D tPoint_270; // [sp+270h] [bp-68h] BYREF uint8 b_flags_280[0x2A] = {0}; // [sp+280h] [bp-58h] // 001718B6 tPoint_270 = cBall.point3D_2C; tPoint_260 = cBall.ballPosPrev_4; i_Distance_3D = XMATH_Distance3D(&tPoint_270, &tPoint_260); // call 001F3490 iIndex_r4 = 0; // 001718DA while (iIndex_r4 <= 0xD) { // 001718DE i_x_r1 = COL_tLimbInfo[iIndex_r4].field_0; if (!b_flags_280[i_x_r1]) // 001718E6 { // 001718EC player_0->GetBonePosition(i_x_r1, &tTPoint3Ds_48[i_x_r1]); // call 001715EC //i_x_r1 = COL_tLimbInfo[iIndex_r4].field_0; b_flags_280[i_x_r1] = 1; } // 00171904 pTLimbInfo_r10 = &COL_tLimbInfo[iIndex_r4]; i_y_r3 = pTLimbInfo_r10->field_4; if (!b_flags_280[i_y_r3]) // 0017190E { // 00171910 player_0->GetBonePosition(pTLimbInfo_r10->field_4, &tTPoint3Ds_48[i_y_r3]); // call 001715EC // i_x_r1 = COL_tLimbInfo[iIndex_r4].field_0; // i_y_r3 = pTLimbInfo_r10->field_4; b_flags_280[i_y_r3] = 1; } // 0017192C tPoint_240 = tTPoint3Ds_48[i_y_r3]; tPoint_250 = tTPoint3Ds_48[i_x_r1]; // 00171958 uint u_r12 = XMATH_Distance3D(&tPoint_250, &tPoint_240); // call 001F3490 i_r7 = COL_tBoneNodeInfo[COL_tLimbInfo[iIndex_r4].field_0].i_4; // 0017198A if (i_r7 < COL_tBoneNodeInfo[pTLimbInfo_r10->field_4].i_4) i_r7 = COL_tBoneNodeInfo[pTLimbInfo_r10->field_4].i_4; // 001719C4 ++iIndex_r4; if (UTILCOL_CapsuleCapsuleCheck(tPoint_250, tPoint_240, tPoint_270, tPoint_260, i_r7, 0x1000, u_r12, i_Distance_3D)) // call 001787A0 return iIndex_r4 - 1; } return -1; }