#include "Util.h" #include "CFTTFileSystem_PAK.h" #include "TGame.h" #include "XMATH.h" #include "memctrl.h" int g_iPakOpen[100]; CFTTFileSystem_PAK *g_pPakFileSystem[100]; CFTTFile *g_pPakFile[100]; const char *sPakFile[] = {"PKG:Data/flags.pak", "PKG:Data/nis.pak"}; //------------------------------------------------------------------------------------------------- // 00178670 void UTILCOL_CheckSpheresOverlap(TPoint3D, int, TPoint3D, int) {} //------------------------------------------------------------------------------------------------- // 001786E4 int UTILCOL_RayCircleTest(TPoint *, int, TPoint *, TPoint *, int) { return 0; } //------------------------------------------------------------------------------------------------- // 0017875C void UTILCOL_LengthenBone(TPoint3D *, TPoint3D *, int) {} //------------------------------------------------------------------------------------------------- // 001787A0 bool UTILCOL_CapsuleCapsuleCheck(TPoint3D tp3d0, TPoint3D tp3d1, TPoint3D tp3d2, TPoint3D tp3d3, int i4, int i5, int i6, int i7) { /* * 描述:这个函数寄存器对不上,摆弄了多次后无法与原汇编一致。但功能看起来比较明确。 */ TPoint3D var_2C_sp4C; TPoint3D var_38_sp40; TPoint3D var_44_sp34; TPoint3D var_50_sp28; TPoint3D var_5C_sp1C; TPoint3D var_68_sp10; int var_6C_spC; int var_70_sp8; var_2C_sp4C.point_0.dx_0 = tp3d0.point_0.dx_0; var_2C_sp4C.point_0.dy_4 = tp3d0.point_0.dy_4; var_2C_sp4C.dz_8 = tp3d0.dz_8; var_38_sp40.point_0.dx_0 = tp3d1.point_0.dx_0; var_38_sp40.point_0.dy_4 = tp3d1.point_0.dy_4; var_38_sp40.dz_8 = tp3d1.dz_8; var_44_sp34.point_0.dx_0 = tp3d2.point_0.dx_0; var_44_sp34.point_0.dy_4 = tp3d2.point_0.dy_4; var_44_sp34.dz_8 = tp3d2.dz_8; var_50_sp28.point_0.dx_0 = tp3d3.point_0.dx_0; var_50_sp28.point_0.dy_4 = tp3d3.point_0.dy_4; var_50_sp28.dz_8 = tp3d3.dz_8; var_5C_sp1C.point_0.dx_0 = (tp3d0.point_0.dx_0 + tp3d1.point_0.dx_0) / 2; var_5C_sp1C.point_0.dy_4 = (tp3d0.point_0.dy_4 + tp3d1.point_0.dy_4) / 2; var_5C_sp1C.dz_8 = (tp3d1.dz_8 + tp3d0.dz_8) / 2; var_68_sp10.point_0.dy_4 = (tp3d3.point_0.dy_4 + tp3d2.point_0.dy_4) / 2; var_68_sp10.point_0.dx_0 = (tp3d3.point_0.dx_0 + tp3d2.point_0.dx_0) / 2; var_68_sp10.dz_8 = (tp3d3.dz_8 + tp3d2.dz_8) / 2; int r5_i = i5 + i4 + (i7 + i6) / 2; // 0017882E if (((int)XMATH_Distance3D(&var_5C_sp1C, &var_68_sp10)) <= r5_i) { // 00178832 // 00178846 if (XMATH_LineLineDistance(&var_2C_sp4C, &var_38_sp40, &var_44_sp34, &var_50_sp28, &var_6C_spC, &var_70_sp8) < i4 + i5) { // 0017884A tGame.mTMath_6734.field_370.point_0.dx_0 = var_2C_sp4C.point_0.dx_0 + var_6C_spC * (var_38_sp40.point_0.dx_0 - var_2C_sp4C.point_0.dx_0) / 4096; tGame.mTMath_6734.field_370.point_0.dy_4 = var_2C_sp4C.point_0.dy_4 + var_6C_spC * (var_38_sp40.point_0.dy_4 - var_2C_sp4C.point_0.dy_4) / 4096; tGame.mTMath_6734.field_370.dz_8 = var_2C_sp4C.dz_8 + var_6C_spC * (var_38_sp40.dz_8 - var_2C_sp4C.dz_8) / 4096; tGame.mTMath_6734.field_37C.point_0.dx_0 = var_44_sp34.point_0.dx_0 + var_70_sp8 * (var_50_sp28.point_0.dx_0 - var_44_sp34.point_0.dx_0) / 4096; tGame.mTMath_6734.field_37C.point_0.dy_4 = var_44_sp34.point_0.dy_4 + var_70_sp8 * (var_50_sp28.point_0.dy_4 - var_44_sp34.point_0.dy_4) / 4096; tGame.mTMath_6734.field_37C.dz_8 = var_44_sp34.dz_8 + var_70_sp8 * (var_50_sp28.dz_8 - var_44_sp34.dz_8) / 4096; tGame.mTMath_6734.field_388[0] = i4; tGame.mTMath_6734.field_388[1] = i5; return 1; } } // loc_178900 return 0; } //------------------------------------------------------------------------------------------------- // 001F5080 //^_^ UtilOpenPak(0, "PAK"); void UtilOpenPak(int a0, char const *pFileType) { for (int dr6 = 0; dr6 <= 99; dr6++) { // loc_1F50AC // loc_1F5092 if (a0 == dr6) { if (g_iPakOpen[a0] == 0) continue; return; } // loc_1F509E if (g_iPakOpen[dr6] != 0) { UtilClosePak(dr6); } } // 001F50B0 CFTTFile *r6_pFile = CFTTFileSystem::fopen(sPakFile[a0], "rb", EFTTMemHeapID_0); g_pPakFileSystem[a0] = new CFTTFileSystem_PAK; g_pPakFileSystem[a0]->Initialise(r6_pFile, EFTTMemHeapID_0); CFTTFileSystem::Register(g_pPakFileSystem[a0], pFileType); g_iPakOpen[a0] = 1; } //------------------------------------------------------------------------------------------------- // 001F510C //^_^ void UtilClosePak(int a0) { if (g_iPakOpen[a0]) { CFTTFileSystem::Deregister(g_pPakFileSystem[a0], nullptr); // 001F5136 if (g_pPakFileSystem[a0] != nullptr) { delete g_pPakFileSystem[a0]; } // 001F5140 g_pPakFileSystem[a0] = nullptr; if (g_pPakFile[a0] != nullptr) { delete g_pPakFile[a0]; } // loc_1F5154 g_pPakFile[a0] = nullptr; g_iPakOpen[a0] = 0; } // locret_1F515E } //------------------------------------------------------------------------------------------------- // 001F5170 //^_^ bool UtilIsPackOpen(int a0) { return g_iPakOpen[a0] != 0; } //-------------------------------------------------------------------------------------------------