CFTTNavMesh.cpp 32 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079
  1. #include "CFTTNavMesh.h"
  2. #include <arm_neon.h>
  3. #include "FREE.h"
  4. #include "TTDList.h"
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include <unistd.h>
  8. #include <string.h>
  9. #include "sub.h"
  10. //#include "TNMNeighbour.h"
  11. const uint dword_2FED08[0xE] = {0x3243F, 0x1DAC6, 0xFADC, 0x7F57, 0x3FEB,
  12. 0x1FFD, 0x1000, 0x800, 0x400, 0x200,
  13. 0x100, 0x80, 0x40, 0x20};
  14. int Combine(TTDList<TTSPtr<TNMVert>> *a1, TTDList<TTSPtr<TNMVert>> *a2, TTDList<TTSPtr<TNMVert>> *a3)
  15. {
  16. LOGE("Combine=%x%x%x", (unsigned)a1, (unsigned)a2, (unsigned)a3);
  17. return 0;
  18. }
  19. //00167760 ^_^
  20. //单元测试等级: 目测游戏表现
  21. //单元测试内容: 1-10
  22. //单元测试结果: 正常
  23. //已测试分支 1 5
  24. void sub_167760(fpoint2<PointType_14> *r0_pfpoint, fpoint2<PointType_14> *r1_pfpoint)
  25. {
  26. LOGE("sub_167760");
  27. int i_sp0;
  28. sub_166CB2(&i_sp0, r1_pfpoint);
  29. long long r7_ull = r1_pfpoint->x_0;
  30. long long r0_ull = r1_pfpoint->y_4;
  31. long long r5_ull = i_sp0;
  32. r0_pfpoint->x_0 = (r7_ull * 0x4000) / (r5_ull);
  33. r0_pfpoint->y_4 = (r0_ull * 0x4000) / (r5_ull);
  34. }
  35. // 00166D24 ^_-
  36. //单元测试等级: 目测游戏表现
  37. //单元测试内容: 1-10
  38. //单元测试结果: 正常
  39. //已测试分支 1 5
  40. void EarTest(TTDListNode<TTSPtr<TNMVert>> *r0_pdlist_node)
  41. {
  42. //TTSPtr<TNMVert> size=0x8
  43. //LOGE("%x%x", (unsigned)a1, (unsigned)a1->next);
  44. //sp34=r0_pdlist_node->next->m.pT_0
  45. //sp38=
  46. TTSPtr<TNMVert> ptr_vert_next_sp34=r0_pdlist_node->next->m;
  47. TTSPtr<TNMVert> ptr_vert_cur_sp2c=r0_pdlist_node->m;
  48. TTSPtr<TNMVert> ptr_vert_prev_sp24=r0_pdlist_node->prev->m;
  49. //r2 r1 r7 =ptr_vert_cur_sp2c ptr_vert_next_sp34 ptr_vert_prev_sp24 .0
  50. //00166D5E
  51. //r3 r0 r0_pdlist_node->next prev
  52. //r8 r1 ptr_vert_next_sp34.pT_0->field_0 ptr_vert_next_sp34.pT_0->field_4
  53. //r12 lr ptr_vert_next_sp24.pT_0->field_0 ptr_vert_next_sp24.pT_0->field_4
  54. //r7 r2 =ptr_vert_cur_sp2c.pT_0->field_0 ptr_vert_cur_sp2c.pT_0->field_4
  55. int r3_i= ptr_vert_prev_sp24.pT_0->field_4-ptr_vert_next_sp34.pT_0->field_4;
  56. int i_sp8=ptr_vert_prev_sp24.pT_0->field_0-ptr_vert_cur_sp2c.pT_0->field_0;
  57. int i_sp18=ptr_vert_next_sp34.pT_0->field_4-ptr_vert_cur_sp2c.pT_0->field_4;
  58. int r5_i=ptr_vert_cur_sp2c.pT_0->field_4-ptr_vert_prev_sp24.pT_0->field_4;
  59. int r4_i=ptr_vert_next_sp34.pT_0->field_0-ptr_vert_prev_sp24.pT_0->field_0;
  60. int r7_i=ptr_vert_cur_sp2c.pT_0->field_0-ptr_vert_next_sp34.pT_0->field_0;
  61. //sp4 =ptr_vert_cur_sp2c.0
  62. //sp1c=ptr_vert_next_sp34.0
  63. //spc=r5
  64. //sp8=r6
  65. //sp10= ptr_vert_cur_sp2c.pT_0->field_4
  66. //sp20= ptr_vert_next_sp34.pT_0->field_0
  67. //sp14 18=ptr_vert_cur_sp2c.pT_0->field_0 r1_i
  68. TTDListNode<TTSPtr<TNMVert>>* r3_pnode = r0_pdlist_node->next;
  69. TTDListNode<TTSPtr<TNMVert>>* r0_pnode = r0_pdlist_node->prev;
  70. //loc_166D9A
  71. while(r0_pnode->prev!=r3_pnode){
  72. LOGE("EarTest_1"); //ok
  73. //loc_166D9A
  74. r0_pnode=r0_pnode->prev;
  75. // r8 r10 r0_pnode->m.pT_0->field_0 r0_pnode->m.pT_0->field_4
  76. int r6_i= r0_pnode->m.pT_0->field_4-ptr_vert_prev_sp24.pT_0->field_4;
  77. int r9_i=r0_pnode->m.pT_0->field_0-ptr_vert_prev_sp24.pT_0->field_0;
  78. int r1_i= ((uint64)r9_i)*r3_i/0x4000 + ((uint64)r6_i)*r4_i/0x4000;
  79. if(r1_i>=1){
  80. LOGE("EarTest_2");
  81. //00166DC8
  82. r1_i = r0_pnode->m.pT_0->field_0 -ptr_vert_next_sp34.pT_0->field_0;
  83. int r2_i= r0_pnode->m.pT_0->field_4 - ptr_vert_next_sp34.pT_0->field_4;
  84. r1_i= ((uint64)r1_i)*i_sp18/0x4000 + ((uint64)r2_i)*r7_i/0x4000;
  85. if(r1_i>=1){
  86. //00166DF0
  87. LOGE("EarTest_3");
  88. r1_i= r0_pnode->m.pT_0->field_4-ptr_vert_cur_sp2c.pT_0->field_4;
  89. r6_i= r0_pnode->m.pT_0->field_4 -ptr_vert_cur_sp2c.pT_0->field_0;
  90. r1_i= ((uint64)r1_i)*i_sp8/0x4000 + ((uint64)r6_i)*r5_i/0x4000;
  91. if(r1_i>0){
  92. LOGE("EarTest_4");
  93. return ;
  94. }
  95. }
  96. }
  97. }
  98. //loc_166E2C ok
  99. LOGE("EarTest_5");
  100. ptr_vert_cur_sp2c.pT_0->field_9=true;
  101. }
  102. void Test(){
  103. TNMTri tri_sp;
  104. fpoint2<PointType_14> parm1;
  105. parm1.x_0=0x1542;
  106. parm1.y_4=0x5487;
  107. // fpoint2<PointType_14> parm1;
  108. fpoint2<PointType_14> ret= tri_sp.Inside(parm1,false);
  109. LOGE("%x",ret.x_0);
  110. }
  111. //---------------------------------------------------------------------------------------
  112. // 00167BD0 ^_-
  113. //已测试分支 34 35 36 37 38 40 41 43 44 46 47 48 49 50 53 54
  114. //单元测试等级: 目测游戏表现
  115. //单元测试内容: 1-10
  116. //单元测试结果: 正常
  117. //已测试分支
  118. void CFTTNavMesh::Init()
  119. {
  120. // 00167BD0
  121. // sp68=this
  122. LOGE("CFTTNavMesh::Init");
  123. TNMVert *vert_r1 = new TNMVert(); //这里要加上默认构造函数
  124. TTSPtr<TNMVert> TNMVert_TTSPtr_sp210(vert_r1); //智能指针构造函数要禁止内联
  125. vert_r1 = new TNMVert();
  126. TTSPtr<TNMVert> TNMVert_TTSPtr_sp208(vert_r1);
  127. vert_r1 = new TNMVert();
  128. TTSPtr<TNMVert> TNMVert_TTSPtr_sp200(vert_r1);
  129. vert_r1 = new TNMVert();
  130. TTSPtr<TNMVert> TNMVert_TTSPtr_sp1f8(vert_r1);
  131. TNMVert_TTSPtr_sp210->field_0 = 0xFFF1C000;
  132. TNMVert_TTSPtr_sp210->field_4 = 0x12C000;
  133. TNMVert_TTSPtr_sp208->field_0 = 0xE4000;
  134. TNMVert_TTSPtr_sp208->field_4 = 0x12C000;
  135. TNMVert_TTSPtr_sp200->field_0 = -0xE4000;
  136. TNMVert_TTSPtr_sp200->field_4 = -0x12C000;
  137. TNMVert_TTSPtr_sp1f8->field_0 = 0xE4000;
  138. TNMVert_TTSPtr_sp1f8->field_4 = 0xFFED4000;
  139. TNMVert_TTSPtr_sp208->field_A = 0;
  140. TNMVert_TTSPtr_sp210->field_A = 1;
  141. TNMVert_TTSPtr_sp200->field_A = 2;
  142. TNMVert_TTSPtr_sp1f8->field_A = 3;
  143. TTDList<TTSPtr<TNMVert>> list_sp1f0;
  144. // TTSPtr<TNMVert> TNMVert_TTSPtr_sp1e8=TNMVert_TTSPtr_sp208; 临时变量
  145. list_sp1f0.Insert(TNMVert_TTSPtr_sp208); //临时变量使用的是sp1e8
  146. //TTDList<TTSPtr<TNMVert>> list_sp108;
  147. // sp1d8 sp1e0 临时变量
  148. list_sp1f0.Insert(TNMVert_TTSPtr_sp210,
  149. TNMVert_TTSPtr_sp208); // 00167CE0
  150. // sp1d0 sp1c8
  151. list_sp1f0.Insert(TNMVert_TTSPtr_sp200,
  152. TNMVert_TTSPtr_sp210); // 00167D12
  153. // sp1c0 sp1b8
  154. list_sp1f0.Insert(TNMVert_TTSPtr_sp1f8,
  155. TNMVert_TTSPtr_sp200); // 00167D48
  156. TNMVert_TTSPtr_sp210.Release();
  157. TNMVert_TTSPtr_sp208.Release();
  158. TNMVert_TTSPtr_sp200.Release();
  159. TNMVert_TTSPtr_sp1f8.Release();
  160. // sp5c=0x198
  161. //
  162. //[sp5c]=sp198
  163. uint r3_u = 0;
  164. TTList<TTDList<TTSPtr<TNMVert>> *> ttlist_sp1A8;
  165. int arr_sp40[4] = {-0x3f, 0, -0x3f, 0};
  166. uint d_sp30[4] = {0x7000, 0x3000, 0x7000, 0xFFFFD000};
  167. uint d_d14d15[4] = {0xFFFF9000, 0xFFFFD000, 0xFFFF9000, 0x3000};
  168. uint d_d10d11[4] = {0x3000, 0x2000, 0x3000, 0xFFFFE000};
  169. uint d_d12d13[4] = {0xFFFFD000, 0xFFFFE000, 0xFFFFD000, 0x2000};
  170. // float32x4_t d_sp40;// = {-0x3f, 0, -0x3f, 0}; // 应该都是临时变量
  171. // d_sp40.n128_u64
  172. // int arr_sp30[4] = {0x7000, 0x3000, 0x7000, 0xFFFFD000}; //
  173. // 应该都是临时变量
  174. long long sp6csp60_ll;
  175. LOGE("CFTTNavMesh::Init loc_1682E0");
  176. // loc_1682E0
  177. LOGE("FREE_tInfo.filed_0.pFREE_tGoal_1818->m_iPropCount_74F0=%d", FREE_tInfo.filed_0.pFREE_tGoal_1818->m_iPropCount_74F0);
  178. while (r3_u < (uint)FREE_tInfo.filed_0.pFREE_tGoal_1818->m_iPropCount_74F0)
  179. {
  180. // loc_167DB6
  181. LOGE("CFTTNavMesh::Init loc_167DB6");
  182. TFreeProp *r10_pfreeProp =
  183. FREE_tInfo.filed_0.pFREE_tGoal_1818
  184. ->m_tFreeProp_74F4; //这里还原的时候提前使用了r10 不是还原错误
  185. if (r10_pfreeProp[r3_u].m_iType_C != 0)
  186. {
  187. // 00167DCE
  188. TPoint point_sp108[2];
  189. memset(&point_sp108, 0, sizeof(point_sp108));
  190. TPoint point_sp188[2];
  191. memset(&point_sp188, 0, sizeof(point_sp188));
  192. int r5_i =r10_pfreeProp[r3_u].m_tPoint3D_0.point_0.dx_0 / 2- r10_pfreeProp[r3_u].m_tPoint3D_0.point_0.dx_0 / 2 % 10;
  193. int r4_i = r10_pfreeProp[r3_u].m_tPoint3D_0.point_0.dy_4 / 2;
  194. // loc_167E24
  195. for (int r7_i = 0; r7_i < 4; r7_i++)
  196. {
  197. LOGE("branch_1");
  198. // loc_167E0E
  199. point_sp108[r7_i].dx_0 = r5_i;
  200. point_sp108[r7_i].dy_4 = r4_i - r4_i % 10;
  201. }
  202. // 00167E28
  203. uint u_r0;
  204. if (r10_pfreeProp[r3_u].m_iType_C == 2)
  205. {
  206. u_r0 = 1;
  207. }
  208. else
  209. u_r0 = 0;
  210. uint64x2_t d_q9 = vld1q_u32((const unsigned int *)arr_sp40);
  211. uint64x1_t d_d16 = vdup_n_s32(u_r0);
  212. uint64x2_t d_q8 = vmovl_u32(d_d16);
  213. d_q8 = vshlq_n_s64(d_q8, 63);
  214. d_q8 = vshlq_s64(d_q9, d_q8);
  215. d_q9 = d_q8;
  216. uint64x2_t d_q6 = vld1q_u32((const unsigned int *)d_d12d13);
  217. uint64x2_t d_q7 = vld1q_u32((const unsigned int *)d_d14d15);
  218. uint64x2_t d_q5 = vld1q_u32((const unsigned int *)d_d10d11);
  219. uint64x2_t d_q10 = vld1q_u32((const unsigned int *)d_sp30);
  220. vbslq_s64(d_q8, d_q6, d_q7);
  221. vbslq_s64(d_q9, d_q5, d_q10);
  222. uint64x2_t d_sp188 = d_q9; //这里的代码应该是采用了优化 看不懂
  223. uint64x2_t d_sp198 = d_q8;
  224. r4_i = ((long long)(r10_pfreeProp->m_iRot_10 * 0x4000 / 0xb4)) * 0x3243F /
  225. 0x4000;
  226. int r9_i = (r4_i % 10 - r4_i) * 16;
  227. int r10_i;
  228. // int i_sp60, i_sp6c;
  229. if (r9_i < 0xFFF9B781)
  230. {
  231. LOGE("branch_2");
  232. // 00167E9A
  233. r10_i = r9_i + 0xC90FE;
  234. // i_sp60 = 0;
  235. // i_sp6c = -1;
  236. sp6csp60_ll = 0xffffffff00000000;
  237. }
  238. else
  239. { // loc_167EAC
  240. r10_i = r9_i;
  241. if (r9_i > 0x6487F)
  242. {
  243. LOGE("branch_3");
  244. // i_sp6c = -1;
  245. sp6csp60_ll = 0xffffffff00000000;
  246. r10_i += 0xFFF36F02;
  247. }
  248. else
  249. // i_sp6c = 1;
  250. // i_sp60 = 0;
  251. sp6csp60_ll = 0x100000000;
  252. }
  253. // loc_167EC8
  254. // int r11_i = 0;
  255. LOGE("branch_4");
  256. r4_i = 0x40000;
  257. long long r11r8_ll = 0x40000;
  258. int i_sp168;
  259. int i_sp160;
  260. for (int r5_i = 0xE; r5_i != 0; r5_i--)
  261. {
  262. LOGE("branch_5");
  263. // loc_167EDA
  264. i_sp160 = r4_i + 0x40000;
  265. sub_16A818(&i_sp168, &i_sp160);
  266. long ll_r2r1 = r11r8_ll * i_sp168 / 4096;
  267. if (ll_r2r1 < 0)
  268. r11r8_ll = -4294967296;
  269. // else
  270. // r11_i = 0;
  271. r4_i = r4_i / 4;
  272. }
  273. // 00167F10
  274. int r12_i = 0;
  275. int r1_i = 0x40000;
  276. int r2_i = 0x40000;
  277. // loc_167F82
  278. for (int r3_i = 0x0; r3_i != 0xE; r3_i++)
  279. {
  280. LOGE("branch_6");
  281. // loc_167F20
  282. // 0xFFF80000&(r10_i>>31)
  283. int r4_i;
  284. if (r10_i > 0)
  285. r4_i = 0;
  286. else
  287. r4_i = 0xFFF80000;
  288. r4_i |= 0x40000;
  289. long long r0r7_ll = r2_i * r4_i;
  290. long long r6r5_ll = dword_2FED08[r3_i] * r4_i;
  291. long long r7r0_ll = r0r7_ll / 0x4000 * r1_i;
  292. r10_i -= (r6r5_ll / 0x40000);
  293. long long r6r7_ll = r12_i * r4_i;
  294. r12_i += r7r0_ll / 0x40000;
  295. r6r7_ll = r6r7_ll / 0x4000 * r1_i;
  296. r2_i -= r6r7_ll / 0x40000;
  297. r1_i /= 2;
  298. }
  299. // 00167F86
  300. int r0_i =
  301. sp6csp60_ll * r12_i / 0x4000 / r11r8_ll; // check 有符号64位除法
  302. if (r9_i <= 0xFFF9B780)
  303. {
  304. LOGE("branch_7");
  305. // 00167FB0
  306. r9_i += 0xC90FE;
  307. sp6csp60_ll = -4294967296;
  308. }
  309. else
  310. { // loc_168000
  311. if (r9_i > 0x6487F)
  312. {
  313. LOGE("branch_8");
  314. r9_i += 0xFFF36F02;
  315. sp6csp60_ll = -4294967296;
  316. }
  317. else
  318. sp6csp60_ll = 4294967296;
  319. }
  320. // loc_16801A
  321. r4_i = r0_i >> 4;
  322. r5_i = 0x40000;
  323. long long r11r10_ll = 0x40000;
  324. // loc_168062
  325. for (int r8_i = 0; r8_i < 0xe; r8_i--)
  326. {
  327. LOGE("branch_9");
  328. // loc_16802E
  329. i_sp160 = r5_i + 0x40000;
  330. sub_16A818(&i_sp168, &i_sp160);
  331. r11r10_ll = i_sp168 * r11r10_ll / 0x40000;
  332. r5_i /= 4;
  333. }
  334. // 00168068
  335. r12_i = 0;
  336. r2_i = 0x40000;
  337. r1_i = 0x40000;
  338. // r8=r4 缓存
  339. // loc_1680DA
  340. for (int r3_i = 0; r3_i != 0xE; r3_i++)
  341. {
  342. LOGE("branch_10");
  343. // loc_16807A
  344. int r7_i;
  345. if (r9_i < 0)
  346. r7_i = 0xFFFC0000;
  347. else
  348. r7_i = 0x40000;
  349. // 0016808E
  350. r0_i = (long long)r1_i * r7_i / 0x4000;
  351. r9_i -= (long long)dword_2FED08[r3_i] * r7_i / 0x40000;
  352. r7_i = r12_i * r7_i / 0x4000;
  353. r12_i += ((long long)r0_i) * r2_i / 0x40000;
  354. r1_i -= r7_i * r2_i / 0x40000;
  355. r2_i /= 2;
  356. }
  357. // 001680DE
  358. r0_i = sp6csp60_ll * r1_i / 0x4000 / r11r10_ll >> 4; //有符号64div
  359. r12_i = 0 - r4_i;
  360. r9_i = 0;
  361. // loc_168158
  362. TPoint *ppoint = (TPoint *)&d_sp188;
  363. for (int r2_i = 0; r2_i != 4; r2_i++)
  364. {
  365. LOGE("branch_11");
  366. // loc_16811A
  367. //(long long*)&d_sp188[r2_i]
  368. int r7_i = (long long)ppoint[r2_i].dx_0 * r0_i / 0x4000; // check
  369. ppoint[r2_i].dx_0 = (long long)ppoint[r2_i].dy_4 * r4_i / 0x4000 + r7_i;
  370. ppoint[r2_i].dy_4 = (long long)ppoint[r2_i].dy_4 * r0_i / 0x4000 + (long long)ppoint[r2_i].dx_0 * r12_i / 0x4000;
  371. }
  372. // 0016815C
  373. // loc_168180
  374. for (r0_i = 0; r0_i != 4; r0_i++)
  375. {
  376. LOGE("branch_12");
  377. // loc_168160
  378. // point_sp108
  379. point_sp108[r0_i].dx_0 += ppoint[r0_i].dx_0;
  380. point_sp108[r0_i].dy_4 += ppoint[r0_i].dy_4;
  381. }
  382. // 00168184
  383. // loc_168188
  384. TTSPtr<TNMVert> pvert_sp168[4];
  385. for (int r6_i = 0; r6_i < 4; r6_i++)
  386. {
  387. LOGE("branch_13");
  388. // loc_16819E
  389. TTSPtr<TNMVert> pvert_sp160;
  390. pvert_sp160.pT_0 = new TNMVert();
  391. pvert_sp168[r6_i] = pvert_sp160;
  392. pvert_sp168[r6_i]->field_0 = point_sp108[r6_i].dx_0; //
  393. pvert_sp168[r6_i]->field_4 = point_sp108[r6_i].dy_4;
  394. pvert_sp168[r6_i]->byte_8 = 0;
  395. }
  396. // 001681E2
  397. TTDList<TTSPtr<TNMVert>> *r6_plist = new TTDList<TTSPtr<TNMVert>>;
  398. r6_plist->Insert(pvert_sp168[0]); //产生临时变量sp158
  399. // loc_168254
  400. // TTDList<TTSPtr<TNMVert>> list_sp160; //构造函数内联优化到pvert_sp160这里
  401. for (int r4_i = 0; r4_i != 3; r4_i++)
  402. {
  403. LOGE("branch_14");
  404. // loc_168218
  405. LOGE("loc_168218");
  406. r6_plist->Insert(pvert_sp168[r4_i], pvert_sp168[r4_i]);
  407. }
  408. // 00168258
  409. // loc_16825A
  410. TTDList<TTSPtr<TNMVert>> *r4_plist = r6_plist;
  411. TTDList<TTSPtr<TNMVert>> *r5_plist = r6_plist;
  412. // loc_16826E
  413. TTList<TTDList<TTSPtr<TNMVert>> *>::TTListNode *r7_pnode = ttlist_sp1A8.pBegin_0;
  414. while (r7_pnode)
  415. {
  416. // 00168270
  417. r6_plist = new TTDList<TTSPtr<TNMVert>>();
  418. if (Combine(r6_plist, r7_pnode->m, r4_plist))
  419. {
  420. LOGE("branch_15");
  421. // 00168294
  422. if (r7_pnode->m)
  423. delete r7_pnode->m;
  424. // loc_1682A6
  425. ttlist_sp1A8.Remove(r7_pnode->m);
  426. if (r4_plist)
  427. {
  428. LOGE("branch_16");
  429. delete r4_plist;
  430. }
  431. }
  432. else if (r6_plist)
  433. {
  434. LOGE("branch_17");
  435. // loc_168260
  436. delete r6_plist;
  437. }
  438. r7_pnode = r7_pnode->next;
  439. }
  440. // loc_1682C0
  441. ttlist_sp1A8.Insert(r4_plist);
  442. // loc_1682CC出作用域释放sp168
  443. }
  444. // loc_1682DE
  445. r3_u++;
  446. }
  447. // 001682F8
  448. // r8=sp108
  449. // sp14=sp128
  450. // sp10=sp120
  451. // sp18=sp118
  452. // r0=4
  453. // loc_1686DC
  454. LOGE("CFTTNavMesh::Init loc_1686DC ttlist_sp1A8.dCount_8=%x", ttlist_sp1A8.dCount_8);
  455. TTList<TTDList<TTSPtr<TNMVert>> *>::TTListNode *r5_pnode = ttlist_sp1A8.pBegin_0;
  456. int i_sp6c=4;
  457. while (ttlist_sp1A8.dCount_8)
  458. {
  459. // loc_168318
  460. TTDListNode<TTSPtr<TNMVert>> *r11_pnode = 0;
  461. TTDList<TTSPtr<TNMVert>> *r10_plist = 0;
  462. TTDList<TTSPtr<TNMVert>> *r9_plist = 0;
  463. int r6_i = -2147467264;
  464. // loc_16838A
  465. LOGE("CFTTNavMesh::Init loc_16838A");
  466. while (r5_pnode)
  467. {
  468. // loc_16832E
  469. TTDList<TTSPtr<TNMVert>> *r7_plist = r5_pnode->m;
  470. TTDListNode<TTSPtr<TNMVert>> *r4_pnode = r7_plist->pLast_0;
  471. int r0_i = 0;
  472. // loc_16837C
  473. while (r0_i == 0 || r7_plist->pLast_0 != r4_pnode)
  474. {
  475. LOGE("branch_18");
  476. // loc_168350
  477. TTSPtr<TNMVert> pvert_sp108 = r4_pnode->m;
  478. if (pvert_sp108.pT_0->field_0 > r6_i)
  479. {
  480. LOGE("branch_19");
  481. r10_plist =r5_pnode->m;
  482. r11_pnode = r4_pnode;
  483. r6_i = pvert_sp108.pT_0->field_0;
  484. r9_plist = r10_plist;
  485. }
  486. r4_pnode = r4_pnode->prev;
  487. r0_i = 1;
  488. }
  489. LOGE("branch_20");
  490. // 00168382
  491. r5_pnode = r5_pnode->next;
  492. }
  493. // 00168390
  494. TNMTri nmtri_sp108;
  495. int i_sp2c=0x7FFFC000;
  496. int i_sp28 = 0;
  497. int i_sp24 = 0;
  498. int i_sp20 = 0;
  499. int i_sp1c = 0;
  500. //int i_sp30 = r11_pnode->m.pT_0->field_4;
  501. // sp5c= r11_plist->m.pT_0->field_0
  502. // sp30= r11_plist->m.pT_0->field_4
  503. // sp40=list_sp1f0.pLast_0
  504. int r1_i = 0;
  505. // loc_168488
  506. //TTDListNode<TTSPtr<TNMVert>> *r4_pnode;
  507. TTDListNode<TTSPtr<TNMVert>> *r8_pnode = list_sp1f0.pLast_0;
  508. // loc_168488
  509. while (r1_i == 0 || list_sp1f0.pLast_0 != r8_pnode)
  510. {
  511. LOGE("branch_21");
  512. // loc_1683E0
  513. // sp60=r8_pnode
  514. r1_i = 1;
  515. // r8_pnode->prev->m.pT_0 =r7
  516. int r6_i = r8_pnode->prev->m.pT_0->field_4 - r8_pnode->m.pT_0->field_4;
  517. if (r6_i >= 0xA4)
  518. {
  519. LOGE("branch_22");
  520. // 001683FC
  521. int r0_i=((long long)(r11_pnode->m.pT_0->field_4-r8_pnode->m.pT_0->field_4)*0x4000)/r6_i;
  522. //uint r0_u = (long long)r6_i * 0x4000 / r6_i;
  523. if ((uint)r0_i <= 0x4000)
  524. { // check
  525. // 0016841C
  526. LOGE("branch_23");
  527. int r2_i = r8_pnode->prev->m.pT_0->field_0 - r8_pnode->m.pT_0->field_0;
  528. r2_i = (long long)r0_i * r2_i / 0x4000 + r8_pnode->m.pT_0->field_0;
  529. int r3_i=r2_i - r11_pnode->m.pT_0->field_0;
  530. if (r2_i > r11_pnode->m.pT_0->field_0 && r3_i < i_sp2c)
  531. {
  532. LOGE("branch_24");
  533. // 00168440
  534. int r0_i = (long long)r0_i * r6_i / 0x4000;
  535. int r12_i = r8_pnode->m.pT_0->field_4 + r0_i;
  536. r1_i = r12_i;
  537. r6_i=r2_i;
  538. int r5_i=r8_pnode->m.pT_0->field_4;
  539. int lr_i=r8_pnode->m.pT_0->field_0;
  540. if (r0_i > 0){
  541. LOGE("branch_25");
  542. // 0016845E
  543. r6_i=lr_i;
  544. r1_i = r8_pnode->m.pT_0->field_4;
  545. r5_i=r12_i;
  546. lr_i=r2_i;
  547. }
  548. i_sp28=r6_i;
  549. i_sp24=r1_i;
  550. // i_sp124=r1_i;
  551. nmtri_sp108.filed_10[1].y_4=r1_i;
  552. nmtri_sp108.filed_10[1].x_0=r6_i;
  553. // i_sp120=r6_i;
  554. // i_sp128=lr_i;
  555. // i_sp12c=r5_i;
  556. nmtri_sp108.filed_10[2].y_4=r5_i;
  557. nmtri_sp108.filed_10[2].x_0=lr_i;
  558. i_sp2c=r3_i;
  559. i_sp1c=r5_i;
  560. i_sp20=lr_i;
  561. //r4_pnode = r8_pnode;
  562. }
  563. }
  564. }
  565. r8_pnode=r8_pnode->prev;
  566. }
  567. // 00168492
  568. fpoint2<PointType_14> point_sp188;
  569. fpoint2<PointType_14> point_sp168;
  570. point_sp188.y_4 = i_sp24 - r11_pnode->m.pT_0->field_4;
  571. point_sp188.x_0 = i_sp28 - r11_pnode->m.pT_0->field_0;
  572. point_sp168.y_4 = i_sp1c - r11_pnode->m.pT_0->field_4;
  573. point_sp168.x_0 = i_sp20 - r11_pnode->m.pT_0->field_0;
  574. fpoint2<PointType_14> fpoint_sp160;
  575. sub_167760(&fpoint_sp160, &point_sp188);
  576. int r4_i = fpoint_sp160.y_4;
  577. point_sp188 = fpoint_sp160;
  578. // arr_sp188[1]= fpoint_sp160.y_4;
  579. sub_167760(&fpoint_sp160, &point_sp168);
  580. point_sp168 = fpoint_sp160;
  581. int r8_i = fpoint_sp160.y_4;
  582. if (r4_i < 0)
  583. {
  584. LOGE("branch_26");
  585. r4_i = -r4_i;
  586. }
  587. //loc_1684D6
  588. if (r8_i < 0)
  589. r8_i = -r8_i;
  590. if (r8_i > r4_i)
  591. r8_i = r4_i;
  592. // r4_i = 0;
  593. int r0_i = 0;
  594. // loc_168542
  595. fpoint2<PointType_14> fpoint_sp100;
  596. fpoint2<PointType_14> fpoint_spf8;
  597. // TTDListNode<TTSPtr<TNMVert>> *r4_pnode = r8_pnode;
  598. TTDListNode<TTSPtr<TNMVert>> *r6_pnode = list_sp1f0.pLast_0;
  599. r0_i = 0;
  600. while (r0_i == 0 || list_sp1f0.pLast_0 != r6_pnode)
  601. {
  602. LOGE("branch_27");
  603. // loc_1684EE
  604. if (r6_pnode->m.pT_0->byte_8 == 0)
  605. {
  606. // 001684F4
  607. fpoint_sp100.x_0 = r6_pnode->m.pT_0->field_0;
  608. fpoint_sp100.y_4 = r6_pnode->m.pT_0->field_4; //这里可能是fpoint
  609. fpoint_sp160 = nmtri_sp108.Inside(fpoint_sp100, false);
  610. if (fpoint_sp160.x_0 == 0)
  611. {
  612. // 0016850C
  613. LOGE("branch_28");
  614. fpoint_sp160.x_0 = r6_pnode->m.pT_0->field_0 -nmtri_sp108.filed_10[0].x_0;
  615. fpoint_sp160.y_4 = r6_pnode->m.pT_0->field_4 - nmtri_sp108.filed_10[0].y_4;
  616. sub_167760(&fpoint_spf8, &fpoint_sp160);
  617. r0_i = fpoint_spf8.y_4;
  618. if (r0_i >= 0)
  619. {
  620. r0_i = -r0_i;
  621. }
  622. if (r0_i <= r8_i)
  623. {//loc_168534
  624. LOGE("branch_29");
  625. r4_i = r8_i;
  626. r8_i = r0_i;
  627. }
  628. }
  629. // loc_16853C
  630. r0_i = 1;
  631. r6_pnode = r6_pnode->prev;
  632. }
  633. else
  634. {
  635. LOGE("branch_30");
  636. r0_i = 1;
  637. r6_pnode = r6_pnode->prev;
  638. }
  639. }
  640. // 0016854E
  641. TNMVert *vert_r0 = new TNMVert();
  642. TTSPtr<TNMVert> ptr_vert_sp160(vert_r0);
  643. *ptr_vert_sp160.pT_0 = *r11_pnode->m.pT_0;
  644. // ptr_vert_sp160.pT_0->byte_8=*r11_pnode->m.pT_0->byte_8;
  645. // ptr_vert_sp160.pT_0->field_9=*r11_pnode->m.pT_0->field_9;
  646. ptr_vert_sp160.pT_0->field_A = i_sp6c;
  647. vert_r0 = new TNMVert();
  648. TTSPtr<TNMVert> ptr_vert_spf8(vert_r0);
  649. *ptr_vert_sp160.pT_0 = *r6_pnode->m.pT_0;
  650. //ptr_vert_sp160.pT_0->field_A = 4;
  651. // sp70=r6_pnode
  652. // r8=sp108
  653. TTDListNode<TTSPtr<TNMVert>> *r5_dlistnode = r11_pnode;
  654. r0_i = 1;
  655. // loc_168614
  656. // TTDList<TTSPtr<TNMVert>> dlidt_spe8;
  657. // TTSPtr<TNMVert> ptr_vert_spe0;
  658. // TTSPtr<TNMVert> ptr_vert_spd8;
  659. InsertedTTDListNode<TTSPtr<TNMVert>> dlist_spe8;
  660. while (r0_i != 0 || r5_dlistnode != r11_pnode)
  661. {
  662. LOGE("branch_31");
  663. // loc_1685BA
  664. r5_dlistnode->m.pT_0->field_A = i_sp6c++;
  665. // ptr_vert_spe0 = r5_dlistnode->m;
  666. dlist_spe8= list_sp1f0.Insert(r5_dlistnode->m, r6_pnode->m);
  667. r5_dlistnode=r5_dlistnode->prev;
  668. }
  669. // 0016861C
  670. // TTDList<TTSPtr<TNMVert>> dlist_spf0;
  671. InsertedTTDListNode<TTSPtr<TNMVert>> dlist_spf0 = list_sp1f0.Insert( ptr_vert_sp160, dlist_spe8.inserted_node->m);
  672. list_sp1f0.Insert(ptr_vert_spf8, dlist_spf0.inserted_node->m);
  673. if (r9_plist)
  674. {
  675. LOGE("branch_32");
  676. delete r9_plist;
  677. }
  678. // loc_1686A2
  679. ttlist_sp1A8.Remove(r9_plist);
  680. r0_i = 0;
  681. // loc_1686BE
  682. r6_pnode = list_sp1f0.pLast_0;
  683. while (r0_i == 0 || list_sp1f0.pLast_0 != r6_pnode)
  684. {
  685. LOGE("branch_33");
  686. // loc_1686B2
  687. ConvexTest(r6_pnode);
  688. r6_pnode = r6_pnode->prev;
  689. }
  690. }
  691. // sp188 =0 len=0x9
  692. // 001686E6
  693. // loc_1686F8
  694. int r0_i = 0;
  695. TTDListNode<TTSPtr<TNMVert>> *r4_node = list_sp1f0.pLast_0;
  696. while (r0_i == 0 || r4_node != list_sp1f0.pLast_0)
  697. {
  698. LOGE("branch_34");
  699. LOGE("loc_1686EC");
  700. ConvexTest(r4_node);
  701. r4_node = r4_node->prev;
  702. r0_i = 1;
  703. }
  704. // 00168704
  705. // r4=sp108
  706. // r6=sp188
  707. TTList<TTDListNode<TTSPtr<TNMVert>> *> list_sp188;
  708. TTDListNode<TTSPtr<TNMVert>> *r5_node = list_sp1f0.pLast_0;
  709. r0_i = 0;
  710. // //loc_168750
  711. while (r0_i == 0 || r5_node != list_sp1f0.pLast_0)
  712. {
  713. LOGE("branch_35");
  714. // loc_16871C
  715. TTSPtr<TNMVert> ptr_vert_sp108 = r5_node->m;
  716. ptr_vert_sp108.pT_0->field_9 = 0;
  717. if (r5_node->m.pT_0->byte_8)
  718. {
  719. LOGE("branch_36");
  720. EarTest(r5_node);
  721. if (ptr_vert_sp108.pT_0->field_9)
  722. {
  723. LOGE("branch_37");
  724. list_sp188.Insert(r5_node);
  725. }
  726. }
  727. // loc_168746
  728. r5_node = r5_node->prev;
  729. r0_i = 1;
  730. }
  731. // 0016875A
  732. //[sp30]=sp130
  733. //[sp2c]=sp128
  734. //[sp28]=sp120
  735. //[sp24]=sp118
  736. //[sp20]= TTList<TTDListNode<TTSPtr<TNMVert>> *>::Remove(TTDListNode<TTSPtr<TNMVert>> *)
  737. int count_sp70 = 0;
  738. // loc_16890E
  739. LOGE("CFTTNavMesh::Init loc_16890E");
  740. while (list_sp1f0.dCount_4 > 2)
  741. {
  742. // loc_168786
  743. LOGE("branch_38");
  744. // LOGE("CFTTNavMesh::Init loc_16890E_1 list_sp1f0.dCount_4 =%x",list_sp1f0.dCount_4 );
  745. // LOGE(" list_sp188.count=%x", list_sp188.dCount_8);
  746. // LOGE(" list_sp188.pBegin_0=%x", (unsigned)list_sp188.pBegin_0);
  747. TTDListNode<TTSPtr<TNMVert>> *r10_pnode = list_sp188.pBegin_0->m;
  748. // r1 = r10_p->next;
  749. // sp6c = r10_p->prev;
  750. // sp60= r10_p->next;
  751. // LOGE("CFTTNavMesh::Init loc_16890E_1 next =%x prev=%x ",(unsigned)r10_pnode->next,(unsigned)r10_pnode->prev,(unsigned)r10_pnode );
  752. TTSPtr<TNMVert> ptr_vert_sp168 = r10_pnode->next->m;
  753. TTSPtr<TNMVert> ptr_vert_sp160 = r10_pnode->m;
  754. TTSPtr<TNMVert> ptr_vert_spf8 = r10_pnode->prev->m;
  755. // LOGE("CFTTNavMesh::Init loc_16890E_9");
  756. // 001687CC
  757. TNMTri nmtri_sp108;
  758. // memset(&nmtri_sp108, 0,sizeof(nmtri_sp108));
  759. nmtri_sp108.filed_C = 0;
  760. nmtri_sp108.filed_28 = 0;
  761. nmtri_sp108.filed_2C = 0;
  762. nmtri_sp108.filed_30[0] = 0;
  763. nmtri_sp108.filed_30[1] = 0;
  764. nmtri_sp108.filed_30[2] = 0;
  765. nmtri_sp108.filed_30[3] = 0;
  766. nmtri_sp108.filed_34 = 0;
  767. // r7=sp168.pt0
  768. nmtri_sp108.filed_10[0].x_0 = 0;
  769. nmtri_sp108.filed_10[0].y_4 = 0;
  770. nmtri_sp108.filed_10[1].x_0 = 0;
  771. nmtri_sp108.filed_10[1].y_4 = 0;
  772. // sp5c=sp13a
  773. // sp40 = ptr_vert_sp168.pT_0->field_0
  774. nmtri_sp108.filed_10[0].x_0 = ptr_vert_sp168.pT_0->field_0;
  775. nmtri_sp108.filed_10[0].y_4 = ptr_vert_sp168.pT_0->field_4;
  776. nmtri_sp108.filed_10[1].x_0 = ptr_vert_sp160.pT_0->field_0;
  777. nmtri_sp108.filed_10[1].y_4 = ptr_vert_sp160.pT_0->field_4;
  778. nmtri_sp108.filed_10[2].x_0 = ptr_vert_spf8.pT_0->field_0;
  779. nmtri_sp108.filed_10[2].y_4 = ptr_vert_spf8.pT_0->field_4;
  780. nmtri_sp108.filed_10[3].y_4 = (ptr_vert_sp168.pT_0->field_4 + ptr_vert_sp160.pT_0->field_4 + ptr_vert_spf8.pT_0->field_4) / 3;
  781. nmtri_sp108.filed_10[3].x_0 = (ptr_vert_sp168.pT_0->field_0 + ptr_vert_sp160.pT_0->field_0 + ptr_vert_spf8.pT_0->field_0) / 3;
  782. // sp70=0
  783. // sp140 byte=0
  784. nmtri_sp108.filed_30[0] = ptr_vert_sp168.pT_0->field_A;
  785. nmtri_sp108.filed_30[1] = ptr_vert_sp160.pT_0->field_A;
  786. nmtri_sp108.filed_30[2] = ptr_vert_spf8.pT_0->field_A;
  787. // LOGE("CFTTNavMesh::Init loc_16890E_11");
  788. vector_nmtri_0.Insert(nmtri_sp108);
  789. // LOGE("CFTTNavMesh::Init loc_16890E_10");
  790. //这里是0016886C
  791. // LOGE("CFTTNavMesh::Init loc_16890E_8_1");
  792. list_sp188.Remove(r10_pnode);
  793. // LOGE("CFTTNavMesh::Init loc_16890E_8_2");
  794. list_sp188.Remove(r10_pnode->next);
  795. // LOGE("CFTTNavMesh::Init loc_16890E_8_3");
  796. list_sp188.Remove(r10_pnode->prev);
  797. // LOGE("CFTTNavMesh::Init loc_16890E_8_4");
  798. list_sp1f0.Remove(ptr_vert_sp160);
  799. // LOGE("CFTTNavMesh::Init loc_16890E_8_5");
  800. ptr_vert_sp168.pT_0->field_9 = 0;
  801. if (ptr_vert_sp168.pT_0->byte_8 == 0)
  802. {
  803. LOGE("branch_39");
  804. // 001688A6
  805. // LOGE("CFTTNavMesh::Init loc_16890E_2");
  806. ConvexTest(r10_pnode->next);
  807. }
  808. if (ptr_vert_sp168.pT_0->byte_8)
  809. {
  810. LOGE("branch_40");
  811. // loc_1688B2
  812. EarTest(r10_pnode->next);
  813. if (ptr_vert_sp168.pT_0->field_9)
  814. {
  815. LOGE("branch_41");
  816. // LOGE("CFTTNavMesh::Init loc_16890E_3");
  817. list_sp188.Insert(r10_pnode->next);
  818. }
  819. // LOGE("CFTTNavMesh::Init loc_16890E_4");
  820. }
  821. // loc_1688C6
  822. // r9=1
  823. ptr_vert_spf8.pT_0->field_9 = 0;
  824. if (ptr_vert_spf8.pT_0->byte_8 == 0)
  825. {
  826. LOGE("branch_42");
  827. // 001688DC
  828. // LOGE("CFTTNavMesh::Init loc_16890E_5");
  829. ConvexTest(r10_pnode->prev);
  830. }
  831. if (ptr_vert_spf8.pT_0->byte_8)
  832. {
  833. LOGE("branch_43");
  834. // loc_1688E8
  835. // LOGE("CFTTNavMesh::Init loc_16890E_7");
  836. EarTest(r10_pnode->prev);
  837. if (ptr_vert_spf8.pT_0->field_9)
  838. {
  839. LOGE("branch_44");
  840. // LOGE("CFTTNavMesh::Init loc_16890E_6");
  841. list_sp188.Insert(r10_pnode->prev);
  842. }
  843. }
  844. // loc_1688FC
  845. count_sp70++;
  846. // LOGE("CFTTNavMesh::Init loc_16890E_1 list_sp1f0.dCount_4 =%x",list_sp1f0.dCount_4 );
  847. }
  848. // 00168918
  849. uint8 r9_u8 = 0;
  850. uint8 r10_u8 = 1;
  851. // loc_168A6C
  852. // LOGE("CFTTNavMesh::Init loc_168A6C");
  853. uint8 u8_sp108[10];
  854. // loc_168928
  855. TNMTri *r7_pnmtri = &vector_nmtri_0.pBuf_0[r9_u8];
  856. int sp6c = r10_u8;
  857. //LOGE("udInsertPos_8=%x",vector_nmtri_0.udInsertPos_8);
  858. while (vector_nmtri_0.udInsertPos_8 > r9_u8)
  859. { // check dInsertPos_8 是否是无符号数 dInsertPos_8改为数组最后一个下标更好一点
  860. // loc_168928
  861. LOGE("loc_168928");
  862. //LOGE("branch_45");
  863. // loc_168A4E
  864. uint r11_u = r9_u8 + 1;
  865. while (vector_nmtri_0.udInsertPos_8 > r11_u)
  866. {
  867. LOGE("branch_46");
  868. // loc_16893E
  869. // loc_16897E
  870. // lr= &vector_nmtri_0.pBuf_0;
  871. uint8 r6_u8 = 0;
  872. for (int r5_i = 0; r5_i != 3; r5_i++)
  873. {
  874. LOGE("branch_47");
  875. // loc_16895A
  876. // loc_168978
  877. for (int r2_i = 0; r2_i != 3; r2_i++)
  878. {
  879. LOGE("branch_48");
  880. // loc_168964
  881. if (vector_nmtri_0.pBuf_0[r10_u8].filed_30[r2_i] == r7_pnmtri->filed_30[r5_i])
  882. {
  883. LOGE("branch_49");
  884. // 0016896A
  885. u8_sp108[r6_u8] = r5_i;
  886. u8_sp108[r6_u8 + 2] = r2_i;
  887. //LOGE("r6_u8=%xu8_sp108[r6_u8]=%xu8_sp108[r6_u8 + 2] = %x",r6_u8,u8_sp108[r6_u8],u8_sp108[r6_u8 + 2] );
  888. r6_u8++;
  889. }
  890. }
  891. }
  892. TNMTri *r5_pnmtri = &vector_nmtri_0.pBuf_0[r11_u];
  893. // LOGE("r6_u8=%xu8_sp108[r6_u8]=%x",r6_u8,u8_sp108[r6_u8]);
  894. if (r6_u8 == 2)
  895. {
  896. LOGE("branch_50");
  897. // 00168988
  898. if (u8_sp108[0] == 2)
  899. {
  900. LOGE("branch_51");
  901. // loc_1689AC
  902. if (u8_sp108[1] == 1)
  903. r11_u = 1;
  904. else
  905. r11_u = 2;
  906. }
  907. else if (u8_sp108[0] == 1)
  908. {
  909. LOGE("branch_52");
  910. // loc_1689C0
  911. r11_u = 2;
  912. if (u8_sp108[1] == 2)
  913. r11_u = 1;
  914. if (u8_sp108[1] == 0)
  915. r11_u = 0;
  916. }
  917. else if (u8_sp108[0] || u8_sp108[1] != 1)
  918. {
  919. LOGE("branch_53");
  920. // loc_1689BA
  921. r11_u = 2;
  922. }
  923. else
  924. r11_u = 0;
  925. // loc_1689D6
  926. if (u8_sp108[2] == 2)
  927. {
  928. LOGE("branch_54");
  929. // loc_1689F0
  930. if (u8_sp108[3] == 1)
  931. r6_u8 = 1;
  932. else // loc_1689FC
  933. r6_u8 = 2;
  934. }
  935. else if (u8_sp108[2] == 1)
  936. {
  937. LOGE("branch_55");
  938. // loc_168A00
  939. r6_u8 = 2;
  940. if (u8_sp108[3] == 2)
  941. r6_u8 = 1;
  942. if (u8_sp108[3] == 0)
  943. r6_u8 = 0;
  944. }
  945. else if (u8_sp108[2] || u8_sp108[3] != 1)
  946. {
  947. LOGE("branch_56");
  948. // loc_1689FC
  949. r6_u8 = 2;
  950. }
  951. else
  952. r6_u8 = 0;
  953. // loc_168A12
  954. count_sp70 = (((count_sp70 & 0xFFFF0000) | r11_u) | (r6_u8 * 256));
  955. TNMNeighbour r5r2_neighbour;
  956. r5r2_neighbour.field_0 = r5_pnmtri;
  957. r5r2_neighbour.field_4 = count_sp70;
  958. r7_pnmtri->vector_nmneighbour_0.Insert(r5r2_neighbour);
  959. // vector_nmtri_0.pBuf_0[r11_u]
  960. TNMNeighbour r7r2_neighbour;
  961. r7r2_neighbour.field_0 = r7_pnmtri;
  962. r7r2_neighbour.field_4 = (((((uint)&list_sp188) & 0xffff0000) | (r11_u * 256)) | r6_u8);
  963. r5_pnmtri->vector_nmneighbour_0.Insert(r7r2_neighbour);
  964. // LOGE("insert");
  965. }
  966. // loc_168A4A
  967. r10_u8++;
  968. r11_u++;
  969. }
  970. r10_u8 = sp6c;
  971. r10_u8++;
  972. r9_u8++;
  973. }
  974. //
  975. // list_sp108.pLast_0=0;
  976. LOGE("end");
  977. }
  978. //---------------------------------------------------------------------------------------
  979. // 00168F60
  980. void CFTTNavMesh::Pathfind(fpoint2<PointType_14>, fpoint2<PointType_14>,
  981. TTList<fpoint2<PointType_14>> &) {}
  982. //---------------------------------------------------------------------------------------
  983. TNMTri::TNMTri()
  984. {
  985. }
  986. //这里引用的数据太少 实际拷贝的数据一样测试1-3
  987. // 00168e16 ^_-
  988. //单元测试等级: 目测游戏表现
  989. //单元测试内容: 1-3关
  990. //单元测试结果: 正常
  991. //已测试分支
  992. TNMTri::TNMTri(TNMTri const &r1_other) : vector_nmneighbour_0(r1_other.vector_nmneighbour_0)
  993. {
  994. LOGE("TNMTri");
  995. // vector_nmneighbour_0 = r1_other.vector_nmneighbour_0;
  996. filed_C = r1_other.filed_C;
  997. for (int r2_i = 0; r2_i != 3; r2_i++)
  998. {
  999. // loc_168E2A
  1000. filed_10[r2_i] = r1_other.filed_10[r2_i];
  1001. }
  1002. filed_28 = r1_other.filed_28;
  1003. filed_2C = r1_other.filed_2C;
  1004. filed_30[0] = r1_other.filed_30[0];
  1005. filed_30[1] = r1_other.filed_30[1];
  1006. filed_30[2] = r1_other.filed_30[2];
  1007. filed_30[3] = r1_other.filed_30[3];
  1008. filed_34 = r1_other.filed_34;
  1009. filed_38 = r1_other.filed_38;
  1010. }
  1011. fpoint2<PointType_14> TNMTri::Inside(fpoint2<PointType_14> a1, bool a2)
  1012. {
  1013. fpoint2<PointType_14> test;
  1014. test.x_0 = a1.x_0 + 1;
  1015. LOGE("%x%x%x", a1.x_0, a2, a1.y_4);
  1016. return test;
  1017. }