1
0
Fork 0
mirror of https://git.rip/DMCA_FUCKER/re3.git synced 2024-12-23 10:00:01 +00:00

some work on vehicles

This commit is contained in:
aap 2019-07-06 19:44:00 +02:00
parent 2b592605ab
commit 00461224a9
9 changed files with 243 additions and 227 deletions

View file

@ -45,15 +45,6 @@ enum eLights
VEHLIGHT_REAR_RIGHT, VEHLIGHT_REAR_RIGHT,
}; };
enum {
VEHDOOR_BONNET = 0,
VEHDOOR_BOOT,
VEHDOOR_FRONT_LEFT,
VEHDOOR_FRONT_RIGHT,
VEHDOOR_REAR_LEFT,
VEHDOOR_REAR_RIGHT
};
enum { enum {
VEHPANEL_FRONT_LEFT, VEHPANEL_FRONT_LEFT,
VEHPANEL_FRONT_RIGHT, VEHPANEL_FRONT_RIGHT,

View file

@ -1,17 +0,0 @@
#pragma once
#include "common.h"
struct CDoor
{
float m_fAngleWhenOpened;
float m_fAngleWhenClosed;
char field_8;
char field_9;
char field_10;
char field_11;
float m_fAngle;
float m_fPreviousAngle;
float m_fAngularVelocity;
CVector m_vecVelocity;
};

View file

@ -1,3 +1,6 @@
#include "common.h"
#include "patcher.h"
#include "AudioManager.h" #include "AudioManager.h"
#include "DMAudio.h" #include "DMAudio.h"
@ -10,10 +13,80 @@
#include "Vehicle.h" #include "Vehicle.h"
#include "World.h" #include "World.h"
#include "common.h" // TODO: where is this used? Is this the right file?
#include "patcher.h" enum eVehicleModel
{
#include <cmath> LANDSTAL,
IDAHO,
STINGER,
LINERUN,
PEREN,
SENTINEL,
PATRIOT,
FIRETRUK,
TRASH,
STRETCH,
MANANA,
INFERNUS,
BLISTA,
PONY,
MULE,
CHEETAH,
AMBULAN,
FBICAR,
MOONBEAM,
ESPERANT,
TAXI,
KURUMA,
BOBCAT,
MRWHOOP,
BFINJECT,
CORPSE,
POLICE,
ENFORCER,
SECURICA,
BANSHEE,
PREDATOR,
BUS,
RHINO,
BARRACKS,
TRAIN,
CHOPPER,
DODO,
COACH,
CABBIE,
STALLION,
RUMPO,
RCBANDIT,
BELLYUP,
MRWONGS,
MAFIA,
YARDIE,
YAKUZA,
DIABLOS,
COLUMB,
HOODS,
AIRTRAIN,
DEADDODO,
SPEEDER,
REEFER,
PANLANT,
FLATBED,
YANKEE,
ESCAPE,
BORGNINE,
TOYZ,
GHOST,
CAR151,
CAR152,
CAR153,
CAR154,
CAR155,
CAR156,
CAR157,
CAR158,
CAR159,
};
cAudioManager &AudioManager = *(cAudioManager *)0x880FC0; cAudioManager &AudioManager = *(cAudioManager *)0x880FC0;
@ -132,7 +205,7 @@ void
cAudioManager::CalculateDistance(bool *ptr, float dist) cAudioManager::CalculateDistance(bool *ptr, float dist)
{ {
if(*ptr == false) { if(*ptr == false) {
m_sQueueSample.m_fDistance = std::sqrt(dist); m_sQueueSample.m_fDistance = sqrt(dist);
*ptr = true; *ptr = true;
} }
} }
@ -267,14 +340,14 @@ cAudioManager::ClearRequestedQueue()
bool bool
cAudioManager::UsesReverseWarning(int32 model) cAudioManager::UsesReverseWarning(int32 model)
{ {
return model == LINERUN || std::abs(model - FIRETRUK) <= 1 || model == BUS || return model == LINERUN || fabs(model - FIRETRUK) <= 1 || model == BUS ||
model == COACH; // fix model == COACH; // fix
} }
bool bool
cAudioManager::HasAirBrakes(int32 model) cAudioManager::HasAirBrakes(int32 model)
{ {
return model == LINERUN || std::abs(model - FIRETRUK) <= 1 || model == BUS || return model == LINERUN || fabs(model - FIRETRUK) <= 1 || model == BUS ||
model == COACH; // fix model == COACH; // fix
} }

View file

@ -81,12 +81,9 @@ public:
float m_fMaxTrafficSpeed; float m_fMaxTrafficSpeed;
uint8 m_nCruiseSpeed; uint8 m_nCruiseSpeed;
uint8 m_nCarCtrlFlags; uint8 m_nCarCtrlFlags;
int8 pad1[2];
CVector m_vecDestinationCoors; CVector m_vecDestinationCoors;
void *m_aPathFindNodesInfo[8]; void *m_aPathFindNodesInfo[8];
uint16 m_nPathFindNodesCount; uint16 m_nPathFindNodesCount;
int8 pad2[2];
CVehicle *m_pTargetCar; CVehicle *m_pTargetCar;
}; };
static_assert(sizeof(CAutoPilot) == 0x70, "CAutoPilot: error");
static_assert(sizeof(CAutoPilot) == 0x70, "CAutoPilot: error");

