#include "FREE.h"
#include "LOCstring.h"
#include "CStoryHUD.h"
#include "CStoryCore.h"
#include "CBall.h"
#include "CFTTPObject.h"
#include "CFTTPPBox.h"
#include "CFTTPPCone.h"
#include "CFTTPPCylinder.h"
#include "CFTTPPPolyhedron.h"
#include "CFTTPPSphere.h"
#include "CFTTPhysics.h"
#include "CModelManager.h"
#include "CPlayerManager.h"
#include "fpoint.h"
#include "memctrl.h"
#include "sub.h"
#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,
    0x1855, 0x1856, 0, 0, 0, 0, 0, 0, 0,
    0x184F, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0x1850, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0x184E, 0, 0, 0, 0, 0, 0, 0, 0, 0,
    0x186B, 0x186C, 0, 0, 0, 0, 0, 0, 0, 0,
    0x184D, 0x1851, 0x1852, 0x1853, 0x1857, 0x186A, 0, 0, 0, 0,
    0x185B, 0x185C, 0x185D, 0x185E, 0x1864, 0x1869, 0, 0, 0, 0,
    0x1860, 0x1861, 0x1862, 0x1865, 0x1866, 0, 0, 0, 0, 0,
    0x1863, 0x1868, 0x1867, 0x185F, 0, 0, 0, 0, 0, 0,
    0x1867, 0x1861, 0x1859, 0x185A, 0, 0, 0, 0, 0, 0,
    0xFB, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x1878, 0x1879,
    0, 0, 0, 0, 0, 0, 0, 0, 0x1876, 0x1877, 0, 0, 0, 0, 0, 0, 0, 0,
    0x186D, 0x186E, 0x186F, 0x1870, 0x1871, 0x1873, 0x1874, 0x1875, 0x1872, 0};
// FREE_tInfo  0x1D20
// FREE_tGoal  0x7634
int FREE_iTeam ;
TFreeGoal FREE_tGoal;
TFreeInfo FREE_tInfo;
CFTTModel *FREE_pStarModel;
int FREE_iPropWeather;
const char *s_sPropModels_SNOW[3] = {
    "PKG:/data/env/dressing/cone_snow.ftm",
    "PKG:/data/env/dressing/mannequin_snow.ftm",
    "PKG:/data/env/dressing/rebounder.ftm"};
CFTTModel *FREE_pPropModel[3];
const char *s_sPropModels[3] = {"PKG:/data/env/dressing/cone.ftm",
                                "PKG:/data/env/dressing/mannequin.ftm",
                                "PKG:/data/env/dressing/rebounder.ftm"};
const char *s_sPropModels_Shadow[3] = {"PKG:/data/env/dressing/cone.ftm",
                                       "PKG:/data/env/dressing/mannequin_s.ftm",
                                       "PKG:/data/env/dressing/rebounder.ftm"};
CFTTModel *FREE_pPropModelShadow[3];

