DESKTOP-AB9OQPJ\RED-10 il y a 3 ans
Parent
commit
02b0303bfa
3 fichiers modifiés avec 137 ajouts et 43 suppressions
  1. 95 41
      jni/CPlayer.cpp
  2. 41 1
      jni/CStoryProfile.cpp
  3. 1 1
      jni/TAnimData.h

+ 95 - 41
jni/CPlayer.cpp

@@ -119,14 +119,14 @@ void CPlayer::UpdatePosVel() {
             r7_i = xsin(r6_i) / 4 * r5_i;
             r0_i = xcos(r6_i);
             // r1_i = 0 - (r0_i * 4096);
-            if(r1_i<0)
-              r1_i=0x3FFF;
+            if (r1_i < 0)
+              r1_i = 0x3FFF;
             else
-              r1_i=0;
-             r0_i = r1_i - (r0_i * 4096);
+              r1_i = 0;
+            r0_i = r1_i - (r0_i * 4096);
 
             r0_i = (r0_i >> 14) * r5_i / 4096;
-            
+
             // loc_16EAF8
             r1_i = r7_i / 4096;
 
@@ -136,18 +136,18 @@ void CPlayer::UpdatePosVel() {
             r0_i = r0_i / 4;
             int r6_i = r0_i * r5_i;
             r0_i = xcos(r7_i);  // 0016EA9E
-            //r1_i = 0 - ((uint)r0_i << 12);
-            // r1_i = r1_i >> 31;
-            // r1_i = (uint)r1_i >> 18;
+            // r1_i = 0 - ((uint)r0_i << 12);
+            //  r1_i = r1_i >> 31;
+            //  r1_i = (uint)r1_i >> 18;
             if (r1_i < 0)
-             r1_i = 0x3fff;
+              r1_i = 0x3fff;
             else
               r1_i = 0;
             r0_i = r1_i - ((uint)r0_i << 12);
             // //FF003FFF
-             r0_i = r0_i >> 14;
-            //FFFFFC00
-            // loc_16EAF8
+            r0_i = r0_i >> 14;
+            // FFFFFC00
+            //  loc_16EAF8
             r1_i = r6_i / 4096;
             r0_i = r0_i * r5_i / 4096;
           }
@@ -236,7 +236,8 @@ __attribute__((noinline)) void CPlayer::SetRot(TPoint point1, bool b2) {
 //-------------------------------------------------------------------------------------------------
 // 0016EC20
 __attribute__((noinline)) ushort CPlayer::GetRotPoint(TPoint point1) {
-  return 0;
+  LOGE("CPlayer::GetRotPoint0016EC20%p%x%x", this, point1.dx_0, point1.dy_4);
+  return rand();
 }
 //-------------------------------------------------------------------------------------------------
 // 0016EC34
@@ -264,7 +265,9 @@ int CPlayer::GetRotDest() {
 //-------------------------------------------------------------------------------------------------
 // 0016ECB6
 __attribute__((noinline)) ushort CPlayer::GetRotPoint(TPoint3D point1) {
-  return 0;
+  LOGE("CPlayer::GetRotPoint0016ECB6 %p %x %x %x", this, point1.point_0.dx_0,
+       point1.point_0.dy_4, point1.dz_8);
+  return rand();
 }
 //-------------------------------------------------------------------------------------------------
 // 0016ECCC ^_^
@@ -348,7 +351,7 @@ void CPlayer::UpdateAction() {
 //-------------------------------------------------------------------------------------------------
 // 0016F3D4
 __attribute__((noinline)) int CPlayer::ActionTend(int i1, TPoint3D *pPoint3D2) {
-  LOGI("CPlayer::UpdateAction %p %d", this, i1, pPoint3D2);
+  LOGI("CPlayer::UpdateAction %p %d%x", this, i1, (uint)pPoint3D2);
   return rand() % 4;
 }
 //-------------------------------------------------------------------------------------------------
@@ -429,7 +432,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);
+  LOGE("ApplyRootBoneOfs%p%x%x", this, (uint)pAniData1, i2);
 }
 //-------------------------------------------------------------------------------------------------
 // 00170440 ^_-
@@ -445,7 +448,8 @@ __attribute__((noinline)) TAnimData *CPlayer::GetAnimData() {
 //-------------------------------------------------------------------------------------------------
 // 001704F4 经过单元测试,功能正常
 void CPlayer::SetAnim(int i1) {
-  if (CAnimManager::s_tAnimData[tStr32_44.field_10].filed_54 != nullptr) {  // 00170514
+  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);
@@ -476,13 +480,14 @@ void CPlayer::SetAnim(int i1) {
   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;
+    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 = ((int)(((uint)(XMATH_Mag(&Point3D_14.point_0))) * 2)) /
+             ((short)r8_pAnimData->us_18);
       r0_i *= tStr32_44.field_1C;
       r0_i /= 128;
     } else {
@@ -494,21 +499,21 @@ void CPlayer::SetAnim(int i1) {
     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);
+    // 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;
+    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;
+    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) {
@@ -532,10 +537,10 @@ void CPlayer::SetAnim(int i1) {
         tStr32_44.field_14 = XSYS_Random(0x10000);
       }
     }  // loc_170666
-    
+
   } else {
     // 00170636
-    tStr32_44.field_1C = *(short*)&r5_pAnimData->filed_10;
+    tStr32_44.field_1C = *(short *)&r5_pAnimData->filed_10;
     if (!tStr32_44.field_8) {
       // loc_170656
       // 00170656
@@ -568,9 +573,9 @@ void CPlayer::GetRootBoneMove(TPoint *pPoint1) {
 //-------------------------------------------------------------------------------------------------
 // 0017077C ^_- 经过单元测试,功能正常
 short CPlayer::GetTrueRot() {
-   LOGI("CPlayer::GetRootBoneMove %p ", this);
-   return rand()&0x3fff; 
-   }
+  LOGI("CPlayer::GetRootBoneMove %p ", this);
+  return rand() & 0x3fff;
+}
 //-------------------------------------------------------------------------------------------------
 // 00170820
 __attribute__((noinline)) bool CPlayer::AnimBlendNeeded() { return false; }
@@ -578,7 +583,7 @@ __attribute__((noinline)) bool CPlayer::AnimBlendNeeded() { return false; }
 // 0017082C ^_- 经过单元测试,功能正常
 void CPlayer::UpdateAnimCalcs() {
   // LOGI("CPlayer::UpdateAnimCalcs entry");
-   LOGI("CPlayer::UpdateAnimCalcs %p ", this);
+  LOGI("CPlayer::UpdateAnimCalcs %p ", this);
   // loc_1708C8
 }
 //-------------------------------------------------------------------------------------------------
@@ -613,7 +618,7 @@ void CPlayer::UpdateJostlePoint() {
   if (r6_pAnimData->s_64) return;
 
   //??? 后面的代码好像与
-  //NIS的测试环境,通过单元测试,发现后面的代码不写,不影响逻辑
+  // NIS的测试环境,通过单元测试,发现后面的代码不写,不影响逻辑
 }
 //-------------------------------------------------------------------------------------------------
 // 00170A14 ^_^
@@ -632,13 +637,61 @@ __attribute__((noinline)) void CPlayer::EnableIdleAnims(bool b1) {}
 //-------------------------------------------------------------------------------------------------
 // 00170C14 经过单元测试,功能正常
 void CPlayer::SetAnimFromStateGen(int i1, int i2, int i3) {
-  // LOGI("CPlayer::SetAnimFromStateGen %p %d %d %d", this, i1, i2, i3);
+  LOGI("CPlayer::SetAnimFromStateGen %p %d %d %d", this, i1, i2, i3);
 }
 //-------------------------------------------------------------------------------------------------
 // 00170D10 经过单元测试,功能正常
 void CPlayer::SetAnimFromStateI() {
-  // LOGI("CPlayer::SetAnimFromStateI %p", this);
   // 00170D16
+  if (tStr32_44.field_8) {
+    // 00170D18
+    if (tStr32_44.field_8 != 4) {
+      if (tStr32_44.field_8 == 11) {
+        // 00170D20
+        if (tGame.mTLogic_6678.field_8 == 1) {
+          // 00170D3A
+          // loc_170DA8
+          SetAnimFromStateGen(
+              GetRotPoint(cBall.point3D_84),
+              CAnimManager::s_tAnimData[tStr32_44.field_10].s_76, 0x200);
+        } else {
+          // loc_170D98
+          SetAnimFromStateGen(
+              GetRotPoint(g_vZero),
+              CAnimManager::s_tAnimData[tStr32_44.field_10].s_76, 0x200);
+        }
+
+      } else {
+        // loc_170D82
+
+        SetAnimFromStateGen(-1, -1, 0);
+        tStr32_44.field_14 = 0;
+      }
+
+    } else {  // loc_170D6C
+      SetAnimFromStateLoco(-1, -1, 0x180);
+      tStr32_44.field_14 = 0;
+    }
+
+  } else {
+    // loc_170D4E
+    if (u_0.s_2_0.s_0 + 1 != 0) {
+      // 00170D56
+      if (Turn(u_0.s_2_0.s_0, u_0.s_2_0.s_0, false)) {
+        // locret_170D96
+        return;
+      }
+
+      // 00170D62
+      tStr32_44.field_8 = 4;
+      SetAnimFromStateLoco(-1, -1, 0x180);
+      tStr32_44.field_14 = 0x2000;
+    } else {
+      // loc_170D6C
+      SetAnimFromStateLoco(-1, -1, 0x180);
+      tStr32_44.field_14 = 0;
+    }
+  }
 }
 //-------------------------------------------------------------------------------------------------
 // 00170DD4 ^_^
@@ -882,7 +935,7 @@ __attribute__((noinline)) void CPlayer::IsFacing(int i1, int i2) {
 //-------------------------------------------------------------------------------------------------
 // 00173442
 __attribute__((noinline)) void CPlayer::IsAtDest(TPoint *pPoint1, int i2) {
-  LOGI("CPlayer::IsAtDest %p %d %d", this, pPoint1, i2);
+  LOGI("CPlayer::IsAtDest %p %d %d", this, (int)pPoint1, i2);
 }
 //-------------------------------------------------------------------------------------------------
 // 0017346C
@@ -928,9 +981,10 @@ __attribute__((noinline)) void CPlayer::GetWalkSpeed() {
 }
 //-------------------------------------------------------------------------------------------------
 // 001742B4 ^_^
-int CPlayer::GetSprintSpeed() { 
-  LOGE("this=%xCPlayer::GetRunSpeed", this);
-  return rand(); }
+int CPlayer::GetSprintSpeed() {
+  LOGE("this=%xCPlayer::GetRunSpeed", (uint)this);
+  return rand();
+}
 //-------------------------------------------------------------------------------------------------
 // 00174310 ^_^
 int CPlayer::GetTargetRunSpeed() { return 0; }
@@ -945,8 +999,8 @@ int CPlayer::GetCurrentRunSpeed() {
 int CPlayer::GetRunSpeed() {
   int dret = 0;
   // loc_1744BA
-  LOGE("this=%xCPlayer::GetRunSpeed", this);
-  return rand()+0x409360;
+  LOGE("this=%xCPlayer::GetRunSpeed", (uint)this);
+  return rand() + 0x409360;
 }
 //-------------------------------------------------------------------------------------------------
 // 001744CC
@@ -1061,7 +1115,7 @@ __attribute__((noinline)) void CPlayer::SetAnimTurn(
 // 00175B2C
 __attribute__((noinline)) bool CPlayer::Turn(int i1, int i2, bool b3) {
   LOGI("CPlayer::ControlTakeBall %p %d %d %d", this, i1, i2, b3);
-  return true;
+  return rand()%2;
 }
 //-------------------------------------------------------------------------------------------------
 // 00178AAC 经过单元测试,功能正常

+ 41 - 1
jni/CStoryProfile.cpp

@@ -4,6 +4,8 @@
 #include "CMyProfile.h"
 #include "XSYS.h"
 #include "memctrl.h"
+#include "CStoryProfile.h"
+#include "CStoryCore.h"
 
 TStoryProfileData CStoryProfile::m_tData;
 
@@ -182,7 +184,45 @@ void CStoryProfile::SetOppoNationalTeams() {}
 int CStoryProfile::GetNumOppoTeams(int, int) { return 0; }
 //-------------------------------------------------------------------------------------------------
 // 001E7D64
-bool CStoryProfile::SetupNextStage() { return 0; }
+bool CStoryProfile::SetupNextStage() {
+  CStoryProfileStages* pSPS = filed_0;
+  TStorySeason* pTSS_R1 = CStoryCore::m_tStages.list_C + CStoryProfile::m_tData.field_16.filed_2;
+  int i_R6 = 0;
+  // 001E7DE6
+  for (; i_R6 < pTSS_R1->StageCount_d0; i_R6++) {  // 001E7D96
+    // 001E7D9E 001E7D9A
+    if (!pSPS->GetStagesComplete(pTSS_R1->TStage_d4[i_R6].ID_0)) {  // 001E7DAA
+      break;
+    }  // 001E7DA0
+  }    // 001E7DAA
+  // 001E7DB8 LDR R0, [R7] 此条指令提到当前块前面,
+  CStoryCore::m_tStageManager.uc_5DA9 = 0;
+  bool bRet;
+  // 001E7DBA
+  if (i_R6 < pTSS_R1->StageCount_d0) {  // 001E7DBE
+    bRet = true;
+    // 001E7DC4
+    if (i_R6 > CStoryProfile::m_tData.field_16.filed_0) {  // 001E7DC8
+      CStoryCore::m_tStageManager.uc_5DA9 = bRet;
+    }  // 001E7DCC
+
+    CStoryProfile::m_tData.field_16.filed_0 = i_R6;
+  } else {  // 001E7DD0
+    bRet = true;
+    CStoryCore::m_tStageManager.uc_5DA9 = bRet;
+    CStoryProfile::m_tData.field_16.filed_0 = 0;
+    CStoryProfile::m_tData.field_16.filed_2++;
+    CStoryProfile::m_tData.field_2.field_10++;
+    // 001E7DF2
+    if (CStoryCore::m_tStages.dCount_8 <= CStoryProfile::m_tData.field_16.filed_2) {
+      bRet = false;
+      CStoryProfile::m_tData.field_16.filed_2 = CStoryCore::m_tStages.dCount_8 - 1;
+      CStoryProfile::m_tData.field_16.filed_0 = pTSS_R1->StageCount_d0;
+
+    }  // 001E7E04
+  }    // 001E7E04
+  return bRet;
+}
 //-------------------------------------------------------------------------------------------------
 // 001E7E18
 void CStoryProfile::SetSeason(int dr1) {

+ 1 - 1
jni/TAnimData.h

@@ -101,7 +101,7 @@ struct TAnimData {
   ushort filed_70;
   ushort filed_72;
   sint16 filed_74;
-  ushort filed_76;
+  short s_76;//00170DB6
   ushort filed_78;
   uchar filed_7a;
   uchar filed_7b;