View file

@ -135,33 +135,33 @@ WRAPPER static void ApplyPanelDamageToCar(uint32, CAutomobile*, bool) { EAXJMP(0
#else #else
static void ApplyPanelDamageToCar(uint32 panels, CAutomobile* vehicle, bool flying) static void ApplyPanelDamageToCar(uint32 panels, CAutomobile* vehicle, bool flying)
{ {
if(vehicle->m_DamageManager.GetPanelStatus(VEHPANEL_FRONT_LEFT) != CDamageManager::GetPanelStatus(panels, VEHPANEL_FRONT_LEFT)){ if(vehicle->Damage.GetPanelStatus(VEHPANEL_FRONT_LEFT) != CDamageManager::GetPanelStatus(panels, VEHPANEL_FRONT_LEFT)){
vehicle->m_DamageManager.SetPanelStatus(VEHPANEL_FRONT_LEFT, CDamageManager::GetPanelStatus(panels, VEHPANEL_FRONT_LEFT)); vehicle->Damage.SetPanelStatus(VEHPANEL_FRONT_LEFT, CDamageManager::GetPanelStatus(panels, VEHPANEL_FRONT_LEFT));
vehicle->SetPanelDamage(13, VEHPANEL_FRONT_LEFT, flying); vehicle->SetPanelDamage(CAR_WING_LF, VEHPANEL_FRONT_LEFT, flying);
} }
if(vehicle->m_DamageManager.GetPanelStatus(VEHPANEL_FRONT_RIGHT) != CDamageManager::GetPanelStatus(panels, VEHPANEL_FRONT_RIGHT)){ if(vehicle->Damage.GetPanelStatus(VEHPANEL_FRONT_RIGHT) != CDamageManager::GetPanelStatus(panels, VEHPANEL_FRONT_RIGHT)){
vehicle->m_DamageManager.SetPanelStatus(VEHPANEL_FRONT_RIGHT, CDamageManager::GetPanelStatus(panels, VEHPANEL_FRONT_RIGHT)); vehicle->Damage.SetPanelStatus(VEHPANEL_FRONT_RIGHT, CDamageManager::GetPanelStatus(panels, VEHPANEL_FRONT_RIGHT));
vehicle->SetPanelDamage(9, VEHPANEL_FRONT_RIGHT, flying); vehicle->SetPanelDamage(CAR_WING_RF, VEHPANEL_FRONT_RIGHT, flying);
} }
if(vehicle->m_DamageManager.GetPanelStatus(VEHPANEL_REAR_LEFT) != CDamageManager::GetPanelStatus(panels, VEHPANEL_REAR_LEFT)){ if(vehicle->Damage.GetPanelStatus(VEHPANEL_REAR_LEFT) != CDamageManager::GetPanelStatus(panels, VEHPANEL_REAR_LEFT)){
vehicle->m_DamageManager.SetPanelStatus(VEHPANEL_REAR_LEFT, CDamageManager::GetPanelStatus(panels, VEHPANEL_REAR_LEFT)); vehicle->Damage.SetPanelStatus(VEHPANEL_REAR_LEFT, CDamageManager::GetPanelStatus(panels, VEHPANEL_REAR_LEFT));
vehicle->SetPanelDamage(14, VEHPANEL_REAR_LEFT, flying); vehicle->SetPanelDamage(CAR_WING_LR, VEHPANEL_REAR_LEFT, flying);
} }
if(vehicle->m_DamageManager.GetPanelStatus(VEHPANEL_REAR_RIGHT) != CDamageManager::GetPanelStatus(panels, VEHPANEL_REAR_RIGHT)){ if(vehicle->Damage.GetPanelStatus(VEHPANEL_REAR_RIGHT) != CDamageManager::GetPanelStatus(panels, VEHPANEL_REAR_RIGHT)){
vehicle->m_DamageManager.SetPanelStatus(VEHPANEL_REAR_RIGHT, CDamageManager::GetPanelStatus(panels, VEHPANEL_REAR_RIGHT)); vehicle->Damage.SetPanelStatus(VEHPANEL_REAR_RIGHT, CDamageManager::GetPanelStatus(panels, VEHPANEL_REAR_RIGHT));
vehicle->SetPanelDamage(10, VEHPANEL_REAR_RIGHT, flying); vehicle->SetPanelDamage(CAR_WING_RR, VEHPANEL_REAR_RIGHT, flying);
} }
if(vehicle->m_DamageManager.GetPanelStatus(VEHPANEL_WINDSCREEN) != CDamageManager::GetPanelStatus(panels, VEHPANEL_WINDSCREEN)){ if(vehicle->Damage.GetPanelStatus(VEHPANEL_WINDSCREEN) != CDamageManager::GetPanelStatus(panels, VEHPANEL_WINDSCREEN)){
vehicle->m_DamageManager.SetPanelStatus(VEHPANEL_WINDSCREEN, CDamageManager::GetPanelStatus(panels, VEHPANEL_WINDSCREEN)); vehicle->Damage.SetPanelStatus(VEHPANEL_WINDSCREEN, CDamageManager::GetPanelStatus(panels, VEHPANEL_WINDSCREEN));
vehicle->SetPanelDamage(19, VEHPANEL_WINDSCREEN, flying); vehicle->SetPanelDamage(CAR_WINDSCREEN, VEHPANEL_WINDSCREEN, flying);
} }
if(vehicle->m_DamageManager.GetPanelStatus(VEHBUMPER_FRONT) != CDamageManager::GetPanelStatus(panels, VEHBUMPER_FRONT)){ if(vehicle->Damage.GetPanelStatus(VEHBUMPER_FRONT) != CDamageManager::GetPanelStatus(panels, VEHBUMPER_FRONT)){
vehicle->m_DamageManager.SetPanelStatus(VEHBUMPER_FRONT, CDamageManager::GetPanelStatus(panels, VEHBUMPER_FRONT)); vehicle->Damage.SetPanelStatus(VEHBUMPER_FRONT, CDamageManager::GetPanelStatus(panels, VEHBUMPER_FRONT));
vehicle->SetPanelDamage(7, VEHBUMPER_FRONT, flying); vehicle->SetPanelDamage(CAR_BUMP_FRONT, VEHBUMPER_FRONT, flying);
} }
if(vehicle->m_DamageManager.GetPanelStatus(VEHBUMPER_REAR) != CDamageManager::GetPanelStatus(panels, VEHBUMPER_REAR)){ if(vehicle->Damage.GetPanelStatus(VEHBUMPER_REAR) != CDamageManager::GetPanelStatus(panels, VEHBUMPER_REAR)){
vehicle->m_DamageManager.SetPanelStatus(VEHBUMPER_REAR, CDamageManager::GetPanelStatus(panels, VEHBUMPER_REAR)); vehicle->Damage.SetPanelStatus(VEHBUMPER_REAR, CDamageManager::GetPanelStatus(panels, VEHBUMPER_REAR));
vehicle->SetPanelDamage(8, VEHBUMPER_REAR, flying); vehicle->SetPanelDamage(CAR_BUMP_REAR, VEHBUMPER_REAR, flying);
} }
} }
#endif #endif
@ -624,7 +624,7 @@ void CReplay::StoreCarUpdate(CVehicle *vehicle, int id)
vp->matrix.CompressFromFullMatrix(vehicle->GetMatrix()); vp->matrix.CompressFromFullMatrix(vehicle->GetMatrix());
vp->health = vehicle->m_fHealth / 4.0f; /* Not anticipated that health can be > 1000. */ vp->health = vehicle->m_fHealth / 4.0f; /* Not anticipated that health can be > 1000. */
vp->acceleration = vehicle->m_fGasPedal * 100.0f; vp->acceleration = vehicle->m_fGasPedal * 100.0f;
vp->panels = vehicle->IsCar() ? ((CAutomobile*)vehicle)->m_DamageManager.m_panelStatus : 0; vp->panels = vehicle->IsCar() ? ((CAutomobile*)vehicle)->Damage.m_panelStatus : 0;
vp->velocityX = 8000.0f * max(-4.0f, min(4.0f, vehicle->GetSpeed().x)); /* 8000!? */ vp->velocityX = 8000.0f * max(-4.0f, min(4.0f, vehicle->GetSpeed().x)); /* 8000!? */
vp->velocityY = 8000.0f * max(-4.0f, min(4.0f, vehicle->GetSpeed().y)); vp->velocityY = 8000.0f * max(-4.0f, min(4.0f, vehicle->GetSpeed().y));
vp->velocityZ = 8000.0f * max(-4.0f, min(4.0f, vehicle->GetSpeed().z)); vp->velocityZ = 8000.0f * max(-4.0f, min(4.0f, vehicle->GetSpeed().z));
@ -638,14 +638,14 @@ void CReplay::StoreCarUpdate(CVehicle *vehicle, int id)
if (vehicle->IsCar()){ if (vehicle->IsCar()){
CAutomobile* car = (CAutomobile*)vehicle; CAutomobile* car = (CAutomobile*)vehicle;
for (int i = 0; i < 4; i++){ for (int i = 0; i < 4; i++){
vp->wheel_susp_dist[i] = 50.0f * car->m_afWheelSuspDist[i]; vp->wheel_susp_dist[i] = 50.0f * car->m_aWheelDist[i];
vp->wheel_rotation[i] = 128.0f / M_PI * car->m_afWheelRotation[i]; vp->wheel_rotation[i] = 128.0f / M_PI * car->m_aWheelRotation[i];
} }
vp->door_angles[0] = 127.0f / M_PI * car->m_aDoors[2].m_fAngle; vp->door_angles[0] = 127.0f / M_PI * car->Doors[2].m_fAngle;
vp->door_angles[1] = 127.0f / M_PI * car->m_aDoors[3].m_fAngle; vp->door_angles[1] = 127.0f / M_PI * car->Doors[3].m_fAngle;
vp->door_status = 0; vp->door_status = 0;
for (int i = 0; i < 6; i++){ for (int i = 0; i < 6; i++){
if (car->m_DamageManager.GetDoorStatus(i) == 3) if (car->Damage.GetDoorStatus(i) == 3)
vp->door_status |= BIT(i); vp->door_status |= BIT(i);
} }
} }
@ -683,42 +683,42 @@ void CReplay::ProcessCarUpdate(CVehicle *vehicle, float interpolation, CAddressI
if (vehicle->IsCar()) { if (vehicle->IsCar()) {
CAutomobile* car = (CAutomobile*)vehicle; CAutomobile* car = (CAutomobile*)vehicle;
for (int i = 0; i < 4; i++) { for (int i = 0; i < 4; i++) {
car->m_afWheelSuspDist[i] = vp->wheel_susp_dist[i] / 50.0f; car->m_aWheelDist[i] = vp->wheel_susp_dist[i] / 50.0f;
car->m_afWheelRotation[i] = vp->wheel_rotation[i] * M_PI / 128.0f; car->m_aWheelRotation[i] = vp->wheel_rotation[i] * M_PI / 128.0f;
} }
car->m_aDoors[2].m_fAngle = car->m_aDoors[2].m_fPreviousAngle = vp->door_angles[0] * M_PI / 127.0f; car->Doors[2].m_fAngle = car->Doors[2].m_fPreviousAngle = vp->door_angles[0] * M_PI / 127.0f;
car->m_aDoors[3].m_fAngle = car->m_aDoors[3].m_fPreviousAngle = vp->door_angles[1] * M_PI / 127.0f; car->Doors[3].m_fAngle = car->Doors[3].m_fPreviousAngle = vp->door_angles[1] * M_PI / 127.0f;
if (vp->door_angles[0]) if (vp->door_angles[0])
car->m_DamageManager.SetDoorStatus(2, 2); car->Damage.SetDoorStatus(2, 2);
if (vp->door_angles[1]) if (vp->door_angles[1])
car->m_DamageManager.SetDoorStatus(3, 2); car->Damage.SetDoorStatus(3, 2);
if (vp->door_status & 1 && car->m_DamageManager.GetDoorStatus(VEHDOOR_BONNET) != 3){ if (vp->door_status & 1 && car->Damage.GetDoorStatus(DOOR_BONNET) != 3){
car->m_DamageManager.SetDoorStatus(VEHDOOR_BONNET, 3); car->Damage.SetDoorStatus(DOOR_BONNET, 3);
car->SetDoorDamage(17, VEHDOOR_BONNET, true); car->SetDoorDamage(CAR_BONNET, DOOR_BONNET, true);
} }
if (vp->door_status & 2 && car->m_DamageManager.GetDoorStatus(VEHDOOR_BOOT) != 3) { if (vp->door_status & 2 && car->Damage.GetDoorStatus(DOOR_BOOT) != 3) {
car->m_DamageManager.SetDoorStatus(VEHDOOR_BOOT, 3); car->Damage.SetDoorStatus(DOOR_BOOT, 3);
car->SetDoorDamage(18, VEHDOOR_BOOT, true); car->SetDoorDamage(CAR_BOOT, DOOR_BOOT, true);
} }
if (vp->door_status & 4 && car->m_DamageManager.GetDoorStatus(VEHDOOR_FRONT_LEFT) != 3) { if (vp->door_status & 4 && car->Damage.GetDoorStatus(DOOR_FRONT_LEFT) != 3) {
car->m_DamageManager.SetDoorStatus(VEHDOOR_FRONT_LEFT, 3); car->Damage.SetDoorStatus(DOOR_FRONT_LEFT, 3);
car->SetDoorDamage(15, VEHDOOR_FRONT_LEFT, true); car->SetDoorDamage(CAR_DOOR_LF, DOOR_FRONT_LEFT, true);
} }
if (vp->door_status & 8 && car->m_DamageManager.GetDoorStatus(VEHDOOR_FRONT_RIGHT) != 3) { if (vp->door_status & 8 && car->Damage.GetDoorStatus(DOOR_FRONT_RIGHT) != 3) {
car->m_DamageManager.SetDoorStatus(VEHDOOR_FRONT_RIGHT, 3); car->Damage.SetDoorStatus(DOOR_FRONT_RIGHT, 3);
car->SetDoorDamage(11, VEHDOOR_FRONT_RIGHT, true); car->SetDoorDamage(CAR_DOOR_RF, DOOR_FRONT_RIGHT, true);
} }
if (vp->door_status & 0x10 && car->m_DamageManager.GetDoorStatus(VEHDOOR_REAR_LEFT) != 3) { if (vp->door_status & 0x10 && car->Damage.GetDoorStatus(DOOR_REAR_LEFT) != 3) {
car->m_DamageManager.SetDoorStatus(VEHDOOR_REAR_LEFT, 3); car->Damage.SetDoorStatus(DOOR_REAR_LEFT, 3);
car->SetDoorDamage(16, VEHDOOR_REAR_LEFT, true); car->SetDoorDamage(CAR_DOOR_LR, DOOR_REAR_LEFT, true);
} }
if (vp->door_status & 0x20 && car->m_DamageManager.GetDoorStatus(VEHDOOR_REAR_RIGHT) != 3) { if (vp->door_status & 0x20 && car->Damage.GetDoorStatus(DOOR_REAR_RIGHT) != 3) {
car->m_DamageManager.SetDoorStatus(VEHDOOR_REAR_RIGHT, 3); car->Damage.SetDoorStatus(DOOR_REAR_RIGHT, 3);
car->SetDoorDamage(12, VEHDOOR_REAR_RIGHT, true); car->SetDoorDamage(CAR_DOOR_RR, DOOR_REAR_RIGHT, true);
} }
vehicle->bEngineOn = true; vehicle->bEngineOn = true;
if (vehicle->IsCar()) if (vehicle->IsCar())
((CAutomobile*)vehicle)->m_nDriveWheelsOnGround = 4; ((CAutomobile*)vehicle)->m_nWheelsOnGround = 4;
CWorld::Remove(vehicle); CWorld::Remove(vehicle);
CWorld::Add(vehicle); CWorld::Add(vehicle);
if (vehicle->IsBoat()) if (vehicle->IsBoat())
@ -1185,24 +1185,24 @@ void CReplay::RestoreStuffFromMem(void)
vehicle->SetModelIndex(mi); vehicle->SetModelIndex(mi);
if (mi == MI_DODO){ if (mi == MI_DODO){
CAutomobile* dodo = (CAutomobile*)vehicle; CAutomobile* dodo = (CAutomobile*)vehicle;
GetFirstObject(dodo->m_apModelNodes[4])->flags = 0; /* TODO: 4 to enum */ RpAtomicSetFlags(GetFirstObject(dodo->m_aCarNodes[CAR_WHEEL_LF]), 0);
CMatrix tmp1; CMatrix tmp1;
tmp1.Attach(&dodo->m_apModelNodes[1]->modelling, false); tmp1.Attach(RwFrameGetMatrix(dodo->m_aCarNodes[CAR_WHEEL_RF]), false);
CMatrix tmp2(&dodo->m_apModelNodes[4]->modelling, false); CMatrix tmp2(RwFrameGetMatrix(dodo->m_aCarNodes[CAR_WHEEL_LF]), false);
*tmp1.GetPosition() += CVector(tmp2.GetPosition()->x + 0.1f, 0.0f, tmp2.GetPosition()->z); *tmp1.GetPosition() += CVector(tmp2.GetPosition()->x + 0.1f, 0.0f, tmp2.GetPosition()->z);
tmp1.UpdateRW(); tmp1.UpdateRW();
} }
if (vehicle->IsCar()){ if (vehicle->IsCar()){
CAutomobile* car = (CAutomobile*)vehicle; CAutomobile* car = (CAutomobile*)vehicle;
int32 panels = car->m_DamageManager.m_panelStatus; int32 panels = car->Damage.m_panelStatus;
car->m_DamageManager.m_panelStatus = 0; car->Damage.m_panelStatus = 0;
ApplyPanelDamageToCar(panels, car, true); ApplyPanelDamageToCar(panels, car, true);
car->SetDoorDamage(17, 0, true); /* BONNET */ car->SetDoorDamage(CAR_BONNET, DOOR_BONNET, true);
car->SetDoorDamage(18, 1, true); /* BUMPER */ car->SetDoorDamage(CAR_BOOT, DOOR_BOOT, true);
car->SetDoorDamage(15, 2, true); /* DOOR_FRONT_LEFT */ car->SetDoorDamage(CAR_DOOR_LF, DOOR_FRONT_LEFT, true);
car->SetDoorDamage(11, 3, true); /* DOOR_FRONT_RIGHT */ car->SetDoorDamage(CAR_DOOR_RF, DOOR_FRONT_RIGHT, true);
car->SetDoorDamage(16, 4, true); /* DOOR_BACK_LEFT */ car->SetDoorDamage(CAR_DOOR_LR, DOOR_REAR_LEFT, true);
car->SetDoorDamage(12, 5, true); /* DOOR_BACK_RIGHT */ car->SetDoorDamage(CAR_DOOR_RR, DOOR_REAR_RIGHT, true);
} }
vehicle->m_audioEntityId = DMAudio.CreateEntity(0, vehicle); vehicle->m_audioEntityId = DMAudio.CreateEntity(0, vehicle);
DMAudio.SetEntityStatus(vehicle->m_audioEntityId, true); DMAudio.SetEntityStatus(vehicle->m_audioEntityId, true);

View file

@ -1,26 +1,61 @@
#pragma once #pragma once
#include "DamageManager.h" #include "DamageManager.h"
#include "Door.h"
#include "RwHelper.h"
#include "Vehicle.h" #include "Vehicle.h"
struct CDoor
{
float m_fAngleWhenOpened;
float m_fAngleWhenClosed;
char field_8;
char field_9;
char field_10;
char field_11;
float m_fAngle;
float m_fPreviousAngle;
float m_fAngularVelocity;
CVector m_vecVelocity;
};
class CAutomobile : public CVehicle class CAutomobile : public CVehicle
{ {
public: public:
// 0x288 // 0x288
CDamageManager m_DamageManager; CDamageManager Damage;
CDoor m_aDoors[6]; CDoor Doors[6];
RwFrame *m_apModelNodes[20]; RwFrame *m_aCarNodes[NUM_CAR_NODES];
uint8 stuff1[160]; CColPoint m_aWheelColPoints[4];
float m_afWheelSuspDist[4]; float m_aWheelDist[4];
uint8 stuff2[44]; float m_aWheelDist_2[4];
float m_afWheelRotation[4]; float m_aWheelSkidThing[4];
uint8 stuff3[200]; int field_49C;
bool m_aWheelSkidmarkMuddy[4];
bool m_aWheelSkidmarkBloody[4];
float m_aWheelRotation[4];
float m_aWheelPosition[4];
float m_aWheelSpeed[4];
uint8 stuff3[12];
uint32 m_nBusDoorTimerEnd;
uint32 m_nBusDoorTimerStart;
float m_aSuspensionRange[4];
float m_aSuspensionLineLength[4];
float m_fHeightAboveRoad;
float m_fImprovedHandling;
uint8 stuff6[32];
CPhysical *m_aGroundPhysical[4]; // physicals touching wheels
CVector m_aGroundOffset[4]; // from ground object to colpoint
CEntity *m_pBlowUpEntity;
float m_weaponThingA; // TODO
float m_weaponThingB; // TODO
float m_fCarGunLR; float m_fCarGunLR;
uint8 stuff4[13]; float m_fCarGunUD;
uint8 m_nDriveWheelsOnGround; float m_fWindScreenRotation;
uint8 stuff5[22]; uint8 stuff4[4];
uint8 m_nWheelsOnGround_2;
uint8 m_nWheelsOnGround;
uint8 m_nWheelsOnGroundPrev;
uint8 stuff5[5];
int32 m_aWheelState[4];
CAutomobile(int, uint8); CAutomobile(int, uint8);
CAutomobile* ctor(int, uint8); CAutomobile* ctor(int, uint8);
@ -30,4 +65,4 @@ public:
void dtor() { this->CAutomobile::~CAutomobile(); } void dtor() { this->CAutomobile::~CAutomobile(); }
}; };
static_assert(sizeof(CAutomobile) == 0x5A8, "CAutomobile: error"); static_assert(sizeof(CAutomobile) == 0x5A8, "CAutomobile: error");
static_assert(offsetof(CAutomobile, m_afWheelSuspDist) == 0x46C, "CAutomobile: error"); static_assert(offsetof(CAutomobile, m_aWheelDist) == 0x46C, "CAutomobile: error");

View file

@ -1858,10 +1858,10 @@ CPhysical::ProcessCollision(void)
CVehicle *veh = (CVehicle*)this; CVehicle *veh = (CVehicle*)this;
if(veh->m_vehType == VEHICLE_TYPE_CAR){ if(veh->m_vehType == VEHICLE_TYPE_CAR){
CAutomobile *car = (CAutomobile*)this; CAutomobile *car = (CAutomobile*)this;
car->m_afWheelSuspDist[0] = 1.0f; car->m_aWheelDist[0] = 1.0f;
car->m_afWheelSuspDist[1] = 1.0f; car->m_aWheelDist[1] = 1.0f;
car->m_afWheelSuspDist[2] = 1.0f; car->m_aWheelDist[2] = 1.0f;
car->m_afWheelSuspDist[3] = 1.0f; car->m_aWheelDist[3] = 1.0f;
}else if(veh->m_vehType == VEHICLE_TYPE_BIKE){ }else if(veh->m_vehType == VEHICLE_TYPE_BIKE){
assert(0 && "TODO - but unused"); assert(0 && "TODO - but unused");
} }

View file

@ -14,14 +14,6 @@ enum {
PERMANENT_VEHICLE = 4, PERMANENT_VEHICLE = 4,
}; };
enum {
GETTING_IN_OUT_FL = 1,
GETTING_IN_OUT_RL = 2,
GETTING_IN_OUT_FR = 4,
GETTING_IN_OUT_RR = 8
};
enum eCarLock { enum eCarLock {
CARLOCK_NOT_USED, CARLOCK_NOT_USED,
CARLOCK_UNLOCKED, CARLOCK_UNLOCKED,
@ -33,82 +25,55 @@ enum eCarLock {
CARLOCK_SKIP_SHUT_DOORS CARLOCK_SKIP_SHUT_DOORS
}; };
// TODO: where is this used? Is Vehicle.h the right file?
enum eVehicleModel enum eCarNodes
{ {
LANDSTAL, CAR_WHEEL_RF = 1,
IDAHO, CAR_WHEEL_RM,
STINGER, CAR_WHEEL_RB,
LINERUN, CAR_WHEEL_LF,
PEREN, CAR_WHEEL_LM,
SENTINEL, CAR_WHEEL_LB,
PATRIOT, CAR_BUMP_FRONT,
FIRETRUK, CAR_BUMP_REAR,
TRASH, CAR_WING_RF,
STRETCH, CAR_WING_RR,
MANANA, CAR_DOOR_RF,
INFERNUS, CAR_DOOR_RR,
BLISTA, CAR_WING_LF,
PONY, CAR_WING_LR,
MULE, CAR_DOOR_LF,
CHEETAH, CAR_DOOR_LR,
AMBULAN, CAR_BONNET,
FBICAR, CAR_BOOT,
MOONBEAM, CAR_WINDSCREEN,
ESPERANT, NUM_CAR_NODES,
TAXI,
KURUMA,
BOBCAT,
MRWHOOP,
BFINJECT,
CORPSE,
POLICE,
ENFORCER,
SECURICA,
BANSHEE,
PREDATOR,
BUS,
RHINO,
BARRACKS,
TRAIN,
CHOPPER,
DODO,
COACH,
CABBIE,
STALLION,
RUMPO,
RCBANDIT,
BELLYUP,
MRWONGS,
MAFIA,
YARDIE,
YAKUZA,
DIABLOS,
COLUMB,
HOODS,
AIRTRAIN,
DEADDODO,
SPEEDER,
REEFER,
PANLANT,
FLATBED,
YANKEE,
ESCAPE,
BORGNINE,
TOYZ,
GHOST,
CAR151,
CAR152,
CAR153,
CAR154,
CAR155,
CAR156,
CAR157,
CAR158,
CAR159,
}; };
enum eDoors { enum
{
CAR_POS_HEADLIGHTS,
CAR_POS_TAILLIGHTS,
CAR_POS_FRONTSEAT,
CAR_POS_BACKSEAT,
CAR_POS_EXHAUST = 9,
};
enum eDoors
{
DOOR_BONNET = 0,
DOOR_BOOT,
DOOR_FRONT_LEFT,
DOOR_FRONT_RIGHT,
DOOR_REAR_LEFT,
DOOR_REAR_RIGHT
};
enum {
GETTING_IN_OUT_FL = 1,
GETTING_IN_OUT_RL = 2,
GETTING_IN_OUT_FR = 4,
GETTING_IN_OUT_RR = 8
}; };
class CVehicle : public CPhysical class CVehicle : public CPhysical

View file

@ -23,34 +23,6 @@ RwTexture **CVehicleModelInfo::ms_colourTextureTable = (RwTexture**)0x711C40;
RwTexture *&gpWhiteTexture = *(RwTexture**)0x64C4F8; RwTexture *&gpWhiteTexture = *(RwTexture**)0x64C4F8;
RwFrame *&pMatFxIdentityFrame = *(RwFrame**)0x64C510; RwFrame *&pMatFxIdentityFrame = *(RwFrame**)0x64C510;
enum {
CAR_WHEEL_RF = 1,
CAR_WHEEL_RM = 2,
CAR_WHEEL_RB = 3,
CAR_WHEEL_LF = 4,
CAR_WHEEL_LM = 5,
CAR_WHEEL_LB = 6,
CAR_BUMP_FRONT = 7,
CAR_BUMP_REAR = 8,
CAR_WING_RF = 9,
CAR_WING_RR = 10,
CAR_DOOR_RF = 11,
CAR_DOOR_RR = 12,
CAR_WING_LF = 13,
CAR_WING_LR = 14,
CAR_DOOR_LF = 15,
CAR_DOOR_LR = 16,
CAR_BONNET = 17,
CAR_BOOT = 18,
CAR_WINDSCREEN = 19,
CAR_POS_HEADLIGHTS = 0,
CAR_POS_TAILLIGHTS = 1,
CAR_POS_FRONTSEAT = 2,
CAR_POS_BACKSEAT = 3,
CAR_POS_EXHAUST = 9,
};
enum { enum {
VEHICLE_FLAG_COLLAPSE = 0x2, VEHICLE_FLAG_COLLAPSE = 0x2,
VEHICLE_FLAG_ADD_WHEEL = 0x4, VEHICLE_FLAG_ADD_WHEEL = 0x4,