CVehicleModelInfo

This commit is contained in:
aap 2020-05-10 17:09:14 +02:00
parent f7aa4e108a
commit 0552d49fce
7 changed files with 253 additions and 55 deletions

View file

@ -791,7 +791,7 @@ CFileLoader::LoadVehicleObject(const char *line)
// TODO(MIAMI): anims // TODO(MIAMI): anims
for(p = gamename; *p; p++) for(p = gamename; *p; p++)
if(*p == '_') *p = ' '; if(*p == '_') *p = ' ';
strncpy(mi->m_gameName, gamename, 32); strcpy(mi->m_gameName, gamename);
mi->m_level = level; mi->m_level = level;
mi->m_compRules = comprules; mi->m_compRules = comprules;
@ -873,6 +873,7 @@ CFileLoader::LoadPedObject(const char *line)
for(animGroupId = 0; animGroupId < NUM_ANIM_ASSOC_GROUPS; animGroupId++) for(animGroupId = 0; animGroupId < NUM_ANIM_ASSOC_GROUPS; animGroupId++)
if(strcmp(animGroup, CAnimManager::GetAnimGroupName((AssocGroupId)animGroupId)) == 0) if(strcmp(animGroup, CAnimManager::GetAnimGroupName((AssocGroupId)animGroupId)) == 0)
break; break;
assert(animGroupId < NUM_ANIM_ASSOC_GROUPS);
mi->m_animGroup = animGroupId; mi->m_animGroup = animGroupId;
mi->m_carsCanDrive = carsCanDrive; mi->m_carsCanDrive = carsCanDrive;
} }

View file

@ -273,6 +273,20 @@ void NastyLimbsCheat()
{ {
CPed::bNastyLimbsCheat = !CPed::bNastyLimbsCheat; CPed::bNastyLimbsCheat = !CPed::bNastyLimbsCheat;
} }
void BlackCarsCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
gbBlackCars = true;
gbPinkCars = false;
}
void PinkCarsCheat()
{
CHud::SetHelpMessage(TheText.Get("CHEAT1"), true);
gbBlackCars = false;
gbPinkCars = true;
}
////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////
#ifdef KANGAROO_CHEAT #ifdef KANGAROO_CHEAT
@ -951,6 +965,14 @@ void CPad::AddToPCCheatString(char c)
if ( !_CHEATCMP("TAEHCSBMILYTSAN") ) if ( !_CHEATCMP("TAEHCSBMILYTSAN") )
NastyLimbsCheat(); NastyLimbsCheat();
// "IWANTITPAINTEDBLACK"
if ( !_CHEATCMP("KCALBDETNIAPTITNAWI") )
BlackCarsCheat();
// "AHAIRDRESSERSCAR"
if ( !_CHEATCMP("RACSRESSERDRIAHA") )
PinkCarsCheat();
#ifdef KANGAROO_CHEAT #ifdef KANGAROO_CHEAT
// "KANGAROO" // "KANGAROO"
if (!_CHEATCMP("OORAGNAK")) if (!_CHEATCMP("OORAGNAK"))

View file