//-------------------------------------------------------------------------------------------------
// 001D2758
int FREE_GetLevelFilename(char *, int, char *, bool &) { return 0; }
//-------------------------------------------------------------------------------------------------
// 001D27EC
void FREE_GetWorldRot(TPoint, TPoint) {}
//-------------------------------------------------------------------------------------------------
// 001D281C
void FREE_CalcKickAngle(TPoint3D *, TPoint3D, TPoint3D, int, int, int *) {}
//-------------------------------------------------------------------------------------------------
// 001D2A98
int FREE_PassCheckPath(CPlayer *, TPoint, TPoint) { return 0; }
//-------------------------------------------------------------------------------------------------
// 001D2BC0
void FREE_ResolveEndPoint(TPoint3D *, TPoint3D *, TPoint *, int *, bool) {}
//-------------------------------------------------------------------------------------------------
// 001D30B8
void FREE_GetKickPower(EAnimID, int *, int *) {}
//-------------------------------------------------------------------------------------------------
// 001D30FC
void FREE_ProcessControls(bool) {}
//-------------------------------------------------------------------------------------------------
// 001D3EC8
int FREE_CalcKickTargetTime(int) { return 0; }
//-------------------------------------------------------------------------------------------------
// 001D3EEC
void FREE_ResetControls() {}
//-------------------------------------------------------------------------------------------------
// 001D3F24
int FREE_PassIsLowKick(TFreeControl *, TPoint3D *, TPoint3D *, int) {
  return 0;
}
//-------------------------------------------------------------------------------------------------
// 001D3FA8
void FREE_ControlGetKickLimits(CPlayer *player0, int *pi1, int *pi2, int *pi3) {
  int *var_58 = pi1;
  int *var_54 = pi2;
  int *var_50 = pi3;
  int var_2C = 0;
  int var_28 = 0;
  TPoint3D var_38;
  TPoint3D var_48;
  int r0_i = player0->tStr32_44.field_10;
  FREE_GetKickPower((EAnimID)r0_i, &var_28, &var_2C);
  var_28 = 100;
  int r4_i = 21627;
  var_48.point_0.dy_4 = XMATH_InterpolateClamp(100, 0, 1600, 0, r4_i);
  r0_i = XMATH_InterpolateClamp(var_2C, 0, 1600, 0, r4_i);
  // 001D3FF0
  if (r0_i < r4_i) {
    // 001D3FF4
    r4_i = r0_i;
  }
  // 001D3FF6
  var_48.dz_8 = r4_i;
  r0_i = 0;
  int r7_i = 163840;
  int r6_i = 0;
  r4_i = 0;
  var_48.point_0.dx_0 = r0_i;
  int r1_i;
  // loc_1D40EA
  while (r7_i != 1998848) {
    // loc_1D4006
    int r2_i = FREE_CalcKickTargetTime(r7_i);
    int r9_i = 4096;
    // r5 = cball
    int r8_i = cBall.ballPosPrev_4.point_0.dx_0;
    int r3_i = cBall.ballPosPrev_4.point_0.dy_4;
    int r10_i = r7_i + r3_i;
    // 356A7C - 0x356A70
    r0_i = cBall.ballPosPrev_4.dz_8;
    int var_3C = r6_i;
    int r11_i;
    // 001D4024
    if (r0_i < 32768) {
      // 001D402A
      TPoint3D tp1;
      // int var_4C = r2_i;
      tp1.point_0.dx_0 = r8_i;
      tp1.point_0.dy_4 = r3_i;
      tp1.dz_8 = r0_i;
      TPoint3D tp2;
      tp2.point_0.dx_0 = r8_i;
      tp2.point_0.dy_4 = r10_i;
      tp2.dz_8 = r9_i;
      /*
       * 描述:此处在连续入栈时STRD和STM有出入
       * 原始汇编： STMEA.W         SP, {R0,R8,R10}
       * 自已汇编：  STRD.W          R10, R8, [SP,#0x78+var_78]
       */
      int var_4C = r2_i;
      r0_i = cBall.SetBallMoveToPosLow(&var_38, tp1, tp2, r2_i, -1);
      r11_i = r7_i;
      r1_i = var_48.point_0.dx_0;
      // 001D404A
      if (r0_i < var_48.dz_8) {
        // 001D4050
        r1_i = r7_i;
      }
      var_48.point_0.dx_0 = r1_i;
      r1_i = var_48.point_0.dy_4;
      // 001D4056
      if (r0_i < r1_i) {
        // 001D405A
        r11_i = r4_i;
      }
      // 001D405C
      if (r4_i != 0) {
        // 001D4060
        r11_i = r4_i;
      }
      // 001D4062
      r2_i = cBall.ballPosPrev_4.point_0.dx_0;
      r3_i = cBall.ballPosPrev_4.point_0.dy_4;
      r1_i = r8_i;
      r0_i = cBall.ballPosPrev_4.dz_8;
      r8_i = r2_i;
      r2_i = var_4C;
    } else {
      // loc_1D4070
      r1_i = r8_i;
      r11_i = r4_i;
    }
    // 001D4076
    TPoint3D var_78;
    var_78.point_0.dx_0 = r8_i;
    var_78.point_0.dy_4 = r3_i;
    var_78.dz_8 = r0_i;
    TPoint3D var_6C;
    var_6C.point_0.dx_0 = r1_i;
    var_6C.point_0.dy_4 = r10_i;
    var_6C.dz_8 = r9_i;
    r4_i = r2_i;
    int r5_i =
        cBall.SetBallMoveToPosSpin(&var_38, 0, -2000, var_78, var_6C, r2_i, 0);
    r0_i = r0_i * 2;
    r1_i = (uint)r0_i / (uint)5u;
    // r0_i = var_38.dz_8 ;
    r0_i = r7_i;
    // 001D40A4
    if (var_38.dz_8 > r1_i) {
      // 001D40AA
      r5_i = XMATH_Mag3D(&var_38);
      r0_i = var_38.dz_8;
      r0_i = r0_i / 49;
      r0_i = r0_i * r7_i;
      r0_i = r0_i / r4_i;
    }  // loc_1D40C4

    r4_i = r0_i;
    r1_i = var_48.point_0.dy_4;
    r7_i += 32768;
    // 001D40CC
    if (r5_i < r1_i) {
      // 001D40D0
      r4_i = r11_i;
    }
    // 001D40D2
    if (r11_i != 0) {
      // 001D40D8
      r4_i = r11_i;
    }
    r6_i = var_3C;
    // 001D40DC
    if (r0_i <= r6_i) {
      // 001D40E0
      r0_i = r6_i;
    }
    r1_i = var_48.dz_8;
    // 001D40EA
    if (r5_i < r1_i) {
      // 001D40E8
      r6_i = r0_i;
    }
  }  // loc_1D4006
  r0_i = r4_i << 1u;
  r1_i = 3;
  r0_i = r0_i / r1_i;
  int *r1_pi = var_58;
  *r1_pi = r0_i;
  r1_i = var_48.point_0.dx_0;
  // 001D40EA
  if (r1_i >= 1146880) {
    // 001D40F0
    r1_i = 1146880;
  }
  *var_54 = r1_i;
  *var_50 = r6_i;
}
//-------------------------------------------------------------------------------------------------
// 001D4120
void FREE_Init() {}
//-------------------------------------------------------------------------------------------------
// 001D4160
void FREE_Shutdown() {}
//-------------------------------------------------------------------------------------------------
// 001D41B0
void FREE_InitGoal(int, bool, bool, bool) {}
//-------------------------------------------------------------------------------------------------
// 001D4318 //^_-
//单元测试等级:目测游戏表现
//测试内容：启动游戏到第1关传球射门
//测试结果: 游戏表现正常无崩溃且无明显变化,检测到日志输出
//测试分支: 001D4318
void FREE_SetupDifficulty() {
  /*
   * 描述:此处自己的汇编变量赋值上顺序有不同,多种尝试,不太容易完全一致
   */
  FREE_tInfo.field_1C9C.m_iCPUPlayerCloseDownCount_1CF8 = FREE_tGoal.m_iCPUPlayerCloseDownCount_747C;
  FREE_tInfo.field_1C9C.m_fCPUCloseDownDist_1CFC =FREE_tGoal.m_fCPUCloseDownDist_7480;
  FREE_tInfo.field_1C9C.m_iCPUKickResponseTime_1D18 = FREE_tGoal.m_iCPUKickResponseTime_749C;
  FREE_tInfo.field_1C9C.m_iCPUMoveResponseTime_1D1C = FREE_tGoal.m_iCPUMoveResponseTime_74A0;
  FREE_tInfo.field_1C9C.m_iCPUGKRating_1D00 = FREE_tGoal.m_iCPUGKRating_7484;
  //注意！！！！！这里的数据符号不对 注意更新 FREE_tGoal.m_fCPUGKSaveAlwaysDistance_7488为float
  FREE_tInfo.field_1C9C.m_fCPUGKSaveAlwaysDistance_1D04 = FREE_tGoal.m_fCPUGKSaveAlwaysDistance_7488;
  FREE_tInfo.field_1C9C.m_iCPUGKSaveResponseTime_1D08 = FREE_tGoal.m_iCPUGKSaveResponseTime_748C;
  FREE_tInfo.field_1C9C.m_fCPUGKSaveSpeed_1D0C =FREE_tGoal.m_fCPUGKSaveSpeed_7490;
  FREE_tInfo.field_1C9C.m_fCPUGKSaveDistance_1D10 =FREE_tGoal.m_fCPUGKSaveDistance_7494;

  uchar r5_c = FREE_tInfo.field_1C9C.field_1CF6;
  FREE_tInfo.field_1C9C.m_iCPUGKPosResponseTime_1D14 =FREE_tGoal.m_iCPUGKPosResponseTime_7498;
  // 001D43B6
  if (r5_c != 0) {
    // 001D43B8
    // float s0_f = 2.8;
    FREE_tInfo.field_1C9C.m_iCPUGKRating_1D00 =FREE_tGoal.m_iCPUGKRating_7484 - 5;
    FREE_tInfo.field_1C9C.m_iCPUGKSaveResponseTime_1D08 = FREE_tGoal.m_iCPUGKSaveResponseTime_748C + 4;
    FREE_tInfo.field_1C9C.m_iCPUGKPosResponseTime_1D14 =FREE_tGoal.m_iCPUGKPosResponseTime_7498 + 4;
    FREE_tInfo.field_1C9C.m_fCPUGKSaveAlwaysDistance_1D04 = FREE_tGoal.m_fCPUGKSaveAlwaysDistance_7488 -0.200000003f;
    
    // 001D43E6
    if ((float)FREE_tGoal.m_fCPUGKSaveDistance_7494 - 0.200000003f > 2.8f) {
      // 001D43FA
      FREE_tInfo.field_1C9C.m_fCPUGKSaveDistance_1D10 = (float)FREE_tGoal.m_fCPUGKSaveDistance_7494 - 0.200000003f;
    } else
      FREE_tInfo.field_1C9C.m_fCPUGKSaveDistance_1D10 = 2.8f;
    FREE_tInfo.field_1C9C.m_fCPUGKSaveSpeed_1D0C =FREE_tGoal.m_fCPUGKSaveSpeed_7490 -5.0f;
    
  }
  // locret_1D4410
}
//-------------------------------------------------------------------------------------------------
// 001D4424
void FREE_Initialise() {}
//-------------------------------------------------------------------------------------------------
// 001D49C0
void FREE_UpdateCamera(bool) {}
//-------------------------------------------------------------------------------------------------
// 001D56CC
void FREE_ClipPathBounds(TPoint3D *, TPoint3D *, int, int, int, int) {}
//-------------------------------------------------------------------------------------------------
// 001D5718
// void FREE_GameLoop() {
//   int r0_i = 0;
//   int r1_i = 0;
//   int r2_i = 0;
//   // 001D571E
//   if (NIS_Active() != 0) {
//     // 001D5720
//    // NIS_GameLoop();
//     CFreeHUD::Process();
//     // 47F7D8 - 0x47DFB0
//     r0_i = FREE_tInfo.filed_0.gamestatus_1828;
//     // 001D5734
//     if (r0_i == 6) {
//       // 001D5738
//       FREE_ProcessFail();
//       r1_i = FREE_tInfo.filed_0.field_182C;
//       r1_i = r1_i + 1;
//       FREE_tInfo.filed_0.field_182C = r1_i;
//       return;
//     } else {
//       // locret_1D582E
//       return;
//     }
//   }
//   // loc_1D5748
//   // 47F7D8 - 0x47DFB0 = 1828
//   r0_i = FREE_tInfo.filed_0.gamestatus_1828;
//   // 001D5754
//   if (r0_i != 8) {
//     // 001D5758
//     tGame.maybe_sound_0++;
//   }
//   // loc_1D5764
//   // 004877F5
//   NISGOAL_tInfo.field_1 = 0;
//   // 47DFB1 - 0x47DFB0
//   FREE_tInfo.filed_0.b_1 = 1;

//   // 001D5776
//   if (CReplay::Playing() != 0) {
//     // 001D5778
//     CReplay::Play();
//   }
//   // loc_1D577C
//   // 47F7D8 - 0x47DFB0
//   r0_i = FREE_tInfo.filed_0.gamestatus_1828;
//   // 001D5782
//   if (r0_i == 7) {
//     // 47F7DC - 0x47DFB0
//     r1_i = FREE_tInfo.filed_0.field_182C;
//     // 3A27BC - 0x39BB88
//     r2_i = tGame.field_6C34;
//     // 001D5798
//     if (r2_i < r1_i) {
//       // 001D579C
//       r0_i = tGame.mTLogic_6678.field_50;
//       r1_i = FREE_tInfo.filed_0.pFREE_tGoal_1818->m_iUserPlayer_7458;

//       if (r1_i == r0_i) {
//         // 001D57C6
//         CGFXFX::EnableStarPlayerEffects();
//       }
//     } else {
//       // loc_1D57B0
//       r0_i = FREE_tInfo.filed_0.pFREE_tGoal_1818->m_iUserPlayer_7458;
//       r1_i = FREE_tInfo.filed_0.field_1830;

