Преглед на файлове

0x001704f4,CPlayer::SetAnim bugfix

DESKTOP-AB9OQPJ\RED-10 преди 3 години
родител
ревизия
d63d6a2e25
променени са 2 файла, в които са добавени 138 реда и са изтрити 17 реда
  1. 127 7
      jni/CPlayer.cpp
  2. 11 10
      jni/CPlayer.h

+ 127 - 7
jni/CPlayer.cpp

@@ -89,7 +89,7 @@ void CPlayer::UpdatePosVel() {
     // 0016E9FC
     if (tStr32_44.field_8 != 3) {
       // 0016EA02
-      if (tStr32_44.field_8 || tStr32_44.u_2C.s_2C.sBlend_2E) {
+      if (tStr32_44.field_8 || tStr32_44.sBlend_2E) {
         // loc_16EA0C
         int r7_i = u_0.s_2_0.s_0;
         if (u_0.s_2_0.s_0 != -1) {
@@ -98,13 +98,13 @@ void CPlayer::UpdatePosVel() {
             // 0016EA18
             TAnimData *r2_pAnimData =
                 &CAnimManager::s_tAnimData[tStr32_44.field_20];
-            if (tStr32_44.u_2C.s_2C.sBlend_2E &&
+            if (tStr32_44.sBlend_2E &&
                 r2_pAnimData->filed_8 == 4) {  // 0016EA34
               // 0016EA38
               // sint32 r3_si = (sint32)tStr32_44.u_2C.s_2C.uBlend_2E;
               // r3_si=((r3_si>>26)&0x1f)+tStr32_44.u_2C.s_2C.uBlend_2E;
               // uint r3_ui = UBFX(r3_si, 26, 5);
-              short r3_si = tStr32_44.u_2C.s_2C.sBlend_2E;
+              short r3_si = tStr32_44.sBlend_2E;
               r0_i = GM_BlendAngle(r6_pAnimData->s_64, r2_pAnimData->s_64,
                                    r3_si / 32);
 
@@ -429,6 +429,7 @@ void CPlayer::Animate(int i1) {
 // 0017039C ^_- 经过单元测试,功能正常
 void CPlayer::ApplyRootBoneOfs(TAnimData *pAniData1, int i2) {
   // LOGI("CPlayer::ApplyRootBoneOfs %d", i2);
+  LOGE("ApplyRootBoneOfs%x%x%x",this,pAniData1,i2);
 }
 //-------------------------------------------------------------------------------------------------
 // 00170440 ^_-
@@ -444,7 +445,120 @@ __attribute__((noinline)) TAnimData *CPlayer::GetAnimData() {
 //-------------------------------------------------------------------------------------------------
 // 001704F4 经过单元测试,功能正常
 void CPlayer::SetAnim(int i1) {
-  // LOGI("CPlayer::SetAnim %p %d", this, i1);
+  if (CAnimManager::s_tAnimData[tStr32_44.field_10].filed_54 != nullptr) {  // 00170514
+    // 00170516
+    GetRootBoneMove(&Point3D_14.point_0);
+    int r7_i = XMATH_Mag2D(&Point3D_14);
+    int r1_i = GetSprintSpeed();
+    if (r7_i > r1_i) {  // 00170532
+      // 00170534
+      XMATH_Normalize(&Point3D_14, r1_i);
+    }
+  }
+
+  ushort r9_us;
+  // loc_17053C
+  if (tStr32_44.sBlend_2E > 4096) {
+    // 00170546
+    r9_us = GetTrueRot() - tStr32_44.s_2C;
+    tStr32_44.sBlend_2E = 0;
+    tStr32_44.field_10 = tStr32_44.field_20;
+    tStr32_44.field_14 = tStr32_44.field_24;
+    tStr32_44.s_18 = tStr32_44.s_2A;
+    u_0.s_2_0.s_2 = r9_us;
+  } else {
+    // loc_170572
+    r9_us = u_0.s_2_0.s_2;
+  }
+
+  int r0_i;
+  // loc_170578
+  u_0.s_2_0.s_2 = GetTrueRot();
+  if (field_10 >= 2) {
+    // 00170586
+    tStr32_44.field_20=tStr32_44.field_10;
+    tStr32_44.field_24=tStr32_44.field_14;
+    TAnimData *r8_pAnimData = &CAnimManager::s_tAnimData[tStr32_44.field_10];
+    if (r8_pAnimData->filed_8 == 4) {
+      // 001705AE
+
+      r0_i = ((int)(((uint)(XMATH_Mag(&Point3D_14.point_0))) * 2)) / ((short)r8_pAnimData->us_18);
+      r0_i *= tStr32_44.field_1C;
+      r0_i /= 128;
+    } else {
+      // loc_1705D8
+      r0_i = tStr32_44.field_1C;
+    }
+
+    // loc_1705DA
+    tStr32_44.s_28 = r0_i;
+
+    tStr32_44.sBlend_2E = 8192;
+    //LOGE("tStr32_44.u_2C.s_2C.sBlend_2E=%x",tStr32_44.u_2C.s_2C.sBlend_2E);
+    tStr32_44.s_2A = tStr32_44.s_18;
+    tStr32_44.s_2C = (((8192 - r9_us) + u_0.s_2_0.s_2) & 0x3FFF)-0x2000;
+  } else {
+    // loc_1705CE
+    tStr32_44.s_2C = 0;
+    tStr32_44.sBlend_2E=0;
+  }
+
+  // loc_170604
+  tStr32_44.field_10 = i1;  // 0017060C
+  tStr32_44.field_14 = 0;
+  
+  TAnimData *r5_pAnimData = &CAnimManager::s_tAnimData[i1];
+  
+  tStr32_44.s_C = r5_pAnimData->filed_6e;
+  // 00170614
+  if (tStr32_44.field_8 == 4) {
+    // 00170624
+    if (us_122) {
+      // 0017062A
+      r0_i = (131072 / us_122) * 512;
+    } else {
+      // loc_170642
+      r0_i = 0x10000;
+    }
+
+    // loc_170646
+    tStr32_44.field_1C = (int)(r5_pAnimData->filed_10 * r0_i) >> 16;
+
+    // 00170648
+    if (field_10 <= 1) {
+      // 00170656
+      if (!r5_pAnimData->filed_9) {
+        // 0017065A
+        tStr32_44.field_14 = XSYS_Random(0x10000);
+      }
+    }  // loc_170666
+    
+  } else {
+    // 00170636
+    tStr32_44.field_1C = *(short*)&r5_pAnimData->filed_10;
+    if (!tStr32_44.field_8) {
+      // loc_170656
+      // 00170656
+      if (!r5_pAnimData->filed_9) {
+        // 0017065A
+        tStr32_44.field_14 = XSYS_Random(0x10000);
+      }
+    }
+  }
+
+  // loc_170666
+  if (r5_pAnimData->us_1C) {
+    // 0017066A
+    u_0.s_2_0.s_2 = (u_0.s_2_0.s_2 - r5_pAnimData->us_1C) & 0x3FFF;
+  }
+
+  // loc_170674
+  if (r5_pAnimData->filed_54) {
+    // 00170678
+    ApplyRootBoneOfs(r5_pAnimData, -1);
+  }
+  // loc_170684
+  UpdateAnimCalcs();
 }
 //-------------------------------------------------------------------------------------------------
 // 00170694 ^_- 经过单元测试,功能正常
@@ -453,7 +567,10 @@ void CPlayer::GetRootBoneMove(TPoint *pPoint1) {
 }
 //-------------------------------------------------------------------------------------------------
 // 0017077C ^_- 经过单元测试,功能正常
-int CPlayer::GetTrueRot() { return 0; }
+short CPlayer::GetTrueRot() {
+   LOGI("CPlayer::GetRootBoneMove %p ", this);
+   return rand()&0x3fff; 
+   }
 //-------------------------------------------------------------------------------------------------
 // 00170820
 __attribute__((noinline)) bool CPlayer::AnimBlendNeeded() { return false; }
@@ -461,6 +578,7 @@ __attribute__((noinline)) bool CPlayer::AnimBlendNeeded() { return false; }
 // 0017082C ^_- 经过单元测试,功能正常
 void CPlayer::UpdateAnimCalcs() {
   // LOGI("CPlayer::UpdateAnimCalcs entry");
+   LOGI("CPlayer::UpdateAnimCalcs %p ", this);
   // loc_1708C8
 }
 //-------------------------------------------------------------------------------------------------
@@ -614,7 +732,7 @@ void CPlayer::UpdateLogic() {
   if (!uc_88) return;
 
   // 00173026
-  if (cBall.ballPosPrev_4.dz_8 <= s_122 * 72 &&
+  if (cBall.ballPosPrev_4.dz_8 <= us_122 * 72 &&
       tStr58_A0.u_50.ui_50 <= 0x28000) {
     // 00173046
     if (tGame.field_6C38 <= 4 && cBall.speedXY_28 > 0x14DC) {
@@ -810,7 +928,9 @@ __attribute__((noinline)) void CPlayer::GetWalkSpeed() {
 }
 //-------------------------------------------------------------------------------------------------
 // 001742B4 ^_^
-int CPlayer::GetSprintSpeed() { return 0; }
+int CPlayer::GetSprintSpeed() { 
+  LOGE("this=%xCPlayer::GetRunSpeed", this);
+  return rand(); }
 //-------------------------------------------------------------------------------------------------
 // 00174310 ^_^
 int CPlayer::GetTargetRunSpeed() { return 0; }

+ 11 - 10
jni/CPlayer.h

@@ -258,15 +258,16 @@ struct CPlayer_str_32 {
   uint field_24;
   sint16 s_28;
   short s_2A;
-  union {
-    struct {
-      short ss_2C;
-      sint16 sBlend_2E;  //0017033A 
+  // union {
+  //   struct {
+  //     short ss_2C;
+  //     sint16 sBlend_2E;  //0017033A 
       
-    } s_2C;
-    int field_2C;  //001705D4
-  } u_2C;
-
+  //   } s_2C;
+  //   int field_2C;  //001705D4
+  // } u_2C;
+  short s_2C;
+  sint16 sBlend_2E;  //0017033A
   uint16 s_30;
 };
 #pragma pack()
@@ -366,7 +367,7 @@ public:
   TAnimData *GetAnimData();                                                            //001704DC
   void SetAnim(int);                                                                   //001704F4
   void GetRootBoneMove(TPoint *);                                                      //00170694
-  int GetTrueRot();                                                                    //0017077C
+  short GetTrueRot();                                                                    //0017077C
   bool AnimBlendNeeded();                                                              //00170820
   void UpdateAnimCalcs();                                                              //0017082C
   void SetTrophyData(ETrophyPos, ushort, ushort);                                      //001708D0
@@ -485,7 +486,7 @@ public:
   short s_11A;
   int field_11C;
   sint16 field_120;  //0016F09C 00173100 此处显示是short
-  ushort s_122;
+  ushort us_122;
   uchar uc_124;
   uchar uc_125;
   uchar uc_126;