@ -19,6 +19,8 @@
#include "ModelIndices.h" #include "ModelIndices.h"
#include "ModelInfo.h" #include "ModelInfo.h"
//--MIAMI: done
int8 CVehicleModelInfo::ms_compsToUse[2] = { -2, -2 }; int8 CVehicleModelInfo::ms_compsToUse[2] = { -2, -2 };
int8 CVehicleModelInfo::ms_compsUsed[2]; int8 CVehicleModelInfo::ms_compsUsed[2];
RwRGBA CVehicleModelInfo::ms_vehicleColourTable[256]; RwRGBA CVehicleModelInfo::ms_vehicleColourTable[256];
@ -147,6 +149,8 @@ RwObjectNameIdAssocation *CVehicleModelInfo::ms_vehicleDescs[] = {
bikeIds bikeIds
}; };
bool gbBlackCars;
bool gbPinkCars;
CVehicleModelInfo::CVehicleModelInfo(void) CVehicleModelInfo::CVehicleModelInfo(void)
: CClumpModelInfo(MITYPE_VEHICLE) : CClumpModelInfo(MITYPE_VEHICLE)
@ -227,10 +231,30 @@ CVehicleModelInfo::SetClump(RpClump *clump)
SetFrameIds(ms_vehicleDescs[m_vehicleType]); SetFrameIds(ms_vehicleDescs[m_vehicleType]);
PreprocessHierarchy(); PreprocessHierarchy();
FindEditableMaterialList(); FindEditableMaterialList();
m_envMap = nil;
SetEnvironmentMap(); SetEnvironmentMap();
} }
void
CVehicleModelInfo::SetAnimFile(const char *file)
{
if(strcasecmp(file, "null") == 0)
return;
m_animFileName = new char[strlen(file)+1];
strcpy(m_animFileName, file);
}
void
CVehicleModelInfo::ConvertAnimFileIndex(void)
{
if(m_animFileIndex != -1){
// we have a string pointer in that union
int32 index = CAnimManager::GetAnimationBlockIndex(m_animFileName);
delete[] m_animFileName;
m_animFileIndex = index;
}
}
RwFrame* RwFrame*
CVehicleModelInfo::CollapseFramesCB(RwFrame *frame, void *data) CVehicleModelInfo::CollapseFramesCB(RwFrame *frame, void *data)
{ {
@ -383,30 +407,68 @@ CVehicleModelInfo::SetAtomicRendererCB_Boat(RpAtomic *atomic, void *data)
RpAtomic* RpAtomic*
CVehicleModelInfo::SetAtomicRendererCB_Heli(RpAtomic *atomic, void *data) CVehicleModelInfo::SetAtomicRendererCB_Heli(RpAtomic *atomic, void *data)
{ {
char *name;
name = GetFrameNodeName(RpAtomicGetFrame(atomic));
if(strncmp(name, "toprotor", 8) == 0)
CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleRotorAlphaCB);
else if(strncmp(name, "rearrotor", 9) == 0)
CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleTailRotorAlphaCB);
else
CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil); CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil);
return atomic; return atomic;
} }
RpAtomic*
CVehicleModelInfo::SetAtomicRendererCB_RealHeli(RpAtomic *atomic, void *data)
{
RpClump *clump;
char *name;
bool alpha;
clump = (RpClump*)data;
name = GetFrameNodeName(RpAtomicGetFrame(atomic));
alpha = false;
RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), HasAlphaMaterialCB, &alpha);
if(strncmp(name, "toprotor", 8) == 0)
CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleRotorAlphaCB);
else if(strncmp(name, "rearrotor", 9) == 0)
CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleTailRotorAlphaCB);
else if(strstr(name, "_hi") || strncmp(name, "extra", 5) == 0){
if(alpha || strncmp(name, "windscreen", 10) == 0)
CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailAlphaCB);
else
CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleHiDetailCB);
}else if(strstr(name, "_lo")){
RpClumpRemoveAtomic(clump, atomic);
RpAtomicDestroy(atomic);
return atomic; // BUG: not done by gta
}else if(strstr(name, "_vlo"))
CVisibilityPlugins::SetAtomicRenderCallback(atomic, CVisibilityPlugins::RenderVehicleReallyLowDetailCB);
else
CVisibilityPlugins::SetAtomicRenderCallback(atomic, nil);
HideDamagedAtomicCB(atomic, nil);
return atomic;
}
void void
CVehicleModelInfo::SetAtomicRenderCallbacks(void) CVehicleModelInfo::SetAtomicRenderCallbacks(void)
{ {
switch(m_vehicleType){ #ifdef GTA_TRAIN
case VEHICLE_TYPE_TRAIN: if(m_vehicleType == VEHICLE_TYPE_TRAIN)
RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Train, nil); RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Train, nil);
break; else
case VEHICLE_TYPE_HELI: #endif
if(m_vehicleType == VEHICLE_TYPE_HELI)
RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Heli, nil); RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Heli, nil);
break; else if(m_vehicleType == VEHICLE_TYPE_PLANE)
case VEHICLE_TYPE_PLANE:
RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_BigVehicle, nil); RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_BigVehicle, nil);
break; else if(m_vehicleType == VEHICLE_TYPE_BOAT)
case VEHICLE_TYPE_BOAT:
RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Boat, m_clump); RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_Boat, m_clump);
break; else if(mod_HandlingManager.GetHandlingData((eHandlingId)m_handlingId)->Flags & HANDLING_IS_HELI)
default: RpClumpForAllAtomics(m_clump, SetAtomicRendererCB_RealHeli, m_clump);
else
RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, m_clump); RpClumpForAllAtomics(m_clump, SetAtomicRendererCB, m_clump);
break;
}
} }
RwObject* RwObject*
@ -603,6 +665,13 @@ ChooseComponent(int32 rule, int32 comps)
// only valid in rain // only valid in rain
n = CGeneral::GetRandomNumberInRange(0, CountCompsInRule(comps)); n = CGeneral::GetRandomNumberInRange(0, CountCompsInRule(comps));
return COMPRULE_COMPN(comps, n); return COMPRULE_COMPN(comps, n);
case 3:
n = CGeneral::GetRandomNumberInRange(0, 1+CountCompsInRule(comps));
if(n != 0)
return COMPRULE_COMPN(comps, n-1);
return -1;
case 4:
return CGeneral::GetRandomNumberInRange(0, 5);
} }
return -1; return -1;
} }
@ -729,6 +798,9 @@ CVehicleModelInfo::GetEditableMaterialListCB(RpAtomic *atomic, void *data)
return atomic; return atomic;
} }
static int maxFirstMaterials;
static int maxSecondMaterials;
void void
CVehicleModelInfo::FindEditableMaterialList(void) CVehicleModelInfo::FindEditableMaterialList(void)
{ {
@ -743,6 +815,8 @@ CVehicleModelInfo::FindEditableMaterialList(void)
GetEditableMaterialListCB(m_comps[i], &cbdata); GetEditableMaterialListCB(m_comps[i], &cbdata);
m_materials1[cbdata.numMats1] = nil; m_materials1[cbdata.numMats1] = nil;
m_materials2[cbdata.numMats2] = nil; m_materials2[cbdata.numMats2] = nil;
maxFirstMaterials = Max(maxFirstMaterials, cbdata.numMats1);
maxSecondMaterials = Max(maxSecondMaterials, cbdata.numMats2);
m_currentColour1 = -1; m_currentColour1 = -1;
m_currentColour2 = -1; m_currentColour2 = -1;
} }
@ -779,9 +853,12 @@ CVehicleModelInfo::SetVehicleColour(uint8 c1, uint8 c2)
void void
CVehicleModelInfo::ChooseVehicleColour(uint8 &col1, uint8 &col2) CVehicleModelInfo::ChooseVehicleColour(uint8 &col1, uint8 &col2)
{ {
if(m_numColours == 0){ if(m_numColours == 0 || gbBlackCars){
col1 = 0; col1 = 0;
col2 = 0; col2 = 0;
}else if(gbPinkCars){
col1 = 68;
col2 = 68;
}else{ }else{
m_lastColorVariation = (m_lastColorVariation+1) % m_numColours; m_lastColorVariation = (m_lastColorVariation+1) % m_numColours;
col1 = m_colours1[m_lastColorVariation]; col1 = m_colours1[m_lastColorVariation];
@ -804,6 +881,13 @@ CVehicleModelInfo::AvoidSameVehicleColour(uint8 *col1, uint8 *col2)
{ {
int i, n; int i, n;
if(gbBlackCars){
*col1 = 0;
*col2 = 0;
}else if(gbPinkCars){
*col1 = 68;
*col2 = 68;
}else{
if(m_numColours > 1) if(m_numColours > 1)
for(i = 0; i < 8; i++){ for(i = 0; i < 8; i++){
if(*col1 != m_lastColour1 || *col2 != m_lastColour2) if(*col1 != m_lastColour1 || *col2 != m_lastColour2)
@ -814,8 +898,10 @@ CVehicleModelInfo::AvoidSameVehicleColour(uint8 *col1, uint8 *col2)
} }
m_lastColour1 = *col1; m_lastColour1 = *col1;
m_lastColour2 = *col2; m_lastColour2 = *col2;
}
} }
//--MIAMI: unused
RwTexture* RwTexture*
CreateCarColourTexture(uint8 r, uint8 g, uint8 b) CreateCarColourTexture(uint8 r, uint8 g, uint8 b)
{ {
@ -1055,12 +1141,15 @@ CVehicleModelInfo::GetMaximumNumberOfPassengersFromNumberOfDoors(int id)
case MI_FIRETRUCK: case MI_FIRETRUCK:
n = 2; n = 2;
break; break;
case MI_HUNTER:
n = 1;
break;
default: default:
n = ((CVehicleModelInfo*)CModelInfo::GetModelInfo(id))->m_numDoors; n = ((CVehicleModelInfo*)CModelInfo::GetModelInfo(id))->m_numDoors;
} }
if(n == 0) if(n == 0)
return id == MI_RCBANDIT ? 0 : 1; return id == MI_RCBANDIT || id == MI_PIZZABOY || id == MI_BAGGAGE ? 0 : 1;
if(id == MI_COACH) if(id == MI_COACH)
return 8; return 8;

View file

@ -3,8 +3,8 @@
#include "ClumpModelInfo.h" #include "ClumpModelInfo.h"
enum { enum {
NUM_FIRST_MATERIALS = 26, NUM_FIRST_MATERIALS = 24,
NUM_SECOND_MATERIALS = 26, NUM_SECOND_MATERIALS = 20,
NUM_VEHICLE_COLOURS = 8, NUM_VEHICLE_COLOURS = 8,
}; };
@ -43,17 +43,18 @@ class CVehicleModelInfo : public CClumpModelInfo
public: public:
uint8 m_lastColour1; uint8 m_lastColour1;
uint8 m_lastColour2; uint8 m_lastColour2;
char m_gameName[32]; char m_gameName[10];
int32 m_vehicleType; int32 m_vehicleType;
union {
int32 m_wheelId;
int32 m_planeLodId;
};
float m_wheelScale; float m_wheelScale;
int32 m_numDoors; union {
int32 m_handlingId; int16 m_wheelId;
int32 m_vehicleClass; int16 m_planeLodId;
int32 m_level; };
int16 m_handlingId;
int8 m_numDoors;
int8 m_vehicleClass;
int8 m_level;
int8 m_numComps;
int16 m_frequency; int16 m_frequency;
CVector m_positions[NUM_VEHICLE_POSITIONS]; CVector m_positions[NUM_VEHICLE_POSITIONS];
uint32 m_compRules; uint32 m_compRules;
@ -66,9 +67,11 @@ public:
uint8 m_lastColorVariation; uint8 m_lastColorVariation;
uint8 m_currentColour1; uint8 m_currentColour1;
uint8 m_currentColour2; uint8 m_currentColour2;
RwTexture *m_envMap;
RpAtomic *m_comps[6]; RpAtomic *m_comps[6];
int32 m_numComps; union {
int32 m_animFileIndex;
char *m_animFileName;
};
static int8 ms_compsToUse[2]; static int8 ms_compsToUse[2];
static int8 ms_compsUsed[2]; static int8 ms_compsUsed[2];
@ -80,6 +83,9 @@ public:
void DeleteRwObject(void); void DeleteRwObject(void);
RwObject *CreateInstance(void); RwObject *CreateInstance(void);
void SetClump(RpClump *); void SetClump(RpClump *);
void SetAnimFile(const char *file);
void ConvertAnimFileIndex(void);
int GetAnimFileIndex(void) { return m_animFileIndex; }
static RwFrame *CollapseFramesCB(RwFrame *frame, void *data); static RwFrame *CollapseFramesCB(RwFrame *frame, void *data);
static RwObject *MoveObjectsCB(RwObject *object, void *data); static RwObject *MoveObjectsCB(RwObject *object, void *data);
@ -92,6 +98,7 @@ public:
static RpAtomic *SetAtomicRendererCB_Train(RpAtomic *atomic, void *data); static RpAtomic *SetAtomicRendererCB_Train(RpAtomic *atomic, void *data);
static RpAtomic *SetAtomicRendererCB_Boat(RpAtomic *atomic, void *data); static RpAtomic *SetAtomicRendererCB_Boat(RpAtomic *atomic, void *data);
static RpAtomic *SetAtomicRendererCB_Heli(RpAtomic *atomic, void *data); static RpAtomic *SetAtomicRendererCB_Heli(RpAtomic *atomic, void *data);
static RpAtomic *SetAtomicRendererCB_RealHeli(RpAtomic *atomic, void *data);
void SetAtomicRenderCallbacks(void); void SetAtomicRenderCallbacks(void);
static RwObject *SetAtomicFlagCB(RwObject *object, void *data); static RwObject *SetAtomicFlagCB(RwObject *object, void *data);
@ -122,3 +129,6 @@ public:
static int GetMaximumNumberOfPassengersFromNumberOfDoors(int id); static int GetMaximumNumberOfPassengersFromNumberOfDoors(int id);
static void SetComponentsToUse(int8 c1, int8 c2) { ms_compsToUse[0] = c1; ms_compsToUse[1] = c2; } static void SetComponentsToUse(int8 c1, int8 c2) { ms_compsToUse[0] = c1; ms_compsToUse[1] = c2; }
}; };
extern bool gbBlackCars;
extern bool gbPinkCars;

View file

@ -147,7 +147,7 @@ CVisibilityPlugins::RenderFadingEntities(void)
if(e->m_rwObject == nil) if(e->m_rwObject == nil)
continue; continue;
mi = (CSimpleModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex()); mi = (CSimpleModelInfo *)CModelInfo::GetModelInfo(e->GetModelIndex());
if(mi->m_noZwrite) if(mi->GetModelType() == MITYPE_SIMPLE && mi->m_noZwrite)
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, FALSE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, FALSE);
if(e->bDistanceFade){ if(e->bDistanceFade){
@ -159,7 +159,7 @@ CVisibilityPlugins::RenderFadingEntities(void)
}else }else
CRenderer::RenderOneNonRoad(e); CRenderer::RenderOneNonRoad(e);
if(mi->m_noZwrite) if(mi->GetModelType() == MITYPE_SIMPLE && mi->m_noZwrite)
RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE); RwRenderStateSet(rwRENDERSTATEZWRITEENABLE, (void*)TRUE);
} }
} }
@ -515,6 +515,20 @@ CVisibilityPlugins::RenderTrainHiDetailAlphaCB(RpAtomic *atomic)
return atomic; return atomic;
} }
RpAtomic*
CVisibilityPlugins::RenderVehicleRotorAlphaCB(RpAtomic *atomic)
{
// TODO(MIAMI):
return AtomicDefaultRenderCallBack(atomic);
}
RpAtomic*
CVisibilityPlugins::RenderVehicleTailRotorAlphaCB(RpAtomic *atomic)
{
// TODO(MIAMI):
return AtomicDefaultRenderCallBack(atomic);
}
RpAtomic* RpAtomic*
CVisibilityPlugins::RenderPlayerCB(RpAtomic *atomic) CVisibilityPlugins::RenderPlayerCB(RpAtomic *atomic)
{ {

View file

@ -60,6 +60,8 @@ public:
static RpAtomic *RenderVehicleReallyLowDetailCB_BigVehicle(RpAtomic *atomic); static RpAtomic *RenderVehicleReallyLowDetailCB_BigVehicle(RpAtomic *atomic);
static RpAtomic *RenderTrainHiDetailCB(RpAtomic *atomic); static RpAtomic *RenderTrainHiDetailCB(RpAtomic *atomic);
static RpAtomic *RenderTrainHiDetailAlphaCB(RpAtomic *atomic); static RpAtomic *RenderTrainHiDetailAlphaCB(RpAtomic *atomic);
static RpAtomic *RenderVehicleRotorAlphaCB(RpAtomic *atomic);
static RpAtomic *RenderVehicleTailRotorAlphaCB(RpAtomic *atomic);
static RpAtomic *RenderPlayerCB(RpAtomic *atomic); static RpAtomic *RenderPlayerCB(RpAtomic *atomic);
static RpAtomic *RenderPedLowDetailCB(RpAtomic *atomic); static RpAtomic *RenderPedLowDetailCB(RpAtomic *atomic);

View file

@ -16,7 +16,6 @@ enum eHandlingId
HANDLING_STRETCH, HANDLING_STRETCH,
HANDLING_MANANA, HANDLING_MANANA,
HANDLING_INFERNUS, HANDLING_INFERNUS,
HANDLING_BLISTA,
HANDLING_PONY, HANDLING_PONY,
HANDLING_MULE, HANDLING_MULE,
HANDLING_CHEETAH, HANDLING_CHEETAH,
@ -33,7 +32,6 @@ enum eHandlingId
HANDLING_ENFORCER, HANDLING_ENFORCER,
HANDLING_SECURICA, HANDLING_SECURICA,
HANDLING_BANSHEE, HANDLING_BANSHEE,
HANDLING_PREDATOR,
HANDLING_BUS, HANDLING_BUS,
HANDLING_RHINO, HANDLING_RHINO,
HANDLING_BARRACKS, HANDLING_BARRACKS,
@ -45,22 +43,73 @@ enum eHandlingId
HANDLING_STALLION, HANDLING_STALLION,
HANDLING_RUMPO, HANDLING_RUMPO,
HANDLING_RCBANDIT, HANDLING_RCBANDIT,
HANDLING_BELLYUP,
HANDLING_MRWONGS,
HANDLING_MAFIA, HANDLING_MAFIA,
HANDLING_YARDIE,
HANDLING_YAKUZA,
HANDLING_DIABLOS,
HANDLING_COLUMB,
HANDLING_HOODS,
HANDLING_AIRTRAIN, HANDLING_AIRTRAIN,
HANDLING_DEADDODO, HANDLING_DEADDODO,
HANDLING_SPEEDER,
HANDLING_REEFER,
HANDLING_PANLANT,
HANDLING_FLATBED, HANDLING_FLATBED,
HANDLING_YANKEE, HANDLING_YANKEE,
HANDLING_BORGNINE HANDLING_GOLFCART,
HANDLING_VOODOO,
HANDLING_WASHING,
HANDLING_CUBAN,
HANDLING_ROMERO,
HANDLING_PACKER,
HANDLING_ADMIRAL,
HANDLING_GANGBUR,
HANDLING_ZEBRA,
HANDLING_TOPFUN,
HANDLING_GLENDALE,
HANDLING_OCEANIC,
HANDLING_HERMES,
HANDLING_SABRE1,
HANDLING_SABRETUR,
HANDLING_PHEONIX,
HANDLING_WALTON,
HANDLING_REGINA,
HANDLING_COMET,
HANDLING_DELUXO,
HANDLING_BURRITO,
HANDLING_SPAND,
HANDLING_BAGGAGE,
HANDLING_KAUFMAN,
HANDLING_RANCHER,
HANDLING_FBIRANCH,
HANDLING_VIRGO,
HANDLING_GREENWOO,
HANDLING_HOTRING,
HANDLING_SANDKING,
HANDLING_BLISTAC,
HANDLING_BOXVILLE,
HANDLING_BENSON,
HANDLING_DESPERAD,
HANDLING_LOVEFIST,
HANDLING_BLOODRA,
HANDLING_BLOODRB,
HANDLING_BIKE,
HANDLING_MOPED,
HANDLING_DIRTBIKE,
HANDLING_ANGEL,
HANDLING_FREEWAY,
HANDLING_PREDATOR,
HANDLING_SPEEDER,
HANDLING_REEFER,
HANDLING_RIO,
HANDLING_SQUALO,
HANDLING_TROPIC,
HANDLING_COASTGRD,
HANDLING_DINGHY,
HANDLING_MARQUIS,
HANDLING_CUPBOAT,
HANDLING_SEAPLANE,
HANDLING_SPARROW,
HANDLING_SEASPAR,
HANDLING_MAVERICK,
HANDLING_COASTMAV,
HANDLING_POLMAV,
HANDLING_HUNTER,
HANDLING_RCBARON,
HANDLING_RCGOBLIN,
HANDLING_RCCOPTER
}; };
enum enum
@ -81,6 +130,17 @@ enum
HANDLING_HAS_NO_ROOF = 0x2000, HANDLING_HAS_NO_ROOF = 0x2000,
HANDLING_IS_BIG = 0x4000, HANDLING_IS_BIG = 0x4000,
HANDLING_HALOGEN_LIGHTS = 0x8000, HANDLING_HALOGEN_LIGHTS = 0x8000,
HANDLING_IS_BIKE = 0x10000,
HANDLING_IS_HELI = 0x20000,
HANDLING_IS_PLANE = 0x40000,
HANDLING_IS_BOAT = 0x80000,
HANDLING_NO_EXHAUST = 0x100000,
HANDLING_REARWHEEL_1ST = 0x200000,
HANDLING_HANDBRAKE_TYRE = 0x400000,
HANDLING_SIT_IN_BOAT = 0x800000,
HANDLING_FAT_REARW = 0x1000000,
HANDLING_NARROW_FRONTW = 0x2000000,
HANDLING_GOOD_INSAND = 0x4000000,
}; };
struct tHandlingData struct tHandlingData