mirror of
https://github.com/OpenDriver2/REDRIVER2.git
synced 2024-11-25 11:52:32 +01:00
504 lines
12 KiB
C
504 lines
12 KiB
C
#include "THISDUST.H"
|
|
#include "PLAYERS.H"
|
|
|
|
#include "SYSTEM.H"
|
|
#include "MISSION.H"
|
|
#include "CIV_AI.H"
|
|
#include "COP_AI.H"
|
|
#include "PEDEST.H"
|
|
#include "CUTSCENE.H"
|
|
#include "CARS.H"
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ InitPlayer(struct _PLAYER *locPlayer /*$s1*/, struct _CAR_DATA *cp /*$s2*/, char carCtrlType /*$s3*/, int direction /*$s6*/, long (*startPos)[4] /*stack 16*/, int externModel /*stack 20*/, int palette /*stack 24*/, char *padid /*stack 28*/)
|
|
// line 75, offset 0x000739d8
|
|
/* begin block 1 */
|
|
// Start line: 76
|
|
// Start offset: 0x000739D8
|
|
/* end block 1 */
|
|
// End offset: 0x00073C0C
|
|
// End Line: 127
|
|
|
|
/* begin block 2 */
|
|
// Start line: 454
|
|
/* end block 2 */
|
|
// End Line: 455
|
|
|
|
/* begin block 3 */
|
|
// Start line: 150
|
|
/* end block 3 */
|
|
// End Line: 151
|
|
|
|
PEDESTRIAN *pPlayerPed = NULL;
|
|
|
|
// [D]
|
|
void InitPlayer(_PLAYER *locPlayer, _CAR_DATA *cp, char carCtrlType, int direction, long(*startPos)[4], int externModel, int palette, char *padid)
|
|
{
|
|
char cVar1;
|
|
PEDESTRIAN *pPVar2;
|
|
int model;
|
|
long lVar3;
|
|
uint playerType;
|
|
|
|
playerType = externModel & 0xff;
|
|
ClearMem((char *)locPlayer, 0x74);
|
|
if ((gStartOnFoot == 0) || (carCtrlType == '\x04')) {
|
|
if (MissionHeader->residentModels[0] == playerType) {
|
|
model = 0;
|
|
}
|
|
else {
|
|
if (MissionHeader->residentModels[1] == playerType) {
|
|
model = 1;
|
|
}
|
|
else {
|
|
if (MissionHeader->residentModels[2] == playerType) {
|
|
model = 2;
|
|
}
|
|
else {
|
|
if (MissionHeader->residentModels[3] == playerType) {
|
|
model = 3;
|
|
}
|
|
else {
|
|
model = 0xff;
|
|
if (MissionHeader->residentModels[4] == playerType) {
|
|
model = 4;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
InitCar(cp, direction, startPos, carCtrlType, model, palette & 0xff, &locPlayer->padid);
|
|
cp->controlFlags = cp->controlFlags | 4;
|
|
locPlayer->worldCentreCarId = cp->id;
|
|
locPlayer->cameraView = (NumPlayers == 2) << 1;
|
|
locPlayer->playerCarId = cp->id;
|
|
cVar1 = cp->id;
|
|
locPlayer->playerType = '\x01';
|
|
locPlayer->spoolXZ = (VECTOR *)(cp->hd).where.t;
|
|
locPlayer->cameraCarId = cVar1;
|
|
lVar3 = (cp->hd).where.t[1];
|
|
locPlayer->car_is_sounding = '\0';
|
|
locPlayer->pos[1] = lVar3;
|
|
}
|
|
else {
|
|
ActivatePlayerPedestrian(NULL, padid, direction, startPos, playerType);
|
|
locPlayer->playerType = '\x02';
|
|
pPVar2 = pPlayerPed;
|
|
locPlayer->spoolXZ = (VECTOR *)&pPlayerPed->position;
|
|
model = (pPVar2->position).vy;
|
|
locPlayer->playerCarId = -1;
|
|
locPlayer->car_is_sounding = '\x02';
|
|
locPlayer->cameraView = '\0';
|
|
locPlayer->pos[1] = -model;
|
|
}
|
|
locPlayer->pos[0] = (*startPos)[0];
|
|
lVar3 = (*startPos)[2];
|
|
locPlayer->cameraAngle = 0x800;
|
|
locPlayer->headPos = 0;
|
|
locPlayer->headTarget = 0;
|
|
locPlayer->headTimer = '\0';
|
|
locPlayer->pos[2] = lVar3;
|
|
cVar1 = *padid;
|
|
locPlayer->targetCarId = -1;
|
|
locPlayer->car_sound_timer = -1;
|
|
(locPlayer->wheelnoise).chan = -1;
|
|
(locPlayer->wheelnoise).sound = -1;
|
|
(locPlayer->skidding).chan = -1;
|
|
(locPlayer->skidding).sound = -1;
|
|
locPlayer->padid = cVar1;
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ ChangeCarPlayerToPed(int playerID /*$s0*/)
|
|
// line 130, offset 0x00073334
|
|
/* begin block 1 */
|
|
// Start line: 131
|
|
// Start offset: 0x00073334
|
|
// Variables:
|
|
// struct _CAR_DATA *lcp; // $s2
|
|
/* end block 1 */
|
|
// End offset: 0x0007350C
|
|
// End Line: 181
|
|
|
|
/* begin block 2 */
|
|
// Start line: 260
|
|
/* end block 2 */
|
|
// End Line: 261
|
|
|
|
void ChangeCarPlayerToPed(int playerID)
|
|
{
|
|
UNIMPLEMENTED();
|
|
/*
|
|
char cVar1;
|
|
PEDESTRIAN *pPVar2;
|
|
int channel;
|
|
int iVar3;
|
|
|
|
iVar3 = (int)(&player)[playerID].playerCarId;
|
|
my_sly_var = playerID;
|
|
(&player)[playerID].headTimer = '\0';
|
|
(&player)[playerID].cameraView = '\0';
|
|
channel = 0x1000;
|
|
if (NoPlayerControl == 0) {
|
|
channel = car_data[iVar3].hd.direction + 0x600;
|
|
}
|
|
(&player)[playerID].cameraAngle = channel;
|
|
(&player)[playerID].headTimer = '\0';
|
|
(&player)[playerID].playerType = '\x02';
|
|
channel = gInGameCutsceneActive;
|
|
(&player)[playerID].headPos = 0;
|
|
(&player)[playerID].headTarget = 0;
|
|
(&player)[playerID].playerCarId = -1;
|
|
(&player)[playerID].cameraCarId = -1;
|
|
(&player)[playerID].targetCarId = -1;
|
|
pPVar2 = pPlayerPed;
|
|
if ((channel == 0) && (gInGameChaseActive == 0)) {
|
|
(&player)[playerID].worldCentreCarId = -1;
|
|
(&player)[playerID].spoolXZ = (VECTOR *)&pPVar2->position;
|
|
}
|
|
channel = 1;
|
|
car_data[iVar3].controlType = '\x02';
|
|
car_data[iVar3].wheel_angle = 0;
|
|
car_data[iVar3].ai[0xf9] = 3;
|
|
car_data[iVar3].ai[0xc] = 7;
|
|
if (playerID != 0) {
|
|
channel = 4;
|
|
}
|
|
StopChannel(channel);
|
|
cVar1 = (&player)[playerID].skidding.chan;
|
|
(&player)[playerID].skidding.sound = -1;
|
|
StopChannel((int)cVar1);
|
|
UnlockChannel((int)(&player)[playerID].skidding.chan);
|
|
cVar1 = (&player)[playerID].wheelnoise.chan;
|
|
(&player)[playerID].wheelnoise.sound = -1;
|
|
StopChannel((int)cVar1);
|
|
UnlockChannel((int)(&player)[playerID].wheelnoise.chan);
|
|
Start3DSoundVolPitch
|
|
(-1, 6, 3, car_data[iVar3].hd.where.t[0], car_data[iVar3].hd.where.t[1],
|
|
car_data[iVar3].hd.where.t[2], 0, 0x1000);
|
|
first_offence = '\x01';
|
|
channel = CarHasSiren((uint)(byte)car_data[iVar3].ap.model);
|
|
if (channel != 0) {
|
|
(&player)[playerID].horn.on = '\0';
|
|
}
|
|
return;*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ ChangePedPlayerToCar(int playerID /*$s4*/, struct _CAR_DATA *newCar /*$s2*/)
|
|
// line 184, offset 0x0007350c
|
|
/* begin block 1 */
|
|
// Start line: 185
|
|
// Start offset: 0x0007350C
|
|
// Variables:
|
|
// struct _PLAYER *lPlayer; // $s1
|
|
// int siren; // $s5
|
|
// long *pos; // $s3
|
|
// int carParked; // $s6
|
|
/* end block 1 */
|
|
// End offset: 0x00073898
|
|
// End Line: 244
|
|
|
|
/* begin block 2 */
|
|
// Start line: 400
|
|
/* end block 2 */
|
|
// End Line: 401
|
|
|
|
/* begin block 3 */
|
|
// Start line: 404
|
|
/* end block 3 */
|
|
// End Line: 405
|
|
|
|
/* begin block 4 */
|
|
// Start line: 408
|
|
/* end block 4 */
|
|
// End Line: 409
|
|
|
|
void ChangePedPlayerToCar(int playerID, _CAR_DATA *newCar)
|
|
{
|
|
UNIMPLEMENTED();
|
|
/*
|
|
bool bVar1;
|
|
char cVar2;
|
|
byte bVar3;
|
|
bool bVar4;
|
|
uint uVar5;
|
|
int channel;
|
|
uint uVar6;
|
|
int channel_00;
|
|
long *plVar7;
|
|
|
|
bVar4 = false;
|
|
uVar5 = CarHasSiren((uint)(byte)(newCar->ap).model);
|
|
plVar7 = (newCar->hd).where.t;
|
|
if ((((newCar->controlType != '\x02') && (newCar->controlType != '\a')) || (newCar->ai[0xf9] != 3)
|
|
) || ((newCar->ai[0xc] != 7 && (newCar->ai[0xc] != 5)))) {
|
|
bVar4 = true;
|
|
}
|
|
(&player)[playerID].playerType = '\x01';
|
|
(&player)[playerID].playerCarId = newCar->id;
|
|
bVar1 = gInGameCutsceneActive == 0;
|
|
(&player)[playerID].cameraCarId = newCar->id;
|
|
if ((bVar1) && (gInGameChaseActive == 0)) {
|
|
cVar2 = newCar->id;
|
|
(&player)[playerID].spoolXZ = (VECTOR *)(newCar->hd).where.t;
|
|
(&player)[playerID].worldCentreCarId = cVar2;
|
|
}
|
|
bVar3 = NoPlayerControl;
|
|
(&player)[playerID].cameraView = (char)lastCarCameraView;
|
|
channel = 0x1000;
|
|
if (bVar3 == 0) {
|
|
channel = (newCar->hd).direction + 0x600;
|
|
}
|
|
(&player)[playerID].cameraAngle = channel;
|
|
(&player)[playerID].headPos = 0;
|
|
(&player)[playerID].headTarget = 0;
|
|
(&player)[playerID].headTimer = '\0';
|
|
(&player)[playerID].padid = '\0';
|
|
(&player)[playerID].pPed = (PEDESTRIAN *)0x0;
|
|
if (playerID * 0x74 == 0) {
|
|
newCar->controlType = '\x01';
|
|
*(undefined4 *)newCar->ai = 0xd9772;
|
|
newCar->hndType = '\0';
|
|
if ((gCurrentMissionNumber != 0x20) &&
|
|
(MissionHeader->residentModels[(byte)(newCar->ap).model] == 0)) {
|
|
NoteFelony(&felonyData, '\v', 0x1000);
|
|
}
|
|
}
|
|
if ((gCurrentMissionNumber == 0x21) && ((newCar->ap).model == '\x04')) {
|
|
makeLimoPullOver = '\0';
|
|
}
|
|
Start3DSoundVolPitch(-1, 6, 3, *plVar7, (newCar->hd).where.t[1], (newCar->hd).where.t[2], 0, 0x1000);
|
|
bVar3 = (newCar->ap).model;
|
|
if (bVar3 == 4) {
|
|
uVar6 = ResidentModelsBodge();
|
|
}
|
|
else {
|
|
if (bVar3 < 3) {
|
|
uVar6 = (uint)(byte)(newCar->ap).model;
|
|
}
|
|
else {
|
|
uVar6 = (uint)(byte)(newCar->ap).model - 1;
|
|
}
|
|
}
|
|
channel = 1;
|
|
if (playerID != 0) {
|
|
channel = 4;
|
|
}
|
|
Start3DSoundVolPitch
|
|
(channel, 3, uVar6 * 3 + 1, *plVar7, (newCar->hd).where.t[1], (newCar->hd).where.t[2], -10000,
|
|
0x1000);
|
|
bVar3 = (newCar->ap).model;
|
|
if (bVar3 == 4) {
|
|
channel_00 = ResidentModelsBodge();
|
|
channel = channel_00 << 1;
|
|
}
|
|
else {
|
|
if (bVar3 < 3) {
|
|
channel = (uint)(byte)(newCar->ap).model * 3;
|
|
goto LAB_000737d4;
|
|
}
|
|
channel_00 = (uint)(byte)(newCar->ap).model - 1;
|
|
channel = channel_00 * 2;
|
|
}
|
|
channel = channel + channel_00;
|
|
LAB_000737d4:
|
|
channel_00 = 0;
|
|
if (playerID != 0) {
|
|
channel_00 = 3;
|
|
}
|
|
Start3DSoundVolPitch
|
|
(channel_00, 3, channel, *plVar7, (newCar->hd).where.t[1], (newCar->hd).where.t[2], -10000,
|
|
0x1000);
|
|
if (uVar5 != 0) {
|
|
channel = 2;
|
|
if (playerID != 0) {
|
|
channel = 5;
|
|
}
|
|
Start3DSoundVolPitch
|
|
(channel, (uVar5 & 0xff00) >> 8, uVar5 & 0xff, *plVar7, (newCar->hd).where.t[1],
|
|
(newCar->hd).where.t[2], -10000, 0x81);
|
|
}
|
|
if (bVar4) {
|
|
HaveCarSoundStraightAway((char)playerID);
|
|
}
|
|
else {
|
|
RequestSlightPauseBeforeCarSoundStarts((char)playerID);
|
|
}
|
|
return;
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ UpdatePlayers()
|
|
// line 247, offset 0x00073898
|
|
/* begin block 1 */
|
|
// Start line: 249
|
|
// Start offset: 0x00073898
|
|
// Variables:
|
|
// struct _PLAYER *locPlayer; // $t0
|
|
// struct _CAR_DATA *cp; // $v1
|
|
/* end block 1 */
|
|
// End offset: 0x000739D8
|
|
// End Line: 286
|
|
|
|
/* begin block 2 */
|
|
// Start line: 550
|
|
/* end block 2 */
|
|
// End Line: 551
|
|
|
|
/* begin block 3 */
|
|
// Start line: 554
|
|
/* end block 3 */
|
|
// End Line: 555
|
|
|
|
/* begin block 4 */
|
|
// Start line: 555
|
|
/* end block 4 */
|
|
// End Line: 556
|
|
|
|
/* begin block 5 */
|
|
// Start line: 561
|
|
/* end block 5 */
|
|
// End Line: 562
|
|
|
|
/* WARNING: Unknown calling convention yet parameter storage is locked */
|
|
|
|
// [D]
|
|
void UpdatePlayers(void)
|
|
{
|
|
int iVar1;
|
|
long lVar2;
|
|
PEDESTRIAN *pPVar3;
|
|
long lVar4;
|
|
long lVar5;
|
|
_PLAYER *locPlayer;
|
|
|
|
pedestrianFelony = 0;
|
|
|
|
if ((gInGameCutsceneActive == 0) && (player[0].playerType = '\x01', player[0].pPed != NULL))
|
|
{
|
|
player[0].playerType = '\x02';
|
|
}
|
|
|
|
locPlayer = player;
|
|
|
|
// [A] cycle might be wrong
|
|
if (true)
|
|
{
|
|
do {
|
|
if (locPlayer->playerType == '\x01')
|
|
{
|
|
iVar1 = (int)locPlayer->playerCarId;
|
|
lVar2 = car_data[iVar1].hd.where.t[0];
|
|
lVar4 = car_data[iVar1].hd.where.t[1];
|
|
lVar5 = car_data[iVar1].hd.where.t[2];
|
|
iVar1 = car_data[iVar1].hd.direction;
|
|
locPlayer->spoolXZ = (VECTOR *)car_data[locPlayer->worldCentreCarId].hd.where.t;
|
|
locPlayer->pos[0] = lVar2;
|
|
locPlayer->pos[1] = lVar4;
|
|
locPlayer->pos[2] = lVar5;
|
|
locPlayer->dir = iVar1;
|
|
}
|
|
else if (locPlayer->playerType == '\x02')
|
|
{
|
|
pPVar3 = locPlayer->pPed;
|
|
locPlayer->pos[0] = (pPVar3->position).vx;
|
|
locPlayer->pos[1] = -(pPVar3->position).vy;
|
|
locPlayer->pos[2] = (pPVar3->position).vz;
|
|
locPlayer->dir = (int)(pPVar3->dir).vy + -0x800;
|
|
}
|
|
|
|
locPlayer++;
|
|
} while (locPlayer <= &player[7]);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ RequestSlightPauseBeforeCarSoundStarts(char player_id /*$a0*/)
|
|
// line 298, offset 0x00073c0c
|
|
/* begin block 1 */
|
|
// Start line: 771
|
|
/* end block 1 */
|
|
// End Line: 772
|
|
|
|
/* begin block 2 */
|
|
// Start line: 943
|
|
/* end block 2 */
|
|
// End Line: 944
|
|
|
|
void RequestSlightPauseBeforeCarSoundStarts(char player_id)
|
|
{
|
|
UNIMPLEMENTED();
|
|
/*
|
|
uint uVar1;
|
|
|
|
uVar1 = (uint)(byte)player_id;
|
|
(&player)[uVar1].car_is_sounding = '\x02';
|
|
(&player)[uVar1].car_sound_timer = 10;
|
|
(&player)[uVar1].idlevol = -10000;
|
|
(&player)[uVar1].revsvol = -10000;
|
|
return;
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ HaveCarSoundStraightAway(char player_id /*$a0*/)
|
|
// line 305, offset 0x00073c54
|
|
/* begin block 1 */
|
|
// Start line: 960
|
|
/* end block 1 */
|
|
// End Line: 961
|
|
|
|
void HaveCarSoundStraightAway(char player_id)
|
|
{
|
|
UNIMPLEMENTED();
|
|
/*
|
|
(&player)[(byte)player_id].car_is_sounding = '\0';
|
|
(&player)[(byte)player_id].car_sound_timer = -1;
|
|
return;
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
// decompiled code
|
|
// original method signature:
|
|
// void /*$ra*/ MakeTheCarShutUp(char player_id /*$a0*/)
|
|
// line 310, offset 0x00073c8c
|
|
/* begin block 1 */
|
|
// Start line: 971
|
|
/* end block 1 */
|
|
// End Line: 972
|
|
|
|
void MakeTheCarShutUp(char player_id)
|
|
{
|
|
UNIMPLEMENTED();
|
|
/*
|
|
(&player)[(byte)player_id].car_is_sounding = '\x01';
|
|
(&player)[(byte)player_id].car_sound_timer = -1;
|
|
return;
|
|
*/
|
|
}
|
|
|
|
|
|
|
|
|
|
|