mirror of
https://github.com/OpenDriver2/REDRIVER2.git
synced 2024-11-23 02:42:38 +01:00
bf1dde5d34
- game now goes to loading screen
6577 lines
174 KiB
C
6577 lines
174 KiB
C
#include "THISDUST.H"
|
|
#include "CIV_AI.H"
|
|
#include "LIBMATH.H"
|
|
|
|
int roadblockDelayDiff[] = { 1500, 1000, 800 };
|
|
|
|
char speedLimits[3] = { 56, 97, 138 };
|
|
|
|
CIV_AI_234fake civPingTest = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
|
char modelRandomList[] = { 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 0, 1, 0, 4 };
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ InitCar(struct _CAR_DATA *cp /*$s0*/, int direction /*$s6*/, long (*startPos)[4] /*$s2*/, unsigned char control /*$s4*/, int model /*stack 16*/, int palette /*stack 20*/, char *extraData /*stack 24*/)
|
|
// line 717, offset 0x00023de8
|
|
/* begin block 1 */
|
|
// Start line: 718
|
|
// Start offset: 0x00023DE8
|
|
// Variables:
|
|
// struct VECTOR tmpStart; // stack offset -48
|
|
/* end block 1 */
|
|
// End offset: 0x00024028
|
|
// End Line: 786
|
|
|
|
/* begin block 2 */
|
|
// Start line: 1434
|
|
/* end block 2 */
|
|
// End Line: 1435
|
|
|
|
int InitCar(_CAR_DATA *cp, int direction, long(*startPos)[4], unsigned char control, int model, int palette, char *extraData)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
VECTOR local_30;
|
|
|
|
ClearMem((char *)cp, 0x29c);
|
|
cp->wasOnGround = '\x01';
|
|
cp->id = (char)((int)(cp[-0x503].ap.old_clock + 2) * -0x24ca58e9 >> 2);
|
|
if (startPos == (long(*)[4])0x0) {
|
|
return 0;
|
|
}
|
|
(cp->ap).model = (char)model;
|
|
cp->lowDetail = -1;
|
|
(cp->ap).qy = 0;
|
|
(cp->ap).qw = 0;
|
|
(cp->ap).carCos = car_cosmetics + (model & 0xff);
|
|
local_30.vx = (*startPos)[0];
|
|
local_30.vy = (*startPos)[1];
|
|
local_30.vz = (*startPos)[2];
|
|
local_30.vy = MapHeight(&local_30);
|
|
local_30.vy = local_30.vy - ((cp->ap).carCos)->wheelDisp[0].vy;
|
|
if (control == '\0') {
|
|
return 1;
|
|
}
|
|
InitCarPhysics(cp, (long(*)[4])&local_30, direction);
|
|
(cp->ap).palette = (char)palette;
|
|
switch (control) {
|
|
case '\x01':
|
|
case '\a':
|
|
if (extraData == (char *)0x0) {
|
|
*(undefined4 *)cp->ai = 0;
|
|
}
|
|
else {
|
|
*(char **)cp->ai = extraData;
|
|
}
|
|
(&player)[(byte)cp->id].worldCentreCarId = cp->id;
|
|
cp->hndType = '\0';
|
|
break;
|
|
case '\x02':
|
|
cp->hndType = '\x01';
|
|
cp->controlFlags = extraData[0x11];
|
|
InitCivState(cp, extraData);
|
|
if (extraData == (char *)0x0) {
|
|
(cp->ap).palette = '\0';
|
|
}
|
|
else {
|
|
(cp->ap).palette = extraData[0x10];
|
|
}
|
|
break;
|
|
case '\x03':
|
|
InitCopState(cp, extraData);
|
|
(cp->ap).palette = '\0';
|
|
numCopCars = numCopCars + 1;
|
|
break;
|
|
case '\x04':
|
|
InitLead(cp);
|
|
leadCarId = ZEXT14((byte)cp->id);
|
|
cp->hndType = '\x05';
|
|
cp->controlType = control;
|
|
goto LAB_00023fe4;
|
|
}
|
|
cp->controlType = control;
|
|
LAB_00023fe4:
|
|
CreateDentableCar(cp);
|
|
DentCar(cp);
|
|
return 1;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// struct _CAR_DATA * /*$ra*/ FindClosestCar(int x /*$t4*/, int y /*$a1*/, int z /*$a2*/, int *distToCarSq /*$a3*/)
|
|
// line 891, offset 0x0002d11c
|
|
/* begin block 1 */
|
|
// Start line: 892
|
|
// Start offset: 0x0002D11C
|
|
// Variables:
|
|
// struct _CAR_DATA *retCar; // $t2
|
|
// struct _CAR_DATA *lcp; // $t0
|
|
// unsigned int retDistSq; // $t1
|
|
// int distSq; // $v0
|
|
// int dx; // $a0
|
|
// int dz; // $v1
|
|
/* end block 1 */
|
|
// End offset: 0x0002D220
|
|
// End Line: 915
|
|
|
|
/* begin block 2 */
|
|
// Start line: 1782
|
|
/* end block 2 */
|
|
// End Line: 1783
|
|
|
|
/* begin block 3 */
|
|
// Start line: 6497
|
|
/* end block 3 */
|
|
// End Line: 6498
|
|
|
|
_CAR_DATA * FindClosestCar(int x, int y, int z, int *distToCarSq)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
int iVar1;
|
|
uint uVar2;
|
|
int iVar3;
|
|
int iVar4;
|
|
_CAR_DATA *p_Var5;
|
|
uint uVar6;
|
|
_CAR_DATA *p_Var7;
|
|
|
|
p_Var7 = (_CAR_DATA *)0x0;
|
|
uVar6 = 0x7fffffff;
|
|
p_Var5 = car_data;
|
|
do {
|
|
if (p_Var5->controlType != '\0') {
|
|
iVar3 = (p_Var5->hd).where.t[1];
|
|
iVar1 = y - iVar3;
|
|
if (iVar1 < 0) {
|
|
iVar1 = iVar3 - y;
|
|
}
|
|
if (iVar1 < 800) {
|
|
iVar3 = x - (p_Var5->hd).where.t[0];
|
|
iVar1 = iVar3;
|
|
if (iVar3 < 0) {
|
|
iVar1 = -iVar3;
|
|
}
|
|
if (iVar1 < 0x1000) {
|
|
iVar4 = z - (p_Var5->hd).where.t[2];
|
|
iVar1 = iVar4;
|
|
if (iVar4 < 0) {
|
|
iVar1 = -iVar4;
|
|
}
|
|
if ((iVar1 < 0x1000) && (uVar2 = iVar3 * iVar3 + iVar4 * iVar4, uVar2 < uVar6)) {
|
|
uVar6 = uVar2;
|
|
p_Var7 = p_Var5;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
p_Var5 = p_Var5 + 1;
|
|
} while (p_Var5 <= (_CAR_DATA *)((int)&car_data[0x13].lastPad + 3U));
|
|
if (distToCarSq != (int *)0x0) {
|
|
*distToCarSq = uVar6;
|
|
}
|
|
return p_Var7;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ NotTravellingAlongCurve(int x /*$a0*/, int z /*$a1*/, int dir /*$s0*/, struct DRIVER2_CURVE *cv /*$a3*/)
|
|
// line 918, offset 0x0002d24c
|
|
/* begin block 1 */
|
|
// Start line: 919
|
|
// Start offset: 0x0002D24C
|
|
/* end block 1 */
|
|
// End offset: 0x0002D298
|
|
// End Line: 927
|
|
|
|
/* begin block 2 */
|
|
// Start line: 1803
|
|
/* end block 2 */
|
|
// End Line: 1804
|
|
|
|
/* begin block 3 */
|
|
// Start line: 7767
|
|
/* end block 3 */
|
|
// End Line: 7768
|
|
|
|
/* begin block 4 */
|
|
// Start line: 7769
|
|
/* end block 4 */
|
|
// End Line: 7770
|
|
|
|
int NotTravellingAlongCurve(int x, int z, int dir, DRIVER2_CURVE *cv)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
int iVar1;
|
|
|
|
iVar1 = ratan2(x - cv->Midx, z - cv->Midz);
|
|
return (uint)((int)(((dir - iVar1) + 0x800U & 0xfff) - 0x800) < 1) << 0xb;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ CivCarFX(struct _CAR_DATA *cp /*$s0*/)
|
|
// line 930, offset 0x0002d084
|
|
/* begin block 1 */
|
|
// Start line: 1860
|
|
/* end block 1 */
|
|
// End Line: 1861
|
|
|
|
void CivCarFX(_CAR_DATA *cp)
|
|
{
|
|
UNIMPLEMENTED();
|
|
/*
|
|
if (cp->ai[0xf9] != 3) {
|
|
if (*(int *)(cp->ai + 0x14) != -1) {
|
|
AddIndicatorLight(cp, (uint)cp->ai[0xf]);
|
|
}
|
|
if ((*(int *)(cp->ai + 0x18) != 0) && (*(int *)(cp->ai + 0x14) == -1)) {
|
|
AddIndicatorLight(cp, (uint)cp->ai[0xe]);
|
|
}
|
|
}
|
|
if (cp->ai[0x10] != 0) {
|
|
AddBrakeLight(cp);
|
|
}
|
|
return;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ GetNextRoadInfo(struct _CAR_DATA *cp /*$s7*/, int randomExit /*$a1*/, int *turnAngle /*stack 8*/, int *startDist /*stack 12*/, struct CIV_ROUTE_ENTRY *oldNode /*stack 16*/)
|
|
// line 981, offset 0x00024028
|
|
/* begin block 1 */
|
|
// Start line: 982
|
|
// Start offset: 0x00024028
|
|
// Variables:
|
|
// int oldOppDir; // $s4
|
|
// int i; // $a1
|
|
// int j; // $s6
|
|
// int newRoad; // $s3
|
|
// int numExits; // stack offset -88
|
|
// int currentRoadExit; // $t6
|
|
// int newNumLanes; // $a3
|
|
// int newDir; // stack offset -84
|
|
// int oppDir; // $s0
|
|
// struct DRIVER2_JUNCTION *jn; // $t5
|
|
// struct DRIVER2_CURVE *cv; // $s1
|
|
// struct DRIVER2_STRAIGHT *st; // $s5
|
|
// struct DRIVER2_STRAIGHT *tmpSt; // $a2
|
|
// struct DRIVER2_CURVE *tmpCv; // $s1
|
|
// short *jnExit; // $a2
|
|
// int newLane; // $s2
|
|
// char leftLane; // stack offset -80
|
|
// char rightLane; // stack offset -76
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 1042
|
|
// Start offset: 0x00024734
|
|
// Variables:
|
|
// char relExitId; // $fp
|
|
// static char validExitRelIdx[4][3][2]; // offset 0x0
|
|
// int addRoad; // $t9
|
|
|
|
/* begin block 1.1.1 */
|
|
// Start line: 982
|
|
// Start offset: 0x00024804
|
|
// Variables:
|
|
// int currentRoadExit; // $t6
|
|
// int newRoadExit; // $fp
|
|
|
|
/* begin block 1.1.1.1 */
|
|
// Start line: 982
|
|
// Start offset: 0x00024804
|
|
// Variables:
|
|
// int exitMod; // $a0
|
|
// int ret; // $a1
|
|
/* end block 1.1.1.1 */
|
|
// End offset: 0x00024870
|
|
// End Line: 982
|
|
/* end block 1.1.1 */
|
|
// End offset: 0x00024870
|
|
// End Line: 982
|
|
|
|
/* begin block 1.1.2 */
|
|
// Start line: 1091
|
|
// Start offset: 0x00024C18
|
|
// Variables:
|
|
// int x; // $v1
|
|
// int z; // $v0
|
|
// int dir; // stack offset -84
|
|
// struct DRIVER2_CURVE *cv; // $s1
|
|
|
|
/* begin block 1.1.2.1 */
|
|
// Start line: 1091
|
|
// Start offset: 0x00024C18
|
|
/* end block 1.1.2.1 */
|
|
// End offset: 0x00024C18
|
|
// End Line: 1091
|
|
/* end block 1.1.2 */
|
|
// End offset: 0x00024C18
|
|
// End Line: 1091
|
|
|
|
/* begin block 1.1.3 */
|
|
// Start line: 1112
|
|
// Start offset: 0x00025048
|
|
// Variables:
|
|
// int exitId; // $a1
|
|
|
|
/* begin block 1.1.3.1 */
|
|
// Start line: 1116
|
|
// Start offset: 0x0002506C
|
|
// Variables:
|
|
// char lane; // $v0
|
|
/* end block 1.1.3.1 */
|
|
// End offset: 0x000250C4
|
|
// End Line: 1132
|
|
|
|
/* begin block 1.1.3.2 */
|
|
// Start line: 982
|
|
// Start offset: 0x00025180
|
|
// Variables:
|
|
// int currentRoadExit; // $t6
|
|
|
|
/* begin block 1.1.3.2.1 */
|
|
// Start line: 982
|
|
// Start offset: 0x00025180
|
|
// Variables:
|
|
// int exitMod; // $a1
|
|
// int ret; // $a2
|
|
/* end block 1.1.3.2.1 */
|
|
// End offset: 0x000251E0
|
|
// End Line: 982
|
|
/* end block 1.1.3.2 */
|
|
// End offset: 0x000251E0
|
|
// End Line: 982
|
|
/* end block 1.1.3 */
|
|
// End offset: 0x000251EC
|
|
// End Line: 1147
|
|
|
|
/* begin block 1.1.4 */
|
|
// Start line: 982
|
|
// Start offset: 0x000251EC
|
|
// Variables:
|
|
// struct DRIVER2_JUNCTION *jn; // $t5
|
|
// int currentExit; // $a2
|
|
// int turnAngle; // $t1
|
|
// struct _CAR_DATA *cp; // $s7
|
|
// struct CIV_ROUTE_ENTRY *oldNode; // $t7
|
|
|
|
/* begin block 1.1.4.1 */
|
|
// Start line: 982
|
|
// Start offset: 0x000251EC
|
|
// Variables:
|
|
// unsigned short jnFlags; // $a0
|
|
// int i; // $a1
|
|
// int exitId; // $a3
|
|
/* end block 1.1.4.1 */
|
|
// End offset: 0x000252BC
|
|
// End Line: 982
|
|
/* end block 1.1.4 */
|
|
// End offset: 0x000252BC
|
|
// End Line: 982
|
|
|
|
/* begin block 1.1.5 */
|
|
// Start line: 1152
|
|
// Start offset: 0x000252BC
|
|
|
|
/* begin block 1.1.5.1 */
|
|
// Start line: 1173
|
|
// Start offset: 0x00025774
|
|
// Variables:
|
|
// int x; // $v1
|
|
// int z; // $v0
|
|
// int dir; // stack offset -84
|
|
// struct DRIVER2_CURVE *cv; // $s1
|
|
|
|
/* begin block 1.1.5.1.1 */
|
|
// Start line: 1173
|
|
// Start offset: 0x00025774
|
|
/* end block 1.1.5.1.1 */
|
|
// End offset: 0x00025774
|
|
// End Line: 1173
|
|
/* end block 1.1.5.1 */
|
|
// End offset: 0x00025774
|
|
// End Line: 1173
|
|
/* end block 1.1.5 */
|
|
// End offset: 0x00025BC8
|
|
// End Line: 1184
|
|
/* end block 1.1 */
|
|
// End offset: 0x00025BC8
|
|
// End Line: 1184
|
|
|
|
/* begin block 1.2 */
|
|
// Start line: 1192
|
|
// Start offset: 0x00025BD0
|
|
// Variables:
|
|
// int i; // $a1
|
|
// int dx; // $v1
|
|
// int dz; // $a0
|
|
// int numLanes; // $fp
|
|
// int *pNewLane; // $s3
|
|
// int laneFromLeft; // $a3
|
|
// int laneFromRight; // $v1
|
|
|
|
/* begin block 1.2.1 */
|
|
// Start line: 1255
|
|
// Start offset: 0x00025FE4
|
|
// Variables:
|
|
// int preferredNewLane; // $t1
|
|
/* end block 1.2.1 */
|
|
// End offset: 0x00026314
|
|
// End Line: 1283
|
|
|
|
/* begin block 1.2.2 */
|
|
// Start line: 1286
|
|
// Start offset: 0x00026348
|
|
// Variables:
|
|
// int preferredNewLane; // $s4
|
|
|
|
/* begin block 1.2.2.1 */
|
|
// Start line: 1286
|
|
// Start offset: 0x00026348
|
|
// Variables:
|
|
// int x; // $v1
|
|
// int z; // $v0
|
|
// struct DRIVER2_CURVE *cv; // $s1
|
|
|
|
/* begin block 1.2.2.1.1 */
|
|
// Start line: 1286
|
|
// Start offset: 0x00026348
|
|
/* end block 1.2.2.1.1 */
|
|
// End offset: 0x00026348
|
|
// End Line: 1286
|
|
/* end block 1.2.2.1 */
|
|
// End offset: 0x00026348
|
|
// End Line: 1286
|
|
/* end block 1.2.2 */
|
|
// End offset: 0x0002669C
|
|
// End Line: 1313
|
|
/* end block 1.2 */
|
|
// End offset: 0x000267A4
|
|
// End Line: 1326
|
|
/* end block 1 */
|
|
// End offset: 0x00026964
|
|
// End Line: 1350
|
|
|
|
/* begin block 2 */
|
|
// Start line: 1783
|
|
/* end block 2 */
|
|
// End Line: 1784
|
|
|
|
/* begin block 3 */
|
|
// Start line: 1979
|
|
/* end block 3 */
|
|
// End Line: 1980
|
|
|
|
/* WARNING: Type propagation algorithm not settling */
|
|
|
|
int GetNextRoadInfo(_CAR_DATA *cp, int randomExit, int *turnAngle, int *startDist, CIV_ROUTE_ENTRY *oldNode)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
byte bVar1;
|
|
short sVar2;
|
|
ushort uVar3;
|
|
bool bVar4;
|
|
bool bVar5;
|
|
byte bVar6;
|
|
uint uVar7;
|
|
uint uVar8;
|
|
long lVar9;
|
|
int iVar10;
|
|
int iVar11;
|
|
int iVar12;
|
|
int iVar13;
|
|
int iVar14;
|
|
DRIVER2_JUNCTION *pDVar15;
|
|
uint *puVar16;
|
|
int iVar17;
|
|
uint uVar18;
|
|
int iVar19;
|
|
uint uVar20;
|
|
ushort *puVar21;
|
|
DRIVER2_STRAIGHT *pDVar22;
|
|
byte *pbVar23;
|
|
DRIVER2_CURVE *pDVar24;
|
|
uint uVar25;
|
|
uint uVar26;
|
|
uint uVar27;
|
|
int *piVar28;
|
|
uint uVar29;
|
|
DRIVER2_STRAIGHT *pDVar30;
|
|
int unaff_s8;
|
|
int local_58;
|
|
int local_54;
|
|
uint local_50;
|
|
uint local_4c;
|
|
|
|
currentRoadId = *(int *)cp->ai;
|
|
pDVar30 = (DRIVER2_STRAIGHT *)0x0;
|
|
if ((((currentRoadId & 0xffffe000U) == 0) &&
|
|
((int)(currentRoadId & 0x1fffU) < NumDriver2Straights)) && (-1 < currentRoadId)) {
|
|
pDVar30 = Driver2StraightsPtr + currentRoadId;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) == 0xff010000) {
|
|
uVar7 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar7 = (int)(uint)(byte)pDVar30->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
uVar7 = uVar7 & 1;
|
|
uVar29 = uVar7 << 0xb;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) == 0xff010000) {
|
|
uVar8 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar8 = (int)(uint)(byte)pDVar30->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
tmpNewRoad = (int)pDVar30->ConnectIdx[(uVar8 & 1) * 2];
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) == 0xff010000) {
|
|
uVar8 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar8 = (int)(uint)(byte)pDVar30->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
iVar17 = 2;
|
|
if ((uVar8 & 1) != 0) {
|
|
iVar17 = 6;
|
|
}
|
|
INT_000aaadc = (int)*(short *)((int)pDVar30->ConnectIdx + iVar17);
|
|
uVar25 = ((uint)(byte)pDVar30->NumLanes & 0xf) * 2;
|
|
uVar8 = uVar25;
|
|
do {
|
|
do {
|
|
uVar8 = uVar8 - 1;
|
|
uVar18 = uVar25;
|
|
if ((int)uVar8 < 0) goto LAB_00024288;
|
|
} while (((((int)(uint)(byte)pDVar30->AILanes >> ((int)uVar8 / 2 & 0x1fU) & 1U) == 0) ||
|
|
((uVar8 == 0 && ((pDVar30->NumLanes & 0x40U) != 0)))) ||
|
|
((((uint)(byte)pDVar30->NumLanes & 0xffffff0f) * 2 - 1 == uVar8 &&
|
|
((pDVar30->NumLanes & 0x80U) != 0))));
|
|
uVar18 = uVar8;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar18 = (int)(uint)(byte)pDVar30->LaneDirs >> ((int)uVar8 / 2 & 0x1fU);
|
|
}
|
|
test42 = (uVar18 ^ 1) & 1;
|
|
uVar18 = uVar8;
|
|
} while (uVar7 == 0);
|
|
LAB_00024288:
|
|
if (uVar7 == 0) {
|
|
local_50 = uVar18 & 0xff;
|
|
}
|
|
else {
|
|
local_4c = uVar18 & 0xff;
|
|
}
|
|
uVar25 = (uint)(byte)pDVar30->NumLanes;
|
|
uVar26 = (uVar25 & 0xf) << 1;
|
|
uVar18 = (uint)((byte)pDVar30->NumLanes >> 6) & 1;
|
|
uVar8 = uVar26;
|
|
if (uVar18 < uVar26) {
|
|
do {
|
|
if (((((int)(uint)(byte)pDVar30->AILanes >> ((int)uVar18 / 2 & 0x1fU) & 1U) != 0) &&
|
|
((uVar18 != 0 || ((pDVar30->NumLanes & 0x40U) == 0)))) &&
|
|
(((uVar25 & 0xffffff0f) * 2 - 1 != uVar18 || ((uVar25 & 0x80) == 0)))) {
|
|
uVar8 = uVar18;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar8 = (int)(uint)(byte)pDVar30->LaneDirs >> ((int)uVar18 / 2 & 0x1fU);
|
|
}
|
|
test555 = (uVar8 ^ 1) & 1;
|
|
uVar8 = uVar18;
|
|
if (test555 == 0) {
|
|
if (uVar7 != 0) break;
|
|
}
|
|
else {
|
|
if (uVar7 == 0) break;
|
|
}
|
|
}
|
|
uVar25 = (uint)(byte)pDVar30->NumLanes;
|
|
uVar18 = uVar18 + 1;
|
|
uVar8 = uVar26;
|
|
} while ((int)uVar18 < (int)((uVar25 & 0xffffff0f) << 1));
|
|
}
|
|
if (uVar7 != 0) goto LAB_000246dc;
|
|
LAB_000246ec:
|
|
local_4c = uVar8 & 0xff;
|
|
}
|
|
else {
|
|
if ((currentRoadId & 0xffffe000U) != 0x4000) {
|
|
return 0;
|
|
}
|
|
if (NumDriver2Curves <= (int)(currentRoadId & 0x1fffU)) {
|
|
return 0;
|
|
}
|
|
if (currentRoadId < 0) {
|
|
return 0;
|
|
}
|
|
pDVar24 = Driver2CurvesPtr + (currentRoadId - 0x4000);
|
|
if (*(short *)&pDVar24->NumLanes == -0xff) {
|
|
uVar7 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar7 = (int)(uint)(byte)pDVar24->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
uVar7 = uVar7 & 1;
|
|
uVar29 = uVar7 << 0xb;
|
|
if (*(short *)&pDVar24->NumLanes == -0xff) {
|
|
uVar8 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar8 = (int)(uint)(byte)pDVar24->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
tmpNewRoad = (int)pDVar24->ConnectIdx[(uVar8 & 1) * 2];
|
|
if (*(short *)&pDVar24->NumLanes == -0xff) {
|
|
uVar8 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar8 = (int)(uint)(byte)pDVar24->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
iVar17 = 2;
|
|
if ((uVar8 & 1) != 0) {
|
|
iVar17 = 6;
|
|
}
|
|
INT_000aaadc = (int)*(short *)((int)pDVar24->ConnectIdx + iVar17);
|
|
uVar25 = ((uint)(byte)pDVar24->NumLanes & 0xf) * 2;
|
|
uVar8 = uVar25;
|
|
do {
|
|
do {
|
|
uVar8 = uVar8 - 1;
|
|
uVar18 = uVar25;
|
|
if ((int)uVar8 < 0) goto LAB_000245c0;
|
|
} while (((((int)(uint)(byte)pDVar24->AILanes >> ((int)uVar8 / 2 & 0x1fU) & 1U) == 0) ||
|
|
((uVar8 == 0 && ((pDVar24->NumLanes & 0x40U) != 0)))) ||
|
|
((((uint)(byte)pDVar24->NumLanes & 0xffffff0f) * 2 - 1 == uVar8 &&
|
|
((pDVar24->NumLanes & 0x80U) != 0))));
|
|
uVar18 = uVar8;
|
|
if (*(short *)&pDVar24->NumLanes != -0xff) {
|
|
uVar18 = (int)(uint)(byte)pDVar24->LaneDirs >> ((int)uVar8 / 2 & 0x1fU);
|
|
}
|
|
test42 = (uVar18 ^ 1) & 1;
|
|
uVar18 = uVar8;
|
|
} while (uVar7 == 0);
|
|
LAB_000245c0:
|
|
if (uVar7 == 0) {
|
|
local_50 = uVar18 & 0xff;
|
|
}
|
|
else {
|
|
local_4c = uVar18 & 0xff;
|
|
}
|
|
uVar25 = (uint)(byte)pDVar24->NumLanes;
|
|
uVar26 = (uVar25 & 0xf) << 1;
|
|
uVar18 = (uint)((byte)pDVar24->NumLanes >> 6) & 1;
|
|
uVar8 = uVar26;
|
|
if (uVar18 < uVar26) {
|
|
do {
|
|
if (((((int)(uint)(byte)pDVar24->AILanes >> ((int)uVar18 / 2 & 0x1fU) & 1U) != 0) &&
|
|
((uVar18 != 0 || ((pDVar24->NumLanes & 0x40U) == 0)))) &&
|
|
(((uVar25 & 0xffffff0f) * 2 - 1 != uVar18 || ((uVar25 & 0x80) == 0)))) {
|
|
uVar8 = uVar18;
|
|
if (*(short *)&pDVar24->NumLanes != -0xff) {
|
|
uVar8 = (int)(uint)(byte)pDVar24->LaneDirs >> ((int)uVar18 / 2 & 0x1fU);
|
|
}
|
|
test555 = (uVar8 ^ 1) & 1;
|
|
uVar8 = uVar18;
|
|
if (test555 == 0) {
|
|
if (uVar7 != 0) break;
|
|
}
|
|
else {
|
|
if (uVar7 == 0) break;
|
|
}
|
|
}
|
|
uVar25 = (uint)(byte)pDVar24->NumLanes;
|
|
uVar18 = uVar18 + 1;
|
|
uVar8 = uVar26;
|
|
} while ((int)uVar18 < (int)((uVar25 & 0xffffff0f) << 1));
|
|
}
|
|
if (uVar7 == 0) goto LAB_000246ec;
|
|
LAB_000246dc:
|
|
local_50 = uVar8 & 0xff;
|
|
}
|
|
iVar17 = tmpNewRoad;
|
|
uVar7 = 0xffffffff;
|
|
if ((((tmpNewRoad & 0xffffe000U) != 0x2000) ||
|
|
(NumDriver2Junctions <= (int)(tmpNewRoad & 0x1fffU))) || (tmpNewRoad < 0)) {
|
|
iVar17 = 0;
|
|
if (turnAngle == (int *)0x0) goto LAB_00026928;
|
|
*turnAngle = 0;
|
|
newExit = -1;
|
|
do {
|
|
piVar28 = tmpNewLane + iVar17;
|
|
uVar7 = (&tmpNewRoad)[iVar17];
|
|
if (uVar7 == 0xffffffff) {
|
|
(&laneFit)[iVar17] = 0x29a;
|
|
}
|
|
else {
|
|
if ((((uVar7 & 0xffffe000) == 0) && ((int)(uVar7 & 0x1fff) < NumDriver2Straights)) &&
|
|
(-1 < (int)uVar7)) {
|
|
pDVar30 = Driver2StraightsPtr + uVar7;
|
|
tmpStr2[iVar17] = pDVar30;
|
|
uVar7 = (uint)(ushort)pDVar30->angle & 0xfff;
|
|
uVar29 = (uint)(byte)pDVar30->NumLanes & 0xffffff0f;
|
|
test555 = (oldNode->x - pDVar30->Midx) * (int)rcossin_tbl[uVar7 * 2 + 1] -
|
|
(oldNode->z - pDVar30->Midz) * (int)rcossin_tbl[uVar7 * 2];
|
|
test42 = uVar29 - ((test555 + 0x800 >> 0xc) + 0x200 >> 9);
|
|
*piVar28 = test42;
|
|
unaff_s8 = uVar29 * 2;
|
|
uVar29 = ((uint)(byte)pDVar30->NumLanes & 0xffffff0f) * 2;
|
|
uVar7 = uVar29;
|
|
do {
|
|
do {
|
|
uVar7 = uVar7 - 1;
|
|
uVar8 = uVar29;
|
|
if ((int)uVar7 < 0) goto LAB_00025e00;
|
|
} while (((((int)(uint)(byte)pDVar30->AILanes >> ((int)uVar7 / 2 & 0x1fU) & 1U) == 0) ||
|
|
((uVar7 == 0 && ((pDVar30->NumLanes & 0x40U) != 0)))) ||
|
|
((((uint)(byte)pDVar30->NumLanes & 0xffffff0f) * 2 - 1 == uVar7 &&
|
|
((pDVar30->NumLanes & 0x80U) != 0))));
|
|
uVar8 = uVar7;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar8 = (int)(uint)(byte)pDVar30->LaneDirs >> ((int)uVar7 / 2 & 0x1fU);
|
|
}
|
|
test42 = (uVar8 ^ 1) & 1;
|
|
uVar8 = uVar7;
|
|
} while ((((int)oldNode->dir - (int)pDVar30->angle) + 0x400U & 0x800) == 0);
|
|
LAB_00025e00:
|
|
if ((uVar8 == 0) || (unaff_s8 <= (int)uVar8)) {
|
|
(&laneFit)[iVar17] = 0x29a;
|
|
goto LAB_00025f34;
|
|
}
|
|
}
|
|
else {
|
|
pDVar24 = Driver2CurvesPtr + (&tmpNewRoad)[iVar17] + -0x4000;
|
|
tmpCrv2[iVar17] = pDVar24;
|
|
iVar11 = oldNode->x - pDVar24->Midx;
|
|
iVar14 = oldNode->z - pDVar24->Midz;
|
|
unaff_s8 = ((uint)(byte)pDVar24->NumLanes & 0xffffff0f) * 2;
|
|
iVar11 = SquareRoot0(iVar11 * iVar11 + iVar14 * iVar14);
|
|
if (iVar11 < 0) {
|
|
iVar11 = iVar11 + 0x1ff;
|
|
}
|
|
*piVar28 = (iVar11 >> 9) + (uint)(byte)pDVar24->inside * -2;
|
|
}
|
|
iVar14 = unaff_s8 + -1;
|
|
test123 = *piVar28;
|
|
iVar11 = test123;
|
|
if ((-1 < test123) && (iVar11 = test123 - iVar14, test123 <= iVar14)) {
|
|
iVar11 = 0;
|
|
}
|
|
(&laneFit)[iVar17] = iVar11;
|
|
if (iVar14 <= *piVar28) {
|
|
*piVar28 = iVar14;
|
|
}
|
|
newExit = iVar17;
|
|
if (*piVar28 < 0) {
|
|
*piVar28 = 0;
|
|
}
|
|
}
|
|
LAB_00025f34:
|
|
iVar17 = iVar17 + 1;
|
|
} while (iVar17 < 2);
|
|
if ((newExit == -1) || ((&laneFit)[newExit] == 0x29a)) goto LAB_00026928;
|
|
iVar11 = laneFit;
|
|
if (laneFit < 0) {
|
|
iVar11 = -laneFit;
|
|
}
|
|
iVar14 = INT_000aab2c;
|
|
if (INT_000aab2c < 0) {
|
|
iVar14 = -INT_000aab2c;
|
|
}
|
|
newExit = (uint)(iVar11 < iVar14) ^ 1;
|
|
uVar25 = (&tmpNewRoad)[newExit];
|
|
uVar8 = tmpNewLane[newExit];
|
|
if (cp->ai[0xc] != 7) {
|
|
if ((((uVar25 & 0xffffe000) == 0) && ((int)(uVar25 & 0x1fff) < NumDriver2Straights)) &&
|
|
(-1 < (int)uVar25)) {
|
|
pDVar30 = Driver2StraightsPtr + uVar25;
|
|
uVar7 = ((int)oldNode->dir - (int)pDVar30->angle) + 0x400U & 0x800;
|
|
test123 = local_54;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) == 0xff010000) {
|
|
if ((uVar8 & 1) == 0) goto LAB_00026064;
|
|
LAB_00026074:
|
|
if (uVar7 != 0) goto LAB_00026318;
|
|
}
|
|
else {
|
|
if (((int)(uint)(byte)pDVar30->LaneDirs >> ((int)uVar8 / 2 & 0x1fU) & 1U) != 0)
|
|
goto LAB_00026074;
|
|
LAB_00026064:
|
|
if (uVar7 == 0) goto LAB_00026318;
|
|
}
|
|
uVar29 = (uint)(byte)pDVar30->NumLanes;
|
|
uVar26 = (uVar29 & 0xf) * 2;
|
|
uVar18 = uVar26;
|
|
do {
|
|
while (true) {
|
|
do {
|
|
uVar18 = uVar18 - 1;
|
|
if ((int)uVar18 < 0) goto LAB_0002616c;
|
|
} while (((((int)(uint)(byte)pDVar30->AILanes >> ((int)uVar18 / 2 & 0x1fU) & 1U) == 0)
|
|
|| ((uVar18 == 0 && ((pDVar30->NumLanes & 0x40U) != 0)))) ||
|
|
(((uVar29 & 0xffffff0f) * 2 - 1 == uVar18 && ((uVar29 & 0x80) != 0))));
|
|
uVar29 = uVar18;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar29 = (int)(uint)(byte)pDVar30->LaneDirs >> ((int)uVar18 / 2 & 0x1fU);
|
|
}
|
|
test42 = (uVar29 ^ 1) & 1;
|
|
if (test42 == 0) break;
|
|
if (uVar7 == 0) goto LAB_00026154;
|
|
uVar29 = (uint)(byte)pDVar30->NumLanes;
|
|
}
|
|
uVar29 = (uint)(byte)pDVar30->NumLanes;
|
|
} while (uVar7 == 0);
|
|
LAB_00026154:
|
|
uVar29 = (uint)(byte)pDVar30->NumLanes;
|
|
uVar26 = uVar18;
|
|
LAB_0002616c:
|
|
if ((int)uVar26 < 0) {
|
|
uVar26 = 0x2a;
|
|
}
|
|
uVar27 = (uVar29 & 0xf) << 1;
|
|
uVar20 = uVar29 >> 6 & 1;
|
|
uVar18 = uVar27;
|
|
if (uVar20 < uVar27) {
|
|
do {
|
|
uVar18 = uVar20;
|
|
if (((((int)(uint)(byte)pDVar30->AILanes >> ((int)uVar18 / 2 & 0x1fU) & 1U) != 0) &&
|
|
((uVar18 != 0 || ((pDVar30->NumLanes & 0x40U) == 0)))) &&
|
|
(((uVar29 & 0xffffff0f) * 2 - 1 != uVar18 || ((uVar29 & 0x80) == 0)))) {
|
|
uVar29 = uVar18;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar29 = (int)(uint)(byte)pDVar30->LaneDirs >> ((int)uVar18 / 2 & 0x1fU);
|
|
}
|
|
test555 = (uVar29 ^ 1) & 1;
|
|
if (test555 == 0) {
|
|
if (uVar7 != 0) break;
|
|
}
|
|
else {
|
|
if (uVar7 == 0) break;
|
|
}
|
|
}
|
|
uVar29 = (uint)(byte)pDVar30->NumLanes;
|
|
uVar20 = uVar18 + 1;
|
|
uVar18 = uVar27;
|
|
} while ((int)uVar20 < (int)((uVar29 & 0xffffff0f) << 1));
|
|
}
|
|
if (unaff_s8 <= (int)uVar18) {
|
|
uVar18 = 0x2a;
|
|
}
|
|
iVar11 = uVar26 - uVar8;
|
|
if ((uVar26 == 0x2a) && (uVar18 == 0x2a)) goto LAB_00026928;
|
|
if (iVar11 < 0) {
|
|
iVar11 = uVar8 - uVar26;
|
|
}
|
|
if ((int)(uVar18 - uVar8) < 0) {
|
|
if (iVar11 <= (int)(uVar8 - uVar18)) {
|
|
uVar18 = uVar26;
|
|
}
|
|
}
|
|
else {
|
|
if (iVar11 <= (int)(uVar18 - uVar8)) {
|
|
uVar18 = uVar26;
|
|
}
|
|
}
|
|
puVar16 = (uint *)(&laneFit + iVar17);
|
|
*puVar16 = uVar18;
|
|
uVar7 = unaff_s8 - 1;
|
|
if (-1 < (int)uVar18) {
|
|
if ((int)uVar7 < (int)uVar18) {
|
|
*puVar16 = uVar18 - uVar7;
|
|
}
|
|
else {
|
|
*puVar16 = 0;
|
|
}
|
|
}
|
|
uVar8 = uVar18;
|
|
if ((int)uVar7 <= (int)uVar18) {
|
|
uVar8 = uVar7;
|
|
}
|
|
if ((int)uVar8 < 0) {
|
|
uVar8 = 0;
|
|
}
|
|
}
|
|
LAB_00026318:
|
|
if ((((uVar25 & 0xffffe000) == 0x4000) && ((int)(uVar25 & 0x1fff) < NumDriver2Curves)) &&
|
|
(-1 < (int)uVar25)) {
|
|
sVar2 = oldNode->dir;
|
|
pDVar24 = Driver2CurvesPtr + (uVar25 - 0x4000);
|
|
iVar11 = ratan2(oldNode->x - pDVar24->Midx, oldNode->z - pDVar24->Midz);
|
|
bVar5 = (int)(((sVar2 - iVar11) + 0x800U & 0xfff) - 0x800) < 1;
|
|
if (*(short *)&pDVar24->NumLanes == -0xff) {
|
|
if ((uVar8 & 1) == 0) goto LAB_000263fc;
|
|
LAB_0002640c:
|
|
if (bVar5) goto LAB_0002669c;
|
|
}
|
|
else {
|
|
if (((int)(uint)(byte)pDVar24->LaneDirs >> ((int)uVar8 / 2 & 0x1fU) & 1U) != 0)
|
|
goto LAB_0002640c;
|
|
LAB_000263fc:
|
|
if (!bVar5) goto LAB_0002669c;
|
|
}
|
|
uVar7 = (uint)(byte)pDVar24->NumLanes;
|
|
uVar18 = (uVar7 & 0xf) * 2;
|
|
uVar29 = uVar18;
|
|
do {
|
|
while (true) {
|
|
do {
|
|
uVar29 = uVar29 - 1;
|
|
if ((int)uVar29 < 0) goto LAB_000264fc;
|
|
} while (((((int)(uint)(byte)pDVar24->AILanes >> ((int)uVar29 / 2 & 0x1fU) & 1U) == 0)
|
|
|| ((uVar29 == 0 && ((pDVar24->NumLanes & 0x40U) != 0)))) ||
|
|
(((uVar7 & 0xffffff0f) * 2 - 1 == uVar29 && ((uVar7 & 0x80) != 0))));
|
|
uVar7 = uVar29;
|
|
if (*(short *)&pDVar24->NumLanes != -0xff) {
|
|
uVar7 = (int)(uint)(byte)pDVar24->LaneDirs >> ((int)uVar29 / 2 & 0x1fU);
|
|
}
|
|
test42 = (uVar7 ^ 1) & 1;
|
|
if (test42 == 0) break;
|
|
if (!bVar5) goto LAB_000264e4;
|
|
uVar7 = (uint)(byte)pDVar24->NumLanes;
|
|
}
|
|
uVar7 = (uint)(byte)pDVar24->NumLanes;
|
|
} while (!bVar5);
|
|
LAB_000264e4:
|
|
uVar7 = (uint)(byte)pDVar24->NumLanes;
|
|
uVar18 = uVar29;
|
|
LAB_000264fc:
|
|
if ((int)uVar18 < 0) {
|
|
uVar18 = 0x2a;
|
|
}
|
|
uVar20 = (uVar7 & 0xf) << 1;
|
|
uVar26 = uVar7 >> 6 & 1;
|
|
uVar29 = uVar20;
|
|
if (uVar26 < uVar20) {
|
|
do {
|
|
uVar29 = uVar26;
|
|
if (((((int)(uint)(byte)pDVar24->AILanes >> ((int)uVar29 / 2 & 0x1fU) & 1U) != 0) &&
|
|
((uVar29 != 0 || ((pDVar24->NumLanes & 0x40U) == 0)))) &&
|
|
(((uVar7 & 0xffffff0f) * 2 - 1 != uVar29 || ((uVar7 & 0x80) == 0)))) {
|
|
uVar7 = uVar29;
|
|
if (*(short *)&pDVar24->NumLanes != -0xff) {
|
|
uVar7 = (int)(uint)(byte)pDVar24->LaneDirs >> ((int)uVar29 / 2 & 0x1fU);
|
|
}
|
|
test555 = (uVar7 ^ 1) & 1;
|
|
if (test555 == 0) {
|
|
if (bVar5) break;
|
|
}
|
|
else {
|
|
if (!bVar5) break;
|
|
}
|
|
}
|
|
uVar7 = (uint)(byte)pDVar24->NumLanes;
|
|
uVar26 = uVar29 + 1;
|
|
uVar29 = uVar20;
|
|
} while ((int)uVar26 < (int)((uVar7 & 0xffffff0f) << 1));
|
|
}
|
|
if (unaff_s8 <= (int)uVar29) {
|
|
uVar29 = 0x2a;
|
|
}
|
|
iVar11 = uVar18 - uVar8;
|
|
if ((uVar18 == 0x2a) && (uVar29 == 0x2a)) goto LAB_00026928;
|
|
if (iVar11 < 0) {
|
|
iVar11 = uVar8 - uVar18;
|
|
}
|
|
if ((int)(uVar29 - uVar8) < 0) {
|
|
if (iVar11 <= (int)(uVar8 - uVar29)) {
|
|
uVar29 = uVar18;
|
|
}
|
|
}
|
|
else {
|
|
if (iVar11 <= (int)(uVar29 - uVar8)) {
|
|
uVar29 = uVar18;
|
|
}
|
|
}
|
|
puVar16 = (uint *)(&laneFit + iVar17);
|
|
*puVar16 = uVar29;
|
|
uVar7 = unaff_s8 - 1;
|
|
if (-1 < (int)uVar29) {
|
|
if ((int)uVar7 < (int)uVar29) {
|
|
*puVar16 = uVar29 - uVar7;
|
|
}
|
|
else {
|
|
*puVar16 = 0;
|
|
}
|
|
}
|
|
uVar8 = uVar29;
|
|
if ((int)uVar7 <= (int)uVar29) {
|
|
uVar8 = uVar7;
|
|
}
|
|
if ((int)uVar8 < 0) {
|
|
uVar8 = 0;
|
|
}
|
|
}
|
|
LAB_0002669c:
|
|
if ((&laneFit)[newExit] != 0) {
|
|
iVar17 = ((int)oldNode + (-0x1b0 - (int)cp) >> 4) + 1;
|
|
*(int *)(cp->ai + 0x14) = iVar17;
|
|
if (0xc < iVar17) {
|
|
*(undefined4 *)(cp->ai + 0x14) = 0;
|
|
}
|
|
bVar6 = (byte)((uint)(&laneFit)[newExit] >> 0x18);
|
|
if ((((uVar25 & 0xffffe000) == 0) && ((int)(uVar25 & 0x1fff) < NumDriver2Straights)) &&
|
|
(-1 < (int)uVar25)) {
|
|
if ((*(uint *)(tmpStr2[newExit]->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
bVar1 = tmpStr2[newExit]->LaneDirs;
|
|
goto LAB_00026788;
|
|
}
|
|
LAB_00026774:
|
|
bVar6 = ((byte)uVar8 ^ 1) & 1 ^ bVar6 >> 7;
|
|
}
|
|
else {
|
|
if (*(short *)&tmpCrv2[newExit]->NumLanes == -0xff) goto LAB_00026774;
|
|
bVar1 = tmpCrv2[newExit]->LaneDirs;
|
|
LAB_00026788:
|
|
bVar6 = ((byte)((int)(uint)bVar1 >> ((int)uVar8 / 2 & 0x1fU)) ^ 1) & 1 ^ bVar6 >> 7;
|
|
}
|
|
cp->ai[0xf] = bVar6;
|
|
}
|
|
}
|
|
goto LAB_000267a4;
|
|
}
|
|
local_58 = 0;
|
|
cp->ai[0x12] = 0;
|
|
pDVar15 = Driver2JunctionsPtr + iVar17 + -0x2000;
|
|
if ((int)pDVar15->ExitIdx[0] == currentRoadId) {
|
|
iVar11 = 0;
|
|
}
|
|
else {
|
|
iVar17 = 1;
|
|
do {
|
|
iVar14 = iVar17;
|
|
iVar11 = -1;
|
|
if (3 < iVar14) break;
|
|
iVar17 = iVar14 + 1;
|
|
iVar11 = iVar14;
|
|
} while ((int)pDVar15->ExitIdx[iVar14] != currentRoadId);
|
|
}
|
|
if (iVar11 == -1) goto LAB_00026928;
|
|
iVar17 = 1;
|
|
iVar14 = 0;
|
|
do {
|
|
iVar10 = iVar17;
|
|
iVar12 = iVar11 + iVar10;
|
|
iVar17 = iVar12;
|
|
if (iVar12 < 0) {
|
|
iVar17 = iVar12 + 3;
|
|
}
|
|
iVar17 = (iVar12 + (iVar17 >> 2) * -4) * 0x1000000;
|
|
iVar12 = iVar17 >> 0x18;
|
|
puVar21 = (ushort *)(pDVar15->ExitIdx + iVar12);
|
|
bVar5 = false;
|
|
if (*puVar21 != 0xffff) {
|
|
iVar19 = 0;
|
|
iVar13 = (iVar12 + 4) - iVar11;
|
|
iVar12 = iVar13;
|
|
if (iVar13 < 0) {
|
|
iVar12 = iVar13 + 3;
|
|
}
|
|
iVar13 = iVar13 + (iVar12 >> 2) * -4;
|
|
if (iVar13 == 1) {
|
|
iVar19 = -0x400;
|
|
}
|
|
else {
|
|
if (1 < iVar13) {
|
|
if (iVar13 == 2) {
|
|
iVar19 = 0;
|
|
}
|
|
else {
|
|
if (iVar13 == 3) {
|
|
iVar19 = 0x400;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*turnAngle = iVar19;
|
|
test123 = 0x29a;
|
|
test555 = 0x29a;
|
|
test42 = 0x29a;
|
|
uVar3 = *puVar21;
|
|
iVar19 = oldNode->dir + iVar19;
|
|
if ((((uVar3 & 0xe000) == 0) && ((int)((uint)uVar3 & 0x1fff) < NumDriver2Straights)) &&
|
|
(-1 < (int)(short)uVar3)) {
|
|
pDVar22 = Driver2StraightsPtr + (int)(short)uVar3;
|
|
iVar12 = *turnAngle;
|
|
uVar8 = (iVar19 - pDVar22->angle) + 0x400U & 0x800;
|
|
if (uVar8 == 0) {
|
|
iVar12 = -iVar12;
|
|
}
|
|
if (iVar12 == 0) {
|
|
if (uVar8 == uVar29) {
|
|
uVar7 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar7 = ((uint)(byte)pDVar22->NumLanes & 0xffffff0f) * 2 - ((uint)cp->ai[0xfb] + 1);
|
|
}
|
|
if ((uVar8 == 0) ||
|
|
(((int)(uint)(byte)pDVar22->AILanes >> ((int)uVar7 / 2 & 0x1fU) & 1U) == 0)) {
|
|
uVar7 = 0xffffffff;
|
|
}
|
|
}
|
|
else {
|
|
if (iVar12 < 1) {
|
|
if (iVar12 == -0x400) {
|
|
uVar25 = (uint)(byte)pDVar22->NumLanes;
|
|
uVar26 = (uVar25 & 0xffffff0f) << 1;
|
|
uVar18 = (uint)((byte)pDVar22->NumLanes >> 6) & 1;
|
|
uVar7 = uVar26;
|
|
if (uVar18 < uVar26) {
|
|
do {
|
|
if (((((int)(uint)(byte)pDVar22->AILanes >> ((int)uVar18 / 2 & 0x1fU) & 1U) != 0)
|
|
&& ((uVar18 != 0 || ((pDVar22->NumLanes & 0x40U) == 0)))) &&
|
|
(((uVar25 & 0xffffff0f) * 2 - 1 != uVar18 || ((uVar25 & 0x80) == 0)))) {
|
|
uVar7 = uVar18;
|
|
if ((*(uint *)(pDVar22->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar7 = (int)(uint)(byte)pDVar22->LaneDirs >> ((int)uVar18 / 2 & 0x1fU);
|
|
}
|
|
test555 = (uVar7 ^ 1) & 1;
|
|
uVar7 = uVar18;
|
|
if (test555 == 0) {
|
|
if (uVar8 != 0) break;
|
|
}
|
|
else {
|
|
if (uVar8 == 0) break;
|
|
}
|
|
}
|
|
uVar25 = (uint)(byte)pDVar22->NumLanes;
|
|
uVar18 = uVar18 + 1;
|
|
uVar7 = uVar26;
|
|
} while ((int)uVar18 < (int)((uVar25 & 0xffffff0f) << 1));
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (iVar12 == 0x400) {
|
|
uVar18 = ((uint)(byte)pDVar22->NumLanes & 0xffffff0f) * 2;
|
|
uVar25 = uVar18;
|
|
do {
|
|
do {
|
|
uVar25 = uVar25 - 1;
|
|
uVar7 = uVar18;
|
|
if ((int)uVar25 < 0) goto LAB_00024be8;
|
|
} while (((((int)(uint)(byte)pDVar22->AILanes >> ((int)uVar25 / 2 & 0x1fU) & 1U) ==
|
|
0) || ((uVar25 == 0 && ((pDVar22->NumLanes & 0x40U) != 0)))) ||
|
|
((((uint)(byte)pDVar22->NumLanes & 0xffffff0f) * 2 - 1 == uVar25 &&
|
|
((pDVar22->NumLanes & 0x80U) != 0))));
|
|
uVar7 = uVar25;
|
|
if ((*(uint *)(pDVar22->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar7 = (int)(uint)(byte)pDVar22->LaneDirs >> ((int)uVar25 / 2 & 0x1fU);
|
|
}
|
|
test42 = (uVar7 ^ 1) & 1;
|
|
uVar7 = uVar25;
|
|
} while (uVar8 == 0);
|
|
}
|
|
}
|
|
}
|
|
LAB_00024be8:
|
|
if (-1 < (int)uVar7) {
|
|
uVar8 = (uint)(byte)pDVar22->NumLanes;
|
|
iVar12 = (uVar8 & 0xffffff0f) << 1;
|
|
if ((int)uVar7 < iVar12) {
|
|
bVar6 = pDVar22->AILanes;
|
|
iVar19 = uVar7 - ((int)uVar7 >> 0x1f);
|
|
LAB_00024fa4:
|
|
bVar5 = false;
|
|
if (((((int)(uint)bVar6 >> (iVar19 >> 1 & 0x1fU) & 1U) != 0) &&
|
|
((uVar7 != 0 || ((uVar8 & 0x40) == 0)))) &&
|
|
((iVar12 - 1U != uVar7 || ((uVar8 & 0x80) == 0)))) {
|
|
bVar5 = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
pDVar24 = Driver2CurvesPtr + (int)(short)*puVar21 + -0x4000;
|
|
iVar12 = ratan2(oldNode->x - pDVar24->Midx, oldNode->z - pDVar24->Midz);
|
|
bVar5 = false;
|
|
bVar4 = (int)(((iVar19 - iVar12) + 0x800U & 0xfff) - 0x800) < 1;
|
|
iVar12 = *turnAngle;
|
|
if (!bVar4) {
|
|
iVar12 = -iVar12;
|
|
}
|
|
if (iVar12 == 0) {
|
|
if ((uint)bVar4 << 0xb == uVar29) {
|
|
uVar7 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar7 = ((uint)(byte)pDVar24->NumLanes & 0xffffff0f) * 2 - ((uint)cp->ai[0xfb] + 1);
|
|
}
|
|
if ((!bVar4) ||
|
|
(((int)(uint)(byte)pDVar24->AILanes >> ((int)uVar7 / 2 & 0x1fU) & 1U) == 0)) {
|
|
uVar7 = 0xffffffff;
|
|
}
|
|
}
|
|
else {
|
|
if (iVar12 < 1) {
|
|
if (iVar12 == -0x400) {
|
|
uVar8 = (uint)(byte)pDVar24->NumLanes;
|
|
uVar18 = (uVar8 & 0xffffff0f) << 1;
|
|
uVar25 = (uint)((byte)pDVar24->NumLanes >> 6) & 1;
|
|
uVar7 = uVar18;
|
|
if (uVar25 < uVar18) {
|
|
do {
|
|
if (((((int)(uint)(byte)pDVar24->AILanes >> ((int)uVar25 / 2 & 0x1fU) & 1U) != 0)
|
|
&& ((uVar25 != 0 || ((pDVar24->NumLanes & 0x40U) == 0)))) &&
|
|
(((uVar8 & 0xffffff0f) * 2 - 1 != uVar25 || ((uVar8 & 0x80) == 0)))) {
|
|
uVar7 = uVar25;
|
|
if (*(short *)&pDVar24->NumLanes != -0xff) {
|
|
uVar7 = (int)(uint)(byte)pDVar24->LaneDirs >> ((int)uVar25 / 2 & 0x1fU);
|
|
}
|
|
test555 = (uVar7 ^ 1) & 1;
|
|
uVar7 = uVar25;
|
|
if (test555 == 0) {
|
|
if (bVar4) break;
|
|
}
|
|
else {
|
|
if (!bVar4) break;
|
|
}
|
|
}
|
|
uVar8 = (uint)(byte)pDVar24->NumLanes;
|
|
uVar25 = uVar25 + 1;
|
|
uVar7 = uVar18;
|
|
} while ((int)uVar25 < (int)((uVar8 & 0xffffff0f) << 1));
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (iVar12 == 0x400) {
|
|
uVar25 = ((uint)(byte)pDVar24->NumLanes & 0xffffff0f) * 2;
|
|
uVar8 = uVar25;
|
|
do {
|
|
do {
|
|
uVar8 = uVar8 - 1;
|
|
uVar7 = uVar25;
|
|
if ((int)uVar8 < 0) goto LAB_00024f78;
|
|
} while (((((int)(uint)(byte)pDVar24->AILanes >> ((int)uVar8 / 2 & 0x1fU) & 1U) == 0
|
|
) || ((uVar8 == 0 && ((pDVar24->NumLanes & 0x40U) != 0)))) ||
|
|
((((uint)(byte)pDVar24->NumLanes & 0xffffff0f) * 2 - 1 == uVar8 &&
|
|
((pDVar24->NumLanes & 0x80U) != 0))));
|
|
uVar7 = uVar8;
|
|
if (*(short *)&pDVar24->NumLanes != -0xff) {
|
|
uVar7 = (int)(uint)(byte)pDVar24->LaneDirs >> ((int)uVar8 / 2 & 0x1fU);
|
|
}
|
|
test42 = (uVar7 ^ 1) & 1;
|
|
uVar7 = uVar8;
|
|
} while (!bVar4);
|
|
}
|
|
}
|
|
}
|
|
LAB_00024f78:
|
|
if (-1 < (int)uVar7) {
|
|
uVar8 = (uint)(byte)pDVar24->NumLanes;
|
|
iVar12 = (uVar8 & 0xffffff0f) << 1;
|
|
if ((int)uVar7 < iVar12) {
|
|
bVar6 = pDVar24->AILanes;
|
|
iVar19 = uVar7 - ((int)uVar7 >> 0x1f);
|
|
goto LAB_00024fa4;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (bVar5) {
|
|
(&validExitIdx)[iVar14] = (short)(iVar17 >> 0x18);
|
|
local_58 = local_58 + 1;
|
|
}
|
|
else {
|
|
(&validExitIdx)[iVar14] = 0x2a;
|
|
}
|
|
iVar17 = iVar10 + 1;
|
|
iVar14 = iVar10;
|
|
} while (iVar10 < 3);
|
|
if ((iVar11 < 0) || (local_58 < 1)) goto LAB_00026928;
|
|
if ((local_50 != local_4c) && (local_58 != 1)) {
|
|
if ((uint)cp->ai[0xfb] == local_50) {
|
|
SHORT_ARRAY_000aab3c[0] = 0x2a;
|
|
}
|
|
else {
|
|
if ((uint)cp->ai[0xfb] == local_4c) {
|
|
validExitIdx = 0x2a;
|
|
}
|
|
else {
|
|
if (SHORT_000aab3a != 0x2a) {
|
|
SHORT_ARRAY_000aab3c[0] = 0x2a;
|
|
validExitIdx = 0x2a;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
lVar9 = Random2(0);
|
|
sVar2 = (&validExitIdx)[lVar9 % 3];
|
|
pbVar23 = cp->ai + 0xc;
|
|
iVar17 = lVar9 % 3;
|
|
while (sVar2 == 0x2a) {
|
|
iVar14 = 0;
|
|
if (iVar17 < 2) {
|
|
iVar14 = iVar17 + 1;
|
|
}
|
|
sVar2 = (&validExitIdx)[iVar14];
|
|
iVar17 = iVar14;
|
|
}
|
|
iVar17 = (int)(&validExitIdx)[iVar17];
|
|
uVar25 = SEXT24(pDVar15->ExitIdx[iVar17]);
|
|
iVar14 = 0;
|
|
if (turnAngle != (int *)0x0) {
|
|
iVar12 = (iVar17 + 4) - iVar11;
|
|
iVar10 = iVar12;
|
|
if (iVar12 < 0) {
|
|
iVar10 = iVar12 + 3;
|
|
}
|
|
iVar12 = iVar12 + (iVar10 >> 2) * -4;
|
|
if (iVar12 == 1) {
|
|
iVar14 = -0x400;
|
|
}
|
|
else {
|
|
if (((1 < iVar12) && (iVar12 != 2)) && (iVar12 == 3)) {
|
|
iVar14 = 0x400;
|
|
}
|
|
}
|
|
test42 = iVar11;
|
|
test555 = iVar17;
|
|
*turnAngle = iVar14;
|
|
}
|
|
uVar8 = 0xffffffff;
|
|
uVar18 = 0;
|
|
iVar17 = *turnAngle;
|
|
uVar3 = *(ushort *)&pDVar15->flags;
|
|
do {
|
|
if ((int)pDVar15->ExitIdx[0] == currentRoadId) {
|
|
uVar8 = uVar18;
|
|
}
|
|
uVar18 = uVar18 + 1;
|
|
pDVar15 = (DRIVER2_JUNCTION *)(pDVar15->ExitIdx + 1);
|
|
} while ((int)uVar18 < 4);
|
|
if (*pbVar23 != 8) {
|
|
*pbVar23 = 0;
|
|
if ((uVar3 & 1) == 0) {
|
|
bVar5 = false;
|
|
if ((uVar8 == 0) || (uVar8 == 2)) {
|
|
bVar5 = true;
|
|
}
|
|
if ((uVar3 & 2) == 0) {
|
|
bVar6 = 4;
|
|
if (!bVar5) goto LAB_000252b4;
|
|
LAB_000252ac:
|
|
bVar6 = 6;
|
|
if (iVar17 == 0) goto LAB_000252bc;
|
|
goto LAB_000252b4;
|
|
}
|
|
bVar6 = 4;
|
|
if (!bVar5) goto LAB_000252ac;
|
|
*(CIV_ROUTE_ENTRY **)(cp->ai + 8) = oldNode;
|
|
}
|
|
else {
|
|
cp->ai[0xd] = (byte)(uVar8 & 1);
|
|
bVar6 = 1;
|
|
if ((&junctionLightsPhase)[uVar8 & 1] == '\x03') goto LAB_000252ac;
|
|
LAB_000252b4:
|
|
*(CIV_ROUTE_ENTRY **)(cp->ai + 8) = oldNode;
|
|
}
|
|
*pbVar23 = bVar6;
|
|
}
|
|
LAB_000252bc:
|
|
iVar17 = *turnAngle;
|
|
iVar11 = oldNode->dir + iVar17;
|
|
if (((((uVar25 & 0xffffe000) != 0) || (NumDriver2Straights <= (int)(uVar25 & 0x1fff))) &&
|
|
(((uVar25 & 0xffffe000) != 0x4000 || (NumDriver2Curves <= (int)(uVar25 & 0x1fff))))) ||
|
|
((int)uVar25 < 0)) goto LAB_00026928;
|
|
if (((uVar25 & 0xffffe000) == 0) && ((int)(uVar25 & 0x1fff) < NumDriver2Straights)) {
|
|
pDVar30 = Driver2StraightsPtr + uVar25;
|
|
uVar18 = (iVar11 - pDVar30->angle) + 0x400U & 0x800;
|
|
uVar8 = ((uint)(byte)pDVar30->NumLanes & 0xf) * 2;
|
|
if (uVar18 == 0) {
|
|
iVar17 = -iVar17;
|
|
}
|
|
if (iVar17 == 0) {
|
|
if (uVar18 == uVar29) {
|
|
uVar7 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar7 = uVar8 - ((uint)cp->ai[0xfb] + 1);
|
|
}
|
|
bVar5 = uVar18 == 0;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) == 0xff010000) {
|
|
if ((uVar7 & 1) == 0) {
|
|
LAB_00025514:
|
|
if (!bVar5) {
|
|
uVar7 = 0xffffffff;
|
|
goto LAB_0002564c;
|
|
}
|
|
}
|
|
else {
|
|
if (bVar5) {
|
|
uVar7 = 0xffffffff;
|
|
goto LAB_0002564c;
|
|
}
|
|
}
|
|
LAB_0002552c:
|
|
if (((int)(uint)(byte)pDVar30->AILanes >> ((int)uVar7 / 2 & 0x1fU) & 1U) != 0)
|
|
goto LAB_0002564c;
|
|
}
|
|
else {
|
|
if (((int)(uint)(byte)pDVar30->LaneDirs >> ((int)uVar7 / 2 & 0x1fU) & 1U) == 0)
|
|
goto LAB_00025514;
|
|
if (!bVar5) goto LAB_0002552c;
|
|
}
|
|
uVar7 = 0xffffffff;
|
|
}
|
|
else {
|
|
if (iVar17 < 1) {
|
|
if ((iVar17 == -0x400) &&
|
|
(uVar29 = (uint)((byte)pDVar30->NumLanes >> 6) & 1, uVar7 = uVar8, uVar29 < uVar8)) {
|
|
do {
|
|
if (((((int)(uint)(byte)pDVar30->AILanes >> ((int)uVar29 / 2 & 0x1fU) & 1U) != 0) &&
|
|
((uVar29 != 0 || ((pDVar30->NumLanes & 0x40U) == 0)))) &&
|
|
((((uint)(byte)pDVar30->NumLanes & 0xffffff0f) * 2 - 1 != uVar29 ||
|
|
((pDVar30->NumLanes & 0x80U) == 0)))) {
|
|
uVar7 = uVar29;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar7 = (int)(uint)(byte)pDVar30->LaneDirs >> ((int)uVar29 / 2 & 0x1fU);
|
|
}
|
|
test555 = (uVar7 ^ 1) & 1;
|
|
uVar7 = uVar29;
|
|
if (test555 == 0) {
|
|
if (uVar18 != 0) break;
|
|
}
|
|
else {
|
|
if (uVar18 == 0) break;
|
|
}
|
|
}
|
|
uVar29 = uVar29 + 1;
|
|
uVar7 = uVar8;
|
|
} while ((int)uVar29 < (int)(((uint)(byte)pDVar30->NumLanes & 0xffffff0f) << 1));
|
|
}
|
|
}
|
|
else {
|
|
uVar29 = uVar8;
|
|
if (iVar17 == 0x400) {
|
|
do {
|
|
do {
|
|
uVar29 = uVar29 - 1;
|
|
uVar7 = uVar8;
|
|
if ((int)uVar29 < 0) goto LAB_0002564c;
|
|
} while (((((int)(uint)(byte)pDVar30->AILanes >> ((int)uVar29 / 2 & 0x1fU) & 1U) == 0)
|
|
|| ((uVar29 == 0 && ((pDVar30->NumLanes & 0x40U) != 0)))) ||
|
|
((((uint)(byte)pDVar30->NumLanes & 0xffffff0f) * 2 - 1 == uVar29 &&
|
|
((pDVar30->NumLanes & 0x80U) != 0))));
|
|
uVar7 = uVar29;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar7 = (int)(uint)(byte)pDVar30->LaneDirs >> ((int)uVar29 / 2 & 0x1fU);
|
|
}
|
|
test42 = (uVar7 ^ 1) & 1;
|
|
uVar7 = uVar29;
|
|
} while (uVar18 == 0);
|
|
}
|
|
}
|
|
}
|
|
LAB_0002564c:
|
|
uVar8 = uVar7;
|
|
if (*turnAngle != 0) {
|
|
if (uVar8 - 1 == uVar7) {
|
|
uVar29 = uVar7;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar29 = (int)(uint)(byte)pDVar30->LaneDirs >> ((int)uVar7 / 2 & 0x1fU);
|
|
}
|
|
uVar18 = uVar7;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar18 = (int)(uint)(byte)pDVar30->LaneDirs >> ((int)(uVar7 - 1) / 2 & 0x1fU) ^ 1;
|
|
}
|
|
uVar8 = uVar7 - 1;
|
|
if (((uVar29 ^ 1) & 1) == (uVar18 & 1)) goto LAB_000267a4;
|
|
}
|
|
uVar8 = uVar7;
|
|
if (uVar7 == 0) {
|
|
uVar29 = 1;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar29 = ((uint)(byte)pDVar30->LaneDirs ^ 1) & 1;
|
|
}
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) goto LAB_00025ba4;
|
|
LAB_00025b80:
|
|
uVar18 = uVar8 + 1;
|
|
if (uVar29 == ((uVar18 ^ 1) & 1)) goto LAB_00025bc8;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
uVar8 = uVar7;
|
|
if (((uVar25 & 0xffffe000) != 0x4000) ||
|
|
((NumDriver2Curves <= (int)(uVar25 & 0x1fff) || ((int)uVar25 < 0)))) goto LAB_000267a4;
|
|
pDVar24 = Driver2CurvesPtr + (uVar25 - 0x4000);
|
|
iVar17 = ratan2(oldNode->x - pDVar24->Midx, oldNode->z - pDVar24->Midz);
|
|
bVar5 = (int)(((iVar11 - iVar17) + 0x800U & 0xfff) - 0x800) < 1;
|
|
iVar17 = *turnAngle;
|
|
uVar8 = ((uint)(byte)pDVar24->NumLanes & 0xf) * 2;
|
|
if (!bVar5) {
|
|
iVar17 = -iVar17;
|
|
}
|
|
if (iVar17 == 0) {
|
|
if ((uint)bVar5 << 0xb == uVar29) {
|
|
uVar7 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar7 = uVar8 - ((uint)cp->ai[0xfb] + 1);
|
|
}
|
|
if (*(short *)&pDVar24->NumLanes == -0xff) {
|
|
if ((uVar7 & 1) == 0) {
|
|
LAB_0002595c:
|
|
if (bVar5) {
|
|
uVar7 = 0xffffffff;
|
|
goto LAB_00025a8c;
|
|
}
|
|
}
|
|
else {
|
|
if (!bVar5) {
|
|
uVar7 = 0xffffffff;
|
|
goto LAB_00025a8c;
|
|
}
|
|
}
|
|
LAB_00025974:
|
|
if (((int)(uint)(byte)pDVar24->AILanes >> ((int)uVar7 / 2 & 0x1fU) & 1U) != 0)
|
|
goto LAB_00025a8c;
|
|
}
|
|
else {
|
|
if (((int)(uint)(byte)pDVar24->LaneDirs >> ((int)uVar7 / 2 & 0x1fU) & 1U) == 0)
|
|
goto LAB_0002595c;
|
|
if (bVar5) goto LAB_00025974;
|
|
}
|
|
uVar7 = 0xffffffff;
|
|
}
|
|
else {
|
|
if (iVar17 < 1) {
|
|
if ((iVar17 == -0x400) &&
|
|
(uVar29 = (uint)((byte)pDVar24->NumLanes >> 6) & 1, uVar7 = uVar8, uVar29 < uVar8)) {
|
|
do {
|
|
if (((((int)(uint)(byte)pDVar24->AILanes >> ((int)uVar29 / 2 & 0x1fU) & 1U) != 0) &&
|
|
((uVar29 != 0 || ((pDVar24->NumLanes & 0x40U) == 0)))) &&
|
|
((((uint)(byte)pDVar24->NumLanes & 0xffffff0f) * 2 - 1 != uVar29 ||
|
|
((pDVar24->NumLanes & 0x80U) == 0)))) {
|
|
uVar7 = uVar29;
|
|
if (*(short *)&pDVar24->NumLanes != -0xff) {
|
|
uVar7 = (int)(uint)(byte)pDVar24->LaneDirs >> ((int)uVar29 / 2 & 0x1fU);
|
|
}
|
|
test555 = (uVar7 ^ 1) & 1;
|
|
uVar7 = uVar29;
|
|
if (test555 == 0) {
|
|
if (bVar5) break;
|
|
}
|
|
else {
|
|
if (!bVar5) break;
|
|
}
|
|
}
|
|
uVar29 = uVar29 + 1;
|
|
uVar7 = uVar8;
|
|
} while ((int)uVar29 < (int)(((uint)(byte)pDVar24->NumLanes & 0xffffff0f) << 1));
|
|
}
|
|
}
|
|
else {
|
|
uVar29 = uVar8;
|
|
if (iVar17 == 0x400) {
|
|
do {
|
|
do {
|
|
uVar29 = uVar29 - 1;
|
|
uVar7 = uVar8;
|
|
if ((int)uVar29 < 0) goto LAB_00025a8c;
|
|
} while (((((int)(uint)(byte)pDVar24->AILanes >> ((int)uVar29 / 2 & 0x1fU) & 1U) == 0)
|
|
|| ((uVar29 == 0 && ((pDVar24->NumLanes & 0x40U) != 0)))) ||
|
|
((((uint)(byte)pDVar24->NumLanes & 0xffffff0f) * 2 - 1 == uVar29 &&
|
|
((pDVar24->NumLanes & 0x80U) != 0))));
|
|
uVar7 = uVar29;
|
|
if (*(short *)&pDVar24->NumLanes != -0xff) {
|
|
uVar7 = (int)(uint)(byte)pDVar24->LaneDirs >> ((int)uVar29 / 2 & 0x1fU);
|
|
}
|
|
test42 = (uVar7 ^ 1) & 1;
|
|
uVar7 = uVar29;
|
|
} while (!bVar5);
|
|
}
|
|
}
|
|
}
|
|
LAB_00025a8c:
|
|
uVar8 = uVar7;
|
|
if (*turnAngle != 0) {
|
|
if (uVar8 - 1 == uVar7) {
|
|
uVar29 = uVar7;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar29 = (int)(uint)(byte)pDVar30->LaneDirs >> ((int)uVar7 / 2 & 0x1fU);
|
|
}
|
|
uVar18 = uVar7;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar18 = (int)(uint)(byte)pDVar30->LaneDirs >> ((int)(uVar7 - 1) / 2 & 0x1fU) ^ 1;
|
|
}
|
|
uVar8 = uVar7 - 1;
|
|
if (((uVar29 ^ 1) & 1) == (uVar18 & 1)) goto LAB_000267a4;
|
|
}
|
|
uVar8 = uVar7;
|
|
if (uVar7 == 0) {
|
|
uVar29 = 1;
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar29 = ((uint)(byte)pDVar30->LaneDirs ^ 1) & 1;
|
|
}
|
|
if ((*(uint *)(pDVar30->ConnectIdx + 3) & 0xffff0000) == 0xff010000) goto LAB_00025b80;
|
|
LAB_00025ba4:
|
|
uVar18 = uVar7 + 1;
|
|
uVar8 = uVar7;
|
|
if (uVar29 == (((int)(uint)(byte)pDVar30->LaneDirs >> ((int)uVar18 / 2 & 0x1fU) ^ 1U) & 1))
|
|
{
|
|
LAB_00025bc8:
|
|
uVar8 = uVar18;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
LAB_000267a4:
|
|
if ((int)uVar8 < 0) goto LAB_00026928;
|
|
cp->ai[0xfb] = (byte)uVar8;
|
|
if (startDist != (int *)0x0) {
|
|
iVar17 = uVar25 << 3;
|
|
if (((uVar25 & 0xffffe000) == 0x4000) &&
|
|
(iVar17 = uVar25 * 8, (int)(uVar25 & 0x1fff) < NumDriver2Curves)) {
|
|
if ((int)uVar25 < 0) {
|
|
iVar17 = uVar25 << 3;
|
|
goto LAB_0002687c;
|
|
}
|
|
pDVar24 = Driver2CurvesPtr + (uVar25 - 0x4000);
|
|
if (*(short *)&pDVar24->NumLanes == -0xff) {
|
|
if ((uVar8 & 1) == 0) {
|
|
uVar7 = 0;
|
|
}
|
|
else {
|
|
LAB_00026844:
|
|
uVar7 = (int)pDVar24->end - (int)pDVar24->start & 0xfff;
|
|
}
|
|
}
|
|
else {
|
|
if (((int)(uint)(byte)pDVar24->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f) & 1U) != 0)
|
|
goto LAB_00026844;
|
|
uVar7 = 0;
|
|
}
|
|
*startDist = uVar7;
|
|
bVar6 = pDVar24->NumLanes;
|
|
}
|
|
else {
|
|
LAB_0002687c:
|
|
piVar28 = &Driver2StraightsPtr->Midx + (iVar17 - uVar25);
|
|
if ((piVar28[5] & 0xffff0000U) == 0xff010000) {
|
|
test555 = 0;
|
|
if ((cp->ai[0xfb] & 1) != 0) {
|
|
LAB_000268e0:
|
|
test555 = ZEXT24(*(ushort *)(piVar28 + 2));
|
|
}
|
|
}
|
|
else {
|
|
test555 = 0;
|
|
if (((int)(uint)*(byte *)((int)piVar28 + 0x17) >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f) & 1U)
|
|
!= 0) goto LAB_000268e0;
|
|
}
|
|
test123 = test555;
|
|
*startDist = test555;
|
|
bVar6 = *(byte *)((int)piVar28 + 0x16);
|
|
}
|
|
cp->ai[0xf8] = speedLimits[(uint)(bVar6 >> 4) & 3];
|
|
}
|
|
if (-1 < (int)uVar25) {
|
|
return uVar25;
|
|
}
|
|
LAB_00026928:
|
|
cp->ai[0xf9] = 3;
|
|
cp->ai[0xc] = 7;
|
|
return 0;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ InitNodeList(struct _CAR_DATA *cp /*$s6*/, char *extraData /*$s7*/)
|
|
// line 1365, offset 0x00026964
|
|
/* begin block 1 */
|
|
// Start line: 1366
|
|
// Start offset: 0x00026964
|
|
// Variables:
|
|
// int i; // $v1
|
|
// struct CIV_ROUTE_ENTRY *cr; // $s5
|
|
// int dx; // $s1
|
|
// int dz; // $s2
|
|
// int surfInd; // $s4
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 1397
|
|
// Start offset: 0x00026A04
|
|
// Variables:
|
|
// int theta; // $s0
|
|
// int laneDist; // $s1
|
|
// struct DRIVER2_STRAIGHT *str; // $s3
|
|
/* end block 1.1 */
|
|
// End offset: 0x00026B60
|
|
// End Line: 1406
|
|
|
|
/* begin block 1.2 */
|
|
// Start line: 1411
|
|
// Start offset: 0x00026B9C
|
|
// Variables:
|
|
// struct DRIVER2_CURVE *crv; // $s0
|
|
/* end block 1.2 */
|
|
// End offset: 0x00026C4C
|
|
// End Line: 1415
|
|
/* end block 1 */
|
|
// End offset: 0x00026CAC
|
|
// End Line: 1425
|
|
|
|
/* begin block 2 */
|
|
// Start line: 2972
|
|
/* end block 2 */
|
|
// End Line: 2973
|
|
|
|
/* begin block 3 */
|
|
// Start line: 2988
|
|
/* end block 3 */
|
|
// End Line: 2989
|
|
|
|
void InitNodeList(_CAR_DATA *cp, char *extraData)
|
|
{
|
|
UNIMPLEMENTED();
|
|
/*
|
|
short sVar1;
|
|
ushort uVar2;
|
|
undefined2 *puVar3;
|
|
int iVar4;
|
|
int iVar5;
|
|
int iVar6;
|
|
uint uVar7;
|
|
int iVar8;
|
|
DRIVER2_CURVE *pDVar9;
|
|
DRIVER2_STRAIGHT *pDVar10;
|
|
uint uVar11;
|
|
ushort *puVar12;
|
|
|
|
puVar3 = (undefined2 *)(cp->ai + 0x26);
|
|
iVar6 = 0xc;
|
|
uVar11 = *(uint *)cp->ai;
|
|
do {
|
|
*(undefined4 *)(puVar3 + 3) = 0;
|
|
*(undefined4 *)(puVar3 + 5) = 0;
|
|
*puVar3 = 0x7f;
|
|
iVar6 = iVar6 + -1;
|
|
puVar3 = puVar3 + 8;
|
|
} while (-1 < iVar6);
|
|
iVar6 = (cp->hd).where.t[0];
|
|
puVar12 = (ushort *)(cp->ai + 0x24);
|
|
*(int *)(cp->ai + 0x2c) = iVar6;
|
|
iVar8 = (cp->hd).where.t[2];
|
|
*(undefined2 *)(cp->ai + 0x26) = 1;
|
|
*(int *)(cp->ai + 0x30) = iVar8;
|
|
if ((((uVar11 & 0xffffe000) == 0) && ((int)(uVar11 & 0x1fff) < NumDriver2Straights)) &&
|
|
(-1 < (int)uVar11)) {
|
|
pDVar10 = Driver2StraightsPtr + uVar11;
|
|
iVar6 = iVar6 - pDVar10->Midx;
|
|
iVar8 = iVar8 - pDVar10->Midz;
|
|
iVar4 = ratan2(iVar6, iVar8);
|
|
sVar1 = pDVar10->angle;
|
|
iVar5 = SquareRoot0(iVar6 * iVar6 + iVar8 * iVar8);
|
|
*(uint *)(cp->ai + 0x28) =
|
|
(uint)(pDVar10->length >> 1) +
|
|
(rcossin_tbl[(sVar1 - iVar4 & 0xfffU) * 2 + 1] * iVar5 + 0x800 >> 0xc);
|
|
uVar7 = (uint)(ushort)pDVar10->angle & 0xfff;
|
|
iVar6 = ((uint)(byte)pDVar10->NumLanes & 0xf) * 0x200 +
|
|
(-iVar6 * (int)rcossin_tbl[uVar7 * 2 + 1] + iVar8 * rcossin_tbl[uVar7 * 2] + 0x800 >>
|
|
0xc);
|
|
if (iVar6 < 0) {
|
|
iVar6 = iVar6 + 0x1ff;
|
|
}
|
|
uVar7 = iVar6 >> 9;
|
|
cp->ai[0xfb] = (byte)uVar7;
|
|
if ((*(uint *)(pDVar10->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar7 = (int)(uint)(byte)pDVar10->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
if ((uVar7 & 1) == 0) {
|
|
*puVar12 = pDVar10->angle;
|
|
}
|
|
else {
|
|
*puVar12 = pDVar10->angle + 0x800U & 0xfff;
|
|
}
|
|
}
|
|
if ((((uVar11 & 0xffffe000) == 0x4000) && ((int)(uVar11 & 0x1fff) < NumDriver2Curves)) &&
|
|
(-1 < (int)uVar11)) {
|
|
if (extraData == (char *)0x0) {
|
|
pDVar9 = Driver2CurvesPtr + (uVar11 - 0x4000);
|
|
uVar11 = ratan2(*(int *)(cp->ai + 0x2c) - pDVar9->Midx, *(int *)(cp->ai + 0x30) - pDVar9->Midz)
|
|
;
|
|
uVar7 = (uVar11 & 0xfff) - (int)pDVar9->start;
|
|
uVar11 = uVar7 & 0xf80;
|
|
if ((9 < (byte)pDVar9->inside) && (uVar11 = uVar7 & 0xfe0, (byte)pDVar9->inside < 0x14)) {
|
|
uVar11 = uVar7 & 0xfc0;
|
|
}
|
|
*(uint *)(cp->ai + 0x28) = uVar11;
|
|
sVar1 = (short)uVar11 + pDVar9->start;
|
|
if (*(short *)&pDVar9->NumLanes == -0xff) {
|
|
uVar11 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar11 = (int)(uint)(byte)pDVar9->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
uVar2 = sVar1 - 0x400;
|
|
if ((uVar11 & 1) == 0) {
|
|
uVar2 = sVar1 + 0x400;
|
|
}
|
|
*puVar12 = uVar2;
|
|
}
|
|
else {
|
|
*(undefined4 *)(cp->ai + 0x28) = *(undefined4 *)(extraData + 4);
|
|
*puVar12 = *(ushort *)(extraData + 8);
|
|
}
|
|
}
|
|
if (extraData != (char *)0x0) {
|
|
*(undefined4 *)(cp->ai + 0x28) = *(undefined4 *)(extraData + 4);
|
|
}
|
|
return;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ GetNodePos(struct DRIVER2_STRAIGHT *straight /*$t1*/, struct DRIVER2_JUNCTION *junction /*$a1*/, struct DRIVER2_CURVE *curve /*$t0*/, int distAlongPath /*$a3*/, struct _CAR_DATA *cp /*stack 16*/, int *x /*stack 20*/, int *z /*stack 24*/, int laneNo /*stack 28*/)
|
|
// line 1441, offset 0x00026cac
|
|
/* begin block 1 */
|
|
// Start line: 1442
|
|
// Start offset: 0x00026CAC
|
|
// Variables:
|
|
// unsigned char oldLane; // $a0
|
|
// unsigned char changeLaneCount; // $t3
|
|
/* end block 1 */
|
|
// End offset: 0x00026F20
|
|
// End Line: 1504
|
|
|
|
/* begin block 2 */
|
|
// Start line: 3154
|
|
/* end block 2 */
|
|
// End Line: 3155
|
|
|
|
/* begin block 3 */
|
|
// Start line: 3171
|
|
/* end block 3 */
|
|
// End Line: 3172
|
|
|
|
int GetNodePos(DRIVER2_STRAIGHT *straight, DRIVER2_JUNCTION *junction, DRIVER2_CURVE *curve, int distAlongPath, _CAR_DATA *cp, int *x, int *z, int laneNo)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
uint uVar1;
|
|
uint uVar2;
|
|
uint uVar3;
|
|
|
|
if (cp == (_CAR_DATA *)0x0) {
|
|
uVar2 = 0;
|
|
uVar3 = 0;
|
|
LAB_00026d04:
|
|
if (curve == (DRIVER2_CURVE *)0x0) {
|
|
if ((cp != (_CAR_DATA *)0x0) && (straight == (DRIVER2_STRAIGHT *)0x0)) {
|
|
LAB_00026ce8:
|
|
cp->ai[0xf9] = 3;
|
|
cp->ai[0xc] = 7;
|
|
return 0;
|
|
}
|
|
angle = (int)straight->angle;
|
|
distFromCentre = distAlongPath - (uint)(straight->length >> 1);
|
|
if ((cp != (_CAR_DATA *)0x0) && (0x7ff < angle)) goto LAB_00026ce8;
|
|
uVar1 = uVar3;
|
|
if (laneNo <= (int)uVar2) {
|
|
uVar1 = -uVar3;
|
|
}
|
|
test42 = uVar1 * 0x80;
|
|
sideShift = (((uint)(byte)straight->NumLanes & 0xf) * 0x200 - (laneNo * 0x200 + 0x100)) +
|
|
test42;
|
|
*x = straight->Midx + (distFromCentre * rcossin_tbl[(angle & 0xfffU) * 2] + 0x800 >> 0xc) +
|
|
(sideShift * rcossin_tbl[(angle & 0xfffU) * 2 + 1] + 0x800 >> 0xc);
|
|
*z = (straight->Midz + (distFromCentre * rcossin_tbl[(angle & 0xfffU) * 2 + 1] + 0x800 >> 0xc)
|
|
) - (sideShift * rcossin_tbl[(angle & 0xfffU) * 2] + 0x800 >> 0xc);
|
|
goto LAB_00026f00;
|
|
}
|
|
}
|
|
else {
|
|
uVar2 = (uint)cp->ai[0x11];
|
|
uVar3 = (uint)cp->ai[0x12];
|
|
if ((straight != (DRIVER2_STRAIGHT *)0x0) || (junction != (DRIVER2_JUNCTION *)0x0))
|
|
goto LAB_00026d04;
|
|
if (curve == (DRIVER2_CURVE *)0x0) goto LAB_00026ce8;
|
|
}
|
|
angle = distAlongPath + curve->start;
|
|
uVar1 = uVar3;
|
|
if ((int)uVar2 < laneNo) {
|
|
uVar1 = -uVar3;
|
|
}
|
|
test42 = uVar1 * 0x80;
|
|
radius = (uint)(byte)curve->inside * 0x400 + laneNo * 0x200 + 0x100 + test42;
|
|
*x = curve->Midx + (radius * rcossin_tbl[(angle & 0xfffU) * 2] + 0x800 >> 0xc);
|
|
*z = curve->Midz + (radius * rcossin_tbl[(angle & 0xfffU) * 2 + 1] + 0x800 >> 0xc);
|
|
LAB_00026f00:
|
|
if (uVar3 != 0) {
|
|
cp->ai[0x12] = cp->ai[0x12] - 1;
|
|
}
|
|
return 0;
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ CheckChangeLanes(struct DRIVER2_STRAIGHT *straight /*$s4*/, struct DRIVER2_CURVE *curve /*$s6*/, int distAlongSegment /*$a2*/, struct _CAR_DATA *cp /*$s3*/, int tryToPark /*stack 16*/)
|
|
// line 1507, offset 0x00026f20
|
|
/* begin block 1 */
|
|
// Start line: 1508
|
|
// Start offset: 0x00026F20
|
|
// Variables:
|
|
// unsigned char currentLane; // $s7
|
|
// unsigned char newLane; // $s2
|
|
// unsigned char trials; // $t3
|
|
// unsigned char canProceed; // stack offset -88
|
|
// unsigned char travelAlongRoad; // $s5
|
|
// unsigned char turnRight; // stack offset -84
|
|
// struct _CAR_DATA *cp1; // $s0
|
|
// struct CIV_ROUTE_ENTRY tmpNode; // stack offset -120
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 1572
|
|
// Start offset: 0x00027290
|
|
// Variables:
|
|
// struct VECTOR pos; // stack offset -104
|
|
// int theta; // $a0
|
|
// int length; // $a1
|
|
|
|
/* begin block 1.1.1 */
|
|
// Start line: 1588
|
|
// Start offset: 0x00027394
|
|
/* end block 1.1.1 */
|
|
// End offset: 0x00027494
|
|
// End Line: 1596
|
|
/* end block 1.1 */
|
|
// End offset: 0x000274A4
|
|
// End Line: 1598
|
|
/* end block 1 */
|
|
// End offset: 0x00027530
|
|
// End Line: 1623
|
|
|
|
/* begin block 2 */
|
|
// Start line: 3328
|
|
/* end block 2 */
|
|
// End Line: 3329
|
|
|
|
/* begin block 3 */
|
|
// Start line: 3332
|
|
/* end block 3 */
|
|
// End Line: 3333
|
|
|
|
/* begin block 4 */
|
|
// Start line: 3337
|
|
/* end block 4 */
|
|
// End Line: 3338
|
|
|
|
int CheckChangeLanes(DRIVER2_STRAIGHT *straight, DRIVER2_CURVE *curve, int distAlongSegment, _CAR_DATA *cp, int tryToPark)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
byte bVar1;
|
|
bool bVar2;
|
|
byte bVar3;
|
|
uint uVar4;
|
|
long lVar5;
|
|
int iVar6;
|
|
CAR_COSMETICS *pCVar7;
|
|
uint uVar8;
|
|
int iVar9;
|
|
uint uVar10;
|
|
_CAR_DATA *p_Var11;
|
|
uint uVar12;
|
|
uint uVar13;
|
|
uint unaff_s5;
|
|
bool local_54;
|
|
|
|
bVar2 = false;
|
|
bVar1 = cp->ai[0xfb];
|
|
uVar12 = (uint)bVar1;
|
|
if ((cp->ai[0xc] != 8) && (*(int *)(cp->ai + 0x18) == 0)) {
|
|
if (straight == (DRIVER2_STRAIGHT *)0x0) {
|
|
bVar3 = curve->NumLanes;
|
|
}
|
|
else {
|
|
bVar3 = straight->NumLanes;
|
|
}
|
|
uVar4 = ((uint)bVar3 & 0xf) * 2;
|
|
lVar5 = Random2((int)straight);
|
|
uVar13 = uVar12 + (lVar5 >> 7 & 2U) + 0xff & 0xff;
|
|
if (tryToPark != 0) {
|
|
if (bVar1 == 1) {
|
|
uVar13 = 0;
|
|
}
|
|
else {
|
|
if (uVar4 - 2 == uVar12) {
|
|
uVar13 = uVar4 - 1 & 0xff;
|
|
}
|
|
}
|
|
}
|
|
bVar3 = 0;
|
|
uVar10 = (uVar12 ^ 1) & 1;
|
|
do {
|
|
if (bVar3 == 1) {
|
|
uVar13 = uVar12 * 2 - uVar13 & 0xff;
|
|
}
|
|
if ((uVar13 == 0xff) || (uVar4 <= uVar13)) goto LAB_000274bc;
|
|
if ((gCurrentMissionNumber == 0x21) && (makeLimoPullOver != '\0')) {
|
|
LAB_0002718c:
|
|
if (straight != (DRIVER2_STRAIGHT *)0x0) {
|
|
unaff_s5 = uVar10;
|
|
if ((*(uint *)(straight->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
unaff_s5 = ((int)(uint)(byte)straight->LaneDirs >> ((uint)(bVar1 >> 1) & 0x1f) ^ 1U) & 1
|
|
;
|
|
}
|
|
uVar8 = uVar13;
|
|
if ((*(uint *)(straight->ConnectIdx + 3) & 0xffff0000) != 0xff010000) {
|
|
uVar8 = (int)(uint)(byte)straight->LaneDirs >> (uVar13 >> 1 & 0x1f);
|
|
}
|
|
if (((uVar8 ^ 1) & 1) != unaff_s5) goto LAB_000274bc;
|
|
}
|
|
if (curve != (DRIVER2_CURVE *)0x0) {
|
|
unaff_s5 = uVar10;
|
|
if ((*(uint *)&curve->NumLanes & 0xffff) != 0xff01) {
|
|
unaff_s5 = ((int)(uint)(byte)curve->LaneDirs >> ((uint)(bVar1 >> 1) & 0x1f) ^ 1U) & 1;
|
|
}
|
|
uVar8 = uVar13;
|
|
if ((*(uint *)&curve->NumLanes & 0xffff) != 0xff01) {
|
|
uVar8 = (int)(uint)(byte)curve->LaneDirs >> (uVar13 >> 1 & 0x1f);
|
|
}
|
|
if (((uVar8 ^ 1) & 1) != unaff_s5) goto LAB_000274bc;
|
|
}
|
|
if ((*(int *)(cp->ai + 8) == 0) && (*(int *)(cp->ai + 0x14) == -1)) {
|
|
bVar2 = true;
|
|
local_54 = unaff_s5 != 0;
|
|
if (uVar12 < uVar13) {
|
|
local_54 = !local_54;
|
|
}
|
|
iVar6 = (cp->hd).direction;
|
|
uVar8 = iVar6 - 0x400;
|
|
if (local_54 != false) {
|
|
uVar8 = iVar6 + 0x400;
|
|
}
|
|
cd.x.vx = (cp->hd).oBox.location.vx +
|
|
((int)rcossin_tbl[(uVar8 & 0xfff) * 2] * 0x200 + 0x800 >> 0xc);
|
|
cd.x.vz = (cp->hd).oBox.location.vz +
|
|
((int)rcossin_tbl[(uVar8 & 0xfff) * 2 + 1] * 0x200 + 0x800 >> 0xc);
|
|
cd.length[0] = (int)(((cp->ap).carCos)->colBox).vz + 0x5d;
|
|
cd.length[1] = (int)(((cp->ap).carCos)->colBox).vx;
|
|
cd.theta = (cp->hd).direction;
|
|
p_Var11 = car_data + 0x13;
|
|
do {
|
|
if ((p_Var11 != cp) && (p_Var11->controlType != '\0')) {
|
|
pCVar7 = (p_Var11->ap).carCos;
|
|
CDATA2D_000bd0e4.length[0] = (int)(pCVar7->colBox).vz + 0x5d;
|
|
CDATA2D_000bd0e4.x.vx = (p_Var11->hd).oBox.location.vx;
|
|
CDATA2D_000bd0e4.length[1] = (int)(pCVar7->colBox).vx;
|
|
CDATA2D_000bd0e4.x.vz = (p_Var11->hd).oBox.location.vz;
|
|
CDATA2D_000bd0e4.theta = (p_Var11->hd).direction;
|
|
iVar9 = ((cd.length[0] + CDATA2D_000bd0e4.length[0]) * 3) / 2;
|
|
iVar6 = cd.x.vx - CDATA2D_000bd0e4.x.vx;
|
|
if (iVar6 < 0) {
|
|
iVar6 = CDATA2D_000bd0e4.x.vx - cd.x.vx;
|
|
}
|
|
if (iVar6 < iVar9) {
|
|
iVar6 = cd.x.vz - CDATA2D_000bd0e4.x.vz;
|
|
if (iVar6 < 0) {
|
|
iVar6 = CDATA2D_000bd0e4.x.vz - cd.x.vz;
|
|
}
|
|
if ((iVar6 < iVar9) && (iVar6 = bcollided2d(&cd, 1), iVar6 != 0)) {
|
|
bVar2 = false;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
p_Var11 = p_Var11 + -1;
|
|
} while ((_CAR_DATA *)((int)&cheats.MagicMirror + 3U) < p_Var11);
|
|
if (bVar2) goto LAB_000274d8;
|
|
}
|
|
}
|
|
else {
|
|
if (tryToPark == 0) {
|
|
if (((straight == (DRIVER2_STRAIGHT *)0x0) ||
|
|
(((((int)(uint)(byte)straight->AILanes >> (uVar13 >> 1 & 0x1f) & 1U) != 0 &&
|
|
((uVar13 != 0 || ((straight->NumLanes & 0x40U) == 0)))) &&
|
|
((((uint)(byte)straight->NumLanes & 0xf) * 2 - 1 != uVar13 ||
|
|
((straight->NumLanes & 0x80U) == 0)))))) &&
|
|
((curve == (DRIVER2_CURVE *)0x0 ||
|
|
(((((int)(uint)(byte)curve->AILanes >> (uVar13 >> 1 & 0x1f) & 1U) != 0 &&
|
|
((uVar13 != 0 || ((curve->NumLanes & 0x40U) == 0)))) &&
|
|
((((uint)(byte)curve->NumLanes & 0xf) * 2 - 1 != uVar13 ||
|
|
((curve->NumLanes & 0x80U) == 0)))))))) goto LAB_0002718c;
|
|
}
|
|
else {
|
|
if (((straight == (DRIVER2_STRAIGHT *)0x0) ||
|
|
(((int)(uint)(byte)straight->AILanes >> (uVar13 >> 1 & 0x1f) & 1U) != 0)) &&
|
|
((curve == (DRIVER2_CURVE *)0x0 ||
|
|
(((int)(uint)(byte)curve->AILanes >> (uVar13 >> 1 & 0x1f) & 1U) != 0))))
|
|
goto LAB_0002718c;
|
|
}
|
|
}
|
|
LAB_000274bc:
|
|
bVar3 = bVar3 + 1;
|
|
} while (bVar3 < 2);
|
|
if (bVar2) {
|
|
LAB_000274d8:
|
|
*(undefined4 *)(cp->ai + 0x18) = 0xa1;
|
|
cp->ai[0x11] = bVar1;
|
|
cp->ai[0x12] = 4;
|
|
*(bool *)(cp->ai + 0xe) = local_54;
|
|
uVar12 = uVar13;
|
|
}
|
|
}
|
|
return uVar12;
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ CreateNewNode(struct _CAR_DATA *cp /*$s4*/)
|
|
// line 1637, offset 0x00027530
|
|
/* begin block 1 */
|
|
// Start line: 1638
|
|
// Start offset: 0x00027530
|
|
// Variables:
|
|
// int oldRoad; // $s1
|
|
// int cr; // $a3
|
|
// struct CIV_ROUTE_ENTRY *newNode; // $s6
|
|
// struct CIV_ROUTE_ENTRY *oldNode; // $s3
|
|
// struct DRIVER2_CURVE *curve; // $s0
|
|
// struct DRIVER2_STRAIGHT *straight; // $s5
|
|
// int turnAngle; // stack offset -56
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 1638
|
|
// Start offset: 0x00027530
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s4
|
|
// struct CIV_ROUTE_ENTRY *currentNode; // $v1
|
|
|
|
/* begin block 1.1.1 */
|
|
// Start line: 1638
|
|
// Start offset: 0x00027530
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $a0
|
|
/* end block 1.1.1 */
|
|
// End offset: 0x0002757C
|
|
// End Line: 1638
|
|
/* end block 1.1 */
|
|
// End offset: 0x0002757C
|
|
// End Line: 1638
|
|
|
|
/* begin block 1.2 */
|
|
// Start line: 1638
|
|
// Start offset: 0x0002758C
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s4
|
|
|
|
/* begin block 1.2.1 */
|
|
// Start line: 1638
|
|
// Start offset: 0x0002758C
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $a0
|
|
/* end block 1.2.1 */
|
|
// End offset: 0x0002759C
|
|
// End Line: 1638
|
|
/* end block 1.2 */
|
|
// End offset: 0x0002759C
|
|
// End Line: 1638
|
|
|
|
/* begin block 1.3 */
|
|
// Start line: 1638
|
|
// Start offset: 0x000275A8
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s4
|
|
|
|
/* begin block 1.3.1 */
|
|
// Start line: 1638
|
|
// Start offset: 0x000275A8
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $a0
|
|
/* end block 1.3.1 */
|
|
// End offset: 0x000275B8
|
|
// End Line: 1638
|
|
/* end block 1.3 */
|
|
// End offset: 0x000275B8
|
|
// End Line: 1638
|
|
|
|
/* begin block 1.4 */
|
|
// Start line: 1638
|
|
// Start offset: 0x000275C4
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s4
|
|
|
|
/* begin block 1.4.1 */
|
|
// Start line: 1638
|
|
// Start offset: 0x000275C4
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $a0
|
|
/* end block 1.4.1 */
|
|
// End offset: 0x000275D4
|
|
// End Line: 1638
|
|
/* end block 1.4 */
|
|
// End offset: 0x000275D4
|
|
// End Line: 1638
|
|
|
|
/* begin block 1.5 */
|
|
// Start line: 1653
|
|
// Start offset: 0x000275F0
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s4
|
|
// struct CIV_ROUTE_ENTRY *currentNode; // $s3
|
|
|
|
/* begin block 1.5.1 */
|
|
// Start line: 1653
|
|
// Start offset: 0x000275F0
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v1
|
|
/* end block 1.5.1 */
|
|
// End offset: 0x000275F0
|
|
// End Line: 1653
|
|
/* end block 1.5 */
|
|
// End offset: 0x000275F0
|
|
// End Line: 1653
|
|
|
|
/* begin block 1.6 */
|
|
// Start line: 1655
|
|
// Start offset: 0x000275F0
|
|
|
|
/* begin block 1.6.1 */
|
|
// Start line: 1638
|
|
// Start offset: 0x000275F0
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s4
|
|
|
|
/* begin block 1.6.1.1 */
|
|
// Start line: 1638
|
|
// Start offset: 0x000275F0
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v1
|
|
/* end block 1.6.1.1 */
|
|
// End offset: 0x00027600
|
|
// End Line: 1638
|
|
/* end block 1.6.1 */
|
|
// End offset: 0x00027600
|
|
// End Line: 1638
|
|
/* end block 1.6 */
|
|
// End offset: 0x00027610
|
|
// End Line: 1658
|
|
|
|
/* begin block 1.7 */
|
|
// Start line: 1659
|
|
// Start offset: 0x00027634
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s4
|
|
// struct CIV_ROUTE_ENTRY *currentNode; // $s3
|
|
|
|
/* begin block 1.7.1 */
|
|
// Start line: 1659
|
|
// Start offset: 0x00027634
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $s2
|
|
/* end block 1.7.1 */
|
|
// End offset: 0x0002764C
|
|
// End Line: 1659
|
|
/* end block 1.7 */
|
|
// End offset: 0x0002764C
|
|
// End Line: 1659
|
|
|
|
/* begin block 1.8 */
|
|
// Start line: 1681
|
|
// Start offset: 0x000276E8
|
|
// Variables:
|
|
// int travelDir; // $a1
|
|
// int segmentEnd; // $a0
|
|
|
|
/* begin block 1.8.1 */
|
|
// Start line: 1688
|
|
// Start offset: 0x000277B0
|
|
// Variables:
|
|
// int startDist; // stack offset -52
|
|
/* end block 1.8.1 */
|
|
// End offset: 0x00027808
|
|
// End Line: 1688
|
|
/* end block 1.8 */
|
|
// End offset: 0x00027818
|
|
// End Line: 1688
|
|
|
|
/* begin block 1.9 */
|
|
// Start line: 1692
|
|
// Start offset: 0x0002784C
|
|
// Variables:
|
|
// int travelDir; // $a2
|
|
// int segmentEnd; // $t0
|
|
|
|
/* begin block 1.9.1 */
|
|
// Start line: 1699
|
|
// Start offset: 0x00027954
|
|
// Variables:
|
|
// int startDist; // stack offset -48
|
|
/* end block 1.9.1 */
|
|
// End offset: 0x00027990
|
|
// End Line: 1699
|
|
/* end block 1.9 */
|
|
// End offset: 0x000279A4
|
|
// End Line: 1700
|
|
|
|
/* begin block 1.10 */
|
|
// Start line: 1717
|
|
// Start offset: 0x00027A18
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY tmpNode; // stack offset -72
|
|
|
|
/* begin block 1.10.1 */
|
|
// Start line: 1721
|
|
// Start offset: 0x00027A58
|
|
// Variables:
|
|
// int travelDir; // $a0
|
|
/* end block 1.10.1 */
|
|
// End offset: 0x00027B18
|
|
// End Line: 1732
|
|
|
|
/* begin block 1.10.2 */
|
|
// Start line: 1739
|
|
// Start offset: 0x00027B90
|
|
// Variables:
|
|
// struct _CAR_DATA *playerCar; // $v0
|
|
// int dx; // $v1
|
|
// int dz; // $a0
|
|
/* end block 1.10.2 */
|
|
// End offset: 0x00027C00
|
|
// End Line: 1744
|
|
|
|
/* begin block 1.10.3 */
|
|
// Start line: 1751
|
|
// Start offset: 0x00027C38
|
|
// Variables:
|
|
// int tryToPark; // $s1
|
|
/* end block 1.10.3 */
|
|
// End offset: 0x00027DA0
|
|
// End Line: 1773
|
|
|
|
/* begin block 1.10.4 */
|
|
// Start line: 1779
|
|
// Start offset: 0x00027E04
|
|
// Variables:
|
|
// int radOfCrv; // $s5
|
|
// int cornerAngle; // $a3
|
|
// int segLength; // $s0
|
|
// int tmp; // $a1
|
|
// int dx; // $s1
|
|
// int dz; // $s0
|
|
|
|
/* begin block 1.10.4.1 */
|
|
// Start line: 1789
|
|
// Start offset: 0x00027EBC
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s4
|
|
|
|
/* begin block 1.10.4.1.1 */
|
|
// Start line: 1789
|
|
// Start offset: 0x00027EBC
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $a0
|
|
/* end block 1.10.4.1.1 */
|
|
// End offset: 0x00027F44
|
|
// End Line: 1792
|
|
/* end block 1.10.4.1 */
|
|
// End offset: 0x00027F44
|
|
// End Line: 1792
|
|
|
|
/* begin block 1.10.4.2 */
|
|
// Start line: 1800
|
|
// Start offset: 0x00027F78
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s4
|
|
|
|
/* begin block 1.10.4.2.1 */
|
|
// Start line: 1800
|
|
// Start offset: 0x00027F78
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $a0
|
|
/* end block 1.10.4.2.1 */
|
|
// End offset: 0x0002800C
|
|
// End Line: 1803
|
|
/* end block 1.10.4.2 */
|
|
// End offset: 0x0002800C
|
|
// End Line: 1803
|
|
/* end block 1.10.4 */
|
|
// End offset: 0x0002800C
|
|
// End Line: 1806
|
|
|
|
/* begin block 1.10.5 */
|
|
// Start line: 1810
|
|
// Start offset: 0x0002800C
|
|
|
|
/* begin block 1.10.5.1 */
|
|
// Start line: 1638
|
|
// Start offset: 0x0002800C
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s4
|
|
// struct CIV_ROUTE_ENTRY *currentNode; // $s6
|
|
|
|
/* begin block 1.10.5.1.1 */
|
|
// Start line: 1638
|
|
// Start offset: 0x0002800C
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v0
|
|
/* end block 1.10.5.1.1 */
|
|
// End offset: 0x0002800C
|
|
// End Line: 1638
|
|
/* end block 1.10.5.1 */
|
|
// End offset: 0x0002800C
|
|
// End Line: 1638
|
|
/* end block 1.10.5 */
|
|
// End offset: 0x0002801C
|
|
// End Line: 1814
|
|
/* end block 1.10 */
|
|
// End offset: 0x0002801C
|
|
// End Line: 1814
|
|
/* end block 1 */
|
|
// End offset: 0x000280D8
|
|
// End Line: 1828
|
|
|
|
/* begin block 2 */
|
|
// Start line: 3743
|
|
/* end block 2 */
|
|
// End Line: 3744
|
|
|
|
/* begin block 3 */
|
|
// Start line: 3758
|
|
/* end block 3 */
|
|
// End Line: 3759
|
|
|
|
/* WARNING: Could not reconcile some variable overlaps */
|
|
|
|
int CreateNewNode(_CAR_DATA *cp)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
short sVar1;
|
|
uint uVar2;
|
|
long lVar3;
|
|
_CAR_DATA *oldNode;
|
|
_CAR_DATA *p_Var4;
|
|
_CAR_DATA *p_Var5;
|
|
int iVar6;
|
|
undefined4 uVar7;
|
|
_CAR_DATA *p_Var8;
|
|
int iVar9;
|
|
uint tryToPark;
|
|
DRIVER2_CURVE *curve;
|
|
int iVar10;
|
|
int iVar11;
|
|
DRIVER2_STRAIGHT *straight;
|
|
short local_48;
|
|
int local_40;
|
|
int local_3c;
|
|
int local_38;
|
|
int local_34;
|
|
int local_30[2];
|
|
|
|
oldNode = *(_CAR_DATA **)(cp->ai + 0xf4);
|
|
p_Var8 = (_CAR_DATA *)(cp->ai + 0xf4);
|
|
tstNode1 = (CIV_ROUTE_ENTRY *)((oldNode->hd).where.m + 8);
|
|
local_38 = 0;
|
|
if (p_Var8 <= tstNode1) {
|
|
tstNode1 = (CIV_ROUTE_ENTRY *)(oldNode[-1].ai + 0x50);
|
|
}
|
|
p_Var5 = (_CAR_DATA *)((oldNode->hd).where.m + 8);
|
|
if (cp < tstNode1) {
|
|
if (p_Var8 <= p_Var5) {
|
|
p_Var5 = (_CAR_DATA *)(oldNode[-1].ai + 0x50);
|
|
}
|
|
p_Var4 = (_CAR_DATA *)&(oldNode->hd).drawCarMat;
|
|
if (p_Var5 < cp + 1) {
|
|
p_Var5 = p_Var4;
|
|
if (p_Var8 <= p_Var4) {
|
|
p_Var5 = (_CAR_DATA *)(oldNode[-1].ai + 0x60);
|
|
}
|
|
if (cp < p_Var5) {
|
|
if (p_Var8 <= p_Var4) {
|
|
p_Var4 = (_CAR_DATA *)(oldNode[-1].ai + 0x60);
|
|
}
|
|
if ((p_Var4 < cp + 1) && (oldNode != (_CAR_DATA *)0x0)) {
|
|
do {
|
|
p_Var4 = (_CAR_DATA *)((oldNode->hd).where.m + 8);
|
|
p_Var5 = p_Var4;
|
|
if (p_Var8 <= p_Var4) {
|
|
p_Var5 = (_CAR_DATA *)(oldNode[-1].ai + 0x50);
|
|
}
|
|
if ((p_Var5->hd).where.m[1] == 0x7f) {
|
|
tryToPark = *(uint *)cp->ai;
|
|
if (p_Var8 <= p_Var4) {
|
|
p_Var4 = (_CAR_DATA *)(oldNode[-1].ai + 0x50);
|
|
}
|
|
if ((uint)(byte)cp->id == makeNextNodeCtrlNode) {
|
|
*(_CAR_DATA **)(cp->ai + 8) = p_Var4;
|
|
makeNextNodeCtrlNode = -1;
|
|
}
|
|
if (((((tryToPark & 0xffffe000) != 0) ||
|
|
(NumDriver2Straights <= (int)(tryToPark & 0x1fff))) &&
|
|
(((tryToPark & 0xffffe000) != 0x4000 ||
|
|
(NumDriver2Curves <= (int)(tryToPark & 0x1fff))))) || ((int)tryToPark < 0))
|
|
break;
|
|
if (((tryToPark & 0xffffe000) == 0) &&
|
|
((int)(tryToPark & 0x1fff) < NumDriver2Straights)) {
|
|
straight = Driver2StraightsPtr + tryToPark;
|
|
if ((*(uint *)(straight->ConnectIdx + 3) & 0xffff0000) == 0xff010000) {
|
|
uVar2 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar2 = (int)(uint)(byte)straight->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
iVar9 = -1;
|
|
if ((uVar2 & 1) == 0) {
|
|
iVar9 = 1;
|
|
}
|
|
uVar2 = (uint)straight->length;
|
|
iVar6 = *(int *)((oldNode->hd).where.m + 2) + iVar9 * 0x400;
|
|
*(int *)((p_Var4->hd).where.m + 2) = iVar6;
|
|
(p_Var4->hd).where.m[0] = (oldNode->hd).where.m[0];
|
|
if (((0 < iVar9) && ((int)uVar2 < iVar6)) || ((iVar9 < 0 && (iVar6 < 0)))) {
|
|
if (((iVar9 < 1) || (*(int *)((oldNode->hd).where.m + 2) < (int)uVar2)) &&
|
|
((-1 < iVar9 || (0 < *(int *)((oldNode->hd).where.m + 2))))) {
|
|
if (iVar9 < 1) {
|
|
LAB_000279a0:
|
|
*(undefined4 *)((p_Var4->hd).where.m + 2) = 0;
|
|
}
|
|
else {
|
|
*(uint *)((p_Var4->hd).where.m + 2) = uVar2;
|
|
}
|
|
}
|
|
else {
|
|
iVar9 = GetNextRoadInfo(cp, 1, &local_38, &local_34, (CIV_ROUTE_ENTRY *)oldNode);
|
|
*(int *)cp->ai = iVar9;
|
|
(p_Var4->hd).where.m[0] = (oldNode->hd).where.m[0] + (short)local_38 & 0xfff;
|
|
*(int *)((p_Var4->hd).where.m + 2) = local_34;
|
|
LAB_000277f0:
|
|
if (*(int *)cp->ai == -1) break;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
if (((tryToPark & 0xffffe000) == 0x4000) &&
|
|
(((int)(tryToPark & 0x1fff) < NumDriver2Curves && (-1 < (int)tryToPark)))) {
|
|
curve = Driver2CurvesPtr + (tryToPark - 0x4000);
|
|
if (*(short *)&curve->NumLanes == -0xff) {
|
|
uVar2 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar2 = (int)(uint)(byte)curve->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
iVar9 = -1;
|
|
if ((uVar2 & 1) == 0) {
|
|
iVar9 = 1;
|
|
}
|
|
uVar2 = (int)curve->end - (int)curve->start & 0xfff;
|
|
if ((byte)curve->inside < 10) {
|
|
iVar6 = iVar9 << 7;
|
|
}
|
|
else {
|
|
iVar6 = iVar9 << 6;
|
|
if (0x13 < (byte)curve->inside) {
|
|
iVar6 = iVar9 << 5;
|
|
}
|
|
}
|
|
iVar6 = *(int *)((oldNode->hd).where.m + 2) + iVar6;
|
|
*(int *)((p_Var4->hd).where.m + 2) = iVar6;
|
|
(p_Var4->hd).where.m[0] =
|
|
(p_Var4->hd).where.m[2] + curve->start + (short)iVar9 * 0x400 & 0xfff;
|
|
if (((0 < iVar9) && ((int)uVar2 < iVar6)) || ((iVar9 < 0 && (iVar6 < 0)))) {
|
|
if (((0 < iVar9) && ((int)uVar2 <= *(int *)((oldNode->hd).where.m + 2))) ||
|
|
((iVar9 < 0 && (*(int *)((oldNode->hd).where.m + 2) < 1)))) {
|
|
iVar9 = GetNextRoadInfo(cp, 1, &local_38, local_30, (CIV_ROUTE_ENTRY *)oldNode);
|
|
*(int *)cp->ai = iVar9;
|
|
(p_Var4->hd).where.m[0] = (oldNode->hd).where.m[0] + (short)local_38 & 0xfff;
|
|
*(int *)((p_Var4->hd).where.m + 2) = local_30[0];
|
|
goto LAB_000277f0;
|
|
}
|
|
if (iVar9 < 1) goto LAB_000279a0;
|
|
*(uint *)((p_Var4->hd).where.m + 2) = uVar2;
|
|
}
|
|
}
|
|
}
|
|
uVar2 = *(uint *)cp->ai;
|
|
if (-1 < (int)uVar2) {
|
|
curve = (DRIVER2_CURVE *)0x0;
|
|
if (((uVar2 & 0xffffe000) == 0x4000) &&
|
|
(straight = (DRIVER2_STRAIGHT *)0x0, (int)(uVar2 & 0x1fff) < NumDriver2Curves)) {
|
|
curve = Driver2CurvesPtr + (uVar2 - 0x4000);
|
|
}
|
|
else {
|
|
straight = Driver2StraightsPtr + uVar2;
|
|
}
|
|
local_40 = *(int *)((p_Var4->hd).where.m + 4);
|
|
local_3c = *(int *)((p_Var4->hd).where.m + 6);
|
|
if ((tryToPark != uVar2) && (local_38 == 0)) {
|
|
if (straight == (DRIVER2_STRAIGHT *)0x0) {
|
|
if (*(short *)&curve->NumLanes == -0xff) {
|
|
tryToPark = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
tryToPark = (int)(uint)(byte)curve->LaneDirs >>
|
|
((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
iVar9 = -1;
|
|
if ((tryToPark & 1) == 0) {
|
|
iVar9 = 1;
|
|
}
|
|
iVar6 = iVar9 << 7;
|
|
if ((9 < (byte)curve->inside) &&
|
|
(iVar6 = iVar9 << 6, 0x13 < (byte)curve->inside)) {
|
|
iVar6 = iVar9 << 5;
|
|
}
|
|
iVar6 = *(int *)((p_Var4->hd).where.m + 2) + iVar6;
|
|
}
|
|
else {
|
|
if ((*(uint *)(straight->ConnectIdx + 3) & 0xffff0000) == 0xff010000) {
|
|
tryToPark = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
tryToPark = (int)(uint)(byte)straight->LaneDirs >>
|
|
((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
iVar9 = -1;
|
|
if ((tryToPark & 1) == 0) {
|
|
iVar9 = 1;
|
|
}
|
|
iVar6 = *(int *)((p_Var4->hd).where.m + 2) + iVar9 * 0x400;
|
|
}
|
|
*(int *)((p_Var4->hd).where.m + 2) = iVar6;
|
|
}
|
|
if ((((gCurrentMissionNumber == 0x21) &&
|
|
(iVar9 = CarHasSiren((uint)(byte)car_data[player.playerCarId].ap.model),
|
|
iVar9 != 0)) && (player.horn.on != '\0')) &&
|
|
(((cp->ap).model == '\x04' &&
|
|
(iVar9 = car_data[player.playerCarId].hd.where.t[0] - (cp->hd).where.t[0],
|
|
iVar6 = car_data[player.playerCarId].hd.where.t[2] - (cp->hd).where.t[2],
|
|
iVar9 * iVar9 + iVar6 * iVar6 < 16000000)))) {
|
|
makeLimoPullOver = '\x01';
|
|
}
|
|
lVar3 = Random2(0);
|
|
if (((lVar3 + (uint)(byte)cp->id * 0x20 & 0xf1) == 0xf1) ||
|
|
(makeLimoPullOver != '\0')) {
|
|
tryToPark = 0;
|
|
if (numParkedCars < maxParkedCars) {
|
|
tryToPark = Random2(0);
|
|
tryToPark = (uint)((tryToPark & 2) != 0);
|
|
}
|
|
if ((gCurrentMissionNumber == 0x21) && ((cp->ap).model == '\x04')) {
|
|
tryToPark = (uint)(makeLimoPullOver != '\0');
|
|
}
|
|
uVar2 = CheckChangeLanes(straight, curve, *(int *)((p_Var4->hd).where.m + 2), cp,
|
|
tryToPark);
|
|
uVar2 = uVar2 & 0xff;
|
|
if (((uVar2 != (uint)cp->ai[0xfb]) && (cp->ai[0xfb] = (byte)uVar2, tryToPark != 0)
|
|
) && ((makeLimoPullOver != '\0' ||
|
|
((cp->ai[0xc] == 0 &&
|
|
(((straight != (DRIVER2_STRAIGHT *)0x0 &&
|
|
(((uVar2 == 0 && ((straight->NumLanes & 0x40U) != 0)) ||
|
|
((((uint)(byte)straight->NumLanes & 0xf) * 2 - 1 ==
|
|
(uint)cp->ai[0xfb] && ((straight->NumLanes & 0x80U) != 0)))))) ||
|
|
((curve != (DRIVER2_CURVE *)0x0 &&
|
|
(((cp->ai[0xfb] == 0 && ((curve->NumLanes & 0x40U) != 0)) ||
|
|
((((uint)(byte)curve->NumLanes & 0xf) * 2 - 1 == (uint)cp->ai[0xfb]
|
|
&& ((curve->NumLanes & 0x80U) != 0)))))))))))))) {
|
|
makeNextNodeCtrlNode = ZEXT14((byte)cp->id);
|
|
cp->ai[0xc] = 8;
|
|
*(_CAR_DATA **)(cp->ai + 8) = p_Var4;
|
|
cp->ai[0x12] = 0;
|
|
}
|
|
}
|
|
tryToPark = *(uint *)(p_Var4->hd).where.m;
|
|
uVar7 = *(undefined4 *)((p_Var4->hd).where.m + 2);
|
|
local_40 = *(int *)((p_Var4->hd).where.m + 4);
|
|
local_3c = *(int *)((p_Var4->hd).where.m + 6);
|
|
GetNodePos(straight, (DRIVER2_JUNCTION *)0x0, curve, *(int *)((p_Var4->hd).where.m + 2)
|
|
, cp, &local_40, &local_3c, (uint)cp->ai[0xfb]);
|
|
if (local_38 == -0x400) {
|
|
iVar11 = local_40 - *(int *)((oldNode->hd).where.m + 4);
|
|
iVar10 = local_3c - *(int *)((oldNode->hd).where.m + 6);
|
|
iVar9 = (cp->hd).wheel_speed / 0xaa;
|
|
iVar6 = SquareRoot0(iVar11 * iVar11 + iVar10 * iVar10);
|
|
iVar10 = ratan2(iVar11, iVar10);
|
|
uVar2 = ((iVar10 - (oldNode->hd).where.m[0]) + 0x800U & 0xfff) - 0x800;
|
|
iVar10 = (iVar6 - iVar9) * (int)rcossin_tbl[(uVar2 & 0xfff) * 2 + 1] + 0x800 >>
|
|
0xc;
|
|
p_Var5 = p_Var4;
|
|
if (0 < iVar10) {
|
|
*(int *)((p_Var4->hd).where.m + 4) =
|
|
*(int *)((oldNode->hd).where.m + 4) +
|
|
(iVar10 * rcossin_tbl[((uint)(ushort)(oldNode->hd).where.m[0] & 0xfff) * 2]
|
|
+ 0x800 >> 0xc);
|
|
p_Var5 = (_CAR_DATA *)((p_Var4->hd).where.m + 8);
|
|
*(int *)((p_Var4->hd).where.m + 6) =
|
|
*(int *)((oldNode->hd).where.m + 6) +
|
|
(iVar10 * rcossin_tbl
|
|
[((uint)(ushort)(oldNode->hd).where.m[0] & 0xfff) * 2 + 1] +
|
|
0x800 >> 0xc);
|
|
sVar1 = (oldNode->hd).where.m[0];
|
|
(p_Var4->hd).where.m[1] = 1;
|
|
(p_Var4->hd).where.m[0] = sVar1;
|
|
if (p_Var8 <= p_Var5) {
|
|
p_Var5 = (_CAR_DATA *)(p_Var4[-1].ai + 0x50);
|
|
}
|
|
}
|
|
iVar9 = (iVar6 - iVar9) * (int)rcossin_tbl[(uVar2 & 0xfff) * 2] + 0x800 >> 0xc;
|
|
p_Var4 = p_Var5;
|
|
if (iVar9 < 0) {
|
|
local_48 = (short)tryToPark;
|
|
*(int *)((p_Var5->hd).where.m + 4) =
|
|
local_40 + (iVar9 * rcossin_tbl[(tryToPark & 0xfff) * 2] + 0x800 >> 0xc);
|
|
p_Var4 = (_CAR_DATA *)((p_Var5->hd).where.m + 8);
|
|
*(int *)((p_Var5->hd).where.m + 6) =
|
|
local_3c +
|
|
(iVar9 * rcossin_tbl[(tryToPark & 0xfff) * 2 + 1] + 0x800 >> 0xc);
|
|
(p_Var5->hd).where.m[1] = 1;
|
|
(p_Var5->hd).where.m[0] = local_48;
|
|
if (p_Var8 <= p_Var4) {
|
|
p_Var4 = (_CAR_DATA *)(p_Var5[-1].ai + 0x50);
|
|
}
|
|
}
|
|
}
|
|
if ((p_Var4->hd).where.m[1] == 0x7f) {
|
|
*(uint *)(p_Var4->hd).where.m = tryToPark;
|
|
*(undefined4 *)((p_Var4->hd).where.m + 2) = uVar7;
|
|
*(int *)((p_Var4->hd).where.m + 4) = local_40;
|
|
if (local_40 < 0) {
|
|
local_40 = -local_40;
|
|
}
|
|
*(int *)((p_Var4->hd).where.m + 6) = local_3c;
|
|
if (local_40 < 600000) {
|
|
if (local_38 != 0) {
|
|
*(int *)(cp->ai + 0x14) = (int)p_Var4 + (-0x1b0 - (int)cp) >> 4;
|
|
*(bool *)(cp->ai + 0xf) = local_38 == 0x400;
|
|
}
|
|
(p_Var4->hd).where.m[1] = 1;
|
|
return 1;
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
if (p_Var8 <= p_Var4) {
|
|
p_Var4 = (_CAR_DATA *)(oldNode[-1].ai + 0x50);
|
|
}
|
|
oldNode = p_Var4;
|
|
} while (p_Var4 != *(_CAR_DATA **)(cp->ai + 0xf4));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
cp->ai[0xf9] = 3;
|
|
cp->ai[0xc] = 7;
|
|
return 0;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ InitCivState(struct _CAR_DATA *cp /*$s1*/, char *extraData /*$s2*/)
|
|
// line 1843, offset 0x000280d8
|
|
/* begin block 1 */
|
|
// Start line: 1844
|
|
// Start offset: 0x000280D8
|
|
// Variables:
|
|
// struct CIV_STATE *cs; // $s0
|
|
/* end block 1 */
|
|
// End offset: 0x000282E8
|
|
// End Line: 1887
|
|
|
|
/* begin block 2 */
|
|
// Start line: 4201
|
|
/* end block 2 */
|
|
// End Line: 4202
|
|
|
|
/* begin block 3 */
|
|
// Start line: 4217
|
|
/* end block 3 */
|
|
// End Line: 4218
|
|
|
|
int InitCivState(_CAR_DATA *cp, char *extraData)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
uint uVar1;
|
|
long lVar2;
|
|
int iVar3;
|
|
uint *puVar4;
|
|
|
|
puVar4 = (uint *)cp->ai;
|
|
cp->controlType = '\x02';
|
|
if (extraData == (char *)0x0) {
|
|
cp->ai[0xf9] = 0;
|
|
}
|
|
else {
|
|
cp->ai[0xf9] = extraData[0xc];
|
|
}
|
|
if (cp->ai[0xf9] == 3) {
|
|
LAB_000282b4:
|
|
if (extraData == (char *)0x0) {
|
|
cp->ai[0xc] = 0;
|
|
}
|
|
else {
|
|
cp->ai[0xc] = extraData[10];
|
|
}
|
|
iVar3 = 1;
|
|
}
|
|
else {
|
|
if (extraData == (char *)0x0) {
|
|
uVar1 = GetSurfaceIndex((VECTOR *)(cp->hd).where.t);
|
|
*puVar4 = uVar1;
|
|
}
|
|
else {
|
|
*puVar4 = *(uint *)extraData;
|
|
}
|
|
uVar1 = *puVar4;
|
|
if (-1 < (int)uVar1) {
|
|
*(undefined4 *)(cp->ai + 4) = 0;
|
|
*(undefined4 *)(cp->ai + 0xf4) = 0;
|
|
*(undefined4 *)(cp->ai + 8) = 0;
|
|
*(undefined4 *)(cp->ai + 0x14) = 0xffffffff;
|
|
if (((((uVar1 & 0xffffe000) == 0) && ((int)(uVar1 & 0x1fff) < NumDriver2Straights)) ||
|
|
(((uVar1 & 0xffffe000) == 0x4000 && ((int)(uVar1 & 0x1fff) < NumDriver2Curves)))) &&
|
|
(uVar1 = *puVar4, -1 < (int)uVar1)) {
|
|
if (cp->ai[0xf9] != 3) {
|
|
if (((uVar1 & 0xffffe000) == 0) && ((int)(uVar1 & 0x1fff) < NumDriver2Straights)) {
|
|
cp->ai[0xf8] = speedLimits[(uint)((byte)Driver2StraightsPtr[uVar1].NumLanes >> 4) & 3];
|
|
}
|
|
else {
|
|
cp->ai[0xf8] = speedLimits
|
|
[(uint)((byte)Driver2CurvesPtr[uVar1 - 0x4000].NumLanes >> 4) & 3];
|
|
}
|
|
InitNodeList(cp, extraData);
|
|
*(byte **)(cp->ai + 0xf4) = cp->ai + 0x24;
|
|
lVar2 = *(long *)(cp->ai + 0x30);
|
|
(cp->hd).where.t[0] = *(long *)(cp->ai + 0x2c);
|
|
(cp->hd).where.t[2] = lVar2;
|
|
if (cp->ai[0xf9] != 3) {
|
|
return 1;
|
|
}
|
|
}
|
|
goto LAB_000282b4;
|
|
}
|
|
}
|
|
iVar3 = 0;
|
|
cp->ai[0xf9] = 3;
|
|
cp->ai[0xc] = 7;
|
|
}
|
|
return iVar3;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ PingOutCar(struct _CAR_DATA *cp /*$s0*/)
|
|
// line 1977, offset 0x0002cf80
|
|
/* begin block 1 */
|
|
// Start line: 7534
|
|
/* end block 1 */
|
|
// End Line: 7535
|
|
|
|
/* begin block 2 */
|
|
// Start line: 3954
|
|
/* end block 2 */
|
|
// End Line: 3955
|
|
|
|
/* begin block 3 */
|
|
// Start line: 7535
|
|
/* end block 3 */
|
|
// End Line: 7536
|
|
|
|
int PingOutCar(_CAR_DATA *cp)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
int iVar1;
|
|
uint *puVar2;
|
|
|
|
testNumPingedOut = testNumPingedOut + 1;
|
|
if (cp->controlType == '\x02') {
|
|
if ((cp->controlFlags & 1) != 0) {
|
|
numCopCars = numCopCars + -1;
|
|
}
|
|
numCivCars = numCivCars + -1;
|
|
if ((cp->ai[0xf9] == 3) && (cp->ai[0xc] == 5)) {
|
|
numParkedCars = numParkedCars + -1;
|
|
}
|
|
}
|
|
else {
|
|
if ((PingOutCivsOnly != '\0') &&
|
|
(iVar1 = valid_region((cp->hd).where.t[0], (cp->hd).where.t[2]), iVar1 != 0)) {
|
|
return 0;
|
|
}
|
|
}
|
|
puVar2 = (uint *)cp->inform;
|
|
if (puVar2 != (uint *)0x0) {
|
|
*puVar2 = *puVar2 ^ 0x40000000;
|
|
}
|
|
ClearMem((char *)cp, 0x29c);
|
|
cp->controlType = '\0';
|
|
return 1;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ PingOutAllSpecialCivCars()
|
|
// line 2016, offset 0x000282e8
|
|
/* begin block 1 */
|
|
// Start line: 2018
|
|
// Start offset: 0x000282E8
|
|
// Variables:
|
|
// struct _CAR_DATA *lcp; // $s0
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 2017
|
|
// Start offset: 0x00028348
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
/* end block 1.1 */
|
|
// End offset: 0x000283E4
|
|
// End Line: 2017
|
|
/* end block 1 */
|
|
// End offset: 0x0002840C
|
|
// End Line: 2025
|
|
|
|
/* begin block 2 */
|
|
// Start line: 4449
|
|
/* end block 2 */
|
|
// End Line: 4450
|
|
|
|
/* begin block 3 */
|
|
// Start line: 4579
|
|
/* end block 3 */
|
|
// End Line: 4580
|
|
|
|
/* begin block 4 */
|
|
// Start line: 4580
|
|
/* end block 4 */
|
|
// End Line: 4581
|
|
|
|
/* begin block 5 */
|
|
// Start line: 4581
|
|
/* end block 5 */
|
|
// End Line: 4582
|
|
|
|
/* WARNING: Unknown calling convention yet parameter storage is locked */
|
|
|
|
int PingOutAllSpecialCivCars(void)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
uint *puVar1;
|
|
_CAR_DATA *mem;
|
|
|
|
mem = car_data;
|
|
do {
|
|
if ((mem->controlType == '\x02') && (4 < MissionHeader->residentModels[(byte)(mem->ap).model]))
|
|
{
|
|
testNumPingedOut = testNumPingedOut + 1;
|
|
if ((mem->controlFlags & 1) != 0) {
|
|
numCopCars = numCopCars + -1;
|
|
}
|
|
numCivCars = numCivCars + -1;
|
|
if ((mem->ai[0xf9] == 3) && (mem->ai[0xc] == 5)) {
|
|
numParkedCars = numParkedCars + -1;
|
|
}
|
|
puVar1 = (uint *)mem->inform;
|
|
if (puVar1 != (uint *)0x0) {
|
|
*puVar1 = *puVar1 ^ 0x40000000;
|
|
}
|
|
ClearMem((char *)mem, 0x29c);
|
|
mem->controlType = '\0';
|
|
}
|
|
mem = mem + 1;
|
|
} while (mem < car_data + 0x14);
|
|
return 1;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ PingOutAllCivCarsAndCopCars()
|
|
// line 2028, offset 0x0002840c
|
|
/* begin block 1 */
|
|
// Start line: 2030
|
|
// Start offset: 0x0002840C
|
|
// Variables:
|
|
// struct _CAR_DATA *lcp; // $s0
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 2029
|
|
// Start offset: 0x0002844C
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
/* end block 1.1 */
|
|
// End offset: 0x0002852C
|
|
// End Line: 2029
|
|
/* end block 1 */
|
|
// End offset: 0x00028554
|
|
// End Line: 2037
|
|
|
|
/* begin block 2 */
|
|
// Start line: 4601
|
|
/* end block 2 */
|
|
// End Line: 4602
|
|
|
|
/* begin block 3 */
|
|
// Start line: 4605
|
|
/* end block 3 */
|
|
// End Line: 4606
|
|
|
|
/* begin block 4 */
|
|
// Start line: 4606
|
|
/* end block 4 */
|
|
// End Line: 4607
|
|
|
|
/* begin block 5 */
|
|
// Start line: 4607
|
|
/* end block 5 */
|
|
// End Line: 4608
|
|
|
|
/* WARNING: Unknown calling convention yet parameter storage is locked */
|
|
|
|
int PingOutAllCivCarsAndCopCars(void)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
int iVar1;
|
|
uint *puVar2;
|
|
_CAR_DATA *mem;
|
|
|
|
mem = car_data;
|
|
do {
|
|
if ((uint)mem->controlType - 2 < 2) {
|
|
testNumPingedOut = testNumPingedOut + 1;
|
|
if (mem->controlType == 2) {
|
|
if ((mem->controlFlags & 1) != 0) {
|
|
numCopCars = numCopCars + -1;
|
|
}
|
|
numCivCars = numCivCars + -1;
|
|
if ((mem->ai[0xf9] == 3) && (mem->ai[0xc] == 5)) {
|
|
numParkedCars = numParkedCars + -1;
|
|
}
|
|
}
|
|
else {
|
|
if ((PingOutCivsOnly != '\0') &&
|
|
(iVar1 = valid_region((mem->hd).where.t[0], (mem->hd).where.t[2]), iVar1 != 0))
|
|
goto LAB_0002852c;
|
|
}
|
|
puVar2 = (uint *)mem->inform;
|
|
if (puVar2 != (uint *)0x0) {
|
|
*puVar2 = *puVar2 ^ 0x40000000;
|
|
}
|
|
ClearMem((char *)mem, 0x29c);
|
|
mem->controlType = '\0';
|
|
}
|
|
LAB_0002852c:
|
|
mem = mem + 1;
|
|
if ((_CAR_DATA *)((int)&car_data[0x13].lastPad + 3U) < mem) {
|
|
return 1;
|
|
}
|
|
} while (true);*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ CheckPingOut(struct _CAR_DATA *cp /*$s0*/)
|
|
// line 2050, offset 0x00028554
|
|
/* begin block 1 */
|
|
// Start line: 2051
|
|
// Start offset: 0x00028554
|
|
// Variables:
|
|
// int dx; // $a0
|
|
// int dz; // $v1
|
|
// int dist; // $s1
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 2051
|
|
// Start offset: 0x000285B8
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
/* end block 1.1 */
|
|
// End offset: 0x00028694
|
|
// End Line: 2051
|
|
/* end block 1 */
|
|
// End offset: 0x000286E0
|
|
// End Line: 2081
|
|
|
|
/* begin block 2 */
|
|
// Start line: 4648
|
|
/* end block 2 */
|
|
// End Line: 4649
|
|
|
|
/* begin block 3 */
|
|
// Start line: 4651
|
|
/* end block 3 */
|
|
// End Line: 4652
|
|
|
|
/* begin block 4 */
|
|
// Start line: 4656
|
|
/* end block 4 */
|
|
// End Line: 4657
|
|
|
|
int CheckPingOut(_CAR_DATA *cp)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
int iVar1;
|
|
int iVar2;
|
|
uint *puVar3;
|
|
int z;
|
|
int x;
|
|
|
|
x = (cp->hd).where.t[0];
|
|
iVar2 = (player.spoolXZ)->vx - x;
|
|
z = (cp->hd).where.t[2];
|
|
iVar1 = (player.spoolXZ)->vz - z;
|
|
iVar1 = iVar2 * iVar2 + iVar1 * iVar1;
|
|
if (576000000 < iVar1) {
|
|
testNumPingedOut = testNumPingedOut + 1;
|
|
if (cp->controlType == '\x02') {
|
|
if ((cp->controlFlags & 1) != 0) {
|
|
numCopCars = numCopCars + -1;
|
|
}
|
|
numCivCars = numCivCars + -1;
|
|
if ((cp->ai[0xf9] == 3) && (cp->ai[0xc] == 5)) {
|
|
numParkedCars = numParkedCars + -1;
|
|
}
|
|
}
|
|
else {
|
|
if ((PingOutCivsOnly != '\0') && (iVar2 = valid_region(x, z), iVar2 != 0)) goto LAB_00028694;
|
|
}
|
|
puVar3 = (uint *)cp->inform;
|
|
if (puVar3 != (uint *)0x0) {
|
|
*puVar3 = *puVar3 ^ 0x40000000;
|
|
}
|
|
ClearMem((char *)cp, 0x29c);
|
|
cp->controlType = '\0';
|
|
}
|
|
LAB_00028694:
|
|
if ((requestStationaryCivCar == 1) && (distFurthestCivCarSq < iVar1)) {
|
|
furthestCivID = cp->id;
|
|
distFurthestCivCarSq = iVar1;
|
|
}
|
|
return 1;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ SetUpTrafficLightPhase()
|
|
// line 2084, offset 0x0002d220
|
|
/* begin block 1 */
|
|
// Start line: 7728
|
|
/* end block 1 */
|
|
// End Line: 7729
|
|
|
|
/* begin block 2 */
|
|
// Start line: 8898
|
|
/* end block 2 */
|
|
// End Line: 8899
|
|
|
|
/* begin block 3 */
|
|
// Start line: 8899
|
|
/* end block 3 */
|
|
// End Line: 8900
|
|
|
|
/* WARNING: Unknown calling convention yet parameter storage is locked */
|
|
|
|
void SetUpTrafficLightPhase(void)
|
|
{
|
|
UNIMPLEMENTED();
|
|
/*
|
|
int iVar1;
|
|
|
|
iVar1 = TrafficLightCycle(0);
|
|
junctionLightsPhase = (char)iVar1;
|
|
iVar1 = TrafficLightCycle(1);
|
|
CHAR_00h_000aab91 = (char)iVar1;
|
|
return;
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ TrafficLightCycle(int exit /*$a0*/)
|
|
// line 2116, offset 0x0002cf18
|
|
/* begin block 1 */
|
|
// Start line: 2117
|
|
// Start offset: 0x0002CF18
|
|
// Variables:
|
|
// int timeCnt; // $v1
|
|
/* end block 1 */
|
|
// End offset: 0x0002CF80
|
|
// End Line: 2141
|
|
|
|
/* begin block 2 */
|
|
// Start line: 4232
|
|
/* end block 2 */
|
|
// End Line: 4233
|
|
|
|
/* begin block 3 */
|
|
// Start line: 7647
|
|
/* end block 3 */
|
|
// End Line: 7648
|
|
|
|
int TrafficLightCycle(int exit)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
bool bVar1;
|
|
int iVar2;
|
|
uint uVar3;
|
|
|
|
uVar3 = CameraCnt - frameStart & 0x1ff;
|
|
if ((exit == 0) || (exit == 2)) {
|
|
bVar1 = uVar3 < 0x100;
|
|
uVar3 = uVar3 - 0x100;
|
|
if (bVar1) {
|
|
return 1;
|
|
}
|
|
bVar1 = (int)uVar3 < 0x96;
|
|
}
|
|
else {
|
|
bVar1 = uVar3 < 0x96;
|
|
if (0xff < uVar3) {
|
|
return 1;
|
|
}
|
|
}
|
|
iVar2 = 3;
|
|
if ((!bVar1) && (iVar2 = 2, 199 < (int)uVar3)) {
|
|
return 1;
|
|
}
|
|
return iVar2;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ InitCivCars()
|
|
// line 2144, offset 0x0002cda4
|
|
/* begin block 1 */
|
|
// Start line: 2146
|
|
// Start offset: 0x0002CDA4
|
|
/* end block 1 */
|
|
// End offset: 0x0002CE10
|
|
// End Line: 2157
|
|
|
|
/* begin block 2 */
|
|
// Start line: 4928
|
|
/* end block 2 */
|
|
// End Line: 4929
|
|
|
|
/* begin block 3 */
|
|
// Start line: 4288
|
|
/* end block 3 */
|
|
// End Line: 4289
|
|
|
|
/* begin block 4 */
|
|
// Start line: 7073
|
|
/* end block 4 */
|
|
// End Line: 7074
|
|
|
|
/* begin block 5 */
|
|
// Start line: 7075
|
|
/* end block 5 */
|
|
// End Line: 7076
|
|
|
|
/* WARNING: Unknown calling convention yet parameter storage is locked */
|
|
|
|
void InitCivCars(void)
|
|
{
|
|
UNIMPLEMENTED();
|
|
/*
|
|
uint uVar1;
|
|
|
|
PingBufferPos = 0;
|
|
cookieCount = '\0';
|
|
requestRoadblock = 0;
|
|
makeLimoPullOver = '\0';
|
|
frameStart = CameraCnt;
|
|
uVar1 = Random2(0);
|
|
roadblockDelay = (&roadblockDelayDiff)[gCopDifficultyLevel] + (uVar1 & 0xff);
|
|
PingOutCivsOnly = '\0';
|
|
roadblockCount = roadblockDelay;
|
|
return;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ CreateCivCarWotDrivesABitThenStops(int direction /*$s5*/, long (*startPos)[4] /*$s2*/, long (*stopPos)[4] /*$a2*/, unsigned char internalModel /*$s4*/, int palette /*stack 16*/)
|
|
// line 2176, offset 0x000286e0
|
|
/* begin block 1 */
|
|
// Start line: 2177
|
|
// Start offset: 0x000286E0
|
|
// Variables:
|
|
// struct _EXTRA_CIV_DATA civDat; // stack offset -56
|
|
// struct _CAR_DATA *newCar; // $s1
|
|
// struct CIV_ROUTE_ENTRY *stopNode; // $a0
|
|
// struct CIV_ROUTE_ENTRY *spareNode; // $a1
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 2177
|
|
// Start offset: 0x000286E0
|
|
|
|
/* begin block 1.1.1 */
|
|
// Start line: 2177
|
|
// Start offset: 0x000286E0
|
|
// Variables:
|
|
// char *slot; // $v1
|
|
// struct _CAR_DATA *carCnt; // $a0
|
|
/* end block 1.1.1 */
|
|
// End offset: 0x00028774
|
|
// End Line: 2184
|
|
/* end block 1.1 */
|
|
// End offset: 0x00028774
|
|
// End Line: 2184
|
|
/* end block 1 */
|
|
// End offset: 0x00028960
|
|
// End Line: 2229
|
|
|
|
/* begin block 2 */
|
|
// Start line: 4814
|
|
/* end block 2 */
|
|
// End Line: 4815
|
|
|
|
/* begin block 3 */
|
|
// Start line: 4910
|
|
/* end block 3 */
|
|
// End Line: 4911
|
|
|
|
int CreateCivCarWotDrivesABitThenStops(int direction, long(*startPos)[4], long(*stopPos)[4], unsigned char internalModel, int palette)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
int iVar1;
|
|
uint uVar2;
|
|
uchar *puVar3;
|
|
long lVar4;
|
|
int iVar5;
|
|
_CAR_DATA *cp;
|
|
CAR_COSMETICS *pCVar6;
|
|
short *psVar7;
|
|
short *psVar8;
|
|
undefined2 uVar9;
|
|
int iVar10;
|
|
char acStack56[8];
|
|
undefined2 local_30;
|
|
undefined2 local_2e;
|
|
undefined4 local_2c;
|
|
undefined local_28;
|
|
undefined local_27;
|
|
|
|
iVar5 = (int)((int)stopPos - (int)startPos) >> 2;
|
|
ratan2(iVar5, iVar5);
|
|
cp = car_data;
|
|
puVar3 = reservedSlots;
|
|
do {
|
|
if ((cp->controlType == '\0') && (*puVar3 == '\0')) goto LAB_00028774;
|
|
cp = cp + 1;
|
|
puVar3 = puVar3 + 1;
|
|
} while (cp < car_data + 0x13);
|
|
cp = (_CAR_DATA *)0x0;
|
|
LAB_00028774:
|
|
if (cp == (_CAR_DATA *)0x0) {
|
|
uVar2 = 0xffffffff;
|
|
}
|
|
else {
|
|
local_2c = 0;
|
|
local_2e = 8;
|
|
local_27 = 0;
|
|
local_28 = (undefined)palette;
|
|
uVar9 = (undefined2)direction;
|
|
local_30 = uVar9;
|
|
InitCar(cp, direction, startPos, '\x02', (uint)internalModel, 0, acStack56);
|
|
cp->ai[0xc] = 8;
|
|
psVar8 = rcossin_tbl + (direction & 0xfffU) * 2;
|
|
cp->ai[0xf8] = (byte)EVENT_CAR_SPEED;
|
|
iVar5 = EVENT_CAR_SPEED;
|
|
iVar10 = EVENT_CAR_SPEED * *psVar8;
|
|
psVar7 = rcossin_tbl + (direction & 0xfffU) * 2 + 1;
|
|
*(undefined4 *)(cp->st + 0x20) = 0;
|
|
*(int *)(cp->st + 0x1c) = iVar10;
|
|
iVar10 = DistanceTriggerCarMoves;
|
|
pCVar6 = (cp->ap).carCos;
|
|
*(int *)(cp->st + 0x24) = iVar5 * *psVar7;
|
|
iVar1 = iVar10 + (int)(pCVar6->colBox).vz * -3;
|
|
if (iVar1 == 0) {
|
|
trap(7);
|
|
}
|
|
*(int *)(cp->ai + 0x20) = (iVar5 << 0xc) / iVar1;
|
|
*(long *)(cp->ai + 0x2c) = (*startPos)[0];
|
|
lVar4 = (*startPos)[2];
|
|
*(byte **)(cp->ai + 8) = cp->ai + 0x34;
|
|
*(long *)(cp->ai + 0x30) = lVar4;
|
|
*(undefined2 *)(cp->ai + 0x36) = 1;
|
|
*(undefined2 *)(cp->ai + 0x34) = uVar9;
|
|
*(undefined4 *)(cp->ai + 0x38) = 0;
|
|
*(long *)(cp->ai + 0x3c) = (*startPos)[0] + (iVar10 * *psVar8 + 0x800 >> 0xc);
|
|
*(long *)(cp->ai + 0x40) = (*startPos)[2] + (iVar10 * *psVar7 + 0x800 >> 0xc);
|
|
*(undefined2 *)(cp->ai + 0x46) = 1;
|
|
*(undefined2 *)(cp->ai + 0x44) = uVar9;
|
|
*(undefined4 *)(cp->ai + 0x48) = 0;
|
|
*(long *)(cp->ai + 0x4c) = (*startPos)[0] + (iVar10 * (int)*psVar8 * 3 + 0x800 >> 0xc);
|
|
numCivCars = numCivCars + 1;
|
|
*(long *)(cp->ai + 0x50) = (*startPos)[0] + (iVar10 * (int)*psVar7 * 3 + 0x800 >> 0xc);
|
|
uVar2 = (uint)(byte)cp->id;
|
|
}
|
|
return uVar2;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ CreateStationaryCivCar(int direction /*$t4*/, long orientX /*$s2*/, long orientZ /*$s1*/, long (*startPos)[4] /*$a2*/, int externalModel /*stack 16*/, int palette /*stack 20*/, int controlFlags /*stack 24*/)
|
|
// line 2248, offset 0x00028960
|
|
/* begin block 1 */
|
|
// Start line: 2249
|
|
// Start offset: 0x00028960
|
|
// Variables:
|
|
// struct _EXTRA_CIV_DATA civDat; // stack offset -72
|
|
// struct _CAR_DATA *newCar; // $s0
|
|
// long tmpRes[4]; // stack offset -48
|
|
// long tmpQ[4]; // stack offset -32
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 2249
|
|
// Start offset: 0x00028A1C
|
|
|
|
/* begin block 1.1.1 */
|
|
// Start line: 2249
|
|
// Start offset: 0x00028A1C
|
|
// Variables:
|
|
// char *slot; // $v1
|
|
// struct _CAR_DATA *carCnt; // $a0
|
|
/* end block 1.1.1 */
|
|
// End offset: 0x00028A68
|
|
// End Line: 2249
|
|
/* end block 1.1 */
|
|
// End offset: 0x00028A68
|
|
// End Line: 2249
|
|
/* end block 1 */
|
|
// End offset: 0x00028DB4
|
|
// End Line: 2289
|
|
|
|
/* begin block 2 */
|
|
// Start line: 5111
|
|
/* end block 2 */
|
|
// End Line: 5112
|
|
|
|
/* begin block 3 */
|
|
// Start line: 5131
|
|
/* end block 3 */
|
|
// End Line: 5132
|
|
|
|
int CreateStationaryCivCar(int direction, long orientX, long orientZ, long(*startPos)[4], int externalModel, int palette, int controlFlags)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
uchar *puVar1;
|
|
int iVar2;
|
|
_CAR_DATA *cp;
|
|
int iVar3;
|
|
int iVar4;
|
|
int iVar5;
|
|
uint uVar6;
|
|
int iVar7;
|
|
int model;
|
|
char acStack72[8];
|
|
undefined2 local_40;
|
|
undefined2 local_3e;
|
|
undefined4 local_3c;
|
|
undefined local_38;
|
|
byte local_37;
|
|
|
|
uVar6 = externalModel & 0xff;
|
|
if (MissionHeader->residentModels[0] == uVar6) {
|
|
model = 0;
|
|
}
|
|
else {
|
|
model = 1;
|
|
if ((((MissionHeader->residentModels[1] != uVar6) &&
|
|
(model = 2, MissionHeader->residentModels[2] != uVar6)) &&
|
|
(model = 3, MissionHeader->residentModels[3] != uVar6)) &&
|
|
(model = 0xff, MissionHeader->residentModels[4] == uVar6)) {
|
|
model = 4;
|
|
}
|
|
}
|
|
if (model != 0xff) {
|
|
if ((4 < (byte)externalModel) && (specModelValid == '\0')) {
|
|
return -1;
|
|
}
|
|
cp = car_data;
|
|
puVar1 = reservedSlots;
|
|
do {
|
|
if ((cp->controlType == '\0') && (*puVar1 == '\0')) goto LAB_00028a68;
|
|
cp = cp + 1;
|
|
puVar1 = puVar1 + 1;
|
|
} while (cp < car_data + 0x13);
|
|
cp = (_CAR_DATA *)0x0;
|
|
LAB_00028a68:
|
|
if (cp != (_CAR_DATA *)0x0) {
|
|
local_3c = 3;
|
|
local_3e = 7;
|
|
if ((controlFlags & 1U) != 0) {
|
|
requestCopCar = 0;
|
|
numCopCars = numCopCars + 1;
|
|
cop_respawn_timer = gCopRespawnTime;
|
|
}
|
|
local_37 = (byte)controlFlags | 4;
|
|
if ((gCurrentMissionNumber != 0x20) && ((byte)externalModel == 0)) {
|
|
local_37 = (byte)controlFlags | 6;
|
|
}
|
|
local_38 = (undefined)palette;
|
|
local_40 = (undefined2)direction;
|
|
InitCar(cp, direction, startPos, '\x02', model, 0, acStack72);
|
|
uVar6 = (orientZ - (orientZ >> 0x1f)) * 2 & 0x3ffc;
|
|
iVar7 = (int)*(short *)((int)rcossin_tbl + uVar6);
|
|
iVar4 = (int)*(short *)((int)rcossin_tbl + uVar6 + 2);
|
|
iVar3 = *(int *)(cp->st + 0x10) * iVar7 + *(int *)(cp->st + 0xc) * iVar4 + 0x800 >> 0xc;
|
|
model = (*(int *)(cp->st + 0x10) * iVar4 - *(int *)(cp->st + 0xc) * iVar7) + 0x800 >> 0xc;
|
|
iVar2 = *(int *)(cp->st + 0x18) * iVar7 + *(int *)(cp->st + 0x14) * iVar4 + 0x800 >> 0xc;
|
|
uVar6 = (orientX - (orientX >> 0x1f)) * 2 & 0x3ffc;
|
|
iVar5 = (int)*(short *)((int)rcossin_tbl + uVar6);
|
|
iVar4 = (*(int *)(cp->st + 0x18) * iVar4 - *(int *)(cp->st + 0x14) * iVar7) + 0x800 >> 0xc;
|
|
iVar7 = (int)*(short *)((int)rcossin_tbl + uVar6 + 2);
|
|
*(int *)(cp->st + 0xc) = iVar4 * iVar5 + iVar3 * iVar7 + 0x800 >> 0xc;
|
|
*(int *)(cp->st + 0x10) = iVar2 * iVar5 + model * iVar7 + 0x800 >> 0xc;
|
|
*(int *)(cp->st + 0x14) = (iVar2 * iVar7 - model * iVar5) + 0x800 >> 0xc;
|
|
*(int *)(cp->st + 0x18) = (iVar4 * iVar7 - iVar3 * iVar5) + 0x800 >> 0xc;
|
|
numCivCars = numCivCars + 1;
|
|
return (uint)(byte)cp->id;
|
|
}
|
|
}
|
|
return -1;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ PingInCivCar(int minPingInDist /*stack 0*/)
|
|
// line 2323, offset 0x00028db4
|
|
/* begin block 1 */
|
|
// Start line: 2324
|
|
// Start offset: 0x00028DB4
|
|
// Variables:
|
|
// struct _EXTRA_CIV_DATA civDat; // stack offset -128
|
|
// int dir; // stack offset -52
|
|
// int distAlongSegment; // $fp
|
|
// int lane; // $s7
|
|
// struct _CAR_DATA *newCar; // $s1
|
|
// struct DRIVER2_STRAIGHT *str; // $s6
|
|
// struct DRIVER2_CURVE *crv; // $s5
|
|
// unsigned char cookieCountStart; // $s4
|
|
// int curveLength; // stack offset -48
|
|
// unsigned char model; // $s4
|
|
// unsigned char possibleLanes[12]; // stack offset -104
|
|
// unsigned char carDistLanes[15]; // stack offset -88
|
|
// char numPossibleLanes; // $s0
|
|
// int lbody; // $s3
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 2324
|
|
// Start offset: 0x00028EEC
|
|
|
|
/* begin block 1.1.1 */
|
|
// Start line: 2324
|
|
// Start offset: 0x00028EEC
|
|
// Variables:
|
|
// char *slot; // $a1
|
|
// struct _CAR_DATA *carCnt; // $a0
|
|
/* end block 1.1.1 */
|
|
// End offset: 0x00028F40
|
|
// End Line: 2324
|
|
/* end block 1.1 */
|
|
// End offset: 0x00028F40
|
|
// End Line: 2324
|
|
|
|
/* begin block 1.2 */
|
|
// Start line: 2393
|
|
// Start offset: 0x00029000
|
|
// Variables:
|
|
// char newCarId; // $v1
|
|
|
|
/* begin block 1.2.1 */
|
|
// Start line: 2324
|
|
// Start offset: 0x00029058
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s1
|
|
/* end block 1.2.1 */
|
|
// End offset: 0x00029140
|
|
// End Line: 2324
|
|
/* end block 1.2 */
|
|
// End offset: 0x000292A4
|
|
// End Line: 2402
|
|
|
|
/* begin block 1.3 */
|
|
// Start line: 2462
|
|
// Start offset: 0x00029620
|
|
// Variables:
|
|
// char frog; // $a0
|
|
// char numLanes; // $a1
|
|
/* end block 1.3 */
|
|
// End offset: 0x00029760
|
|
// End Line: 2462
|
|
|
|
/* begin block 1.4 */
|
|
// Start line: 2471
|
|
// Start offset: 0x00029860
|
|
// Variables:
|
|
// char frog; // $a0
|
|
// char numLanes; // $a1
|
|
/* end block 1.4 */
|
|
// End offset: 0x00029964
|
|
// End Line: 2471
|
|
|
|
/* begin block 1.5 */
|
|
// Start line: 2528
|
|
// Start offset: 0x00029C48
|
|
// Variables:
|
|
// int externalModel; // $v0
|
|
|
|
/* begin block 1.5.1 */
|
|
// Start line: 2535
|
|
// Start offset: 0x00029CC4
|
|
// Variables:
|
|
// unsigned char palette; // $v0
|
|
/* end block 1.5.1 */
|
|
// End offset: 0x00029D20
|
|
// End Line: 2539
|
|
/* end block 1.5 */
|
|
// End offset: 0x00029D5C
|
|
// End Line: 2544
|
|
|
|
/* begin block 1.6 */
|
|
// Start line: 2550
|
|
// Start offset: 0x00029DB8
|
|
// Variables:
|
|
// int theta; // $s0
|
|
// int minDistAlong; // $s2
|
|
/* end block 1.6 */
|
|
// End offset: 0x00029F10
|
|
// End Line: 2563
|
|
|
|
/* begin block 1.7 */
|
|
// Start line: 2567
|
|
// Start offset: 0x00029F58
|
|
// Variables:
|
|
// int minAngle; // $a1
|
|
/* end block 1.7 */
|
|
// End offset: 0x0002A090
|
|
// End Line: 2578
|
|
|
|
/* begin block 1.8 */
|
|
// Start line: 2593
|
|
// Start offset: 0x0002A0E8
|
|
// Variables:
|
|
// long pos[4]; // stack offset -72
|
|
// unsigned int distSq; // stack offset -56
|
|
|
|
/* begin block 1.8.1 */
|
|
// Start line: 2593
|
|
// Start offset: 0x0002A0E8
|
|
// Variables:
|
|
// int *distToCarSq; // $t2
|
|
|
|
/* begin block 1.8.1.1 */
|
|
// Start line: 2593
|
|
// Start offset: 0x0002A0E8
|
|
// Variables:
|
|
// int dz; // $v1
|
|
// int dx; // $a0
|
|
// int distSq; // $v0
|
|
// unsigned int retDistSq; // $a2
|
|
// struct _CAR_DATA *lcp; // $a1
|
|
/* end block 1.8.1.1 */
|
|
// End offset: 0x0002A228
|
|
// End Line: 2601
|
|
/* end block 1.8.1 */
|
|
// End offset: 0x0002A228
|
|
// End Line: 2601
|
|
|
|
/* begin block 1.8.2 */
|
|
// Start line: 2611
|
|
// Start offset: 0x0002A240
|
|
// Variables:
|
|
// int x; // $t2
|
|
// int y; // $a2
|
|
// int z; // $t1
|
|
// unsigned int distSq; // $a3
|
|
|
|
/* begin block 1.8.2.1 */
|
|
// Start line: 2611
|
|
// Start offset: 0x0002A240
|
|
// Variables:
|
|
// int dz; // $v1
|
|
// int dx; // $a0
|
|
// int ret; // $t0
|
|
// struct _CAR_DATA *lcp; // $a1
|
|
/* end block 1.8.2.1 */
|
|
// End offset: 0x0002A340
|
|
// End Line: 2611
|
|
/* end block 1.8.2 */
|
|
// End offset: 0x0002A340
|
|
// End Line: 2611
|
|
/* end block 1.8 */
|
|
// End offset: 0x0002A37C
|
|
// End Line: 2622
|
|
/* end block 1 */
|
|
// End offset: 0x0002A4C4
|
|
// End Line: 2656
|
|
|
|
/* begin block 2 */
|
|
// Start line: 5271
|
|
/* end block 2 */
|
|
// End Line: 5272
|
|
|
|
/* begin block 3 */
|
|
// Start line: 5306
|
|
/* end block 3 */
|
|
// End Line: 5307
|
|
|
|
/* begin block 4 */
|
|
// Start line: 5308
|
|
/* end block 4 */
|
|
// End Line: 5309
|
|
|
|
/* WARNING: Type propagation algorithm not settling */
|
|
|
|
int PingInCivCar(int minPingInDist)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
byte bVar1;
|
|
short sVar2;
|
|
ushort uVar3;
|
|
bool bVar4;
|
|
char cVar5;
|
|
undefined3 extraout_var;
|
|
int iVar6;
|
|
uint model;
|
|
long lVar7;
|
|
int iVar8;
|
|
int iVar9;
|
|
uint uVar10;
|
|
int iVar11;
|
|
_CAR_DATA *cp;
|
|
uint *puVar12;
|
|
long lVar13;
|
|
uchar *puVar14;
|
|
_CAR_DATA *p_Var15;
|
|
byte bVar16;
|
|
uint uVar17;
|
|
DRIVER2_CURVE *curve;
|
|
DRIVER2_STRAIGHT *straight;
|
|
uint uVar18;
|
|
undefined local_res0[16];
|
|
int local_80;
|
|
uint local_7c;
|
|
undefined2 local_78;
|
|
short local_76;
|
|
int local_74;
|
|
char local_70;
|
|
undefined local_6f;
|
|
byte local_68[16];
|
|
char acStack88[16];
|
|
long local_48;
|
|
long local_44;
|
|
int local_40;
|
|
uint local_38;
|
|
uint local_34;
|
|
int local_30;
|
|
int local_2c;
|
|
|
|
local_7c = 0xfffffffb;
|
|
uVar18 = 0xffffffff;
|
|
straight = (DRIVER2_STRAIGHT *)0x0;
|
|
curve = (DRIVER2_CURVE *)0x0;
|
|
local_34 = 0xffffff;
|
|
local_2c = 0;
|
|
PingOutCivsOnly = '\x01';
|
|
if (((requestCopCar == 0) && (numParkedCars < maxParkedCars)) &&
|
|
((gCurrentMissionNumber != 0x21 || (numCivCars != 0)))) {
|
|
local_2c = 1;
|
|
}
|
|
playerNum = 0;
|
|
if (NumPlayers == 2) {
|
|
playerNum = (byte)CameraCnt & 1;
|
|
}
|
|
if ((MissionHeader->type & 4U) != 0) {
|
|
PingOutCivsOnly = '\x01';
|
|
return 0;
|
|
}
|
|
if (gInGameCutsceneActive != 0) {
|
|
PingOutCivsOnly = '\x01';
|
|
return 0;
|
|
}
|
|
if ((maxCivCars + -1 <= numCivCars) && (gInGameChaseActive == 0)) {
|
|
PingOutCivsOnly = '\x01';
|
|
return 0;
|
|
}
|
|
if (1 < NumPlayers) {
|
|
PingOutCivsOnly = '\x01';
|
|
return 0;
|
|
}
|
|
cp = car_data;
|
|
puVar14 = reservedSlots;
|
|
do {
|
|
if ((cp->controlType == '\0') && (*puVar14 == '\0')) goto LAB_00028f40;
|
|
cp = cp + 1;
|
|
puVar14 = puVar14 + 1;
|
|
} while (cp < car_data + 0x13);
|
|
cp = (_CAR_DATA *)0x0;
|
|
LAB_00028f40:
|
|
if (cp == (_CAR_DATA *)0x0) {
|
|
PingOutCivsOnly = '\x01';
|
|
return 0;
|
|
}
|
|
ClearMem((char *)&local_80, 0x14);
|
|
baseLoc.vx = ((&player)[(byte)playerNum].spoolXZ)->vx;
|
|
baseLoc.vz = ((&player)[(byte)playerNum].spoolXZ)->vz;
|
|
if ((requestCopCar == 0) && (0x2b < (byte)cookieCount)) {
|
|
cookieCount = cookieCount + -0x19;
|
|
}
|
|
cVar5 = cookieCount;
|
|
if ((useStoredPings == 0) || (gInGameChaseActive == 0)) {
|
|
do {
|
|
if (requestCopCar == 0) {
|
|
if ((byte)cookieCount < 0x2b) goto LAB_000294b0;
|
|
cookieCount = 0;
|
|
}
|
|
else {
|
|
if ((byte)cookieCount < 0x37) {
|
|
LAB_000294b0:
|
|
cookieCount = cookieCount + 1;
|
|
}
|
|
else {
|
|
cookieCount = 0;
|
|
}
|
|
}
|
|
if (cookieCount == cVar5) break;
|
|
if (requestCopCar == 0) {
|
|
model = (int)((uint)(byte)cookieCount * 0x1000) / 0x2c;
|
|
}
|
|
else {
|
|
model = (int)((uint)(byte)cookieCount * 0x1000) / 0x38;
|
|
}
|
|
if (requestCopCar == 0) {
|
|
iVar6 = (int)rcossin_tbl[(model & 0xfff) * 2] << 3;
|
|
}
|
|
else {
|
|
iVar6 = (int)rcossin_tbl[(model & 0xfff) * 2] * 10;
|
|
}
|
|
randomLoc.vx = baseLoc.vx + (iVar6 + 0x800 >> 0xc) * 0x800;
|
|
if (requestCopCar == 0) {
|
|
model = (int)((uint)(byte)cookieCount * 0x1000) / 0x2c;
|
|
}
|
|
else {
|
|
model = (int)((uint)(byte)cookieCount * 0x1000) / 0x38;
|
|
}
|
|
if (requestCopCar == 0) {
|
|
iVar6 = (int)rcossin_tbl[(model & 0xfff) * 2 + 1] << 3;
|
|
}
|
|
else {
|
|
iVar6 = (int)rcossin_tbl[(model & 0xfff) * 2 + 1] * 10;
|
|
}
|
|
randomLoc.vz = baseLoc.vz + (iVar6 + 0x800 >> 0xc) * 0x800;
|
|
roadSeg = RoadInCell(&randomLoc);
|
|
} while (((((roadSeg & 0xffffe000U) != 0) || (NumDriver2Straights <= (int)(roadSeg & 0x1fffU)))
|
|
&& (((roadSeg & 0xffffe000U) != 0x4000 ||
|
|
(NumDriver2Curves <= (int)(roadSeg & 0x1fffU))))) || (roadSeg < 0));
|
|
}
|
|
else {
|
|
cVar5 = GetPingInfo(&cookieCount);
|
|
iVar6 = CONCAT31(extraout_var, cVar5);
|
|
if (iVar6 == -1) {
|
|
return 0;
|
|
}
|
|
if (0x13 < iVar6) {
|
|
return 0;
|
|
}
|
|
cp = car_data + iVar6;
|
|
if (car_data[iVar6].controlType != '\0') {
|
|
testNumPingedOut = testNumPingedOut + 1;
|
|
if (car_data[iVar6].controlType == '\x02') {
|
|
if ((car_data[iVar6].controlFlags & 1) != 0) {
|
|
numCopCars = numCopCars + -1;
|
|
}
|
|
numCivCars = numCivCars + -1;
|
|
if ((car_data[iVar6].ai[0xf9] == 3) && (car_data[iVar6].ai[0xc] == 5)) {
|
|
numParkedCars = numParkedCars + -1;
|
|
}
|
|
LAB_0002910c:
|
|
puVar12 = (uint *)car_data[iVar6].inform;
|
|
if (puVar12 != (uint *)0x0) {
|
|
*puVar12 = *puVar12 ^ 0x40000000;
|
|
}
|
|
ClearMem((char *)cp, 0x29c);
|
|
car_data[iVar6].controlType = '\0';
|
|
bVar4 = true;
|
|
}
|
|
else {
|
|
if (PingOutCivsOnly == '\0') goto LAB_0002910c;
|
|
iVar8 = valid_region(car_data[iVar6].hd.where.t[0], car_data[iVar6].hd.where.t[2]);
|
|
bVar4 = false;
|
|
if (iVar8 == 0) goto LAB_0002910c;
|
|
}
|
|
if (!bVar4) {
|
|
return 0;
|
|
}
|
|
}
|
|
if (requestCopCar == 0) {
|
|
model = (int)((uint)(byte)cookieCount * 0x1000) / 0x2c;
|
|
}
|
|
else {
|
|
model = (int)((uint)(byte)cookieCount * 0x1000) / 0x38;
|
|
}
|
|
if (requestCopCar == 0) {
|
|
iVar6 = (int)rcossin_tbl[(model & 0xfff) * 2] << 3;
|
|
}
|
|
else {
|
|
iVar6 = (int)rcossin_tbl[(model & 0xfff) * 2] * 10;
|
|
}
|
|
randomLoc.vx = baseLoc.vx + (iVar6 + 0x800 >> 0xc) * 0x800;
|
|
if (requestCopCar == 0) {
|
|
model = (int)((uint)(byte)cookieCount * 0x1000) / 0x2c;
|
|
}
|
|
else {
|
|
model = (int)((uint)(byte)cookieCount * 0x1000) / 0x38;
|
|
}
|
|
if (requestCopCar == 0) {
|
|
iVar6 = (int)rcossin_tbl[(model & 0xfff) * 2 + 1] << 3;
|
|
}
|
|
else {
|
|
iVar6 = (int)rcossin_tbl[(model & 0xfff) * 2 + 1] * 10;
|
|
}
|
|
randomLoc.vz = baseLoc.vz + (iVar6 + 0x800 >> 0xc) * 0x800;
|
|
roadSeg = RoadInCell(&randomLoc);
|
|
}
|
|
if (((((roadSeg & 0xffffe000U) != 0) || (NumDriver2Straights <= (int)(roadSeg & 0x1fffU))) &&
|
|
(((roadSeg & 0xffffe000U) != 0x4000 || (NumDriver2Curves <= (int)(roadSeg & 0x1fffU))))) ||
|
|
(roadSeg < 0)) {
|
|
civPingTest.OffRoad = civPingTest.OffRoad + 1;
|
|
return 0;
|
|
}
|
|
if (((((roadSeg & 0xffffe000U) != 0) || (NumDriver2Straights <= (int)(roadSeg & 0x1fffU))) &&
|
|
(((roadSeg & 0xffffe000U) != 0x4000 || (NumDriver2Curves <= (int)(roadSeg & 0x1fffU))))) ||
|
|
(roadSeg < 0)) goto LAB_0002a368;
|
|
ClearMem(acStack88, 0xf);
|
|
if ((((roadSeg & 0xffffe000U) == 0) && ((int)(roadSeg & 0x1fffU) < NumDriver2Straights)) &&
|
|
(-1 < roadSeg)) {
|
|
straight = Driver2StraightsPtr + roadSeg;
|
|
if ((straight->NumLanes & 0xfU) == 0) goto LAB_0002a368;
|
|
if ((gCurrentMissionNumber == 0x21) && (minPingInDist == 0x29a)) {
|
|
uVar18 = 1;
|
|
}
|
|
else {
|
|
uVar18 = 0;
|
|
model = ((uint)(byte)straight->NumLanes & 0xf) * 2;
|
|
uVar17 = 0;
|
|
if ((straight->NumLanes & 0xfU) != 0) {
|
|
do {
|
|
if (((((uVar18 == 0) || (model - 1 == uVar18)) && (local_2c != 0)) &&
|
|
(((uVar18 == 0 && ((straight->NumLanes & 0x40U) != 0)) ||
|
|
((((uint)(byte)straight->NumLanes & 0xffffff0f) * 2 - 1 == uVar18 &&
|
|
((straight->NumLanes & 0x80U) != 0)))))) ||
|
|
(((((int)(uint)(byte)straight->AILanes >> (uVar18 >> 1 & 0x1f) & 1U) != 0 &&
|
|
((uVar18 != 0 || ((straight->NumLanes & 0x40U) == 0)))) &&
|
|
((((uint)(byte)straight->NumLanes & 0xffffff0f) * 2 - 1 != uVar18 ||
|
|
((straight->NumLanes & 0x80U) == 0)))))) {
|
|
local_68[uVar17] = (byte)uVar18;
|
|
uVar17 = uVar17 + 1 & 0xff;
|
|
}
|
|
uVar18 = uVar18 + 1 & 0xff;
|
|
} while (uVar18 < model);
|
|
}
|
|
if (uVar17 == 0) {
|
|
return 0;
|
|
}
|
|
lVar13 = Random2(0);
|
|
if (uVar17 == 0) {
|
|
trap(7);
|
|
}
|
|
uVar18 = (uint)local_68[(lVar13 >> 8) % uVar17];
|
|
cp->ai[0xfb] = local_68[(lVar13 >> 8) % uVar17];
|
|
}
|
|
if (((uVar18 == 0) && ((straight->NumLanes & 0x40U) != 0)) ||
|
|
((((uint)(byte)straight->NumLanes & 0xf) * 2 - 1 == uVar18 &&
|
|
((straight->NumLanes & 0x80U) != 0)))) {
|
|
local_74 = 3;
|
|
local_76 = 7;
|
|
if (((int)(uint)(byte)straight->AILanes >> ((int)uVar18 / 2 & 0x1fU) & 1U) != 0) {
|
|
local_76 = 5;
|
|
}
|
|
}
|
|
else {
|
|
if (((int)(uint)(byte)straight->AILanes >> ((int)uVar18 / 2 & 0x1fU) & 1U) == 0) {
|
|
LAB_00029a28:
|
|
civPingTest.NotDrivable = civPingTest.NotDrivable + 1;
|
|
return 0;
|
|
}
|
|
local_74 = 0;
|
|
local_76 = 0;
|
|
}
|
|
}
|
|
else {
|
|
if ((((roadSeg & 0xffffe000U) == 0x4000) && ((int)(roadSeg & 0x1fffU) < NumDriver2Curves)) &&
|
|
(-1 < roadSeg)) {
|
|
curve = Driver2CurvesPtr + roadSeg + -0x4000;
|
|
bVar16 = curve->NumLanes;
|
|
uVar18 = 0;
|
|
if ((bVar16 & 0xf) == 0) goto LAB_0002a368;
|
|
model = ((uint)bVar16 & 0xf) * 2;
|
|
uVar17 = 0;
|
|
if ((bVar16 & 0xf) != 0) {
|
|
do {
|
|
if ((((uVar18 == 0) || (model - 1 == uVar18)) &&
|
|
((local_2c != 0 &&
|
|
(((uVar18 == 0 && ((curve->NumLanes & 0x40U) != 0)) ||
|
|
((((uint)(byte)curve->NumLanes & 0xffffff0f) * 2 - 1 == uVar18 &&
|
|
((curve->NumLanes & 0x80U) != 0)))))))) ||
|
|
((((int)(uint)(byte)curve->AILanes >> (uVar18 >> 1 & 0x1f) & 1U) != 0 &&
|
|
(((uVar18 != 0 || ((curve->NumLanes & 0x40U) == 0)) &&
|
|
((((uint)(byte)curve->NumLanes & 0xffffff0f) * 2 - 1 != uVar18 ||
|
|
((curve->NumLanes & 0x80U) == 0)))))))) {
|
|
local_68[uVar17] = (byte)uVar18;
|
|
uVar17 = uVar17 + 1 & 0xff;
|
|
}
|
|
uVar18 = uVar18 + 1 & 0xff;
|
|
} while (uVar18 < model);
|
|
}
|
|
if (uVar17 == 0) {
|
|
return 0;
|
|
}
|
|
lVar13 = Random2(0);
|
|
if (uVar17 == 0) {
|
|
trap(7);
|
|
}
|
|
bVar16 = local_68[(lVar13 >> 8) % uVar17];
|
|
uVar18 = (uint)bVar16;
|
|
cp->ai[0xfb] = bVar16;
|
|
bVar1 = curve->NumLanes;
|
|
model = ((uint)bVar1 & 0xf) * 2;
|
|
if (model < uVar18) goto LAB_0002a368;
|
|
if (((bVar16 == 0) && ((bVar1 & 0x40) != 0)) ||
|
|
((model - 1 == uVar18 && ((bVar1 & 0x80) != 0)))) {
|
|
local_74 = 3;
|
|
local_76 = 7;
|
|
if (((int)(uint)(byte)curve->AILanes >> ((int)uVar18 / 2 & 0x1fU) & 1U) != 0) {
|
|
local_76 = 5;
|
|
}
|
|
}
|
|
else {
|
|
if (((int)(uint)(byte)curve->AILanes >> ((int)uVar18 / 2 & 0x1fU) & 1U) == 0)
|
|
goto LAB_00029a28;
|
|
local_74 = 0;
|
|
local_76 = 0;
|
|
}
|
|
local_30 = (int)(((int)curve->end - (int)curve->start & 0xfffU) *
|
|
(uint)(byte)curve->inside * 0xb) / 7;
|
|
}
|
|
}
|
|
if ((local_74 != 3) ||
|
|
(((cVar5 = '\0', gInGameCutsceneActive == 0 && (gInGameChaseActive == 0)) &&
|
|
((model = Random2(0), (model & 0x40) == 0 || (cVar5 = '\x03', gCurrentMissionNumber == 0x20)))
|
|
))) {
|
|
cVar5 = '\0';
|
|
}
|
|
s__0009bf48[0] = cVar5;
|
|
if (((specModelValid == '\0') || (allowSpecSpooling == 0)) ||
|
|
(MissionHeader->residentModels[4] == 0xc)) {
|
|
CHAR_04h_0009bf4b = '\0';
|
|
CHAR_00h_0009bf4a = '\x01';
|
|
}
|
|
else {
|
|
CHAR_04h_0009bf4b = '\x04';
|
|
model = Random2(0);
|
|
CHAR_00h_0009bf4a = '\x01';
|
|
if ((model & 0x100) != 0) {
|
|
CHAR_00h_0009bf4a = '\x04';
|
|
}
|
|
}
|
|
if ((gCurrentMissionNumber == 7) || (gCurrentMissionNumber == 0x21)) {
|
|
CHAR_02h_0009bf45 = '\0';
|
|
CHAR_02h_0009bf44 = '\0';
|
|
CHAR_02h_0009bf47 = '\x01';
|
|
CHAR_02h_0009bf46 = '\x01';
|
|
}
|
|
else {
|
|
CHAR_02h_0009bf47 = '\x02';
|
|
CHAR_02h_0009bf46 = '\x02';
|
|
CHAR_02h_0009bf45 = '\x02';
|
|
CHAR_02h_0009bf44 = '\x02';
|
|
}
|
|
local_6f = 0;
|
|
if (requestCopCar == 0) {
|
|
model = Random2(0);
|
|
model = (uint)(byte)modelRandomList[model & 0xf];
|
|
}
|
|
else {
|
|
model = 3;
|
|
}
|
|
if ((gCurrentMissionNumber == 0x21) && (minPingInDist == 0x29a)) {
|
|
model = 4;
|
|
}
|
|
if (requestCopCar != 0) {
|
|
local_6f = 1;
|
|
}
|
|
if ((MissionHeader->residentModels[model] == 0) || (4 < MissionHeader->residentModels[model])) {
|
|
local_70 = '\0';
|
|
}
|
|
else {
|
|
if ((player.playerType == '\x01') &&
|
|
((uint)(byte)car_data[player.playerCarId].ap.model == model)) {
|
|
lVar7 = Random2(0);
|
|
lVar13 = lVar7;
|
|
if (lVar7 < 0) {
|
|
lVar13 = lVar7 + 3;
|
|
}
|
|
uVar17 = lVar7 + (lVar13 >> 2) * -4 & 0xff;
|
|
local_70 = (char)uVar17;
|
|
if ((byte)car_data[player.playerCarId].ap.palette <= uVar17) {
|
|
local_70 = local_70 + '\x01';
|
|
}
|
|
}
|
|
else {
|
|
lVar13 = Random2(0);
|
|
local_70 = (char)lVar13 + (char)(lVar13 / 5) * -5;
|
|
}
|
|
}
|
|
iVar6 = (int)car_cosmetics[model].colBox.vz;
|
|
if ((((roadSeg & 0xffffe000U) == 0) && ((int)(roadSeg & 0x1fffU) < NumDriver2Straights)) &&
|
|
(-1 < roadSeg)) {
|
|
uVar17 = 0;
|
|
if (requestCopCar == 0) {
|
|
iVar8 = iVar6 * 2;
|
|
uVar17 = iVar6 * 3;
|
|
}
|
|
else {
|
|
iVar8 = iVar6 << 1;
|
|
}
|
|
if ((int)(uint)straight->length <= (iVar8 + iVar6) * 2) {
|
|
return 0;
|
|
}
|
|
dx = randomLoc.vx - straight->Midx;
|
|
dz = randomLoc.vz - straight->Midz;
|
|
iVar8 = ratan2(dx, dz);
|
|
sVar2 = straight->angle;
|
|
iVar9 = SquareRoot0(dx * dx + dz * dz);
|
|
uVar3 = straight->length;
|
|
local_7c = (uint)(uVar3 >> 1) +
|
|
(rcossin_tbl[(sVar2 - iVar8 & 0xfffU) * 2 + 1] * iVar9 + 0x800 >> 0xc);
|
|
if (requestCopCar == 0) {
|
|
if ((int)local_7c < (int)uVar17) {
|
|
local_7c = uVar17;
|
|
}
|
|
if ((int)(uVar3 - local_7c) < (int)uVar17) {
|
|
local_7c = uVar3 - uVar17;
|
|
}
|
|
}
|
|
if ((*(uint *)(straight->ConnectIdx + 3) & 0xffff0000) == 0xff010000) {
|
|
uVar17 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar17 = (int)(uint)(byte)straight->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
if ((uVar17 & 1) == 0) {
|
|
local_34 = SEXT24(straight->angle);
|
|
}
|
|
else {
|
|
local_34 = (int)straight->angle + 0x800U & 0xfff;
|
|
}
|
|
}
|
|
else {
|
|
if ((((roadSeg & 0xffffe000U) == 0x4000) && ((int)(roadSeg & 0x1fffU) < NumDriver2Curves)) &&
|
|
(-1 < roadSeg)) {
|
|
currentAngle = ratan2(randomLoc.vx - curve->Midx, randomLoc.vz - curve->Midz);
|
|
uVar17 = 0;
|
|
if (requestCopCar == 0) {
|
|
bVar16 = curve->inside;
|
|
uVar17 = 0x80;
|
|
if ((9 < bVar16) && (uVar17 = 0x20, bVar16 < 0x14)) {
|
|
uVar17 = 0x40;
|
|
}
|
|
}
|
|
else {
|
|
bVar16 = curve->inside;
|
|
}
|
|
uVar10 = (currentAngle & 0xfffU) - (int)curve->start;
|
|
local_7c = uVar10 & 0xf80;
|
|
if ((9 < bVar16) && (local_7c = uVar10 & 0xfe0, bVar16 < 0x14)) {
|
|
local_7c = uVar10 & 0xfc0;
|
|
}
|
|
if (local_7c <= uVar17) {
|
|
local_7c = uVar17;
|
|
}
|
|
uVar17 = ((int)curve->end - (int)curve->start) - uVar17 & 0xfff;
|
|
if (uVar17 <= local_7c) {
|
|
local_7c = uVar17;
|
|
}
|
|
iVar8 = local_7c + (int)curve->start;
|
|
if (*(short *)&curve->NumLanes == -0xff) {
|
|
uVar17 = (uint)cp->ai[0xfb];
|
|
}
|
|
else {
|
|
uVar17 = (int)(uint)(byte)curve->LaneDirs >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f);
|
|
}
|
|
if ((uVar17 & 1) == 0) {
|
|
local_34 = iVar8 + 0x400;
|
|
}
|
|
else {
|
|
local_34 = iVar8 - 0x400;
|
|
}
|
|
if (local_30 < iVar6 * 6) {
|
|
return 0;
|
|
}
|
|
}
|
|
}
|
|
if (((local_74 == 3) && (local_76 == 5)) && (maxParkedCars <= numParkedCars)) {
|
|
return 0;
|
|
}
|
|
if (((local_34 == 0xffffff) || ((int)uVar18 < 0)) || ((int)local_7c < 0)) {
|
|
LAB_0002a368:
|
|
cp->ai[0xf9] = 3;
|
|
cp->ai[0xc] = 7;
|
|
return 0;
|
|
}
|
|
GetNodePos(straight, (DRIVER2_JUNCTION *)0x0, curve, local_7c, cp, (int *)(cp->ai + 0x2c),
|
|
(int *)(cp->ai + 0x30), (uint)cp->ai[0xfb]);
|
|
uVar17 = 0x7fffffff;
|
|
p_Var15 = car_data;
|
|
local_48 = *(int *)(cp->ai + 0x2c);
|
|
local_40 = *(int *)(cp->ai + 0x30);
|
|
local_44 = randomLoc.vy;
|
|
do {
|
|
if (p_Var15->controlType != '\0') {
|
|
iVar9 = (p_Var15->hd).where.t[1];
|
|
iVar8 = randomLoc.vy - iVar9;
|
|
if (iVar8 < 0) {
|
|
iVar8 = iVar9 - randomLoc.vy;
|
|
}
|
|
if (iVar8 < 800) {
|
|
iVar9 = local_48 - (p_Var15->hd).where.t[0];
|
|
iVar8 = iVar9;
|
|
if (iVar9 < 0) {
|
|
iVar8 = -iVar9;
|
|
}
|
|
if (iVar8 < 0x1000) {
|
|
iVar11 = local_40 - (p_Var15->hd).where.t[2];
|
|
iVar8 = iVar11;
|
|
if (iVar11 < 0) {
|
|
iVar8 = -iVar11;
|
|
}
|
|
if ((iVar8 < 0x1000) && (uVar10 = iVar9 * iVar9 + iVar11 * iVar11, uVar10 < uVar17)) {
|
|
uVar17 = uVar10;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
p_Var15 = p_Var15 + 1;
|
|
} while (p_Var15 < (_CAR_DATA *)0xd4698);
|
|
if ((undefined *)register0x00000074 != (undefined *)0x38) {
|
|
local_38 = uVar17;
|
|
}
|
|
if (local_38 < (uint)(iVar6 * iVar6 * 8 * 8)) {
|
|
return 0;
|
|
}
|
|
p_Var15 = car_data;
|
|
local_38 = 9000000;
|
|
iVar6 = 0;
|
|
do {
|
|
if (p_Var15->controlType != '\0') {
|
|
iVar9 = (p_Var15->hd).where.t[1];
|
|
iVar8 = randomLoc.vy - iVar9;
|
|
if (iVar8 < 0) {
|
|
iVar8 = iVar9 - randomLoc.vy;
|
|
}
|
|
if (iVar8 < 800) {
|
|
iVar9 = local_48 - (p_Var15->hd).where.t[0];
|
|
iVar8 = iVar9;
|
|
if (iVar9 < 0) {
|
|
iVar8 = -iVar9;
|
|
}
|
|
if (iVar8 < 0x7000) {
|
|
iVar11 = local_40 - (p_Var15->hd).where.t[2];
|
|
iVar8 = iVar11;
|
|
if (iVar11 < 0) {
|
|
iVar8 = -iVar11;
|
|
}
|
|
if ((iVar8 < 0x7000) && ((uint)(iVar9 * iVar9 + iVar11 * iVar11) < 9000000)) {
|
|
iVar6 = iVar6 + 1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
p_Var15 = p_Var15 + 1;
|
|
} while (p_Var15 < (_CAR_DATA *)0xd4698);
|
|
if (closeEncounter < iVar6) {
|
|
return 0;
|
|
}
|
|
local_80 = roadSeg;
|
|
if (roadSeg < 0) goto LAB_0002a368;
|
|
local_78 = (undefined2)local_34;
|
|
InitCar(cp, local_34, (long(*)[4])&local_48, '\x02', model, 0, (char *)&local_80);
|
|
cp->ai[0xfb] = (byte)uVar18;
|
|
if ((gCurrentMissionNumber == 0x21) && (minPingInDist == 0x29a)) {
|
|
limoId = cp->id;
|
|
}
|
|
if (cp->ai[0xf9] == 3) {
|
|
if (cp->ai[0xc] != 5) goto LAB_0002a430;
|
|
cp->controlFlags = cp->controlFlags | 4;
|
|
}
|
|
if (cp->ai[0xc] == 5) {
|
|
numParkedCars = numParkedCars + 1;
|
|
}
|
|
LAB_0002a430:
|
|
if ((cp->controlFlags & 1) != 0) {
|
|
requestCopCar = 0;
|
|
numCopCars = numCopCars + 1;
|
|
}
|
|
numCivCars = numCivCars + 1;
|
|
if ((cp->controlFlags & 1) != 0) {
|
|
PassiveCopTasks(cp);
|
|
}
|
|
PingOutCivsOnly = '\0';
|
|
return (uint)(byte)cp->id + 1;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ AttemptUnPark(struct _CAR_DATA *cp /*$s1*/)
|
|
// line 2659, offset 0x0002a4c4
|
|
/* begin block 1 */
|
|
// Start line: 2660
|
|
// Start offset: 0x0002A4C4
|
|
// Variables:
|
|
// struct DRIVER2_STRAIGHT *str; // $s2
|
|
// struct DRIVER2_CURVE *crv; // $s3
|
|
/* end block 1 */
|
|
// End offset: 0x0002A5FC
|
|
// End Line: 2690
|
|
|
|
/* begin block 2 */
|
|
// Start line: 6109
|
|
/* end block 2 */
|
|
// End Line: 6110
|
|
|
|
/* begin block 3 */
|
|
// Start line: 6113
|
|
/* end block 3 */
|
|
// End Line: 6114
|
|
|
|
/* begin block 4 */
|
|
// Start line: 6115
|
|
/* end block 4 */
|
|
// End Line: 6116
|
|
|
|
void AttemptUnPark(_CAR_DATA *cp)
|
|
{
|
|
UNIMPLEMENTED();
|
|
/*
|
|
byte bVar1;
|
|
uint uVar2;
|
|
DRIVER2_STRAIGHT *straight;
|
|
DRIVER2_CURVE *curve;
|
|
|
|
straight = (DRIVER2_STRAIGHT *)0x0;
|
|
curve = (DRIVER2_CURVE *)0x0;
|
|
InitCivState(cp, (char *)0x0);
|
|
uVar2 = *(uint *)cp->ai;
|
|
if ((((uVar2 & 0xffffe000) == 0) && ((int)(uVar2 & 0x1fff) < NumDriver2Straights)) &&
|
|
(-1 < (int)uVar2)) {
|
|
straight = Driver2StraightsPtr + uVar2;
|
|
}
|
|
else {
|
|
curve = Driver2CurvesPtr + *(int *)cp->ai + -0x4000;
|
|
}
|
|
bVar1 = cp->ai[0xfb];
|
|
uVar2 = CheckChangeLanes(straight, curve, *(int *)(cp->ai + 0x28), cp, 0);
|
|
cp->ai[0xfb] = (byte)uVar2;
|
|
if ((((uint)bVar1 == (uVar2 & 0xff)) ||
|
|
((straight != (DRIVER2_STRAIGHT *)0x0 &&
|
|
(((int)(uint)(byte)straight->AILanes >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f) & 1U) == 0)))) ||
|
|
((curve != (DRIVER2_CURVE *)0x0 &&
|
|
(((int)(uint)(byte)curve->AILanes >> ((uint)(cp->ai[0xfb] >> 1) & 0x1f) & 1U) == 0)))) {
|
|
cp->ai[0xf9] = 3;
|
|
cp->ai[0xc] = 7;
|
|
}
|
|
return;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ CivControl(struct _CAR_DATA *cp /*$s0*/)
|
|
// line 2699, offset 0x0002ce10
|
|
/* begin block 1 */
|
|
// Start line: 2700
|
|
// Start offset: 0x0002CE10
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 2700
|
|
// Start offset: 0x0002CE10
|
|
/* end block 1.1 */
|
|
// End offset: 0x0002CE10
|
|
// End Line: 2700
|
|
|
|
/* begin block 1.2 */
|
|
// Start line: 2729
|
|
// Start offset: 0x0002CE8C
|
|
/* end block 1.2 */
|
|
// End offset: 0x0002CEC0
|
|
// End Line: 2731
|
|
/* end block 1 */
|
|
// End offset: 0x0002CF18
|
|
// End Line: 2740
|
|
|
|
/* begin block 2 */
|
|
// Start line: 7646
|
|
/* end block 2 */
|
|
// End Line: 7647
|
|
|
|
/* begin block 3 */
|
|
// Start line: 8189
|
|
/* end block 3 */
|
|
// End Line: 8190
|
|
|
|
int CivControl(_CAR_DATA *cp)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
byte bVar1;
|
|
long lVar2;
|
|
int iVar3;
|
|
|
|
CheckPingOut(cp);
|
|
if (cp->controlType == '\x02') {
|
|
if (*(int *)(cp->ai + 0x18) != 0) {
|
|
*(int *)(cp->ai + 0x18) = *(int *)(cp->ai + 0x18) + -1;
|
|
}
|
|
if ((((cp->ai[0xc] == 5) && (cp->ai[0xf9] == 3)) && (cp->totalDamage < 4)) &&
|
|
(((cp->ap).model != '\x03' &&
|
|
(lVar2 = Random2(0), (lVar2 + (0x19 - (uint)(byte)cp->id) * 0x10 & 0xff8) == 0xf00)))) {
|
|
AttemptUnPark(cp);
|
|
}
|
|
iVar3 = CivAccel(cp);
|
|
bVar1 = cp->ai[0xf9];
|
|
cp->thrust = (short)iVar3;
|
|
if (bVar1 != 3) {
|
|
iVar3 = CivSteerAngle(cp);
|
|
cp->wheel_angle = (short)iVar3;
|
|
}
|
|
}
|
|
if ((cp->controlFlags & 1) != 0) {
|
|
PassiveCopTasks(cp);
|
|
}
|
|
return 1;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ CivAccelTrafficRules(struct _CAR_DATA *cp /*$t3*/, int *distToNode /*$a1*/)
|
|
// line 2798, offset 0x0002a5fc
|
|
/* begin block 1 */
|
|
// Start line: 2799
|
|
// Start offset: 0x0002A5FC
|
|
// Variables:
|
|
// int lbody; // $t1
|
|
// int wbody; // $t2
|
|
// struct CIV_STATE *cs; // $a2
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 2844
|
|
// Start offset: 0x0002A71C
|
|
// Variables:
|
|
// int stopDist; // $t0
|
|
|
|
/* begin block 1.1.1 */
|
|
// Start line: 2848
|
|
// Start offset: 0x0002A794
|
|
// Variables:
|
|
// int endSpeed; // $v0
|
|
/* end block 1.1.1 */
|
|
// End offset: 0x0002A800
|
|
// End Line: 2853
|
|
/* end block 1.1 */
|
|
// End offset: 0x0002A800
|
|
// End Line: 2854
|
|
|
|
/* begin block 1.2 */
|
|
// Start line: 2863
|
|
// Start offset: 0x0002A844
|
|
// Variables:
|
|
// int ret; // $a1
|
|
// int properVel; // $v1
|
|
// int brakeDist; // $a3
|
|
|
|
/* begin block 1.2.1 */
|
|
// Start line: 2901
|
|
// Start offset: 0x0002A918
|
|
// Variables:
|
|
// int endSpeed; // $v0
|
|
// int currentDist; // $v1
|
|
/* end block 1.2.1 */
|
|
// End offset: 0x0002A918
|
|
// End Line: 2901
|
|
/* end block 1.2 */
|
|
// End offset: 0x0002A9EC
|
|
// End Line: 2915
|
|
|
|
/* begin block 1.3 */
|
|
// Start line: 2923
|
|
// Start offset: 0x0002A9EC
|
|
// Variables:
|
|
// int roadClear; // $t8
|
|
// int checkObstDist; // $t7
|
|
// int numLanes; // $v0
|
|
|
|
/* begin block 1.3.1 */
|
|
// Start line: 2932
|
|
// Start offset: 0x0002AA0C
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $t3
|
|
|
|
/* begin block 1.3.1.1 */
|
|
// Start line: 2932
|
|
// Start offset: 0x0002AA0C
|
|
// Variables:
|
|
// struct _CAR_DATA *lcp; // $a3
|
|
// int normal; // $v0
|
|
// int tangent; // $a0
|
|
// int distToObstacle; // $t0
|
|
// int ccarAng; // $t1
|
|
// int scarAng; // $t2
|
|
/* end block 1.3.1.1 */
|
|
// End offset: 0x0002AB2C
|
|
// End Line: 2932
|
|
/* end block 1.3.1 */
|
|
// End offset: 0x0002AB2C
|
|
// End Line: 2932
|
|
|
|
/* begin block 1.3.2 */
|
|
// Start line: 2799
|
|
// Start offset: 0x0002AB44
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $t3
|
|
|
|
/* begin block 1.3.2.1 */
|
|
// Start line: 2799
|
|
// Start offset: 0x0002AB44
|
|
// Variables:
|
|
// struct CIV_STATE *cs; // $v1
|
|
/* end block 1.3.2.1 */
|
|
// End offset: 0x0002AB44
|
|
// End Line: 2799
|
|
/* end block 1.3.2 */
|
|
// End offset: 0x0002AB44
|
|
// End Line: 2799
|
|
|
|
/* begin block 1.3.3 */
|
|
// Start line: 2943
|
|
// Start offset: 0x0002AB58
|
|
// Variables:
|
|
// int ret; // $v1
|
|
/* end block 1.3.3 */
|
|
// End offset: 0x0002ABA8
|
|
// End Line: 2946
|
|
/* end block 1.3 */
|
|
// End offset: 0x0002ABA8
|
|
// End Line: 2947
|
|
/* end block 1 */
|
|
// End offset: 0x0002ABA8
|
|
// End Line: 2949
|
|
|
|
/* begin block 2 */
|
|
// Start line: 6290
|
|
/* end block 2 */
|
|
// End Line: 6291
|
|
|
|
/* begin block 3 */
|
|
// Start line: 6399
|
|
/* end block 3 */
|
|
// End Line: 6400
|
|
|
|
int CivAccelTrafficRules(_CAR_DATA *cp, int *distToNode)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
short sVar1;
|
|
byte bVar2;
|
|
CAR_COSMETICS *pCVar3;
|
|
uint uVar4;
|
|
int iVar5;
|
|
int iVar6;
|
|
int iVar7;
|
|
_CAR_DATA *p_Var8;
|
|
int iVar9;
|
|
int iVar10;
|
|
|
|
pCVar3 = (cp->ap).carCos;
|
|
iVar10 = (int)(pCVar3->colBox).vz;
|
|
sVar1 = (pCVar3->colBox).vx;
|
|
if ((cp->id == '\x01') && (cp->ai[0xfa] == 1)) {
|
|
cp->ai[0xf9] = 3;
|
|
cp->ai[0xc] = 9;
|
|
cp->ai[0xfa] = 0;
|
|
}
|
|
switch (cp->ai[0xf9]) {
|
|
case 0:
|
|
break;
|
|
case 1:
|
|
if ((cp->ai[0xc] == 5) || (cp->ai[0xc] == 8)) {
|
|
iVar10 = 100;
|
|
}
|
|
else {
|
|
iVar10 = iVar10 * 3;
|
|
}
|
|
cp->ai[0x10] = 1;
|
|
if ((*(int *)(cp->ai + 8) != 0) && (*(short *)(*(int *)(cp->ai + 8) + 2) != 0x7f)) {
|
|
bVar2 = cp->ai[0xc];
|
|
if ((bVar2 == 1) && ((&junctionLightsPhase)[cp->ai[0xd]] == '\x03')) {
|
|
LAB_0002a8b4:
|
|
cp->ai[0xf9] = 0;
|
|
iVar10 = newAccel;
|
|
*(undefined4 *)(cp->ai + 8) = 0;
|
|
return iVar10;
|
|
}
|
|
iVar9 = *distToNode;
|
|
if (iVar9 < iVar10) {
|
|
if (bVar2 == 6) goto LAB_0002a8b4;
|
|
iVar9 = (cp->hd).wheel_speed;
|
|
iVar10 = -iVar9;
|
|
if (0 < iVar9) {
|
|
iVar10 = iVar10 + 3;
|
|
}
|
|
iVar10 = iVar10 >> 2;
|
|
cp->ai[0xf9] = 3;
|
|
}
|
|
else {
|
|
if (bVar2 == 6) {
|
|
iVar10 = (iVar9 - iVar10) * *(int *)(cp->ai + 0x20) + 70000;
|
|
}
|
|
else {
|
|
if (iVar10 < iVar9) {
|
|
iVar10 = *(int *)(cp->ai + 0x20) * ((iVar9 - iVar10) + 100);
|
|
}
|
|
else {
|
|
iVar10 = 0;
|
|
}
|
|
}
|
|
iVar10 = ((iVar10 - (cp->hd).wheel_speed) * newAccel) / 0xf;
|
|
}
|
|
if ((car_data < *(_CAR_DATA **)(cp->ai + 8)) &&
|
|
(*(_CAR_DATA **)(cp->ai + 8) < (_CAR_DATA *)0xd4934)) {
|
|
iVar9 = newAccel;
|
|
if ((iVar10 <= newAccel) && (iVar9 = iVar10, iVar10 < newAccel * -2)) {
|
|
iVar9 = newAccel * -2;
|
|
}
|
|
return iVar9;
|
|
}
|
|
}
|
|
default:
|
|
LAB_0002a670:
|
|
cp->ai[0xf9] = 3;
|
|
cp->ai[0xc] = 7;
|
|
return 0;
|
|
case 3:
|
|
switch (cp->ai[0xc]) {
|
|
case 1:
|
|
if ((&junctionLightsPhase)[cp->ai[0xd]] == '\x03') {
|
|
cp->ai[0xf9] = 0;
|
|
}
|
|
case 2:
|
|
cp->ai[0x10] = 1;
|
|
return 0;
|
|
case 3:
|
|
bVar2 = 5;
|
|
break;
|
|
case 4:
|
|
bVar2 = 6;
|
|
break;
|
|
default:
|
|
cp->ai[0x10] = 0;
|
|
return 0;
|
|
}
|
|
cp->ai[0xf9] = bVar2;
|
|
cp->ai[0x10] = 1;
|
|
return 0;
|
|
case 5:
|
|
case 6:
|
|
cp->ai[0x10] = 1;
|
|
iVar10 = 0x200;
|
|
if (cp->ai[0xc] == 4) {
|
|
iVar10 = 0x800;
|
|
}
|
|
p_Var8 = car_data + 0x13;
|
|
uVar4 = (cp->hd).direction & 0xfff;
|
|
iVar9 = 0x7fffff;
|
|
do {
|
|
if (((p_Var8->ai[0xf9] != 3) && (p_Var8 != cp)) && (p_Var8->controlType != '\0')) {
|
|
iVar7 = (p_Var8->hd).where.t[0] - (cp->hd).where.t[0];
|
|
iVar6 = (p_Var8->hd).where.t[2] - (cp->hd).where.t[2];
|
|
iVar5 = iVar7 * rcossin_tbl[uVar4 * 2] + iVar6 * rcossin_tbl[uVar4 * 2 + 1] + 0x800 >> 0xc;
|
|
if (0 < iVar5) {
|
|
iVar6 = (iVar7 * rcossin_tbl[uVar4 * 2 + 1] - iVar6 * rcossin_tbl[uVar4 * 2]) + 0x800 >>
|
|
0xc;
|
|
if (iVar6 < 0) {
|
|
iVar6 = -iVar6;
|
|
}
|
|
if ((iVar6 < (int)sVar1 * sideMul * 6) && (iVar5 < iVar9)) {
|
|
iVar9 = iVar5;
|
|
}
|
|
}
|
|
}
|
|
p_Var8 = p_Var8 + -1;
|
|
} while ((_CAR_DATA *)((int)&cheats.MagicMirror + 3U) < p_Var8);
|
|
if (iVar10 < iVar9) {
|
|
cp->ai[0xc] = 0;
|
|
cp->ai[0xf9] = 0;
|
|
iVar10 = newAccel;
|
|
*(undefined4 *)(cp->ai + 8) = 0;
|
|
return iVar10;
|
|
}
|
|
iVar9 = (cp->hd).wheel_speed;
|
|
iVar10 = -iVar9;
|
|
if (0 < iVar9) {
|
|
iVar10 = iVar10 + 3;
|
|
}
|
|
iVar10 = iVar10 >> 2;
|
|
iVar9 = newAccel;
|
|
if ((iVar10 <= newAccel) && (iVar9 = iVar10, iVar10 < newAccel * -2)) {
|
|
iVar9 = newAccel * -2;
|
|
}
|
|
return iVar9;
|
|
}
|
|
uVar4 = *(uint *)(cp->ai + 8);
|
|
cp->ai[0x10] = 0;
|
|
if (uVar4 == 0) goto LAB_0002a800;
|
|
iVar5 = (cp->hd).wheel_speed;
|
|
iVar9 = (iVar5 * (iVar5 + 0x800 >> 0xc)) / (newAccel << 1);
|
|
if (newAccel << 1 == 0) {
|
|
trap(7);
|
|
}
|
|
if (iVar9 < 0) {
|
|
iVar9 = -iVar9;
|
|
}
|
|
if ((uVar4 < 0xd1269) || (0xd4933 < uVar4)) goto LAB_0002a670;
|
|
iVar6 = *distToNode;
|
|
if (iVar9 <= iVar6) goto LAB_0002a800;
|
|
iVar5 = iVar5 + -120000;
|
|
iVar9 = iVar6 + iVar10 * -3;
|
|
if (iVar9 < 0) {
|
|
if (2 < iVar10 * 3 - iVar6) goto LAB_0002a7d4;
|
|
LAB_0002a7f8:
|
|
*(int *)(cp->ai + 0x20) = iVar5;
|
|
}
|
|
else {
|
|
if (2 < iVar9) {
|
|
LAB_0002a7d4:
|
|
iVar6 = iVar6 + iVar10 * -3;
|
|
iVar5 = iVar5 / iVar6;
|
|
if (iVar6 == 0) {
|
|
trap(7);
|
|
}
|
|
goto LAB_0002a7f8;
|
|
}
|
|
*(int *)(cp->ai + 0x20) = iVar5;
|
|
}
|
|
cp->ai[0xf9] = 1;
|
|
LAB_0002a800:
|
|
if ((cp->hd).wheel_speed + 0x800 >> 0xc <= (int)(uint)cp->ai[0xf8]) {
|
|
return newAccel;
|
|
}
|
|
iVar10 = newAccel;
|
|
if (newAccel < 0) {
|
|
iVar10 = newAccel + 3;
|
|
}
|
|
return iVar10 >> 2;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ SetUpCivCollFlags()
|
|
// line 2950, offset 0x0002aba8
|
|
/* begin block 1 */
|
|
// Start line: 2952
|
|
// Start offset: 0x0002ABA8
|
|
// Variables:
|
|
// struct SVECTOR boxDisp; // stack offset -72
|
|
// int carLength[2]; // stack offset -64
|
|
// struct _CAR_DATA *cp0; // $s5
|
|
// struct _CAR_DATA *cp1; // $s2
|
|
// unsigned int dNewLBODY[2]; // stack offset -56
|
|
// int dx; // $s0
|
|
// int dz; // stack offset -48
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 2985
|
|
// Start offset: 0x0002AC14
|
|
// Variables:
|
|
// int extraLength; // $a2
|
|
/* end block 1.1 */
|
|
// End offset: 0x0002AC44
|
|
// End Line: 2985
|
|
|
|
/* begin block 1.2 */
|
|
// Start line: 2990
|
|
// Start offset: 0x0002AD74
|
|
|
|
/* begin block 1.2.1 */
|
|
// Start line: 3003
|
|
// Start offset: 0x0002ADC4
|
|
/* end block 1.2.1 */
|
|
// End offset: 0x0002AE18
|
|
// End Line: 3003
|
|
|
|
/* begin block 1.2.2 */
|
|
// Start line: 3016
|
|
// Start offset: 0x0002AF60
|
|
// Variables:
|
|
// int civCD; // $s7
|
|
// int brake; // $a0
|
|
|
|
/* begin block 1.2.2.1 */
|
|
// Start line: 3024
|
|
// Start offset: 0x0002AF90
|
|
// Variables:
|
|
// unsigned int *blth; // $v1
|
|
/* end block 1.2.2.1 */
|
|
// End offset: 0x0002AFC0
|
|
// End Line: 3024
|
|
|
|
/* begin block 1.2.2.2 */
|
|
// Start line: 3033
|
|
// Start offset: 0x0002B020
|
|
// Variables:
|
|
// int i; // $a1
|
|
// int h; // $a3
|
|
// int rnd; // $a2
|
|
// struct _CAR_DATA *cp; // $s0
|
|
|
|
/* begin block 1.2.2.2.1 */
|
|
// Start line: 3040
|
|
// Start offset: 0x0002B0C0
|
|
/* end block 1.2.2.2.1 */
|
|
// End offset: 0x0002B190
|
|
// End Line: 3048
|
|
/* end block 1.2.2.2 */
|
|
// End offset: 0x0002B1A4
|
|
// End Line: 3050
|
|
/* end block 1.2.2 */
|
|
// End offset: 0x0002B1A4
|
|
// End Line: 3051
|
|
/* end block 1.2 */
|
|
// End offset: 0x0002B1A4
|
|
// End Line: 3052
|
|
|
|
/* begin block 1.3 */
|
|
// Start line: 3056
|
|
// Start offset: 0x0002B1C8
|
|
// Variables:
|
|
// unsigned char i; // $s0
|
|
/* end block 1.3 */
|
|
// End offset: 0x0002B26C
|
|
// End Line: 3065
|
|
/* end block 1 */
|
|
// End offset: 0x0002B26C
|
|
// End Line: 3066
|
|
|
|
/* begin block 2 */
|
|
// Start line: 6724
|
|
/* end block 2 */
|
|
// End Line: 6725
|
|
|
|
/* begin block 3 */
|
|
// Start line: 6725
|
|
/* end block 3 */
|
|
// End Line: 6726
|
|
|
|
/* begin block 4 */
|
|
// Start line: 6727
|
|
/* end block 4 */
|
|
// End Line: 6728
|
|
|
|
/* begin block 5 */
|
|
// Start line: 6729
|
|
/* end block 5 */
|
|
// End Line: 6730
|
|
|
|
/* begin block 6 */
|
|
// Start line: 6730
|
|
/* end block 6 */
|
|
// End Line: 6731
|
|
|
|
/* begin block 7 */
|
|
// Start line: 6757
|
|
/* end block 7 */
|
|
// End Line: 6758
|
|
|
|
/* WARNING: Removing unreachable block (ram,0x0002b034) */
|
|
/* WARNING: Unknown calling convention yet parameter storage is locked */
|
|
|
|
void SetUpCivCollFlags(void)
|
|
{
|
|
UNIMPLEMENTED();
|
|
/*
|
|
byte bVar1;
|
|
ushort uVar2;
|
|
bool bVar3;
|
|
undefined4 in_zero;
|
|
undefined4 in_at;
|
|
int iVar4;
|
|
int iVar5;
|
|
uint uVar6;
|
|
long lVar7;
|
|
int iVar8;
|
|
_CAR_DATA **pp_Var9;
|
|
int iVar10;
|
|
int iVar11;
|
|
_CAR_DATA **pp_Var12;
|
|
CAR_COSMETICS *pCVar13;
|
|
uint uVar14;
|
|
uchar *puVar15;
|
|
_CAR_DATA *p_Var16;
|
|
undefined4 local_48;
|
|
uint local_44;
|
|
undefined4 local_30;
|
|
_CAR_DATA *local_2c;
|
|
|
|
ClearMem((char *)brakeLength, 0x50);
|
|
local_2c = car_data + 0x13;
|
|
do {
|
|
if (local_2c->controlType == '\x02') {
|
|
iVar10 = (local_2c->hd).wheel_speed + 0x800 >> 0xc;
|
|
if (local_2c->wheel_angle < 0x3d) {
|
|
iVar10 = iVar10 * 0xd;
|
|
}
|
|
else {
|
|
iVar10 = iVar10 << 2;
|
|
}
|
|
pCVar13 = (local_2c->ap).carCos;
|
|
iVar4 = (int)(pCVar13->colBox).vz;
|
|
cd.length[0] = iVar10;
|
|
if (iVar10 < 0) {
|
|
cd.length[0] = -iVar10;
|
|
}
|
|
cd.length[0] = iVar4 + 0x5d + cd.length[0];
|
|
cd.length[1] = (int)(pCVar13->colBox).vx;
|
|
setCopControlWord(2, 0, *(undefined4 *)(local_2c->hd).where.m);
|
|
setCopControlWord(2, 0x800, *(undefined4 *)((local_2c->hd).where.m + 2));
|
|
setCopControlWord(2, 0x1000, *(undefined4 *)((local_2c->hd).where.m + 4));
|
|
setCopControlWord(2, 0x1800, *(undefined4 *)((local_2c->hd).where.m + 6));
|
|
setCopControlWord(2, 0x2000, *(undefined4 *)((local_2c->hd).where.m + 8));
|
|
setCopControlWord(2, 0x2800, (local_2c->hd).where.t[0]);
|
|
setCopControlWord(2, 0x3000, (local_2c->hd).where.t[1]);
|
|
setCopControlWord(2, 0x3800, (local_2c->hd).where.t[2]);
|
|
local_48 = CONCAT22(-(pCVar13->cog).vy, -(pCVar13->cog).vx);
|
|
local_44 = local_44 & 0xffff0000 | (uint)(ushort)(((short)iVar10 - (pCVar13->cog).vz) + 0x5d);
|
|
setCopReg(2, in_zero, local_48);
|
|
setCopReg(2, in_at, local_44);
|
|
copFunction(2, 0x480012);
|
|
cd.x.vx = getCopReg(2, 0x19);
|
|
cd.x.vy = getCopReg(2, 0x1a);
|
|
cd.x.vz = getCopReg(2, 0x1b);
|
|
p_Var16 = car_data + 0x14;
|
|
cd.theta = (local_2c->hd).direction;
|
|
do {
|
|
if ((p_Var16->controlType == '\0') || (p_Var16 == local_2c)) {
|
|
LAB_0002b1a4:
|
|
bVar3 = p_Var16 + -1 < car_data;
|
|
}
|
|
else {
|
|
if ((int)(p_Var16[-0x503].ap.old_clock + 2) * -0x24ca58e9 >> 2 == 0x14) {
|
|
if (player.playerType != '\x02') goto LAB_0002b1a4;
|
|
CDATA2D_000bd0e4.length[0] = 0x3c;
|
|
CDATA2D_000bd0e4.length[1] = 0x3c;
|
|
CDATA2D_000bd0e4.x.vx = player.pos[0];
|
|
CDATA2D_000bd0e4.x.vz = player.pos[2];
|
|
CDATA2D_000bd0e4.theta = player.dir;
|
|
}
|
|
else {
|
|
pCVar13 = (p_Var16->ap).carCos;
|
|
CDATA2D_000bd0e4.length[0] = (int)(pCVar13->colBox).vz;
|
|
CDATA2D_000bd0e4.length[1] = (int)(pCVar13->colBox).vx;
|
|
CDATA2D_000bd0e4.x.vx = (p_Var16->hd).oBox.location.vx;
|
|
CDATA2D_000bd0e4.x.vy = (p_Var16->hd).oBox.location.vy;
|
|
CDATA2D_000bd0e4.x.vz = (p_Var16->hd).oBox.location.vz;
|
|
CDATA2D_000bd0e4.theta = (p_Var16->hd).direction;
|
|
}
|
|
iVar10 = ((cd.length[0] + CDATA2D_000bd0e4.length[0]) * 3) / 2;
|
|
if (cd.x.vx - CDATA2D_000bd0e4.x.vx < 0) {
|
|
if (CDATA2D_000bd0e4.x.vx - cd.x.vx < iVar10) goto LAB_0002ae74;
|
|
goto LAB_0002b1a4;
|
|
}
|
|
if (iVar10 <= cd.x.vx - CDATA2D_000bd0e4.x.vx) goto LAB_0002b1a4;
|
|
LAB_0002ae74:
|
|
if (cd.x.vz - CDATA2D_000bd0e4.x.vz < 0) {
|
|
if (CDATA2D_000bd0e4.x.vz - cd.x.vz < iVar10) goto LAB_0002aeb0;
|
|
goto LAB_0002b1a4;
|
|
}
|
|
if (iVar10 <= cd.x.vz - CDATA2D_000bd0e4.x.vz) goto LAB_0002b1a4;
|
|
LAB_0002aeb0:
|
|
iVar11 = (local_2c->hd).where.t[1];
|
|
if ((int)(p_Var16[-0x503].ap.old_clock + 2) * -0x24ca58e9 >> 2 == 0x14) {
|
|
LAB_0002af10:
|
|
iVar5 = player.pos[1] - iVar11;
|
|
if (iVar5 < 0) {
|
|
iVar5 = iVar11 - player.pos[1];
|
|
}
|
|
if (499 < iVar5) goto LAB_0002b1a4;
|
|
}
|
|
else {
|
|
iVar8 = (p_Var16->hd).where.t[1];
|
|
iVar5 = iVar8 - iVar11;
|
|
if (iVar5 < 0) {
|
|
iVar5 = iVar11 - iVar8;
|
|
}
|
|
if (499 < iVar5) {
|
|
if ((int)(p_Var16[-0x503].ap.old_clock + 2) * -0x24ca58e9 >> 2 != 0x14)
|
|
goto LAB_0002b1a4;
|
|
goto LAB_0002af10;
|
|
}
|
|
}
|
|
iVar11 = bcollided2d(&cd, 1);
|
|
if (iVar11 == 0) goto LAB_0002b1a4;
|
|
ratan2(iVar10, local_30);
|
|
uVar14 = (cd.length[0] - iVar4) - boxOverlap;
|
|
if ((int)uVar14 < 1) {
|
|
uVar14 = 1;
|
|
}
|
|
uVar6 = brakeLength[(byte)local_2c->id];
|
|
if ((uVar6 == 0) || (uVar14 < uVar6)) {
|
|
brakeLength[(byte)local_2c->id] = uVar14;
|
|
}
|
|
if (local_2c->ai[0xf9] == 3) goto LAB_0002b1a4;
|
|
iVar10 = (int)(p_Var16[-0x503].ap.old_clock + 2) * -0x24ca58e9 >> 2;
|
|
if (iVar10 == 0x14) {
|
|
*(int *)(local_2c->ai + 0x1c) = CAR_PAUSE_START;
|
|
}
|
|
bVar3 = p_Var16 + -1 < car_data;
|
|
if ((local_2c->ai[0xf9] != 3) &&
|
|
((p_Var16->controlType == '\x01' || (bVar3 = p_Var16 + -1 < car_data, iVar10 == 0x14)))
|
|
) {
|
|
lVar7 = Random2(0);
|
|
bVar3 = false;
|
|
pp_Var12 = &horncarflag2;
|
|
iVar10 = 1;
|
|
pp_Var9 = pp_Var12;
|
|
do {
|
|
if (*pp_Var9 == local_2c) {
|
|
bVar3 = true;
|
|
}
|
|
iVar10 = iVar10 + -1;
|
|
pp_Var9 = pp_Var9 + 1;
|
|
} while (-1 < iVar10);
|
|
iVar10 = 0;
|
|
puVar15 = &hornchanflag;
|
|
do {
|
|
if ((!bVar3) && (*puVar15 == 0)) {
|
|
uVar14 = GetFreeChannel();
|
|
*puVar15 = (byte)uVar14;
|
|
SpuSetVoiceAR(uVar14 & 0xff, 0x1b);
|
|
bVar1 = (local_2c->ap).model;
|
|
if (bVar1 == 4) {
|
|
uVar14 = ResidentModelsBodge();
|
|
}
|
|
else {
|
|
if (bVar1 < 3) {
|
|
uVar14 = (uint)(byte)(local_2c->ap).model;
|
|
}
|
|
else {
|
|
uVar14 = (uint)(byte)(local_2c->ap).model - 1;
|
|
}
|
|
}
|
|
Start3DSoundVolPitch
|
|
((uint)*puVar15, 3, uVar14 * 3 + 2, (local_2c->hd).where.t[0],
|
|
(local_2c->hd).where.t[1], (local_2c->hd).where.t[2], -2000, 0x1000);
|
|
bVar1 = *puVar15;
|
|
uVar2 = (&channels)[bVar1].time;
|
|
*pp_Var12 = local_2c;
|
|
(&channels)[bVar1].time = uVar2 + (short)lVar7 + (short)(lVar7 / 0x1e) * -0x1e;
|
|
break;
|
|
}
|
|
pp_Var12 = pp_Var12 + 1;
|
|
iVar10 = iVar10 + 1;
|
|
puVar15 = puVar15 + 1;
|
|
} while (iVar10 < 2);
|
|
goto LAB_0002b1a4;
|
|
}
|
|
}
|
|
p_Var16 = p_Var16 + -1;
|
|
} while (!bVar3);
|
|
}
|
|
local_2c = local_2c + -1;
|
|
if (local_2c <= (_CAR_DATA *)((int)&cheats.MagicMirror + 3U)) {
|
|
uVar14 = 0;
|
|
do {
|
|
bVar1 = (&hornchanflag)[uVar14];
|
|
if ((bVar1 != 0) && ((&channels)[bVar1].time == 0)) {
|
|
(&horncarflag2)[uVar14] = (_CAR_DATA *)0x0;
|
|
(&hornchanflag)[uVar14] = 0;
|
|
SpuSetVoiceAR(0, 0x23);
|
|
}
|
|
uVar14 = uVar14 + 1 & 0xff;
|
|
} while (uVar14 < 2);
|
|
return;
|
|
}
|
|
} while (true);*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ CivAccel(struct _CAR_DATA *cp /*$s0*/)
|
|
// line 3074, offset 0x0002b26c
|
|
/* begin block 1 */
|
|
// Start line: 3075
|
|
// Start offset: 0x0002B26C
|
|
// Variables:
|
|
// int ret; // $t1
|
|
// int distToNode; // stack offset -16
|
|
// int dx; // $v1
|
|
// int dz; // $a0
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 3106
|
|
// Start offset: 0x0002B35C
|
|
// Variables:
|
|
// int tmpRet; // $a0
|
|
// int lbody; // $a0
|
|
|
|
/* begin block 1.1.1 */
|
|
// Start line: 3111
|
|
// Start offset: 0x0002B388
|
|
// Variables:
|
|
// int sf; // $v1
|
|
// int c1; // $t0
|
|
// int c2; // $a3
|
|
// int c3; // $a1
|
|
|
|
/* begin block 1.1.1.1 */
|
|
// Start line: 3126
|
|
// Start offset: 0x0002B44C
|
|
// Variables:
|
|
// int tmp; // $v1
|
|
/* end block 1.1.1.1 */
|
|
// End offset: 0x0002B4B8
|
|
// End Line: 3129
|
|
/* end block 1.1.1 */
|
|
// End offset: 0x0002B4C8
|
|
// End Line: 3132
|
|
/* end block 1.1 */
|
|
// End offset: 0x0002B528
|
|
// End Line: 3146
|
|
/* end block 1 */
|
|
// End offset: 0x0002B53C
|
|
// End Line: 3149
|
|
|
|
/* begin block 2 */
|
|
// Start line: 7066
|
|
/* end block 2 */
|
|
// End Line: 7067
|
|
|
|
/* begin block 3 */
|
|
// Start line: 7067
|
|
/* end block 3 */
|
|
// End Line: 7068
|
|
|
|
/* begin block 4 */
|
|
// Start line: 7076
|
|
/* end block 4 */
|
|
// End Line: 7077
|
|
|
|
/* begin block 5 */
|
|
// Start line: 7084
|
|
/* end block 5 */
|
|
// End Line: 7085
|
|
|
|
int CivAccel(_CAR_DATA *cp)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
int iVar1;
|
|
uint uVar2;
|
|
int iVar3;
|
|
int iVar4;
|
|
int iVar5;
|
|
uint uVar6;
|
|
int local_10[2];
|
|
|
|
iVar5 = *(int *)(cp->ai + 8);
|
|
carnum = (int)(cp[-0x503].ap.old_clock + 2) * -0x24ca58e9 >> 2;
|
|
if ((iVar5 == 0) || (cp->ai[0xf9] == 3)) {
|
|
local_10[0] = -1;
|
|
}
|
|
else {
|
|
iVar3 = (cp->hd).where.t[0] - *(int *)(iVar5 + 8);
|
|
iVar5 = (cp->hd).where.t[2] - *(int *)(iVar5 + 0xc);
|
|
local_10[0] = SquareRoot0(iVar3 * iVar3 + iVar5 * iVar5);
|
|
}
|
|
if ((cp->ai[0xf9] != 3) && (*(short *)(*(int *)(cp->ai + 8) + 2) == 0x7f)) {
|
|
local_10[0] = -local_10[0];
|
|
}
|
|
iVar5 = CivAccelTrafficRules(cp, local_10);
|
|
if (cp->ai[0xf9] != 3) {
|
|
collDat = brakeLength[(byte)cp->id];
|
|
iVar3 = (uint)(ushort)(((cp->ap).carCos)->colBox).vz << 0x10;
|
|
iVar4 = iVar3 >> 0x10;
|
|
if (collDat != 0) {
|
|
iVar1 = iVar4;
|
|
if (iVar4 < 0) {
|
|
iVar1 = iVar4 + 3;
|
|
}
|
|
uVar6 = iVar4 - (iVar3 >> 0x1f) >> 1;
|
|
if (collDat < (uint)(iVar4 * 2)) {
|
|
if (((uint)(iVar4 * 2) < collDat) && (uVar6 <= collDat)) {
|
|
uVar6 = uVar6 + iVar4 * -2;
|
|
if (uVar6 == 0) {
|
|
trap(7);
|
|
}
|
|
iVar3 = ((collDat + iVar4 * -2) * -100) / uVar6 + 100;
|
|
}
|
|
else {
|
|
if ((uVar6 < collDat) && ((uint)(iVar1 >> 2) <= collDat)) {
|
|
uVar2 = (iVar1 >> 2) - uVar6;
|
|
if (uVar2 == 0) {
|
|
trap(7);
|
|
}
|
|
iVar3 = ((collDat - uVar6) * -300) / uVar2 + 400;
|
|
}
|
|
else {
|
|
iVar3 = 100;
|
|
}
|
|
}
|
|
}
|
|
else {
|
|
iVar3 = 0;
|
|
}
|
|
iVar1 = (cp->hd).wheel_speed;
|
|
iVar4 = -iVar1;
|
|
iVar3 = (newAccel * iVar3) / 100;
|
|
if (0 < iVar1) {
|
|
iVar4 = iVar4 + 3;
|
|
}
|
|
iVar4 = iVar4 >> 2;
|
|
if ((iVar4 <= iVar3) && (iVar1 = iVar3 * -2, iVar3 = iVar4, iVar4 < iVar1)) {
|
|
iVar3 = iVar1;
|
|
}
|
|
if (iVar3 < iVar5) {
|
|
iVar5 = iVar3;
|
|
}
|
|
}
|
|
if ((0 < *(int *)(cp->ai + 0x1c)) && (collDat == 0)) {
|
|
iVar4 = (cp->hd).wheel_speed;
|
|
iVar3 = iVar4 + 0x800 >> 0xc;
|
|
if (iVar3 < 0) {
|
|
iVar3 = -iVar3;
|
|
}
|
|
iVar1 = -iVar4;
|
|
if (iVar3 < 3) {
|
|
if (0 < iVar4) {
|
|
iVar1 = iVar1 + 3;
|
|
}
|
|
iVar5 = iVar1 >> 2;
|
|
*(int *)(cp->ai + 0x1c) = *(int *)(cp->ai + 0x1c) + -1;
|
|
}
|
|
}
|
|
}
|
|
return iVar5;
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ CivSteerAngle(struct _CAR_DATA *cp /*$s0*/)
|
|
// line 3166, offset 0x0002b53c
|
|
/* begin block 1 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B53C
|
|
// Variables:
|
|
// int station; // $a3
|
|
// int step; // $s2
|
|
// int ret; // $a0
|
|
// struct VECTOR locPath; // stack offset -56
|
|
// struct VECTOR pathPoint; // stack offset -40
|
|
// int lbody; // $s3
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B53C
|
|
|
|
/* begin block 1.1.1 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B53C
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
|
|
/* begin block 1.1.1.1 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B53C
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v1
|
|
/* end block 1.1.1.1 */
|
|
// End offset: 0x0002B590
|
|
// End Line: 3175
|
|
/* end block 1.1.1 */
|
|
// End offset: 0x0002B590
|
|
// End Line: 3175
|
|
|
|
/* begin block 1.1.2 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B5A0
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
|
|
/* begin block 1.1.2.1 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B5A0
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v1
|
|
/* end block 1.1.2.1 */
|
|
// End offset: 0x0002B5B0
|
|
// End Line: 3167
|
|
/* end block 1.1.2 */
|
|
// End offset: 0x0002B5B0
|
|
// End Line: 3167
|
|
|
|
/* begin block 1.1.3 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B5C0
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
|
|
/* begin block 1.1.3.1 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B5C0
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v1
|
|
/* end block 1.1.3.1 */
|
|
// End offset: 0x0002B5D0
|
|
// End Line: 3167
|
|
/* end block 1.1.3 */
|
|
// End offset: 0x0002B5D0
|
|
// End Line: 3167
|
|
|
|
/* begin block 1.1.4 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B5E0
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
|
|
/* begin block 1.1.4.1 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B5E0
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v1
|
|
/* end block 1.1.4.1 */
|
|
// End offset: 0x0002B5F0
|
|
// End Line: 3167
|
|
/* end block 1.1.4 */
|
|
// End offset: 0x0002B5F0
|
|
// End Line: 3167
|
|
/* end block 1.1 */
|
|
// End offset: 0x0002B610
|
|
// End Line: 3192
|
|
|
|
/* begin block 1.2 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B67C
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
|
|
/* begin block 1.2.1 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B67C
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $a0
|
|
/* end block 1.2.1 */
|
|
// End offset: 0x0002B690
|
|
// End Line: 3167
|
|
/* end block 1.2 */
|
|
// End offset: 0x0002B690
|
|
// End Line: 3167
|
|
|
|
/* begin block 1.3 */
|
|
// Start line: 3201
|
|
// Start offset: 0x0002B6A0
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *crLoc; // $a1
|
|
// struct CIV_ROUTE_ENTRY *cr; // $a0
|
|
/* end block 1.3 */
|
|
// End offset: 0x0002B700
|
|
// End Line: 3212
|
|
|
|
/* begin block 1.4 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B748
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
|
|
/* begin block 1.4.1 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B748
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v1
|
|
/* end block 1.4.1 */
|
|
// End offset: 0x0002B758
|
|
// End Line: 3167
|
|
/* end block 1.4 */
|
|
// End offset: 0x0002B758
|
|
// End Line: 3167
|
|
|
|
/* begin block 1.5 */
|
|
// Start line: 3236
|
|
// Start offset: 0x0002B870
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *cr; // $a0
|
|
|
|
/* begin block 1.5.1 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B8A0
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
|
|
/* begin block 1.5.1.1 */
|
|
// Start line: 3167
|
|
// Start offset: 0x0002B8A0
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v1
|
|
/* end block 1.5.1.1 */
|
|
// End offset: 0x0002B8B0
|
|
// End Line: 3167
|
|
/* end block 1.5.1 */
|
|
// End offset: 0x0002B8B0
|
|
// End Line: 3167
|
|
/* end block 1.5 */
|
|
// End offset: 0x0002B8C0
|
|
// End Line: 3243
|
|
/* end block 1 */
|
|
// End offset: 0x0002B8E4
|
|
// End Line: 3246
|
|
|
|
/* begin block 2 */
|
|
// Start line: 7260
|
|
/* end block 2 */
|
|
// End Line: 7261
|
|
|
|
/* begin block 3 */
|
|
// Start line: 7278
|
|
/* end block 3 */
|
|
// End Line: 7279
|
|
|
|
/* WARNING: Type propagation algorithm not settling */
|
|
|
|
int CivSteerAngle(_CAR_DATA *cp)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
undefined4 *puVar1;
|
|
short sVar2;
|
|
int iVar3;
|
|
int iVar4;
|
|
long lVar5;
|
|
_CAR_DATA *p_Var6;
|
|
_CAR_DATA *p_Var7;
|
|
CIV_ROUTE_ENTRY *pCVar8;
|
|
_CAR_DATA *p_Var9;
|
|
CIV_ROUTE_ENTRY *pCVar10;
|
|
undefined4 uVar11;
|
|
long lVar12;
|
|
undefined4 *puVar13;
|
|
int iVar14;
|
|
CIV_ROUTE_ENTRY *pCVar15;
|
|
_CAR_DATA *p_Var16;
|
|
undefined4 *puVar17;
|
|
undefined4 uVar18;
|
|
undefined4 uVar19;
|
|
VECTOR local_28;
|
|
|
|
pCVar15 = (CIV_ROUTE_ENTRY *)(cp->ai + 0xf4);
|
|
iVar3 = (cp->hd).wheel_speed;
|
|
startNode = *(CIV_ROUTE_ENTRY **)(cp->ai + 0xf4);
|
|
sVar2 = (((cp->ap).carCos)->colBox).vz;
|
|
pCVar8 = startNode + 1;
|
|
if (pCVar15 <= pCVar8) {
|
|
pCVar8 = startNode + -0xc;
|
|
}
|
|
pCVar10 = startNode + 2;
|
|
if (pCVar8->pathType == 0x7f) {
|
|
LAB_0002b600:
|
|
iVar4 = CreateNewNode(cp);
|
|
if (iVar4 == 0) goto LAB_0002b76c;
|
|
}
|
|
else {
|
|
if (pCVar15 <= pCVar10) {
|
|
pCVar10 = startNode + -0xb;
|
|
}
|
|
pCVar8 = startNode + 3;
|
|
if (pCVar10->pathType == 0x7f) goto LAB_0002b600;
|
|
if (pCVar15 <= pCVar8) {
|
|
pCVar8 = startNode + -10;
|
|
}
|
|
pCVar10 = startNode + 4;
|
|
if (pCVar8->pathType == 0x7f) goto LAB_0002b600;
|
|
if (pCVar15 <= pCVar10) {
|
|
pCVar10 = startNode + -9;
|
|
}
|
|
if (pCVar10->pathType == 0x7f) goto LAB_0002b600;
|
|
}
|
|
p_Var7 = cp;
|
|
p_Var16 = ¤tCar;
|
|
do {
|
|
p_Var9 = p_Var16;
|
|
p_Var6 = p_Var7;
|
|
uVar11 = *(undefined4 *)((p_Var6->hd).where.m + 2);
|
|
uVar18 = *(undefined4 *)((p_Var6->hd).where.m + 4);
|
|
uVar19 = *(undefined4 *)((p_Var6->hd).where.m + 6);
|
|
*(undefined4 *)(p_Var9->hd).where.m = *(undefined4 *)(p_Var6->hd).where.m;
|
|
*(undefined4 *)((p_Var9->hd).where.m + 2) = uVar11;
|
|
*(undefined4 *)((p_Var9->hd).where.m + 4) = uVar18;
|
|
*(undefined4 *)((p_Var9->hd).where.m + 6) = uVar19;
|
|
p_Var7 = (_CAR_DATA *)((p_Var6->hd).where.m + 8);
|
|
p_Var16 = (_CAR_DATA *)((p_Var9->hd).where.m + 8);
|
|
} while (p_Var7 != (_CAR_DATA *)&cp->handbrake);
|
|
lVar5 = (p_Var6->hd).where.t[0];
|
|
lVar12 = (p_Var6->hd).where.t[1];
|
|
*(undefined4 *)(p_Var16->hd).where.m = *(undefined4 *)(p_Var7->hd).where.m;
|
|
(p_Var9->hd).where.t[0] = lVar5;
|
|
(p_Var9->hd).where.t[1] = lVar12;
|
|
iVar4 = *(int *)(cp->ai + 0xf4);
|
|
pCVar8 = (CIV_ROUTE_ENTRY *)(iVar4 + 0x10);
|
|
if (*(short *)(iVar4 + 2) != 0x7f) {
|
|
pCVar15 = (CIV_ROUTE_ENTRY *)(cp->ai + 0xf4);
|
|
if (pCVar15 <= pCVar8) {
|
|
pCVar8 = (CIV_ROUTE_ENTRY *)(iVar4 + -0xc0);
|
|
}
|
|
if (pCVar8->pathType != 0x7f) {
|
|
iVar4 = CivFindStation(cp);
|
|
puVar13 = (undefined4 *)(cp->ai + 0xe4);
|
|
puVar17 = (undefined4 *)(currentCar.ai + 0xe4);
|
|
while (cp->ai + 0x24 <= puVar13) {
|
|
*puVar17 = *puVar13;
|
|
puVar17[1] = puVar13[1];
|
|
puVar17[2] = puVar13[2];
|
|
puVar1 = puVar13 + 3;
|
|
puVar13 = puVar13 + -4;
|
|
puVar17[3] = *puVar1;
|
|
puVar17 = puVar17 + -4;
|
|
}
|
|
currentCar.hd.direction = (cp->hd).direction;
|
|
currentCar.ai._244_4_ = *(undefined4 *)(cp->ai + 0xf4);
|
|
currentCar.ai._4_4_ = *(undefined4 *)(cp->ai + 4);
|
|
currentCar.ai._0_4_ = *(undefined4 *)cp->ai;
|
|
iVar14 = *(int *)(cp->ai + 0xf4);
|
|
pCVar8 = (CIV_ROUTE_ENTRY *)(iVar14 + 0x10);
|
|
if (*(short *)(iVar14 + 2) != 0x7f) {
|
|
if (pCVar15 <= pCVar8) {
|
|
pCVar8 = (CIV_ROUTE_ENTRY *)(iVar14 + -0xc0);
|
|
}
|
|
if (pCVar8->pathType != 0x7f) {
|
|
CivFindPointOnPath(cp, iVar4 + (iVar3 + 0x800 >> 0xc) * checkFrames + (int)sVar2, &local_28)
|
|
;
|
|
iVar3 = ratan2(local_28.vx - (cp->hd).where.t[0], local_28.vz - (cp->hd).where.t[2]);
|
|
iVar4 = ((iVar3 - (cp->hd).direction) + 0x800U & 0xfff) - 0x800;
|
|
iVar3 = maxSteer;
|
|
if ((iVar4 <= maxSteer) && (iVar3 = iVar4, iVar4 < -maxSteer)) {
|
|
iVar3 = -maxSteer;
|
|
}
|
|
p_Var7 = ¤tCar;
|
|
p_Var16 = cp;
|
|
do {
|
|
p_Var9 = p_Var16;
|
|
p_Var6 = p_Var7;
|
|
uVar11 = *(undefined4 *)((p_Var6->hd).where.m + 2);
|
|
uVar18 = *(undefined4 *)((p_Var6->hd).where.m + 4);
|
|
uVar19 = *(undefined4 *)((p_Var6->hd).where.m + 6);
|
|
*(undefined4 *)(p_Var9->hd).where.m = *(undefined4 *)(p_Var6->hd).where.m;
|
|
*(undefined4 *)((p_Var9->hd).where.m + 2) = uVar11;
|
|
*(undefined4 *)((p_Var9->hd).where.m + 4) = uVar18;
|
|
*(undefined4 *)((p_Var9->hd).where.m + 6) = uVar19;
|
|
p_Var7 = (_CAR_DATA *)((p_Var6->hd).where.m + 8);
|
|
p_Var16 = (_CAR_DATA *)((p_Var9->hd).where.m + 8);
|
|
} while (p_Var7 != (_CAR_DATA *)¤tCar.handbrake);
|
|
lVar5 = (p_Var6->hd).where.t[0];
|
|
lVar12 = (p_Var6->hd).where.t[1];
|
|
*(undefined4 *)(p_Var16->hd).where.m = currentCar._656_4_;
|
|
(p_Var9->hd).where.t[0] = lVar5;
|
|
(p_Var9->hd).where.t[1] = lVar12;
|
|
pCVar8 = startNode;
|
|
if (startNode == *(CIV_ROUTE_ENTRY **)(cp->ai + 0xf4)) {
|
|
return iVar3;
|
|
}
|
|
do {
|
|
pCVar8->pathType = 0x7f;
|
|
pCVar10 = pCVar8 + 1;
|
|
if (*(int *)(cp->ai + 0x14) == (int)pCVar8 + (-0x1b0 - (int)cp) >> 4) {
|
|
*(undefined4 *)(cp->ai + 0x14) = 0xffffffff;
|
|
}
|
|
if (pCVar15 <= pCVar10) {
|
|
pCVar10 = pCVar8 + -0xc;
|
|
}
|
|
pCVar8 = pCVar10;
|
|
} while (pCVar10 != *(CIV_ROUTE_ENTRY **)(cp->ai + 0xf4));
|
|
return iVar3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
LAB_0002b76c:
|
|
cp->ai[0xf9] = 3;
|
|
cp->ai[0xc] = 7;
|
|
return 0;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ CivFindStation(struct _CAR_DATA *cp /*$s6*/)
|
|
// line 3265, offset 0x0002b8e4
|
|
/* begin block 1 */
|
|
// Start line: 3266
|
|
// Start offset: 0x0002B8E4
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *rep; // $s3
|
|
// int cx; // stack offset -48
|
|
// int cz; // $fp
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 3266
|
|
// Start offset: 0x0002B8E4
|
|
// Variables:
|
|
// int loop; // $a0
|
|
|
|
/* begin block 1.1.1 */
|
|
// Start line: 3266
|
|
// Start offset: 0x0002B93C
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s6
|
|
|
|
/* begin block 1.1.1.1 */
|
|
// Start line: 3266
|
|
// Start offset: 0x0002B93C
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v1
|
|
/* end block 1.1.1.1 */
|
|
// End offset: 0x0002B950
|
|
// End Line: 3266
|
|
/* end block 1.1.1 */
|
|
// End offset: 0x0002B950
|
|
// End Line: 3266
|
|
/* end block 1.1 */
|
|
// End offset: 0x0002B95C
|
|
// End Line: 3277
|
|
|
|
/* begin block 1.2 */
|
|
// Start line: 3280
|
|
// Start offset: 0x0002B964
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s6
|
|
// struct CIV_ROUTE_ENTRY *currentNode; // $s3
|
|
|
|
/* begin block 1.2.1 */
|
|
// Start line: 3280
|
|
// Start offset: 0x0002B964
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $s0
|
|
/* end block 1.2.1 */
|
|
// End offset: 0x0002B964
|
|
// End Line: 3280
|
|
/* end block 1.2 */
|
|
// End offset: 0x0002B964
|
|
// End Line: 3280
|
|
|
|
/* begin block 1.3 */
|
|
// Start line: 3282
|
|
// Start offset: 0x0002B964
|
|
// Variables:
|
|
// int sx; // $s5
|
|
// int sz; // $s4
|
|
// int dx; // $s2
|
|
// int dz; // $s1
|
|
// int stepsize; // $a1
|
|
// int square; // $a0
|
|
|
|
/* begin block 1.3.1 */
|
|
// Start line: 3309
|
|
// Start offset: 0x0002BA28
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s6
|
|
// struct CIV_ROUTE_ENTRY *currentNode; // $s3
|
|
|
|
/* begin block 1.3.1.1 */
|
|
// Start line: 3309
|
|
// Start offset: 0x0002BA28
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v1
|
|
/* end block 1.3.1.1 */
|
|
// End offset: 0x0002BA38
|
|
// End Line: 3309
|
|
/* end block 1.3.1 */
|
|
// End offset: 0x0002BA38
|
|
// End Line: 3309
|
|
|
|
/* begin block 1.3.2 */
|
|
// Start line: 3266
|
|
// Start offset: 0x0002BA48
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s6
|
|
// struct CIV_ROUTE_ENTRY *currentNode; // $s3
|
|
|
|
/* begin block 1.3.2.1 */
|
|
// Start line: 3266
|
|
// Start offset: 0x0002BA48
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v1
|
|
/* end block 1.3.2.1 */
|
|
// End offset: 0x0002BA58
|
|
// End Line: 3266
|
|
/* end block 1.3.2 */
|
|
// End offset: 0x0002BA58
|
|
// End Line: 3266
|
|
|
|
/* begin block 1.3.3 */
|
|
// Start line: 3266
|
|
// Start offset: 0x0002BA68
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s6
|
|
// struct CIV_ROUTE_ENTRY *currentNode; // $s3
|
|
|
|
/* begin block 1.3.3.1 */
|
|
// Start line: 3266
|
|
// Start offset: 0x0002BA68
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $v1
|
|
/* end block 1.3.3.1 */
|
|
// End offset: 0x0002BA78
|
|
// End Line: 3266
|
|
/* end block 1.3.3 */
|
|
// End offset: 0x0002BA78
|
|
// End Line: 3266
|
|
/* end block 1.3 */
|
|
// End offset: 0x0002BA90
|
|
// End Line: 3317
|
|
/* end block 1 */
|
|
// End offset: 0x0002BAEC
|
|
// End Line: 3320
|
|
|
|
/* begin block 2 */
|
|
// Start line: 7478
|
|
/* end block 2 */
|
|
// End Line: 7479
|
|
|
|
/* begin block 3 */
|
|
// Start line: 7498
|
|
/* end block 3 */
|
|
// End Line: 7499
|
|
|
|
int CivFindStation(_CAR_DATA *cp)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
int iVar1;
|
|
int iVar2;
|
|
byte *pbVar3;
|
|
byte *pbVar4;
|
|
byte *pbVar5;
|
|
int iVar6;
|
|
byte *pbVar7;
|
|
int iVar8;
|
|
byte *pbVar9;
|
|
int iVar10;
|
|
int iVar11;
|
|
int iVar12;
|
|
|
|
iVar2 = (cp->hd).where.t[0];
|
|
iVar6 = *(int *)(cp->ai + 4) + -1;
|
|
iVar12 = (cp->hd).where.t[2];
|
|
pbVar3 = cp->ai + 0x24;
|
|
if (iVar6 != -1) {
|
|
pbVar9 = pbVar3;
|
|
do {
|
|
pbVar3 = pbVar9 + 0x10;
|
|
if (cp->ai + 0xf4 <= pbVar3) {
|
|
pbVar3 = pbVar9 + -0xc0;
|
|
}
|
|
iVar6 = iVar6 + -1;
|
|
pbVar9 = pbVar3;
|
|
} while (iVar6 != -1);
|
|
}
|
|
pbVar9 = cp->ai + 0xf4;
|
|
do {
|
|
pbVar7 = pbVar3 + 0x10;
|
|
if (pbVar9 <= pbVar7) {
|
|
pbVar7 = pbVar3 + -0xc0;
|
|
}
|
|
if (pbVar7 == (byte *)0x0) {
|
|
LAB_0002baac:
|
|
cp->ai[0xf9] = 3;
|
|
cp->ai[0xc] = 7;
|
|
return 0;
|
|
}
|
|
iVar11 = *(int *)(pbVar3 + 8);
|
|
iVar8 = *(int *)(pbVar7 + 8) - iVar11;
|
|
iVar10 = *(int *)(pbVar3 + 0xc);
|
|
iVar6 = *(int *)(pbVar7 + 0xc) - iVar10;
|
|
if (iVar8 * iVar8 + iVar6 * iVar6 < 0) goto LAB_0002baac;
|
|
iVar1 = SquareRoot0();
|
|
if (0 < iVar1) {
|
|
iVar6 = ((iVar2 - iVar11) * iVar8 + (iVar12 - iVar10) * iVar6) / iVar1;
|
|
if (iVar1 == 0) {
|
|
trap(7);
|
|
}
|
|
if (iVar6 < iVar1) {
|
|
*(byte **)(cp->ai + 0xf4) = pbVar3;
|
|
return iVar6;
|
|
}
|
|
}
|
|
iVar6 = *(int *)(cp->ai + 4) + 1;
|
|
*(int *)(cp->ai + 4) = iVar6;
|
|
pbVar4 = pbVar7 + 0x10;
|
|
if (0xc < iVar6) {
|
|
*(undefined4 *)(cp->ai + 4) = 0;
|
|
}
|
|
if (pbVar9 <= pbVar4) {
|
|
pbVar4 = pbVar7 + -0xc0;
|
|
}
|
|
pbVar5 = pbVar7 + 0x20;
|
|
pbVar3 = pbVar7;
|
|
if (*(short *)(pbVar4 + 2) == 0x7f) goto LAB_0002ba88;
|
|
if (pbVar9 <= pbVar5) {
|
|
pbVar5 = pbVar7 + -0xb0;
|
|
}
|
|
pbVar4 = pbVar7 + 0x30;
|
|
if (*(short *)(pbVar5 + 2) == 0x7f) goto LAB_0002ba88;
|
|
if (pbVar9 <= pbVar4) {
|
|
pbVar4 = pbVar7 + -0xa0;
|
|
}
|
|
if (*(short *)(pbVar4 + 2) == 0x7f) {
|
|
LAB_0002ba88:
|
|
CreateNewNode(cp);
|
|
}
|
|
} while (true);*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// int /*$ra*/ CivFindPointOnPath(struct _CAR_DATA *cp /*$s7*/, int station /*$s2*/, struct VECTOR *ppoint /*$fp*/)
|
|
// line 3337, offset 0x0002baec
|
|
/* begin block 1 */
|
|
// Start line: 3338
|
|
// Start offset: 0x0002BAEC
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *cprep; // $a0
|
|
// struct CIV_ROUTE_ENTRY *start; // stack offset -48
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 3346
|
|
// Start offset: 0x0002BB50
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s7
|
|
// struct CIV_ROUTE_ENTRY *currentNode; // $a0
|
|
|
|
/* begin block 1.1.1 */
|
|
// Start line: 3346
|
|
// Start offset: 0x0002BB50
|
|
// Variables:
|
|
// struct CIV_ROUTE_ENTRY *retNode; // $s0
|
|
/* end block 1.1.1 */
|
|
// End offset: 0x0002BB50
|
|
// End Line: 3346
|
|
/* end block 1.1 */
|
|
// End offset: 0x0002BB50
|
|
// End Line: 3346
|
|
|
|
/* begin block 1.2 */
|
|
// Start line: 3348
|
|
// Start offset: 0x0002BB50
|
|
// Variables:
|
|
// int sx; // $s4
|
|
// int sz; // $s5
|
|
// int dx; // $s1
|
|
// int dz; // $s3
|
|
// int stepsize; // $a2
|
|
/* end block 1.2 */
|
|
// End offset: 0x0002BC90
|
|
// End Line: 3381
|
|
/* end block 1 */
|
|
// End offset: 0x0002BCF4
|
|
// End Line: 3385
|
|
|
|
/* begin block 2 */
|
|
// Start line: 7686
|
|
/* end block 2 */
|
|
// End Line: 7687
|
|
|
|
/* begin block 3 */
|
|
// Start line: 7704
|
|
/* end block 3 */
|
|
// End Line: 7705
|
|
|
|
int CivFindPointOnPath(_CAR_DATA *cp, int station, VECTOR *ppoint)
|
|
{
|
|
UNIMPLEMENTED();
|
|
return 0;
|
|
/*
|
|
int iVar1;
|
|
byte *pbVar2;
|
|
byte *pbVar3;
|
|
byte *pbVar4;
|
|
int iVar5;
|
|
int iVar6;
|
|
int iVar7;
|
|
int iVar8;
|
|
|
|
pbVar2 = *(byte **)(cp->ai + 0xf4);
|
|
if (pbVar2 != (byte *)0x0) {
|
|
pbVar3 = pbVar2;
|
|
do {
|
|
pbVar4 = pbVar3 + 0x10;
|
|
if (cp->ai + 0xf4 <= pbVar4) {
|
|
pbVar4 = pbVar3 + -0xc0;
|
|
}
|
|
if (pbVar4 == (byte *)0x0) {
|
|
ppoint->vx = *(long *)(pbVar3 + 8);
|
|
ppoint->vz = *(long *)(pbVar3 + 0xc);
|
|
return 1;
|
|
}
|
|
iVar7 = *(int *)(pbVar3 + 8);
|
|
iVar5 = *(int *)(pbVar4 + 8) - iVar7;
|
|
iVar8 = *(int *)(pbVar3 + 0xc);
|
|
iVar6 = *(int *)(pbVar4 + 0xc) - iVar8;
|
|
iVar1 = SquareRoot0(iVar5 * iVar5 + iVar6 * iVar6);
|
|
if (station < iVar1) {
|
|
if (station < 0) {
|
|
station = 0;
|
|
}
|
|
if (iVar1 < 0x1000) {
|
|
if (iVar1 == 0) {
|
|
trap(7);
|
|
}
|
|
iVar6 = (iVar6 * station) / iVar1;
|
|
ppoint->vx = iVar7 + (iVar5 * station) / iVar1;
|
|
if (iVar1 == 0) {
|
|
trap(7);
|
|
}
|
|
}
|
|
else {
|
|
if (iVar1 < 0) {
|
|
iVar1 = iVar1 + 0xf;
|
|
}
|
|
iVar1 = iVar1 >> 4;
|
|
if (iVar1 == 0) {
|
|
trap(7);
|
|
}
|
|
if (iVar1 == 0) {
|
|
trap(7);
|
|
}
|
|
ppoint->vx = iVar7 + (((iVar5 * 0x100) / iVar1) * station + 0x800 >> 0xc);
|
|
iVar6 = ((iVar6 * 0x100) / iVar1) * station + 0x800 >> 0xc;
|
|
}
|
|
ppoint->vz = iVar8 + iVar6;
|
|
return 1;
|
|
}
|
|
station = station - iVar1;
|
|
pbVar3 = pbVar4;
|
|
} while (pbVar4 != pbVar2);
|
|
}
|
|
cp->ai[0xf9] = 3;
|
|
cp->ai[0xc] = 7;
|
|
return 0;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ CreateRoadblock()
|
|
// line 3398, offset 0x0002bcf4
|
|
/* begin block 1 */
|
|
// Start line: 3400
|
|
// Start offset: 0x0002BCF4
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $v1
|
|
// struct _CAR_DATA *lcp; // $s0
|
|
// struct _CAR_DATA *newCar; // $s0
|
|
// struct DRIVER2_STRAIGHT *str; // stack offset -72
|
|
// struct DRIVER2_CURVE *crv; // $s7
|
|
// int distAlongSegment; // $s2
|
|
// int lbody; // $s4
|
|
// int dir; // $s6
|
|
// int numLanes; // stack offset -68
|
|
// unsigned char externalCopModel; // stack offset -64
|
|
// int delta; // $s4
|
|
// int noMoreCars; // stack offset -60
|
|
// int newCarId; // $v1
|
|
|
|
/* begin block 1.1 */
|
|
// Start line: 3400
|
|
// Start offset: 0x0002BCF4
|
|
// Variables:
|
|
// int dir; // $s0
|
|
/* end block 1.1 */
|
|
// End offset: 0x0002C078
|
|
// End Line: 3437
|
|
|
|
/* begin block 1.2 */
|
|
// Start line: 3442
|
|
// Start offset: 0x0002C09C
|
|
// Variables:
|
|
// int theta; // $s0
|
|
/* end block 1.2 */
|
|
// End offset: 0x0002C198
|
|
// End Line: 3451
|
|
|
|
/* begin block 1.3 */
|
|
// Start line: 3455
|
|
// Start offset: 0x0002C1E0
|
|
// Variables:
|
|
// int minAngle; // $a3
|
|
// int curveLength; // $v1
|
|
/* end block 1.3 */
|
|
// End offset: 0x0002C334
|
|
// End Line: 3491
|
|
|
|
/* begin block 1.4 */
|
|
// Start line: 3478
|
|
// Start offset: 0x0002C3F8
|
|
|
|
/* begin block 1.4.1 */
|
|
// Start line: 3483
|
|
// Start offset: 0x0002C4C8
|
|
/* end block 1.4.1 */
|
|
// End offset: 0x0002C4E4
|
|
// End Line: 3485
|
|
|
|
/* begin block 1.4.2 */
|
|
// Start line: 3399
|
|
// Start offset: 0x0002C590
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
/* end block 1.4.2 */
|
|
// End offset: 0x0002C674
|
|
// End Line: 3399
|
|
|
|
/* begin block 1.4.3 */
|
|
// Start line: 3399
|
|
// Start offset: 0x0002C708
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
/* end block 1.4.3 */
|
|
// End offset: 0x0002C7E4
|
|
// End Line: 3399
|
|
/* end block 1.4 */
|
|
// End offset: 0x0002C7F4
|
|
// End Line: 3510
|
|
|
|
/* begin block 1.5 */
|
|
// Start line: 3515
|
|
// Start offset: 0x0002C830
|
|
// Variables:
|
|
// struct VECTOR startPos2; // stack offset -88
|
|
// int deltaAngle; // $a0
|
|
// int dir2NextRow; // $a1
|
|
// int faceDir; // $s1
|
|
// int numSpareCars; // $a0
|
|
// int count; // $s2
|
|
// int numSpots; // $fp
|
|
|
|
/* begin block 1.5.1 */
|
|
// Start line: 3527
|
|
// Start offset: 0x0002C948
|
|
// Variables:
|
|
// int numCarsToAdd; // $s5
|
|
|
|
/* begin block 1.5.1.1 */
|
|
// Start line: 3531
|
|
// Start offset: 0x0002C97C
|
|
|
|
/* begin block 1.5.1.1.1 */
|
|
// Start line: 3399
|
|
// Start offset: 0x0002CAC4
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
/* end block 1.5.1.1.1 */
|
|
// End offset: 0x0002CBA8
|
|
// End Line: 3399
|
|
|
|
/* begin block 1.5.1.1.2 */
|
|
// Start line: 3399
|
|
// Start offset: 0x0002CC3C
|
|
// Variables:
|
|
// struct _CAR_DATA *cp; // $s0
|
|
/* end block 1.5.1.1.2 */
|
|
// End offset: 0x0002CD18
|
|
// End Line: 3399
|
|
/* end block 1.5.1.1 */
|
|
// End offset: 0x0002CD28
|
|
// End Line: 3555
|
|
/* end block 1.5.1 */
|
|
// End offset: 0x0002CD34
|
|
// End Line: 3556
|
|
/* end block 1.5 */
|
|
// End offset: 0x0002CD34
|
|
// End Line: 3557
|
|
/* end block 1 */
|
|
// End offset: 0x0002CD74
|
|
// End Line: 3564
|
|
|
|
/* begin block 2 */
|
|
// Start line: 7892
|
|
/* end block 2 */
|
|
// End Line: 7893
|
|
|
|
/* begin block 3 */
|
|
// Start line: 7906
|
|
/* end block 3 */
|
|
// End Line: 7907
|
|
|
|
/* begin block 4 */
|
|
// Start line: 7907
|
|
/* end block 4 */
|
|
// End Line: 7908
|
|
|
|
/* begin block 5 */
|
|
// Start line: 7909
|
|
/* end block 5 */
|
|
// End Line: 7910
|
|
|
|
/* WARNING: Unknown calling convention yet parameter storage is locked */
|
|
|
|
void CreateRoadblock(void)
|
|
{
|
|
UNIMPLEMENTED();
|
|
/*
|
|
byte bVar1;
|
|
byte bVar2;
|
|
short sVar3;
|
|
bool bVar4;
|
|
char cVar5;
|
|
int laneNo;
|
|
undefined3 extraout_var;
|
|
long lVar6;
|
|
int x;
|
|
int z;
|
|
CAR_COSMETICS *pCVar7;
|
|
uint *puVar8;
|
|
uint uVar9;
|
|
int iVar10;
|
|
int x_00;
|
|
_CAR_DATA *mem;
|
|
uint uVar11;
|
|
uint distAlongPath;
|
|
int z_00;
|
|
int iVar12;
|
|
DRIVER2_CURVE *curve;
|
|
DRIVER2_STRAIGHT *local_48;
|
|
int local_44;
|
|
|
|
curve = (DRIVER2_CURVE *)0x0;
|
|
distAlongPath = 0xfffffffb;
|
|
laneNo = (int)player.playerCarId;
|
|
local_48 = (DRIVER2_STRAIGHT *)0x0;
|
|
bVar4 = false;
|
|
z_00 = (int)car_cosmetics[3].colBox.vz;
|
|
iVar10 = car_data[laneNo].hd.direction;
|
|
bVar1 = *(byte *)(MissionHeader->residentModels + 3);
|
|
baseLoc.vx = car_data[laneNo].hd.where.t[0];
|
|
angle = 0;
|
|
baseLoc.vz = car_data[laneNo].hd.where.t[2];
|
|
do {
|
|
if (requestCopCar == 0) {
|
|
laneNo = (int)rcossin_tbl[(iVar10 + angle & 0xfffU) * 2] << 3;
|
|
}
|
|
else {
|
|
laneNo = (int)rcossin_tbl[(iVar10 + angle & 0xfffU) * 2] * 10;
|
|
}
|
|
roadblockLoc.vx = baseLoc.vx + (laneNo + 0x800 >> 0xc) * 0x800;
|
|
if (requestCopCar == 0) {
|
|
laneNo = (int)rcossin_tbl[(iVar10 + angle & 0xfffU) * 2 + 1] << 3;
|
|
}
|
|
else {
|
|
laneNo = (int)rcossin_tbl[(iVar10 + angle & 0xfffU) * 2 + 1] * 10;
|
|
}
|
|
roadblockLoc.vz = baseLoc.vz + (laneNo + 0x800 >> 0xc) * 0x800;
|
|
roadSeg = RoadInCell(&roadblockLoc);
|
|
if (((((roadSeg & 0xffffe000U) == 0) && ((int)(roadSeg & 0x1fffU) < NumDriver2Straights)) ||
|
|
(((roadSeg & 0xffffe000U) == 0x4000 && ((int)(roadSeg & 0x1fffU) < NumDriver2Curves)))) &&
|
|
(-1 < roadSeg)) break;
|
|
if (requestCopCar == 0) {
|
|
laneNo = (int)rcossin_tbl[(iVar10 - angle & 0xfffU) * 2] << 3;
|
|
}
|
|
else {
|
|
laneNo = (int)rcossin_tbl[(iVar10 - angle & 0xfffU) * 2] * 10;
|
|
}
|
|
roadblockLoc.vx = baseLoc.vx + (laneNo + 0x800 >> 0xc) * 0x800;
|
|
if (requestCopCar == 0) {
|
|
laneNo = (int)rcossin_tbl[(iVar10 - angle & 0xfffU) * 2 + 1] << 3;
|
|
}
|
|
else {
|
|
laneNo = (int)rcossin_tbl[(iVar10 - angle & 0xfffU) * 2 + 1] * 10;
|
|
}
|
|
roadblockLoc.vz = baseLoc.vz + (laneNo + 0x800 >> 0xc) * 0x800;
|
|
roadSeg = RoadInCell(&roadblockLoc);
|
|
if (((((roadSeg & 0xffffe000U) == 0) && ((int)(roadSeg & 0x1fffU) < NumDriver2Straights)) ||
|
|
(((roadSeg & 0xffffe000U) == 0x4000 && ((int)(roadSeg & 0x1fffU) < NumDriver2Curves)))) &&
|
|
(-1 < roadSeg)) break;
|
|
if (requestCopCar == 0) {
|
|
angle = angle + 0x5d;
|
|
}
|
|
else {
|
|
angle = angle + 0x49;
|
|
}
|
|
} while (angle < 0x800);
|
|
if (((roadSeg & 0xffffe000U) != 0) || (NumDriver2Straights <= (int)(roadSeg & 0x1fffU))) {
|
|
if ((roadSeg & 0xffffe000U) != 0x4000) {
|
|
return;
|
|
}
|
|
if (NumDriver2Curves <= (int)(roadSeg & 0x1fffU)) {
|
|
return;
|
|
}
|
|
}
|
|
if (roadSeg < 0) {
|
|
return;
|
|
}
|
|
if (((roadSeg & 0xffffe000U) == 0) && ((int)(roadSeg & 0x1fffU) < NumDriver2Straights)) {
|
|
local_48 = Driver2StraightsPtr + roadSeg;
|
|
dx = roadblockLoc.vx - local_48->Midx;
|
|
dz = roadblockLoc.vz - local_48->Midz;
|
|
laneNo = ratan2(dx, dz);
|
|
sVar3 = local_48->angle;
|
|
iVar10 = SquareRoot0(dx * dx + dz * dz);
|
|
uVar9 = (uint)local_48->length;
|
|
uVar11 = z_00 * 3;
|
|
distAlongPath =
|
|
(uint)(local_48->length >> 1) +
|
|
(rcossin_tbl[(sVar3 - laneNo & 0xfffU) * 2 + 1] * iVar10 + 0x800 >> 0xc);
|
|
if ((int)uVar9 < z_00 * 6) {
|
|
return;
|
|
}
|
|
if ((int)distAlongPath < (int)uVar11) {
|
|
distAlongPath = uVar11;
|
|
}
|
|
if ((int)(uVar9 - distAlongPath) < (int)uVar11) {
|
|
distAlongPath = uVar9 + z_00 * -3;
|
|
}
|
|
bVar2 = local_48->NumLanes;
|
|
}
|
|
else {
|
|
if (((roadSeg & 0xffffe000U) != 0x4000) ||
|
|
((NumDriver2Curves <= (int)(roadSeg & 0x1fffU) || (roadSeg < 0)))) goto LAB_0002c33c;
|
|
curve = Driver2CurvesPtr + roadSeg + -0x4000;
|
|
if ((int)(((int)curve->end - (int)curve->start & 0xfffU) * (uint)(byte)curve->inside * 0xb) / 7
|
|
< z_00 * 6) {
|
|
return;
|
|
}
|
|
currentAngle = ratan2(roadblockLoc.vx - curve->Midx, roadblockLoc.vz - curve->Midz);
|
|
uVar11 = 0x80;
|
|
if ((9 < (byte)curve->inside) && (uVar11 = 0x20, (byte)curve->inside < 0x14)) {
|
|
uVar11 = 0x40;
|
|
}
|
|
uVar9 = (currentAngle & 0xfffU) - (int)curve->start;
|
|
distAlongPath = uVar9 & 0xf80;
|
|
if ((9 < (byte)curve->inside) && (distAlongPath = uVar9 & 0xfe0, (byte)curve->inside < 0x14)) {
|
|
distAlongPath = uVar9 & 0xfc0;
|
|
}
|
|
if (distAlongPath <= uVar11) {
|
|
distAlongPath = uVar11;
|
|
}
|
|
uVar11 = ((int)curve->end - (int)curve->start) - uVar11 & 0xfff;
|
|
if (uVar11 <= distAlongPath) {
|
|
distAlongPath = uVar11;
|
|
}
|
|
bVar2 = curve->NumLanes;
|
|
}
|
|
local_44 = ((uint)bVar2 & 0xf) << 1;
|
|
LAB_0002c33c:
|
|
GetNodePos(local_48, (DRIVER2_JUNCTION *)0x0, curve, distAlongPath, (_CAR_DATA *)0x0, (int *)&startPos,
|
|
&startPos.vz, 0);
|
|
laneNo = local_44 + -1;
|
|
GetNodePos(local_48, (DRIVER2_JUNCTION *)0x0, curve, distAlongPath, (_CAR_DATA *)0x0, (int *)&endPos,
|
|
&endPos.vz, laneNo);
|
|
iVar10 = 0x100;
|
|
distAlongPath = ratan2(endPos.vx - startPos.vx, endPos.vz - startPos.vz);
|
|
if (0x100 < laneNo * 0x200) {
|
|
do {
|
|
currentPos.vx =
|
|
startPos.vx + (iVar10 * rcossin_tbl[(distAlongPath & 0xfff) * 2] + 0x800 >> 0xc);
|
|
currentPos.vz =
|
|
startPos.vz + (iVar10 * rcossin_tbl[(distAlongPath & 0xfff) * 2 + 1] + 0x800 >> 0xc);
|
|
if (local_48 == (DRIVER2_STRAIGHT *)0x0) {
|
|
LAB_0002c49c:
|
|
if (curve != (DRIVER2_CURVE *)0x0) {
|
|
z_00 = iVar10;
|
|
if (iVar10 < 0) {
|
|
z_00 = iVar10 + 0x3ff;
|
|
}
|
|
if (((int)(uint)(byte)curve->AILanes >> (z_00 >> 10 & 0x1fU) & 1U) == 0)
|
|
goto LAB_0002c4cc;
|
|
}
|
|
LAB_0002c4e4:
|
|
lVar6 = Random2(0);
|
|
z_00 = iVar10;
|
|
if (iVar10 < 0) {
|
|
z_00 = iVar10 + 0x1ff;
|
|
}
|
|
z_00 = CreateStationaryCivCar
|
|
(distAlongPath + (lVar6 * 0x10001 >> (z_00 >> 9 & 0x1fU) & 0x3ffU) + -0x200
|
|
, 0, 0, (long(*)[4])¤tPos, (uint)bVar1, 0, 2);
|
|
if (z_00 == -1) {
|
|
bVar4 = true;
|
|
break;
|
|
}
|
|
pCVar7 = car_data[z_00].ap.carCos;
|
|
x = QuickBuildingCollisionCheck
|
|
((VECTOR *)car_data[z_00].hd.where.t, car_data[z_00].hd.direction,
|
|
(int)(pCVar7->colBox).vz, (int)(pCVar7->colBox).vx, 0x14);
|
|
if (x != 0) {
|
|
testNumPingedOut = testNumPingedOut + 1;
|
|
if (car_data[z_00].controlType == '\x02') {
|
|
if ((car_data[z_00].controlFlags & 1) != 0) {
|
|
numCopCars = numCopCars + -1;
|
|
}
|
|
numCivCars = numCivCars + -1;
|
|
if ((car_data[z_00].ai[0xf9] == 3) && (car_data[z_00].ai[0xc] == 5)) {
|
|
numParkedCars = numParkedCars + -1;
|
|
}
|
|
}
|
|
else {
|
|
if ((PingOutCivsOnly != '\0') &&
|
|
(x = valid_region(car_data[z_00].hd.where.t[0], car_data[z_00].hd.where.t[2]), x != 0)
|
|
) goto LAB_0002c678;
|
|
}
|
|
puVar8 = (uint *)car_data[z_00].inform;
|
|
if (puVar8 != (uint *)0x0) {
|
|
*puVar8 = *puVar8 ^ 0x40000000;
|
|
}
|
|
ClearMem((char *)(car_data + z_00), 0x29c);
|
|
car_data[z_00].controlType = '\0';
|
|
}
|
|
LAB_0002c678:
|
|
mem = car_data + 0x13;
|
|
do {
|
|
if ((mem->controlType != '\0') && ((*(uint *)&mem->hndType & 0x2ff00) != 0x20200)) {
|
|
x = (mem->hd).where.t[0];
|
|
dx = x - currentPos.vx;
|
|
z_00 = (mem->hd).where.t[2];
|
|
dz = z_00 - currentPos.vz;
|
|
if (dx * dx + dz * dz < 360000) {
|
|
testNumPingedOut = testNumPingedOut + 1;
|
|
if (mem->controlType == '\x02') {
|
|
if ((mem->controlFlags & 1) != 0) {
|
|
numCopCars = numCopCars + -1;
|
|
}
|
|
numCivCars = numCivCars + -1;
|
|
if ((mem->ai[0xf9] == 3) && (mem->ai[0xc] == 5)) {
|
|
numParkedCars = numParkedCars + -1;
|
|
}
|
|
}
|
|
else {
|
|
if ((PingOutCivsOnly != '\0') && (z_00 = valid_region(x, z_00), z_00 != 0))
|
|
goto LAB_0002c7e4;
|
|
}
|
|
puVar8 = (uint *)mem->inform;
|
|
if (puVar8 != (uint *)0x0) {
|
|
*puVar8 = *puVar8 ^ 0x40000000;
|
|
}
|
|
ClearMem((char *)mem, 0x29c);
|
|
mem->controlType = '\0';
|
|
}
|
|
}
|
|
LAB_0002c7e4:
|
|
mem = mem + -1;
|
|
} while ((_CAR_DATA *)((int)&cheats.MagicMirror + 3U) < mem);
|
|
}
|
|
else {
|
|
z_00 = iVar10;
|
|
if (iVar10 < 0) {
|
|
z_00 = iVar10 + 0x3ff;
|
|
}
|
|
if (((int)(uint)(byte)local_48->AILanes >> (z_00 >> 10 & 0x1fU) & 1U) != 0)
|
|
goto LAB_0002c49c;
|
|
LAB_0002c4cc:
|
|
cVar5 = CellEmpty(¤tPos, (int)car_cosmetics[3].colBox.vz);
|
|
if (CONCAT31(extraout_var, cVar5) != 0) goto LAB_0002c4e4;
|
|
}
|
|
iVar10 = iVar10 + 0x400;
|
|
} while (iVar10 < laneNo * 0x200);
|
|
}
|
|
if ((!bVar4) && (gCopDifficultyLevel != 0)) {
|
|
laneNo = ratan2(baseLoc.vx - startPos.vx, baseLoc.vz - startPos.vz);
|
|
iVar10 = 0x400;
|
|
if ((((laneNo - distAlongPath) + 0x800 & 0xfff) - 0x800 & 0xfff) < 0x800) {
|
|
iVar10 = -0x400;
|
|
}
|
|
uVar11 = distAlongPath;
|
|
if (gCopDifficultyLevel == 1) {
|
|
uVar11 = distAlongPath - iVar10;
|
|
}
|
|
uVar9 = distAlongPath + iVar10 & 0xfff;
|
|
laneNo = startPos.vx + ((int)rcossin_tbl[uVar9 * 2] * 0x5dc + 0x800 >> 0xc);
|
|
iVar10 = startPos.vz + ((int)rcossin_tbl[uVar9 * 2 + 1] * 0x5dc + 0x800 >> 0xc);
|
|
z_00 = (maxCivCars - numCivCars) + 2;
|
|
x = local_44 / 2 + -1;
|
|
if (0 < z_00) {
|
|
iVar12 = x;
|
|
if (z_00 < x) {
|
|
iVar12 = z_00;
|
|
}
|
|
z_00 = 0;
|
|
if (0 < iVar12) {
|
|
z = 0;
|
|
do {
|
|
if (iVar12 << 1 == 0) {
|
|
trap(7);
|
|
}
|
|
x_00 = ((x * (z + 1)) / (iVar12 << 1)) * 0x400;
|
|
z = x_00 + 0x300;
|
|
currentPos.vx = laneNo + (z * rcossin_tbl[(distAlongPath & 0xfff) * 2] + 0x800 >> 0xc);
|
|
currentPos.vz = iVar10 + (z * rcossin_tbl[(distAlongPath & 0xfff) * 2 + 1] + 0x800 >> 0xc)
|
|
;
|
|
test42 = z;
|
|
lVar6 = Random2(0);
|
|
if (z < 0) {
|
|
z = x_00 + 0x4ff;
|
|
}
|
|
z = CreateStationaryCivCar
|
|
(uVar11 + (lVar6 * 0x10001 >> (z >> 9 & 0x1fU) & 0x3ffU) + -0x200, 0, 0,
|
|
(long(*)[4])¤tPos, (uint)bVar1, 0, 2);
|
|
if (z == -1) break;
|
|
pCVar7 = car_data[z].ap.carCos;
|
|
x_00 = QuickBuildingCollisionCheck
|
|
((VECTOR *)car_data[z].hd.where.t, car_data[z].hd.direction,
|
|
(int)(pCVar7->colBox).vz, (int)(pCVar7->colBox).vx, 0x14);
|
|
if (x_00 != 0) {
|
|
testNumPingedOut = testNumPingedOut + 1;
|
|
if (car_data[z].controlType == '\x02') {
|
|
if ((car_data[z].controlFlags & 1) != 0) {
|
|
numCopCars = numCopCars + -1;
|
|
}
|
|
numCivCars = numCivCars + -1;
|
|
if ((car_data[z].ai[0xf9] == 3) && (car_data[z].ai[0xc] == 5)) {
|
|
numParkedCars = numParkedCars + -1;
|
|
}
|
|
}
|
|
else {
|
|
if ((PingOutCivsOnly != '\0') &&
|
|
(x_00 = valid_region(car_data[z].hd.where.t[0], car_data[z].hd.where.t[2]),
|
|
x_00 != 0)) goto LAB_0002cbac;
|
|
}
|
|
puVar8 = (uint *)car_data[z].inform;
|
|
if (puVar8 != (uint *)0x0) {
|
|
*puVar8 = *puVar8 ^ 0x40000000;
|
|
}
|
|
ClearMem((char *)(car_data + z), 0x29c);
|
|
car_data[z].controlType = '\0';
|
|
}
|
|
LAB_0002cbac:
|
|
mem = car_data + 0x13;
|
|
z_00 = z_00 + 1;
|
|
do {
|
|
if ((mem->controlType != '\0') && ((*(uint *)&mem->hndType & 0x2ff00) != 0x20200)) {
|
|
x_00 = (mem->hd).where.t[0];
|
|
dx = x_00 - currentPos.vx;
|
|
z = (mem->hd).where.t[2];
|
|
dz = z - currentPos.vz;
|
|
if (dx * dx + dz * dz < 360000) {
|
|
testNumPingedOut = testNumPingedOut + 1;
|
|
if (mem->controlType == '\x02') {
|
|
if ((mem->controlFlags & 1) != 0) {
|
|
numCopCars = numCopCars + -1;
|
|
}
|
|
numCivCars = numCivCars + -1;
|
|
if ((mem->ai[0xf9] == 3) && (mem->ai[0xc] == 5)) {
|
|
numParkedCars = numParkedCars + -1;
|
|
}
|
|
}
|
|
else {
|
|
if ((PingOutCivsOnly != '\0') && (z = valid_region(x_00, z), z != 0))
|
|
goto LAB_0002cd18;
|
|
}
|
|
puVar8 = (uint *)mem->inform;
|
|
if (puVar8 != (uint *)0x0) {
|
|
*puVar8 = *puVar8 ^ 0x40000000;
|
|
}
|
|
ClearMem((char *)mem, 0x29c);
|
|
mem->controlType = '\0';
|
|
}
|
|
}
|
|
LAB_0002cd18:
|
|
mem = mem + -1;
|
|
} while ((_CAR_DATA *)((int)&cheats.MagicMirror + 3U) < mem);
|
|
z = z_00 * 2;
|
|
} while (z_00 < iVar12);
|
|
}
|
|
}
|
|
}
|
|
requestRoadblock = 0;
|
|
distAlongPath = Random2(0);
|
|
roadblockDelay = (&roadblockDelayDiff)[gCopDifficultyLevel] + (distAlongPath & 0xff);
|
|
roadblockCount = roadblockDelay;
|
|
PlaceRoadBlockCops();
|
|
return;
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
|
|
|