mirror of
https://github.com/OpenDriver2/REDRIVER2.git
synced 2024-11-25 03:42:34 +01:00
cb74b84f12
- add many unimplemented (unfinished)
5240 lines
123 KiB
C
5240 lines
123 KiB
C
#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;
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
|
|
|