#include "THISDUST.H" #include "PATHFIND.H" // decompiled code // original method signature: // struct tNode /*$ra*/ popNode() // line 314, offset 0x000e7000 /* begin block 1 */ // Start line: 315 // Start offset: 0x000E7000 // Variables: // unsigned int lNumHeapEntries; // $s0 // struct tNode res; // stack offset -24 // unsigned short f; // $t8 // unsigned int child; // $a1 // unsigned int here; // $t5 /* begin block 1.1 */ // Start line: 325 // Start offset: 0x000E7058 // Variables: // unsigned int lastEntry; // $t4 /* begin block 1.1.1 */ // Start line: 329 // Start offset: 0x000E7070 // Variables: // int d; // $t3 // int d2; // $t2 // int d3; // $a3 // int d4; // $t1 /* end block 1.1.1 */ // End offset: 0x000E70B8 // End Line: 346 /* end block 1.1 */ // End offset: 0x000E7110 // End Line: 347 /* begin block 1.2 */ // Start line: 349 // Start offset: 0x000E7110 // Variables: // int d; // $a2 // int d2; // $a3 // int d3; // $t1 // int d4; // $t2 /* end block 1.2 */ // End offset: 0x000E715C // End Line: 358 /* end block 1 */ // End offset: 0x000E715C // End Line: 361 /* begin block 2 */ // Start line: 628 /* end block 2 */ // End Line: 629 /* begin block 3 */ // Start line: 630 /* end block 3 */ // End Line: 631 tNode * popNode(tNode *__return_storage_ptr__) { ushort uVar1; undefined2 uVar2; int iVar3; int iVar4; int iVar5; undefined4 uVar6; ushort uVar7; uint uVar8; uint uVar9; undefined4 uVar10; undefined4 uVar11; ushort uVar12; uint uVar13; uVar6 = DAT_PATH__000f1b24; iVar5 = DAT_PATH__000f1b20; iVar4 = DAT_PATH__000f1b1c; iVar3 = DAT_PATH__000f1b18; if (1 < DAT_PATH__000f279c) { uVar1 = (&DAT_PATH__000f1b14)[DAT_PATH__000f279c * 8]; uVar13 = 1; while( true ) { uVar8 = uVar13 * 2; uVar12 = (&DAT_PATH__000f1b14)[uVar13 * 0x10]; uVar9 = uVar8; uVar7 = uVar12; if ((DAT_PATH__000f279c - 2 <= uVar8) || (uVar9 = uVar8 + 1, uVar7 = (&DAT_PATH__000f1b14)[(uVar8 + 1) * 8], (ushort)(&DAT_PATH__000f1b14)[(uVar8 + 1) * 8] < uVar12)) { uVar12 = uVar7; uVar8 = uVar9; } if ((DAT_PATH__000f279c - 2 < uVar8) || (uVar1 <= uVar12)) break; uVar10 = (&DAT_PATH__000f1b0c)[uVar8 * 4]; uVar11 = (&DAT_PATH__000f1b10)[uVar8 * 4]; (&DAT_PATH__000f1b08)[uVar13 * 4] = (&DAT_PATH__000f1b08)[uVar8 * 4]; (&DAT_PATH__000f1b0c)[uVar13 * 4] = uVar10; (&DAT_PATH__000f1b10)[uVar13 * 4] = uVar11; (&DAT_PATH__000f1b14)[uVar13 * 8] = uVar12; uVar13 = uVar8; } uVar10 = (&DAT_PATH__000f1b0c)[DAT_PATH__000f279c * 4]; uVar11 = (&DAT_PATH__000f1b10)[DAT_PATH__000f279c * 4]; uVar2 = (&DAT_PATH__000f1b14)[DAT_PATH__000f279c * 8]; (&DAT_PATH__000f1b08)[uVar13 * 4] = (&DAT_PATH__000f1b08)[DAT_PATH__000f279c * 4]; (&DAT_PATH__000f1b0c)[uVar13 * 4] = uVar10; (&DAT_PATH__000f1b10)[uVar13 * 4] = uVar11; (&DAT_PATH__000f1b14)[uVar13 * 8] = uVar2; } DAT_PATH__000f279c = DAT_PATH__000f279c - 1; __return_storage_ptr__->vx = iVar3; __return_storage_ptr__->vy = iVar4; __return_storage_ptr__->vz = iVar5; *(undefined4 *)&__return_storage_ptr__->dist = uVar6; return __return_storage_ptr__; } // decompiled code // original method signature: // void /*$ra*/ WunCell(struct VECTOR *pbase /*$s0*/) // line 426, offset 0x000e7194 /* begin block 1 */ // Start line: 427 // Start offset: 0x000E7194 // Variables: // int i; // $s2 // int j; // $s4 // struct VECTOR v[2]; // stack offset -88 // struct VECTOR pos; // stack offset -56 /* begin block 1.1 */ // Start line: 440 // Start offset: 0x000E723C /* begin block 1.1.1 */ // Start line: 440 // Start offset: 0x000E723C // Variables: // int z; // $a1 // int x; // $a2 /* end block 1.1.1 */ // End offset: 0x000E72C8 // End Line: 446 /* end block 1.1 */ // End offset: 0x000E72C8 // End Line: 446 /* end block 1 */ // End offset: 0x000E735C // End Line: 450 /* begin block 2 */ // Start line: 910 /* end block 2 */ // End Line: 911 void WunCell(VECTOR *pbase) { byte bVar1; char cVar2; undefined3 extraout_var; byte bVar3; int iVar4; short *psVar5; int iVar6; int iVar7; VECTOR local_58; VECTOR local_48; int local_38; int local_34; int local_30; pbase->vx = pbase->vx + 0x200; pbase->vz = pbase->vz + 0x200; local_58.vy = MapHeight(pbase); local_58.vy = local_58.vy + 0x3c; pbase->vx = pbase->vx + -0x200; pbase->vz = pbase->vz + -0x200; iVar6 = 0; local_48.vy = local_58.vy; local_34 = local_58.vy; do { iVar4 = 0; if (iVar6 != 0) { pbase->vx = pbase->vx + 0x200; } iVar7 = iVar6 + 1; psVar5 = &DAT_PATH__000e9108; do { local_58.vx = pbase->vx + (int)*psVar5; local_58.vz = pbase->vz + (int)(short)(&DAT_PATH__000e910a)[iVar4 * 4]; local_48.vx = pbase->vx + (int)(short)(&DAT_PATH__000e910c)[iVar4 * 4]; local_48.vz = pbase->vz + (int)psVar5[3]; local_38 = local_58.vx + local_48.vx >> 1; local_30 = local_58.vz + local_48.vz >> 1; cVar2 = lineClear(&local_58,&local_48); bVar3 = 0; if (CONCAT31(extraout_var,cVar2) == 0) { bVar3 = 0xff; } psVar5 = psVar5 + 4; iVar4 = iVar4 + 1; bVar1 = (&DAT_PATH__000e91a8) [((int)(local_30 >> 8 & 0x7fU) >> 3) + (local_38 >> 8 & 0x7fU) * 0x10]; (&DAT_PATH__000e91a8)[((int)(local_30 >> 8 & 0x7fU) >> 3) + (local_38 >> 8 & 0x7fU) * 0x10] = bVar1 ^ (byte)(1 << (local_30 >> 8 & 7U)) & (bVar1 ^ bVar3); } while (iVar4 < 6); if (iVar6 != 0) { pbase->vx = pbase->vx + -0x200; } iVar6 = iVar7; } while (iVar7 < 2); return; } // decompiled code // original method signature: // void /*$ra*/ InvalidateMap() // line 453, offset 0x000e735c /* begin block 1 */ // Start line: 455 // Start offset: 0x000E735C // Variables: // struct VECTOR bPos; // stack offset -16 // int count; // $t4 // int dir; // $t1 // int p; // $t2 // int q; // $t3 /* begin block 1.1 */ // Start line: 465 // Start offset: 0x000E73A8 // Variables: // int tile; // $a0 // int mask; // $a1 // int diff; // $a1 // int i; // $v0 /* end block 1.1 */ // End offset: 0x000E73A8 // End Line: 468 /* end block 1 */ // End offset: 0x000E74B0 // End Line: 487 /* begin block 2 */ // Start line: 1011 /* end block 2 */ // End Line: 1012 /* begin block 3 */ // Start line: 1015 /* end block 3 */ // End Line: 1016 /* begin block 4 */ // Start line: 1016 /* end block 4 */ // End Line: 1017 /* begin block 5 */ // Start line: 1023 /* end block 5 */ // End Line: 1024 /* WARNING: Unknown calling convention yet parameter storage is locked */ void InvalidateMap(void) { uint uVar1; uint uVar2; uint uVar3; int iVar4; int iVar5; int iVar6; uint local_10; uint local_8; iVar5 = 0; iVar4 = 0; uVar3 = 0; iVar6 = 0x3ff; local_10 = player.pos[0] & 0xfffffc00; local_8 = player.pos[2] & 0xfffffc00; do { uVar2 = (int)local_8 >> 10; uVar1 = *(uint *)(&DAT_PATH__000e99b0 + (uVar2 & 1) * 4 + ((int)local_10 >> 10 & 0x1fU) * 8); *(uint *)(&DAT_PATH__000e99b0 + (uVar2 & 1) * 4 + ((int)local_10 >> 10 & 0x1fU) * 8) = uVar1 ^ 3 << (uVar2 & 0x1e) & (((((int)local_10 >> 10 & 0x3fU) >> 5 | uVar2 >> 4 & 2) ^ 3) << (uVar2 & 0x1e) ^ uVar1); if (uVar3 == 1) { iVar5 = iVar5 + 1; local_8 = local_8 + 0x400; if (iVar4 == iVar5) { uVar3 = 2; } } else { if (uVar3 < 2) { uVar1 = local_10 + 0x400; if (uVar3 == 0) { iVar4 = iVar4 + 1; local_10 = uVar1; if (iVar4 + iVar5 == 1) { uVar3 = 1; } } else { LAB_PATH__000e7484: iVar5 = iVar5 + -1; local_8 = local_8 - 0x400; if (iVar4 == iVar5) { uVar3 = 0; } } } else { uVar1 = local_10 - 0x400; if (uVar3 != 2) goto LAB_PATH__000e7484; iVar4 = iVar4 + -1; local_10 = uVar1; if (iVar4 + iVar5 == 0) { uVar3 = 3; } } } iVar6 = iVar6 + -1; if (iVar6 < 0) { return; } } while( true ); } // decompiled code // original method signature: // void /*$ra*/ BloodyHell() // line 495, offset 0x000e74b0 /* begin block 1 */ // Start line: 497 // Start offset: 0x000E74B0 // Variables: // struct VECTOR bPos; // stack offset -48 // int count; // $s4 // int dir; // $s0 // int p; // $s1 // int q; // $s2 // unsigned int howMany; // $s3 // Labels: // 0x0000069C raa /* begin block 1.1 */ // Start line: 517 // Start offset: 0x000E755C // Variables: // int tile; // $a0 // int mask; // $a1 // int diff; // $v0 // int i; // $v0 /* end block 1.1 */ // End offset: 0x000E75E4 // End Line: 537 /* end block 1 */ // End offset: 0x000E76C4 // End Line: 565 /* begin block 2 */ // Start line: 1125 /* end block 2 */ // End Line: 1126 /* begin block 3 */ // Start line: 1134 /* end block 3 */ // End Line: 1135 /* begin block 4 */ // Start line: 1135 /* end block 4 */ // End Line: 1136 /* begin block 5 */ // Start line: 1146 /* end block 5 */ // End Line: 1147 /* WARNING: Unknown calling convention yet parameter storage is locked */ void BloodyHell(void) { uint uVar1; uint uVar2; uint uVar3; uint uVar4; int iVar5; int iVar6; uint uVar7; int iVar8; VECTOR local_30; local_30.vy = &DAT_00001fed; DAT_PATH__000f2798 = 0; local_30.vx = player.pos[0] & 0xfffffc00; local_30.vz = player.pos[2] & 0xfffffc00; uVar7 = DAT_PATH__000e9138; if (CameraCnt < 4) { uVar7 = DAT_PATH__000e9138 + 0x14; } iVar6 = 0; if (CameraCnt < 8) { uVar7 = uVar7 + 4; } iVar5 = 0; uVar4 = 0; iVar8 = 0; do { if (iVar8 == 200) { uVar7 = uVar7 - 1; } uVar2 = (int)local_30.vz >> 10; uVar3 = *(uint *)(&DAT_PATH__000e99b0 + (uVar2 & 1) * 4 + ((int)local_30.vx >> 10 & 0x1fU) * 8); uVar1 = 3 << (uVar2 & 0x1e) & ((((int)local_30.vx >> 10 & 0x3fU) >> 5 | uVar2 >> 4 & 2) << (uVar2 & 0x1e) ^ uVar3); if (uVar1 != 0) { *(uint *)(&DAT_PATH__000e99b0 + (uVar2 & 1) * 4 + ((int)local_30.vx >> 10 & 0x1fU) * 8) = uVar3 ^ uVar1; WunCell(&local_30); DAT_PATH__000f2798 = DAT_PATH__000f2798 + 1; if (uVar7 <= DAT_PATH__000f2798) { return; } } if (uVar4 == 1) { iVar6 = iVar6 + 1; local_30.vz = local_30.vz + 0x400; if (iVar5 == iVar6) { uVar4 = 2; } } else { if (uVar4 < 2) { if (uVar4 == 0) { iVar5 = iVar5 + 1; local_30.vx = local_30.vx + 0x400; if (iVar5 + iVar6 == 1) { uVar4 = 1; } } else { LAB_PATH__000e7674: iVar6 = iVar6 + -1; local_30.vz = local_30.vz - 0x400; if (iVar5 == iVar6) { uVar4 = 0; } } } else { if (uVar4 != 2) goto LAB_PATH__000e7674; iVar5 = iVar5 + -1; local_30.vx = local_30.vx - 0x400; if (iVar5 + iVar6 == 0) { uVar4 = 3; } } } iVar8 = iVar8 + 1; if (0x348 < iVar8) { return; } } while( true ); } // decompiled code // original method signature: // int /*$ra*/ blocked(struct tNode *v1 /*$a3*/, struct tNode *v2 /*$a2*/) // line 567, offset 0x000e76c4 /* begin block 1 */ // Start line: 568 // Start offset: 0x000E76C4 // Variables: // struct VECTOR pos; // stack offset -24 // int res; // $a0 /* begin block 1.1 */ // Start line: 575 // Start offset: 0x000E76E0 /* begin block 1.1.1 */ // Start line: 575 // Start offset: 0x000E76E0 // Variables: // int z; // $a2 // int x; // $v1 /* end block 1.1.1 */ // End offset: 0x000E774C // End Line: 578 /* end block 1.1 */ // End offset: 0x000E774C // End Line: 578 /* begin block 1.2 */ // Start line: 585 // Start offset: 0x000E7790 /* begin block 1.2.1 */ // Start line: 585 // Start offset: 0x000E7790 // Variables: // int z; // $v1 // int x; // $a0 /* end block 1.2.1 */ // End offset: 0x000E7790 // End Line: 585 /* end block 1.2 */ // End offset: 0x000E7790 // End Line: 585 /* end block 1 */ // End offset: 0x000E7814 // End Line: 590 /* begin block 2 */ // Start line: 1339 /* end block 2 */ // End Line: 1340 /* begin block 3 */ // Start line: 1342 /* end block 3 */ // End Line: 1343 int blocked(tNode *v1,tNode *v2) { byte bVar1; bool bVar2; char cVar3; int iVar4; int iVar5; undefined3 extraout_var; int iVar6; int iVar7; uint uVar8; uint uVar9; byte bVar10; if (DAT_PATH__000e913c == 0) { uVar8 = v1->vz + v2->vz >> 9; uVar8 = (int)(uint)(byte)(&DAT_PATH__000e91a8) [((int)(uVar8 & 0x7f) >> 3) + (v1->vx + v2->vx >> 5 & 0x7f0U)] >> (uVar8 & 7) & 1; } else { iVar4 = v1->vx; iVar6 = v2->vx; iVar5 = v1->vz; iVar7 = v2->vz; cVar3 = lineClear((VECTOR *)v1,(VECTOR *)v2); bVar10 = 0; bVar2 = CONCAT31(extraout_var,cVar3) == 0; uVar8 = (uint)bVar2; uVar9 = iVar5 + iVar7 >> 9; if (bVar2) { bVar10 = 0xff; } bVar1 = (&DAT_PATH__000e91a8)[((int)(uVar9 & 0x7f) >> 3) + (iVar4 + iVar6 >> 9 & 0x7fU) * 0x10]; (&DAT_PATH__000e91a8)[((int)(uVar9 & 0x7f) >> 3) + (iVar4 + iVar6 >> 9 & 0x7fU) * 0x10] = bVar1 ^ (byte)(1 << (uVar9 & 7)) & (bVar1 ^ bVar10); } return uVar8; } // decompiled code // original method signature: // void /*$ra*/ setDistance(struct tNode *n /*$a0*/, unsigned short dist /*$a1*/) // line 659, offset 0x000e90a4 /* begin block 1 */ // Start line: 1316 /* end block 1 */ // End Line: 1317 /* begin block 2 */ // Start line: 1318 /* end block 2 */ // End Line: 1319 void setDistance(tNode *n,ushort dist) { n->dist = dist | 1; (&DAT_PATH__000e9b00) [(n->vx >> 2 & 0x3f80U | n->vz >> 9 & 0x7fU) ^ (n->vy & 1U) * 0x2040 ^ (n->vy & 2U) << 0xc] = dist | 1; return; } // decompiled code // original method signature: // void /*$ra*/ iterate() // line 712, offset 0x000e7814 /* begin block 1 */ // Start line: 714 // Start offset: 0x000E7814 // Variables: // int dir; // $s2 // struct tNode itHere; // stack offset -48 // struct tNode *nbr; // $s4 /* begin block 1.1 */ // Start line: 724 // Start offset: 0x000E7870 // Variables: // int nearBy; // $v1 // int computed; // $s1 /* begin block 1.1.1 */ // Start line: 726 // Start offset: 0x000E7870 // Variables: // int dx; // $v0 // int dz; // $a0 /* end block 1.1.1 */ // End offset: 0x000E7870 // End Line: 727 /* begin block 1.1.2 */ // Start line: 727 // Start offset: 0x000E7870 /* begin block 1.1.2.1 */ // Start line: 727 // Start offset: 0x000E7870 // Variables: // int res; // $a0 /* end block 1.1.2.1 */ // End offset: 0x000E7870 // End Line: 727 /* end block 1.1.2 */ // End offset: 0x000E7870 // End Line: 727 /* end block 1.1 */ // End offset: 0x000E797C // End Line: 763 /* begin block 1.2 */ // Start line: 768 // Start offset: 0x000E79B4 // Variables: // int nr; // $a0 // int nl; // $v1 /* begin block 1.2.1 */ // Start line: 770 // Start offset: 0x000E7A08 // Variables: // unsigned int a; // $v1 /* begin block 1.2.1.1 */ // Start line: 770 // Start offset: 0x000E7A08 /* begin block 1.2.1.1.1 */ // Start line: 713 // Start offset: 0x000E7A44 // Variables: // unsigned int r; // $v0 /* end block 1.2.1.1.1 */ // End offset: 0x000E7A68 // End Line: 713 /* end block 1.2.1.1 */ // End offset: 0x000E7A68 // End Line: 713 /* end block 1.2.1 */ // End offset: 0x000E7A68 // End Line: 713 /* begin block 1.2.2 */ // Start line: 773 // Start offset: 0x000E7AAC // Variables: // struct tNode *pnode; // $s0 /* begin block 1.2.2.1 */ // Start line: 773 // Start offset: 0x000E7AAC // Variables: // unsigned int parent; // $a2 // unsigned int i; // $a3 /* end block 1.2.2.1 */ // End offset: 0x000E7B98 // End Line: 773 /* end block 1.2.2 */ // End offset: 0x000E7B98 // End Line: 773 /* end block 1.2 */ // End offset: 0x000E7B98 // End Line: 774 /* end block 1 */ // End offset: 0x000E7BA8 // End Line: 776 /* begin block 2 */ // Start line: 1525 /* end block 2 */ // End Line: 1526 /* begin block 3 */ // Start line: 1648 /* end block 3 */ // End Line: 1649 /* begin block 4 */ // Start line: 1649 /* end block 4 */ // End Line: 1650 /* begin block 5 */ // Start line: 1651 /* end block 5 */ // End Line: 1652 /* WARNING: Unknown calling convention yet parameter storage is locked */ void iterate(void) { ushort uVar1; ushort uVar2; int iVar3; int iVar4; uint uVar5; uint uVar6; uint uVar7; tNode *v2; int iVar8; tNode local_30; if (DAT_PATH__000f279c != 0) { popNode(&local_30); iVar8 = 0; v2 = (tNode *)&DAT_1f800020; do { iVar3 = (&DAT_PATH__000e9140)[iVar8]; iVar4 = local_30.vx + (short)iVar3; v2->vx = iVar4; v2->vy = local_30.vy; iVar3 = local_30.vz + (iVar3 >> 0x10); v2->vz = iVar3; uVar1 = (&DAT_PATH__000e9b00) [(iVar4 >> 2 & 0x3f80U | iVar3 >> 9 & 0x7fU) ^ (local_30.vy & 1) * 0x2040 ^ (local_30.vy & 2) << 0xc]; v2->dist = uVar1; if ((uVar1 & 1) == 0) { iVar3 = blocked(&local_30,v2); if (iVar3 == 0) { iVar3 = v2->vy - local_30.vy; if (iVar3 < 0) { iVar3 = local_30.vy - v2->vy; } if (iVar3 < 0xc9) { if ((uVar1 & 1) == 0) { v2->dist = 0; } goto LAB_PATH__000e797c; } } v2->dist = 1; } else { if ((int)(uint)uVar1 <= (int)((uint)local_30.dist - 0x120)) { v2->dist = 1; } } LAB_PATH__000e797c: iVar8 = iVar8 + 1; v2 = v2 + 1; } while (iVar8 < 6); iVar3 = 0; iVar8 = 1; do { if (*(short *)(&DAT_1f80002c + iVar3 * 4) == 0) { uVar1 = (ushort)DAT_1f80002c; if (iVar3 != 5) { uVar1 = *(ushort *)(&DAT_1f80003c + iVar3 * 4); } uVar2 = DAT_1f80007c; if (iVar3 != 0) { uVar2 = *(ushort *)(&DAT_1f80001c + iVar3 * 4); } if (uVar2 < 2) { if (uVar1 >= 2) { iVar8 = (uint)uVar1 + (uint)local_30.dist; goto LAB_PATH__000e7a94; } uVar5 = (uint)local_30.dist + 0x100; } else { if (uVar1 < 2) { iVar8 = (uint)uVar2 + (uint)local_30.dist; LAB_PATH__000e7a94: uVar5 = (iVar8 >> 1) + 0xdd; } else { iVar8 = (uint)uVar1 - (uint)uVar2; uVar5 = 0x10000 - (iVar8 * iVar8) / 3; if ((int)uVar5 < 0) { uVar5 = 0; } else { uVar6 = (uVar5 >> 9) + 0x80; if (uVar6 == 0) { trap(7); } uVar5 = uVar5 / uVar6 + uVar6 >> 1; } uVar5 = local_30.dist + uVar5; } } uVar5 = uVar5 & 0xffff; iVar8 = iVar3 + 1; if (DAT_PATH__000f279c != 0xc6) { setDistance((tNode *)(&DAT_1f800020 + iVar3 * 4),(ushort)uVar5); uVar7 = DAT_PATH__000f279c + 1; uVar6 = uVar7 >> 1; iVar8 = uVar7 * 0x10; if ((uVar6 != 0) && (uVar5 < (ushort)(&DAT_PATH__000f1b14)[uVar6 * 8])) { iVar8 = uVar7 * 0x10; do { uVar7 = uVar6; *(undefined4 *)((int)&DAT_PATH__000f1b08 + iVar8) = (&DAT_PATH__000f1b08)[uVar7 * 4]; *(undefined4 *)((int)&DAT_PATH__000f1b0c + iVar8) = (&DAT_PATH__000f1b0c)[uVar7 * 4]; *(undefined4 *)((int)&DAT_PATH__000f1b10 + iVar8) = (&DAT_PATH__000f1b10)[uVar7 * 4]; uVar6 = uVar7 >> 1; *(undefined4 *)((int)&DAT_PATH__000f1b14 + iVar8) = *(undefined4 *)(&DAT_PATH__000f1b14 + uVar7 * 8); if (uVar6 == 0) break; iVar8 = uVar7 << 4; } while (uVar5 < (ushort)(&DAT_PATH__000f1b14)[uVar6 * 8]); iVar8 = uVar7 << 4; } *(int *)((int)&DAT_PATH__000f1b08 + iVar8) = ((tNode *)(&DAT_1f800020 + iVar3 * 4))->vx; *(undefined4 *)((int)&DAT_PATH__000f1b0c + iVar8) = (&DAT_1f800024)[iVar3 * 4]; *(undefined4 *)((int)&DAT_PATH__000f1b10 + iVar8) = (&DAT_1f800028)[iVar3 * 4]; DAT_PATH__000f279c = DAT_PATH__000f279c + 1; *(undefined4 *)((int)&DAT_PATH__000f1b14 + iVar8) = (&DAT_1f80002c)[iVar3 * 4]; iVar8 = iVar3 + 1; } } iVar3 = iVar8; iVar8 = iVar3 + 1; } while (iVar3 < 6); } return; } // decompiled code // original method signature: // void /*$ra*/ InitPathFinding() // line 801, offset 0x000e7bd0 /* begin block 1 */ // Start line: 803 // Start offset: 0x000E7BD0 // Variables: // int i; // $a0 /* begin block 1.1 */ // Start line: 802 // Start offset: 0x000E7BD0 /* end block 1.1 */ // End offset: 0x000E7BD0 // End Line: 802 /* begin block 1.2 */ // Start line: 802 // Start offset: 0x000E7BD0 /* end block 1.2 */ // End offset: 0x000E7BD0 // End Line: 802 /* end block 1 */ // End offset: 0x000E7CA8 // End Line: 819 /* begin block 2 */ // Start line: 1602 /* end block 2 */ // End Line: 1603 /* begin block 3 */ // Start line: 1603 /* end block 3 */ // End Line: 1604 /* WARNING: Unknown calling convention yet parameter storage is locked */ void InitPathFinding(void) { undefined4 *puVar1; int iVar2; setMem16(&DAT_PATH__000e9b00,0xfffe,0x4000); ClearMem(&DAT_PATH__000e91a8,0x800); ClearMem(&DAT_PATH__000e99b0,0x100); InvalidateMap(); iVar2 = 7; DAT_PATH__000e9ac8 = &DAT_00004650; puVar1 = &DAT_PATH__000f27bc; do { *puVar1 = 18000; iVar2 = iVar2 + -1; puVar1 = puVar1 + -1; } while (iVar2 != -1); DAT_PATH__000e99a8 = 0x50; DAT_PATH__000e99ac = 6; DAT_PATH__000e9ab0 = 0; DAT_PATH__000e9ab8 = 0; DAT_PATH__000e9abc = 0xffffcfb1; DAT_PATH__000e9ac0 = 0; DAT_PATH__000e9acc = 0; DAT_PATH__000f1b00 = 0; uRam000f27c0 = 0x81; return; } // decompiled code // original method signature: // int /*$ra*/ getInterpolatedDistance(struct VECTOR *pos /*$s2*/) // line 821, offset 0x000e7ca8 /* begin block 1 */ // Start line: 822 // Start offset: 0x000E7CA8 // Variables: // struct tNode n; // stack offset -72 // int fx; // $s4 // int fz; // $s5 // int a; // $s3 // int b; // $s2 // int c; // $v1 // int min; // $s0 // int flag; // $fp /* begin block 1.1 */ // Start line: 822 // Start offset: 0x000E7CA8 // Variables: // struct VECTOR *where; // $s2 // struct tNode *node; // $s0 /* begin block 1.1.1 */ // Start line: 822 // Start offset: 0x000E7CA8 // Variables: // int x; // $v1 /* begin block 1.1.1.1 */ // Start line: 822 // Start offset: 0x000E7CA8 // Variables: // struct tNode *pos; // $s0 /* begin block 1.1.1.1.1 */ // Start line: 822 // Start offset: 0x000E7CA8 // Variables: // struct VECTOR sp; // stack offset -56 /* begin block 1.1.1.1.1.1 */ // Start line: 822 // Start offset: 0x000E7CA8 /* begin block 1.1.1.1.1.1.1 */ // Start line: 822 // Start offset: 0x000E7CA8 // Variables: // int z; // $v0 // int x; // $a0 /* end block 1.1.1.1.1.1.1 */ // End offset: 0x000E7CA8 // End Line: 822 /* end block 1.1.1.1.1.1 */ // End offset: 0x000E7CA8 // End Line: 822 /* begin block 1.1.1.1.1.2 */ // Start line: 822 // Start offset: 0x000E7D78 // Variables: // int res; // $v0 /* end block 1.1.1.1.1.2 */ // End offset: 0x000E7D9C // End Line: 822 /* end block 1.1.1.1.1 */ // End offset: 0x000E7DA0 // End Line: 822 /* end block 1.1.1.1 */ // End offset: 0x000E7DA0 // End Line: 822 /* end block 1.1.1 */ // End offset: 0x000E7DA0 // End Line: 822 /* end block 1.1 */ // End offset: 0x000E7DA0 // End Line: 822 /* begin block 1.2 */ // Start line: 822 // Start offset: 0x000E7DA0 /* begin block 1.2.1 */ // Start line: 822 // Start offset: 0x000E7DA0 // Variables: // int res; // $v0 /* end block 1.2.1 */ // End offset: 0x000E7DA0 // End Line: 822 /* end block 1.2 */ // End offset: 0x000E7DA0 // End Line: 822 /* begin block 1.3 */ // Start line: 822 // Start offset: 0x000E7DA0 /* begin block 1.3.1 */ // Start line: 822 // Start offset: 0x000E7DA0 // Variables: // struct VECTOR sp; // stack offset -56 /* begin block 1.3.1.1 */ // Start line: 822 // Start offset: 0x000E7DA0 /* begin block 1.3.1.1.1 */ // Start line: 822 // Start offset: 0x000E7DA0 // Variables: // int x; // $a3 // int z; // $v0 /* end block 1.3.1.1.1 */ // End offset: 0x000E7DA0 // End Line: 822 /* end block 1.3.1.1 */ // End offset: 0x000E7DA0 // End Line: 822 /* begin block 1.3.1.2 */ // Start line: 822 // Start offset: 0x000E7E84 // Variables: // int res; // $v0 /* end block 1.3.1.2 */ // End offset: 0x000E7EA8 // End Line: 822 /* end block 1.3.1 */ // End offset: 0x000E7EAC // End Line: 822 /* end block 1.3 */ // End offset: 0x000E7EAC // End Line: 822 /* begin block 1.4 */ // Start line: 839 // Start offset: 0x000E7EAC /* begin block 1.4.1 */ // Start line: 839 // Start offset: 0x000E7EAC // Variables: // int res; // $a0 /* end block 1.4.1 */ // End offset: 0x000E7EAC // End Line: 839 /* end block 1.4 */ // End offset: 0x000E7EAC // End Line: 839 /* begin block 1.5 */ // Start line: 848 // Start offset: 0x000E7F28 /* begin block 1.5.1 */ // Start line: 848 // Start offset: 0x000E7F28 // Variables: // struct VECTOR sp; // stack offset -56 /* begin block 1.5.1.1 */ // Start line: 848 // Start offset: 0x000E7F28 /* begin block 1.5.1.1.1 */ // Start line: 848 // Start offset: 0x000E7F28 // Variables: // int x; // $v1 // int z; // $v0 /* end block 1.5.1.1.1 */ // End offset: 0x000E7F28 // End Line: 848 /* end block 1.5.1.1 */ // End offset: 0x000E7F28 // End Line: 848 /* begin block 1.5.1.2 */ // Start line: 822 // Start offset: 0x000E7F8C // Variables: // int res; // $v0 /* end block 1.5.1.2 */ // End offset: 0x000E7FB0 // End Line: 822 /* end block 1.5.1 */ // End offset: 0x000E7FB4 // End Line: 822 /* end block 1.5 */ // End offset: 0x000E7FB4 // End Line: 822 /* begin block 1.6 */ // Start line: 850 // Start offset: 0x000E7FB4 /* begin block 1.6.1 */ // Start line: 850 // Start offset: 0x000E7FB4 // Variables: // int res; // $a0 /* end block 1.6.1 */ // End offset: 0x000E7FB4 // End Line: 850 /* end block 1.6 */ // End offset: 0x000E7FB4 // End Line: 850 /* begin block 1.7 */ // Start line: 864 // Start offset: 0x000E807C /* begin block 1.7.1 */ // Start line: 864 // Start offset: 0x000E807C // Variables: // struct VECTOR sp; // stack offset -56 /* begin block 1.7.1.1 */ // Start line: 864 // Start offset: 0x000E807C /* begin block 1.7.1.1.1 */ // Start line: 864 // Start offset: 0x000E807C // Variables: // int x; // $v1 // int z; // $v0 /* end block 1.7.1.1.1 */ // End offset: 0x000E807C // End Line: 864 /* end block 1.7.1.1 */ // End offset: 0x000E807C // End Line: 864 /* begin block 1.7.1.2 */ // Start line: 822 // Start offset: 0x000E80D8 // Variables: // int res; // $v0 /* end block 1.7.1.2 */ // End offset: 0x000E80FC // End Line: 822 /* end block 1.7.1 */ // End offset: 0x000E8100 // End Line: 822 /* end block 1.7 */ // End offset: 0x000E8100 // End Line: 822 /* begin block 1.8 */ // Start line: 865 // Start offset: 0x000E8100 /* begin block 1.8.1 */ // Start line: 865 // Start offset: 0x000E8100 // Variables: // int res; // $a0 /* end block 1.8.1 */ // End offset: 0x000E8100 // End Line: 865 /* end block 1.8 */ // End offset: 0x000E8100 // End Line: 865 /* end block 1 */ // End offset: 0x000E822C // End Line: 880 /* begin block 2 */ // Start line: 1651 /* end block 2 */ // End Line: 1652 /* begin block 3 */ // Start line: 1654 /* end block 3 */ // End Line: 1655 int getInterpolatedDistance(VECTOR *pos) { bool bVar1; bool bVar2; uint uVar3; uint uVar4; int iVar5; uint uVar6; uint uVar7; uint uVar8; int iVar9; int iVar10; uint local_48; uint local_44; uint local_40; ushort local_3c; uint local_38; uint local_30; uVar6 = pos->vz; local_48 = ((int)(pos->vx + ((int)uVar6 >> 1 & 0x1ffU)) >> 9) * 0x200 - ((int)(uVar6 & 0x200) >> 1); local_44 = pos->vy; local_40 = ((int)uVar6 >> 9) << 9; local_38 = local_48 & 0xfffffc00; local_30 = local_40 & 0xfffffc00; if (((int)(uint)(byte)(&DAT_PATH__000e91a8) [((int)((int)local_30 >> 8 & 0x7fU) >> 3) + (local_38 >> 4 & 0x7c0)] >> ((int)local_30 >> 8 & 7U) & 1U) == 0) { local_44 = 0; } else { local_44 = MapHeight((VECTOR *)&local_48); local_44 = local_44 ^ (local_44 ^ sdLevel) & 3; } iVar10 = pos->vz - local_40; iVar9 = (pos->vx - local_48) + (iVar10 >> 1); uVar7 = local_48 + 0x100; uVar3 = local_40 + 0x200; local_38 = uVar7 & 0xfffffc00; local_3c = (&DAT_PATH__000e9b00) [((int)local_48 >> 2 & 0x3f80U | (int)local_40 >> 9 & 0x7fU) ^ (local_44 & 1) * 0x2040 ^ (local_44 & 2) << 0xc]; uVar6 = (uint)local_3c; local_30 = uVar3 & 0xfffffc00; local_48 = uVar7; local_40 = uVar3; if (((int)(uint)(byte)(&DAT_PATH__000e91a8) [((int)((int)local_30 >> 8 & 0x7fU) >> 3) + (local_38 >> 4 & 0x7c0)] >> ((int)local_30 >> 8 & 7U) & 1U) == 0) { local_44 = 0; } else { local_44 = MapHeight((VECTOR *)&local_48); local_44 = local_44 ^ (local_44 ^ sdLevel) & 3; } local_3c = (&DAT_PATH__000e9b00) [((int)local_48 >> 2 & 0x3f80U | (int)local_40 >> 9 & 0x7fU) ^ (local_44 & 1) * 0x2040 ^ (local_44 & 2) << 0xc]; uVar7 = (uint)local_3c; uVar3 = uVar7; if (uVar6 < uVar7) { uVar3 = uVar6; } if (iVar10 < iVar9) { local_48 = local_48 + 0x100; local_40 = local_40 - 0x200; local_38 = local_48 & 0xfffffc00; local_30 = local_40 & 0xfffffc00; if (((int)(uint)(byte)(&DAT_PATH__000e91a8) [((int)((int)local_30 >> 8 & 0x7fU) >> 3) + (local_38 >> 4 & 0x7c0)] >> ((int)local_30 >> 8 & 7U) & 1U) == 0) { uVar4 = 0; } else { uVar4 = MapHeight((VECTOR *)&local_48); uVar4 = uVar4 ^ (uVar4 ^ sdLevel) & 3; } uVar4 = (uint)(ushort)(&DAT_PATH__000e9b00) [((int)local_48 >> 2 & 0x3f80U | (int)local_40 >> 9 & 0x7fU) ^ (uVar4 & 1) * 0x2040 ^ (uVar4 & 2) << 0xc]; uVar8 = uVar4; if (uVar3 < uVar4) { uVar8 = uVar3; } uVar8 = uVar8 + 0x155; bVar1 = 0xffff < uVar8; bVar2 = uVar8 < uVar6; if (bVar1) { uVar8 = 0xffff; } if (!bVar1 && bVar2) { uVar6 = uVar8; } if (uVar8 < uVar7) { uVar7 = uVar8; } iVar5 = uVar4 - uVar6; if (uVar8 < uVar4) { iVar5 = uVar8 - uVar6; uVar4 = uVar8; } iVar5 = iVar5 * iVar9; iVar10 = (uVar7 - uVar4) * iVar10; } else { local_48 = local_48 - 0x200; local_38 = local_48 & 0xfffffc00; local_30 = local_40 & 0xfffffc00; if (((int)(uint)(byte)(&DAT_PATH__000e91a8) [((int)((int)local_30 >> 8 & 0x7fU) >> 3) + (local_38 >> 4 & 0x7c0)] >> ((int)local_30 >> 8 & 7U) & 1U) == 0) { uVar4 = 0; } else { uVar4 = MapHeight((VECTOR *)&local_48); uVar4 = uVar4 ^ (uVar4 ^ sdLevel) & 3; } uVar4 = (uint)(ushort)(&DAT_PATH__000e9b00) [((int)local_48 >> 2 & 0x3f80U | (int)local_40 >> 9 & 0x7fU) ^ (uVar4 & 1) * 0x2040 ^ (uVar4 & 2) << 0xc]; uVar8 = uVar4; if (uVar3 < uVar4) { uVar8 = uVar3; } uVar8 = uVar8 + 0x155; bVar1 = 0xffff < uVar8; bVar2 = uVar8 < uVar6; if (bVar1) { uVar8 = 0xffff; } if (!bVar1 && bVar2) { uVar6 = uVar8; } if (uVar8 < uVar7) { uVar7 = uVar8; } iVar5 = uVar4 - uVar6; if (uVar8 < uVar4) { iVar5 = uVar8 - uVar6; uVar4 = uVar8; } iVar5 = iVar5 * iVar10; iVar10 = (uVar7 - uVar4) * iVar9; } uVar6 = uVar6 + (iVar5 + iVar10 >> 9); DAT_PATH__000e9ac8 = uVar6 ^ (uVar6 & 1 ^ uVar6) & 1; return DAT_PATH__000e9ac8; } // decompiled code // original method signature: // void /*$ra*/ addCivs() // line 891, offset 0x000e822c /* begin block 1 */ // Start line: 893 // Start offset: 0x000E822C // Variables: // struct _CAR_DATA *cp; // $t5 /* begin block 1.1 */ // Start line: 898 // Start offset: 0x000E8260 // Variables: // int where; // $a3 /* begin block 1.1.1 */ // Start line: 900 // Start offset: 0x000E8260 // Variables: // int vx; // $a3 // int vz; // $a1 // int x; // $a3 // int z; // $t0 /* end block 1.1.1 */ // End offset: 0x000E8260 // End Line: 900 /* begin block 1.1.2 */ // Start line: 900 // Start offset: 0x000E8260 // Variables: // int vx; // $t1 // int vz; // $t2 // int x; // $t1 // int z; // $a1 /* end block 1.1.2 */ // End offset: 0x000E8354 // End Line: 922 /* end block 1.1 */ // End offset: 0x000E8354 // End Line: 923 /* end block 1 */ // End offset: 0x000E836C // End Line: 925 /* begin block 2 */ // Start line: 1793 /* end block 2 */ // End Line: 1794 /* begin block 3 */ // Start line: 1805 /* end block 3 */ // End Line: 1806 /* begin block 4 */ // Start line: 1806 /* end block 4 */ // End Line: 1807 /* begin block 5 */ // Start line: 1807 /* end block 5 */ // End Line: 1808 /* WARNING: Type propagation algorithm not settling */ /* WARNING: Unknown calling convention yet parameter storage is locked */ void addCivs(void) { byte bVar1; uint uVar2; int iVar3; uint uVar4; uint uVar5; int iVar6; uint uVar7; int iVar8; uint uVar9; int iVar10; int iVar11; _CAR_DATA *p_Var12; p_Var12 = car_data; do { if (p_Var12->controlType == '\x02') { iVar11 = (int)(p_Var12->hd).oBox.radii[2].vx; iVar6 = (p_Var12->hd).oBox.location.vx; iVar10 = (int)(p_Var12->hd).oBox.radii[2].vz; iVar8 = (p_Var12->hd).oBox.location.vz; uVar4 = iVar6 + iVar11 >> 8 & 0x7e; uVar2 = iVar8 + iVar10 >> 8; uVar5 = uVar2 & 0x7e; iVar3 = (int)uVar5 >> 3; bVar1 = (byte)(3 << (uVar2 & 6)); uVar7 = iVar6 - iVar11 >> 8 & 0x7e; (&DAT_PATH__000e91a8)[iVar3 + uVar4 * 0x10] = bVar1 ^ (&DAT_PATH__000e91a8)[iVar3 + uVar4 * 0x10]; uVar9 = iVar8 - iVar10 >> 8; (&DAT_PATH__000e91a8)[iVar3 + (uVar4 + 1) * 0x10] = bVar1 ^ (&DAT_PATH__000e91a8)[iVar3 + (uVar4 + 1) * 0x10]; uVar2 = uVar9 & 0x7e; if ((uVar4 ^ uVar5 << 8) == uVar7) { if (uVar2 != 0) goto LAB_PATH__000e8310; } else { if (uVar2 << 8 != 1) { LAB_PATH__000e8310: bVar1 = (byte)(3 << (uVar9 & 6)); (&DAT_PATH__000e91a8)[((int)uVar2 >> 3) + uVar7 * 0x10] = bVar1 ^ (&DAT_PATH__000e91a8)[((int)uVar2 >> 3) + uVar7 * 0x10]; (&DAT_PATH__000e91a8)[((int)uVar2 >> 3) + (uVar7 + 1) * 0x10] = bVar1 ^ (&DAT_PATH__000e91a8)[((int)uVar2 >> 3) + (uVar7 + 1) * 0x10]; } } } p_Var12 = p_Var12 + 1; if ((_CAR_DATA *)0xd4697 < p_Var12) { return; } } while( true ); } // decompiled code // original method signature: // void /*$ra*/ UpdateCopMap() // line 933, offset 0x000e836c /* begin block 1 */ // Start line: 935 // Start offset: 0x000E836C /* begin block 1.1 */ // Start line: 939 // Start offset: 0x000E83C0 /* end block 1.1 */ // End offset: 0x000E83C0 // End Line: 939 /* begin block 1.2 */ // Start line: 946 // Start offset: 0x000E83FC // Variables: // struct tNode startNode; // stack offset -72 /* begin block 1.2.1 */ // Start line: 952 // Start offset: 0x000E843C // Variables: // struct _CAR_DATA *cp; // $a0 /* end block 1.2.1 */ // End offset: 0x000E843C // End Line: 952 /* begin block 1.2.2 */ // Start line: 934 // Start offset: 0x000E8500 /* begin block 1.2.2.1 */ // Start line: 934 // Start offset: 0x000E8500 /* begin block 1.2.2.1.1 */ // Start line: 934 // Start offset: 0x000E8500 /* begin block 1.2.2.1.1.1 */ // Start line: 934 // Start offset: 0x000E8500 // Variables: // int i; // $a1 /* begin block 1.2.2.1.1.1.1 */ // Start line: 934 // Start offset: 0x000E8524 // Variables: // int d; // $v0 /* end block 1.2.2.1.1.1.1 */ // End offset: 0x000E8554 // End Line: 934 /* end block 1.2.2.1.1.1 */ // End offset: 0x000E8564 // End Line: 934 /* end block 1.2.2.1.1 */ // End offset: 0x000E8564 // End Line: 934 /* end block 1.2.2.1 */ // End offset: 0x000E8564 // End Line: 934 /* end block 1.2.2 */ // End offset: 0x000E8564 // End Line: 934 /* begin block 1.2.3 */ // Start line: 934 // Start offset: 0x000E8564 /* begin block 1.2.3.1 */ // Start line: 934 // Start offset: 0x000E8564 // Variables: // int x; // $v0 /* begin block 1.2.3.1.1 */ // Start line: 934 // Start offset: 0x000E8564 /* begin block 1.2.3.1.1.1 */ // Start line: 934 // Start offset: 0x000E8564 // Variables: // struct VECTOR sp; // stack offset -56 /* begin block 1.2.3.1.1.1.1 */ // Start line: 934 // Start offset: 0x000E8564 /* begin block 1.2.3.1.1.1.1.1 */ // Start line: 934 // Start offset: 0x000E8564 // Variables: // int z; // $v0 // int x; // $v1 /* end block 1.2.3.1.1.1.1.1 */ // End offset: 0x000E8564 // End Line: 934 /* end block 1.2.3.1.1.1.1 */ // End offset: 0x000E8564 // End Line: 934 /* begin block 1.2.3.1.1.1.2 */ // Start line: 934 // Start offset: 0x000E8604 // Variables: // int res; // $v0 /* end block 1.2.3.1.1.1.2 */ // End offset: 0x000E8628 // End Line: 934 /* end block 1.2.3.1.1.1 */ // End offset: 0x000E862C // End Line: 934 /* end block 1.2.3.1.1 */ // End offset: 0x000E862C // End Line: 934 /* end block 1.2.3.1 */ // End offset: 0x000E862C // End Line: 934 /* end block 1.2.3 */ // End offset: 0x000E862C // End Line: 934 /* begin block 1.2.4 */ // Start line: 934 // Start offset: 0x000E862C // Variables: // struct tNode n; // stack offset -56 // int fx; // $v1 // int fz; // $v0 /* begin block 1.2.4.1 */ // Start line: 934 // Start offset: 0x000E8660 /* begin block 1.2.4.1.1 */ // Start line: 934 // Start offset: 0x000E8660 // Variables: // int dz; // $a0 // int dx; // $v0 /* end block 1.2.4.1.1 */ // End offset: 0x000E8660 // End Line: 934 /* end block 1.2.4.1 */ // End offset: 0x000E8660 // End Line: 934 /* begin block 1.2.4.2 */ // Start line: 934 // Start offset: 0x000E8660 /* begin block 1.2.4.2.1 */ // Start line: 934 // Start offset: 0x000E8660 // Variables: // unsigned int parent; // $a2 // unsigned int i; // $a3 /* end block 1.2.4.2.1 */ // End offset: 0x000E8774 // End Line: 934 /* end block 1.2.4.2 */ // End offset: 0x000E8774 // End Line: 934 /* begin block 1.2.4.3 */ // Start line: 986 // Start offset: 0x000E8774 /* begin block 1.2.4.3.1 */ // Start line: 986 // Start offset: 0x000E8774 // Variables: // int dz; // $a0 // int dx; // $v0 /* end block 1.2.4.3.1 */ // End offset: 0x000E8774 // End Line: 986 /* end block 1.2.4.3 */ // End offset: 0x000E8774 // End Line: 986 /* begin block 1.2.4.4 */ // Start line: 986 // Start offset: 0x000E8774 /* begin block 1.2.4.4.1 */ // Start line: 986 // Start offset: 0x000E8774 // Variables: // unsigned int parent; // $a2 // unsigned int i; // $a3 /* end block 1.2.4.4.1 */ // End offset: 0x000E88B4 // End Line: 987 /* end block 1.2.4.4 */ // End offset: 0x000E88B4 // End Line: 987 /* begin block 1.2.4.5 */ // Start line: 989 // Start offset: 0x000E88B4 /* begin block 1.2.4.5.1 */ // Start line: 989 // Start offset: 0x000E88B4 // Variables: // int dz; // $a0 // int dx; // $v0 /* end block 1.2.4.5.1 */ // End offset: 0x000E88B4 // End Line: 989 /* end block 1.2.4.5 */ // End offset: 0x000E88B4 // End Line: 989 /* begin block 1.2.4.6 */ // Start line: 989 // Start offset: 0x000E88B4 /* begin block 1.2.4.6.1 */ // Start line: 989 // Start offset: 0x000E88B4 // Variables: // unsigned int parent; // $a2 // unsigned int i; // $a3 /* end block 1.2.4.6.1 */ // End offset: 0x000E89BC // End Line: 990 /* end block 1.2.4.6 */ // End offset: 0x000E89BC // End Line: 990 /* begin block 1.2.4.7 */ // Start line: 934 // Start offset: 0x000E89C4 /* begin block 1.2.4.7.1 */ // Start line: 934 // Start offset: 0x000E89C4 // Variables: // int dz; // $a0 // int dx; // $v0 /* end block 1.2.4.7.1 */ // End offset: 0x000E89C4 // End Line: 934 /* end block 1.2.4.7 */ // End offset: 0x000E89C4 // End Line: 934 /* begin block 1.2.4.8 */ // Start line: 934 // Start offset: 0x000E89C4 /* begin block 1.2.4.8.1 */ // Start line: 934 // Start offset: 0x000E89C4 // Variables: // unsigned int parent; // $a2 // unsigned int i; // $a3 /* end block 1.2.4.8.1 */ // End offset: 0x000E8AD8 // End Line: 934 /* end block 1.2.4.8 */ // End offset: 0x000E8AD8 // End Line: 934 /* begin block 1.2.4.9 */ // Start line: 996 // Start offset: 0x000E8AD8 /* begin block 1.2.4.9.1 */ // Start line: 996 // Start offset: 0x000E8AD8 // Variables: // int dz; // $a0 // int dx; // $v0 /* end block 1.2.4.9.1 */ // End offset: 0x000E8AD8 // End Line: 996 /* end block 1.2.4.9 */ // End offset: 0x000E8AD8 // End Line: 996 /* begin block 1.2.4.10 */ // Start line: 996 // Start offset: 0x000E8AD8 /* begin block 1.2.4.10.1 */ // Start line: 996 // Start offset: 0x000E8AD8 // Variables: // unsigned int parent; // $a2 // unsigned int i; // $a3 /* end block 1.2.4.10.1 */ // End offset: 0x000E8C18 // End Line: 997 /* end block 1.2.4.10 */ // End offset: 0x000E8C18 // End Line: 997 /* begin block 1.2.4.11 */ // Start line: 999 // Start offset: 0x000E8C18 /* begin block 1.2.4.11.1 */ // Start line: 999 // Start offset: 0x000E8C18 // Variables: // int dz; // $a0 // int dx; // $v0 /* end block 1.2.4.11.1 */ // End offset: 0x000E8C18 // End Line: 999 /* end block 1.2.4.11 */ // End offset: 0x000E8C18 // End Line: 999 /* begin block 1.2.4.12 */ // Start line: 999 // Start offset: 0x000E8C18 /* begin block 1.2.4.12.1 */ // Start line: 999 // Start offset: 0x000E8C18 // Variables: // unsigned int parent; // $a2 // unsigned int i; // $a3 /* end block 1.2.4.12.1 */ // End offset: 0x000E8D18 // End Line: 999 /* end block 1.2.4.12 */ // End offset: 0x000E8D18 // End Line: 999 /* end block 1.2.4 */ // End offset: 0x000E8D18 // End Line: 999 /* end block 1.2 */ // End offset: 0x000E8D18 // End Line: 999 /* begin block 1.3 */ // Start line: 1010 // Start offset: 0x000E8D54 // Variables: // int i; // $s0 /* begin block 1.3.1 */ // Start line: 934 // Start offset: 0x000E8DF4 /* end block 1.3.1 */ // End offset: 0x000E8DFC // End Line: 934 /* end block 1.3 */ // End offset: 0x000E8DFC // End Line: 1024 /* begin block 1.4 */ // Start line: 1027 // Start offset: 0x000E8DFC // Variables: // int i; // $a1 // int maxRet; // $a0 /* end block 1.4 */ // End offset: 0x000E8E70 // End Line: 1038 /* begin block 1.5 */ // Start line: 1041 // Start offset: 0x000E8E70 // Variables: // int dx; // $a0 // int dy; // $v1 // int dz; // $v0 /* end block 1.5 */ // End offset: 0x000E8F00 // End Line: 1045 /* end block 1 */ // End offset: 0x000E8F00 // End Line: 1046 /* begin block 2 */ // Start line: 1938 /* end block 2 */ // End Line: 1939 /* begin block 3 */ // Start line: 1947 /* end block 3 */ // End Line: 1948 /* begin block 4 */ // Start line: 1948 /* end block 4 */ // End Line: 1949 /* WARNING: Unknown calling convention yet parameter storage is locked */ void UpdateCopMap(void) { int iVar1; uint uVar2; ushort uVar3; int *piVar4; ushort *puVar5; int iVar6; int iVar7; uint uVar8; uint uVar9; uint uVar10; uint local_48; uint local_44; uint local_40; undefined4 local_3c; uint local_38; uint local_30; BloodyHell(); if ((player_position_known == 1) || (CameraCnt == 6)) { DAT_PATH__000f1b00 = 0; setMem16(&DAT_PATH__000e9b00,0xfffe,0x4000); DAT_PATH__000e99ac = 3; } if (DAT_PATH__000f1b00 == 0) { if ((player.playerType == '\x01') && ((CopsCanSeePlayer != 0 || (numActiveCops == 0)))) { iVar1 = (int)player.playerCarId; DAT_PATH__000e9ab8 = car_data[iVar1].hd.where.t[0] + (*(int *)(car_data[iVar1].st + 0x1c) + 0x800 >> 0xc) * 8; DAT_PATH__000e9abc = car_data[iVar1].hd.where.t[1] + (*(int *)(car_data[iVar1].st + 0x20) + 0x800 >> 0xc) * 4; DAT_PATH__000e9ac0 = car_data[iVar1].hd.where.t[2] + (*(int *)(car_data[iVar1].st + 0x24) + 0x800 >> 0xc) * 8; } else { if (DAT_PATH__000e9abc == -0x304f) { DAT_PATH__000e9ab8 = player.pos[0]; DAT_PATH__000e9abc = player.pos[1]; DAT_PATH__000e9ac0 = player.pos[2]; } } puVar5 = &DAT_PATH__000e9b00; iVar1 = 0x3fff; do { uVar2 = (uint)*puVar5 + 0x2000; if ((uVar2 & 1) != 0) { uVar2 = uVar2 ^ 1; } uVar3 = (ushort)uVar2; if (0xfffe < uVar2) { uVar3 = 0xfffe; } *puVar5 = uVar3; iVar1 = iVar1 + -1; puVar5 = puVar5 + 1; } while (-1 < iVar1); local_48 = ((int)(DAT_PATH__000e9ab8 + ((int)DAT_PATH__000e9ac0 >> 1 & 0x1ffU)) >> 9) * 0x200 - ((int)(DAT_PATH__000e9ac0 & 0x200) >> 1); local_40 = ((int)DAT_PATH__000e9ac0 >> 9) << 9; local_44 = DAT_PATH__000e9abc; local_38 = local_48 & 0xfffffc00; DAT_PATH__000f279c = 0; local_30 = local_40 & 0xfffffc00; if (((int)(uint)(byte)(&DAT_PATH__000e91a8) [((int)((int)local_30 >> 8 & 0x7fU) >> 3) + (local_38 >> 4 & 0x7c0)] >> ((int)local_30 >> 8 & 7U) & 1U) == 0) { local_44 = 0; } else { local_44 = MapHeight((VECTOR *)(tNode *)&local_48); local_44 = local_44 ^ (local_44 ^ sdLevel) & 3; } iVar1 = local_48 - DAT_PATH__000e9ab8; if ((int)(DAT_PATH__000e9ac0 - local_40) < (int)((DAT_PATH__000e9ab8 - local_48) + ((int)(DAT_PATH__000e9ac0 - local_40) >> 1))) { iVar1 = SquareRoot0(iVar1 * iVar1 + (local_40 - DAT_PATH__000e9ac0) * (local_40 - DAT_PATH__000e9ac0)); uVar2 = iVar1 / 2 & 0xffff; if (DAT_PATH__000f279c != 0xc6) { setDistance((tNode *)&local_48,(ushort)uVar2); uVar10 = DAT_PATH__000f279c + 1; uVar8 = uVar10 >> 1; if (uVar8 != 0) { uVar3 = (&DAT_PATH__000f1b14)[uVar8 * 8]; while (uVar2 < uVar3) { (&DAT_PATH__000f1b08)[uVar10 * 4] = (&DAT_PATH__000f1b08)[uVar8 * 4]; (&DAT_PATH__000f1b0c)[uVar10 * 4] = (&DAT_PATH__000f1b0c)[uVar8 * 4]; (&DAT_PATH__000f1b10)[uVar10 * 4] = (&DAT_PATH__000f1b10)[uVar8 * 4]; uVar9 = uVar8 >> 1; *(undefined4 *)(&DAT_PATH__000f1b14 + uVar10 * 8) = *(undefined4 *)(&DAT_PATH__000f1b14 + uVar8 * 8); uVar10 = uVar8; if (uVar9 == 0) break; uVar3 = (&DAT_PATH__000f1b14)[uVar9 * 8]; uVar8 = uVar9; } } DAT_PATH__000f279c = DAT_PATH__000f279c + 1; (&DAT_PATH__000f1b08)[uVar10 * 4] = local_48; (&DAT_PATH__000f1b0c)[uVar10 * 4] = local_44; (&DAT_PATH__000f1b10)[uVar10 * 4] = local_40; *(undefined4 *)(&DAT_PATH__000f1b14 + uVar10 * 8) = local_3c; } local_48 = local_48 + 0x100; local_40 = local_40 + 0x200; iVar1 = SquareRoot0((local_48 - DAT_PATH__000e9ab8) * (local_48 - DAT_PATH__000e9ab8) + (local_40 - DAT_PATH__000e9ac0) * (local_40 - DAT_PATH__000e9ac0)); uVar2 = iVar1 / 2 & 0xffff; if (DAT_PATH__000f279c != 0xc6) { setDistance((tNode *)&local_48,(ushort)uVar2); uVar10 = DAT_PATH__000f279c + 1; uVar8 = uVar10 >> 1; if (uVar8 != 0) { uVar3 = (&DAT_PATH__000f1b14)[uVar8 * 8]; while (uVar2 < uVar3) { (&DAT_PATH__000f1b08)[uVar10 * 4] = (&DAT_PATH__000f1b08)[uVar8 * 4]; (&DAT_PATH__000f1b0c)[uVar10 * 4] = (&DAT_PATH__000f1b0c)[uVar8 * 4]; (&DAT_PATH__000f1b10)[uVar10 * 4] = (&DAT_PATH__000f1b10)[uVar8 * 4]; uVar9 = uVar8 >> 1; *(undefined4 *)(&DAT_PATH__000f1b14 + uVar10 * 8) = *(undefined4 *)(&DAT_PATH__000f1b14 + uVar8 * 8); uVar10 = uVar8; if (uVar9 == 0) break; uVar3 = (&DAT_PATH__000f1b14)[uVar9 * 8]; uVar8 = uVar9; } } DAT_PATH__000f279c = DAT_PATH__000f279c + 1; (&DAT_PATH__000f1b08)[uVar10 * 4] = local_48; (&DAT_PATH__000f1b0c)[uVar10 * 4] = local_44; (&DAT_PATH__000f1b10)[uVar10 * 4] = local_40; *(undefined4 *)(&DAT_PATH__000f1b14 + uVar10 * 8) = local_3c; } local_48 = local_48 + 0x100; local_40 = local_40 + -0x200; iVar1 = SquareRoot0((local_48 - DAT_PATH__000e9ab8) * (local_48 - DAT_PATH__000e9ab8) + (local_40 - DAT_PATH__000e9ac0) * (local_40 - DAT_PATH__000e9ac0)); uVar2 = iVar1 / 2 & 0xffff; if (DAT_PATH__000f279c == 0xc6) goto LAB_PATH__000e8dfc; setDistance((tNode *)&local_48,(ushort)uVar2); uVar8 = DAT_PATH__000f279c + 1; uVar10 = uVar8 >> 1; if ((uVar10 != 0) && (uVar2 < (ushort)(&DAT_PATH__000f1b14)[uVar10 * 8])) { iVar1 = uVar8 * 0x10; do { uVar8 = uVar10; *(undefined4 *)((int)&DAT_PATH__000f1b08 + iVar1) = (&DAT_PATH__000f1b08)[uVar8 * 4]; *(undefined4 *)((int)&DAT_PATH__000f1b0c + iVar1) = (&DAT_PATH__000f1b0c)[uVar8 * 4]; *(undefined4 *)((int)&DAT_PATH__000f1b10 + iVar1) = (&DAT_PATH__000f1b10)[uVar8 * 4]; uVar10 = uVar8 >> 1; *(undefined4 *)((int)&DAT_PATH__000f1b14 + iVar1) = *(undefined4 *)(&DAT_PATH__000f1b14 + uVar8 * 8); if (uVar10 == 0) break; iVar1 = uVar8 << 4; } while (uVar2 < (ushort)(&DAT_PATH__000f1b14)[uVar10 * 8]); } } else { iVar1 = SquareRoot0(iVar1 * iVar1 + (local_40 - DAT_PATH__000e9ac0) * (local_40 - DAT_PATH__000e9ac0)); uVar2 = iVar1 / 2 & 0xffff; if (DAT_PATH__000f279c != 0xc6) { setDistance((tNode *)&local_48,(ushort)uVar2); uVar10 = DAT_PATH__000f279c + 1; uVar8 = uVar10 >> 1; if (uVar8 != 0) { uVar3 = (&DAT_PATH__000f1b14)[uVar8 * 8]; while (uVar2 < uVar3) { (&DAT_PATH__000f1b08)[uVar10 * 4] = (&DAT_PATH__000f1b08)[uVar8 * 4]; (&DAT_PATH__000f1b0c)[uVar10 * 4] = (&DAT_PATH__000f1b0c)[uVar8 * 4]; (&DAT_PATH__000f1b10)[uVar10 * 4] = (&DAT_PATH__000f1b10)[uVar8 * 4]; uVar9 = uVar8 >> 1; *(undefined4 *)(&DAT_PATH__000f1b14 + uVar10 * 8) = *(undefined4 *)(&DAT_PATH__000f1b14 + uVar8 * 8); uVar10 = uVar8; if (uVar9 == 0) break; uVar3 = (&DAT_PATH__000f1b14)[uVar9 * 8]; uVar8 = uVar9; } } DAT_PATH__000f279c = DAT_PATH__000f279c + 1; (&DAT_PATH__000f1b08)[uVar10 * 4] = local_48; (&DAT_PATH__000f1b0c)[uVar10 * 4] = local_44; (&DAT_PATH__000f1b10)[uVar10 * 4] = local_40; *(undefined4 *)(&DAT_PATH__000f1b14 + uVar10 * 8) = local_3c; } local_48 = local_48 + 0x100; local_40 = local_40 + 0x200; iVar1 = SquareRoot0((local_48 - DAT_PATH__000e9ab8) * (local_48 - DAT_PATH__000e9ab8) + (local_40 - DAT_PATH__000e9ac0) * (local_40 - DAT_PATH__000e9ac0)); uVar2 = iVar1 / 2 & 0xffff; if (DAT_PATH__000f279c != 0xc6) { setDistance((tNode *)&local_48,(ushort)uVar2); uVar10 = DAT_PATH__000f279c + 1; uVar8 = uVar10 >> 1; if (uVar8 != 0) { uVar3 = (&DAT_PATH__000f1b14)[uVar8 * 8]; while (uVar2 < uVar3) { (&DAT_PATH__000f1b08)[uVar10 * 4] = (&DAT_PATH__000f1b08)[uVar8 * 4]; (&DAT_PATH__000f1b0c)[uVar10 * 4] = (&DAT_PATH__000f1b0c)[uVar8 * 4]; (&DAT_PATH__000f1b10)[uVar10 * 4] = (&DAT_PATH__000f1b10)[uVar8 * 4]; uVar9 = uVar8 >> 1; *(undefined4 *)(&DAT_PATH__000f1b14 + uVar10 * 8) = *(undefined4 *)(&DAT_PATH__000f1b14 + uVar8 * 8); uVar10 = uVar8; if (uVar9 == 0) break; uVar3 = (&DAT_PATH__000f1b14)[uVar9 * 8]; uVar8 = uVar9; } } DAT_PATH__000f279c = DAT_PATH__000f279c + 1; (&DAT_PATH__000f1b08)[uVar10 * 4] = local_48; (&DAT_PATH__000f1b0c)[uVar10 * 4] = local_44; (&DAT_PATH__000f1b10)[uVar10 * 4] = local_40; *(undefined4 *)(&DAT_PATH__000f1b14 + uVar10 * 8) = local_3c; } local_48 = local_48 + -0x200; iVar1 = SquareRoot0((local_48 - DAT_PATH__000e9ab8) * (local_48 - DAT_PATH__000e9ab8) + (local_40 - DAT_PATH__000e9ac0) * (local_40 - DAT_PATH__000e9ac0)); uVar2 = iVar1 / 2 & 0xffff; if (DAT_PATH__000f279c == 0xc6) goto LAB_PATH__000e8dfc; setDistance((tNode *)&local_48,(ushort)uVar2); uVar8 = DAT_PATH__000f279c + 1; uVar10 = uVar8 >> 1; if ((uVar10 != 0) && (uVar2 < (ushort)(&DAT_PATH__000f1b14)[uVar10 * 8])) { iVar1 = uVar8 * 0x10; do { uVar8 = uVar10; *(undefined4 *)((int)&DAT_PATH__000f1b08 + iVar1) = (&DAT_PATH__000f1b08)[uVar8 * 4]; *(undefined4 *)((int)&DAT_PATH__000f1b0c + iVar1) = (&DAT_PATH__000f1b0c)[uVar8 * 4]; *(undefined4 *)((int)&DAT_PATH__000f1b10 + iVar1) = (&DAT_PATH__000f1b10)[uVar8 * 4]; uVar10 = uVar8 >> 1; *(undefined4 *)((int)&DAT_PATH__000f1b14 + iVar1) = *(undefined4 *)(&DAT_PATH__000f1b14 + uVar8 * 8); if (uVar10 == 0) break; iVar1 = uVar8 << 4; } while (uVar2 < (ushort)(&DAT_PATH__000f1b14)[uVar10 * 8]); } } DAT_PATH__000f279c = DAT_PATH__000f279c + 1; (&DAT_PATH__000f1b08)[uVar8 * 4] = local_48; (&DAT_PATH__000f1b0c)[uVar8 * 4] = local_44; (&DAT_PATH__000f1b10)[uVar8 * 4] = local_40; *(undefined4 *)(&DAT_PATH__000f1b14 + uVar8 * 8) = local_3c; } else { addCivs(); iVar1 = DAT_PATH__000f2798 << 2; uVar2 = DAT_PATH__000f2798; if (6 < DAT_PATH__000f2798) { uVar2 = 6; iVar1 = 0x18; } iVar1 = iRam000f27c0 + iVar1 * -4 + uVar2 * -5; if (DAT_PATH__000e99ac != 0) { DAT_PATH__000e99ac = DAT_PATH__000e99ac + -1; iVar1 = iVar1 + 0x3c; } iVar7 = iVar1 + -1; if (iVar1 < 0x24) { iVar7 = 0x23; } while (iVar7 != -1) { iVar7 = iVar7 + -1; iterate(); } addCivs(); } LAB_PATH__000e8dfc: piVar4 = &DAT_PATH__000f27a0; iVar7 = 6; DAT_PATH__000f1b00 = DAT_PATH__000f1b00 + 1; iVar1 = DAT_PATH__000f27bc; do { if (iVar1 < *piVar4) { iVar1 = *piVar4; } iVar7 = iVar7 + -1; piVar4 = piVar4 + 1; } while (-1 < iVar7); if ((DAT_PATH__000e99a8 < DAT_PATH__000f1b00) || (2000 < (int)((uint)(ushort)DAT_PATH__000f1b24 - iVar1))) { DAT_PATH__000f1b00 = 0; } iVar6 = DAT_PATH__000e9ab8 - player.pos[0] >> 4; iVar7 = DAT_PATH__000e9abc - player.pos[1] >> 4; iVar1 = (int)(DAT_PATH__000e9ac0 - player.pos[2]) >> 4; DAT_PATH__000e9acc = iVar6 * iVar6 + iVar7 * iVar7 + iVar1 * iVar1; return; } // decompiled code // original method signature: // int /*$ra*/ getHeadingToPlayer(int vx /*$s4*/, int vy /*$a1*/, int vz /*$s3*/) // line 1050, offset 0x000e8f00 /* begin block 1 */ // Start line: 1051 // Start offset: 0x000E8F00 // Variables: // int d1; // $s2 // int d2; // $s1 // int d3; // $s0 // struct VECTOR pos; // stack offset -48 /* begin block 1.1 */ // Start line: 1051 // Start offset: 0x000E8F00 // Variables: // int dx; // $a3 // int dy; // $v1 // int dz; // $v0 // int playerHereDistSq; // $a3 /* begin block 1.1.1 */ // Start line: 1071 // Start offset: 0x000E8F98 /* end block 1.1.1 */ // End offset: 0x000E8F98 // End Line: 1073 /* end block 1.1 */ // End offset: 0x000E8F98 // End Line: 1074 /* begin block 1.2 */ // Start line: 1098 // Start offset: 0x000E8FF8 /* end block 1.2 */ // End offset: 0x000E9024 // End Line: 1100 /* begin block 1.3 */ // Start line: 1102 // Start offset: 0x000E9030 /* end block 1.3 */ // End offset: 0x000E9058 // End Line: 1110 /* begin block 1.4 */ // Start line: 1106 // Start offset: 0x000E9058 /* end block 1.4 */ // End offset: 0x000E90A4 // End Line: 1111 /* end block 1 */ // End offset: 0x000E90A4 // End Line: 1112 /* begin block 2 */ // Start line: 2208 /* end block 2 */ // End Line: 2209 /* begin block 3 */ // Start line: 2209 /* end block 3 */ // End Line: 2210 /* begin block 4 */ // Start line: 2214 /* end block 4 */ // End Line: 2215 /* begin block 5 */ // Start line: 2228 /* end block 5 */ // End Line: 2229 int getHeadingToPlayer(int vx,int vy,int vz) { int iVar1; uint uVar2; int iVar3; int val; int iVar4; VECTOR local_30; iVar4 = vx - player.pos[0] >> 4; iVar3 = vy - player.pos[1] >> 4; iVar1 = vz - player.pos[2] >> 4; val = 0xfa4; if (DAT_PATH__000e9acc << 1 <= (iVar4 * iVar4 + iVar3 * iVar3 + iVar1 * iVar1) * 3) { local_30.vx = vx + -0x80; local_30.vy = vy; local_30.vz = vz + -0x80; iVar1 = getInterpolatedDistance(&local_30); local_30.vx = vx + 0x80; local_30.vz = vz + -0x80; iVar3 = getInterpolatedDistance(&local_30); local_30.vz = vz + 0x80; local_30.vx = vx; iVar4 = getInterpolatedDistance(&local_30); if (0xf000 < iVar4) { ReplayLog_Fnarr_He_Said_Log(0x3e9); vx = lastKnownPosition.vx - local_30.vx; vz = lastKnownPosition.vz - local_30.vz; goto LAB_PATH__000e9048; } val = 0xbbb; if (0x600 < iVar4) { ReplayLog_Fnarr_He_Said_Log(0x7d2); uVar2 = ratan2((iVar1 - iVar3) * 2,iVar1 + iVar3 + iVar4 * -2); return uVar2 & 0xfff; } } ReplayLog_Fnarr_He_Said_Log(val); vx = player.pos[0] - vx; vz = player.pos[2] - vz; LAB_PATH__000e9048: uVar2 = ratan2(vx,vz); return uVar2 | 0x1000; }