#include "THISDUST.H" #include "EVENT.H" int ElTrainData[83] = { 6, 80, 130, 32768, 336284, -220364, 283420, -2147483646, -204500, -158924, 247580, -123084, 188624, -158924, 73520, -138444, 17200, -124148, -39120, -2147483646, -109276, -82131, -80103, -17628, -203568, -124712, -39728, -265000, 129620, -386012, 2147483648, 80, 130, 0, -158928, 189219, -123684, 246995, -2147483647, 0, 90, 32768, 188402, -425768, 354291, 2147483648, 0, 90, 32768, 354291, -425168, 188402, 2147483648, 60, 110, 0, -386012, 130215, -264404, -39132, -124688, 16619, -139048, 72943, -159520, 282863, -2147483646, -204991, -220964, 336284, 2147483648, 70, 120, 0, -82719, -39712, -2147483646, -115487, -124120, -202968, -18216, -80683, -2147483647 }; int VegasTrainData[7] = { 123, 32768, 982000, -68855, 762717, 2147483648 }; int VegasParkedTrains[3] = { -68855, 975520, 792317 }; int HavanaFerryData[12] = { 40, 0, 0, 425555, -452, 20000, 25, 0, 0, 315750, 130740, 135960 }; int RioFerryData[6] = { 6, 0, 0, 200384, 387424, 410000 }; int HavanaMiniData[4] = { 50, 3995, 4605, 0 }; int LiftingBridges[55] = { 8, -182784, -175616, -168448, 7, -227328, -162304, -141824, -121344, -100864, -80384, -59904, 256, -312832, -305664, -298496, 1, 324096, -311808, -304640, -297472, 1, 247296, -256512, -249344, -242176, 1, 247296, -262656, -255488, -248320, 1, 324096, 32768, 170496, 177664, 184832, 1, -271360, -12800, -5632, 1536, 5, -162304, -102912, -82432, -61952, -39936, -6656, 512, 7680, 3, 4137, 27648, 128000 }; int ChicagoCameraHack[3] = { -208006, 198, 657039 }; int HavanaCameraHack[9] = { -491431, 3568, -139048, -453981, 409, -128009, -453975, 429, -127175 }; int VegasCameraHack[16] = { 124092, 3988, 3494, -11285, 1559, 843824, -38801, 2681, 273148, -36925, 2048, 269647, 273935, -65503, 1617, 796775 }; int RioCameraHack[6] = { -276620, 3072, -321920, -40920, 3623, 382170 }; MissionTrain missionTrain[2] = { { 0, ElTrainData + 4, 100, 150, 200, 289051, 32768 }, { 0, ElTrainData + 7, 125, 145, 215, 4294762796, 0 } }; FixedEvent chicagoDoor[3] = { { { 4294759680, 0, 659706, 0 }, 0, 0, 800u, 0u, 25u, 50u, 80, 0, 0, 0, "WRGFLDDOOR" }, { { 4294758144, 4294966784, 668928, 0 }, 0, 0, 2496u, 4096u, 25u, 50u, 64, 0, 0, 0, "DOOR01" }, { { 195264, 4294963568, 74752, 0 }, 0, 0, 0u, 0u, 0u, 0u, 1088, 0, 0, 0, "FRAME" } }; FixedEvent havanaFixed[3] = { { { 4294784000, 4294967023, 4294925576, 0 }, 0, 0, 800u, 0u, 25u, 50u, 64, 0, 0, 0, "DOOR" }, { { 4294512128, 1529, 4294841856, 0 }, 0, 0, 0u, 0u, 0u, 0u, 1536, 0, 0, 0, "LIFT_SHAFT" }, { { 4294479360, 0, 4294830607, 0 }, 0, 0, 1152u, 0u, 10u, 20u, 80, 0, 0, 0, "BASEDOOR" } }; FixedEvent vegasDoor[5] = { { { 4294955445, 0, 844163, 0 }, 0, 0, 1700u, 3072u, 25u, 50u, 80, 0, 0, 0, "DOOR" }, { { 4294861054, 4294967057, 4294750336, 0 }, 0, 0, 800u, 0u, 25u, 50u, 96, 0, 0, 0, "DOOR01" }, { { 63058, 4294967065, 501184, 0 }, 0, 0, 3200u, 4096u, 25u, 50u, 96, 0, 0, 0, "DOOR02" }, { { 4294807940, 4294967120, 647024, 0 }, 0, 0, 3200u, 4096u, 25u, 50u, 64, 0, 0, 0, "DOOR03" }, { { 123936, 4294967126, 4928, 0 }, 0, 0, 3200u, 4096u, 25u, 50u, 80, 0, 0, 0, "GATE01" } }; FixedEvent rioDoor[6] = { { { 4294843968, 4294967119, 4294712576, 0 }, 0, 0, 3200u, 4096u, 25u, 50u, 96, 0, 0, 0, "DOOR1" }, { { 4294842048, 4294967279, 4294711088, 0 }, 0, 0, 1600u, 0u, 25u, 50u, 80, 0, 0, 0, "DOOR2" }, { { 4294693296, 4294967279, 4294645888, 0 }, 0, 0, 1748u, 3072u, 25u, 50u, 80, 0, 0, 0, "GATE01" }, { { 4294693296, 4294967279, 4294644864, 0 }, 0, 0, 2348u, 1024u, 25u, 50u, 80, 0, 0, 0, "GATE01" }, { { 4294926864, 4294967279, 383328, 0 }, 0, 0, 700u, 2048u, 25u, 50u, 80, 0, 0, 0, "GATE03" }, { { 4294927872, 4294967279, 383328, 0 }, 0, 0, 900u, 0u, 25u, 50u, 80, 0, 0, 0, "GATE03" } }; Helicopter HelicopterData = { 400, 0, 0, 0, 0, 0, 0, { { 0u, 0u, 0u, 0u, 0u, 0u, 0u, 0u }, 0u, 0u, '\0', '\0' }, 0, 0, 0, 0 }; // decompiled code // original method signature: // int /*$ra*/ GetVisValue(int index /*$t1*/, int zDir /*$a1*/) // line 249, offset 0x00045ab8 /* begin block 1 */ // Start line: 250 // Start offset: 0x00045AB8 // Variables: // int value; // $v1 // int radius; // $a0 /* begin block 1.1 */ // Start line: 256 // Start offset: 0x00045AC8 // Variables: // int camera; // $a0 /* end block 1.1 */ // End offset: 0x00045B28 // End Line: 259 /* begin block 1.2 */ // Start line: 263 // Start offset: 0x00045B30 // Variables: // struct _EVENT *ev; // $a0 // int multiple; // $a2 /* begin block 1.2.1 */ // Start line: 274 // Start offset: 0x00045BBC // Variables: // struct VECTOR pos; // stack offset -16 /* end block 1.2.1 */ // End offset: 0x00045C3C // End Line: 281 /* end block 1.2 */ // End offset: 0x00045C40 // End Line: 283 /* end block 1 */ // End offset: 0x00045C68 // End Line: 294 /* begin block 2 */ // Start line: 498 /* end block 2 */ // End Line: 499 int GetVisValue(int index, int zDir) { UNIMPLEMENTED(); return 0; /* uint uVar1; int iVar2; FixedEvent *pFVar3; int *piVar4; int local_10; int local_8; if ((index & 0xc000U) != 0) { uVar1 = ((uint)index >> 0xf ^ 1) & 1; if (zDir == 0) { local_10 = (&player)[uVar1].cameraPos.vx; iVar2 = 16000; } else { local_10 = (&player)[uVar1].cameraPos.vz; iVar2 = 16000; } goto LAB_00045c40; } if ((index & 0x80U) == 0) { iVar2 = (index & 0x7fU) * 0x28; pFVar3 = (FixedEvent *)event; } else { iVar2 = (index & 0x7fU) * 0x2c; pFVar3 = fixedEvent; } piVar4 = (int *)((int)&(pFVar3->position).vx + iVar2); if ((index & 0xf00U) == 0) { LAB_00045bbc: local_10 = *piVar4; local_8 = piVar4[2]; if ((*(ushort *)(piVar4 + 7) & 0xcc0) == 0x80) { local_10 = local_10 - boatOffset.vx; local_8 = local_8 - boatOffset.vz; } if (zDir != 0) { local_10 = local_8; } } else { if ((*(ushort *)(piVar4 + 7) & 0x30) == 0) { if (zDir != 0) goto LAB_00045bbc; } else { if (zDir == 0) goto LAB_00045bbc; } local_10 = *(int *)(((index & 0xf00U) >> 6) + piVar4[6]); } iVar2 = (int)*(short *)((int)piVar4 + 0x1e); LAB_00045c40: if ((index & 0x2000U) != 0) { local_10 = local_10 - iVar2; } if ((index & 0x1000U) != 0) { local_10 = local_10 + iVar2; } return local_10;*/ } // decompiled code // original method signature: // void /*$ra*/ VisibilityLists(enum VisType type /*$a0*/, int i /*$s2*/) // line 297, offset 0x00045c68 /* begin block 1 */ // Start line: 298 // Start offset: 0x00045C68 // Variables: // static unsigned short xList[128]; // offset 0x0 // static unsigned short zList[128]; // offset 0x100 // static unsigned short (*firstX[2]); // offset 0x0 // static unsigned short (*firstZ[2]); // offset 0x8 // static int count; // offset 0x10 /* begin block 1.1 */ // Start line: 331 // Start offset: 0x00045D98 // Variables: // static unsigned short (*list[2]); // offset 0x50 // int table[128]; // stack offset -552 // int j; // $s0 /* begin block 1.1.1 */ // Start line: 339 // Start offset: 0x00045E10 // Variables: // int tempList; // $t7 // int k; // $t0 /* end block 1.1.1 */ // End offset: 0x00045EB8 // End Line: 350 /* end block 1.1 */ // End offset: 0x00045ECC // End Line: 352 /* begin block 1.2 */ // Start line: 355 // Start offset: 0x00045F14 // Variables: // int camera; // $a1 /* end block 1.2 */ // End offset: 0x00045F78 // End Line: 361 /* begin block 1.3 */ // Start line: 365 // Start offset: 0x00045F90 // Variables: // struct _EVENT *ev; // $a0 /* end block 1.3 */ // End offset: 0x00046068 // End Line: 384 /* begin block 1.4 */ // Start line: 387 // Start offset: 0x00046068 // Variables: // struct _EVENT *ev; // $v1 /* end block 1.4 */ // End offset: 0x000460BC // End Line: 398 /* end block 1 */ // End offset: 0x000460EC // End Line: 400 /* begin block 2 */ // Start line: 590 /* end block 2 */ // End Line: 591 /* begin block 3 */ // Start line: 594 /* end block 3 */ // End Line: 595 /* WARNING: Type propagation algorithm not settling */ void VisibilityLists(VisType type, int i) { UNIMPLEMENTED(); /* undefined2 uVar1; ushort uVar2; int iVar3; uint uVar4; int iVar5; int *piVar6; ushort *puVar7; _EVENT *p_Var8; int iVar9; undefined *puVar10; FixedEvent *pFVar11; ushort *puVar12; ushort uVar13; int iVar14; int iVar15; undefined4 *puVar16; int zDir; int iVar17; undefined *puVar18; undefined **ppuVar19; int iVar20; undefined local_22c[4]; int local_228[128]; debugCount = &count_10; if (type == VIS_SORT) { zDir = 0; do { if (0 < count_10) { ppuVar19 = &PTR_xList_6_000aa4c0 + zDir; puVar18 = &stack0xfffffdd0 + 8; iVar17 = 0; do { iVar5 = GetVisValue((uint)*(ushort *)(*ppuVar19 + iVar17 * 2), zDir); iVar9 = iVar17 * 4; iVar20 = iVar17 + 1; *(int *)(puVar18 + iVar17 * 4) = iVar5; if ((iVar17 != 0) && (iVar5 < *(int *)(puVar18 + (iVar17 + -1) * 4))) { uVar1 = *(undefined2 *)(*ppuVar19 + iVar17 * 2); if (0 < iVar17) { puVar16 = (undefined4 *)(puVar18 + iVar17 * 4); iVar14 = iVar9 + -8; iVar15 = iVar17; iVar3 = iVar17 + -1; do { iVar17 = iVar3; iVar9 = iVar9 + -4; puVar10 = (&PTR_xList_6_000aa4c0)[zDir]; *puVar16 = *(undefined4 *)(puVar18 + iVar9); puVar16 = puVar16 + -1; *(undefined2 *)(puVar10 + iVar15 * 2) = *(undefined2 *)(puVar10 + iVar15 * 2 + -1); if (iVar17 < 1) break; piVar6 = (int *)(puVar18 + iVar14); iVar14 = iVar14 + -4; iVar15 = iVar17; iVar3 = iVar17 + -1; } while (iVar5 < *piVar6); } *(int *)(puVar18 + iVar17 * 4) = iVar5; *(undefined2 *)(*ppuVar19 + iVar17 * 2) = uVar1; } iVar17 = iVar20; } while (iVar20 < count_10); } zDir = zDir + 1; } while (zDir < 2); uVar4 = (uint)NumPlayers; zDir = 0; if (NumPlayers != 0) { do { uVar13 = 0x8000; if (zDir != 0) { uVar13 = 0x4000; } (&firstX_8)[zDir] = 0xcdc50; do { puVar7 = (ushort *)(&firstX_8)[zDir]; uVar2 = *puVar7; *(ushort **)(&firstX_8 + zDir) = puVar7 + 1; } while ((uVar2 & uVar13) == 0); (&firstZ_9)[zDir] = 0xcdd50; do { puVar7 = (ushort *)(&firstZ_9)[zDir]; uVar2 = *puVar7; *(ushort **)(&firstZ_9 + zDir) = puVar7 + 1; } while ((uVar2 & uVar13) == 0); zDir = zDir + 1; } while (zDir < (int)uVar4); } } else { if (type < VIS_ADD) { if (type == VIS_INIT) { zList_7 = 0xa000; xList_6 = 0xa000; DAT_000cdd52 = 0x9000; DAT_000cdc52 = 0x9000; count_10 = 2; if (NumPlayers == 2) { DAT_000cdd54 = 0x6000; DAT_000cdc54 = 0x6000; DAT_000cdd56 = 0x5000; DAT_000cdc56 = 0x5000; count_10 = 4; } uVar4 = (uint)NumPlayers; zDir = 0; if (NumPlayers != 0) { do { iVar17 = zDir + 1; (&firstX_8)[zDir] = 0xcdc50; (&firstZ_9)[zDir] = 0xcdd50; zDir = iVar17; } while (iVar17 < (int)uVar4); } } } else { if (type == VIS_ADD) { if ((i & 0x80U) == 0) { zDir = (i & 0x7fU) * 0x28; pFVar11 = (FixedEvent *)event; } else { zDir = (i & 0x7fU) * 0x2c; pFVar11 = fixedEvent; } uVar13 = (ushort)i; if (*(short *)((int)&pFVar11->radius + zDir) == 0) { puVar7 = &xList_6 + count_10; puVar12 = &zList_7 + count_10; count_10 = count_10 + 1; *puVar7 = uVar13; *puVar12 = uVar13; } else { (&xList_6)[count_10] = uVar13 | 0x2000; zDir = count_10 + 1; (&zList_7)[count_10] = uVar13 | 0x2000; count_10 = count_10 + 2; (&xList_6)[zDir] = uVar13 | 0x1000; (&zList_7)[zDir] = uVar13 | 0x1000; } } else { if (type == VIS_NEXT) { p_Var8 = firstEvent; if (firstEvent != (_EVENT *)0x0) { do { p_Var8->flags = p_Var8->flags & 0xfffb; p_Var8 = p_Var8->next; } while (p_Var8 != (_EVENT *)0x0); } xVis = (ushort *)(&firstX_8)[i]; zVis = (ushort *)(&firstZ_9)[i]; } } } } return; */ } // decompiled code // original method signature: // void /*$ra*/ SetElTrainRotation(struct _EVENT *ev /*$a1*/) // line 402, offset 0x0004be5c /* begin block 1 */ // Start line: 804 /* end block 1 */ // End Line: 805 void SetElTrainRotation(_EVENT *ev) { UNIMPLEMENTED(); /* if (((int)ev->flags & 0x8000U) == 0) { ev->rotation = 0; } else { ev->rotation = 0x400; } if (*ev->node < ev->node[2]) { ev->rotation = ev->rotation + 0x800; } return; */ } // decompiled code // original method signature: // void /*$ra*/ InitTrain(struct _EVENT *ev /*$s0*/, int count /*$s3*/, int type /*$a2*/) // line 422, offset 0x000460ec /* begin block 1 */ // Start line: 423 // Start offset: 0x000460EC // Variables: // int height; // $s2 // int length; // $s1 // int *to; // $a0 /* end block 1 */ // End offset: 0x00046258 // End Line: 469 /* begin block 2 */ // Start line: 918 /* end block 2 */ // End Line: 919 /* begin block 3 */ // Start line: 941 /* end block 3 */ // End Line: 942 void InitTrain(_EVENT *ev, int count, int type) { UNIMPLEMENTED(); /* ushort uVar1; int *piVar2; uint uVar3; int *piVar4; int unaff_s1; long unaff_s2; uVar1 = *(ushort *)(ev->data + 2); ev->node = ev->data + 3; ev->timer = 0; ev->flags = uVar1 | 2; if (type == 0) { unaff_s2 = -0x6ed; unaff_s1 = 0x640; SetElTrainRotation(ev); } else { if (type == 1) { unaff_s2 = -0x2de; unaff_s1 = 0xe74; ev->rotation = 0; } } piVar2 = ev->node; (ev->position).vy = unaff_s2; if (piVar2[3] == -0x80000000) { uVar1 = ev->flags & 0x8fff; } else { uVar1 = ev->flags & 0x8fffU | 0x3000; } ev->flags = uVar1; piVar4 = ev->node; piVar2 = piVar4 + 2; if (piVar4[2] == -0x7ffffffe) { piVar2 = piVar4 + 3; } if (((int)ev->flags & 0x8000U) == 0) { uVar3 = *piVar2 - *piVar4 >> 0x1f; (ev->position).vx = *piVar4 + ((count * unaff_s1 ^ uVar3) - uVar3); (ev->position).vz = piVar4[1]; } else { uVar3 = *piVar2 - *piVar4 >> 0x1f; (ev->position).vz = *piVar4 + ((count * unaff_s1 ^ uVar3) - uVar3); (ev->position).vx = piVar4[1]; } return; */ } // decompiled code // original method signature: // void /*$ra*/ InitDoor(struct FixedEvent *ev /*$a0*/, struct _EVENT ***e /*$a1*/, int *cEvents /*$a2*/) // line 471, offset 0x0004beb8 /* begin block 1 */ // Start line: 8350 /* end block 1 */ // End Line: 8351 /* begin block 2 */ // Start line: 8352 /* end block 2 */ // End Line: 8353 void InitDoor(FixedEvent *ev, _EVENT ***e, int *cEvents) { UNIMPLEMENTED(); /* ev->active = 0; ev->rotation = ev->finalRotation; ev->flags = ev->flags | 0x200; *(FixedEvent **)*e = ev; *e = &(**e)->next; VisibilityLists(VIS_ADD, (int)((int)ev - (int)fixedEvent) * -0x45d1745d >> 2 | 0x80); return;*/ } // decompiled code // original method signature: // void /*$ra*/ InitEvents() // line 483, offset 0x0004bbd4 /* begin block 1 */ // Start line: 5662 /* end block 1 */ // End Line: 5663 /* begin block 2 */ // Start line: 966 /* end block 2 */ // End Line: 967 /* begin block 3 */ // Start line: 5689 /* end block 3 */ // End Line: 5690 /* WARNING: Unknown calling convention yet parameter storage is locked */ void InitEvents(void) { UNIMPLEMENTED(); /* events.camera = 0; events.track = &trackingEvent2; cameraEventsActive = 0; trackingEvent2 = (_EVENT *)0x0; event_models_active = 0; events.cameraEvent = (_EVENT *)0x0; cameraDelay.delay = 0; detonator.timer = 0; detonator.count = 0; eventHaze = 0; carsOnBoat = 0; doneFirstHavanaCameraHack = 0; boatOffset.vx = 0; boatOffset.vy = 0; boatOffset.vz = 0; carEvent8[0] = (_TARGET *)0x0; VisibilityLists(VIS_INIT, 0); TriggerEvent(-1); return; */ } // decompiled code // original method signature: // void /*$ra*/ SetUpEvents(int full /*stack 0*/) // line 515, offset 0x00046258 /* begin block 1 */ // Start line: 516 // Start offset: 0x00046258 // Variables: // int count; // $s5 // int *p; // $s2 // int cEvents; // stack offset -52 // struct _EVENT **e; // stack offset -56 /* begin block 1.1 */ // Start line: 540 // Start offset: 0x00046310 // Variables: // int ElTrackModel; // stack offset -48 // int carModel; // stack offset -44 // int direction; // $fp // int i; // $s3 /* begin block 1.1.1 */ // Start line: 551 // Start offset: 0x00046334 // Variables: // int cBridges; // $s1 // int timeOffset; // $a2 // int loop; // $a3 /* end block 1.1.1 */ // End offset: 0x00046548 // End Line: 606 /* begin block 1.1.2 */ // Start line: 625 // Start offset: 0x00046628 // Variables: // int cCarriages; // $s0 // int first; // $s1 /* begin block 1.1.2.1 */ // Start line: 634 // Start offset: 0x00046630 /* end block 1.1.2.1 */ // End offset: 0x00046644 // End Line: 635 /* end block 1.1.2 */ // End offset: 0x0004675C // End Line: 664 /* end block 1.1 */ // End offset: 0x000468C8 // End Line: 703 /* begin block 1.2 */ // Start line: 758 // Start offset: 0x00046AA4 // Variables: // int trainModel; // $s5 // int loop; // $s1 // int carriages; // $s2 /* begin block 1.2.1 */ // Start line: 811 // Start offset: 0x00046C34 // Variables: // int loop; // $t1 /* begin block 1.2.1.1 */ // Start line: 824 // Start offset: 0x00046DD8 // Variables: // int detonatorModel; // $v0 /* end block 1.2.1.1 */ // End offset: 0x00046E30 // End Line: 829 /* end block 1.2.1 */ // End offset: 0x00046E30 // End Line: 830 /* end block 1.2 */ // End offset: 0x00046E38 // End Line: 834 /* begin block 1.3 */ // Start line: 838 // Start offset: 0x00046E38 // Variables: // int detonatorModel; // $s3 // int loop; // $s1 /* begin block 1.3.1 */ // Start line: 882 // Start offset: 0x00046F84 // Variables: // int loop; // $s1 /* begin block 1.3.1.1 */ // Start line: 888 // Start offset: 0x00047094 // Variables: // struct XYPAIR offset; // stack offset -64 /* end block 1.3.1.1 */ // End offset: 0x000471A0 // End Line: 896 /* end block 1.3.1 */ // End offset: 0x00047218 // End Line: 904 /* begin block 1.3.2 */ // Start line: 909 // Start offset: 0x0004724C /* end block 1.3.2 */ // End offset: 0x000474BC // End Line: 946 /* end block 1.3 */ // End offset: 0x000474BC // End Line: 948 /* end block 1 */ // End offset: 0x00047538 // End Line: 964 /* begin block 2 */ // Start line: 1090 /* end block 2 */ // End Line: 1091 /* begin block 3 */ // Start line: 1137 /* end block 3 */ // End Line: 1138 /* begin block 4 */ // Start line: 1143 /* end block 4 */ // End Line: 1144 void SetUpEvents(int full) { UNIMPLEMENTED(); /* bool bVar1; short sVar2; long lVar3; int iVar4; int i; FixedEvent *ev; _EVENT *ev_00; int iVar5; int *piVar6; _EVENT *p_Var7; int count; int *piVar8; int unaff_s3; uint uVar9; uint uVar10; int unaff_s5; FixedEvent **local_38; uint local_34; int local_30; int local_2c; i = LiftingBridges; firstEvent = (_EVENT *)0x0; local_38 = &firstEvent; if (doSpooling == 0) { firstEvent = (_EVENT *)0x0; EventCop = (CELL_OBJECT *)0x0; return; } if (full != 0) { EventCop = (CELL_OBJECT *)mallocptr; event = (_EVENT *)(mallocptr + 0x100); mallocptr = (char *)event; } ev_00 = event; local_34 = 0; if (GameLevel == 1) { event->radius = 0; i = INT_0009e888; cameraEventsActive = 1; (ev_00->position).vy = 0x6f; (ev_00->position).vx = i; i = INT_ARRAY_0009e88c[0]; ev_00->rotation = 0xc00; ev_00->flags = -0x77ad; ev_00->timer = -1; ev_00->node = INT_ARRAY_0009e88c; ev_00->data = HavanaFerryData; (ev_00->position).vz = i; VisibilityLists(VIS_ADD, 0); MakeEventTrackable(event); *local_38 = event; fixedEvent = &havanaFixed; local_38 = &((FixedEvent *)*local_38)->next; InitDoor(&havanaFixed, (_EVENT ***)&local_38, (int *)&local_34); InitDoor(&FixedEvent_0009e9e8, (_EVENT ***)&local_38, (int *)&local_34); *(FixedEvent **)local_38 = &FixedEvent_0009e9bc; local_38 = &((FixedEvent *)*local_38)->next; VisibilityLists(VIS_ADD, 0x81); ev_00 = event; event[1].position.vy = 0xf9b; ev_00[1].flags = 0x4212; ev_00[1].node = INT_ARRAY_0009e8c8; ev_00[1].position.vx = -0x6f1ff; ev_00[1].position.vz = -0x1e9ff; ev_00[1].rotation = 0; ev_00[1].timer = -1; ev_00[1].radius = 0; ev_00[1].data = &HavanaMiniData; VisibilityLists(VIS_ADD, 1); *(FixedEvent **)local_38 = (FixedEvent *)(event + 1); local_38 = &((FixedEvent *)*local_38)->next; local_34 = 2; if (full != 0) { i = FindModelIdxWithName(s_FERRY_000aa4e0); event->model = i; i = FindModelIdxWithName(&DAT_000aa4e8); event[1].model = i; FixedEvent_0009e9bc.model = FindModelIdxWithName(FixedEvent_0009e9bc.modelName); FixedEvent_0009e9e8.model = FindModelIdxWithName(FixedEvent_0009e9e8.modelName); havanaFixed.model = FindModelIdxWithName(havanaFixed.modelName); foam.model = FindModelPtrWithName(&DAT_000aa4f0); } } else { if (GameLevel < 2) { if (GameLevel == 0) { bVar1 = false; piVar8 = &INT_0009ec2c; uVar9 = 0; if (0 < LiftingBridges) { do { cameraEventsActive = 1; if (*piVar8 == 0x8000) { bVar1 = true; piVar8 = piVar8 + 1; } else { if (*piVar8 == 0x100) { piVar8 = piVar8 + 1; firstMissionEvent = event + local_34; } } ev_00 = event + local_34; ev_00->data = piVar8; ev_00[1].data = piVar8 + 2; if (bVar1) { (ev_00->position).vz = (*piVar8 + piVar8[1]) / 2; ev_00[1].position.vz = (piVar8[1] + piVar8[2]) / 2; } else { (ev_00->position).vx = (*piVar8 + piVar8[1]) / 2; ev_00[1].position.vx = (piVar8[1] + piVar8[2]) / 2; } count = piVar8[3]; piVar8 = piVar8 + 4; lVar3 = Random2(0); iVar5 = 0; iVar4 = (lVar3 >> (uVar9 & 0x1f) & 0xffU) * 0x20; uVar10 = uVar9 + 1; ev_00 = event + local_34; do { if (bVar1) { ev_00->flags = 1; (ev_00->position).vx = *piVar8; } else { ev_00->flags = 0x21; (ev_00->position).vz = *piVar8; } ev_00->node = piVar8; ev_00->radius = 0x1000; ev_00->timer = (short)iVar4 + (short)(iVar4 / 8000) * -8000; ev_00->model = uVar9 * 2 + iVar5; iVar5 = iVar5 + 1; ev_00 = ev_00 + 1; } while (iVar5 < 2); while (count = count + -1, count != -1) { piVar8 = piVar8 + 1; VisibilityLists(VIS_ADD, local_34 | count * 0x100); VisibilityLists(VIS_ADD, local_34 + 1 | count * 0x100); } *(FixedEvent **)local_38 = (FixedEvent *)(event + local_34); ev = (FixedEvent *)*local_38; ev->next = event + local_34 + 1; local_34 = local_34 + 2; local_38 = &ev->next->next; uVar9 = uVar10; } while ((int)uVar10 < i); } if (full != 0) { local_30 = FindModelIdxWithName(s_ELTRAIN_000aa4c8); } i = ElTrainData; piVar8 = &INT_0009e70c; uVar9 = 0; missionTrain.engine = event + local_34; MissionTrain_0009e8f0.engine = missionTrain.engine; if (0 < ElTrainData) { do { count = 5; if (uVar9 != 0) { lVar3 = Random2(0); count = (lVar3 >> (uVar9 & 0x1f) & 3U) + 2; } bVar1 = true; uVar9 = uVar9 + 1; while (count = count + -1, count != -1) { ev_00 = event + local_34; ev_00->radius = 0; ev_00->data = piVar8; InitTrain(ev_00, count, 0); if (bVar1) { bVar1 = false; event[local_34].flags = event[local_34].flags | 0x400; } if (full != 0) { event[local_34].model = local_30; } *(FixedEvent **)local_38 = (FixedEvent *)(event + local_34); local_38 = &((FixedEvent *)*local_38)->next; VisibilityLists(VIS_ADD, local_34); local_34 = local_34 + 1; } count = *piVar8; while (1 < count + 0x80000000U) { count = piVar8[1]; piVar8 = piVar8 + 1; } piVar8 = piVar8 + 1; } while ((int)uVar9 < i); } fixedEvent = &chicagoDoor; InitDoor(&chicagoDoor, (_EVENT ***)&local_38, (int *)&local_34); InitDoor(&FixedEvent_0009e938, (_EVENT ***)&local_38, (int *)&local_34); *(FixedEvent **)local_38 = &FixedEvent_0009e964; local_38 = &((FixedEvent *)*local_38)->next; VisibilityLists(VIS_ADD, 0x82); if (full != 0) { FixedEvent_0009e964._20_4_ = FindModelIdxWithName((char *)&PTR_DAT_000aa4d0); FixedEvent_0009e964._24_4_ = FindModelIdxWithName((char *)&PTR_DAT_000aa4d4); FixedEvent_0009e964.model = FindModelIdxWithName(s_FRAME_000aa470); chicagoDoor.model = FindModelIdxWithName(chicagoDoor.modelName); FixedEvent_0009e938.model = FindModelIdxWithName(FixedEvent_0009e938.modelName); local_2c = FindModelIdxWithName(s_LORRY_000aa4d8); } count = 0x28; iVar4 = 6; multiCar.count = 0; multiCar.event = event + local_34; i = 0; do { *(undefined2 *)((int)&(multiCar.event)->flags + i) = 0x680; if (full != 0) { *(int *)((int)&(multiCar.event)->model + i) = local_2c; } *(undefined2 *)((int)&(multiCar.event)->radius + i) = 0; iVar4 = iVar4 + -1; iVar5 = (int)&((multiCar.event)->position).vx + count; count = count + 0x28; *(int *)((int)&(multiCar.event)->next + i) = iVar5; i = i + 0x28; } while (-1 < iVar4); local_34 = local_34 + 7; } } else { if (GameLevel == 2) { if (full != 0) { unaff_s5 = FindModelIdxWithName(s_TRAIN_000aa4f8); } uVar9 = 2; if (gCurrentMissionNumber == 0x16) { uVar9 = 9; } i = 0; if (uVar9 != 0) { piVar8 = INT_ARRAY_0009e874; count = 0; do { piVar6 = (int *)((int)&(event->position).vx + count); *(undefined2 *)((int)piVar6 + 0x1e) = 4000; if (i < 2) { *(undefined2 *)(piVar6 + 7) = 0x302; *piVar6 = VegasParkedTrains; iVar4 = *piVar8; *(undefined2 *)((int)piVar6 + 0x12) = 2; piVar6[2] = iVar4; VisibilityLists(VIS_ADD, i); } iVar4 = (int)&(event->position).vx + count; *(undefined4 *)(iVar4 + 4) = 0xfffffd22; *(undefined2 *)(iVar4 + 0x10) = 0; if (full != 0) { *(int *)(iVar4 + 0x20) = unaff_s5; } piVar8 = piVar8 + 1; i = i + 1; *(FixedEvent **)local_38 = (FixedEvent *)((int)&(event->position).vx + count); count = count + 0x28; local_38 = &((FixedEvent *)*local_38)->next; } while (i < (int)uVar9); } ev_00 = event; ev = &vegasDoor; i = 4; event[1].next = (_EVENT *)0x0; ev_00[uVar9 - 1].next = (_EVENT *)0x0; fixedEvent = &vegasDoor; local_34 = uVar9; do { InitDoor(ev, (_EVENT ***)&local_38, (int *)&local_34); i = i + -1; ev = ev + 1; } while (-1 < i); if (full != 0) { piVar8 = &vegasDoor.model; i = 4; do { i = i + -1; count = FindModelIdxWithName((char *)piVar8[2]); *piVar8 = count; piVar8 = piVar8 + 0xb; } while (-1 < i); } ev_00 = event; if (gCurrentMissionNumber != 0x1e) goto LAB_000474bc; event[local_34].position.vx = -0x2ffb; ev_00[local_34].position.vy = -0x113; i = 0; ev_00[local_34].position.vz = 0xcd61b; ev_00[local_34 + 1].position.vx = -0x34aa; ev_00[local_34 + 1].position.vy = -0xfa; ev_00[local_34 + 1].position.vz = 0xcd5e0; ev_00[local_34 + 2].position.vx = -0x382c; ev_00[local_34 + 2].position.vy = -0x114; ev_00[local_34 + 2].position.vz = 0xcd383; do { if (i == 2) { ev_00[local_34 + i].rotation = 0; } else { ev_00[local_34 + i].rotation = 0x800; } ev_00[local_34 + i].flags = 0x400; count = local_34 + i; i = i + 1; ev_00[count].radius = 0; } while (i < 3); if (full != 0) { i = FindModelIdxWithName(s_DETONATOR_00010978); ev_00 = event; event[local_34].model = i; ev_00[local_34 + 1].model = i; ev_00[local_34 + 2].model = i; } } else { if (GameLevel != 3) goto LAB_000474bc; event->radius = 0; if (full != 0) { i = FindModelIdxWithName(s_BOAT01_000aa500); event->model = i; } ev_00 = event; i = INT_0009e8b8; cameraEventsActive = 1; (event->position).vy = 0x100; (ev_00->position).vx = i; i = INT_ARRAY_0009e8bc[0]; ev_00->flags = -0x77ad; ev_00->rotation = 0; ev_00->timer = -1; ev_00->node = INT_ARRAY_0009e8bc; ev_00->data = RioFerryData; (ev_00->position).vz = i; VisibilityLists(VIS_ADD, 0); i = 5; MakeEventTrackable(event); *local_38 = event; ev = &rioDoor; local_34 = 1; fixedEvent = &rioDoor; local_38 = &((FixedEvent *)*local_38)->next; do { InitDoor(ev, (_EVENT ***)&local_38, (int *)&local_34); i = i + -1; ev = ev + 1; } while (-1 < i); if (full != 0) { piVar8 = &rioDoor.model; i = 5; do { i = i + -1; count = FindModelIdxWithName((char *)piVar8[2]); *piVar8 = count; piVar8 = piVar8 + 0xb; } while (-1 < i); foam.model = FindModelPtrWithName(&DAT_000aa4f0); unaff_s3 = FindModelIdxWithName(s_DETONATOR_00010978); } ev_00 = event; if (gCurrentMissionNumber != 0x23) { if (gCurrentMissionNumber - 0x27U < 2) { bVar1 = gCurrentMissionNumber == 0x27; event[local_34].flags = 0xc0; if (bVar1) { ev_00[local_34].position.vx = 0xfec7; ev_00[local_34].position.vy = -0x306; ev_00[local_34].position.vz = -0x7ead2; ev_00[local_34].rotation = 0xa40; ev_00[local_34].timer = -1; HelicopterData.pitch = 0; HelicopterData.roll = 0; } else { ev_00[local_34].position.vy = -1000; ev_00[local_34].rotation = -1; ev_00[local_34].timer = 0; ev_00[local_34].flags = ev_00[local_34].flags | 0x100; } lVar3 = Random2(0); ev_00 = event; HelicopterData.rotorrot = (ushort)lVar3 & 0xff; HelicopterData.rotorvel = 1; *(_TARGET **)&event[local_34].node = MissionTargets + 4; ev_00[local_34].radius = 0; if (full != 0) { HelicopterData.cleanModel = FindModelIdxWithName(s_CHOPPERCLEAN_00010984); HelicopterData.deadModel = FindModelIdxWithName(s_CHOPPERDAM_00010994); GetTextureDetails(s_ROTOR_000aa508, &HelicopterData.rotorTexture); } event[local_34].model = HelicopterData.cleanModel; VisibilityLists(VIS_ADD, local_34); MakeEventTrackable(event + local_34); *(FixedEvent **)local_38 = (FixedEvent *)(event + local_34); local_34 = local_34 + 1; local_38 = &((FixedEvent *)*local_38)->next; } goto LAB_000474bc; } event[local_34].position.vx = 0x31330; ev_00[local_34].position.vy = -0xb1; ev_00[local_34].position.vz = 0x5e0e0; ev_00[local_34 + 1].position.vx = 0x312b0; ev_00[local_34 + 1].position.vy = -0xb1; ev_00[local_34 + 1].position.vz = 0x5f050; ev_00[local_34 + 2].position.vx = 0x30ad0; ev_00[local_34 + 2].position.vy = -0xb1; i = 0; ev_00[local_34 + 2].position.vz = 0x5f050; do { if (i == 2) { sVar2 = 0xc00; } else { sVar2 = 0x400; } event[local_34 + i].rotation = sVar2; ev_00 = event; event[local_34 + i].flags = 0x80; ev_00[local_34 + i].radius = 0; ev_00[local_34 + i].data = ev_00->data + 1; p_Var7 = ev_00 + local_34 + i; iVar4 = (ev_00->position).vz - (p_Var7->position).vz; count = (ev_00->position).vy - (p_Var7->position).vy; piVar8 = (int *)SquareRoot0(iVar4 * iVar4 + count * count); if (iVar4 < 0) { piVar8 = (int *)-(int)piVar8; } p_Var7->node = piVar8; ev_00 = event; i = i + 1; } while (i < 3); if (full != 0) { event[local_34].model = unaff_s3; ev_00[local_34 + 1].model = unaff_s3; ev_00[local_34 + 2].model = unaff_s3; } } firstMissionEvent = event + local_34; local_34 = local_34 + 3; } } LAB_000474bc: *(FixedEvent **)local_38 = (FixedEvent *)0x0; if (full != 0) { mallocptr = mallocptr + local_34 * 0x28; } return; */ } // decompiled code // original method signature: // void /*$ra*/ InitEventCamera() // line 974, offset 0x0004bf54 /* begin block 1 */ // Start line: 9359 /* end block 1 */ // End Line: 9360 /* begin block 2 */ // Start line: 9360 /* end block 2 */ // End Line: 9361 /* WARNING: Unknown calling convention yet parameter storage is locked */ void InitEventCamera(void) { UNIMPLEMENTED(); /* eventCamera.position.vx = camera_position.vx; eventCamera.position.vy = camera_position.vy; eventCamera.position.vz = camera_position.vz; eventCamera.position.pad = camera_position.pad; eventCamera.yAng = camera_angle.vy; eventCamera.matrix.m[0]._0_4_ = inv_camera_matrix.m[0]._0_4_; eventCamera.matrix.m._4_4_ = inv_camera_matrix.m._4_4_; eventCamera.matrix.m[1]._2_4_ = inv_camera_matrix.m[1]._2_4_; eventCamera.matrix.m[2]._0_4_ = inv_camera_matrix.m[2]._0_4_; eventCamera.matrix._16_4_ = inv_camera_matrix._16_4_; eventCamera.matrix.t[0] = inv_camera_matrix.t[0]; eventCamera.matrix.t[1] = inv_camera_matrix.t[1]; eventCamera.matrix.t[2] = inv_camera_matrix.t[2]; eventCamera.rotate = 1; events.camera = 1; return; */ } // decompiled code // original method signature: // void /*$ra*/ ResetEventCamera() // line 983, offset 0x0004c014 /* begin block 1 */ // Start line: 9387 /* end block 1 */ // End Line: 9388 /* begin block 2 */ // Start line: 9391 /* end block 2 */ // End Line: 9392 /* begin block 3 */ // Start line: 9395 /* end block 3 */ // End Line: 9396 /* WARNING: Unknown calling convention yet parameter storage is locked */ void ResetEventCamera(void) { UNIMPLEMENTED(); /* camera_position.vx = eventCamera.position.vx; camera_position.vy = eventCamera.position.vy; camera_position.vz = eventCamera.position.vz; camera_position.pad = eventCamera.position.pad; camera_angle.vy = eventCamera.yAng; inv_camera_matrix.m[0]._0_4_ = eventCamera.matrix.m[0]._0_4_; inv_camera_matrix.m._4_4_ = eventCamera.matrix.m._4_4_; inv_camera_matrix.m[1]._2_4_ = eventCamera.matrix.m[1]._2_4_; inv_camera_matrix.m[2]._0_4_ = eventCamera.matrix.m[2]._0_4_; inv_camera_matrix._16_4_ = eventCamera.matrix._16_4_; inv_camera_matrix.t[0] = eventCamera.matrix.t[0]; inv_camera_matrix.t[1] = eventCamera.matrix.t[1]; inv_camera_matrix.t[2] = eventCamera.matrix.t[2]; events.camera = 0; return;*/ } // decompiled code // original method signature: // void /*$ra*/ SetCamera(struct _EVENT *ev /*$s5*/) // line 991, offset 0x00047538 /* begin block 1 */ // Start line: 992 // Start offset: 0x00047538 // Variables: // int rotation; // $s4 // int axis; // $a3 // struct VECTOR pivot; // stack offset -96 // int iPivot; // $a2 // int height; // $a1 // struct SVECTOR offset; // stack offset -80 /* begin block 1.1 */ // Start line: 1037 // Start offset: 0x00047688 // Variables: // struct MATRIX matrix; // stack offset -72 // struct SVECTOR temp; // stack offset -40 /* begin block 1.1.1 */ // Start line: 1045 // Start offset: 0x0004770C /* end block 1.1.1 */ // End offset: 0x0004775C // End Line: 1055 /* end block 1.1 */ // End offset: 0x0004775C // End Line: 1057 /* end block 1 */ // End offset: 0x000479DC // End Line: 1104 /* begin block 2 */ // Start line: 2631 /* end block 2 */ // End Line: 2632 /* begin block 3 */ // Start line: 2659 /* end block 3 */ // End Line: 2660 /* WARNING: Could not reconcile some variable overlaps */ void SetCamera(_EVENT *ev) { UNIMPLEMENTED(); /* undefined4 in_zero; CAR_POLY *in_at; ushort uVar1; short ang; undefined4 uVar2; long lVar3; ushort uVar4; int iVar5; long local_60; short local_5c; long local_58; undefined4 local_50; undefined4 local_4c; undefined4 local_48; undefined4 local_44; undefined4 local_40; undefined4 local_3c; undefined4 local_38; long local_34; long local_30; long local_2c; undefined4 local_28; undefined4 local_24; memset(&local_50, 0, 8); if (eventCamera.rotate != 0) { inv_camera_matrix.m[0]._0_4_ = eventCamera.matrix.m[0]._0_4_; inv_camera_matrix.m._4_4_ = eventCamera.matrix.m._4_4_; inv_camera_matrix.m[1]._2_4_ = eventCamera.matrix.m[1]._2_4_; inv_camera_matrix.m[2]._0_4_ = eventCamera.matrix.m[2]._0_4_; inv_camera_matrix._16_4_ = eventCamera.matrix._16_4_; inv_camera_matrix.t[0] = eventCamera.matrix.t[0]; inv_camera_matrix.t[1] = eventCamera.matrix.t[1]; inv_camera_matrix.t[2] = eventCamera.matrix.t[2]; } uVar2 = 0; if ((ev->flags & 0x800U) == 0) { uVar4 = ev->flags & 0x30; iVar5 = (int)ev->rotation; lVar3 = *ev->data; } else { lVar3 = (ev->position).vz; iVar5 = ev->data[1]; local_50 = boatOffset._0_4_; local_4c = boatOffset._4_4_; uVar2 = 0x100; if (GameLevel == 1) { uVar2 = 0x6f; } uVar4 = 0; } if (uVar4 == 0) { iVar5 = -iVar5; local_60 = camera_position.vx; local_58 = lVar3; } else { local_58 = camera_position.vz; local_60 = lVar3; } if (iVar5 == 0) { camera_position.vx = eventCamera.position.vx + (short)local_50; camera_angle.vy = eventCamera.yAng; camera_position.vy = eventCamera.position.vy + local_50._2_2_; camera_position.vz = eventCamera.position.vz + (short)local_4c; } else { camera_position.vx = eventCamera.position.vx; camera_position.vx._0_2_ = (short)eventCamera.position.vx; camera_position.vy = eventCamera.position.vy; camera_position.vy._0_2_ = (short)eventCamera.position.vy; camera_position.vz = eventCamera.position.vz; camera_position.vz._0_2_ = (short)eventCamera.position.vz; camera_position.pad = eventCamera.position.pad; local_48 = 0x1000; local_3c = 0; local_44 = 0; local_40 = 0x1000; local_38 = CONCAT22(local_38._2_2_, 0x1000); ang = (short)iVar5; if (uVar4 == 0x10) { camera_angle.vy = camera_angle.vy - ang; in_at = CAR_POLY_ARRAY_000b0000; _RotMatrixY((MATRIX *)&local_48, ang); } else { if (uVar4 < 0x11) { if (uVar4 == 0) { _RotMatrixX((MATRIX *)&local_48, ang); } } else { if (uVar4 == 0x20) { _RotMatrixZ((MATRIX *)&local_48, ang); } } } local_5c = (short)uVar2; local_28 = CONCAT22((short)camera_position.vy - local_5c, (short)camera_position.vx - (short)local_60); local_24 = CONCAT22(local_24._2_2_, (short)camera_position.vz - (short)local_58); setCopControlWord(2, 0, local_48); setCopControlWord(2, 0x800, local_44); setCopControlWord(2, 0x1000, local_40); setCopControlWord(2, 0x1800, local_3c); setCopControlWord(2, 0x2000, local_38); setCopControlWord(2, 0x2800, local_60); setCopControlWord(2, 0x3000, uVar2); setCopControlWord(2, 0x3800, local_58); setCopReg(2, in_zero, local_28); setCopReg(2, in_at, local_24); copFunction(2, 0x480012); camera_position.vx = getCopReg(2, 0x19); camera_position.vy = getCopReg(2, 0x1a); camera_position.vz = getCopReg(2, 0x1b); uVar1 = local_44._2_2_ ^ local_48._2_2_ ^ local_44._2_2_; local_48 = local_48 & 0xffff | (uint)(ushort)(local_48._2_2_ ^ local_44._2_2_ ^ uVar1) << 0x10; uVar4 = (ushort)local_3c ^ (ushort)local_44 ^ (ushort)local_3c; local_44 = CONCAT22(uVar1, (ushort)local_44 ^ (ushort)local_3c ^ uVar4); uVar1 = local_3c._2_2_ ^ local_40._2_2_ ^ local_3c._2_2_; local_3c = CONCAT22(uVar1, uVar4); local_40 = local_40 & 0xffff | (uint)(ushort)(local_40._2_2_ ^ local_3c._2_2_ ^ uVar1) << 0x10; setCopControlWord(2, 0, inv_camera_matrix.m[0]._0_4_); setCopControlWord(2, 0x800, inv_camera_matrix.m._4_4_); setCopControlWord(2, 0x1000, inv_camera_matrix.m[1]._2_4_); setCopControlWord(2, 0x1800, inv_camera_matrix.m[2]._0_4_); setCopControlWord(2, 0x2000, inv_camera_matrix._16_4_); MulRotMatrix(&local_48); inv_camera_matrix.m[0]._0_4_ = local_48; inv_camera_matrix.m._4_4_ = local_44; inv_camera_matrix.m[1]._2_4_ = local_40; inv_camera_matrix.m[2]._0_4_ = local_3c; inv_camera_matrix._16_4_ = local_38; inv_camera_matrix.t[0] = local_34; inv_camera_matrix.t[1] = local_30; inv_camera_matrix.t[2] = local_2c; camera_position.vx = camera_position.vx + (short)local_50; camera_position.vy = camera_position.vy + local_50._2_2_; camera_position.vz = camera_position.vz + (short)local_4c; } SetCameraVector(); if ((iVar5 != 0) || (eventCamera.rotate != 0)) { Set_Inv_CameraMatrix(); SetCameraVector(); SetupDrawMapPSX(); } eventCamera.rotate = iVar5; if ((ev->flags & 0x800U) == 0) { events.draw = ev->model; } else { ev->flags = ev->flags & 0xfffe; events.draw = 0; } return;*/ } // decompiled code // original method signature: // void /*$ra*/ EventCollisions(struct _CAR_DATA *cp /*$a2*/, int type /*$a1*/) // line 1107, offset 0x0004bc50 /* begin block 1 */ // Start line: 1108 // Start offset: 0x0004BC50 // Variables: // static struct SVECTOR offset; // offset 0x18 /* end block 1 */ // End offset: 0x0004BD2C // End Line: 1125 /* begin block 2 */ // Start line: 6981 /* end block 2 */ // End Line: 6982 /* begin block 3 */ // Start line: 6984 /* end block 3 */ // End Line: 6985 void EventCollisions(_CAR_DATA *cp, int type) { UNIMPLEMENTED(); /* if ((carsOnBoat >> ((int)(cp[-0x503].ap.old_clock + 2) * -0x24ca58e9 >> 2 & 0x1fU) & 1U) != 0) { if (type != 0) { (cp->hd).where.t[0] = (cp->hd).where.t[0] - (int)boatOffset.vx; (cp->hd).where.t[1] = (cp->hd).where.t[1] - (int)boatOffset.vy; (cp->hd).where.t[2] = (cp->hd).where.t[2] - (int)boatOffset.vz; events.camera = 0; return; } events.draw = 0; events.camera = 1; (cp->hd).where.t[0] = (cp->hd).where.t[0] + (int)boatOffset.vx; (cp->hd).where.t[1] = (cp->hd).where.t[1] + (int)boatOffset.vy; (cp->hd).where.t[2] = (cp->hd).where.t[2] + (int)boatOffset.vz; } return;*/ } // decompiled code // original method signature: // void /*$ra*/ NextNode(struct _EVENT *ev /*$a0*/) // line 1127, offset 0x0004c0a4 /* begin block 1 */ // Start line: 9546 /* end block 1 */ // End Line: 9547 /* begin block 2 */ // Start line: 9686 /* end block 2 */ // End Line: 9687 /* begin block 3 */ // Start line: 9687 /* end block 3 */ // End Line: 9688 // [D] void NextNode(_EVENT *ev) { UNIMPLEMENTED(); int *piVar1; piVar1 = ev->node; if (piVar1[2] == -0x7ffffffe) { ev->node = piVar1 + 2; } else { ev->node = piVar1 + 1; ev->flags = ev->flags ^ 0x8000; } if (*ev->node == -0x7fffffff) { ev->node = ev->data + 3; } else { if (ev->node[3] == -0x80000000) { ev->flags = ev->flags & 0x8fff; return; } } ev->flags = ev->flags & 0x8fffU | 0x3000; SetElTrainRotation(ev); return; } // decompiled code // original method signature: // void /*$ra*/ StepFromToEvent(struct _EVENT *ev /*$a3*/) // line 1152, offset 0x000479dc /* begin block 1 */ // Start line: 1153 // Start offset: 0x000479DC /* begin block 1.1 */ // Start line: 1160 // Start offset: 0x00047A08 // Variables: // int *from; // $a1 // int *to; // $t4 // long *current; // $t0 // int d; // $a0 // int d2; // $t2 /* end block 1.1 */ // End offset: 0x00047BC4 // End Line: 1208 /* end block 1 */ // End offset: 0x00047BD4 // End Line: 1209 /* begin block 2 */ // Start line: 2962 /* end block 2 */ // End Line: 2963 /* begin block 3 */ // Start line: 3011 /* end block 3 */ // End Line: 3012 void StepFromToEvent(_EVENT *ev) { UNIMPLEMENTED(); /* uint uVar1; uint uVar2; uint uVar3; int iVar4; int iVar5; _EVENT *in_t0; _EVENT *p_Var6; int iVar7; uint uVar8; int *piVar9; if (0 < ev->timer) { ev->timer = ev->timer + -1; return; } if (ev->timer != 0) { return; } uVar2 = (int)ev->flags & 0xc000; piVar9 = ev->node + 1; if (uVar2 == 0x4000) { p_Var6 = (_EVENT *)&(ev->position).vy; } else { if (uVar2 < 0x4001) { p_Var6 = ev; if (uVar2 != 0) { p_Var6 = in_t0; } } else { p_Var6 = in_t0; if (uVar2 == 0x8000) { p_Var6 = (_EVENT *)&(ev->position).vz; } } } iVar7 = (p_Var6->position).vx; iVar5 = *ev->node; iVar4 = *piVar9; uVar3 = iVar7 - iVar5; uVar8 = iVar4 - iVar7; uVar2 = uVar3; if ((int)uVar3 < 0) { uVar2 = -uVar3; } uVar1 = uVar8; if ((int)uVar8 < 0) { uVar1 = -uVar8; } if ((int)uVar1 < (int)uVar2) { uVar3 = uVar8; } uVar2 = iVar4 - iVar5 >> 0x1f; if ((ev->flags & 0xc000U) == 0x4000) { if ((int)uVar3 < 0) { uVar3 = -uVar3; } if (0x400 < (int)uVar3) { uVar3 = *ev->data ^ uVar2; goto LAB_00047b78; } iVar4 = (*ev->data + -1) * (int)rcossin_tbl[(uVar3 & 0xfff) * 2]; } else { if ((int)uVar3 < 0) { uVar3 = -uVar3; } if (0x800 < (int)uVar3) { uVar3 = *ev->data ^ uVar2; goto LAB_00047b78; } iVar4 = (*ev->data + -1) * (int)*(short *)((int)rcossin_tbl + ((uVar3 - ((int)uVar3 >> 0x1f)) * 2 & 0x3ffc)); } if (iVar4 < 0) { iVar4 = iVar4 + 0xfff; } uVar3 = (iVar4 >> 0xc) + 1U ^ uVar2; LAB_00047b78: (p_Var6->position).vx = iVar7 + (uVar3 - uVar2); iVar4 = *piVar9; if ((int)(uVar8 ^ iVar4 - (p_Var6->position).vx) < 0) { (p_Var6->position).vx = iVar4; ev->timer = -1; if (ev == events.cameraEvent) { SpecialCamera(SPECIAL_CAMERA_RESET, 0); } } return; */ } // decompiled code // original method signature: // void /*$ra*/ StepPathEvent(struct _EVENT *ev /*$s0*/) // line 1214, offset 0x00047bd4 /* begin block 1 */ // Start line: 1215 // Start offset: 0x00047BD4 // Variables: // int *from; // $a1 // int *to; // $t1 // long *current; // $t3 // static int speed; // offset 0x20 /* begin block 1.1 */ // Start line: 1225 // Start offset: 0x00047C08 // Variables: // int flags; // $v0 /* end block 1.1 */ // End offset: 0x00047C34 // End Line: 1233 /* begin block 1.2 */ // Start line: 1242 // Start offset: 0x00047C7C // Variables: // enum Station station; // $t2 /* begin block 1.2.1 */ // Start line: 1276 // Start offset: 0x00047D2C // Variables: // int direction; // $t2 // int loop; // $a2 // int *i; // $a0 // int turn[4]; // stack offset -48 // struct XZPAIR centre; // stack offset -32 // struct XZPAIR offset; // stack offset -24 /* end block 1.2.1 */ // End offset: 0x00047F98 // End Line: 1348 /* begin block 1.2.2 */ // Start line: 1355 // Start offset: 0x00047FB0 // Variables: // int d; // $a0 // int d1; // $v1 // int dir; // $t4 /* end block 1.2.2 */ // End offset: 0x000482F8 // End Line: 1447 /* end block 1.2 */ // End offset: 0x000482F8 // End Line: 1448 /* end block 1 */ // End offset: 0x0004830C // End Line: 1449 /* begin block 2 */ // Start line: 3131 /* end block 2 */ // End Line: 3132 /* begin block 3 */ // Start line: 3137 /* end block 3 */ // End Line: 3138 void StepPathEvent(_EVENT *ev) { UNIMPLEMENTED(); /* ushort *puVar1; ushort uVar2; short sVar3; int iVar4; int iVar5; int iVar6; int iVar7; int iVar8; int *piVar9; int *piVar10; uint uVar11; int *piVar12; int iVar13; _EVENT *p_Var14; int iVar15; int local_30[4]; int local_20; int local_1c; int local_18; int local_14; sVar3 = ev->timer; if (ev->timer != 0) { ev->timer = sVar3 + -1; if (sVar3 == 1) { do { NextNode(ev); puVar1 = (ushort *)&ev->flags; ev = ev->next; if (ev == (_EVENT *)0x0) { speed_49 = 0; return; } } while (ev->flags == (*puVar1 & 0xfbff)); } else { if ((ev->flags & 0x100U) != 0) { ev->timer = sVar3; } } speed_49 = 0; return; } uVar2 = ev->flags; if ((speed_49 == 0) && ((uVar2 & 0x400) == 0)) { return; } piVar10 = ev->node; piVar12 = piVar10 + 2; if (*piVar10 == -0x7ffffffe) { iVar13 = 2; piVar9 = piVar10 + 1; } else { iVar13 = 1; piVar9 = piVar10; if (piVar10[2] == -0x7ffffffe) { piVar12 = piVar10 + 3; } else { iVar13 = 0; if (piVar10[-1] == -0x7ffffffe) { piVar9 = piVar10 + -2; } else { if (piVar10[2] == -0x7fffffff) { piVar12 = ev->data + 3; } else { if ((piVar10[1] == -0x7fffffff) && (ev->data + 3 < piVar12)) { piVar12 = ev->data + 4; } } } } } if ((uVar2 & 0x7000) == 0x1000) { iVar13 = -1; if ((uVar2 & 0x8000) == 0) { iVar13 = 1; uVar11 = 0; } else { uVar11 = 3; } if (*piVar10 == -0x7ffffffe) { piVar9 = piVar10 + -2; } if (uVar11 < 4) { piVar10 = local_30 + uVar11; do { if (*piVar9 == -0x7fffffff) { piVar9 = ev->data + 3; } else { if (*piVar9 == -0x7ffffffe) { piVar9 = piVar9 + 2; } } uVar11 = uVar11 + iVar13; iVar4 = *piVar9; piVar9 = piVar9 + 1; *piVar10 = iVar4; piVar10 = piVar10 + iVar13; } while (uVar11 < 4); } local_20 = local_30[2] + -0x800; if (-1 < local_30[0] - local_30[2]) { local_20 = local_30[2] + 0x800; } local_1c = local_30[1] + -0x800; if (-1 < local_30[3] - local_30[1]) { local_1c = local_30[1] + 0x800; } if ((ev->flags & 0x400U) != 0) { speed_49 = *ev->data; } local_18 = ((ev->position).vz - local_1c) * speed_49; if (local_18 < 0) { local_18 = local_18 + 0x7ff; } local_18 = local_18 >> 0xb; local_14 = (local_20 - (ev->position).vx) * speed_49; if (local_14 < 0) { local_14 = local_14 + 0x7ff; } local_14 = local_14 >> 0xb; if (((local_30[2] - local_30[0]) * local_18 + (local_30[3] - local_30[1]) * local_14) * iVar13 < 0) { local_18 = -local_18; local_14 = -local_14; } (ev->position).vx = (ev->position).vx + local_18; (ev->position).vz = (ev->position).vz + local_14; sVar3 = ratan2(local_18, local_14); ev->rotation = sVar3 + 0x400U & 0xfff; if (((int)ev->flags & 0x8000U) == 0) { iVar13 = (ev->position).vz - local_1c; if (local_30[3] - local_30[1] < 0) { if (-1 < iVar13) { return; } } else { if (iVar13 < 1) { return; } } (ev->position).vx = local_30[2]; NextNode(ev); return; } iVar13 = (ev->position).vx - local_20; if (local_30[0] - local_30[2] < 0) { if (-1 < iVar13) { return; } } else { if (iVar13 < 1) { return; } } (ev->position).vz = local_30[1]; NextNode(ev); return; } p_Var14 = ev; if ((uVar2 & 0x8000) != 0) { p_Var14 = (_EVENT *)&(ev->position).vz; } iVar5 = (p_Var14->position).vx; iVar15 = -1; iVar4 = *piVar12 - iVar5; if (-1 < iVar4) { iVar15 = 1; } iVar6 = *piVar9; if (iVar4 < 0) { iVar4 = -iVar4; } iVar8 = iVar5 - iVar6; if (iVar8 < 0) { iVar8 = -iVar8; } if (iVar4 < iVar8) { iVar7 = 2; iVar8 = iVar4; } else { iVar7 = 1; } iVar4 = iVar5 - iVar6; if (iVar13 == iVar7) { iVar13 = 0; } if (iVar8 < 0) { iVar8 = -iVar8; } if (iVar4 < 0) { iVar4 = iVar6 - iVar5; } if (iVar4 <= iVar8) { iVar4 = (p_Var14->position).vx; iVar8 = iVar4 - iVar6; if (iVar8 < 0) { iVar8 = iVar6 - iVar4; } } if ((uVar2 & 0x400) != 0) { if ((uVar2 & 0x80) != 0) { if (CameraCnt < 0x1000) { speed_49 = ev->data[1] * (0x1000 - CameraCnt) + ev->data[2] * CameraCnt; if (speed_49 < 0) { speed_49 = speed_49 + 0xfff; } speed_49 = speed_49 >> 0xc; } else { speed_49 = ev->data[2]; } debugSpeed = speed_49; } speed_49 = ev->data[1]; } if (((iVar8 < 6000) || ((iVar13 == 0 && (iVar8 < 0x1f70)))) && ((ev->flags & 0x400U) != 0)) { if (iVar13 == 0) { if ((ev->flags & 0x7000U) != 0x3000) goto LAB_00048238; iVar4 = (speed_49 - *ev->data) * (int)rcossin_tbl[(((iVar8 + -0x800) * 0x400) / 0x1f70 & 0xfffU) * 2]; uVar11 = iVar8 + -0x800 >> 0x1f; speed_49 = (*ev->data ^ uVar11) - uVar11; if (iVar4 < 0) { iVar4 = iVar4 + 0xfff; } } else { iVar4 = (speed_49 + -5) * (int)rcossin_tbl[((iVar8 << 10) / 6000 & 0xfffU) * 2]; speed_49 = (iVar8 >> 0x1f ^ 5U) - (iVar8 >> 0x1f); if (iVar4 < 0) { iVar4 = iVar4 + 0xfff; } } speed_49 = speed_49 + (iVar4 >> 0xc); } LAB_00048238: iVar4 = (p_Var14->position).vx + speed_49 * iVar15; (p_Var14->position).vx = iVar4; if (iVar13 == 0) { uVar2 = ev->flags; if ((uVar2 & 0x7000) != 0) { if (0x7ff < (*piVar12 - iVar4) * iVar15) { return; } if ((uVar2 & 0x7000) == 0x3000) { ev->flags = uVar2 & 0x8fff | 0x1000; return; } return; } } if ((*piVar12 - iVar4) * iVar15 < 0) { if (iVar13 == 0) { InitTrain(ev, 0, 0); } else { if ((ev->flags & 0x400U) != 0) { ev->timer = 300; } } } return; */ } // decompiled code // original method signature: // int /*$ra*/ GetBridgeRotation(int timer /*$a0*/) // line 1452, offset 0x0004c158 /* begin block 1 */ // Start line: 1453 // Start offset: 0x0004C158 // Variables: // int angle; // $v1 /* end block 1 */ // End offset: 0x0004C208 // End Line: 1476 /* begin block 2 */ // Start line: 10337 /* end block 2 */ // End Line: 10338 /* begin block 3 */ // Start line: 10339 /* end block 3 */ // End Line: 10340 int GetBridgeRotation(int timer) { UNIMPLEMENTED(); return 0; /* int iVar1; if (debugRotation != -1) { return debugRotation; } if (0xa28 < timer) { return 0; } if (timer < 0x641) { if (1000 < timer) { timer = 1000; } } else { timer = 0xa28 - timer; } iVar1 = (0x1000 - (int)rcossin_tbl[((timer << 0xb) / 1000 & 0xfffU) * 2 + 1]) * 800; if (iVar1 < 0) { iVar1 = iVar1 + 0x1fff; } return iVar1 >> 0xd; */ } // decompiled code // original method signature: // void /*$ra*/ StepHelicopter(struct _EVENT *ev /*$s0*/) // line 1478, offset 0x0004830c /* begin block 1 */ // Start line: 1479 // Start offset: 0x0004830C // Variables: // static int rotacc; // offset 0xa4 /* begin block 1.1 */ // Start line: 1485 // Start offset: 0x00048334 // Variables: // int b; // $a0 // int c; // $t2 // int d; // $v1 // int t; // $a1 // int t2; // $a3 // int t3; // $v1 // int dx1; // $a2 // int dx2; // $t1 // int dx3; // $t0 // int dz1; // $v0 // int dz2; // $a3 // int dz3; // $a0 /* begin block 1.1.1 */ // Start line: 1522 // Start offset: 0x000484A0 // Variables: // struct XZPAIR vel; // stack offset -56 // int direction; // $t1 // int temp; // $t1 // int dt; // $a0 // int d2p; // $v1 // int d2r; // $v1 // int pitch; // $a1 // int roll; // $a2 // static int rotating; // offset 0x24 /* end block 1.1.1 */ // End offset: 0x000487F4 // End Line: 1577 /* begin block 1.1.2 */ // Start line: 1590 // Start offset: 0x00048854 // Variables: // struct VECTOR pos; // stack offset -48 /* end block 1.1.2 */ // End offset: 0x00048854 // End Line: 1591 /* end block 1.1 */ // End offset: 0x00048930 // End Line: 1609 /* begin block 1.2 */ // Start line: 1613 // Start offset: 0x00048948 // Variables: // struct VECTOR pos; // stack offset -56 // struct VECTOR drift; // stack offset -32 /* end block 1.2 */ // End offset: 0x00048948 // End Line: 1613 /* end block 1 */ // End offset: 0x00048A60 // End Line: 1633 /* begin block 2 */ // Start line: 3674 /* end block 2 */ // End Line: 3675 /* begin block 3 */ // Start line: 3704 /* end block 3 */ // End Line: 3705 /* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ void StepHelicopter(_EVENT *ev) { UNIMPLEMENTED(); /* ushort uVar1; short sVar2; int iVar3; uint uVar4; int iVar5; int iVar6; int iVar7; int iVar8; int iVar9; int iVar10; int iVar11; int *piVar12; int local_38; int local_34; int local_30; long local_2c; long local_28; VECTOR local_20; uVar1 = ev->timer; iVar6 = (uint)uVar1 << 0x10; if (iVar6 < 0) goto LAB_00048934; iVar6 = iVar6 >> 0x13; iVar8 = iVar6 * iVar6 + 0x800 >> 0xc; piVar12 = ev->node; iVar11 = *piVar12; iVar3 = iVar8 * iVar6 + 0x800 >> 0xc; iVar5 = (iVar3 * 3 + iVar8 * -5) / 2 + 0x1000; iVar10 = iVar8 * 2 + (iVar6 + iVar3 * -3) / 2; iVar3 = (iVar3 - iVar8) / 2; iVar6 = piVar12[3]; iVar7 = piVar12[1]; iVar9 = piVar12[5]; iVar8 = piVar12[7]; (ev->position).vx = iVar11 + ((piVar12[2] - iVar11) * iVar5 + (piVar12[4] - iVar11) * iVar10 + (piVar12[6] - iVar11) * iVar3 + 0x800 >> 0xc); (ev->position).vz = piVar12[1] + ((iVar6 - iVar7) * iVar5 + (iVar9 - iVar7) * iVar10 + (iVar8 - iVar7) * iVar3 + 0x800 >> 0xc) ; uVar1 = uVar1 + (short)HelicopterData.speed; ev->timer = uVar1; if ((int)((uint)uVar1 << 0x10) < 0) { if ((uint)(piVar12[8] == 0) == piVar12[9]) { ev->timer = -1; } else { ev->timer = 0; ev->node = piVar12 + 2; } } if (ev->rotation == -1) { piVar12 = ev->node; local_38 = (piVar12[4] - *piVar12) / 2; local_34 = (piVar12[5] - piVar12[1]) / 2; sVar2 = ratan2(local_38, local_34); ev->rotation = sVar2; rotating_57 = 0; HelicopterData.pitch = 0; HelicopterData.roll = 0; HelicopterData.dp = 0; HelicopterData.dr = 0; } else { local_38 = (ev->position).vx - HelicopterData.lastX; local_34 = (ev->position).vz - HelicopterData.lastZ; } iVar3 = ratan2(local_38, local_34); uVar4 = (uint)(ushort)ev->rotation & 0xfff; iVar6 = local_34 * rcossin_tbl[uVar4 * 2]; local_34 = local_34 * rcossin_tbl[uVar4 * 2 + 1] + local_38 * rcossin_tbl[uVar4 * 2]; local_38 = local_38 * rcossin_tbl[uVar4 * 2 + 1] - iVar6; iVar6 = local_34; if (local_34 < 0) { iVar6 = -local_34; } iVar5 = (int)HelicopterData.pitch; if (iVar6 < 0xdbba1) { iVar5 = -iVar5 - ((int)((uint)(ushort)rcossin_tbl[((local_34 * 0x400) / 900000 & 0xfffU) * 2] << 0x10) >> 0x13); } else { if (local_34 < 1) { iVar5 = 0x200 - iVar5; } else { iVar5 = -0x200 - iVar5; } } iVar8 = (int)HelicopterData.roll; iVar6 = local_38; if (local_38 < 0) { iVar6 = -local_38; } if (iVar6 < 0x249f1) { iVar8 = ((int)((uint)(ushort)rcossin_tbl[((local_38 * 0x400) / 150000 & 0xfffU) * 2] << 0x10) >> 0x13) - iVar8; } else { if (local_38 < 1) { iVar8 = -0x200 - iVar8; } else { iVar8 = 0x200 - iVar8; } } iVar7 = iVar5 - HelicopterData.dp; iVar6 = iVar7; if (iVar7 < 0) { iVar6 = -iVar7; } if (iVar6 < 5) { HelicopterData.dp = (short)iVar5; } else { uVar1 = (ushort)(iVar7 >> 0x1f); HelicopterData.dp = HelicopterData.dp + ((uVar1 ^ 5) - uVar1); } iVar5 = iVar8 - HelicopterData.dr; iVar6 = iVar5; if (iVar5 < 0) { iVar6 = -iVar5; } if (iVar6 < 5) { HelicopterData.dr = (short)iVar8; } else { uVar1 = (ushort)(iVar5 >> 0x1f); HelicopterData.dr = HelicopterData.dr + ((uVar1 ^ 5) - uVar1); } HelicopterData.pitch = (HelicopterData.pitch + HelicopterData.dp + 0x800U & 0xfff) - 0x800; HelicopterData.roll = (HelicopterData.roll + HelicopterData.dr + 0x800U & 0xfff) - 0x800; iVar3 = ((iVar3 - ev->rotation) + 0x800U & 0xfff) - 0x800; iVar6 = iVar3; if (iVar3 < 0) { iVar6 = -iVar3; } if (iVar6 < 0x201) { iVar6 = (int)((uint)*(ushort *)((int)rcossin_tbl + (iVar3 * 8 & 0x3ff8U)) << 0x10) >> 0x12; } else { iVar6 = -0x400; if (0 < iVar3) { iVar6 = 0x400; } } ev->rotation = ev->rotation + (short)((iVar6 * iVar6 + 0x800 >> 0xc) * iVar6 + 0x800 >> 0xc) & 0xfff; iVar6 = GetSurfaceIndex((VECTOR *)ev); if (iVar6 == -0x17) { iVar3 = (ev->position).vy; iVar6 = iVar3 + 10; if (iVar3 < -0x32) { LAB_000488b0: (ev->position).vy = iVar6; } else { local_2c = 0; local_30 = (ev->position).vx; local_28 = (ev->position).vz; Setup_Smoke((VECTOR *)(&local_38 + 8), 100, 500, 2, 0, &dummy, 0); } } else { iVar6 = (ev->position).vy; if (-1000 < iVar6) { iVar6 = iVar6 + -10; goto LAB_000488b0; } } HelicopterData.lastX = (ev->position).vx; HelicopterData.lastZ = (ev->position).vz; SetMSoundVar((int)ev, (VECTOR *)0x0); if (((ev->flags & 0x100U) != 0) && (uVar4 = Random2(0), (uVar4 & 3) == (CameraCnt & 3U))) { Setup_Smoke((VECTOR *)ev, 100, 500, 1, 0, &dummy, 0); } LAB_00048934: if (ev->model == HelicopterData.deadModel) { local_20.vx = DAT_000109a0; local_20.vy = DAT_000109a4; local_20.vz = DAT_000109a8; local_20.pad = DAT_000109ac; uVar4 = rand(); local_34 = -200; local_38 = (ev->position).vx + (uVar4 & 0xff) + -0x80; uVar4 = rand(); local_30 = (ev->position).vz + (uVar4 & 0xff) + -0x80; Setup_Smoke((VECTOR *)&local_38, 0x32, 100, 4, 0, &dummy, 0); Setup_Smoke((VECTOR *)&local_38, 100, 500, 1, 0, &local_20, 0); SetMSoundVar(0, (VECTOR *)0x0); } else { HelicopterData.rotorrot = HelicopterData.rotorrot + HelicopterData.rotorvel; HelicopterData.rotorvel = HelicopterData.rotorvel + DAT_000aa514; iVar6 = (int)HelicopterData.rotorvel; if (iVar6 < 0) { iVar6 = -iVar6; } if (0x100 < iVar6) { _DAT_000aa514 = -_DAT_000aa514; } } return; */ } // decompiled code // original method signature: // void /*$ra*/ StepEvents() // line 1642, offset 0x00048a60 /* begin block 1 */ // Start line: 1645 // Start offset: 0x00048A60 // Variables: // struct _EVENT *ev; // $s0 /* begin block 1.1 */ // Start line: 1671 // Start offset: 0x00048AC4 // Variables: // struct VECTOR old; // stack offset -72 // int onBoatLastFrame; // $s7 /* begin block 1.1.1 */ // Start line: 1676 // Start offset: 0x00048ACC // Variables: // int dist; // stack offset -48 // int loop; // $s2 // struct _CAR_DATA *cp; // $s1 /* end block 1.1.1 */ // End offset: 0x00048B98 // End Line: 1699 /* begin block 1.1.2 */ // Start line: 1714 // Start offset: 0x00048C40 // Variables: // int d2; // $a2 /* end block 1.1.2 */ // End offset: 0x00048CB4 // End Line: 1717 /* begin block 1.1.3 */ // Start line: 1724 // Start offset: 0x00048CD8 /* end block 1.1.3 */ // End offset: 0x00048CFC // End Line: 1725 /* begin block 1.1.4 */ // Start line: 1729 // Start offset: 0x00048D10 // Variables: // struct XZPAIR speed; // stack offset -56 /* begin block 1.1.4.1 */ // Start line: 1733 // Start offset: 0x00048D28 // Variables: // int loop; // $s2 // int mask; // $s1 /* begin block 1.1.4.1.1 */ // Start line: 1740 // Start offset: 0x00048D60 // Variables: // struct VECTOR *pos; // $a0 // struct VECTOR *vel; // $a1 /* end block 1.1.4.1.1 */ // End offset: 0x00048E4C // End Line: 1775 /* end block 1.1.4.1 */ // End offset: 0x00048E64 // End Line: 1776 /* end block 1.1.4 */ // End offset: 0x00048E64 // End Line: 1777 /* end block 1.1 */ // End offset: 0x00048E64 // End Line: 1778 /* begin block 1.2 */ // Start line: 1797 // Start offset: 0x00048F44 /* begin block 1.2.1 */ // Start line: 1802 // Start offset: 0x00048F54 // Variables: // int sign; // $t0 // unsigned short *target; // $a3 /* end block 1.2.1 */ // End offset: 0x00049070 // End Line: 1820 /* end block 1.2 */ // End offset: 0x00049080 // End Line: 1825 /* begin block 1.3 */ // Start line: 1862 // Start offset: 0x0004914C // Variables: // int thisCamera; // $s1 // int otherCamera; // $s2 // int loop; // $s0 // unsigned short *x; // $t0 // unsigned short *z; // $a3 /* begin block 1.3.1 */ // Start line: 1889 // Start offset: 0x00049240 // Variables: // struct CELL_OBJECT *cop; // $a2 /* end block 1.3.1 */ // End offset: 0x000492C4 // End Line: 1936 /* end block 1.3 */ // End offset: 0x0004930C // End Line: 1941 /* end block 1 */ // End offset: 0x00049364 // End Line: 1951 /* begin block 2 */ // Start line: 4129 /* end block 2 */ // End Line: 4130 /* begin block 3 */ // Start line: 4139 /* end block 3 */ // End Line: 4140 /* begin block 4 */ // Start line: 4141 /* end block 4 */ // End Line: 4142 /* begin block 5 */ // Start line: 4143 /* end block 5 */ // End Line: 4144 /* WARNING: Unknown calling convention yet parameter storage is locked */ void StepEvents(void) { UNIMPLEMENTED(); /* bool bVar1; ushort uVar2; _EVENT *ev; uint uVar3; int i; int iVar4; ushort uVar5; int iVar6; int iVar7; uint uVar8; _PLAYER *pVec; FixedEvent *pFVar9; int *piVar10; CELL_OBJECT *pCVar11; int **ppiVar12; ushort *puVar13; ushort *puVar14; long *plVar15; _CAR_DATA *p_Var16; uint uVar17; int iVar18; int iVar19; uint unaff_s7; int local_48; int local_40; int aiStack48[2]; uVar8 = carsOnBoat; ev = firstEvent; if (detonator.timer != 0) { DetonatorTimer(); uVar8 = carsOnBoat; ev = firstEvent; } do { carsOnBoat = uVar8; if (ev == (_EVENT *)0x0) { VisibilityLists(VIS_SORT, 0); if (EventCop != (CELL_OBJECT *)0x0) { event_models_active = 0; i = 0; if (NumPlayers != 0) { do { uVar8 = 0x4000; if (i == 0) { uVar8 = 0x8000; uVar17 = 0x4000; } else { uVar17 = 0x8000; } VisibilityLists(VIS_NEXT, i); uVar2 = *xVis; i = i + 1; puVar14 = xVis; while (uVar3 = (uint)uVar2, (uVar3 & uVar8) == 0) { if ((uVar3 & uVar17) == 0) { if ((uVar2 & 0x80) == 0) { iVar4 = (uVar3 & 0x7f) * 0x28; pFVar9 = (FixedEvent *)event; } else { iVar4 = (uVar3 & 0x7f) * 0x2c; pFVar9 = fixedEvent; } plVar15 = (long *)((int)&(pFVar9->position).vx + iVar4); if ((plVar15[7] & 0x204U) == 0x200) { uVar2 = *zVis; puVar13 = zVis; while (uVar3 = (uint)uVar2, (uVar3 & uVar8) == 0) { if (((uVar3 & uVar17) == 0) && (((uint)*puVar14 & 0xfff) == (uVar3 & 0xfff))) { pCVar11 = EventCop + event_models_active; (pCVar11->pos).vx = *plVar15; (pCVar11->pos).vy = plVar15[1]; (pCVar11->pos).vz = plVar15[2]; pCVar11->yang = (uchar)(*(ushort *)(plVar15 + 4) >> 6); pCVar11->type = *(ushort *)(plVar15 + 8); if ((plVar15[7] & 0x12U) == 2) { pCVar11->pad = '\x01'; } else { pCVar11->pad = '\0'; } event_models_active = event_models_active + 1; *(ushort *)(plVar15 + 7) = *(ushort *)(plVar15 + 7) | 4; } puVar13 = puVar13 + 1; uVar2 = *puVar13; } } } puVar14 = puVar14 + 1; uVar2 = *puVar14; } } while (i < (int)(uint)NumPlayers); } } i = cameraDelay.delay + -1; if ((cameraDelay.delay != 0) && (cameraDelay.delay = i, i == 0)) { SpecialCamera((SpecialCamera)cameraDelay.type, 1); } return; } uVar2 = ev->flags; if ((uVar2 & 2) == 0) { uVar5 = uVar2 & 0xcc0; if (uVar5 == 0x40) { if (ev->timer != 0) { ppiVar12 = &ev->data; if (ev->timer == 1) { ppiVar12 = (int **)((int)&ev->data + 2); } uVar2 = *(ushort *)ppiVar12; iVar4 = (int)ev->rotation; uVar8 = (uint)*(ushort *)&ev->data; i = iVar4 - uVar8; if (i < 0) { i = uVar8 - iVar4; } uVar17 = (uint)*(ushort *)((int)&ev->data + 2); iVar6 = uVar17 - uVar8; iVar18 = uVar8 - uVar17; if (iVar6 < 0) { iVar6 = iVar18; if (iVar18 == 0) { trap(7); } } else { if (iVar6 == 0) { trap(7); } } uVar8 = (int)((uint)uVar2 - iVar4) >> 0x1f; i = (uint)(ushort)ev->rotation + (((uint)*(ushort *)&ev->node + ((int)((int)rcossin_tbl[((i * 0x800) / iVar6 & 0xfffU) * 2] * ((uint)*(ushort *)((int)&ev->node + 2) - (uint)*(ushort *)&ev->node)) >> 0xc) ^ uVar8) - uVar8); ev->rotation = (short)i; if ((int)((uint)uVar2 - iVar4 ^ (uint)*(ushort *)ppiVar12 - (i * 0x10000 >> 0x10)) < 0) { ev->rotation = *(ushort *)ppiVar12; bVar1 = gCurrentMissionNumber != 0x1e; ev->timer = 0; if (bVar1) { SetMSoundVar(3, (VECTOR *)0x0); } if (ev == events.cameraEvent) { SpecialCamera(SPECIAL_CAMERA_RESET, 0); } } } } else { if (uVar5 < 0x41) { if ((uVar2 & 0xcc0) == 0) { i = GetBridgeRotation((int)ev->timer); ev->rotation = (short)i; if ((ev->model & 1U) != 0) { ev->rotation = -(short)i; } if (((ev->flags & 0x100U) == 0) || (ev->timer < 0x3e9)) { i = (int)ev->timer + 1; ev->timer = (short)i + (short)(i / 8000) * -8000; } } } else { if (uVar5 == 0xc0) { StepHelicopter(ev); } else { if (uVar5 == 0x440) { if ((CameraCnt & 0x1fU) == 0) { i = (uint)(ushort)FixedEvent_0009e964.active - 2; if ((FixedEvent_0009e964.active & 1U) == 0) { i = (uint)(ushort)FixedEvent_0009e964.active + 2; FixedEvent_0009e964.active = (short)i; if (i * 0x10000 >> 0x10 == 0x1e) { FixedEvent_0009e964.active = 0x1f; } } else { FixedEvent_0009e964.active = (short)i; if (i * 0x10000 >> 0x10 == -1) { FixedEvent_0009e964.active = 0; } } } FixedEvent_0009e964.rotation = FixedEvent_0009e964.rotation - FixedEvent_0009e964.active & 0xfff; } } } } } else { if ((uVar2 & 0x40) != 0) { uVar17 = 0; p_Var16 = car_data; carsOnBoat = 0; do { if (p_Var16->controlType != '\0') { i = OnBoat((VECTOR *)(p_Var16->hd).where.t, ev, aiStack48); if (i != 0) { carsOnBoat = carsOnBoat | 1 << (uVar17 & 0x1f); } } uVar17 = uVar17 + 1; p_Var16 = p_Var16 + 1; } while ((int)uVar17 < 0x14); if ((player.playerType == '\x02') && (i = OnBoat((VECTOR *)&player, ev, aiStack48), i != 0)) { carsOnBoat = carsOnBoat | 0x300000; } BoatOffset(&boatOffset, ev); local_48 = (ev->position).vx; local_40 = (ev->position).vz; unaff_s7 = uVar8; } if ((ev->flags & 0x10U) == 0) { StepPathEvent(ev); } else { StepFromToEvent(ev); } uVar8 = foam.rotate; if ((ev->flags & 0x800U) != 0) { uVar8 = CameraCnt & 0xff; ev->data[1] = (int)((uint)(ushort)rcossin_tbl[(CameraCnt & 0x7fU) * 0x40] << 0x10) >> 0x19 & 0xfff; ev->data[2] = (int)rcossin_tbl[uVar8 * 0x20 + 1] + 0x1000 >> 7; i = detonator.timer * detonator.timer; if (detonator.timer - 1U < 0x9f) { ev->data[1] = ev->data[1] - (rcossin_tbl[(detonator.timer & 0x3fU) * 0x80] * i >> 0x12); ev->data[2] = ev->data[2] - (rcossin_tbl[(detonator.timer & 0x3fU) * 0x80] * i >> 0x10); } uVar8 = foam.rotate + -1; if ((foam.rotate & 0xffff7fffU) == 0) { uVar8 = Random2(0); uVar8 = foam.rotate ^ (((int)(uVar8 & 0xf00) >> 8) + 8U | 0x8000); } } foam.rotate = uVar8; if (((ev->flags & 0x40U) != 0) && ((i = 0, carsOnBoat != 0 || (unaff_s7 != 0)))) { uVar8 = 1; iVar19 = 0xd1358; iVar6 = (ev->position).vx - local_48; iVar18 = 0; iVar4 = (ev->position).vz - local_40; do { pVec = (_PLAYER *)((int)car_data[0].hd.where.t + iVar18); if (i == 0x14) { pVec = &player; piVar10 = (int *)0x0; } else { piVar10 = (int *)(iVar19 + 0x1c); } if ((carsOnBoat & uVar8) == 0) { if ((piVar10 != (int *)0x0) && ((unaff_s7 & uVar8) != 0)) { *piVar10 = *piVar10 + iVar6 * 0x1000; iVar7 = piVar10[2] + iVar4 * 0x1000; LAB_00048e48: piVar10[2] = iVar7; } } else { pVec->pos[0] = pVec->pos[0] + iVar6; *(int *)pVec->pos = *(int *)pVec->pos + iVar4; if (i == 0x14) { SetTannerPosition((VECTOR *)pVec); carsOnBoat = carsOnBoat & 0xffefffff; } else { if ((unaff_s7 & uVar8) == 0) { *piVar10 = *piVar10 + iVar6 * -0x1000; iVar7 = piVar10[2] + iVar4 * -0x1000; goto LAB_00048e48; } } } iVar19 = iVar19 + 0x29c; iVar18 = iVar18 + 0x29c; i = i + 1; uVar8 = uVar8 << 1; } while (i < 0x15); } } uVar8 = carsOnBoat; ev = ev->next; } while (true); */ } // decompiled code // original method signature: // void /*$ra*/ DrawFerrisWheel(struct MATRIX *matrix /*$s0*/, struct VECTOR *pos /*$s1*/) // line 2110, offset 0x00049364 /* begin block 1 */ // Start line: 2111 // Start offset: 0x00049364 /* begin block 1.1 */ // Start line: 2126 // Start offset: 0x00049460 // Variables: // int loop; // $s3 // struct MODEL *model; // $s2 // struct VECTOR spoke[2]; // stack offset -104 /* begin block 1.1.1 */ // Start line: 2138 // Start offset: 0x000494E4 // Variables: // struct VECTOR offset; // stack offset -72 // struct VECTOR carPos; // stack offset -56 // int rotation; // $v0 /* end block 1.1.1 */ // End offset: 0x000494E4 // End Line: 2142 /* end block 1.1 */ // End offset: 0x00049658 // End Line: 2155 /* end block 1 */ // End offset: 0x00049684 // End Line: 2157 /* begin block 2 */ // Start line: 5081 /* end block 2 */ // End Line: 5082 /* begin block 3 */ // Start line: 5241 /* end block 3 */ // End Line: 5242 void DrawFerrisWheel(MATRIX *matrix, VECTOR *pos) { UNIMPLEMENTED(); /* short sVar1; short sVar2; uint uVar3; int iVar4; int iVar5; MODEL *model; int iVar6; int iVar7; VECTOR local_68; VECTOR local_58; int local_48; int local_44; int local_40; int local_38; int local_34; int local_30; if (FixedEvent_0009e964.model != -1) { RenderModel(modelpointers1536[FixedEvent_0009e964.model], matrix, pos, 0, 4); if (FixedEvent_0009e964._20_4_ != -1) { RenderModel(modelpointers1536[FixedEvent_0009e964._20_4_], (MATRIX *)0x0, (VECTOR *)0x0, 0, 0); } sVar1 = matrix->m[3]; sVar2 = matrix->m[6]; matrix->m[0] = -matrix->m[0]; matrix->m[3] = -sVar1; matrix->m[6] = -sVar2; RenderModel(modelpointers1536[FixedEvent_0009e964.model], matrix, pos, 0, 4); if (FixedEvent_0009e964._24_4_ != -1) { iVar7 = 0; local_68.vx = DAT_000109b0; local_68.vy = DAT_000109b4; local_68.vz = DAT_000109b8; local_68.pad = DAT_000109bc; local_58.vx = DAT_000109c0; local_58.vy = DAT_000109c4; local_58.vz = DAT_000109c8; local_58.pad = DAT_000109cc; model = modelpointers1536[FixedEvent_0009e964._24_4_]; iVar6 = 4; SetRotMatrix(&inv_camera_matrix); _MatrixRotate(&local_68); _MatrixRotate(&local_58); do { uVar3 = FixedEvent_0009e964.rotation + iVar7 & 0xfff; iVar5 = (int)rcossin_tbl[uVar3 * 2]; iVar4 = (int)rcossin_tbl[uVar3 * 2 + 1]; local_48 = local_68.vx * iVar5 + local_58.vx * iVar4 + 0x800 >> 0xc; local_44 = local_68.vy * iVar5 + local_58.vy * iVar4 + 0x800 >> 0xc; local_38 = pos->vx + local_48; local_40 = local_68.vz * iVar5 + local_58.vz * iVar4 + 0x800 >> 0xc; local_34 = pos->vy + local_44; local_30 = pos->vz + local_40; setCopControlWord(2, 0x2800, local_38); setCopControlWord(2, 0x3000, local_34); setCopControlWord(2, 0x3800, local_30); RenderModel(model, (MATRIX *)0x0, (VECTOR *)0x0, 0, 0); local_38 = pos->vx - local_48; local_34 = pos->vy - local_44; local_30 = pos->vz - local_40; setCopControlWord(2, 0x2800, local_38); setCopControlWord(2, 0x3000, local_34); setCopControlWord(2, 0x3800, local_30); RenderModel(model, (MATRIX *)0x0, (VECTOR *)0x0, 0, 0); iVar6 = iVar6 + -1; iVar7 = iVar7 + 0x19a; } while (-1 < iVar6); } } return; */ } // decompiled code // original method signature: // void /*$ra*/ DrawRotor(struct VECTOR pos /*stack 0*/, struct MATRIX *matrix /*stack 16*/) // line 2159, offset 0x00049684 /* begin block 1 */ // Start line: 2160 // Start offset: 0x00049684 // Variables: // struct SVECTOR v[5]; // stack offset -120 // struct MATRIX local; // stack offset -80 // struct POLY_FT4 *poly; // $t0 // struct TEXTURE_DETAILS *tex; // $t3 // int z; // stack offset -48 // char *firstPoly; // $a1 /* end block 1 */ // End offset: 0x00049C38 // End Line: 2238 /* begin block 2 */ // Start line: 5381 /* end block 2 */ // End Line: 5382 /* begin block 3 */ // Start line: 5384 /* end block 3 */ // End Line: 5385 /* begin block 4 */ // Start line: 5385 /* end block 4 */ // End Line: 5386 /* WARNING: Removing unreachable block (ram,0x000496dc) */ /* WARNING: Removing unreachable block (ram,0x00049704) */ /* WARNING: Removing unreachable block (ram,0x00049750) */ /* WARNING: Could not reconcile some variable overlaps */ void DrawRotor(VECTOR pos, MATRIX *matrix) { UNIMPLEMENTED(); /* DB *pDVar1; undefined4 in_zero; undefined4 in_at; ushort uVar2; int iVar3; uint *puVar4; uint uVar5; int iVar6; int in_a1; uint uVar7; int iVar8; uint uVar9; int in_a2; uint uVar10; short sVar11; uint uVar12; uint *puVar13; uint *puVar14; uint *puVar15; uint *puVar16; uint *puVar17; uint local_78; uint local_74; undefined4 local_70; uint local_6c[4]; undefined2 uStack90; undefined4 local_5c; MATRIX local_50; puVar14 = &local_78; puVar17 = &DAT_000109d0; do { puVar15 = puVar17; puVar13 = puVar14; uVar7 = puVar15[1]; uVar5 = puVar15[2]; uVar12 = puVar15[3]; *puVar13 = *puVar15; puVar13[1] = uVar7; puVar13[2] = uVar5; puVar13[3] = uVar12; puVar14 = puVar13 + 4; puVar17 = puVar15 + 4; } while (puVar15 + 4 != (uint *)0x109f0); uVar7 = puVar15[5]; puVar13[4] = uRam000109f0; puVar13[5] = uVar7; local_50.m[0][0] = 0x1000; local_50.m[1][0] = 0; local_50.m[2][0] = 0; local_50.m[0][1] = 0; local_50.m[1][1] = 0x1000; local_50.m[2][1] = 0; local_50.m[0][2] = 0; local_50.m[1][2] = 0; local_50.m[2][2] = 0x1000; matrix = (MATRIX *)((int)matrix - camera_position.vx); uVar7 = in_a1 - camera_position.vy; uVar5 = in_a2 - camera_position.vz; _RotMatrixY(&local_50, HelicopterData.rotorrot & 0xfff); ApplyMatrixSV(pos.vx, &local_78, &local_78); MulMatrix0(pos.vx, &local_50, &local_50); ApplyMatrixSV(&local_50, &local_70, &local_70); ApplyMatrixSV(&local_50, local_6c + 1, local_6c + 1); uVar12 = (local_78 & 0xffff) + ((uint)matrix & 0xffff); uVar10 = (local_74 & 0xffff) + (uVar5 & 0xffff); uVar5 = (local_6c[1] & 0xffff) + uVar12; iVar8 = (local_78 >> 0x10) + (uVar7 & 0xffff); local_70._2_2_ = local_70._2_2_ + (short)iVar8; iVar6 = uVar12 - uVar5; sVar11 = (short)uVar12; local_74 = local_74 & 0xffff0000 | uVar10 & 0xffff; uVar7 = (local_6c[2] & 0xffff) + uVar10; local_6c[2] = local_6c[2] & 0xffff0000 | uVar7 & 0xffff; local_70 = CONCAT22(local_70._2_2_, (short)local_70 + sVar11); uVar2 = (short)local_6c[0] + (short)uVar10; local_6c[0] = local_6c[0] & 0xffff0000 | (uint)uVar2; local_5c = CONCAT22(uStack90, (short)uVar10 * 2 - (short)uVar7); iVar3 = (local_6c[1] >> 0x10) + iVar8; local_6c[1] = uVar5 & 0xffff | iVar3 * 0x10000; iVar3 = iVar8 * 2 - iVar3; local_6c[3] = CONCAT22((short)iVar3, sVar11 + (short)iVar6); setCopControlWord(2, 0, inv_camera_matrix.m[0]._0_4_); setCopControlWord(2, 0x800, inv_camera_matrix.m._4_4_); setCopControlWord(2, 0x1000, inv_camera_matrix.m[1]._2_4_); setCopControlWord(2, 0x1800, inv_camera_matrix.m[2]._0_4_); setCopControlWord(2, 0x2000, inv_camera_matrix._16_4_); setCopControlWord(2, 0x2800, dummy.vx); setCopControlWord(2, 0x3000, dummy.vy); setCopControlWord(2, 0x3800, dummy.vz); setCopReg(2, in_zero, uVar12 & 0xffff | iVar8 * 0x10000); setCopReg(2, in_at, local_74); setCopReg(2, 0xa0000, local_70); setCopReg(2, 0xa187c, local_6c[0]); setCopReg(2, iVar6, local_6c[1]); setCopReg(2, iVar3, local_6c[2]); copFunction(2, 0x280030); uVar5 = (uint)HelicopterData.rotorTexture.coords._0_2_; uVar9 = (uint)HelicopterData.rotorTexture.coords._6_2_; puVar14 = (uint *)current->primptr; puVar14[3] = CONCAT22(HelicopterData.rotorTexture.clutid, HelicopterData.rotorTexture.coords._0_2_) ; uVar12 = (uint)HelicopterData.rotorTexture.coords._2_2_; uVar7 = (uint)HelicopterData.rotorTexture.tpageid; puVar14[7] = ((uVar5 & 0xfefe) >> 1) + ((uVar9 & 0xfefe) >> 1); puVar14[5] = uVar12 | (uVar7 | 0x40) << 0x10; uVar7 = (uint)HelicopterData.rotorTexture.coords._6_2_; *(char *)((int)puVar14 + 3) = '\t'; *(char *)((int)puVar14 + 7) = '.'; *(char *)(puVar14 + 1) = '\x7f'; *(char *)((int)puVar14 + 5) = '\x7f'; *(char *)((int)puVar14 + 6) = '\x7f'; puVar14[9] = uVar7; copFunction(2, 0x158002d); uVar7 = getCopReg(2, 0xc); puVar14[6] = uVar7; uVar7 = getCopReg(2, 0xd); puVar14[4] = uVar7; uVar7 = getCopReg(2, 0xe); puVar14[2] = uVar7; pDVar1 = current; iVar3 = getCopReg(2, 0x13); iVar3 = iVar3 + 1000 >> 3; setCopReg(2, in_zero, local_6c[3]); setCopReg(2, in_at, local_5c); copFunction(2, 0x180001); *puVar14 = *puVar14 & 0xff000000 | current->ot[iVar3] & 0xffffff; pDVar1->ot[iVar3] = pDVar1->ot[iVar3] & 0xff000000 | (uint)puVar14 & 0xffffff; puVar13 = (uint *)pDVar1->primptr; *(uint **)&pDVar1->primptr = puVar13 + 10; uVar7 = getCopReg(2, 0xe); puVar14[8] = uVar7; local_74._0_2_ = (short)(uVar10 & 0xffff); puVar15 = (uint *)current->primptr; local_5c = CONCAT22(uStack90, (short)local_74 * 2 - uVar2); local_6c[3] = CONCAT22((short)iVar8 * 2 - local_70._2_2_, sVar11 * 2 - ((short)local_70 + sVar11)); puVar14 = puVar15; puVar17 = puVar13; do { puVar16 = puVar17; puVar4 = puVar14; uVar7 = puVar16[1]; uVar5 = puVar16[2]; uVar12 = puVar16[3]; *puVar4 = *puVar16; puVar4[1] = uVar7; puVar4[2] = uVar5; puVar4[3] = uVar12; puVar17 = puVar16 + 4; puVar14 = puVar4 + 4; } while (puVar17 != puVar13 + 8); uVar7 = puVar16[5]; puVar4[4] = *puVar17; puVar4[5] = uVar7; setCopReg(2, in_zero, local_6c[3]); setCopReg(2, in_at, local_5c); copFunction(2, 0x180001); *(undefined2 *)(puVar15 + 5) = HelicopterData.rotorTexture.coords._4_2_; pDVar1 = current; *puVar15 = *puVar15 & 0xff000000 | current->ot[iVar3] & 0xffffff; pDVar1->ot[iVar3] = pDVar1->ot[iVar3] & 0xff000000 | (uint)puVar15 & 0xffffff; pDVar1->primptr = pDVar1->primptr + 0x28; uVar7 = getCopReg(2, 0xe); puVar15[4] = uVar7; return;*/ } // decompiled code // original method signature: // void /*$ra*/ DrawEvents(int camera /*stack 0*/) // line 2240, offset 0x00049c38 /* begin block 1 */ // Start line: 2241 // Start offset: 0x00049C38 // Variables: // unsigned short *x; // $a1 // unsigned short *z; // $a0 // int thisCamera; // stack offset -56 // int otherCamera; // stack offset -52 // static struct _EVENT *nearestTrain; // offset 0x28 // static int distanceFromNearestTrain; // offset 0x2c /* begin block 1.1 */ // Start line: 2276 // Start offset: 0x00049D14 // Variables: // struct _EVENT *ev; // $s1 /* begin block 1.1.1 */ // Start line: 2289 // Start offset: 0x00049E0C // Variables: // unsigned int dist; // $v1 /* end block 1.1.1 */ // End offset: 0x00049E74 // End Line: 2298 /* begin block 1.1.2 */ // Start line: 2314 // Start offset: 0x00049EA4 /* begin block 1.1.2.1 */ // Start line: 2316 // Start offset: 0x00049ED4 // Variables: // struct MATRIX matrix; // stack offset -208 // struct MATRIX ext; // stack offset -176 // struct VECTOR pos; // stack offset -144 // int reflection; // $s5 // int temp; // stack offset -48 /* begin block 1.1.2.1.1 */ // Start line: 2329 // Start offset: 0x00049F48 /* end block 1.1.2.1.1 */ // End offset: 0x00049F48 // End Line: 2329 /* begin block 1.1.2.1.2 */ // Start line: 2335 // Start offset: 0x00049FB4 /* begin block 1.1.2.1.2.1 */ // Start line: 2346 // Start offset: 0x0004A038 // Variables: // struct VECTOR shadow[4]; // stack offset -128 // int loop; // $t0 /* begin block 1.1.2.1.2.1.1 */ // Start line: 2351 // Start offset: 0x0004A05C // Variables: // struct XZPAIR offset; // stack offset -64 // int rotate; // $a1 /* end block 1.1.2.1.2.1.1 */ // End offset: 0x0004A0E8 // End Line: 2358 /* end block 1.1.2.1.2.1 */ // End offset: 0x0004A118 // End Line: 2361 /* begin block 1.1.2.1.2.2 */ // Start line: 2373 // Start offset: 0x0004A17C /* end block 1.1.2.1.2.2 */ // End offset: 0x0004A1B8 // End Line: 2382 /* end block 1.1.2.1.2 */ // End offset: 0x0004A1B8 // End Line: 2383 /* begin block 1.1.2.1.3 */ // Start line: 2393 // Start offset: 0x0004A218 /* end block 1.1.2.1.3 */ // End offset: 0x0004A218 // End Line: 2393 /* begin block 1.1.2.1.4 */ // Start line: 2412 // Start offset: 0x0004A304 // Variables: // int i; // $a0 /* end block 1.1.2.1.4 */ // End offset: 0x0004A354 // End Line: 2419 /* begin block 1.1.2.1.5 */ // Start line: 2424 // Start offset: 0x0004A368 /* end block 1.1.2.1.5 */ // End offset: 0x0004A3E0 // End Line: 2441 /* end block 1.1.2.1 */ // End offset: 0x0004A540 // End Line: 2485 /* end block 1.1.2 */ // End offset: 0x0004A540 // End Line: 2485 /* end block 1.1 */ // End offset: 0x0004A588 // End Line: 2495 /* begin block 1.2 */ // Start line: 2510 // Start offset: 0x0004A628 /* end block 1.2 */ // End offset: 0x0004A628 // End Line: 2510 /* end block 1 */ // End offset: 0x0004A658 // End Line: 2516 /* begin block 2 */ // Start line: 5634 /* end block 2 */ // End Line: 5635 /* begin block 3 */ // Start line: 5637 /* end block 3 */ // End Line: 5638 /* begin block 4 */ // Start line: 5644 /* end block 4 */ // End Line: 5645 void DrawEvents(int camera) { UNIMPLEMENTED(); /* bool bVar1; uint uVar2; ushort uVar3; uint uVar4; int local_d8; short *psVar5; FixedEvent *pFVar6; ushort *puVar7; int iVar8; int iVar9; ushort *puVar10; int *piVar11; VECTOR *pVVar12; _EVENT *ev; undefined4 in_stack_ffffff2c; short local_d0; short local_ce; short local_cc; short local_ca; short local_c8; short local_c6; short local_c4; short local_c2; short local_c0; VECTOR local_90; VECTOR local_80[4]; int local_40; int local_3c; uint local_38; uint local_34; int local_30; if (CurrentPlayerView == 0) { nearestTrain_70 = (_EVENT *)0x0; local_38 = 0x8000; local_34 = 0x4000; } else { local_38 = 0x4000; local_34 = 0x8000; } if (camera == 0) { SetFrustrumMatrix(); } else { if (cameraEventsActive == 0) { return; } InitEventCamera(); } VisibilityLists(VIS_NEXT, CurrentPlayerView); uVar4 = (uint)*xVis; uVar2 = uVar4 & local_38; puVar10 = xVis; do { if (uVar2 != 0) { if (camera == 0) { if (eventHaze != 0) { add_haze(eventHaze, eventHaze, 7); } } else { ResetEventCamera(); } if (((camera == 0) && (CurrentPlayerView == (uint)NumPlayers - 1)) && (local_d8 = (int)es_mobile, local_d8 != -1)) { if (nearestTrain_70 == (_EVENT *)0x0) { SetEnvSndVol(local_d8, -10000); } else { SetEnvSndVol(local_d8, 2000); SetEnvSndPos((int)es_mobile, (nearestTrain_70->position).vx, (nearestTrain_70->position).vz) ; } } return; } if ((uVar4 & local_34) == 0) { if ((uVar4 & 0x80) == 0) { local_d8 = (uVar4 & 0x7f) * 0x28; pFVar6 = (FixedEvent *)event; } else { local_d8 = (uVar4 & 0x7f) * 0x2c; pFVar6 = fixedEvent; } ev = (_EVENT *)((int)&(pFVar6->position).vx + local_d8); uVar3 = ev->flags; if ((uVar3 & 4) == 0) { if (camera == 0) { if ((uVar3 & 1) != 1) { LAB_00049d90: uVar4 = (uint)*zVis; puVar7 = zVis; if ((uVar4 & local_38) == 0) { LAB_00049db4: if (((uVar4 & local_34) != 0) || (((uint)*puVar10 & 0xfff) != (uVar4 & 0xfff))) break; ev->flags = uVar3 | 4; if (camera == 0) { if ((es_mobile != -1) && ((uVar3 & 2) != 0)) { local_d8 = (ev->position).vx; iVar9 = local_d8 - camera_position.vx; if (iVar9 < 0) { iVar9 = camera_position.vx - local_d8; } iVar8 = (ev->position).vz; local_d8 = iVar8 - camera_position.vz; if (local_d8 < 0) { local_d8 = camera_position.vz - iVar8; } if ((nearestTrain_70 == (_EVENT *)0x0) || ((uint)(iVar9 + local_d8) < distanceFromNearestTrain_71)) { nearestTrain_70 = ev; distanceFromNearestTrain_71 = iVar9 + local_d8; } } local_d8 = FrustrumCheck(ev, (int)modelpointers1536[ev->model]->bounding_sphere); if (local_d8 != -1) { local_90.vx = (ev->position).vx - camera_position.vx; local_90.vy = (ev->position).vy - camera_position.vy; local_d0 = 0x1000; local_ca = 0; local_c4 = 0; local_ce = 0; local_c8 = 0x1000; local_c2 = 0; local_cc = 0; local_c6 = 0; local_c0 = 0x1000; local_90.vz = (ev->position).vz - camera_position.vz; bVar1 = false; if ((ev->flags & 2U) == 0) { uVar3 = ev->flags & 0xcc0; if (uVar3 == 0x400) goto LAB_0004a118; if (uVar3 < 0x401) { if (uVar3 == 0x80) { _RotMatrixY((MATRIX *)&stack0xffffff30, ev->rotation); local_90.vx = local_90.vx - boatOffset.vx; local_90.vz = local_90.vz - boatOffset.vz; local_90.vy = (local_90.vy - boatOffset.vy) + ((int)ev->node * (int)rcossin_tbl[(*ev->data & 0xfffU) * 2] + 0x800 >> 0xc); } else { if (uVar3 != 0xc0) { LAB_0004a140: uVar3 = ev->flags & 0x30; if (uVar3 == 0x10) { _RotMatrixY((MATRIX *)&stack0xffffff30, ev->rotation); } else { if (uVar3 < 0x11) { if ((ev->flags & 0x30U) == 0) { _RotMatrixX((MATRIX *)&stack0xffffff30, ev->rotation); } } else { if (uVar3 == 0x20) { _RotMatrixZ((MATRIX *)&stack0xffffff30, ev->rotation); } } } } } } else { if (uVar3 == 0x440) { _RotMatrixX((MATRIX *)&stack0xffffff30, ev->rotation); } else { uVar4 = 0; if (uVar3 != 0x480) goto LAB_0004a140; local_d8 = 0; piVar11 = &local_80[0].vz; pVVar12 = local_80; do { if ((uVar4 & 1) == 0) { local_40 = -0xc9; } else { local_40 = 0xc9; } if ((uVar4 & 2) == 0) { local_3c = -0x4ed; } else { local_3c = 0x4ed; } uVar2 = (int)ev->rotation + 0x200U & 0x400; iVar9 = local_40; if (uVar2 != 0) { iVar9 = local_3c; } pVVar12->vx = (ev->position).vx + iVar9; iVar9 = local_3c; if (uVar2 != 0) { iVar9 = local_40; } *piVar11 = (ev->position).vz + iVar9; *(undefined4 *)((int)&local_80[0].vy + local_d8) = 0; piVar11 = piVar11 + 4; pVVar12 = pVVar12 + 1; uVar4 = uVar4 + 1; local_d8 = local_d8 + 0x10; } while ((int)uVar4 < 4); PlaceShadowForCar(local_80, 0xc, (VECTOR *)0x0, 0); LAB_0004a118: _RotMatrixY((MATRIX *)&stack0xffffff30, ev->rotation); } } } else { _RotMatrixY((MATRIX *)&stack0xffffff30, ev->rotation); } setCopControlWord(2, 0, inv_camera_matrix.m[0]._0_4_); setCopControlWord(2, 0x800, inv_camera_matrix.m._4_4_); setCopControlWord(2, 0x1000, inv_camera_matrix.m[1]._2_4_); setCopControlWord(2, 0x1800, inv_camera_matrix.m[2]._0_4_); setCopControlWord(2, 0x2000, inv_camera_matrix._16_4_); _MatrixRotate(&local_90); if ((ev->flags & 0xcc0U) == 0xc0) { psVar5 = (short *)&stack0xffffff30; if (ev->model == HelicopterData.cleanModel) { _RotMatrixZ((MATRIX *)&stack0xffffff30, HelicopterData.roll & 0xfff); _RotMatrixX((MATRIX *)&stack0xffffff30, HelicopterData.pitch & 0xfff); _RotMatrixY((MATRIX *)&stack0xffffff30, ev->rotation & 0xfff); DrawRotor((VECTOR)CONCAT214(local_ca, CONCAT212(local_cc, CONCAT210(local_ce, CONCAT28(local_d0, CONCAT44(in_stack_ffffff2c, (MATRIX *) &stack0xffffff30))))), (MATRIX *)(ev->position).vx); RenderModel(modelpointers1536[ev->model], (MATRIX *)&stack0xffffff30, &local_90, 0, 0); local_90.vx = (ev->position).vx - camera_position.vx; local_90.vy = -camera_position.vy - (ev->position).vy; local_90.vz = (ev->position).vz - camera_position.vz; setCopControlWord(2, 0, inv_camera_matrix.m[0]._0_4_); setCopControlWord(2, 0x800, inv_camera_matrix.m._4_4_); setCopControlWord(2, 0x1000, inv_camera_matrix.m[1]._2_4_); setCopControlWord(2, 0x1800, inv_camera_matrix.m[2]._0_4_); setCopControlWord(2, 0x2000, inv_camera_matrix._16_4_); _MatrixRotate(&local_90); bVar1 = true; } else { local_d8 = 2; do { local_d8 = local_d8 + -1; *psVar5 = *psVar5 << 1; psVar5 = psVar5 + 4; } while (-1 < local_d8); _RotMatrixY((MATRIX *)&stack0xffffff30, 0xafd); RenderModel(modelpointers1536[ev->model], (MATRIX *)&stack0xffffff30, &local_90, 0, 0); } } if ((ev->flags & 0x800U) != 0) { _RotMatrixX((MATRIX *)&stack0xffffff30, (short)ev->data[1]); local_d8 = gTimeOfDay; local_90.vy = local_90.vy - ev->data[2]; local_30 = combointensity; if ((ev->flags & 0x20U) == 0) { ev->flags = ev->flags | 1; if (local_d8 != 3) { bVar1 = true; } } else { SetupPlaneColours(0x80a0c); } } if (bVar1) { local_c8 = -local_c8; local_c6 = -local_c6; SetupPlaneColours((ulong)&DAT_00464a40); RenderModel(modelpointers1536[ev->model], (MATRIX *)&stack0xffffff30, &local_90, 400, 2); } else { if ((ev->flags & 0xcc0U) == 0x440) { DrawFerrisWheel((MATRIX *)&stack0xffffff30, &local_90); } else { RenderModel(modelpointers1536[ev->model], (MATRIX *)&stack0xffffff30, &local_90, 0, 0); } } if ((ev->flags & 0x800U) != 0) { combointensity = local_30; local_c8 = 0x1000; local_c6 = 0; local_c4 = 0x1000; local_c2 = 0; local_c0 = 0; local_90.vy = local_90.vy + ev->data[2]; if (gTimeOfDay != 1) { SetupPlaneColours((ulong)&DAT_00282828); } if ((foam.rotate & 0x8000U) == 0) { local_d8 = 1; } else { local_d8 = 3; } RenderModel(foam.model, (MATRIX *)&stack0xffffff30, &local_90, 200, local_d8); SetupPlaneColours(combointensity); } } } else { SetCamera(ev); DrawMapPSX((int *)&ObjectDrawnValue); } } } } else { if ((uVar3 & 1) != 0) goto LAB_00049d90; } } } LAB_0004a58c: puVar10 = puVar10 + 1; uVar4 = (uint)*puVar10; uVar2 = uVar4 & local_38; } while (true); uVar4 = (uint)puVar7[1]; puVar7 = puVar7 + 1; if ((uVar4 & local_38) != 0) goto LAB_0004a58c; goto LAB_00049db4;*/ } // decompiled code // original method signature: // void /*$ra*/ BoatOffset(SVECTOR *offset /*$a0*/, _EVENT *ev /*$a1*/) // line 2520, offset 0x0004be24 /* begin block 1 */ // Start line: 10327 /* end block 1 */ // End Line: 10328 /* begin block 2 */ // Start line: 5040 /* end block 2 */ // End Line: 5041 /* begin block 3 */ // Start line: 10328 /* end block 3 */ // End Line: 10329 // [D] void BoatOffset(SVECTOR *offset, _EVENT *ev) { offset->vx = 0; offset->vy = -*(short *)(ev->data + 2); offset->vz = *(short *)(ev->data + 4) - *(short *)&(ev->position).vz; return; } // decompiled code // original method signature: // int /*$ra*/ OnBoat(struct VECTOR *pos /*$t1*/, struct _EVENT *ev /*$a1*/, int *dist /*$a2*/) // line 2527, offset 0x0004bda0 /* begin block 1 */ // Start line: 2528 // Start offset: 0x0004BDA0 // Variables: // int halfBoatWidth; // $t0 // int halfBoatLength; // $a0 /* end block 1 */ // End offset: 0x0004BE24 // End Line: 2558 /* begin block 2 */ // Start line: 10304 /* end block 2 */ // End Line: 10305 /* begin block 3 */ // Start line: 5054 /* end block 3 */ // End Line: 5055 /* begin block 4 */ // Start line: 10308 /* end block 4 */ // End Line: 10309 // [D] int OnBoat(VECTOR *pos, _EVENT *ev, int *dist) { int iVar1; int iVar2; int iVar3; if (GameLevel == 1) { iVar3 = 0x355; iVar2 = 0x97f; } else { iVar3 = 0x640; iVar2 = 0x1500; } iVar1 = (ev->position).vx; if (iVar1 - iVar3 < pos->vx) { if (iVar1 + iVar3 <= pos->vx) { return 0; } iVar3 = pos->vz - (ev->position).vz; *dist = iVar3; if ((-iVar2 < iVar3) && (iVar3 < iVar2)) { return 1; } } return 0; } // decompiled code // original method signature: // struct _sdPlane * /*$ra*/ EventSurface(struct VECTOR *pos /*$a0*/, struct _sdPlane *plane /*$s1*/) // line 2560, offset 0x0004a688 /* begin block 1 */ // Start line: 2561 // Start offset: 0x0004A688 // Variables: // struct _EVENT *ev; // $s0 // int i; // $a2 /* begin block 1.1 */ // Start line: 2572 // Start offset: 0x0004A700 // Variables: // int dist; // $a3 // int end; // $a1 // int cos; // $a2 /* end block 1.1 */ // End offset: 0x0004A880 // End Line: 2623 /* begin block 1.2 */ // Start line: 2628 // Start offset: 0x0004A894 // Variables: // int dist; // stack offset -24 /* begin block 1.2.1 */ // Start line: 2632 // Start offset: 0x0004A8A4 // Variables: // int sin; // $a3 // int cos; // $a2 // int height; // $t0 // int offset; // $a0 /* end block 1.2.1 */ // End offset: 0x0004AA20 // End Line: 2664 /* end block 1.2 */ // End offset: 0x0004AA20 // End Line: 2665 /* end block 1 */ // End offset: 0x0004AA78 // End Line: 2681 /* begin block 2 */ // Start line: 6772 /* end block 2 */ // End Line: 6773 _sdPlane * EventSurface(VECTOR *pos, _sdPlane *plane) { UNIMPLEMENTED(); return 0; /* ushort uVar1; int *piVar2; uint uVar3; short sVar4; int iVar5; uint uVar6; int iVar7; int iVar8; _EVENT *ev; int iVar9; int local_18[2]; uVar6 = SEXT24((short)(plane->surface & 0xffef)); ev = event + uVar6; if (GameLevel == 1) { LAB_0004a880: if ((ev->flags & 0x800U) != 0) { iVar8 = OnBoat(pos, ev, local_18); if (iVar8 == 0) { LAB_0004aa60: return &sea; } iVar8 = 200; if (GameLevel == 3) { iVar8 = 0x100; } piVar2 = ev->data; uVar6 = piVar2[1] & 0xfff; iVar5 = (int)rcossin_tbl[uVar6 * 2]; iVar9 = (int)rcossin_tbl[uVar6 * 2 + 1]; if (GameLevel == 3) { iVar7 = local_18[0] * -0x1000 + iVar9 * -0xd00; if (0 < iVar7) { uVar3 = 0xa0U - piVar2[1] & 0xfff; iVar9 = (int)rcossin_tbl[uVar3 * 2 + 1]; if (iVar9 << 0xb < iVar7) { debugOffset = iVar7; return &sea; } if (iVar9 == 0) { trap(7); } uVar6 = (iVar8 - ((iVar5 * 0xd00 + 0x800 >> 0xc) + piVar2[2] + (ev->position).vy)) + ((iVar7 + 0x800 >> 0xc) * (int)rcossin_tbl[uVar3 * 2]) / iVar9; iVar5 = (int)rcossin_tbl[uVar3 * 2]; goto LAB_0004a9f8; } } if (iVar9 == 0) { trap(7); } uVar6 = iVar8 + (((iVar5 * local_18[0]) / iVar9 - piVar2[2]) - (ev->position).vy); LAB_0004a9f8: plane->b = (short)(iVar9 << 2); plane->a = 0; plane->c = (short)(iVar5 << 2); plane->d = uVar6 ^ 0x40000000; return plane; } uVar6 = -(ev->position).vy; if (pos->vy < (int)(uVar6 - 100)) { uVar6 = 0xbfffee02; goto LAB_0004aa50; } } else { if (1 < GameLevel) { if (GameLevel != 3) { return &sea; } goto LAB_0004a880; } if (GameLevel != 0) { return &sea; } if ((ev->flags & 0x30U) == 0) { iVar8 = pos->vz; } else { iVar8 = pos->vx; } if ((uVar6 & 1) == 0) { piVar2 = ev->data; iVar5 = piVar2[1]; } else { piVar2 = ev->data; iVar5 = piVar2[-1]; } uVar6 = (uint)(ushort)ev->rotation & 0xfff; iVar7 = (int)rcossin_tbl[uVar6 * 2 + 1]; iVar9 = (iVar5 - *piVar2) * iVar7; iVar8 = iVar8 - *piVar2; iVar5 = iVar8; if (iVar8 < 0) { iVar5 = -iVar8; } if (iVar9 < 0) { iVar9 = -iVar9; } if (iVar9 < iVar5 << 0xc) goto LAB_0004aa60; uVar6 = (iVar8 * rcossin_tbl[uVar6 * 2]) / iVar7; if (iVar7 == 0) { trap(7); } sVar4 = (short)(iVar7 << 2); if (0x400 < iVar8) { if (pos->vy + 200 < (int)uVar6) goto LAB_0004aa60; sVar4 = (short)(iVar7 << 2); } plane->b = sVar4; if ((ev->flags & 0x30U) == 0) { plane->a = 0; uVar1 = rcossin_tbl[((uint)(ushort)ev->rotation & 0xfff) * 2]; plane->c = uVar1 * -4; plane->d = (int)((uint)uVar1 * -0x40000) >> 0x10; } else { sVar4 = rcossin_tbl[((uint)(ushort)ev->rotation & 0xfff) * 2]; plane->c = 0; plane->a = sVar4 * -4; } } uVar6 = uVar6 ^ 0x40000000; LAB_0004aa50: plane->d = uVar6; return plane; */ } // decompiled code // original method signature: // void /*$ra*/ MakeEventTrackable(struct _EVENT *ev /*$a0*/) // line 2684, offset 0x0004bd6c /* begin block 1 */ // Start line: 2685 // Start offset: 0x0004BD6C // Variables: // struct _EVENT **p; // $v1 /* end block 1 */ // End offset: 0x0004BDA0 // End Line: 2694 /* begin block 2 */ // Start line: 5368 /* end block 2 */ // End Line: 5369 /* begin block 3 */ // Start line: 10454 /* end block 3 */ // End Line: 10455 void MakeEventTrackable(_EVENT *ev) { UNIMPLEMENTED(); /* _EVENT **pp_Var1; _EVENT **pp_Var2; pp_Var2 = &trackingEvent2; if (trackingEvent2 != (_EVENT *)0x0) { pp_Var1 = &PTR_000aad74; do { pp_Var2 = pp_Var1; pp_Var1 = pp_Var2 + 1; } while (*pp_Var2 != (_EVENT *)0x0); } *pp_Var2 = ev; pp_Var2[1] = (_EVENT *)0x0; return; */ } // decompiled code // original method signature: // void /*$ra*/ TriggerDoor(struct FixedEvent *door /*$a3*/, int *stage /*$a1*/, int sound /*$a2*/) // line 2696, offset 0x0004c208 /* begin block 1 */ // Start line: 11604 /* end block 1 */ // End Line: 11605 /* begin block 2 */ // Start line: 12825 /* end block 2 */ // End Line: 12826 void TriggerDoor(FixedEvent *door, int *stage, int sound) { UNIMPLEMENTED(); /* if (*stage == 0) { if ((door->flags & 0x30U) != 0x10) { door->flags = door->flags & 0xfdff; } door->active = 2; } else { door->active = 1; door->flags = door->flags | 0x200; *stage = -1; } if (sound != 0) { SetMSoundVar(1, (VECTOR *)door); } return; */ } // decompiled code // original method signature: // struct VECTOR * /*$ra*/ TriggerEvent(int i /*$s4*/) // line 2718, offset 0x0004aa78 /* begin block 1 */ // Start line: 2719 // Start offset: 0x0004AA78 // Variables: // static int stage[10]; // offset 0x200 // struct VECTOR *pos; // $s7 /* begin block 1.1 */ // Start line: 2726 // Start offset: 0x0004AAB0 // Variables: // int loop; // $v1 /* end block 1.1 */ // End offset: 0x0004AAD0 // End Line: 2731 /* begin block 1.2 */ // Start line: 2739 // Start offset: 0x0004AB20 // Variables: // struct _EVENT *ev; // $a2 /* end block 1.2 */ // End offset: 0x0004AB20 // End Line: 2740 /* begin block 1.3 */ // Start line: 2754 // Start offset: 0x0004AC08 /* begin block 1.3.1 */ // Start line: 2757 // Start offset: 0x0004AC08 // Variables: // struct MissionTrain *train; // $s1 /* begin block 1.3.1.1 */ // Start line: 2763 // Start offset: 0x0004AC38 /* end block 1.3.1.1 */ // End offset: 0x0004AC50 // End Line: 2769 /* begin block 1.3.1.2 */ // Start line: 2774 // Start offset: 0x0004AC5C // Variables: // struct _EVENT *ev; // $s0 // int count; // $s2 // int offset; // $s6 /* begin block 1.3.1.2.1 */ // Start line: 2785 // Start offset: 0x0004ACAC // Variables: // int pos; // $a1 /* end block 1.3.1.2.1 */ // End offset: 0x0004ACAC // End Line: 2785 /* end block 1.3.1.2 */ // End offset: 0x0004AD88 // End Line: 2817 /* end block 1.3.1 */ // End offset: 0x0004AD88 // End Line: 2819 /* begin block 1.3.2 */ // Start line: 2831 // Start offset: 0x0004ADB8 // Variables: // struct _EVENT *ev; // $v1 // int count; // $a0 /* end block 1.3.2 */ // End offset: 0x0004AE04 // End Line: 2848 /* end block 1.3 */ // End offset: 0x0004AE28 // End Line: 2860 /* begin block 1.4 */ // Start line: 2867 // Start offset: 0x0004AE90 /* end block 1.4 */ // End offset: 0x0004AF60 // End Line: 2897 /* begin block 1.5 */ // Start line: 2905 // Start offset: 0x0004AFA8 /* begin block 1.5.1 */ // Start line: 2907 // Start offset: 0x0004AFA8 // Variables: // int loop; // $s0 /* end block 1.5.1 */ // End offset: 0x0004B044 // End Line: 2923 /* end block 1.5 */ // End offset: 0x0004B0D0 // End Line: 2941 /* end block 1 */ // End offset: 0x0004B29C // End Line: 2992 /* begin block 2 */ // Start line: 7076 /* end block 2 */ // End Line: 7077 /* begin block 3 */ // Start line: 7114 /* end block 3 */ // End Line: 7115 /* begin block 4 */ // Start line: 7118 /* end block 4 */ // End Line: 7119 VECTOR * TriggerEvent(int i) { UNIMPLEMENTED(); return 0; /* ushort uVar1; _EVENT *p_Var2; undefined4 *puVar3; int count; int *piVar4; int iVar5; int iVar6; _EVENT *p_Var7; _EVENT *ev; int iVar8; _EVENT *ev_00; p_Var2 = firstEvent; p_Var7 = firstMissionEvent; ev = event; ev_00 = (_EVENT *)0x0; if (i == -1) { count = 9; puVar3 = &DAT_000cde74; do { *puVar3 = 0; count = count + -1; puVar3 = puVar3 + -1; } while (-1 < count); return (VECTOR *)0x0; } if (((GameLevel - 2U < 2) && (0 < i)) && (i < 4)) { if (*(int *)(&stage_90 + i * 4) == 0) { p_Var7 = firstMissionEvent + i + -1; ev = (_EVENT *)((int)p_Var7 - (int)event); p_Var7->next = firstEvent->next; p_Var2->next = p_Var7; VisibilityLists(VIS_ADD, (int)ev * -0x33333333 >> 3); SetMSoundVar(i, (VECTOR *)0x0); detonator.count = detonator.count + 1; } goto switchD_0004afa0_caseD_1; } if (GameLevel == 1) { if (4 < (uint)i) goto switchD_0004afa0_caseD_1; count = i * 4; switch (i) { case 0: switchD_0004ae88_caseD_0: event->timer = 1; break; case 1: (event->position).vx = INT_0009e8a0; count = INT_ARRAY_0009e8a4[0]; ev->timer = 1; ev->node = INT_ARRAY_0009e8a4; ev->data = INT_ARRAY_0009e894; (ev->position).vz = count; break; case 2: TriggerDoor(&havanaFixed, (int *)(&stage_90 + count), 1); break; case 3: PrepareSecretCar(); events.cameraEvent = &FixedEvent_0009e9e8; TriggerDoor(&FixedEvent_0009e9e8, (int *)(&stage_90 + count), 0); break; case 4: if (*(int *)(&stage_90 + count) != 0) { SpecialCamera(SPECIAL_CAMERA_WAIT, 0); event[1].node = event[1].node + 1; } ev = event; event[1].timer = 0; events.cameraEvent = (FixedEvent *)(ev + 1); } } else { if (GameLevel < 2) { if ((GameLevel == 0) && ((uint)i < 7)) { count = i * 4; switch (i) { case 0: case 1: if (*(int *)(&stage_90 + count) == 0) { ev_00 = (&missionTrain)[i].engine; MakeEventTrackable(ev_00); ev_00->flags = ev_00->flags | 0x180; count = -0x640; if (-1 < *(&missionTrain)[i].node - (&missionTrain)[i].start) { count = 0x640; } iVar8 = 0; ev = ev_00; do { piVar4 = (&missionTrain)[i].node; if (*piVar4 == -0x7ffffffe) { iVar6 = piVar4[-1]; } else { iVar6 = piVar4[1]; } if ((&missionTrain)[i].startDir == 0x8000) { uVar1 = ev->flags; (ev->position).vx = iVar6; ev->flags = uVar1 | 0x8000; (ev->position).vz = (&missionTrain)[i].start + iVar8 * count; } else { ev->flags = ev->flags & 0x7fff; iVar5 = (&missionTrain)[i].start; (ev->position).vz = iVar6; (ev->position).vx = iVar5 + iVar8 * count; } piVar4 = (&missionTrain)[i].node; ev->data = &(&missionTrain)[i].cornerSpeed; ev->timer = 0; ev->node = piVar4; ev->flags = ev->flags & 0x8fffU | 0x3000; SetElTrainRotation(ev); iVar8 = iVar8 + 1; } while ((ev->next != (_EVENT *)0x0) && (ev = ev->next, (ev->flags & 0x400U) == 0)); } else { ev_00 = (&missionTrain)[i].engine; if (ev_00->timer != 0) { ev_00->timer = 1; } } break; default: if (*(int *)(&stage_90 + count) == 0) { count = 9; ev = firstMissionEvent; do { p_Var7 = ev; p_Var7->flags = p_Var7->flags | 0x100; if (i == 4) { p_Var7->timer = 0xa28; } else { p_Var7->timer = 1000; } count = count + -1; ev = p_Var7 + 1; } while (-1 < count); if (i == 2) { p_Var7[-1].timer = 0xa28; p_Var7->timer = 0xa28; } } else { firstMissionEvent[8].timer = 0; p_Var7[9].timer = 0; } break; case 5: PrepareSecretCar(); events.cameraEvent = &chicagoDoor; case 6: TriggerDoor((FixedEvent *)(INT_ARRAY_0009e724 + i * 0xb + 0x43), (int *)(&stage_90 + count) , 1); } } goto switchD_0004afa0_caseD_1; } if (GameLevel == 2) { switch (i) { case 0: count = 0; iVar8 = 0; do { ev = (_EVENT *)((int)&(event->position).vx + iVar8); ev->data = VegasTrainData; InitTrain(ev, count, 1); iVar6 = (int)&(event->position).vx + iVar8; *(ushort *)(iVar6 + 0x1c) = *(ushort *)(iVar6 + 0x1c) | 0x200; if (1 < count) { VisibilityLists(VIS_ADD, count); } ev = event; count = count + 1; iVar8 = iVar8 + 0x28; } while (count < 9); event->flags = event->flags | 0x500; MakeEventTrackable(ev); event[1].next = event + 2; break; case 4: TriggerDoor(&FixedEvent_0009e964 + i, (int *)(&stage_90 + i * 4), 0); break; case 8: events.cameraEvent = &FixedEvent_0009eac4; PrepareSecretCar(); case 5: case 6: case 7: TriggerDoor(&FixedEvent_0009e964 + i, (int *)(&stage_90 + i * 4), 1); break; case 9: SetMSoundVar(5, (VECTOR *)0x0); } goto switchD_0004afa0_caseD_1; } if (GameLevel != 3) goto switchD_0004afa0_caseD_1; count = i * 4; switch (i) { case 0: goto switchD_0004ae88_caseD_0; case 4: TriggerDoor(&FixedEvent_0009eb48, (int *)(&stage_90 + count), 0); TriggerDoor(&FixedEvent_0009eb74, (int *)(&stage_90 + count), 0); events.cameraEvent = &FixedEvent_0009eb48; break; case 5: case 6: TriggerDoor(&vegasDoor + i, (int *)(&stage_90 + count), (uint)(i == 5)); break; case 7: if (*(int *)(&stage_90 + count) == 0) { ev_00 = event + 1; } else { event[1].position.vy = -0x11; ev[1].position.vx = -0x3afd3; ev[1].position.vz = -0x33e9e; ev[1].timer = -2; ev[1].model = HelicopterData.deadModel; } break; case 8: PingOutAllSpecialCivCars(); TriggerDoor(&FixedEvent_0009eba0, (int *)(&stage_90 + count), 0); TriggerDoor(&FixedEvent_0009ebcc, (int *)(&stage_90 + count), 0); events.cameraEvent = &FixedEvent_0009eba0; } } switchD_0004afa0_caseD_1: if (i < 10) { *(int *)(&stage_90 + i * 4) = *(int *)(&stage_90 + i * 4) + 1; } return (VECTOR *)ev_00; */ } // decompiled code // original method signature: // void /*$ra*/ OffsetTarget(struct VECTOR *target /*$a0*/) // line 2994, offset 0x0004bd2c /* begin block 1 */ // Start line: 8890 /* end block 1 */ // End Line: 8891 /* begin block 2 */ // Start line: 10760 /* end block 2 */ // End Line: 10761 /* begin block 3 */ // Start line: 10761 /* end block 3 */ // End Line: 10762 void OffsetTarget(VECTOR *target) { UNIMPLEMENTED(); /* target->vx = target->vx - (int)boatOffset.vx; target->vy = target->vy - (int)boatOffset.vy; target->vz = target->vz - (int)boatOffset.vz; return;*/ } // decompiled code // original method signature: // void /*$ra*/ SpecialCamera(enum SpecialCamera type /*$t2*/, int change /*$a1*/) // line 2999, offset 0x0004b29c /* begin block 1 */ // Start line: 3000 // Start offset: 0x0004B29C // Variables: // static int rememberCamera[3]; // offset 0x230 // static short boatCamera[6]; // offset 0x684 /* begin block 1.1 */ // Start line: 3013 // Start offset: 0x0004B2E4 // Variables: // int *hackCamera; // $a2 // short *boat; // $t3 /* end block 1.1 */ // End offset: 0x0004B540 // End Line: 3114 /* end block 1 */ // End offset: 0x0004B5FC // End Line: 3142 /* begin block 2 */ // Start line: 7742 /* end block 2 */ // End Line: 7743 /* begin block 3 */ // Start line: 7750 /* end block 3 */ // End Line: 7751 /* WARNING: Globals starting with '_' overlap smaller symbols at the same address */ void SpecialCamera(enum SpecialCamera type, int change) { UNIMPLEMENTED(); /* int *in_a2; short *psVar1; if ((change == 0) && (type != SPECIAL_CAMERA_WAIT)) { cameraDelay.delay = 1; cameraDelay.type = (uint)type; _camera_change = 1; return; } if (type == SPECIAL_CAMERA_RESET) { events.cameraEvent = (_EVENT *)0x0; gStopPadReads = 0; camera_position.vx = rememberCamera_97; camera_angle.vy = (short)DAT_000cde84; camera_position.vz = DAT_000cde88; player.cameraPos.vx = rememberCamera_97; player.cameraPos.vy = camera_position.vy; player.cameraPos.vz = DAT_000cde88; player.cameraPos.pad = camera_position.pad; goto LAB_0004b5b8; } if (SPECIAL_CAMERA_RESET < type) { if (type == SPECIAL_CAMERA_WAIT) { cameraDelay.delay = 100; cameraDelay.type = 1; gStopPadReads = 1; } goto LAB_0004b5b8; } psVar1 = (short *)0x0; rememberCamera_97 = camera_position.vx; DAT_000cde84 = (int)camera_angle.vy; DAT_000cde88 = camera_position.vz; if (GameLevel == 1) { if (gCurrentMissionNumber == 0xf) { psVar1 = (short *)0x9ed8c; LAB_0004b418: events.cameraEvent = (_EVENT *)0x1; } else { in_a2 = HavanaCameraHack; if (type == SPECIAL_CAMERA_SET2) { in_a2 = HavanaCameraHack + 6; camera_position.vy = -500; } else { if (doneFirstHavanaCameraHack == 0) { doneFirstHavanaCameraHack = 1; } else { LAB_0004b42c: in_a2 = in_a2 + 3; } } } } else { if (GameLevel < 2) { if (GameLevel == 0) { in_a2 = ChicagoCameraHack; } } else { if (GameLevel == 2) { in_a2 = VegasCameraHack; if (gCurrentMissionNumber == 0x17) { if (type != SPECIAL_CAMERA_SET2) { in_a2 = VegasCameraHack + 6; goto LAB_0004b418; } in_a2 = VegasCameraHack + 9; } else { if (gCurrentMissionNumber < 0x18) { if (gCurrentMissionNumber == 0x16) { in_a2 = INT_ARRAY_0009ed64 + 1; events.cameraEvent = (_EVENT *)0x1; camera_position.vy = -0x708; } } else { if (gCurrentMissionNumber == 0x1e) goto LAB_0004b42c; } } } else { if (GameLevel == 3) { if (gCurrentMissionNumber == 0x23) { psVar1 = (short *)0x9ed92; } else { in_a2 = RioCameraHack; if (0 < camera_position.vz) { in_a2 = RioCameraHack + 3; } } } } } } if (psVar1 == (short *)0x0) { camera_position.vx = *in_a2; camera_angle.vy = *(short *)(in_a2 + 1); camera_position.vz = in_a2[2]; } else { camera_position.vx = (event->position).vx + (int)*psVar1; camera_angle.vy = psVar1[1]; camera_position.vz = (event->position).vz + (int)psVar1[2]; } player.cameraPos.vx = camera_position.vx; player.cameraPos.vy = camera_position.vy; player.cameraPos.vz = camera_position.vz; player.cameraPos.pad = camera_position.pad; if (events.cameraEvent != (_EVENT *)0x0) { gStopPadReads = 1; } LAB_0004b5b8: if (type != SPECIAL_CAMERA_WAIT) { _camera_change = 1; VisibilityLists(VIS_SORT, 0); } return;*/ } // decompiled code // original method signature: // void /*$ra*/ ScreenShake(int count /*$a0*/, struct SVECTOR *ang /*$s0*/) // line 3144, offset 0x0004c280 /* begin block 1 */ // Start line: 3145 // Start offset: 0x0004C280 /* end block 1 */ // End offset: 0x0004C330 // End Line: 3150 /* begin block 2 */ // Start line: 13723 /* end block 2 */ // End Line: 13724 /* begin block 3 */ // Start line: 13724 /* end block 3 */ // End Line: 13725 void ScreenShake(int count, SVECTOR *ang) { UNIMPLEMENTED(); /* long lVar1; eventHaze = count << 2; lVar1 = Random2(0); if (eventHaze << 1 == 0) { trap(7); } camera_angle.vx = (ang->vx + (short)(lVar1 % (eventHaze << 1))) - (short)eventHaze; lVar1 = Random2(0); if (eventHaze * 2 == 0) { trap(7); } camera_angle.vy = (ang->vy + (short)(lVar1 % (eventHaze * 2))) - (short)eventHaze; eventHaze = eventHaze * 3; return; */ } // decompiled code // original method signature: // int /*$ra*/ DetonatorTimer() // line 3152, offset 0x0004b5fc /* begin block 1 */ // Start line: 3154 // Start offset: 0x0004B5FC // Variables: // static struct SVECTOR rememberCameraAngle; // offset 0x30 /* begin block 1.1 */ // Start line: 3168 // Start offset: 0x0004B698 /* begin block 1.1.1 */ // Start line: 3175 // Start offset: 0x0004B6B0 // Variables: // static int count; // offset 0x38 /* begin block 1.1.1.1 */ // Start line: 3179 // Start offset: 0x0004B6CC // Variables: // struct VECTOR pos; // stack offset -32 /* end block 1.1.1.1 */ // End offset: 0x0004B700 // End Line: 3184 /* begin block 1.1.1.2 */ // Start line: 3188 // Start offset: 0x0004B720 // Variables: // struct VECTOR pos; // stack offset -32 /* end block 1.1.1.2 */ // End offset: 0x0004B720 // End Line: 3189 /* end block 1.1.1 */ // End offset: 0x0004B7C8 // End Line: 3204 /* end block 1.1 */ // End offset: 0x0004B7DC // End Line: 3210 /* begin block 1.2 */ // Start line: 3218 // Start offset: 0x0004B864 // Variables: // struct _EVENT *ev; // $s0 // struct VECTOR pos; // stack offset -32 /* begin block 1.2.1 */ // Start line: 3247 // Start offset: 0x0004B9B0 // Variables: // struct VECTOR *epicentre; // $v1 /* end block 1.2.1 */ // End offset: 0x0004BA08 // End Line: 3260 /* end block 1.2 */ // End offset: 0x0004BA8C // End Line: 3275 /* end block 1 */ // End offset: 0x0004BAB0 // End Line: 3278 /* begin block 2 */ // Start line: 8082 /* end block 2 */ // End Line: 8083 /* begin block 3 */ // Start line: 8093 /* end block 3 */ // End Line: 8094 /* begin block 4 */ // Start line: 8094 /* end block 4 */ // End Line: 8095 /* begin block 5 */ // Start line: 8096 /* end block 5 */ // End Line: 8097 /* WARNING: Unknown calling convention yet parameter storage is locked */ int DetonatorTimer(void) { UNIMPLEMENTED(); return 0; /* _EVENT *ipos; int count; _EVENT *p_Var1; undefined4 local_2c; undefined4 local_28; undefined4 in_stack_ffffffdc; int local_20; ipos = firstMissionEvent; p_Var1 = event; if (gCurrentMissionNumber == 0x17) { if (detonator.timer - 3U < 0x11) { count = detonator.timer + -2; } else { if (8 < detonator.timer - 0x1fU) { if (detonator.timer == 0x15) { count_106 = count_106 + 1; if ((count_106 & 7) == 0) { AddExplosion((VECTOR)(ZEXT1216(CONCAT48(in_stack_ffffffdc, CONCAT44(local_28, local_2c))) << 0x20), camera_position.vx); } camera_position.vz = camera_position.vz + 0x96; if (INT_ARRAY_0009ed64[0] < camera_position.vz) { AddExplosion((VECTOR)CONCAT412(in_stack_ffffffdc, CONCAT48(local_28, CONCAT44(local_2c, 0x29a))), camera_position.vx); rememberCameraAngle_105 = camera_angle._0_4_; DAT_000aad54 = camera_angle._4_4_; DAT_000d7c28 = DAT_000d7c28 & 0xef; SetMissionComplete(); } else { detonator.timer = detonator.timer + 1; } player.cameraPos.vz = camera_position.vz; } else { if (detonator.timer < 0x16) { if (detonator.timer == 0) { SpecialCamera(SPECIAL_CAMERA_SET, 0); detonator.timer = 0x46; } } else { if (detonator.timer == 0x16) { SpecialCamera(SPECIAL_CAMERA_SET2, 0); } else { if (detonator.timer == 0x28) { BombThePlayerToHellAndBack(gCarWithABerm); rememberCameraAngle_105 = camera_angle._0_4_; DAT_000aad54 = camera_angle._4_4_; *(int *)(car_data[gCarWithABerm].st + 0x20) = *(int *)(car_data[gCarWithABerm].st + 0x20) + 200000; } } } } goto LAB_0004ba8c; } count = detonator.timer + -0x1e; } ScreenShake(count, (SVECTOR *)&rememberCameraAngle_105); goto LAB_0004ba8c; } if (detonator.timer - 0x8dU < 0x13) { ScreenShake(detonator.timer + -0x8c, (SVECTOR *)&rememberCameraAngle_105); Setup_Smoke((VECTOR *)ipos, 100, 500, 1, 0, &dummy, 0); goto LAB_0004ba8c; } if (detonator.timer == 0xa7) { p_Var1 = firstMissionEvent + 1; LAB_0004ba0c: p_Var1 = p_Var1 + 1; } else { if (detonator.timer < 0xa8) { if (detonator.timer == 0) { count = detonator.count + -1; p_Var1 = firstMissionEvent; if (detonator.count < 3) { while (detonator.count = count, detonator.count != -1) { AddExplosion((VECTOR)(ZEXT1216(CONCAT48(in_stack_ffffffdc, CONCAT44(local_28, local_2c))) << 0x20), (p_Var1->position).vx); count = detonator.count + -1; p_Var1 = p_Var1 + 1; } return 0; } detonator.timer = 200; SpecialCamera(SPECIAL_CAMERA_SET, 0); events.cameraEvent = (_EVENT *)0x1; rememberCameraAngle_105 = camera_angle._0_4_; DAT_000aad54 = camera_angle._4_4_; } else { if (detonator.timer == 0xa0) { ipos = firstMissionEvent + 1; if (GameLevel == 3) { event->flags = event->flags & 0xfffeU | 0x20; ipos = p_Var1; } AddExplosion((VECTOR)CONCAT412(in_stack_ffffffdc, CONCAT48(local_28, CONCAT44(local_2c, 0x29a))), (ipos->position).vx); } } goto LAB_0004ba8c; } p_Var1 = firstMissionEvent; if (detonator.timer == 0xb4) goto LAB_0004ba0c; if (detonator.timer != 0xbe) goto LAB_0004ba8c; } local_20 = (p_Var1->position).vx; if (GameLevel == 3) { local_20 = local_20 - boatOffset.vx; } AddExplosion((VECTOR)(ZEXT1216(CONCAT48(in_stack_ffffffdc, CONCAT44(local_28, local_2c))) << 0x20), local_20); LAB_0004ba8c: detonator.timer = detonator.timer + -1; return 1; */ } // decompiled code // original method signature: // void /*$ra*/ MultiCarEvent(struct _TARGET *target /*$a0*/) // line 3288, offset 0x0004bab0 /* begin block 1 */ // Start line: 3289 // Start offset: 0x0004BAB0 // Variables: // struct MULTICAR_DATA *data; // $s0 // int i; // $s1 // struct _EVENT *ev; // $s2 /* begin block 1.1 */ // Start line: 3301 // Start offset: 0x0004BAF8 // Variables: // int n; // $a1 /* end block 1.1 */ // End offset: 0x0004BAF8 // End Line: 3303 /* end block 1 */ // End offset: 0x0004BBD4 // End Line: 3313 /* begin block 2 */ // Start line: 8381 /* end block 2 */ // End Line: 8382 /* begin block 3 */ // Start line: 8392 /* end block 3 */ // End Line: 8393 /* begin block 4 */ // Start line: 8398 /* end block 4 */ // End Line: 8399 void MultiCarEvent(_TARGET *target) { UNIMPLEMENTED(); /* _EVENT *p_Var1; int i; _EVENT *p_Var2; long *plVar3; int iVar4; p_Var1 = firstEvent; iVar4 = 0; firstEvent = multiCar.event + multiCar.count; i = target->data[1]; plVar3 = target->data + 1; while (i != -0x80000000) { i = ((int)((int)multiCar.event - (int)event) * -0x33333333 >> 3) + multiCar.count; p_Var2 = event + i; (p_Var2->position).vx = *plVar3; (p_Var2->position).vy = -0x138; (p_Var2->position).vz = plVar3[1]; iVar4 = iVar4 + 1; p_Var2->rotation = *(short *)((int)plVar3 + 10); VisibilityLists(VIS_ADD, i); multiCar.count = multiCar.count + 1; plVar3 = plVar3 + 3; if (4 < iVar4) break; i = *plVar3; } multiCar.event[multiCar.count + -1].next = p_Var1; return; */ }