//       if (r1_i == r0_i) {
//         // 001D57C6
//         CGFXFX::EnableStarPlayerEffects();
//       }
//     }
//   }
//   // loc_1D57CA
//   // lostphp.com/hexconvert该网站转换，反编译后与原汇编一致
//   float r0_f = 0.01666666753590107;
//   CGFXFX::Update(r0_f);
//   GFXCAMERA_ApplyIngameSettings(-1, -1);
//   GFXCAMERA_UpdateMatrices();
//   int r4_i = FREE_ProcessLogic();
//   // 47FC60 - 0x47DFB0
//   FREE_UpdateCamera(FREE_tInfo.field_1C9C.field_1CB0 == false);
//   // 001D57F2
//   if (r4_i != 0) {
//     // 001D57F8
//     if (CReplay::Playing() != 0) {
//       // loc_1D57FA
//       CAM_Update();
//       return;
//     }
//   } else {
//     // loc_1D57FA
//     CAM_Update();
//     return;
//   }
//   // loc_1D5802
//   // 3A2208 - 0x39BB88
//   r0_i = tGame.mTLogic_6678.field_8;
//   // 001D580E
//   if (r0_i == 2) {
//     // 001D5812
//     // 3A2238 - 0x39BB88
//     r0_i = tGame.mTLogic_6678.field_38;
//     // 001D5818
//     if (r0_i <= 29) {
//       // 001D581C
//       CReplay::RecordFrame();
//     }
//   } else {
//     // loc_1D5822
//     CReplay::RecordFrame();
//   }
//   // loc_1D5826
//   // 3A22A0 - 0x39BB88
//   r0_i = tGame.mTLogic_6678.field_A0;
//   // 001D582C
//   if (r0_i != 0) {
//     // locret_1D582E
//     return;
//   }
//   // loc_1D5830
//   CPlayerManager::UpdatePlayersLogic();
//   FREE_CheckCollision();
//   cBall.UpdateFrame();
//   // 47F7D8 - 0x47DFB0
//   r0_i = FREE_tInfo.filed_0.gamestatus_1828;
//   // 001D584A
//   if (r0_i != 4) {
//     // 001D584E
//     COL_PlayerCollisions();
//   }
//   // 001D5852
//   PhysicsTest();
//   cBall.CheckEvents();
//   // lostphp.com/hexconvert该网站转换，反编译后与原汇编一致
//   GFXNET::Update(0.01666666753590107f);
//   GL_UpdatePlayMode();
//   GM_CalcPlayerDist();
//   GM_CalcPlayerBallInterceptions();
//   FREE_LogicProcess();
//   // 3A2204 - 0x39BB88
//   r0_i = (uchar)tGame.mTLogic_6678.field_4;
//   // 001D5878
//   if (r0_i == 0) {
//     // 001D587C
//     r0_i = FREE_tInfo.filed_0.gamestatus_1828;
//     // 001D5882
//     if (r0_i >= 4) {
//       // 001D5886
//       CPlayerManager::UpdatePlayers();
//     }
//     // 001D588A
//     COMM_Process();
//   }
//   // loc_1D57FA
//   CAM_Update();
//   return;
// }
//-------------------------------------------------------------------------------------------------
// 001D58B4
void FREE_StoreRewindState() { tGame.mTLogic_6678.field_8 = rand() % 10; }
//-------------------------------------------------------------------------------------------------
// 001D5A3E
void FREE_UpdateRewindState() {}
//-------------------------------------------------------------------------------------------------
// 001D5A40
void FREE_RestoreRewindState() {}
//-------------------------------------------------------------------------------------------------
// 001D5AE4
void FREE_BeginRewind() {}
//-------------------------------------------------------------------------------------------------
// 001D5B30
int FREE_RewindFrame() { return 0; }
//-------------------------------------------------------------------------------------------------
// 001D5C0C
void FREE_ClipPathBounds(TPoint *, TPoint *, int, int, int, int) {}
//-------------------------------------------------------------------------------------------------
// 001D656C
void FREE_IdleProcess() {
  tGame.mTLogic_6678.field_8 = 1;
  LOGE("FREE_IdleProcess");
}
//-------------------------------------------------------------------------------------------------
// 001D66F0
void FREE_SetupKick(TFreeControl *, TPoint3D *) {}

