Selaa lähdekoodia

0x001dca14,FREE_ReadXMLLevel 已修复

DESKTOP-AB9OQPJ\RED-10 3 vuotta sitten
vanhempi
commit
df5976ded3
5 muutettua tiedostoa jossa 546 lisäystä ja 100 poistoa
  1. 2 1
      jni/CAnimManager.cpp
  2. 0 1
      jni/COL.cpp
  3. 401 2
      jni/FREE.cpp
  4. 124 87
      jni/TFreeControl.h
  5. 19 9
      jni/XML.cpp

+ 2 - 1
jni/CAnimManager.cpp

@@ -108,7 +108,8 @@ int CAnimManager::GetActionAnim(CPlayer *, EPlayerState, TPoint3D *, int, int, i
 //-------------------------------------------------------------------------------------------------
 //00156AB8 ^_^
 int CAnimManager::GetAnimID(char const *a1) {
-  return -1;
+  LOGE("CAnimManager::GetAnimID(char const *a1)%s",a1);
+  return rand();
 }
 //-------------------------------------------------------------------------------------------------
 //00156AE8

+ 0 - 1
jni/COL.cpp

@@ -21,7 +21,6 @@ void COL_PlayerBallCollideEvent(CPlayer *pPlayer_0, int i_1, bool &b_2) {
   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]

+ 401 - 2
jni/FREE.cpp

@@ -18,6 +18,7 @@
 #include "CBallProj.h"
 #include "XSYS.h"
 #include "SNDGAME.h"
+#include "XML.h"
 int s_iEVFStrings[160] = {
     0x184B, 0x184C, 0x1858, 0, 0, 0, 0, 0, 0, 0,
     0x1859, 0x185A, 0, 0, 0, 0, 0, 0, 0, 0, 0x1854,
@@ -996,7 +997,9 @@ void FREE_AddVisualFeedback_Fail() {}
 void FREE_AddVisualFeedback_Offside() {}
 //-------------------------------------------------------------------------------------------------
 // 001DC4C8
-void FREE_SortPlayers(TFreeGoal *) {}
+void FREE_SortPlayers(TFreeGoal *a1) {
+  LOGE("FREE_SortPlayers%p",a1);
+}
 //-------------------------------------------------------------------------------------------------
 // 001DC664
 void FREE_SortPlayersDistance(TFreeGoal *) {}
@@ -1008,7 +1011,403 @@ int FREE_ReadXML(TFreeGoal *, int) { return 0; }
 bool FREE_ReadXML(TFreeGoal *, char *) { return 0; }
 //-------------------------------------------------------------------------------------------------
 // 001DCA14
-void FREE_ReadXMLLevel(TFreeGoal *, CFTTXmlReaderNode) {}
+void FREE_ReadXMLLevel(TFreeGoal* tFreeGoal_r0, CFTTXmlReaderNode cXMLReaderNode_r1) {
+  TPoint3D tPoint3D_50;
+  CFTTXmlReaderNode cNode_48;
+  auto cXMLReaderNode_4C = cXMLReaderNode_r1;
+  //CFTTXmlReaderNode cPropNode_54;
+  CFTTXmlReaderNode cNodeTeam_40;
+  CFTTXmlReaderNode cNodePlayer_3C;
+  TPoint tPoint_34;
+  TPoint tZero_74;
+  // int iTeam_No_Index_78;
+  char pFormatBuf_50[0x20];
+  TPoint3D tPoint3D_98;
+  TPoint tPoint_98;
+
+  // 001DCA30
+  memset(tFreeGoal_r0, 0, sizeof(TFreeGoal));  // sizeof(TFreeGoal) = 0x7634
+
+  // 001DCA3A
+  cNode_48 = cXMLReaderNode_r1.GetFirstChild("Info");
+
+  // 001DCA46 <- **if 分支**
+  if (cNode_48.IsValid()) {
+    // 001DCA48 OK
+    tFreeGoal_r0->m_iVersion_0 = XMLGetInt(cNode_48, "Version", NULL, 0);  // 001DCA56 <- **字段 0 赋值**
+  }
+
+  // 001DCA66
+  if (XMLExists(cXMLReaderNode_r1, "Ball", "Pos")) {
+    // 001DCA68 OK
+    // 001DCA7C <- **结构体赋值**
+    //tPoint3D_98 = g_vZero3;
+
+    // 001DCA86 <- **call XMLGetPos3D**
+    tPoint3D_50 = XMLGetPos3D(cXMLReaderNode_r1, "Ball", "Pos", g_vZero3);  // 001DCA86 <- **函数调用,结构体传参通过栈拷贝**
+
+    // 001DCA94 <- **TPoint3D.dz_8 赋值**
+    tFreeGoal_r0->m_tBallPos_744C.dz_8 = tPoint3D_50.dz_8;
+
+    // 001DCA9C <- **TPoint3D.point_0赋值**
+    // tFreeGoal_r0->m_tBallPos_744C.point_0 = tPoint3D_40.point_0;
+    tFreeGoal_r0->m_tBallPos_744C.point_0.dx_0 = tPoint3D_50.point_0.dx_0;
+    tFreeGoal_r0->m_tBallPos_744C.point_0.dy_4 = tPoint3D_50.point_0.dy_4;
+
+    // 001DCAA6 <- **if 分支**
+    if (tFreeGoal_r0->m_tBallPos_744C.dz_8 < 0x1000) {
+      // 001DCABC OK
+      tFreeGoal_r0->m_tBallPos_744C.dz_8 = 0x1000;  // 001DCAC2 <- **字段 744C 赋值**
+    }
+  } else {
+    // 001DCAAA <- **分支地址**
+    // 001DCAB0 <- **TPoint.dy_4 赋值**
+    // 001DCAB6 <- **TPoint.dx_0 赋值**
+    tFreeGoal_r0->m_tBallPos_744C.point_0 = TPoint(0, 0);
+    // 001DCAC2
+    tFreeGoal_r0->m_tBallPos_744C.dz_8 = 0x1000;
+  }
+
+  // 001DCAD8 <- **字段 745C 赋值**
+  tFreeGoal_r0->m_iKickPlayer_745C = XMLGetInt(cXMLReaderNode_r1, "KickPlayer", NULL, 0);  // 001DCACE <- **函数调用**
+
+  // 001DCAE2 <- **call XMLGetString()**
+  char* pKickAnim_r0 = XMLGetString(cXMLReaderNode_r1, "KickAnim", NULL, NULL);
+
+  // 001DCAEA <- **XMLGetString() 返回值判断**
+  if (pKickAnim_r0) {
+    // 001DCAEC OK
+    tFreeGoal_r0->m_iAnimID_7460 = CAnimManager::GetAnimID(pKickAnim_r0);  // 001DCB02 <- **字段 7460 赋值**
+  } else {
+    // 001DCAF2
+    tFreeGoal_r0->m_iAnimID_7460 = -1;
+  }
+
+  // 001DCB1E <- **字段 7464 赋值**
+  tFreeGoal_r0->m_iKickRot_7464 = XMLGetInt(cXMLReaderNode_r1, "KickRot", 0, 0xB4);
+
+  // 001DCB36 <- **字段 8 赋值**
+  const char* sWeatherTypes[3] = {"FINE", "RAIN", "SNOW"};
+  tFreeGoal_r0->m_iWeather_8 = XMLGetStringInt(cXMLReaderNode_r1, "Weather", NULL, (const char**)sWeatherTypes, 3, -1);
+
+  // 001DCB44 <- **字段 C 赋值**
+  tFreeGoal_r0->m_iMaxPhaseCount_C = XMLGetInt(cXMLReaderNode_r1, "MaxPhaseCount", NULL, 0);
+
+  // 001DCB5A <- **字段 10 赋值**
+  tFreeGoal_r0->m_bIndirect_10 = XMLGetInt(cXMLReaderNode_r1, "Indirect", NULL, 0) ? true : false;  // 001DCB52 <- **三目运算**
+
+  // 001DCB64 <- **call XMLGetString()**
+  char const* pShotAnim_r0 = XMLGetString(cXMLReaderNode_r1, "ShotAnim", NULL, NULL);
+  // 001DCB68 <- **返回值判断**
+  if (pShotAnim_r0) {
+    // 001DCB6A
+    tFreeGoal_r0->m_iShotAnimID_7468 = CAnimManager::GetAnimID(pShotAnim_r0);  // 001DCB82 <- **字段 7468 赋值**
+  } else {
+    // 001DCB70 OK
+    tFreeGoal_r0->m_iShotAnimID_7468 = -1;  // 001DCB7E <- **返回值空则赋值 -1**
+  }
+
+  // 001DCB92 <- **字段 746C 赋值**
+  tFreeGoal_r0->m_iShotAnimPlayer_746C = XMLGetInt(cXMLReaderNode_r1, "ShotAnimPlayer", NULL, -1);
+  // 001DCB9E <- **call XMLGetFloat()**
+  tFreeGoal_r0->m_fShotAnimDistance_7470 = XMLGetFloat(cXMLReaderNode_r1, "ShotAnimDistance", NULL, 24.0f);
+  // 001DCBB8 <- **字段 7458 赋值**
+  tFreeGoal_r0->m_iUserPlayer_7458 = XMLGetInt(cXMLReaderNode_r1, "UserPlayer", NULL, 0);
+  // 001DCBCA <- **字段 747C 赋值**
+  tFreeGoal_r0->m_iCPUPlayerCloseDownCount_747C = XMLGetInt(cXMLReaderNode_r1, "CPUPlayerCloseDownCount", NULL, 1);
+  // 001DCBDE <- **字段 7480 赋值**
+  tFreeGoal_r0->m_fCPUCloseDownDist_7480 = XMLGetFloat(cXMLReaderNode_r1, "CPUCloseDownDist", NULL, 4.0f);
+  // 001DCBF0 <- **字段 7484 赋值**
+  tFreeGoal_r0->m_iCPUGKRating_7484 = XMLGetInt(cXMLReaderNode_r1, "CPUGKRating", NULL, 0x32);
+  // 001DCC02 <- **字段 7490 赋值**
+  tFreeGoal_r0->m_fCPUGKSaveSpeed_7490 = XMLGetFloat(cXMLReaderNode_r1, "CPUGKSaveSpeed", NULL, 90.0f);
+  // 001DCC16 <- **字段 7494 赋值**
+  tFreeGoal_r0->m_fCPUGKSaveDistance_7494 = XMLGetFloat(cXMLReaderNode_r1, "CPUGKSaveDistance", NULL, 4.0f);
+  // 001DCC2A <- **字段 7488 赋值**
+  tFreeGoal_r0->m_fCPUGKSaveAlwaysDistance_7488 = XMLGetFloat(cXMLReaderNode_r1, "CPUGKSaveAlwaysDistance", NULL, 0.75f);
+  // 001DCC3C <- **字段 748C 赋值**
+  tFreeGoal_r0->m_iCPUGKSaveResponseTime_748C = XMLGetInt(cXMLReaderNode_r1, "CPUGKSaveResponseTime", NULL, 0xF);
+  // 001DCC4E <- **字段 7498 赋值**
+  tFreeGoal_r0->m_iCPUGKPosResponseTime_7498 = XMLGetInt(cXMLReaderNode_r1, "CPUGKPosResponseTime", NULL, 0xF);
+
+  // 001DCC5C <- **函数返回值赋值**
+  int iCPUPlayerResponseTime_r4 = XMLGetInt(cXMLReaderNode_r1, "CPUPlayerResponseTime", NULL, 0xF);  // 001DCC58 <- **函数调用**
+  // 001DCC6E <- **字段 749C 赋值**
+  tFreeGoal_r0->m_iCPUKickResponseTime_749C = XMLGetInt(cXMLReaderNode_r1, "CPUKickResponseTime", NULL, iCPUPlayerResponseTime_r4);
+  // 001DCC80 <- **字段 74A0 赋值**
+  tFreeGoal_r0->m_iCPUMoveResponseTime_74A0 = XMLGetInt(cXMLReaderNode_r1, "CPUMoveResponseTime", NULL, iCPUPlayerResponseTime_r4);
+  // 001DCC92 <- **字段 7478 赋值**
+  tFreeGoal_r0->m_iTEAMKickResponseTime_7478 = XMLGetInt(cXMLReaderNode_r1, "TEAMKickResponseTime", 0, 0xA);
+  // 001DCCA4 <- **字段 7474 赋值**
+  tFreeGoal_r0->m_iTEAMMoveResponseTime_7474 = XMLGetInt(cXMLReaderNode_r1, "TEAMMoveResponseTime", 0, 5);
+  // 001DCCB8 <- **字段 74C4 赋值**
+  tFreeGoal_r0->m_fTEAMPassForceShotDist_74C4 = XMLGetFloat(cXMLReaderNode_r1, "TEAMPassForceShotDist", NULL, 8.0f);
+  // 001DCCCC <- **字段 74C8 赋值**
+  tFreeGoal_r0->m_fTEAMPassForceShotSpace_74C8 = XMLGetFloat(cXMLReaderNode_r1, "TEAMPassForceShotSpace", NULL, 4.0f);
+  // 001DCCDE <- **字段 74CC 赋值**
+  tFreeGoal_r0->m_iShootBias_74CC = XMLGetInt(cXMLReaderNode_r1, "ShootBias", NULL, 0);
+  // 001DCCF0 <- **字段 74D4 赋值**
+  tFreeGoal_r0->m_iPassBias_74D4 = XMLGetInt(cXMLReaderNode_r1, "PassBias", NULL, 0);
+  // 001DCD02 <- **字段 74DC 赋值**
+  tFreeGoal_r0->m_iControlWhenShootBias_74DC = XMLGetInt(cXMLReaderNode_r1, "ControlWhenShootBias", NULL, 0);
+  // 001DCD14 <- **字段 74E4 赋值**
+  tFreeGoal_r0->m_iControlWhenPassBias_74E4 = XMLGetInt(cXMLReaderNode_r1, "ControlWhenPassBias", NULL, 0);
+  // 001DCD26 <- **字段 74D0 赋值**
+  tFreeGoal_r0->m_iShootScale_74D0 = XMLGetInt(cXMLReaderNode_r1, "ShootScale", NULL, 0);
+  // 001DCD38 <- **字段 74D8 赋值**
+  tFreeGoal_r0->m_iPassScale_74D8 = XMLGetInt(cXMLReaderNode_r1, "PassScale", NULL, 0);
+  // 001DCD4A <- **字段 74E0 赋值**
+  tFreeGoal_r0->m_iControlWhenShootScale_74E0 = XMLGetInt(cXMLReaderNode_r1, "ControlWhenShootScale", NULL, 0);
+  // 001DCD5C <- **字段 74E8 赋值**
+  tFreeGoal_r0->m_iControlWhenPassScale_74E8 = XMLGetInt(cXMLReaderNode_r1, "ControlWhenPassScale", NULL, 0);
+  // 001DCD6E <- **字段 74EC 赋值**
+  tFreeGoal_r0->m_iControlRepeatReduce_74EC = XMLGetInt(cXMLReaderNode_r1, "ControlRepeatReduce", NULL, 10);
+  // 001DCD80 <- **字段 74F0 赋值**
+  tFreeGoal_r0->m_iPropCount_74F0 = XMLGetInt(cXMLReaderNode_r1, "PropCount", NULL, 0);
+
+  // 001DCD9C <- **局部变量赋值**
+  CFTTXmlReaderNode  cPropNode_44 = cXMLReaderNode_r1.GetFirstChild("Prop");  // cNode_var_54 IDA中伪代码 NextSibling
+
+  // 001DCD9A <- **寄存器R4作为循环计数器**
+  // 001DCEC2 <- **循环条件判断**
+  for (int i_r4 = 0; i_r4 < tFreeGoal_r0->m_iPropCount_74F0; i_r4++) {
+    // 001DCE64
+
+    // 001DCE7A <- **结构体字段赋值**
+    const char* sFPropTypes[3] = {"CONE", "MANNEQUIN", "BOARD"};
+    tFreeGoal_r0->m_tFreeProp_74F4[i_r4].m_iType_C = ( EFreePropType)XMLGetStringInt(cPropNode_44, "Type", NULL, (const char**)sFPropTypes, 3, 0);
+
+    // 001DCEA0 001DCEA2 <- **TPoint3D结构赋值**
+    // 001DCEA2 <- **该地址使用了VSTR指令,推测TPoint3D使用了浮点数,但还原代码时使用TPointF3D结构体,汇编代码并未一致**
+    tFreeGoal_r0->m_tFreeProp_74F4[i_r4].m_tPoint3D_0 = XMLGetPos3D(cPropNode_44, "Pos", NULL, g_vZero3);
+    // 001DCEB0 <- **字段赋值**
+    tFreeGoal_r0->m_tFreeProp_74F4[i_r4].m_iRot_10 = XMLGetInt(cPropNode_44, "Rot", NULL, 0);
+    // 001DCEB6 <- **读取下一个node**
+    cPropNode_44 = cPropNode_44.GetNextSibling("Prop");
+    // 001DCEBC <- **ADDS            R6, #0x14; 0x14 说明数组元素是5个int的结构体**
+  }  // 001DCEC4 <- **循环代码块结束**
+
+  int iPlayerNO_r10;
+  // 001DCEF0
+  tZero_74 = g_vZero;
+
+  // 001DCEDA 寄存器r3作为循环计数器, iTeamNO_r3 == 1,是对方球队;iTeamNO_r3 == 0,是己方球队
+  for (int iTeamNO_r3 = 0; iTeamNO_r3 != 2; iTeamNO_r3++) {
+    // 001DCEF4 OK
+
+    // 001DCEFE <- **call snprintf**
+    snprintf(pFormatBuf_50, 0x20, "Team%i", iTeamNO_r3);
+    // 001DCF0A <- **局部变量赋值**
+    cNodeTeam_40 = cXMLReaderNode_r1.GetFirstChild(pFormatBuf_50);
+
+    // 001DCF0E <- **if 代码块**
+    if (cNodeTeam_40.IsValid()) {
+      // 001DCF18 OK
+
+      // 001DCF26 <- **局部变量赋值**
+      cNodePlayer_3C = cNodeTeam_40.GetFirstChild("Player");
+
+      iPlayerNO_r10 = 0;  // 001DCF20 <- **循环计数器**
+
+      // 001DD28A <- **call IsValid()**
+      // 001DD294 <- **小于等于 10则跳转**
+      while (cNodePlayer_3C.IsValid() && iPlayerNO_r10 < 11) {
+        // 001DCF2A OK
+        if (XMLExists(cNodePlayer_3C, "Pos", NULL)) {
+          // 001DCF2A OK
+          //tPoint_98 = tZero_74;  // 001DCF42 <- **结构体赋值**
+          // 001DCF46 <- **tPoint_64 接收函数返回值**
+          tPoint_34 = XMLGetPos(cNodePlayer_3C, "Pos", NULL, g_vZero);
+
+          // 001DCF68 <- **结构体比较,这里的操作符重载函数与原始汇编不一致**
+         // if (tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_4 != tPoint_34) {
+            // 001DCF6C OK
+            // 001DCF6E 001DCF72 <- **结构体赋值, 使用结构体操作符重载函数会改变汇编代码结构**
+            // LOGI("hook 0 %d", iPlayerNO_r10);
+            tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_4.dx_0 = tPoint_34.dx_0;  //这里的pos如果改为 TPoint(0,0) 在第一二关时,对方球队的守门员会变得跟自己一方的射门的球员的位置一样
+            tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_4.dy_4 = tPoint_34.dy_4;  // iTeamNO_r3 == 1,是对方球队;iTeamNO_r3 == 0,是己方球队
+            /*if (iTeamNO_r3 == 1 && iPlayerNO_r10 == 2) {
+              tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_4.dx_0 = 0;
+              tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_4.dy_4 = 0;
+              //LOGI("hook 0 [team] %d, [player] %d, x:%d, y:%d", iTeamNO_r3, iPlayerNO_r10, tPoint_64.dx_0, tPoint_64.dy_4 );
+            }*/
+        //  }
+        } else {
+          // 001DCF8A <- **结构体赋值**
+          tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_4 = TPoint(0, 0);
+        }
+
+        // 001DCFAE
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iHoldPosTime_C = XMLGetInt(cNodePlayer_3C, "HoldPosTime", NULL, 0);
+        // 001DCFBA
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iRot_10 = XMLGetInt(cNodePlayer_3C, "Rot", NULL, -1);
+
+        // 001DCFDC <- ** if **
+        if (XMLGetInt(cNodePlayer_3C, "TeamMoveInfluence", NULL, iPlayerNO_r10 ? 1 : 0)) {
+          // 001DCFDE
+          tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iTeamMoveInfluence_14 = true;
+        } else {
+          tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iTeamMoveInfluence_14 = false;
+        }
+
+        tPoint_98 = TPoint(0, 0);  // 001DCFEC <- **结构体赋值**
+        // 001DCFE4 <- **tPoint_64 接收返回值**
+        tPoint_34 = XMLGetPos(cNodePlayer_3C, "MoveInfluence", NULL, tPoint_98);
+        // 001DCFFC <- **结构体比较,重载函数导致汇编不一致**
+        //if (tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_18.dx_0 != tPoint_34.dx_0) {
+          // 001DD004
+          tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_18.dx_0 = tPoint_34.dx_0;  // 001DD004
+          tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_18.dy_4 = tPoint_34.dy_4;  // 001DD00A
+          /*if (iTeamNO_r3 == 1 && iPlayerNO_r10 == 2) {
+             tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_18.dx_0 = 0;
+             tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_18.dy_4 = 0;
+             //LOGI("hook 1 [team] %d, [player] %d, x:%d, y:%d", iTeamNO_r3, iPlayerNO_r10, tPoint_64.dx_0, tPoint_64.dy_4 );
+           }*/
+       // } else {
+          // 001DD010 OK
+         // tPoint_34.dy_4 = tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_18.dy_4;
+       // }
+
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_18.dx_0 = tPoint_34.dx_0 / 0x8000;  // 001DD026
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPoint_18.dy_4 = tPoint_34.dy_4 / 0x8000;  // 001DD032
+
+        // 001DD040 <- **结构体字段赋值**
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iMoveResponseTime_20 = XMLGetInt(cNodePlayer_3C, "MoveResponseTime", NULL, -1);
+        // 001DD052
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iKickResponseTime_24 = XMLGetInt(cNodePlayer_3C, "KickResponseTime", NULL, -1);
+        // 001DD06A
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_bStatic_28 = XMLGetInt(cNodePlayer_3C, "Static", NULL, 0) ? true : false;
+
+        const char* sFPATypes[3] = {"AI", "PASS", "SHOOT"};
+        // 001DD084
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iAction_534 = XMLGetStringInt(cNodePlayer_3C, "Action", NULL, (const char**)sFPATypes, 3, 0);
+        // 001DD094
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iActionPassTarget_538 = XMLGetInt(cNodePlayer_3C, "ActionPassTarget", NULL, 0);
+        // 001DD0A4
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iActionControlCount_53C = XMLGetInt(cNodePlayer_3C, "ActionControlCount", NULL, 0);
+        // 001DD0B6
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iActionControlRot_540 = XMLGetInt(cNodePlayer_3C, "ActionControlRot", NULL, -1);
+        // 001DD0CE
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_fActionControlKickAhead_544 = XMLGetFloat(cNodePlayer_3C, "ActionControlKickAhead", NULL, 0);
+
+        // 001DD0C8 <- **循环计数器初始化**
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iNodeTDestSetLoopIndex_2C = 0;
+
+        // 001DD0D4 <- **call GetFirstChild()**
+        // 001DD1AA <- **call IsValid()**
+        for (auto cNode = cNodePlayer_3C.GetFirstChild("Move"); cNode.IsValid(); cNode = cNode.GetNextSibling("Move")) {
+          // 001DD0DA
+          int iTempIndex = tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iNodeTDestSetLoopIndex_2C;
+          // 001DD0E4 <- **call XMLExits**
+          if (XMLExists(cNode, "Dest", NULL)) {
+            // 001DD0EC
+            // iTempIndex++;
+            tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iNodeTDestSetLoopIndex_2C++;  // 001DD0F4
+            // auto ptr =  (char*)(tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPlayerMoveInfo_30) + sizeof(TFreeMoveInfo) * iTempIndex;
+            // auto pTFreeMoveInfo = (TFreeMoveInfo*)ptr;
+            // pTFreeMoveInfo->m_iTick_0 = XMLGetInt(cNode, "Tick", NULL, 0);
+            // 001DD10E <- **字段赋值**
+            tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPlayerDesk_30[iTempIndex].m_iTick_0 = XMLGetInt(cNode, "Tick", NULL, 0);
+            // 001DD11C <- **字段赋值**
+            tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPlayerDesk_30[iTempIndex].m_iFace_C = XMLGetInt(cNode, "Face", NULL, -1);
+            // pTFreeMoveInfo->m_iFace_C = XMLGetInt(cNode, "Face", NULL, -1);
+            // tPoint_98 = vZero; //001DD128 <- **结构体赋值**
+
+            // 001DD12C <- **tPoint_64接收返回值**
+           
+            tPoint_34 = XMLGetPos(cNode, "Dest", NULL, g_vZero);  // tPoint_98);
+
+            // 001DD13C <- **结构体比较**
+           
+              // 001DD144
+              tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPlayerDesk_30[iTempIndex].m_tDestPoint_4.dx_0 = tPoint_34.dx_0;  // player 2 bug
+              tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPlayerDesk_30[iTempIndex].m_tDestPoint_4.dy_4 = tPoint_34.dy_4;
+           
+
+            // 001DD158 <- **字段赋值**
+            tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPlayerDesk_30[iTempIndex].m_iUrgency_10 = XMLGetInt(cNode, "Urgency", NULL, 50);
+            // pTFreeMoveInfo->m_iUrgency_10 = XMLGetInt(cNode, "Urgency", NULL, 50);
+            tPoint_98 = TPoint(0, 0);                                        // 001DD164
+            tPoint_34 = XMLGetPos(cNode, "MoveInfluence", NULL, tPoint_98);  // 001DD16A <- **call XMLGetPos()**
+            // 001DD174 <- **结构体比较**
+            //if (tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPlayerDesk_30[iTempIndex].m_tMoveInfluence_14 != tPoint_34) {
+              // 001DD178
+              tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPlayerDesk_30[iTempIndex].m_tMoveInfluence_14.dx_0 = tPoint_34.dx_0;  // 001DD178 001DD17C <- **赋值**
+              tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPlayerDesk_30[iTempIndex].m_tMoveInfluence_14.dy_4 = tPoint_34.dy_4;
+           // } else {
+              // 001DD182
+           //   tPoint_34.dy_4 = tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPlayerDesk_30[iTempIndex].m_tMoveInfluence_14.dy_4;
+          //  }
+            tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPlayerDesk_30[iTempIndex].m_tMoveInfluence_14.dx_0 = tPoint_34.dx_0 / 0x8000;  // 001DD18E
+            tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tPlayerDesk_30[iTempIndex].m_tMoveInfluence_14.dy_4 = tPoint_34.dy_4 / 0x8000;  // 001DD198
+
+          }  // 001DD1AA <- **if XMLExists 代码块结束**
+
+        }  // 001DD1B2 <- **循环结束**
+
+        // 001DD1B6 <- **字段赋值**
+        tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iNodeAnimSetLoopIndex_3B0 = 0;
+
+        // 001DD1C0 <- **call GetFirstChild()**
+        // 001DD264 <- **call IsValid()**
+        for (auto cNode = cNodePlayer_3C.GetFirstChild("Anim"); cNode.IsValid(); cNode = cNode.GetNextSibling("Anim")) {
+          // 001DD1C6
+          int index = tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iNodeAnimSetLoopIndex_3B0;
+          tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iNodeAnimSetLoopIndex_3B0 += 1;  // 001DD1CE
+          // 001DD1E8 <- **字段赋值**
+          tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tAnim_3B4[index].m_iTick_0 = XMLGetInt(cNode, "Tick", NULL, 0);
+          // 001DD1FA <- **字段赋值*
+          tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tAnim_3B4[index].m_iRot_8 = XMLGetInt(cNode, "Rot", NULL, -1);
+
+          // 001DD208 <- **if 代码块起始地址**
+          char* pAnimStr = XMLGetString(cNode, "Anim", NULL, 0);
+          if (pAnimStr) {
+            // 001DD20A
+            tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tAnim_3B4[index].m_iAnimID_4 = CAnimManager::GetAnimID(pAnimStr);
+            if (tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tAnim_3B4[index].m_iAnimID_4 == -1) {
+              // 001DD216
+              tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iNodeAnimSetLoopIndex_3B0--;  // 001DD21C
+              // 001DD220 <- **该地址出现赋值0操作**
+              tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_tAnim_3B4[index].m_iAnimID_4 = 0;
+            }
+          } else {
+            // 001DD250
+            tFreeGoal_r0->m_tTeamPlayerInfo_1C[iTeamNO_r3][iPlayerNO_r10].m_iNodeAnimSetLoopIndex_3B0--;  // 001DD252
+          }
+        }
+        cNodePlayer_3C = cNodePlayer_3C.GetNextSibling("Player");  // 001DD274
+        iPlayerNO_r10++;                                           // 001DD282 <- **计数器加一**
+      }
+      // 001DD2A0 <- **字段赋值**
+      tFreeGoal_r0->m_iTeamPlayerIndex_14[iTeamNO_r3] = iPlayerNO_r10;
+
+      // 001DD2AC <- **结构体赋值**
+      tPoint_98 = TPoint(0xA0000, 0xA0000);
+      // 001DD2B4 <- **call XMLGetPos()**
+      tPoint_34 = XMLGetPos(cNodeTeam_40, "MoveInfluence", NULL, tPoint_98);
+      // 001DD2C6 <-**结构体比较**
+      // if (tFreeGoal_r0->m_tMoveInfluence_74A4[iTeamNO_r3].m_tMoveInfluencePoint_0 != tPoint_34) {
+      //   // 001DD2CA OK
+        tFreeGoal_r0->m_tMoveInfluence_74A4[iTeamNO_r3].m_tMoveInfluencePoint_0.dx_0 = tPoint_34.dx_0;
+        tFreeGoal_r0->m_tMoveInfluence_74A4[iTeamNO_r3].m_tMoveInfluencePoint_0.dy_4 = tPoint_34.dy_4;
+      // } else {
+      //   // 001DD2DA OK
+      //   tPoint_34.dy_4 = tFreeGoal_r0->m_tMoveInfluence_74A4[iTeamNO_r3].m_tMoveInfluencePoint_0.dy_4;
+      // }
+      tFreeGoal_r0->m_tMoveInfluence_74A4[iTeamNO_r3].m_tMoveInfluencePoint_0.dx_0 = tPoint_34.dx_0 / 0x8000;  // 001DD2EE
+      tFreeGoal_r0->m_tMoveInfluence_74A4[iTeamNO_r3].m_tMoveInfluencePoint_0.dy_4 = tPoint_34.dy_4 / 0x8000;  // 001DD2FA
+
+      // tFreeGoal_r0->m_tMoveInfluence_74A4[iTeamNO_r3].m_tMoveInfluencePoint_0.dx_0 = tPoint_34.dx_0 / 0x8000;  // 001DD2EE
+      // tFreeGoal_r0->m_tMoveInfluence_74A4[iTeamNO_r3].m_tMoveInfluencePoint_0.dy_4 = tPoint_34.dy_4 / 0x8000;  // 001DD2FA
+
+      tFreeGoal_r0->m_tMoveInfluence_74A4[iTeamNO_r3].m_iMoveInfluenceDelayMin_8 = XMLGetInt(cNodeTeam_40, "MoveInfluenceDelayMin", 0, 10);  // 001DD30E
+      tFreeGoal_r0->m_tMoveInfluence_74A4[iTeamNO_r3].m_iMoveInfluenceDelayMax_C = XMLGetInt(cNodeTeam_40, "MoveInfluenceDelayMax", 0, 25);  // 001DD324
+    }
+  }
+
+  // 001DD338
+  FREE_SortPlayers(tFreeGoal_r0);
+}
 //-------------------------------------------------------------------------------------------------
 // 00169A80 ^_-
 //单元测试等级: 游戏运行正常

+ 124 - 87
jni/TFreeControl.h

@@ -6,7 +6,8 @@
 #include "global_func.h"
 
 enum EFreePropType {
-  EFreePropType_0,
+  EFreePropType_ner=-1,
+  EFreePropType_0=0,
   EFreePropType_1,
   EFreePropType_2,
   EFreePropType_3,
@@ -22,16 +23,28 @@ struct TAnim {
 
 // sizeof(TDest) == 0x1C
 struct TFreeMoveInfo {
-  int       m_iTick_0;           
-  TPoint    m_tDestPoint_4;      
-  int       m_iFace_C;           
-  int       m_iUrgency_10;       
-  TPoint    m_tMoveInfluence_14;
+  int m_iTick_0;
+  TPoint m_tDestPoint_4;
+  int m_iFace_C;
+  int m_iUrgency_10;
+  TPoint m_tMoveInfluence_14;
+  //SH_ALW_INLINE
+  void UpdateDest(const TPoint& point) {
+    if ((void*)&m_tDestPoint_4 != &point) {
+      m_tDestPoint_4 = point;
+    }
+  };
+
+ // SH_ALW_INLINE
+  void UpdateMoveInfluence(const TPoint& point) {
+    if ((void*)&m_tMoveInfluence_14 != &point) {
+      m_tMoveInfluence_14 = point;
+    }
+  };
 };
 
 // sizeof = 0x548
-struct TFreePlayer
-{
+struct TFreePlayer {
   int filed_0;
   TPoint m_tPoint_4;
   int m_iHoldPosTime_C;
@@ -53,85 +66,114 @@ struct TFreePlayer
 };
 
 struct TMoveInfluence {
-  TPoint      m_tMoveInfluencePoint_0;
-  int         m_iMoveInfluenceDelayMin_8;
-  int         m_iMoveInfluenceDelayMax_C;
+  TPoint m_tMoveInfluencePoint_0;
+  int m_iMoveInfluenceDelayMin_8;
+  int m_iMoveInfluenceDelayMax_C;
 };
 
 struct TFreeProp {
-  TPoint3D    m_tPoint3D_0;
-  EFreePropType   m_iType_C;
-  int         m_iRot_10;
+  TPoint3D m_tPoint3D_0;
+  EFreePropType m_iType_C;
+  int m_iRot_10;
 };
 
-//0x7634
+// 0x7634
 struct TFreeGoal {
-  int         m_iVersion_0;
-  float       m_f_4;
-  int         m_iWeather_8;
-  int         m_iMaxPhaseCount_C;
-  bool        m_bIndirect_10;
-  int         m_iTeamPlayerIndex_14[2]; // 14 遍历两只球队成员node对象时用到的计数器跳出循环时的值
-                                        // 18
-  TFreePlayer   m_tTeamPlayerInfo_1C[2][11];     // 0x3A18 * 2; 0x548 * 0xB
-  TPoint3D    m_tBallPos_744C;    
-  int         m_iUserPlayer_7458;
-  int         m_iKickPlayer_745C;
-  int         m_iAnimID_7460;
-  int         m_iKickRot_7464;
-  int         m_iShotAnimID_7468;
-  int         m_iShotAnimPlayer_746C;
-  float       m_fShotAnimDistance_7470;
-  int         m_iTEAMMoveResponseTime_7474;
-  int         m_iTEAMKickResponseTime_7478;
-  int         m_iCPUPlayerCloseDownCount_747C;
-  float       m_fCPUCloseDownDist_7480;
-  int         m_iCPUGKRating_7484;
-  float       m_fCPUGKSaveAlwaysDistance_7488;
-  int         m_iCPUGKSaveResponseTime_748C;
-  float       m_fCPUGKSaveSpeed_7490;
-  float       m_fCPUGKSaveDistance_7494;
-  int         m_iCPUGKPosResponseTime_7498;
-  int         m_iCPUKickResponseTime_749C;
-  int         m_iCPUMoveResponseTime_74A0;
+  int m_iVersion_0;
+  float m_f_4;
+  int m_iWeather_8;
+  int m_iMaxPhaseCount_C;
+  bool m_bIndirect_10;
+  int m_iTeamPlayerIndex_14[2];             // 14 遍历两只球队成员node对象时用到的计数器跳出循环时的值
+                                            // 18
+  TFreePlayer m_tTeamPlayerInfo_1C[2][11];  // 0x3A18 * 2; 0x548 * 0xB
+  TPoint3D m_tBallPos_744C;
+  int m_iUserPlayer_7458;
+  int m_iKickPlayer_745C;
+  int m_iAnimID_7460;
+  int m_iKickRot_7464;
+  int m_iShotAnimID_7468;
+  int m_iShotAnimPlayer_746C;
+  float m_fShotAnimDistance_7470;
+  int m_iTEAMMoveResponseTime_7474;
+  int m_iTEAMKickResponseTime_7478;
+  int m_iCPUPlayerCloseDownCount_747C;
+  float m_fCPUCloseDownDist_7480;
+  int m_iCPUGKRating_7484;
+  int m_fCPUGKSaveAlwaysDistance_7488;
+  int m_iCPUGKSaveResponseTime_748C;
+  float m_fCPUGKSaveSpeed_7490;
+  float m_fCPUGKSaveDistance_7494;
+  int m_iCPUGKPosResponseTime_7498;
+  int m_iCPUKickResponseTime_749C;
+  int m_iCPUMoveResponseTime_74A0;
   TMoveInfluence m_tMoveInfluence_74A4[2];
-  float       m_fTEAMPassForceShotDist_74C4;
-  float       m_fTEAMPassForceShotSpace_74C8;
-  int         m_iShootBias_74CC;
-  int         m_iShootScale_74D0;
-  int         m_iPassBias_74D4;
-  int         m_iPassScale_74D8;
-  int         m_iControlWhenShootBias_74DC;
-  int         m_iControlWhenShootScale_74E0;
-  int         m_iControlWhenPassBias_74E4;
-  int         m_iControlWhenPassScale_74E8;
-  int         m_iControlRepeatReduce_74EC;
-  int         m_iPropCount_74F0;
-  TFreeProp   m_tFreeProp_74F4[16]; // 数组
+  float m_fTEAMPassForceShotDist_74C4;
+  float m_fTEAMPassForceShotSpace_74C8;
+  int m_iShootBias_74CC;
+  int m_iShootScale_74D0;
+  int m_iPassBias_74D4;
+  int m_iPassScale_74D8;
+  int m_iControlWhenShootBias_74DC;
+  int m_iControlWhenShootScale_74E0;
+  int m_iControlWhenPassBias_74E4;
+  int m_iControlWhenPassScale_74E8;
+  int m_iControlRepeatReduce_74EC;
+  int m_iPropCount_74F0;
+  TFreeProp m_tFreeProp_74F4[16];  // 数组
 };
 
-//sizeof:0x410
+struct TFreeControl_3DC {
+  int cBuff_0[6];  // 3DC
+  bool b_18;       // 6
+  bool b_19;
+  bool b_1A;
+  bool b_1B;
+  int field_1C;  // 7
+  int field_20;  // 8
+};
+
+// sizeof:0x410
 class TFreeControl {
 public:
-  TFreeControl& operator=(TFreeControl const&); //001D5E10
-  CPlayer* m_pPlayer_0;             
+  TFreeControl& operator=(TFreeControl const&);  // 001D5E10
+  CPlayer* m_pPlayer_0;
   TKickSetup field_4;
-  TPoint PointArr_1C[120];          
-  int cBuff_3DC[9];               
-  int field_400;                    
-  int field_404;                    
-  int field_408;                    
-  int field_40C;                    
+  TPoint PointArr_1C[120];
+  TFreeControl_3DC cBuff_3DC;
+  // int filed_3E8; 3
+  // int filed_3EC; 4
+  // int filed_3F0; 5
+  // bool  bc_3F4;  6
+  // bool  b_3F5;
+  // bool  b_3F6;
+  // bool  b_3F7;
+  // int field_3F8; 7
+  // int field_3FC; 8
+  TPoint tPoint_400;
+  int field_408;
+  int field_40C;
+};
+
+// sizeof = 0x30
+struct TFreeInfo_0_10 {
+  int i_0;
+  int i_4;
+  TPoint3D tPoint3D_8;
+  int i_14;
+  int i_18;
+  TPoint3D tPoint3D_1C;
+  int i_28;
+  uchar uc_2C;
 };
 
-struct TFreeInfo_0
-{
+struct TFreeInfo_0 {
   bool b_0;
   bool b_1;
   bool b_2;
   bool b_3;
-  bool uc_4;
-  bool uc_5;
+  uchar uc_4;
+  uchar uc_5;
   uchar uc_6;
   uchar unuse_7;
   bool b_8;
@@ -142,14 +184,14 @@ struct TFreeInfo_0
   uchar uc_D;
   uchar uc_E;
   uchar uc_F;
-  int field_10;
-  int field_14[1536];
+  TFreeInfo_0_10 field_10[0x80];
+  int field_1810;
   int field_1814;
-  TFreeGoal *pFREE_tGoal_1818;  //此处是FREE_tGoal的指针
+  TFreeGoal* pFREE_tGoal_1818;  //此处是FREE_tGoal的指针
   int field_181C;
   int field_1820;
   int field_1824;
-  uint gamestatus_1828;                 //这个变量应该表示游戏的状态
+  uint gamestatus_1828;  //这个变量应该表示游戏的状态
   int field_182C;
   int field_1830;
   int field_1834;
@@ -158,8 +200,7 @@ struct TFreeInfo_0
   int field_1840;
   int field_1844;
   TPoint3D point3D_1848;
-  //int field_1850;
-  int field_1854;
+  uchar field_1854[4];
   int field_1858;
   short field_185C;
   char field_185E;
@@ -167,26 +208,22 @@ struct TFreeInfo_0
   int field_1864;
 };
 
-struct TFreeInfo_1C9C{
-  char field_1C9C;
+struct TFreeInfo_1C9C {
+  bool field_1C9C;
   int field_1CA0;
   char field_1CA4;
   int field_1CA8;
   int field_1CAC;
-  char field_1CB0;//001D57E6 LDRB R0, [R5,R0] 001D41C2 STRH R4, [R6,R1],可能有两种数据类型
+  char field_1CB0;  // 001D57E6 LDRB R0, [R5,R0] 001D41C2 STRH R4, [R6,R1],可能有两种数据类型
   char field_1CB1;
-  TPoint3D  m_pt3D_1CB4;
+  TPoint3D m_pt3D_1CB4;
   TPoint3D m_pt3D_1CC0;
   int field_1CCC;
   int field_1CD0;
   int field_1CD4;
   int field_1CD8;
-  int field_1CDC;
-  int field_1CE0;
-  int field_1CE4;
-  int field_1CE8;
-  int field_1CEC;
-  int field_1CF0;
+  TPoint3D m_pt3D_1CDC;
+  TPoint3D m_pt3D_1CE8;
   uchar field_1CF4;
   uchar field_1CF5;
   uchar field_1CF6;
@@ -206,10 +243,10 @@ struct TFreeInfo_1C9C{
 /*
 001D59AC TFreeInfo::operator=(TFreeInfo const&);
 */
-//sizeof:0x1D20
+// sizeof:0x1D20
 class TFreeInfo {
 public:
-  TFreeInfo& operator=(TFreeInfo const&);  //001D59AC
+  TFreeInfo& operator=(TFreeInfo const&);  // 001D59AC
   TFreeInfo_0 filed_0;
   int field_1868;
   int field_186C;

+ 19 - 9
jni/XML.cpp

@@ -9,22 +9,25 @@ int dword_477E9C = 0;
 //001F5994 //^_^
 bool XMLExists(CFTTXmlReaderNode a, char const* pName, char const* pChildName) {
   //loc_1F59C4
-  return false;
+  LOGE("XMLExists%s%s%s",a.GetText(pName),pName,pChildName);
+  return rand();
 }
 //-------------------------------------------------------------------------------------------------
 //001F5E80 //^_^ 经过单元测试,功能正常
 TPoint XMLGetPos(CFTTXmlReaderNode a, char const* pName, char const* pChildName, TPoint def) {
-  LOGI("XMLGetPos entry");
-  TPoint ret;
-  return def;
+ TPoint ret;
+  LOGI("XMLGetPos entry%x%x%x",a.prapidxml_xml_node_0,pName,pChildName);
+  ret.dx_0=(float)rand()+def.dx_0;
+  ret.dy_4=(float)rand()+def.dy_4;
+  return ret;
 }
 //-------------------------------------------------------------------------------------------------
 //001F5EBA //^_^
 TPointF XMLGetPosF(CFTTXmlReaderNode a, char const* pName, char const* pChildName, TPointF def) {
   TPointF ret;
-  LOGI("XMLGetFloat entry%x%x%x%x",a.prapidxml_xml_node_0,pName,pChildName,def);
-  ret.fx_0=(float)rand();
-  ret.fy_4=(float)rand();
+  LOGI("XMLGetFloat entry%x%x%x",a.prapidxml_xml_node_0,pName,pChildName);
+  ret.fx_0=(float)rand()+def.fx_0;
+  ret.fy_4=(float)rand()+def.fy_4;
   return ret;
 }
 //-------------------------------------------------------------------------------------------------
@@ -37,6 +40,10 @@ TPointF3D XMLGetPosF3D(CFTTXmlReaderNode a, char const* pName, char const* pChil
 //001F5F2A //^_^
 TPoint3D XMLGetPos3D(CFTTXmlReaderNode a, char const* pName, char const* pChildName, TPoint3D def) {
   TPoint3D ret;
+  ret.dz_8=rand()+def.dz_8;
+  ret.point_0.dx_0=rand()+def.point_0.dx_0;
+  ret.point_0.dy_4=rand()+def.point_0.dy_4;
+  LOGE("XMLGetPos3D%s%s%s",a.GetText(pName),pName,pChildName);
   return ret;
 }
 //-------------------------------------------------------------------------------------------------
@@ -61,13 +68,16 @@ float XMLGetFloat(CFTTXmlReaderNode a, char const* pName, char const* pChildName
 //-------------------------------------------------------------------------------------------------
 //001F613A //^_^
 char* XMLGetString(CFTTXmlReaderNode a, char const* pName, char const* pChildName, char const* pdef) {
-  char* pret = (char*)pdef;
+  char* pret = (char*)rand();
+  LOGI("XMLGetString entry%x%x%x%x",a.prapidxml_xml_node_0,pName,pChildName,pdef);
   return pret;
 }
 //-------------------------------------------------------------------------------------------------
 //001F6160 //^_^
 int XMLGetStringInt(CFTTXmlReaderNode a, char const* pName, char const* pChildName, char const** plist, int count, int def) {
-  return 0;
+  
+  LOGI("XMLGetString entry%x%x%x%x%x%x",a.prapidxml_xml_node_0,pName,pChildName,*plist,count,def);
+  return rand();
 }
 //-------------------------------------------------------------------------------------------------
 //001F6198