Explorar el Código

GM_GetPlayerFutureNearestLineWeighted bugfix

DESKTOP-AB9OQPJ\RED-10 hace 3 años
padre
commit
0692ffa014
Se han modificado 7 ficheros con 216 adiciones y 18 borrados
  1. 6 4
      jni/CAnimManager.cpp
  2. 141 8
      jni/CPlayer.cpp
  3. 1 1
      jni/CPlayer.h
  4. 65 2
      jni/GM.cpp
  5. 1 1
      jni/GM.h
  6. 2 1
      jni/XMATH.cpp
  7. 0 1
      obj/local/armeabi-v7a/objs/cpufeatures/archiver.list.tmp

+ 6 - 4
jni/CAnimManager.cpp

@@ -79,13 +79,15 @@ int CAnimManager::GetState(int) {
 }
 //-------------------------------------------------------------------------------------------------
 //001564D8
-TStateList *CAnimManager::StateInfoGet(int) {
-  return nullptr;
+TStateList *CAnimManager::StateInfoGet(int a1) {
+  LOGE("CAnimManager::StateInfoGet%x",a1);
+  return (TStateList*)rand();
 }
 //-------------------------------------------------------------------------------------------------
 //001564EC
-int CAnimManager::StateInfoGetAnimCount(int) {
-  return 0;
+int CAnimManager::StateInfoGetAnimCount(int a1) {
+ LOGE("CAnimManager::StateInfoGet%x",a1);
+  return rand();
 }
 //-------------------------------------------------------------------------------------------------
 //00156588

+ 141 - 8
jni/CPlayer.cpp

@@ -13,7 +13,7 @@
 #include "TGame.h"
 #include "XMATH.h"
 #include "XSYS.h"
-
+#include "TStateList.h"
 int LOCO_SPEED_WALK_MIN = 0x321;     // 0033E988
 int LOCO_SPEED_WALK_MAX = 0x321;     // 0033E98C
 int LOCO_SPEED_WALK_AVG = 0x321;     // 0033E990
@@ -333,8 +333,10 @@ TPoint3D CPlayer::GetBonePos(int i2) {
 //-------------------------------------------------------------------------------------------------
 // 0016F13C 经过单元测试,功能正常
 TPoint CPlayer::GetTimePos(int i2) {
-  // LOGI("CPlayer::GetTimePos %p %d", this, i2);
+   LOGI("CPlayer::GetTimePos %p %d", this, i2);
   TPoint retPos;
+  retPos.dx_0=i2+rand();
+  retPos.dy_4=i2+rand();
   return retPos;
 }
 //-------------------------------------------------------------------------------------------------
@@ -1017,7 +1019,9 @@ int CPlayer::AttributeInterpolate(EPlayerAttribute eAttr1, int i2, int i3) {
 float CPlayer::GetMoveSpeed() { return 0.1f; }
 //-------------------------------------------------------------------------------------------------
 // 001744E8 ^_^
-int CPlayer::GetInterceptMaxHeight() { return 0; }
+int CPlayer::GetInterceptMaxHeight() { 
+  LOGE("%pGetInterceptMaxHeight",this);
+  return rand(); }
 //-------------------------------------------------------------------------------------------------
 // 00174530 ^_^
 void CPlayer::SetUrgency(int i1) {
@@ -1110,11 +1114,140 @@ __attribute__((noinline)) void CPlayer::ControlFinish(int i1, int i2, int i3) {
 }
 //-------------------------------------------------------------------------------------------------
 // 00175968
-__attribute__((noinline)) void CPlayer::SetAnimTurn(
-    int i1, int i2, int i3, int i4, int i5, int i6, int i7,
-    TActionSetup *pActionSetup) {
-  LOGI("CPlayer::ControlTakeBall %p %d %d %d %d %d %d %d %p", this, i1, i2, i3,
-       i4, i5, i6, i7, pActionSetup);
+int CPlayer::SetAnimTurn(int i1, int i2, int i3, int i4, int i5, int i6, int i7, TActionSetup *pActionSetup) {
+	short i_r6; // r6
+	unsigned int i_r11; // r11
+	unsigned int v12; // r2
+	TStateList *i_r5; // r5
+	int i_r4; // r4
+	int i_r7; // r7
+	int iVal_r6; // r6
+	TAnimData *p_tAnimData_r3; // r3
+	int i_r2; // r2
+	int v24; // r2
+	short v27; // r2
+	int i_value3_r3; // r3
+	int i_value4_r1; // r1
+	int i_value2_r2; // r2
+	int i_value5_r2; // r2
+	int i_tmp_r1; // r1
+	int i_tmp1_r0; // r0
+	int result; // r0
+	int i_value1_4; // [sp+4h] [bp-4Ch]
+	int i_C; // [sp+Ch] [bp-44h]
+	short i_10; // [sp+10h] [bp-40h]
+	short i_14; // [sp+14h] [bp-3Ch]
+	short i_18; // [sp+18h] [bp-38h]
+	unsigned int i_1C; // [sp+1Ch] [bp-34h]
+	CPlayer *pThis; // [sp+20h] [bp-30h]
+	int i_24; // [sp+24h] [bp-2Ch]
+	short i_28; // [sp+28h] [bp-28h]
+
+
+	//0017596C
+	i_28 = i1 + 8192 - i2;
+	i_r6 = 8192 - i2 + i3;
+	i_10 = i4 + 8192 - i2;
+	i_r11 = (i7 >> 7) & 0x200;
+	v12 = this->tStr32_44.field_8;
+	this->tStr32_44.field_8 = 5;
+	i_14 = i4 + 8192 - i3;
+	i_1C = v12;
+	i_r5 = CAnimManager::StateInfoGet(5); //call 001564D8
+	i_r4 = CAnimManager::StateInfoGetAnimCount(this->tStr32_44.field_8);  //call 001564EC
+	i_24 = -1;
+	i_r7 = 0;
+	i_C = 0x7FFFFFFF;
+	i_18 = i_r6 + 0x2000;
+
+	//001759D2
+	for( int i = 0; i < i_r4 ;i++)  //001759E4
+	{
+		//001759E8
+		iVal_r6 = i_r5->filed_8[i_r7++];
+		p_tAnimData_r3 = &CAnimManager::s_tAnimData[iVal_r6];
+		i_r2 = p_tAnimData_r3->u_C.filed_C;
+
+		//001759FE
+		if (i_r11 == (i_r2 & i_r11)  && (i_r2 & (i_r11 ^ 0x200)) == 0)  //2个条件合并
+		{
+			//00175A0C
+			if (p_tAnimData_r3->filed_74 == i5 && (short)p_tAnimData_r3->s_76 == i6)   //2个条件合并
+			{
+				v24 = 0;
+				if (i5 >= 2)  //00175A18
+				{
+					//00175A1E
+					v24 = abs( ((i_28 - p_tAnimData_r3->filed_70) & 16383 )- 8192);  //优化后的结果,汇编并没有abs函数调用
+				}
+
+				//00175A3C
+				if (v24 <= 2730)
+				{
+					//00175A44
+					i_value1_4 = v24 << 7;
+ 					v27 = (p_tAnimData_r3->us_1E + 0x2000 - p_tAnimData_r3->us_1C) & 16383;
+					i_value3_r3 = abs(((i_18 - (p_tAnimData_r3->s_64 + v27)) & 0x3FFF) - 8192); //优化后的结果,汇编并没有abs函数调用
+
+					//00175A7E
+					if (i_value3_r3 <= 2730)
+					{
+						//00175A86
+						i_value4_r1 = abs(((i_14 + p_tAnimData_r3->s_64) & 16383) - 8192);  //优化后的结果,汇编并没有abs函数调用
+
+						// 00175A7E
+						if (i_value4_r1 <= 2730)
+						{
+							//00175A86
+							i_value2_r2 = abs(((i_10 + 8192 - v27) & 16383) - 8192);  //优化后的结果,汇编并没有abs函数调用
+
+							//00175AA4
+							if (i_value2_r2 <= 0xAAA)
+							{
+								//00175AAA
+								i_value5_r2 = i_value1_4 + (i_value2_r2 << 7) + ((i_value3_r3 + i_value4_r1) << 7);
+								if (i_value5_r2 < i_C) {
+									//00175AE2
+									i_value5_r2 += XSYS_Random(0x200); //call 001F4F44
+								}
+
+								//00175AF0
+								i_tmp_r1 = i_C;
+								i_tmp1_r0 = i_24;
+
+								if (i_value5_r2 < i_C) {
+									i_tmp1_r0 = iVal_r6;
+								}
+								i_24 = i_tmp1_r0;
+								if (i_value5_r2 < i_C) {
+									i_tmp_r1 = i_value5_r2;
+								}
+
+								i_C = i_tmp_r1;
+							}
+						}
+					}
+					i++;  //00175A7C 原始是NEG,但是他以用负数计算,我这用正数计算,就+1即可
+				}
+			}
+		}
+	}
+
+	//00175B06
+	if (i_24 < 0)
+	{
+		//00175B14
+		this->tStr32_44.field_8 = i_1C;
+		result = 0;
+	}
+	else
+	{
+		//00175B0A
+    LOGI("CPlayer::SetAnimTurn: %p %d",this,i_24);
+		this->SetAnim(i_24); //call 001704F4
+		result = 1;
+	}
+	return result;
 }
 //-------------------------------------------------------------------------------------------------
 // 00175B2C

+ 1 - 1
jni/CPlayer.h

@@ -438,7 +438,7 @@ public:
   void ControlTakeBall(int);                                                           //00174C9C
   void SetAnimControl(int, int, int, int, int, int, int, TActionSetup *);              //00174FBC
   void ControlFinish(int, int, int);                                                   //0017555C
-  void SetAnimTurn(int, int, int, int, int, int, int, TActionSetup *);                 //00175968
+  int SetAnimTurn(int, int, int, int, int, int, int, TActionSetup *);                 //00175968
   bool Turn(int, int, bool);                                                           //00175B2C
   CPlayer &operator=(CPlayer const &);                                                 //00178AAC
   union {

+ 65 - 2
jni/GM.cpp

@@ -73,8 +73,71 @@ void GM_GetLineIntersectWeighted(TPoint, TPoint, TPoint, int, int, int *,
                                  int *) {}
 //-------------------------------------------------------------------------------------------------
 // 0017A04C
-void GM_GetPlayerFutureNearestLineWeighted(int, int, bool *, TPoint3D, TPoint3D,
-                                           int, int, int *, int *) {}
+int GM_GetPlayerFutureNearestLineWeighted(int i0, int i1, bool *b2, TPoint3D tp3d_3, TPoint3D tp3d_6, int i9, int i10, int *pi11, int *pi12) {
+  TPoint3D tp3_SP68;  // [sp+68h] [bp-48h] BYREF
+   
+  TPoint3D point3D_sp80=tp3d_3;
+  TPoint3D point3D_sp74=tp3d_6;
+  int distanseR11 = XMATH_Distance(&tp3d_3.point_0, &tp3d_6.point_0) / 2;
+  PlayTeam *allTeam = tGame.allplay_14;
+  int iR9 = 0x7FFFFFFF;
+  uint ui_SP2C = 0;
+  int i_SP30 = -1;
+  uint ui_SP28 = 0x7FFFFFFF;
+  for (int iR1 = 0; iR1 < 2; iR1++) {
+    bool b = i0 == -1;
+    if (i0 != -1)
+      b = iR1 == i0;
+    // if(i0!=-1&&iR1!=i0)
+    if (b) {
+      int maxHeight_SP3C[11];  // [sp+3Ch] [bp-74h]
+      for (int iR6 = 0; iR6 < 11; iR6++) {
+        maxHeight_SP3C[iR6] = allTeam[iR1].teamlist_0[iR6]->GetInterceptMaxHeight();
+      }
+
+      for (int iR10 = 0; iR10 != 11; ++iR10) {
+        if (!b2[iR10]) {
+          CPlayer *pPlayerR6 = tGame.allplay_14[iR1].teamlist_0[iR10];
+          if (!pPlayerR6->tStr32_44.uc_2) {
+            //0017A100
+            tp3_SP68.point_0.dx_0 = (tp3d_3.point_0.dx_0 + tp3d_6.point_0.dx_0) / 2;
+            tp3_SP68.point_0.dy_4 = (tp3d_6.point_0.dy_4 + tp3d_3.point_0.dy_4) / 2;
+            tp3_SP68.dz_8 = (tp3d_6.dz_8 + tp3d_3.dz_8) / 2;
+            int i_r0=XMATH_Distance(&pPlayerR6->point_98, &tp3_SP68.point_0) ;
+            if ((i_r0 - distanseR11) < iR9) {
+              //0017A13C
+              TPoint tp4_SP34 = pPlayerR6->GetTimePos(i1);
+              int iR8 = (uint)i9 << 10;
+              for (int i = 0; i < 9; i++) {
+                tp3_SP68.point_0.dx_0 = (tp3d_3.point_0.dx_0 / 2 * ((8 - i) * 0x80) + tp3d_6.point_0.dx_0 / 2 * (i * 0x80)) / 512;
+                tp3_SP68.point_0.dy_4 = (tp3d_3.point_0.dy_4 / 2 * ((8 - i) * 0x80) + tp3d_6.point_0.dy_4 / 2 * (i * 0x80)) / 512;
+                tp3_SP68.dz_8 = (tp3d_3.dz_8 / 2 * ((8 - i) * 0x80) + tp3d_6.dz_8 / 2 * (i * 0x80)) / 512;
+                if (maxHeight_SP3C[iR10] >= tp3_SP68.dz_8) {
+                  int iR0 = XMATH_Distance(&tp4_SP34, &tp3_SP68.point_0);
+                  int ic = iR0 / 1024 * iR8;
+                  if (ic < iR9) {
+                    ui_SP2C = (i * 0x80);
+                    ui_SP28 = iR0;
+                    i_SP30 = iR10;
+                    iR9 = ic;
+                  }
+                }
+
+                iR8 += (i10 << 7) - (i9 << 7);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+
+  if (pi11)
+    *pi11 = XMATH_CalcSqrt(ui_SP28) << 10;
+  if (pi12)
+    *pi12 = ui_SP2C;
+  return i_SP30;
+}
 //-------------------------------------------------------------------------------------------------
 // 0017A24C
 int GM_GetPlayerFutureNearestLine(int, CPlayer *, TPoint, TPoint, int *,

+ 1 - 1
jni/GM.h

@@ -60,7 +60,7 @@ void GM_GetLineIntersectWeighted(TPoint, TPoint, TPoint, int, int, int *,
                                  int *);
 
 // 0017A04C
-void GM_GetPlayerFutureNearestLineWeighted(int, int, bool *, TPoint3D, TPoint3D,
+int GM_GetPlayerFutureNearestLineWeighted(int, int, bool *, TPoint3D, TPoint3D,
                                            int, int, int *, int *);
 
 // 0017A24C

+ 2 - 1
jni/XMATH.cpp

@@ -37,7 +37,8 @@ float XMATH_TendAngle(int, int) {
 //-------------------------------------------------------------------------------------------------
 //001F24F4 //^_^
 uint XMATH_CalcSqrt(uint ar0) {
-  return 0;
+  LOGE("XMATH_CalcSqrt%x",ar0);
+  return rand();
 }
 //-------------------------------------------------------------------------------------------------
 //001F251C  //^_^

+ 0 - 1
obj/local/armeabi-v7a/objs/cpufeatures/archiver.list.tmp

@@ -1 +0,0 @@
-./obj/local/armeabi-v7a/objs/cpufeatures/cpu-features.o