void COUNTER_UpdateGenericCounters(void) {
  LOGE("COUNTER_UpdateGenericCountersrand=%x", rand());
}
//-------------------------------------------------------------------------------------------------
// 001D6778 //^_-
//单元测试等级:目测游戏表现
//测试内容：启动游戏到第5关传球射门
//测试结果: 修复后游戏表现正常
void FREE_LogicProcess() {
  tGame.mTLogic_6678.field_AC = cBall.ballPosPrev_4.point_0.dx_0;
  tGame.mTLogic_6678.field_B0 = cBall.ballPosPrev_4.point_0.dy_4;

  // 001D679E
  if (tGame.mTLogic_6678.field_8 > 2 && tGame.mTLogic_6678.field_8 < 5) {
    // 001D67A2
    FREE_IdleProcess();
  } else {
    // loc_1D67A8
    if (tGame.mTLogic_6678.field_8 == 1) {
      // 001D67AC
      COUNTER_UpdateGenericCounters();
    }
    // loc_1D67B0
  }
  // loc_1D67B0
  if (tGame.mTLogic_6678.field_10 == 0) {
    if (tGame.mTLogic_6678.field_8 != 1) {
      // 001D67C4
      CPlayerManager::SetPlayersWalking(1);
    }
  }
  // loc_1D67C8
  tGame.field_6C34++;
  tGame.field_6C38++;
}
//-------------------------------------------------------------------------------------------------
// 001D67E8
int FREE_GetPassTargetPlayer(CPlayer *, int *) { return 0; }
//-------------------------------------------------------------------------------------------------
// 001D6918
void FREE_ProcessShotAnim(CPlayer *) {}
//-------------------------------------------------------------------------------------------------
// 001D6CD8
void FREE_ProcessUserTeam() {}
//-------------------------------------------------------------------------------------------------
// 001D7D74
void FREE_ProcessOppoTeam() {}
//-------------------------------------------------------------------------------------------------
// 001D848C
void FREE_ProcessFree() {}
//-------------------------------------------------------------------------------------------------
// 001D86C4
void FREE_ProcessFail() {}
//-------------------------------------------------------------------------------------------------
// 001D8884
void FREE_PlayCommentaryClearance() {}
//-------------------------------------------------------------------------------------------------
// 001D8944
void FREE_PlayCommentaryInterception() {}
//-------------------------------------------------------------------------------------------------
// 001D8998
void FREE_SetupKickAction(TPoint3D tPoint3D0, int i1, int i2) {
  TPoint3D var_30_sp18 = tPoint3D0;
  int r4_i = FREE_tInfo.filed_0.field_1834;
  CPlayer* r5_player = tGame.allplay_14[FREE_iTeam].teamlist_0[FREE_tInfo.filed_0.field_1840];
  int r0_i = r4_i + 1;
  // 001D89DA
  if (r0_i == -1) {
    // 001D89DE
    r0_i = CAnimManager::GetActionAnim(r5_player, EPlayerState_12, &var_30_sp18, i2, 0, 10, -1, 0);
    r4_i = r0_i;
    FREE_tInfo.filed_0.field_1834 = r0_i;
  }
  // loc_1D89FE
  TAnimData* r7_pAnimData = &CAnimManager::s_tAnimData[r4_i];
  int r11_i = CAnimManager::GetActionTime(r4_i, 0, 1024);
  TPoint var_38;
  r0_i = r7_pAnimData->s_64;
  int r8_i = i2;
  r4_i = r8_i;
  int r3_i = r8_i - r0_i;
  r5_player->GetAnimActionPoint(&var_38, r7_pAnimData, r3_i & 0x3FFFu, 0);
  //  FREE_tInfo.field_1870 = var_30.point_0;  这句是多余的？
  // 47F838 - 0x47DFB0 = 1888
  // 47F828 - 0x47DFB0 = 1878
  r0_i = var_30_sp18.point_0.dx_0;
  int r1_i = var_30_sp18.point_0.dy_4;
  int r2_i = var_30_sp18.dz_8;

  FREE_tInfo.field_1878 = r2_i;
  FREE_tInfo.field_1888 = r4_i;
  r3_i = tGame.maybe_sound_0;
  r2_i = var_38.dx_0;
  int r5_i = var_38.dy_4;
  r5_i = r1_i - r5_i;
  r4_i = r0_i - r2_i;
  // 47F82C - 0x47DFB0 = 187C
  FREE_tInfo.field_187C = r4_i;
  // 47F830 - 0x47DFB0 = 1880
  FREE_tInfo.field_1880 = r5_i;
  r0_i = i1 - r11_i;
  // 001D8A4C
  if (i1 != 0) {
    // 001D8A7C
    r3_i = r3_i + r0_i;
  }
  // 47F834 - 0x47DFB0 = 1884
  FREE_tInfo.field_1884 = r3_i;
  FREE_tInfo.field_1870 = var_38;
  // 001D8A8A
  if (i1 == 0) {
    // 001D8A94
    TPoint tPoint;
    tPoint.dx_0 = r4_i;
    tPoint.dy_4 = r5_i;
    r5_player->SetPos(tPoint);
    r5_player->SetMoveDest(tPoint);
    r0_i = r7_pAnimData->s_64;
    r1_i = i2;
    r1_i = r1_i - r0_i;
    r5_player->SetRot(r1_i & 0x3FFFu, 1);
  }
  // loc_1D8ABA
}
//-------------------------------------------------------------------------------------------------
// 001D8AD0
void FREE_CheckGKHandPos(CPlayer *, int) {}
//-------------------------------------------------------------------------------------------------
// 001D8B9C
int FREE_SetupPhaseTransition(bool) { return 0; }
//-------------------------------------------------------------------------------------------------
// 001D8DB4
int FREE_PlayerGetUrgency(CPlayer *, int) { return 0; }
//-------------------------------------------------------------------------------------------------
// 001D8E68
void FREE_ProcessInProgressCore() {}
//-------------------------------------------------------------------------------------------------
// 001D956C
void FREE_UpdateSuccess(void) {
  // 001D956C
  TPoint3D var_30_sp20;
  TPoint3D var_40_sp10;

  /*
   * 描述:寄存嚣加载略有不同，VLDR，VLD1.8这两个不知道到底什么区别
   * 原始汇编：VLDR            D16, [R2]
   * 自己汇编：VLD1.8          {D16}, [R2]
   */
  TPoint3D var_50_sp0 = FREE_tInfo.filed_0.point3D_1848;
  // 001D958E
  if (FREE_tInfo.filed_0.field_1840 > -1) {
    // 001D959C
    int r1_i = var_50_sp0.dz_8;
    // 001D95A8
    if (r1_i <= 0x1000) {
      // 001D95A8
      r1_i = 0x1000;
    }
    var_50_sp0.dz_8 = r1_i;
    cBallProj.EnsureProj(FREE_tInfo.filed_0.kickTargetTime_1838 + 10);
    int r0_i = FREE_tInfo.filed_0.kickTargetTime_1838;
    int r7_i = 0x7FFFFFFF;
    int r8_i = 600;
    // r10 = var_50
    int r5_i = r0_i - 10;
    int r11_i;
    // loc_1D963E
    while (r5_i <= r0_i + 10) {
      // loc_1D95D4
      r0_i = cBallProj.field_E4;
      // 47F7EC - 0x47DFB0 =183C
      r0_i = r0_i + r5_i;
      r0_i = r0_i % 512;
      var_40_sp10 = cBallProj.field_E8[r0_i].point3D_0;
      // r9 = var40
      if (FREE_tInfo.filed_0.field_183C[0] != 0) {
        // 001D960E
        r0_i = XMATH_Distance(&var_40_sp10.point_0, &var_50_sp0.point_0);
      } else {
        // loc_1D9616
        r0_i = XMATH_Distance3D(&var_40_sp10, &var_50_sp0);
      }
      // loc_1D961C
      if (r0_i < r7_i) {
        // 001D9620
        r7_i = r0_i;
        r8_i = r5_i;
        r11_i = var_40_sp10.dz_8 - var_50_sp0.dz_8;
        var_30_sp20 = var_40_sp10;
      }
      // loc_1D9636
      // 47F7E8 - 0x47DFB0 =1838
      r5_i++;
      r0_i = FREE_tInfo.filed_0.kickTargetTime_1838;
    }
    // 001D9644
    if (FREE_tInfo.filed_0.field_183C[0] == 0) {
      // 001D9644
      cBall.ballMovePrev_10.dz_8 = cBall.ballMovePrev_10.dz_8 - r11_i / r8_i;
    }
    // loc_1D9660
    cBallProj.EnsureProj(r8_i + 1);
    FREE_tInfo.filed_0.point3D_1848 = var_30_sp20;
    FREE_tInfo.field_1884 = tGame.maybe_sound_0 + r8_i;
    FREE_tInfo.filed_0.gamestatus_1828 = 7;
    // 47F834 - 0x47DFB0 =1884

    CStoryCore::m_tStageManager.pStory_5cf4->CreateNPPhoto();
    // loc_1D96BC
  } else {
    // loc_1D96A8
    FREE_tInfo.filed_0.gamestatus_1828 = 7;
    CStoryCore::m_tStageManager.pStory_5cf4->CreateNPPhoto();
  }
  // loc_1D96BC
}
//-------------------------------------------------------------------------------------------------
// 001D96E4
int FREE_ProcessLogic() { return 0; }
//-------------------------------------------------------------------------------------------------
// 001DA0A8
void FREE_PlayCommentaryPassReceive() {}
//-------------------------------------------------------------------------------------------------
// 001DA208
void FREE_PlayCommentaryKick() {}
//-------------------------------------------------------------------------------------------------
// 001DA484
void FREE_SetComplete() {}
//-------------------------------------------------------------------------------------------------
// 001DA5C0
void FREE_PlayersUpset(int) {}
//-------------------------------------------------------------------------------------------------
// 001DA620
void FREE_PlayersCelebrate() {}
//-------------------------------------------------------------------------------------------------
// 001DA670
void FREE_CheckCollision() {}
//-------------------------------------------------------------------------------------------------
// 001DA674
//^_^
void FREE_InitProps(void) {}
//-------------------------------------------------------------------------------------------------
// 001DA730
void FREE_UpdateProps() {}
//-------------------------------------------------------------------------------------------------
// 001DA764
void FREE_ShutdownProps() {}
//-------------------------------------------------------------------------------------------------
// 001DA7A4
void FREE_RenderPropShadow(EFreePropType, CFTTMatrix32 *) {}
//-------------------------------------------------------------------------------------------------
// 001DA7BC
void FREE_RenderProp(EFreePropType, CFTTMatrix32 *) {}
//-------------------------------------------------------------------------------------------------
// 001DA7D4
void FREE_RenderPropShadows() {}
//-------------------------------------------------------------------------------------------------
// 001DA8C0
void FREE_RenderProps() {}
//-------------------------------------------------------------------------------------------------
// 001DA9AC
void FREE_ProcessPropCollision(TFreeProp *) {}
//-------------------------------------------------------------------------------------------------
// 001DA9AE
void FREE_ProcessPropCollisions() {}
//-------------------------------------------------------------------------------------------------
// 001DA9B0
//^_^
void FREE_RenderInitOnce() {}
//-------------------------------------------------------------------------------------------------
// 001DA9E0
void FREE_RenderShutdownOnce() {}
//-------------------------------------------------------------------------------------------------
// 001DAA00
void FREE_RenderInit() {}
//-------------------------------------------------------------------------------------------------
// 001DAAAC
void FREE_RenderShutdown() {}
//-------------------------------------------------------------------------------------------------
// 001DAAF4
void FREE_RenderListBegin(char const *, bool, bool) {}
//-------------------------------------------------------------------------------------------------
// 001DAB84
void FREE_RenderListEnd() {}
//-------------------------------------------------------------------------------------------------
// 001DABD4
void FREE_RenderAddVert(TFVF_PFLOAT_CINT_TFLOAT *, CFTTMatrix32 *) {}
//-------------------------------------------------------------------------------------------------
// 001DAC40
void FREE_RenderStar(TPoint3D, float, float) {}
//-------------------------------------------------------------------------------------------------
// 001DACE4
void FREE_RenderTarget(TPoint3D, int, uint, bool) {}
//-------------------------------------------------------------------------------------------------
// 001DAEEC
void FREE_RenderDottedArc(TPoint3D, int, int, int, int, int, uint) {}
//-------------------------------------------------------------------------------------------------
// 001DB0BC
void FREE_RenderRangeCone() {}
//-------------------------------------------------------------------------------------------------
// 001DB3CC
void FREE_RenderDottedLine(TPoint3D, TPoint3D, int, uint, uint) {}
//-------------------------------------------------------------------------------------------------
// 001DB5C0
void FREE_RenderTutorialLine(TPoint3D const &, TPoint3D const &, int) {}
//-------------------------------------------------------------------------------------------------
// 001DB9C8
void FREE_RenderEditPlayerLine(TPoint3D const &, TPoint3D const &) {}
//-------------------------------------------------------------------------------------------------
// 001DBBCC
void FREE_Render3DOpaque() {}
//-------------------------------------------------------------------------------------------------
// 001DBBF0
void FREE_RenderHeroPlayer(bool) {}
//-------------------------------------------------------------------------------------------------
// 001DBEEC
void FREE_Render3DDecal() {}
//-------------------------------------------------------------------------------------------------
// 001DBFC4
void FREE_RenderPreSelectedPlayer() {}
//-------------------------------------------------------------------------------------------------
// 001DC0E0
void FREE_RenderProcess() {
  MP_cMyProfile.m_TProfileData.m_CGameSettings_2b80.filed_0.filed_0=rand()%10;
}
//-------------------------------------------------------------------------------------------------
// 001DC0E4
void FREE_AddVisualFeedback(int i0, EVFEffect e1, int i2) {
  CStoryHUD* r0_hud = CStoryCore::m_tStageManager.pStory_5cf4;
  r0_hud->ClearVisualFeedback();

  int r0_i = 0;
  int r4_i = i2;
  int r5_i = e1;
  int r6_i = i0;
  // int r7_i =0;
  int r1_i = r6_i + r6_i * 4;
  int* r7_pi = s_iEVFStrings + r1_i * 2;
  // loc_1DC120
  while (r0_i <= 9) {
    // loc_1DC118
    r1_i = *(r7_pi + r0_i);
    if (r1_i == 0) {
      break;
    }
    // loc_1DC120
    r0_i++;
  }  // loc_1DC118
  // loc_1DC124
  r0_i = XSYS_Random(r0_i);
  r0_i = *(r7_pi + r0_i);
  wchar_t* r1_pwc = LOCstring(r0_i);
  wchar_t var_218[256];
  xstrlcpy(var_218, r1_pwc, 256);
  int r3_i;
  int r7_i;
  // 47AEA8 - 0x477E90
  r0_i = MP_cMyProfile.m_TProfileData.m_CGameSettings_2b80.filed_0.filed_0;
  // 001DC148
  if (r0_i == 1) {
    // 001DC14C
    xstrlcat(var_218, L" ", 256);
  } else {
    // loc_1DC152
    xstrlcat(var_218, L"!", 256);
  }

  /*
    * 描述:此处分支被合并到下面的cBall变量访问的代码块中了
    * 原始汇编：    BLX             j__Z8xstrlcatPwPKwj
                   LDR             R0, =(cBall_ptr - 0x1DC166)
                   ADD             R0, PC
                   LDR             R0, [R0]
                   LDR             R1, [R0,#(dword_356A7C - 0x356A70)]
     * 自已汇编：   ...
     *            LDR             R0, =(cBall_ptr - 0xA26A)
                   MOV.W           R4, #0xFFFFFFFF
                   ADD             R0, PC
                   LDR             R0, [R0]
                   LDRD.W          R3, R2, [R0,#4]
                   LDR             R0, [R0,#(dword_27A4C - 0x27A40)]
     */
  // 356A7C - 0x356A70
  // 001DC168
  r1_i = cBall.ballPosPrev_4.dz_8;
  if (r1_i <= 98304) {
    // 001DC16E
    r1_i = 98304;
  }
  r3_i = cBall.ballPosPrev_4.point_0.dx_0;
  int r2_i = cBall.ballPosPrev_4.point_0.dy_4;
  bool bC1F8 = false;
  // 001DC174
  if (r4_i + 1 != 0) {
    // 001DC176
    if (r5_i == 3) {
      // 001DC17A
      r1_i = tGame.CPlayer_3050[r4_i].ballPosPrev_4.dz_8;
      r2_i = tGame.CPlayer_3050[r4_i].ballPosPrev_4.point_0.dy_4;
      r3_i = tGame.CPlayer_3050[r4_i].ballPosPrev_4.point_0.dx_0;
      r4_i = -1;
      // 001DC18A
      if (r6_i != 12) {
        // 001DC1A2
        r1_i = r1_i + 98304;
      }
      // loc_1DC1F8
      bC1F8 = true;
    } else {
      // loc_1DC1B2
      r1_i = 98304;
      r2_i = 0;
      r3_i = 0;
    }
    // loc_1DC1BA
  } else {
    // loc_1DC1A8
    r4_i = -1;
  }
  if (bC1F8 == false) {
    // loc_1DC1BA
    uint r0_ui = (uint)r5_i - 1u;
    // 001DC1BC
    if (r0_ui >= 2) {
      // 001DC1C0
      if (r5_i != 3) {
        // 001DC1C4
        if (r5_i == 0) {
          // 001DC1C8
          // 4B0E34 - 0x4AB140
          CStoryHUD* r0_hud = CStoryCore::m_tStageManager.pStory_5cf4;
          r7_i = 0;
          r6_i = 1;
          int var_228 = r6_i;
          int var_224 = r7_i;
          int var_220 = r4_i;
          int r12_i = -256;
          float r5_f = 1;
          r4_i = 100;
          r6_i = 1602;
          TPoint3D tp3d0;
          tp3d0.point_0.dx_0 = r3_i;
          tp3d0.point_0.dy_4 = r2_i;
          tp3d0.dz_8 = r1_i;
          TPoint3D tp3d1;
          tp3d1.point_0.dx_0 = r7_i;
          tp3d1.point_0.dy_4 = r7_i;
          tp3d1.dz_8 = r6_i;
          return r0_hud->AddVisualFeedback(var_218, 0, tp3d0, tp3d1, r4_i, r5_f, r12_i,
                                           var_228, (EVFEffect)var_224, var_220);
        }
        // loc_1DC25E
        return;
      }
      // F8
    } else {
      // loc_1DC228
      float r6_f = 0.699999988079071;
      r7_i = 1;
      CStoryHUD* r0_hud = CStoryCore::m_tStageManager.pStory_5cf4;
      int var_228 = r7_i;
      int var_224 = r5_i;
      int var_220 = r4_i;
      r5_i = 60;
      r7_i = 0;
      r4_i = 1602;
      int r12_i = -1;
      TPoint3D tp3d0;
      tp3d0.point_0.dx_0 = r3_i;
      tp3d0.point_0.dy_4 = r2_i;
      tp3d0.dz_8 = r1_i;
      TPoint3D tp3d1;
      tp3d1.point_0.dx_0 = r7_i;
      tp3d1.point_0.dy_4 = r7_i;
      tp3d1.dz_8 = r4_i;
      return r0_hud->AddVisualFeedback(var_218, 0, tp3d0, tp3d1, r5_i, r6_f, r12_i, var_228,
                                       (EVFEffect)var_224, var_220);
    }
  }
  // loc_1DC1F8
  r0_i = -801;
  r7_i = 1;
  r6_i = -12566464;
  int lr_i = r0_i;
  // lostphp.com/hexconvert该网站转换，反编译后与原汇编一致
  float r12_f = 0.699999988079071;
  r0_hud = CStoryCore::m_tStageManager.pStory_5cf4;
  int var_228 = r7_i;
  int var_224 = r5_i;
  r7_i = 40;
  r5_i = 0;
  TPoint3D tp3d0;
  tp3d0.point_0.dx_0 = r3_i;
  tp3d0.point_0.dy_4 = r2_i;
  tp3d0.dz_8 = r1_i;
  TPoint3D tp3d1;
  tp3d1.point_0.dx_0 = r5_i;
  tp3d1.point_0.dy_4 = r5_i;
  tp3d1.dz_8 = lr_i;
  r0_hud->AddVisualFeedback(var_218, 0, tp3d0, tp3d1, r7_i, r12_f, r6_i, var_228, (EVFEffect)var_224, r4_i);
}
//-------------------------------------------------------------------------------------------------
// 001DC290
void FREE_AddVisualFeedback_Pass() {
  
  TPoint var_1C = cBallProj.field_E8[((cBallProj.field_E4 + 1) % 512)].point3D_0.point_0;
  CPlayer* r7_pplayer = tGame.mTMath_6734.pPlayer_134[FREE_iTeam];
  int r0_i = XMATH_Distance(&tGame.mTLogic_6678.field_64, &var_1C);
  // 3A2278 - 0x39BB88 = 66F0
  int r2_i = tGame.mTLogic_6678.field_78;  //[2]
  TAnimData* anims = CAnimManager::s_tAnimData;
  int r1_i = (ushort)anims[r2_i].u_C.filed_C;
  r1_i = r1_i & 1032u;
  int r4_i;
  EVFEffect r5_i;
  /*
    * 描述: 原汇编r5= 1有归并，自己汇编分成了两处, 寄存嚣分配有出入
    * 原始汇编：    loc_1DC30A
    *                     MOVS            R5, #1
                          B               loc_1DC31A
     * 自已汇编：   BLE             loc_E2EC
                   MOVS            R4, #1
     */
  //    bool bC30A = false;
  // 001DC2FC
  if (r1_i == 0) {
    // loc_1DC302
    if (r0_i > 819200) {
      // 001DC308
      r4_i = 8;
      r5_i = EVFEffect_1;
    } else {
      // loc_1DC30E
      r4_i = 9;
      if (r0_i < 327680) {
        // 001DC316
        r4_i = 10;
      }
      r5_i = EVFEffect_2;
    }
  } else {
    r4_i = 11;
    r5_i = EVFEffect_1;
  }

  // loc_1DC30A
  // loc_1DC31A
  CPlayer* r0_pplayer = &tGame.CPlayer_3050[0];
  r2_i = r7_pplayer - r0_pplayer;
  FREE_AddVisualFeedback(r4_i, r5_i, r2_i);
  r0_i = XSYS_Random(2);
  r0_i = r0_i + 3;
  SNDGAME_Crowd_PlayReaction(r0_i);
}
//-------------------------------------------------------------------------------------------------
// 001DC354
void FREE_AddVisualFeedback_Goal() {}
//-------------------------------------------------------------------------------------------------
// 001DC440
void FREE_AddVisualFeedback_Fail() {}
//-------------------------------------------------------------------------------------------------
// 001DC494
void FREE_AddVisualFeedback_Offside() {}
//-------------------------------------------------------------------------------------------------
// 001DC4C8
void FREE_SortPlayers(TFreeGoal *a1) {
  LOGE("FREE_SortPlayers%p",a1);
}
//-------------------------------------------------------------------------------------------------
// 001DC664
void FREE_SortPlayersDistance(TFreeGoal *) {}
//-------------------------------------------------------------------------------------------------
// 001DC848
int FREE_ReadXML(TFreeGoal *, int) { return 0; }
//-------------------------------------------------------------------------------------------------
// 001DC888
bool FREE_ReadXML(TFreeGoal *, char *) { return 0; }
//-------------------------------------------------------------------------------------------------
// 001DCA14
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 ^_-
//单元测试等级: 游戏运行正常
//单元测试内容: 1-10关
//单元测试结果: 正常
void PhysicsTest() {
  LOGE("PhysicsTest_0");  // OK
  fpointQ<PointType_18> fpointq_sp240;
  fpointq_sp240.field_0 = 0;
  fpointq_sp240.field_4 = 0;
  fpointq_sp240.field_8 = 0;
  fpointq_sp240.field_C = 0x40000;
  fpoint3<PointType_18> fpoint3_sp25c;
  fpoint3_sp25c.x_0 = -cBall.point3D_2C.point_0.dx_0 * 8;
  fpoint3_sp25c.y_4 = cBall.point3D_2C.dz_8 * 8;
  fpoint3_sp25c.z_8 = cBall.point3D_2C.point_0.dy_4 * 8;
  CFTTPObject *r6_pobject = new CFTTPObject(
      EPhysicsObjectType_0, EFreePropType_3, 1, fpoint3_sp25c, fpointq_sp240);
  r6_pobject->fpoint3_1C.x_0 =
      -((cBall.ballPosPrev_4.point_0.dx_0 - cBall.point3D_2C.point_0.dx_0) * 8);
  r6_pobject->fpoint3_1C.y_4 =
      (cBall.ballPosPrev_4.dz_8 - cBall.point3D_2C.dz_8) * 8;
  r6_pobject->fpoint3_1C.z_8 =
      (cBall.ballPosPrev_4.point_0.dy_4 - cBall.point3D_2C.point_0.dy_4) * 8;
  r6_pobject->fpointQ_C.field_0 = cBall.quat_68.d3_8 * 64;
  r6_pobject->fpointQ_C.field_4 = cBall.quat_68.d2_4 * 64;
  r6_pobject->fpointQ_C.field_8 = cBall.quat_68.d1_0 * 64;
  r6_pobject->fpointQ_C.field_C = cBall.quat_68.d4_C * 64;
  r6_pobject->fpoint3_28.x_0 = cBall.point3D_1C.point_0.dx_0 * -101;
  r6_pobject->fpoint3_28.y_4 = cBall.point3D_1C.dz_8 * 0x65;
  r6_pobject->fpoint3_28.z_8 = cBall.point3D_1C.point_0.dy_4 * 0x65;
  r6_pobject->field_34 = 0x94D65;
  r6_pobject->field_38 = 0x37D2A4D;
  fpoint<PointType_18> fpoint_sp23c;
  fpoint3<PointType_18> fpoint3_sp230;
  fpointQ<PointType_18> fpointQ_sp220;
  fpointQ_sp220.field_0 = 0;
  fpointQ_sp220.field_4 = 0;
  fpointQ_sp220.field_8 = 0;
  fpointQ_sp220.field_C = 0x40000;
  fpoint3_sp230.x_0 = 0;
  fpoint3_sp230.y_4 = 0;
  fpoint3_sp230.z_8 = 0;
  fpoint_sp23c.var_0 = 0x8000;
  // check 传参是否都是用了栈
  CFTTPPSphere *r0_psphere = new CFTTPPSphere(fpoint_sp23c, fpoint3_sp230,
                                              fpointQ_sp220);  //这里头文件更新
  // 00169B60
  r6_pobject->field_3C = 0x8000;
  r0_psphere->field_64 = 0x8000;
  r6_pobject->field_44 = 0x10000;
  r6_pobject->field_40 = 0x40000;
  r6_pobject->pprimitive_98[r6_pobject->uc_9C++] = r0_psphere;
  r0_psphere->filed_4 = r6_pobject;
  // sp1c=r6_pobject
  CFTTPhysics physics_sp218(0x40);
  fpoint3<PointType_18> *pfpoint3_sp34 = new fpoint3<PointType_18>[0x10];
  // 00169B98
  pfpoint3_sp34[14].z_8 = 0;
  pfpoint3_sp34[15].x_0 = 0;
  pfpoint3_sp34[15].y_4 = 0;
  pfpoint3_sp34[15].z_8 = 0;

  pfpoint3_sp34[13].z_8 = 0;
  pfpoint3_sp34[14].x_0 = 0;
  pfpoint3_sp34[14].y_4 = 0;
  pfpoint3_sp34[14].z_8 = 0;

  pfpoint3_sp34[12].y_4 = 0;
  pfpoint3_sp34[12].z_8 = 0;
  pfpoint3_sp34[13].x_0 = 0;
  pfpoint3_sp34[13].y_4 = 0;
  // 00169C06
  pfpoint3_sp34[11].x_0 = 0;
  pfpoint3_sp34[11].y_4 = 0;
  pfpoint3_sp34[11].z_8 = 0;
  pfpoint3_sp34[12].x_0 = 0;
  // 00169C16
  pfpoint3_sp34[1].y_4 = 0x20000;
  pfpoint3_sp34[2].z_8 = 0x3333;
  pfpoint3_sp34[2].x_0 = 0x18000;
  pfpoint3_sp34[2].y_4 = 0x6AAAA;
  // 00169C2C
  pfpoint3_sp34[2].z_8 = 0x3333;
  pfpoint3_sp34[3].x_0 = 0x10000;
  pfpoint3_sp34[3].y_4 = 0x72AAA;
  pfpoint3_sp34[3].z_8 = 0x3333;
  // 00169C34
  pfpoint3_sp34[4].x_0 = 0xFFFF0000;
  pfpoint3_sp34[4].y_4 = 0x72AAA;
  pfpoint3_sp34[4].z_8 = 0x3333;
  pfpoint3_sp34[4].x_0 = 0xFFFE8000;
  // 00169C3C
  pfpoint3_sp34[4].y_4 = 0x6AAAA;
  pfpoint3_sp34[4].z_8 = 0x3333;
  pfpoint3_sp34[5].x_0 = 0xFFFE8000;
  pfpoint3_sp34[5].y_4 = 0x20000;
  // 00169C44
  pfpoint3_sp34[5].z_8 = 0x3333;
  pfpoint3_sp34[6].x_0 = 0xFFFF0000;
  pfpoint3_sp34[6].y_4 = 0;
  pfpoint3_sp34[6].z_8 = 0x3333;
  // 00169C4C
  pfpoint3_sp34[7].x_0 = 0x10000;
  pfpoint3_sp34[7].y_4 = 0;
  pfpoint3_sp34[7].z_8 = 0xFFFFCCCD;
  pfpoint3_sp34[7].x_0 = 0x18000;
  // 00169C5A
  pfpoint3_sp34[7].y_4 = 0x20000;
  pfpoint3_sp34[7].z_8 = 0xFFFFCCCD;
  pfpoint3_sp34[8].x_0 = 0x18000;
  pfpoint3_sp34[8].y_4 = 0x6AAAA;
  // 00169C60
  pfpoint3_sp34[0].x_0 = 0x10000;
  pfpoint3_sp34[0].y_4 = 0;
  pfpoint3_sp34[0].z_8 = 0x3333;
  pfpoint3_sp34[1].x_0 = 0x18000;
  // 00169C68
  pfpoint3_sp34[14].z_8 = 0xFFFFCCCD;
  pfpoint3_sp34[15].x_0 = 0xFFFF0000;
  pfpoint3_sp34[15].y_4 = 0;
  pfpoint3_sp34[15].z_8 = 0xFFFFCCCD;
  // 00169C6C
  pfpoint3_sp34[13].y_4 = 0x6AAAA;
  pfpoint3_sp34[13].z_8 = 0xFFFFCCCD;
  pfpoint3_sp34[14].x_0 = 0xFFFE8000;
  pfpoint3_sp34[14].y_4 = 0x20000;
  // 00169C74
  pfpoint3_sp34[12].x_0 = 0xFFFF0000;
  pfpoint3_sp34[12].y_4 = 0x72AAA;
  pfpoint3_sp34[12].z_8 = 0xFFFFCCCD;
  pfpoint3_sp34[13].x_0 = 0xFFFE8000;
  // 00169C7C
  pfpoint3_sp34[10].z_8 = 0xFFFFCCCD;
  pfpoint3_sp34[11].x_0 = 0x10000;
  pfpoint3_sp34[11].y_4 = 0x72AAA;
  pfpoint3_sp34[11].z_8 = 0xFFFFCCCD;
  // sp48=FREE_tInfo
  if (FREE_tInfo.filed_0.pFREE_tGoal_1818) {
    // 00169C90
    // loc_16A21E
    LOGE("PhysicsTest_case");
    for (int r2_i = 0;
         r2_i < FREE_tInfo.filed_0.pFREE_tGoal_1818->m_iPropCount_74F0;
         r2_i++) {
      // loc_169CC0
      switch (FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                  .m_iType_C) {
        case 0:  // loc_169EC0
        {
          // check 手机左移
          // sp4c = r2
          // check 运算
          LOGE("PhysicsTest_case_0");
          int r0_i = FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                         .m_iRot_10 *
                     0x40000 / 0xB4;
          uint64 r3r1_ull = 0x3243F4000;
          long long r1r0_ll = r3r1_ull * r0_i >> 32;
          int r4_i = r1r0_ll / 2;
          int i_sp1b0;
          int i_sp214 = r4_i;
          sub_16A57C(i_sp1b0, i_sp214);
          sub_16A6CC(i_sp214, r4_i);
          fpoint3<PointType_18> fpoint3_spc0;
          fpointQ<PointType_18> fpointQ_spb0;
          // check 乘法
          fpoint3_spc0.x_0 =
              -FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                   .m_tPoint3D_0.point_0.dx_0 *
              8;
          fpoint3_spc0.y_4 =
              FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                  .m_tPoint3D_0.dz_8 *
              8;
          fpoint3_spc0.z_8 =
              FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                  .m_tPoint3D_0.point_0.dy_4 *
              8;

          fpointQ_spb0.field_0 = 0;
          fpointQ_spb0.field_4 = i_sp1b0;
          fpointQ_spb0.field_8 = 0;
          fpointQ_spb0.field_C = i_sp214;

          CFTTPObject *r4_pobject = new CFTTPObject(
              EPhysicsObjectType_2,
              FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                  .m_iType_C,
              2, fpoint3_spc0, fpointQ_spb0);
          // 00169F5C
          r4_pobject->field_34 = 0;
          r4_pobject->field_38 = 0;
          r4_pobject->field_3C = 0x40000;
          r4_pobject->field_40 = 0x4000;  // dword_16A448
          r4_pobject->field_44 = 0x20000;
          fpoint<PointType_18> fpoint_spac;
          fpoint<PointType_18> fpoint_spa8;
          fpoint<PointType_18> fpoint_spa4;
          fpoint3<PointType_18> fpoint3_sp98;
          fpointQ<PointType_18> fpointQ_sp80;
          fpoint3_sp98.x_0 = 0;
          fpoint_spac.var_0 = 0x3333;
          fpoint_spa8.var_0 = 0x6666;
          fpoint_spa4.var_0 = 0x15555;
          fpointQ_sp80.field_0 = 0;
          fpointQ_sp80.field_4 = 0;
          fpointQ_sp80.field_8 = 0;
          fpointQ_sp80.field_C = 0x40000;

          fpoint3_sp98.y_4 = 0xEAAA;
          fpoint3_sp98.z_8 = 0;
          // fpointQ_sp80

          CFTTPPCone *r5_pcone =
              new CFTTPPCone(fpoint_spac, fpoint_spa8, fpoint_spa4,
                             fpoint3_sp98, fpointQ_sp80);
          fpoint3<PointType_18> fpoint3_sp74;
          fpoint3<PointType_18> fpoint3_sp68;
          fpointQ<PointType_18> fpointQ_sp50;
          fpoint3_sp74.x_0 = 0xCCCC;
          fpointQ_sp50.field_0 = 0;
          fpointQ_sp50.field_4 = 0;
          fpointQ_sp50.field_8 = 0;
          fpointQ_sp50.field_C = 0x40000;
          fpoint3_sp74.y_4 = 0x4000;
          fpoint3_sp74.z_8 = 0xCCCC;
          fpoint3_sp68.x_0 = 0;
          fpoint3_sp68.y_4 = 0x2000;
          fpoint3_sp68.z_8 = 0;
          CFTTPPBox *r0_pbox =
              new CFTTPPBox(fpoint3_sp74, fpoint3_sp68, fpointQ_sp50);
          r5_pcone->field_64 = 0x15555;
          r0_pbox->field_64 = 0xCCCC;
          r4_pobject->pprimitive_98[r4_pobject->uc_9C++] = r0_pbox;
          r0_pbox->filed_4 = r4_pobject;

          r4_pobject->pprimitive_98[r4_pobject->uc_9C++] = r5_pcone;
          r5_pcone->filed_4 = r4_pobject;

          physics_sp218.ppobject_0[physics_sp218.object_counts_4++] =
              r4_pobject;
          break;
        }
        case 2:  // loc_16A030
        {
          LOGE("PhysicsTest_case_2");
          int r0_i = FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                         .m_iRot_10 *
                     0x40000 / 0xB4;
          uint64 r3r1_ull = 0x3243F4000;
          long long r1r0_ll = r3r1_ull * r0_i >> 32;
          int r4_i = r1r0_ll / 2;
          int i_sp214;
          int i_sp1b0 = r4_i;
          sub_16A57C(i_sp214, i_sp1b0);
          int i_sp210;
          i_sp1b0 = r4_i;
          sub_16A6CC(i_sp210, i_sp1b0);
          // sp40=i_sp210
          // sp3c=sp214

          fpoint3<PointType_18> fpoint3_sp154;
          fpoint3<PointType_18> fpoint3_sp148;
          fpointQ<PointType_18> fpointQ_sp138;
          fpointQ<PointType_18> fpointQ_sp1b0;
          fpoint3_sp154.x_0 = 0x70000;
          fpoint3_sp154.y_4 = 0x20000;
          fpoint3_sp154.z_8 = 0x6666;
          fpointQ_sp1b0.field_0 = 0x3333;
          fpointQ_sp1b0.field_4 = 0;
          fpointQ_sp1b0.field_8 = 0;
          fpointQ_sp1b0.field_C = 0x40000;
          sub_16A88C(fpointQ_sp138, fpointQ_sp1b0);
          CFTTPPBox *pbox_sp38 =
              new CFTTPPBox(fpoint3_sp154, fpoint3_sp148, fpointQ_sp138);
          // 0016A0DC
          pbox_sp38->field_64 = 0x70000;
          fpoint3<PointType_18> fpoint3_sp12c;
          fpoint3<PointType_18> fpoint3_sp120;
          fpointQ<PointType_18> fpointQ_sp110;
          fpoint3_sp120.x_0 = 0xFFFD0000;
          fpoint3_sp12c.x_0 = 0x6666;
          fpoint3_sp12c.y_4 = 0x20000;
          fpoint3_sp12c.z_8 = 0x15555;
          fpoint3_sp120.y_4 = 0x10000;
          fpoint3_sp120.z_8 = 0xAAAA;
          fpointQ_sp1b0.field_0 = 0x3333;
          fpointQ_sp1b0.field_4 = 0;
          fpointQ_sp1b0.field_8 = 0;
          fpointQ_sp1b0.field_C = 0x40000;
          sub_16A88C(fpointQ_sp110, fpointQ_sp1b0);
          // 0016A120
          CFTTPPBox *r4_pbox =
              new CFTTPPBox(fpoint3_sp12c, fpoint3_sp120, fpointQ_sp110);
          // 0016A122

          fpoint3<PointType_18> fpoint3_sp104;
          fpoint3<PointType_18> fpoint3_spf8;
          fpointQ<PointType_18> fpointQ_spe8;
          fpoint3_sp104.x_0 = 0x6666;
          fpoint3_sp104.y_4 = 0x20000;
          fpoint3_sp104.z_8 = 0x15555;
          fpoint3_spf8.x_0 = 0x30000;
          fpoint3_spf8.y_4 = 0x10000;
          fpoint3_spf8.z_8 = 0xAAAA;
          fpointQ_sp1b0.field_0 = 0x3333;
          fpointQ_sp1b0.field_4 = 0;
          fpointQ_sp1b0.field_8 = 0;
          fpointQ_sp1b0.field_C = 0x40000;
          sub_16A88C(fpointQ_spe8, fpointQ_sp1b0);
          // 0016A164
          CFTTPPBox *r6_pbox =
              new CFTTPPBox(fpoint3_sp104, fpoint3_spf8, fpointQ_spe8);
          // 0016A166
          r4_pbox->field_64 = 0x15555;
          r6_pbox->field_64 = 0x15555;

          fpoint3<PointType_18> fpoint3_spdc;
          fpointQ<PointType_18> fpointQ_spcc;
          fpointQ_spcc.field_4 = i_sp214;
          fpointQ_spcc.field_C = i_sp210;
          fpoint3_spdc.x_0 =
              -FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                   .m_tPoint3D_0.point_0.dx_0 *
              8;
          fpoint3_spdc.z_8 =
              FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                  .m_tPoint3D_0.point_0.dy_4 *
              8;
          fpoint3_spdc.y_4 =
              FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                  .m_tPoint3D_0.dz_8 *
              8;

          fpointQ_spcc.field_0 = 0;
          fpointQ_spcc.field_8 = 0;

          CFTTPObject *r0_pobject = new CFTTPObject(
              EPhysicsObjectType_2,
              FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                  .m_iType_C,
              3, fpoint3_spdc, fpointQ_spcc);
          // 0016A1B0
          r0_pobject->field_34 = 0;
          r0_pobject->field_38 = 0;
          r0_pobject->field_3C = 0x70000;
          r0_pobject->field_40 = 0x30000;
          r0_pobject->field_44 = 0x4000;
          r0_pobject->field_A0 = 0x18;
          r0_pobject->pprimitive_98[r0_pobject->uc_9C++] = pbox_sp38;
          pbox_sp38->filed_4 = r0_pobject;

          r0_pobject->pprimitive_98[r0_pobject->uc_9C++] = r4_pbox;
          r4_pbox->filed_4 = r0_pobject;

          r0_pobject->pprimitive_98[r0_pobject->uc_9C++] = r6_pbox;
          r6_pbox->filed_4 = r0_pobject;

          physics_sp218.ppobject_0[physics_sp218.object_counts_4++] =
              r0_pobject;

          break;
        }
        case 1:  // 00169CDA
        {
          // sp4c = r2
          // check 运算
          LOGE("PhysicsTest_case_1");
          int r0_i = FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                         .m_iRot_10 *
                     0x40000 / 0xB4;
          uint64 r3r1_ull = 0x3243F4000;
          long long r1r0_ll = r3r1_ull * r0_i >> 32;
          int r4_i = r1r0_ll / 2;
          int i_sp214;
          int i_sp210;
          sub_16A57C(i_sp214, r4_i);
          sub_16A6CC(i_sp210, r4_i);
          fpoint3<PointType_18> fpoint3_sp204;
          fpointQ<PointType_18> fpointQ_sp1f4;
          fpointQ_sp1f4.field_0 = 0;
          fpointQ_sp1f4.field_4 = i_sp214;
          fpointQ_sp1f4.field_8 = 0;
          fpointQ_sp1f4.field_C = i_sp210;

          TPoint3D point3D =
              FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                  .m_tPoint3D_0;
          fpoint3_sp204.x_0 = -point3D.point_0.dx_0 * 8;
          fpoint3_sp204.y_4 = 0x15555 + point3D.dz_8 * 8 + 0x44000;
          fpoint3_sp204.z_8 = point3D.point_0.dy_4 * 8;

          CFTTPObject *r11_pobject = new CFTTPObject(
              EPhysicsObjectType_2,
              FREE_tInfo.filed_0.pFREE_tGoal_1818->m_tFreeProp_74F4[r2_i]
                  .m_iType_C,
              3, fpoint3_sp204, fpointQ_sp1f4);
          int i_sp1b0;
          int i_sp1f0 = 0x7F1AA;
          sub_16A818(&i_sp1b0, &i_sp1f0);
          r11_pobject->field_34 = 0;
          r11_pobject->field_38 = 0;
          r11_pobject->field_3C = i_sp1b0;
          r11_pobject->field_40 = 0x10000;
          r11_pobject->field_44 = 0x10000;
          r11_pobject->field_A0 = 0x18;

          fpoint<PointType_18> fpoint_sp1ec;
          fpoint<PointType_18> fpoint_sp1e8;
          fpoint3<PointType_18> fpoint3_sp1dc;
          fpointQ<PointType_18> fpointQ_sp1cc;
          fpoint_sp1ec.var_0 = 0x10000;
          fpoint3_sp1dc.x_0 = 0;
          fpoint3_sp1dc.y_4 = 0x30000 + 0x15555;
          fpoint3_sp1dc.z_8 = 0;
          fpoint_sp1e8.var_0 = 0x6666;
          fpointQ<PointType_18> fpointQ_sp1b0;
          fpointQ_sp1b0.field_0 = 0x40000;
          fpointQ_sp1b0.field_4 = 0;
          fpointQ_sp1b0.field_8 = 0;
          fpointQ_sp1b0.field_C = 0x40000;
          sub_16A88C(fpointQ_sp1cc, fpointQ_sp1b0);
          // check 前俩个参数传递是否使用栈
          CFTTPPCylinder *r4_pcylinder = new CFTTPPCylinder(
              fpoint_sp1ec, fpoint_sp1e8, fpoint3_sp1dc, fpointQ_sp1cc);

          fpoint3<PointType_18> fpoint3_sp1a4;
          fpoint3<PointType_18> fpoint3_sp198;
          fpointQ<PointType_18> fpointQ_sp180;
          fpoint3_sp1a4.z_8 = 0x6666;
          // 00169DF4
          fpointQ_sp180.field_0 = 0;
          fpointQ_sp180.field_4 = 0;
          fpointQ_sp180.field_8 = 0;
          fpointQ_sp180.field_C = 0x40000;
          fpoint3_sp1a4.x_0 = 0x20000;
          fpoint3_sp1a4.y_4 = 0x20000;

          fpoint3_sp198.x_0 = 0;
          fpoint3_sp198.y_4 = 0xFFFB6AAB;
          fpoint3_sp198.z_8 = 0;

          CFTTPPBox *r5_pbox =
              new CFTTPPBox(fpoint3_sp1a4, fpoint3_sp198, fpointQ_sp180);
          // 00169E14
          fpoint3<PointType_18> fpoint3_sp174;
          fpointQ<PointType_18> fpointQ_sp160;
          fpoint3_sp174.y_4 = 0xFFFB6AAB + 0x10000;
          fpoint3_sp174.x_0 = 0;
          fpoint3_sp174.z_8 = 0;
          fpointQ_sp160.field_0 = 0;
          fpointQ_sp160.field_4 = 0;
          fpointQ_sp160.field_8 = 0;
          fpointQ_sp160.field_C = 0x40000;
          CFTTPPPolyhedron *r0_ppolyhedron = new CFTTPPPolyhedron(
              pfpoint3_sp34, 0x10, fpoint3_sp174, fpointQ_sp160);
          // 00169E32
          r4_pcylinder->field_64 = 0x10000;
          r5_pbox->field_64 = 0x20000;
          r0_ppolyhedron->field_64 = 0xABFFF;
          // 00169E42
          r11_pobject->pprimitive_98[r11_pobject->uc_9C++] = r5_pbox;
          r5_pbox->filed_4 = r11_pobject;
          r11_pobject->pprimitive_98[r11_pobject->uc_9C++] = r0_ppolyhedron;
          r0_ppolyhedron->filed_4 = r11_pobject;
          r11_pobject->pprimitive_98[r11_pobject->uc_9C++] = r4_pcylinder;
          r4_pcylinder->filed_4 = r11_pobject;
          physics_sp218.ppobject_0[physics_sp218.object_counts_4++] =
              r11_pobject;
          break;
        }
      }
    }
  }
  // loc_16A232
  physics_sp218.ppobject_0[physics_sp218.object_counts_4++] = r6_pobject;
  if (physics_sp218.Process()) {
    // 0016A24E
    // sp18=cBall
    LOGE("PhysicsTest_1");
    cBall.ballPosPrev_4.point_0.dx_0 =
        r6_pobject->fpoint3_0.x_0 /
        (-8);  //这里fpoint3_0猜测可能为ballPosPrev_4
    cBall.ballPosPrev_4.point_0.dy_4 = r6_pobject->fpoint3_0.z_8 / 8;
    cBall.ballPosPrev_4.dz_8 = r6_pobject->fpoint3_0.y_4 / 8;

    cBall.ballMovePrev_10.point_0.dx_0 = r6_pobject->fpoint3_1C.x_0 / (-8);
    cBall.ballMovePrev_10.point_0.dy_4 = r6_pobject->fpoint3_1C.z_8 / 8;
    cBall.ballMovePrev_10.dz_8 = r6_pobject->fpoint3_1C.y_4 / 8;
    fpointQ<PointType_18> fpointQ_sp1b0;
    sub_16A88C(fpointQ_sp1b0, r6_pobject->fpointQ_C);
    // check 除法
    // 0016A2AA
    cBall.quat_68.d1_0 = fpointQ_sp1b0.field_0 / 64;
    cBall.quat_68.d2_4 = fpointQ_sp1b0.field_4 / 64;
    cBall.quat_68.d3_8 = fpointQ_sp1b0.field_8 / 64;
    cBall.quat_68.d4_C = fpointQ_sp1b0.field_C / 64;
    // check
    cBall.point3D_1C.point_0.dx_0 = r6_pobject->fpoint3_28.x_0 / (-101);
    cBall.point3D_1C.point_0.dy_4 = r6_pobject->fpoint3_28.z_8 / 101;
    cBall.point3D_1C.dz_8 = r6_pobject->fpoint3_28.y_4 / 101;
    // loc_16A344
    for (int r5_i = 0; r5_i < physics_sp218.object_counts_4; r5_i++) {
      // loc_16A30C
      if (physics_sp218.ppobject_0[r5_i]->field_9E) {
        if (physics_sp218.ppobject_0[r5_i]->field_90 != EFreePropType_3) {
          if (FREE_tInfo.filed_0.gamestatus_1828 <= 8) {
            // check
            if ((1 << FREE_tInfo.filed_0.gamestatus_1828) & 0x190) {
              LOGE("PhysicsTest_2");
              tGame.field_6C98 = 0;
              tGame.mTLogic_6678.freeproptype_74 =
                  physics_sp218.ppobject_0[r5_i]->field_90;
            }
          }
        }
      }
    }
  }
  // loc_16A348
  delete[] pfpoint3_sp34;
}
//-------------------------------------------------------------------------------------------------
