CEntity and friends

This commit is contained in:
aap 2020-05-19 20:56:42 +02:00
parent 8a90e32f1b
commit bdbe5d1080
26 changed files with 581 additions and 650 deletions

View File

@ -1148,45 +1148,6 @@ CPacManPickups::Update()
void void
CPacManPickups::GeneratePMPickUps(CVector pos, float scrambleMult, int16 count, uint8 type) CPacManPickups::GeneratePMPickUps(CVector pos, float scrambleMult, int16 count, uint8 type)
{ {
int i = 0;
while (count > 0) {
while (aPMPickUps[i].m_eType != PACMAN_NONE)
i++;
bool bPickupCreated = false;
while (!bPickupCreated) {
CVector newPos = pos;
CColPoint colPoint;
CEntity *pRoad;
uint16 nRand = CGeneral::GetRandomNumber();
newPos.x += ((nRand & 0xFF) - 128) * scrambleMult / 128.0f;
newPos.y += (((nRand >> 8) & 0xFF) - 128) * scrambleMult / 128.0f;
newPos.z = 1000.0f;
if (CWorld::ProcessVerticalLine(newPos, -1000.0f, colPoint, pRoad, true, false, false, false, true, false, nil) && pRoad->IsBuilding() && ((CBuilding*)pRoad)->GetIsATreadable()) {
newPos.z = 0.7f + colPoint.point.z;
aPMPickUps[i].m_eType = type;
aPMPickUps[i].m_vecPosn = newPos;
CObject *obj = new CObject(MI_BULLION, true);
if (obj != nil) {
obj->ObjectCreatedBy = MISSION_OBJECT;
obj->SetPosition(aPMPickUps[i].m_vecPosn);
obj->SetOrientation(0.0f, 0.0f, -HALFPI);
obj->GetMatrix().UpdateRW();
obj->UpdateRwFrame();
obj->bAffectedByGravity = false;
obj->bExplosionProof = true;
obj->bUsesCollision = false;
obj->bIsPickup = false;
CWorld::Add(obj);
}
aPMPickUps[i].m_pObject = obj;
bPickupCreated = true;
}
}
count--;
}
bPMActive = true;
} }
// diablo porn mission pickups // diablo porn mission pickups
@ -1303,40 +1264,6 @@ static const CVector aRacePoints1[] = {
void void
CPacManPickups::GeneratePMPickUpsForRace(int32 race) CPacManPickups::GeneratePMPickUpsForRace(int32 race)
{ {
const CVector *pPos = nil;
int i = 0;
if (race == 0) pPos = aRacePoints1; // there's only one available
assert(pPos != nil);
while (!pPos->IsZero()) {
while (aPMPickUps[i].m_eType != PACMAN_NONE)
i++;
aPMPickUps[i].m_eType = PACMAN_RACE;
aPMPickUps[i].m_vecPosn = *(pPos++);
if (race == 0) {
CObject* obj = new CObject(MI_DONKEYMAG, true);
if (obj != nil) {
obj->ObjectCreatedBy = MISSION_OBJECT;
obj->SetPosition(aPMPickUps[i].m_vecPosn);
obj->SetOrientation(0.0f, 0.0f, -HALFPI);
obj->GetMatrix().UpdateRW();
obj->UpdateRwFrame();
obj->bAffectedByGravity = false;
obj->bExplosionProof = true;
obj->bUsesCollision = false;
obj->bIsPickup = false;
CWorld::Add(obj);
}
aPMPickUps[i].m_pObject = obj;
} else
aPMPickUps[i].m_pObject = nil;
}
bPMActive = true;
} }
void void

View File

@ -7167,12 +7167,13 @@ int8 CRunningScript::ProcessCommands800To899(int32 command)
} }
case COMMAND_CREATE_FLOATING_PACKAGE: case COMMAND_CREATE_FLOATING_PACKAGE:
{ {
CollectParameters(&m_nIp, 3); // removed in MIAMI
CVector pos = *(CVector*)&ScriptParams[0]; // CollectParameters(&m_nIp, 3);
if (pos.z <= MAP_Z_LOW_LIMIT) // CVector pos = *(CVector*)&ScriptParams[0];
pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET; // if (pos.z <= MAP_Z_LOW_LIMIT)
ScriptParams[0] = CPickups::GenerateNewOne(pos, MI_FLOATPACKAGE1, PICKUP_FLOATINGPACKAGE, 0); // pos.z = CWorld::FindGroundZForCoord(pos.x, pos.y) + PICKUP_PLACEMENT_OFFSET;
StoreParameters(&m_nIp, 1); // ScriptParams[0] = CPickups::GenerateNewOne(pos, MI_FLOATPACKAGE1, PICKUP_FLOATINGPACKAGE, 0);
// StoreParameters(&m_nIp, 1);
return 0; return 0;
} }
case COMMAND_PLACE_OBJECT_RELATIVE_TO_CAR: case COMMAND_PLACE_OBJECT_RELATIVE_TO_CAR:
@ -8626,8 +8627,8 @@ int8 CRunningScript::ProcessCommands1000To1099(int32 command)
return 0; return 0;
} }
case COMMAND_GET_BODY_CAST_HEALTH: case COMMAND_GET_BODY_CAST_HEALTH:
ScriptParams[0] = CObject::nBodyCastHealth; // ScriptParams[0] = CObject::nBodyCastHealth;
StoreParameters(&m_nIp, 1); // StoreParameters(&m_nIp, 1);
return 0; return 0;
case COMMAND_SET_CHARS_CHATTING: case COMMAND_SET_CHARS_CHATTING:
{ {

View File

@ -145,7 +145,10 @@ CTrafficLights::ScanForLightsOnMap(void)
CPtrList &list = CWorld::GetSector(x, y)->m_lists[ENTITYLIST_DUMMIES]; CPtrList &list = CWorld::GetSector(x, y)->m_lists[ENTITYLIST_DUMMIES];
for(node = list.first; node; node = node->next){ for(node = list.first; node; node = node->next){
CEntity *light = (CEntity*)node->item; CEntity *light = (CEntity*)node->item;
if(light->GetModelIndex() != MI_TRAFFICLIGHTS) if(light->GetModelIndex() != MI_TRAFFICLIGHTS &&
light->GetModelIndex() != MI_TRAFFICLIGHTS_VERTICAL &&
light->GetModelIndex() != MI_TRAFFICLIGHTS_MIAMI &&
light->GetModelIndex() != MI_TRAFFICLIGHTS_TWOVERTICAL)
continue; continue;
// Check cars // Check cars

View File

@ -82,10 +82,6 @@ CCamera::CCamera(void)
Init(); Init();
} }
CCamera::CCamera(float)
{
}
void void
CCamera::Init(void) CCamera::Init(void)
{ {
@ -93,12 +89,7 @@ CCamera::Init(void)
float fMouseAccelHorzntl = m_fMouseAccelHorzntl; float fMouseAccelHorzntl = m_fMouseAccelHorzntl;
float fMouseAccelVertical = m_fMouseAccelVertical; float fMouseAccelVertical = m_fMouseAccelVertical;
#endif #endif
#ifdef FIX_BUGS memset(this, 0, sizeof(CCamera)); // this is fine, no vtable
static const CCamera DummyCamera = CCamera(0.f);
*this = DummyCamera;
#else
memset(this, 0, sizeof(CCamera)); // getting rid of vtable, eh?
#endif
#ifdef GTA3_1_1_PATCH #ifdef GTA3_1_1_PATCH
m_fMouseAccelHorzntl = fMouseAccelHorzntl; m_fMouseAccelHorzntl = fMouseAccelHorzntl;
m_fMouseAccelVertical = fMouseAccelVertical; m_fMouseAccelVertical = fMouseAccelVertical;

View File

@ -549,7 +549,6 @@ public:
// High level and misc // High level and misc
CCamera(void); CCamera(void);
CCamera(float);
void Init(void); void Init(void);
void Process(void); void Process(void);
void CamControl(void); void CamControl(void);

View File

@ -7,8 +7,6 @@ CPlaceable::CPlaceable(void)
m_matrix.SetScale(1.0f); m_matrix.SetScale(1.0f);
} }
CPlaceable::~CPlaceable(void) = default;
void void
CPlaceable::SetHeading(float angle) CPlaceable::SetHeading(float angle)
{ {

View File

@ -9,7 +9,6 @@ public:
CMatrix m_matrix; CMatrix m_matrix;
CPlaceable(void); CPlaceable(void);
virtual ~CPlaceable(void);
const CVector &GetPosition(void) { return m_matrix.GetPosition(); } const CVector &GetPosition(void) { return m_matrix.GetPosition(); }
void SetPosition(float x, float y, float z) { void SetPosition(float x, float y, float z) {
m_matrix.GetPosition().x = x; m_matrix.GetPosition().x = x;

View File

@ -1813,18 +1813,22 @@ void
CWorld::RepositionOneObject(CEntity *pEntity) CWorld::RepositionOneObject(CEntity *pEntity)
{ {
int16 modelId = pEntity->GetModelIndex(); int16 modelId = pEntity->GetModelIndex();
if (IsTrafficLight(modelId) || IsTreeModel(modelId) || modelId == MI_PARKINGMETER || if (modelId == MI_PARKINGMETER || modelId == MI_PHONEBOOTH1 || modelId == MI_WASTEBIN ||
modelId == MI_PHONEBOOTH1 || modelId == MI_WASTEBIN || modelId == MI_BIN || modelId == MI_POSTBOX1 || modelId == MI_BIN || modelId == MI_POSTBOX1 || modelId == MI_NEWSSTAND || modelId == MI_TRAFFICCONE ||
modelId == MI_NEWSSTAND || modelId == MI_TRAFFICCONE || modelId == MI_DUMP1 || modelId == MI_DUMP1 || modelId == MI_ROADWORKBARRIER1 || modelId == MI_BUSSIGN1 || modelId == MI_NOPARKINGSIGN1 ||
modelId == MI_ROADWORKBARRIER1 || modelId == MI_BUSSIGN1 || modelId == MI_NOPARKINGSIGN1 || modelId == MI_PHONESIGN || modelId == MI_FIRE_HYDRANT || modelId == MI_BOLLARDLIGHT ||
modelId == MI_PHONESIGN || modelId == MI_TAXISIGN || modelId == MI_FISHSTALL01 || modelId == MI_PARKTABLE || modelId == MI_PARKINGMETER2 || modelId == MI_TELPOLE02 ||
modelId == MI_FISHSTALL02 || modelId == MI_FISHSTALL03 || modelId == MI_FISHSTALL04 || modelId == MI_PARKBENCH || modelId == MI_BARRIER1 || IsTreeModel(modelId)
modelId == MI_BAGELSTAND2 || modelId == MI_FIRE_HYDRANT || modelId == MI_BOLLARDLIGHT || // TODO(MIAMI): this is actually a different case
modelId == MI_PARKTABLE) { || IsStreetLight(modelId)
) {
CVector &position = pEntity->GetMatrix().GetPosition(); CVector &position = pEntity->GetMatrix().GetPosition();
float fBoundingBoxMinZ = pEntity->GetColModel()->boundingBox.min.z; CColModel *pColModel = pEntity->GetColModel();
float fBoundingBoxMinZ = pColModel->boundingBox.min.z;
float fHeight = pColModel->boundingBox.max.z - pColModel->boundingBox.min.z;
if(fHeight < OBJECT_REPOSITION_OFFSET_Z) fHeight = OBJECT_REPOSITION_OFFSET_Z;
position.z = CWorld::FindGroundZFor3DCoord(position.x, position.y, position.z = CWorld::FindGroundZFor3DCoord(position.x, position.y,
position.z + OBJECT_REPOSITION_OFFSET_Z, nil) - position.z + fHeight, nil) -
fBoundingBoxMinZ; fBoundingBoxMinZ;
pEntity->m_matrix.UpdateRW(); pEntity->m_matrix.UpdateRW();
pEntity->UpdateRwFrame(); pEntity->UpdateRwFrame();

View File

@ -30,6 +30,9 @@
#include "Renderer.h" #include "Renderer.h"
#include "Ped.h" #include "Ped.h"
#include "Dummy.h" #include "Dummy.h"
#include "WindModifiers.h"
//--MIAMI: file almost done (see TODO)
int gBuildings; int gBuildings;
@ -80,7 +83,7 @@ CEntity::CEntity(void)
bIsStaticWaitingForCollision = false; bIsStaticWaitingForCollision = false;
m_flagE10 = false; m_flagE10 = false;
bUnderwater = false; bUnderwater = false;
m_flagE40 = false; bHasPreRenderEffects = false;
m_scanCode = 0; m_scanCode = 0;
m_modelIndex = -1; m_modelIndex = -1;
@ -276,6 +279,21 @@ CEntity::Remove(void)
} }
} }
void
CEntity::SetModelIndex(uint32 id)
{
m_modelIndex = id;
bHasPreRenderEffects = HasPreRenderEffects();
CreateRwObject();
}
void
CEntity::SetModelIndexNoCreate(uint32 id)
{
m_modelIndex = id;
bHasPreRenderEffects = HasPreRenderEffects();
}
void void
CEntity::CreateRwObject(void) CEntity::CreateRwObject(void)
{ {
@ -306,10 +324,8 @@ CEntity::DeleteRwObject(void)
RpAtomicDestroy((RpAtomic*)m_rwObject); RpAtomicDestroy((RpAtomic*)m_rwObject);
RwFrameDestroy(f); RwFrameDestroy(f);
}else if(RwObjectGetType(m_rwObject) == rpCLUMP){ }else if(RwObjectGetType(m_rwObject) == rpCLUMP){
#ifdef PED_SKIN
if(IsClumpSkinned((RpClump*)m_rwObject)) if(IsClumpSkinned((RpClump*)m_rwObject))
RpClumpForAllAtomics((RpClump*)m_rwObject, AtomicRemoveAnimFromSkinCB, nil); RpClumpForAllAtomics((RpClump*)m_rwObject, AtomicRemoveAnimFromSkinCB, nil);
#endif
RpClumpDestroy((RpClump*)m_rwObject); RpClumpDestroy((RpClump*)m_rwObject);
} }
m_rwObject = nil; m_rwObject = nil;
@ -330,7 +346,6 @@ CEntity::UpdateRwFrame(void)
} }
} }
//--MIAMI: done
void void
CEntity::SetupBigBuilding(void) CEntity::SetupBigBuilding(void)
{ {
@ -370,19 +385,39 @@ CEntity::GetBoundRect(void)
return rect; return rect;
} }
bool
CEntity::HasPreRenderEffects(void)
{
return IsTreeModel(GetModelIndex()) ||
GetModelIndex() == MI_COLLECTABLE1 ||
GetModelIndex() == MI_MONEY ||
GetModelIndex() == MI_CARMINE ||
GetModelIndex() == MI_NAUTICALMINE ||
GetModelIndex() == MI_BRIEFCASE ||
GetModelIndex() == MI_GRENADE ||
GetModelIndex() == MI_MOLOTOV ||
GetModelIndex() == MI_MISSILE ||
GetModelIndex() == MI_BEACHBALL ||
IsGlass(GetModelIndex()) ||
IsObject() && ((CObject*)this)->bIsPickup;
IsStreetLight(GetModelIndex());
}
void void
CEntity::PreRender(void) CEntity::PreRender(void)
{ {
if (CModelInfo::GetModelInfo(GetModelIndex())->GetNum2dEffects() != 0)
ProcessLightsForEntity();
if(!bHasPreRenderEffects)
return;
switch(m_type){ switch(m_type){
case ENTITY_TYPE_BUILDING: case ENTITY_TYPE_BUILDING:
if(GetModelIndex() == MI_RAILTRACKS){ if(IsTreeModel(GetModelIndex())){
CShadows::StoreShadowForPole(this, 0.0f, -10.949f, 5.0f, 8.0f, 1.0f, 0); float dist = (TheCamera.GetPosition() - GetPosition()).Magnitude2D();
CShadows::StoreShadowForPole(this, 0.0f, 10.949f, 5.0f, 8.0f, 1.0f, 1); CObject::fDistToNearestTree = Min(CObject::fDistToNearestTree, dist);
}else if(IsTreeModel(GetModelIndex())){
CShadows::StoreShadowForTree(this);
ModifyMatrixForTreeInWind(); ModifyMatrixForTreeInWind();
}else if(IsBannerModel(GetModelIndex())){
ModifyMatrixForBannerInWind();
} }
break; break;
case ENTITY_TYPE_OBJECT: case ENTITY_TYPE_OBJECT:
@ -423,12 +458,11 @@ CEntity::PreRender(void)
CCoronas::FLARE_NONE, CCoronas::REFLECTION_ON, CCoronas::FLARE_NONE, CCoronas::REFLECTION_ON,
CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f); CCoronas::LOSCHECK_OFF, CCoronas::STREAK_OFF, 0.0f);
}else if(IsGlass(GetModelIndex())){ }else if(IsGlass(GetModelIndex())){
if(!((CSimpleModelInfo*)CModelInfo::GetModelInfo(GetModelIndex()))->m_isArtistGlass) PreRenderForGlassWindow();
PreRenderForGlassWindow();
}else if (((CObject*)this)->bIsPickup) { }else if (((CObject*)this)->bIsPickup) {
CPickups::DoPickUpEffects(this); CPickups::DoPickUpEffects(this);
GetMatrix().UpdateRW(); GetMatrix().UpdateRW();
UpdateRwFrame(); UpdateRwFrame();
} else if (GetModelIndex() == MI_GRENADE) { } else if (GetModelIndex() == MI_GRENADE) {
CMotionBlurStreaks::RegisterStreak((uintptr)this, CMotionBlurStreaks::RegisterStreak((uintptr)this,
100, 100, 100, 100, 100, 100,
@ -439,12 +473,30 @@ CEntity::PreRender(void)
0, 100, 0, 0, 100, 0,
GetPosition() - 0.07f * TheCamera.GetRight(), GetPosition() - 0.07f * TheCamera.GetRight(),
GetPosition() + 0.07f * TheCamera.GetRight()); GetPosition() + 0.07f * TheCamera.GetRight());
}else if(GetModelIndex() == MI_BEACHBALL){
CVector pos = GetPosition();
CShadows::StoreShadowToBeRendered(SHADOWTYPE_DARK,
gpShadowPedTex, &pos,
0.4f, 0.0f, 0.0f, -0.4f,
CTimeCycle::GetShadowStrength(),
CTimeCycle::GetShadowStrength(),
CTimeCycle::GetShadowStrength(),
CTimeCycle::GetShadowStrength(),
20.0f, false, 1.0f);
} }
// fall through // fall through
case ENTITY_TYPE_DUMMY: case ENTITY_TYPE_DUMMY:
if(GetModelIndex() == MI_TRAFFICLIGHTS){ if(GetModelIndex() == MI_TRAFFICLIGHTS){
CTrafficLights::DisplayActualLight(this); CTrafficLights::DisplayActualLight(this);
CShadows::StoreShadowForPole(this, 2.957f, 0.147f, 0.0f, 16.0f, 0.4f, 0); CShadows::StoreShadowForPole(this, 2.957f, 0.147f, 0.0f, 16.0f, 0.4f, 0);
}else if(GetModelIndex() == MI_TRAFFICLIGHTS_VERTICAL){
CTrafficLights::DisplayActualLight(this);
}else if(GetModelIndex() == MI_TRAFFICLIGHTS_MIAMI){
CTrafficLights::DisplayActualLight(this);
CShadows::StoreShadowForPole(this, 4.819f, 1.315f, 0.0f, 16.0f, 0.4f, 0);
}else if(GetModelIndex() == MI_TRAFFICLIGHTS_TWOVERTICAL){
CTrafficLights::DisplayActualLight(this);
CShadows::StoreShadowForPole(this, 7.503f, 0.0f, 0.0f, 16.0f, 0.4f, 0);
}else if(GetModelIndex() == MI_SINGLESTREETLIGHTS1) }else if(GetModelIndex() == MI_SINGLESTREETLIGHTS1)
CShadows::StoreShadowForPole(this, 0.744f, 0.0f, 0.0f, 16.0f, 0.4f, 0); CShadows::StoreShadowForPole(this, 0.744f, 0.0f, 0.0f, 16.0f, 0.4f, 0);
else if(GetModelIndex() == MI_SINGLESTREETLIGHTS2) else if(GetModelIndex() == MI_SINGLESTREETLIGHTS2)
@ -453,19 +505,15 @@ CEntity::PreRender(void)
CShadows::StoreShadowForPole(this, 1.143f, 0.145f, 0.0f, 16.0f, 0.4f, 0); CShadows::StoreShadowForPole(this, 1.143f, 0.145f, 0.0f, 16.0f, 0.4f, 0);
else if(GetModelIndex() == MI_DOUBLESTREETLIGHTS) else if(GetModelIndex() == MI_DOUBLESTREETLIGHTS)
CShadows::StoreShadowForPole(this, 0.0f, -0.048f, 0.0f, 16.0f, 0.4f, 0); CShadows::StoreShadowForPole(this, 0.0f, -0.048f, 0.0f, 16.0f, 0.4f, 0);
else if(GetModelIndex() == MI_STREETLAMP1 ||
GetModelIndex() == MI_STREETLAMP2)
CShadows::StoreShadowForPole(this, 0.0f, 0.0f, 0.0f, 16.0f, 0.4f, 0);
break; break;
} }
if (CModelInfo::GetModelInfo(GetModelIndex())->GetNum2dEffects() != 0)
ProcessLightsForEntity();
} }
void void
CEntity::PreRenderForGlassWindow(void) CEntity::PreRenderForGlassWindow(void)
{ {
if(((CSimpleModelInfo*)CModelInfo::GetModelInfo(m_modelIndex))->m_isArtistGlass)
return;
CGlass::AskForObjectToBeRenderedInGlass(this); CGlass::AskForObjectToBeRenderedInGlass(this);
bIsVisible = false; bIsVisible = false;
} }
@ -486,8 +534,6 @@ CEntity::Render(void)
bool bool
CEntity::SetupLighting(void) CEntity::SetupLighting(void)
{ {
DeActivateDirectional();
SetAmbientColours();
return false; return false;
} }
@ -573,13 +619,12 @@ CEntity::PruneReferences(void)
} }
} }
#ifdef PED_SKIN
void void
CEntity::UpdateRpHAnim(void) CEntity::UpdateRpHAnim(void)
{ {
RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(GetClump()); if(IsClumpSkinned(GetClump())){
RpHAnimHierarchyUpdateMatrices(hier); RpHAnimHierarchy *hier = GetAnimHierarchyFromSkinClump(GetClump());
RpHAnimHierarchyUpdateMatrices(hier);
#if 0 #if 0
int i; int i;
char buf[256]; char buf[256];
@ -608,8 +653,8 @@ CEntity::UpdateRpHAnim(void)
void RenderSkeleton(RpHAnimHierarchy *hier); void RenderSkeleton(RpHAnimHierarchy *hier);
RenderSkeleton(hier); RenderSkeleton(hier);
#endif #endif
}
} }
#endif
void void
CEntity::AddSteamsFromGround(CVector *unused) CEntity::AddSteamsFromGround(CVector *unused)
@ -641,6 +686,15 @@ CEntity::AddSteamsFromGround(CVector *unused)
case 4: case 4:
CParticleObject::AddObject(POBJECT_DARK_SMOKE, pos, effect->particle.dir, effect->particle.scale, false); CParticleObject::AddObject(POBJECT_DARK_SMOKE, pos, effect->particle.dir, effect->particle.scale, false);
break; break;
// TODO(MIAMI): enable this once we have the particle objects
/*
case 5:
CParticleObject::AddObject(POBJECT_WATER_FOUNTAIN_VERT, pos, effect->particle.dir, effect->particle.scale, false);
break;
case 6:
CParticleObject::AddObject(POBJECT_WATER_FOUNTAIN_HORIZ, pos, effect->particle.dir, effect->particle.scale, false);
break;
*/
} }
} }
} }
@ -665,80 +719,66 @@ CEntity::ProcessLightsForEntity(void)
for(i = 0; i < n; i++, flashTimer1 += 0x80, flashTimer2 += 0x100, flashTimer3 += 0x200){ for(i = 0; i < n; i++, flashTimer1 += 0x80, flashTimer2 += 0x100, flashTimer3 += 0x200){
effect = CModelInfo::GetModelInfo(GetModelIndex())->Get2dEffect(i); effect = CModelInfo::GetModelInfo(GetModelIndex())->Get2dEffect(i);
if(effect->type != EFFECT_LIGHT) switch(effect->type){
continue; case EFFECT_LIGHT:
pos = GetMatrix() * effect->pos;
pos = GetMatrix() * effect->pos; lightOn = false;
lightFlickering = false;
lightOn = false; switch(effect->light.lightType){
lightFlickering = false; case LIGHT_ON:
switch(effect->light.lightType){
case LIGHT_ON:
lightOn = true;
break;
case LIGHT_ON_NIGHT:
if(CClock::GetHours() > 18 || CClock::GetHours() < 7)
lightOn = true; lightOn = true;
break; break;
case LIGHT_FLICKER: case LIGHT_ON_NIGHT:
if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed) & 0x60) if(CClock::GetHours() > 18 || CClock::GetHours() < 7)
lightOn = true; lightOn = true;
else break;
lightFlickering = true; case LIGHT_FLICKER:
if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed) & 3)
lightOn = true;
break;
case LIGHT_FLICKER_NIGHT:
if(CClock::GetHours() > 18 || CClock::GetHours() < 7){
if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed) & 0x60) if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed) & 0x60)
lightOn = true; lightOn = true;
else else
lightFlickering = true; lightFlickering = true;
if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed) & 3) if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed) & 3)
lightOn = true; lightOn = true;
} break;
break; case LIGHT_FLICKER_NIGHT:
case LIGHT_FLASH1: if(CClock::GetHours() > 18 || CClock::GetHours() < 7 || CWeather::WetRoads > 0.5f){
if((CTimer::GetTimeInMilliseconds() + flashTimer1) & 0x200) if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed) & 0x60)
lightOn = true; lightOn = true;
break; else
case LIGHT_FLASH1_NIGHT: lightFlickering = true;
if(CClock::GetHours() > 18 || CClock::GetHours() < 7) if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed) & 3)
lightOn = true;
}
break;
case LIGHT_FLASH1:
if((CTimer::GetTimeInMilliseconds() + flashTimer1) & 0x200) if((CTimer::GetTimeInMilliseconds() + flashTimer1) & 0x200)
lightOn = true; lightOn = true;
break; break;
case LIGHT_FLASH2: case LIGHT_FLASH1_NIGHT:
if((CTimer::GetTimeInMilliseconds() + flashTimer2) & 0x400) if(CClock::GetHours() > 18 || CClock::GetHours() < 7)
lightOn = true; if((CTimer::GetTimeInMilliseconds() + flashTimer1) & 0x200)
break; lightOn = true;
case LIGHT_FLASH2_NIGHT: break;
if(CClock::GetHours() > 18 || CClock::GetHours() < 7) case LIGHT_FLASH2:
if((CTimer::GetTimeInMilliseconds() + flashTimer2) & 0x400) if((CTimer::GetTimeInMilliseconds() + flashTimer2) & 0x400)
lightOn = true; lightOn = true;
break; break;
case LIGHT_FLASH3: case LIGHT_FLASH2_NIGHT:
if((CTimer::GetTimeInMilliseconds() + flashTimer3) & 0x800) if(CClock::GetHours() > 18 || CClock::GetHours() < 7)
lightOn = true; if((CTimer::GetTimeInMilliseconds() + flashTimer2) & 0x400)
break; lightOn = true;
case LIGHT_FLASH3_NIGHT: break;
if(CClock::GetHours() > 18 || CClock::GetHours() < 7) case LIGHT_FLASH3:
if((CTimer::GetTimeInMilliseconds() + flashTimer3) & 0x800) if((CTimer::GetTimeInMilliseconds() + flashTimer3) & 0x800)
lightOn = true; lightOn = true;
break; break;
case LIGHT_RANDOM_FLICKER: case LIGHT_FLASH3_NIGHT:
if(m_randomSeed > 16) if(CClock::GetHours() > 18 || CClock::GetHours() < 7)
lightOn = true; if((CTimer::GetTimeInMilliseconds() + flashTimer3) & 0x800)
else{ lightOn = true;
if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed*8) & 0x60) break;
lightOn = true; case LIGHT_RANDOM_FLICKER:
else
lightFlickering = true;
if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed*8) & 3)
lightOn = true;
}
break;
case LIGHT_RANDOM_FLICKER_NIGHT:
if(CClock::GetHours() > 18 || CClock::GetHours() < 7){
if(m_randomSeed > 16) if(m_randomSeed > 16)
lightOn = true; lightOn = true;
else{ else{
@ -749,85 +789,143 @@ CEntity::ProcessLightsForEntity(void)
if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed*8) & 3) if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed*8) & 3)
lightOn = true; lightOn = true;
} }
break;
case LIGHT_RANDOM_FLICKER_NIGHT:
if(CClock::GetHours() > 18 || CClock::GetHours() < 7){
if(m_randomSeed > 16)
lightOn = true;
else{
if((CTimer::GetTimeInMilliseconds() ^ m_randomSeed*8) & 0x60)
lightOn = true;
else
lightFlickering = true;
if((CTimer::GetTimeInMilliseconds()>>11 ^ m_randomSeed*8) & 3)
lightOn = true;
}
}
break;
case LIGHT_BRIDGE_FLASH1:
if(CBridge::ShouldLightsBeFlashing() && CTimer::GetTimeInMilliseconds() & 0x200)
lightOn = true;
break;
case LIGHT_BRIDGE_FLASH2:
if(CBridge::ShouldLightsBeFlashing() && (CTimer::GetTimeInMilliseconds() & 0x1FF) < 60)
lightOn = true;
break;
}
if(effect->light.flags & LIGHTFLAG_HIDE_OBJECT){
if(lightOn)
bDoNotRender = false;
else
bDoNotRender = true;
return;
}
// Corona
if(lightOn)
CCoronas::RegisterCorona((uintptr)this + i,
effect->col.r, effect->col.g, effect->col.b, 255,
pos, effect->light.size, effect->light.dist,
effect->light.corona, effect->light.flareType, effect->light.roadReflection,
effect->light.flags&LIGHTFLAG_LOSCHECK, CCoronas::STREAK_OFF, 0.0f,
!!(effect->light.flags&LIGHTFLAG_LONG_DIST));
else if(lightFlickering)
CCoronas::RegisterCorona((uintptr)this + i,
0, 0, 0, 255,
pos, effect->light.size, effect->light.dist,
effect->light.corona, effect->light.flareType, effect->light.roadReflection,
effect->light.flags&LIGHTFLAG_LOSCHECK, CCoronas::STREAK_OFF, 0.0f,
!!(effect->light.flags&LIGHTFLAG_LONG_DIST));
// Pointlight
bool alreadyProcessedFog;
alreadyProcessedFog = false;
if(effect->light.range != 0.0f && lightOn){
if(effect->col.r == 0 && effect->col.g == 0 && effect->col.b == 0){
CPointLights::AddLight(CPointLights::LIGHT_POINT,
pos, CVector(0.0f, 0.0f, 0.0f),
effect->light.range,
0.0f, 0.0f, 0.0f,
CPointLights::FOG_NONE, true);
}else{
CPointLights::AddLight(CPointLights::LIGHT_POINT,
pos, CVector(0.0f, 0.0f, 0.0f),
effect->light.range,
effect->col.r*CTimeCycle::GetSpriteBrightness()/255.0f,
effect->col.g*CTimeCycle::GetSpriteBrightness()/255.0f,
effect->col.b*CTimeCycle::GetSpriteBrightness()/255.0f,
(effect->light.flags & LIGHTFLAG_FOG) >> 1,
true);
alreadyProcessedFog = true;
}
}
if(!alreadyProcessedFog){
if(effect->light.flags & LIGHTFLAG_FOG_ALWAYS){
CPointLights::AddLight(CPointLights::LIGHT_FOGONLY_ALWAYS,
pos, CVector(0.0f, 0.0f, 0.0f),
0.0f,
effect->col.r/255.0f, effect->col.g/255.0f, effect->col.b/255.0f,
CPointLights::FOG_ALWAYS, true);
}else if(effect->light.flags & LIGHTFLAG_FOG_NORMAL && lightOn && effect->light.range == 0.0f){
CPointLights::AddLight(CPointLights::LIGHT_FOGONLY,
pos, CVector(0.0f, 0.0f, 0.0f),
0.0f,
effect->col.r/255.0f, effect->col.g/255.0f, effect->col.b/255.0f,
CPointLights::FOG_NORMAL, true);
}
}
// Light shadow
if(effect->light.shadowRange != 0.0f){
if(lightOn){
CShadows::StoreStaticShadow((uintptr)this + i, SHADOWTYPE_ADDITIVE,
effect->light.shadow, &pos,
effect->light.shadowRange, 0.0f,
0.0f, -effect->light.shadowRange,
128,
effect->col.r*CTimeCycle::GetSpriteBrightness()*effect->light.shadowIntensity/255.0f,
effect->col.g*CTimeCycle::GetSpriteBrightness()*effect->light.shadowIntensity/255.0f,
effect->col.b*CTimeCycle::GetSpriteBrightness()*effect->light.shadowIntensity/255.0f,
15.0f, 1.0f, 40.0f, false, 0.0f);
}else if(lightFlickering){
CShadows::StoreStaticShadow((uintptr)this + i, SHADOWTYPE_ADDITIVE,
effect->light.shadow, &pos,
effect->light.shadowRange, 0.0f,
0.0f, -effect->light.shadowRange,
0, 0.0f, 0.0f, 0.0f,
15.0f, 1.0f, 40.0f, false, 0.0f);
}
} }
break; break;
case LIGHT_BRIDGE_FLASH1:
if(CBridge::ShouldLightsBeFlashing() && CTimer::GetTimeInMilliseconds() & 0x200)
lightOn = true;
break;
case LIGHT_BRIDGE_FLASH2:
if(CBridge::ShouldLightsBeFlashing() && (CTimer::GetTimeInMilliseconds() & 0x1FF) < 60)
lightOn = true;
break;
}
// Corona case EFFECT_SUNGLARE:
if(lightOn) if(CWeather::SunGlare >= 0.0f){
CCoronas::RegisterCorona((uintptr)this + i, CVector pos = GetMatrix() * effect->pos;
effect->col.r, effect->col.g, effect->col.b, 255, CVector glareDir = pos - GetPosition();
pos, effect->light.size, effect->light.dist, glareDir.Normalise();
effect->light.corona, effect->light.flareType, effect->light.roadReflection, CVector camDir = TheCamera.GetPosition() - pos;
effect->light.flags&LIGHTFLAG_LOSCHECK, CCoronas::STREAK_OFF, 0.0f); float dist = camDir.Magnitude();
else if(lightFlickering) camDir *= 2.0f/dist;
CCoronas::RegisterCorona((uintptr)this + i, glareDir += camDir;
0, 0, 0, 255, glareDir.Normalise();
pos, effect->light.size, effect->light.dist, float camAngle = -DotProduct(glareDir, CTimeCycle::GetSunPosition());
effect->light.corona, effect->light.flareType, effect->light.roadReflection, if(camAngle > 0.0f){
effect->light.flags&LIGHTFLAG_LOSCHECK, CCoronas::STREAK_OFF, 0.0f); float intens = Sqrt(camAngle) * CWeather::SunGlare;
pos += camDir;
// Pointlight CCoronas::RegisterCorona((uintptr)this + 33 + i,
if(effect->light.flags & LIGHTFLAG_FOG_ALWAYS){ intens * (CTimeCycle::GetSunCoreRed() + 2*255)/3.0f,
CPointLights::AddLight(CPointLights::LIGHT_FOGONLY_ALWAYS, intens * (CTimeCycle::GetSunCoreGreen() + 2*255)/3.0f,
pos, CVector(0.0f, 0.0f, 0.0f), intens * (CTimeCycle::GetSunCoreBlue() + 2*255)/3.0f,
effect->light.range, 255,
effect->col.r/255.0f, effect->col.g/255.0f, effect->col.b/255.0f, pos, 0.5f*CWeather::SunGlare*Sqrt(dist), 120.0f,
CPointLights::FOG_ALWAYS, true); CCoronas::TYPE_STAR, CCoronas::FLARE_NONE,
}else if(effect->light.flags & LIGHTFLAG_FOG_NORMAL && lightOn && effect->light.range == 0.0f){ CCoronas::REFLECTION_OFF, CCoronas::LOSCHECK_OFF,
CPointLights::AddLight(CPointLights::LIGHT_FOGONLY, CCoronas::STREAK_OFF, 0.0f);
pos, CVector(0.0f, 0.0f, 0.0f), }
effect->light.range,
effect->col.r/255.0f, effect->col.g/255.0f, effect->col.b/255.0f,
CPointLights::FOG_NORMAL, true);
}else if(lightOn && effect->light.range != 0.0f){
if(effect->col.r == 0 && effect->col.g == 0 && effect->col.b == 0){
CPointLights::AddLight(CPointLights::LIGHT_POINT,
pos, CVector(0.0f, 0.0f, 0.0f),
effect->light.range,
0.0f, 0.0f, 0.0f,
CPointLights::FOG_NONE, true);
}else{
CPointLights::AddLight(CPointLights::LIGHT_POINT,
pos, CVector(0.0f, 0.0f, 0.0f),
effect->light.range,
effect->col.r*CTimeCycle::GetSpriteBrightness()/255.0f,
effect->col.g*CTimeCycle::GetSpriteBrightness()/255.0f,
effect->col.b*CTimeCycle::GetSpriteBrightness()/255.0f,
// half-useless because LIGHTFLAG_FOG_ALWAYS can't be on
(effect->light.flags & LIGHTFLAG_FOG) >> 1,
true);
}
}
// Light shadow
if(effect->light.shadowRange != 0.0f){
if(lightOn){
CShadows::StoreStaticShadow((uintptr)this + i, SHADOWTYPE_ADDITIVE,
effect->light.shadow, &pos,
effect->light.shadowRange, 0.0f,
0.0f, -effect->light.shadowRange,
128,
effect->col.r*CTimeCycle::GetSpriteBrightness()*effect->light.shadowIntensity/255.0f,
effect->col.g*CTimeCycle::GetSpriteBrightness()*effect->light.shadowIntensity/255.0f,
effect->col.b*CTimeCycle::GetSpriteBrightness()*effect->light.shadowIntensity/255.0f,
15.0f, 1.0f, 40.0f, false, 0.0f);
}else if(lightFlickering){
CShadows::StoreStaticShadow((uintptr)this + i, SHADOWTYPE_ADDITIVE,
effect->light.shadow, &pos,
effect->light.shadowRange, 0.0f,
0.0f, -effect->light.shadowRange,
0, 0.0f, 0.0f, 0.0f,
15.0f, 1.0f, 40.0f, false, 0.0f);
} }
break;
} }
} }
} }
@ -850,27 +948,31 @@ CEntity::ModifyMatrixForTreeInWind(void)
CMatrix mat(GetMatrix().m_attachment); CMatrix mat(GetMatrix().m_attachment);
if(CWeather::Wind >= 0.5){ if(CWeather::Wind >= 0.5){
t = m_randomSeed + 16*CTimer::GetTimeInMilliseconds(); t = m_randomSeed + 8*CTimer::GetTimeInMilliseconds();
f = (t & 0xFFF)/(float)0x1000; f = (t & 0xFFF)/(float)0x1000;
flutter = f * WindTabel[(t>>12)+1 & 0xF] + flutter = f * WindTabel[(t>>12)+1 & 0xF] +
(1.0f - f) * WindTabel[(t>>12) & 0xF] + (1.0f - f) * WindTabel[(t>>12) & 0xF] +
1.0f; 1.0f;
strength = CWeather::Wind < 0.8f ? 0.008f : 0.014f; strength = -0.015f*CWeather::Wind;
}else if(CWeather::Wind >= 0.2){ }else if(CWeather::Wind >= 0.2){
t = (uintptr)this + CTimer::GetTimeInMilliseconds(); t = (uintptr)this + CTimer::GetTimeInMilliseconds();
f = (t & 0xFFF)/(float)0x1000; f = (t & 0xFFF)/(float)0x1000;
flutter = Sin(f * 6.28f); flutter = Sin(f * 6.28f);
strength = 0.008f; strength = -0.008f;
}else{ }else{
t = (uintptr)this + CTimer::GetTimeInMilliseconds(); t = (uintptr)this + CTimer::GetTimeInMilliseconds();
f = (t & 0xFFF)/(float)0x1000; f = (t & 0xFFF)/(float)0x1000;
flutter = Sin(f * 6.28f); flutter = Sin(f * 6.28f);
strength = 0.005f; strength = -0.005f;
} }
mat.GetUp().x = strength * flutter; mat.GetUp().x = strength * flutter;
if(IsPalmTreeModel(GetModelIndex()))
mat.GetUp().x += -0.07f*CWeather::Wind;
mat.GetUp().y = mat.GetUp().x; mat.GetUp().y = mat.GetUp().x;
CWindModifiers::FindWindModifier(GetPosition(), &mat.GetUp().x, &mat.GetUp().y);
mat.UpdateRW(); mat.UpdateRW();
UpdateRwFrame(); UpdateRwFrame();
} }
@ -882,6 +984,7 @@ float BannerWindTabel[] = {
0.28f, 0.28f, 0.22f, 0.1f, 0.0f, -0.1f, -0.17f, -0.12f 0.28f, 0.28f, 0.22f, 0.1f, 0.0f, -0.1f, -0.17f, -0.12f
}; };
//--MIAMI: unused
void void
CEntity::ModifyMatrixForBannerInWind(void) CEntity::ModifyMatrixForBannerInWind(void)
{ {
@ -929,7 +1032,6 @@ CEntity::AddSteamsFromGround(CPtrList& list)
} }
#ifdef COMPATIBLE_SAVES #ifdef COMPATIBLE_SAVES
// TODO(MIAMI)
void void
CEntity::SaveEntityFlags(uint8*& buf) CEntity::SaveEntityFlags(uint8*& buf)
{ {
@ -953,35 +1055,41 @@ CEntity::SaveEntityFlags(uint8*& buf)
if (bRenderScorched) tmp |= BIT(20); if (bRenderScorched) tmp |= BIT(20);
if (bHasBlip) tmp |= BIT(21); if (bHasBlip) tmp |= BIT(21);
if (bIsBIGBuilding) tmp |= BIT(22); if (bIsBIGBuilding) tmp |= BIT(22);
if (bRenderDamaged) tmp |= BIT(23); if (bStreamBIGBuilding) tmp |= BIT(23);
if (bBulletProof) tmp |= BIT(24); if (bRenderDamaged) tmp |= BIT(24);
if (bFireProof) tmp |= BIT(25); if (bBulletProof) tmp |= BIT(25);
if (bCollisionProof) tmp |= BIT(26); if (bFireProof) tmp |= BIT(26);
if (bMeleeProof) tmp |= BIT(27); if (bCollisionProof) tmp |= BIT(27);
if (bOnlyDamagedByPlayer) tmp |= BIT(28); if (bMeleeProof) tmp |= BIT(28);
if (bStreamingDontDelete) tmp |= BIT(29); if (bOnlyDamagedByPlayer) tmp |= BIT(29);
if (bRemoveFromWorld) tmp |= BIT(0); if (bStreamingDontDelete) tmp |= BIT(30);
if (bHasHitWall) tmp |= BIT(1); if (bRemoveFromWorld) tmp |= BIT(31);
WriteSaveBuf<uint32>(buf, tmp); WriteSaveBuf<uint32>(buf, tmp);
tmp = 0; tmp = 0;
if (bImBeingRendered) tmp |= BIT(2); if (bHasHitWall) tmp |= BIT(0);
if (bTouchingWater) tmp |= BIT(3); if (bImBeingRendered) tmp |= BIT(1);
if (bIsSubway) tmp |= BIT(4); if (bTouchingWater) tmp |= BIT(2);
if (bDrawLast) tmp |= BIT(5); if (bIsSubway) tmp |= BIT(3);
if (bNoBrightHeadLights) tmp |= BIT(6); if (bDrawLast) tmp |= BIT(4);
if (bDoNotRender) tmp |= BIT(7); if (bNoBrightHeadLights) tmp |= BIT(5);
if (bDistanceFade) tmp |= BIT(8); if (bDoNotRender) tmp |= BIT(6);
if (bDistanceFade) tmp |= BIT(7);
if (m_flagE1) tmp |= BIT(8);
if (m_flagE2) tmp |= BIT(9); if (m_flagE2) tmp |= BIT(9);
if (bOffscreen) tmp |= BIT(10);
if (bIsStaticWaitingForCollision) tmp |= BIT(11);
if (m_flagE10) tmp |= BIT(12);
if (bUnderwater) tmp |= BIT(13);
if (bHasPreRenderEffects) tmp |= BIT(14);
WriteSaveBuf<uint32>(buf, tmp); WriteSaveBuf<uint32>(buf, tmp);
} }
// TODO(MIAMI)
void void
CEntity::LoadEntityFlags(uint8*& buf) CEntity::LoadEntityFlags(uint8*& buf)
{ {
@ -1005,28 +1113,35 @@ CEntity::LoadEntityFlags(uint8*& buf)
bRenderScorched = !!(tmp & BIT(20)); bRenderScorched = !!(tmp & BIT(20));
bHasBlip = !!(tmp & BIT(21)); bHasBlip = !!(tmp & BIT(21));
bIsBIGBuilding = !!(tmp & BIT(22)); bIsBIGBuilding = !!(tmp & BIT(22));
bRenderDamaged = !!(tmp & BIT(23)); bStreamBIGBuilding = !!(tmp & BIT(23));
bBulletProof = !!(tmp & BIT(24)); bRenderDamaged = !!(tmp & BIT(24));
bFireProof = !!(tmp & BIT(25)); bBulletProof = !!(tmp & BIT(25));
bCollisionProof = !!(tmp & BIT(26)); bFireProof = !!(tmp & BIT(26));
bMeleeProof = !!(tmp & BIT(27)); bCollisionProof = !!(tmp & BIT(27));
bOnlyDamagedByPlayer = !!(tmp & BIT(28)); bMeleeProof = !!(tmp & BIT(28));
bStreamingDontDelete = !!(tmp & BIT(29)); bOnlyDamagedByPlayer = !!(tmp & BIT(29));
bRemoveFromWorld = !!(tmp & BIT(0)); bStreamingDontDelete = !!(tmp & BIT(30));
bHasHitWall = !!(tmp & BIT(1)); bRemoveFromWorld = !!(tmp & BIT(31));
tmp = ReadSaveBuf<uint32>(buf); tmp = ReadSaveBuf<uint32>(buf);
bImBeingRendered = !!(tmp & BIT(2)); bHasHitWall = !!(tmp & BIT(0));
bTouchingWater = !!(tmp & BIT(3)); bImBeingRendered = !!(tmp & BIT(1));
bIsSubway = !!(tmp & BIT(4)); bTouchingWater = !!(tmp & BIT(2));
bDrawLast = !!(tmp & BIT(5)); bIsSubway = !!(tmp & BIT(3));
bNoBrightHeadLights = !!(tmp & BIT(6)); bDrawLast = !!(tmp & BIT(4));
bDoNotRender = !!(tmp & BIT(7)); bNoBrightHeadLights = !!(tmp & BIT(5));
bDistanceFade = !!(tmp & BIT(8)); bDoNotRender = !!(tmp & BIT(6));
bDistanceFade = !!(tmp & BIT(7));
m_flagE1 = !!(tmp & BIT(8));
m_flagE2 = !!(tmp & BIT(9)); m_flagE2 = !!(tmp & BIT(9));
bOffscreen = !!(tmp & BIT(10));
bIsStaticWaitingForCollision = !!(tmp & BIT(11));
m_flagE10 = !!(tmp & BIT(12));
bUnderwater = !!(tmp & BIT(13));
bHasPreRenderEffects = !!(tmp & BIT(14));
} }
#endif #endif

View File

@ -78,7 +78,7 @@ public:
uint32 bIsSubway : 1; // set when subway, but maybe different meaning? uint32 bIsSubway : 1; // set when subway, but maybe different meaning?
uint32 bDrawLast : 1; // draw object last uint32 bDrawLast : 1; // draw object last
uint32 bNoBrightHeadLights : 1; uint32 bNoBrightHeadLights : 1;
uint32 bDoNotRender : 1; uint32 bDoNotRender : 1; //-- only applies to CObjects apparently
uint32 bDistanceFade : 1; // Fade entity because it is far away uint32 bDistanceFade : 1; // Fade entity because it is far away
// flagsE // flagsE
@ -88,7 +88,7 @@ public:
uint32 bIsStaticWaitingForCollision : 1; // this is used by script created entities - they are static until the collision is loaded below them uint32 bIsStaticWaitingForCollision : 1; // this is used by script created entities - they are static until the collision is loaded below them
uint32 m_flagE10 : 1; // probably bDontStream uint32 m_flagE10 : 1; // probably bDontStream
uint32 bUnderwater : 1; // this object is underwater change drawing order uint32 bUnderwater : 1; // this object is underwater change drawing order
uint32 m_flagE40 : 1; uint32 bHasPreRenderEffects : 1; // Object has a prerender effects attached to it
uint16 m_scanCode; uint16 m_scanCode;
uint16 m_randomSeed; uint16 m_randomSeed;
@ -112,12 +112,12 @@ public:
#endif #endif
CEntity(void); CEntity(void);
~CEntity(void); virtual ~CEntity(void);
virtual void Add(void); virtual void Add(void);
virtual void Remove(void); virtual void Remove(void);
virtual void SetModelIndex(uint32 id) { m_modelIndex = id; CreateRwObject(); } virtual void SetModelIndex(uint32 id);
virtual void SetModelIndexNoCreate(uint32 id) { m_modelIndex = id; } virtual void SetModelIndexNoCreate(uint32 id);
virtual void CreateRwObject(void); virtual void CreateRwObject(void);
virtual void DeleteRwObject(void); virtual void DeleteRwObject(void);
virtual CRect GetBoundRect(void); virtual CRect GetBoundRect(void);
@ -160,6 +160,7 @@ public:
int16 GetModelIndex(void) const { return m_modelIndex; } int16 GetModelIndex(void) const { return m_modelIndex; }
void UpdateRwFrame(void); void UpdateRwFrame(void);
void SetupBigBuilding(void); void SetupBigBuilding(void);
bool HasPreRenderEffects(void);
void AttachToRwObject(RwObject *obj); void AttachToRwObject(RwObject *obj);
void DetachFromRwObject(void); void DetachFromRwObject(void);

View File

@ -1067,13 +1067,13 @@ CPhysical::ProcessShiftSectorList(CPtrList *lists)
if(B->IsBuilding()) if(B->IsBuilding())
skipShift = false; skipShift = false;
else if(IsTrafficLight(A->GetModelIndex()) && else if(IsStreetLight(A->GetModelIndex()) &&
(B->IsVehicle() || B->IsPed()) && (B->IsVehicle() || B->IsPed()) &&
A->GetUp().z < 0.66f) A->GetUp().z < 0.66f)
skipShift = true; skipShift = true;
else if((A->IsVehicle() || A->IsPed()) && else if((A->IsVehicle() || A->IsPed()) &&
B->GetUp().z < 0.66f && B->GetUp().z < 0.66f &&
IsTrafficLight(B->GetModelIndex())) IsStreetLight(B->GetModelIndex()))
skipShift = true; skipShift = true;
// TODO: maybe flip some ifs here // TODO: maybe flip some ifs here
else if(A->IsObject() && B->IsVehicle()){ else if(A->IsObject() && B->IsVehicle()){
@ -1398,7 +1398,7 @@ CPhysical::ProcessCollisionSectorList(CPtrList *lists)
if(B->IsBuilding()) if(B->IsBuilding())
skipCollision = false; skipCollision = false;
else if(IsTrafficLight(A->GetModelIndex()) && else if(IsStreetLight(A->GetModelIndex()) &&
(B->IsVehicle() || B->IsPed()) && (B->IsVehicle() || B->IsPed()) &&
A->GetUp().z < 0.66f){ A->GetUp().z < 0.66f){
skipCollision = true; skipCollision = true;
@ -1406,12 +1406,12 @@ CPhysical::ProcessCollisionSectorList(CPtrList *lists)
Aobj->m_pCollidingEntity = B; Aobj->m_pCollidingEntity = B;
}else if((A->IsVehicle() || A->IsPed()) && }else if((A->IsVehicle() || A->IsPed()) &&
B->GetUp().z < 0.66f && B->GetUp().z < 0.66f &&
IsTrafficLight(B->GetModelIndex())){ IsStreetLight(B->GetModelIndex())){
skipCollision = true; skipCollision = true;
A->bSkipLineCol = true; A->bSkipLineCol = true;
Bobj->m_pCollidingEntity = A; Bobj->m_pCollidingEntity = A;
}else if(A->IsObject() && B->IsVehicle()){ }else if(A->IsObject() && B->IsVehicle()){
if(A->GetModelIndex() == MI_CAR_BUMPER || A->GetModelIndex() == MI_FILES) if(A->GetModelIndex() == MI_CAR_BUMPER)// || A->GetModelIndex() == MI_FILES)
skipCollision = true; skipCollision = true;
else if(Aobj->ObjectCreatedBy == TEMP_OBJECT || else if(Aobj->ObjectCreatedBy == TEMP_OBJECT ||
Aobj->bHasBeenDamaged || Aobj->bHasBeenDamaged ||
@ -1430,7 +1430,7 @@ CPhysical::ProcessCollisionSectorList(CPtrList *lists)
} }
} }
}else if(B->IsObject() && A->IsVehicle()){ }else if(B->IsObject() && A->IsVehicle()){
if(B->GetModelIndex() == MI_CAR_BUMPER || B->GetModelIndex() == MI_FILES) if(B->GetModelIndex() == MI_CAR_BUMPER)// || B->GetModelIndex() == MI_FILES)
skipCollision = true; skipCollision = true;
else if(Bobj->ObjectCreatedBy == TEMP_OBJECT || else if(Bobj->ObjectCreatedBy == TEMP_OBJECT ||
Bobj->bHasBeenDamaged || Bobj->bHasBeenDamaged ||

View File

@ -3,14 +3,14 @@
#include "General.h" #include "General.h"
#include "ModelIndices.h" #include "ModelIndices.h"
#define X(name, var, addr) int16 var; #define X(name, var) int16 var;
MODELINDICES MODELINDICES
#undef X #undef X
void void
InitModelIndices(void) InitModelIndices(void)
{ {
#define X(name, var, addr) var = -1; #define X(name, var) var = -1;
MODELINDICES MODELINDICES
#undef X #undef X
} }
@ -18,7 +18,7 @@ InitModelIndices(void)
void void
MatchModelString(const char *modelname, int16 id) MatchModelString(const char *modelname, int16 id)
{ {
#define X(name, var, addr) \ #define X(name, var) \
if(!CGeneral::faststrcmp(name, modelname)){ \ if(!CGeneral::faststrcmp(name, modelname)){ \
var = id; \ var = id; \
return; \ return; \

View File

@ -3,168 +3,144 @@
#include "ModelInfo.h" #include "ModelInfo.h"
#define MODELINDICES \ #define MODELINDICES \
X("fire_hydrant", MI_FIRE_HYDRANT, 0x5F5A00) \ X("fire_hydrant", MI_FIRE_HYDRANT) \
X("bagelstnd02", MI_BAGELSTAND2, 0x5F59FC) \ X("phonesign", MI_PHONESIGN) \
X("fish01", MI_FISHSTALL01, 0x5F59EC) \ X("noparkingsign1", MI_NOPARKINGSIGN1) \
X("fishstall02", MI_FISHSTALL02, 0x5F59F0) \ X("bussign1", MI_BUSSIGN1) \
X("fishstall03", MI_FISHSTALL03, 0x5F59F4) \ X("roadworkbarrier1", MI_ROADWORKBARRIER1) \
X("fishstall04", MI_FISHSTALL04, 0x5F59F8) \ X("dump1", MI_DUMP1) \
X("taxisign", MI_TAXISIGN, 0x5F59E8) \ X("trafficcone", MI_TRAFFICCONE) \
X("phonesign", MI_PHONESIGN, 0x5F59E4) \ X("newsstand1", MI_NEWSSTAND) \
X("noparkingsign1", MI_NOPARKINGSIGN1, 0x5F59E0) \ X("postbox1", MI_POSTBOX1) \
X("bussign1", MI_BUSSIGN1, 0x5F59DC) \ X("bin1", MI_BIN) \
X("roadworkbarrier1", MI_ROADWORKBARRIER1, 0x5F59D8) \ X("wastebin", MI_WASTEBIN) \
X("dump1", MI_DUMP1, 0x5F59D4) \ X("phonebooth1", MI_PHONEBOOTH1) \
X("trafficcone", MI_TRAFFICCONE, 0x5F59D0) \ X("parkingmeter", MI_PARKINGMETER) \
X("newsstand1", MI_NEWSSTAND, 0x5F59CC) \ X("parkingmeterg", MI_PARKINGMETER2) \
X("postbox1", MI_POSTBOX1, 0x5F59C8) \ X("mall_fans", MI_MALLFAN) \
X("bin1", MI_BIN, 0x5F59C4) \ X("htl_fan_rotate_nt", MI_HOTELFAN_NIGHT) \
X("wastebin", MI_WASTEBIN, 0x5F59C0) \ X("htl_fan_rotate_dy", MI_HOTELFAN_DAY) \
X("phonebooth1", MI_PHONEBOOTH1, 0x5F59BC) \ X("hotroomfan", MI_HOTROOMFAN) \
X("parkingmeter", MI_PARKINGMETER, 0x5F59B8) \ X("trafficlight1", MI_TRAFFICLIGHTS) \
X("trafficlight1", MI_TRAFFICLIGHTS, 0x5F5958) \ X("MTraffic4", MI_TRAFFICLIGHTS_VERTICAL) \
X("lamppost1", MI_SINGLESTREETLIGHTS1, 0x5F595C) \ X("MTraffic1", MI_TRAFFICLIGHTS_MIAMI) \
X("lamppost2", MI_SINGLESTREETLIGHTS2, 0x5F5960) \ X("MTraffic2", MI_TRAFFICLIGHTS_TWOVERTICAL) \
X("lamppost3", MI_SINGLESTREETLIGHTS3, 0x5F5964) \ X("lamppost1", MI_SINGLESTREETLIGHTS1) \
X("doublestreetlght1", MI_DOUBLESTREETLIGHTS, 0x5F5968) \ X("lamppost2", MI_SINGLESTREETLIGHTS2) \
X("rd_Road2A10", MI_ROADSFORROADBLOCKSSTART, 0x5F596C) \ X("lamppost3", MI_SINGLESTREETLIGHTS3) \
X("rd_Road1A30", MI_ROADSFORROADBLOCKSEND, 0x5F5970) \ X("doublestreetlght1", MI_DOUBLESTREETLIGHTS) \
X("veg_tree1", MI_TREE1, 0x5F5974) \ X("Streetlamp1", MI_STREETLAMP1) \
X("veg_tree3", MI_TREE2, 0x5F5978) \ X("Streetlamp2", MI_STREETLAMP2) \
X("veg_treea1", MI_TREE3, 0x5F597C) \ X("veg_tree3", MI_TREE2) \
X("veg_treenew01", MI_TREE4, 0x5F5980) \ X("veg_treea1", MI_TREE3) \
X("veg_treenew05", MI_TREE5, 0x5F5984) \ X("veg_treeb1", MI_TREE6) \
X("veg_treeb1", MI_TREE6, 0x5F5988) \ X("veg_treea3", MI_TREE8) \
X("veg_treenew10", MI_TREE7, 0x5F598C) \ X("doc_crane_cab", MODELID_CRANE_1) \
X("veg_treea3", MI_TREE8, 0x5F5990) \ X("doc_crane_cab01", MODELID_CRANE_2) \
X("veg_treenew09", MI_TREE9, 0x5F5994) \ X("doc_crane_cab02", MODELID_CRANE_3) \
X("veg_treenew08", MI_TREE10, 0x5F5998) \ X("doc_crane_cab03", MODELID_CRANE_4) \
X("veg_treenew03", MI_TREE11, 0x5F599C) \ X("boatcranelg0", MODELID_CRANE_5) \
X("veg_treenew16", MI_TREE12, 0x5F59A0) \ X("LODnetopa0", MODELID_CRANE_6) \
X("veg_treenew17", MI_TREE13, 0x5F59A4) \ X("package1", MI_COLLECTABLE1) \
X("veg_treenew06", MI_TREE14, 0x5F59A8) \ X("Money", MI_MONEY) \
X("doc_crane_cab", MODELID_CRANE_1, 0x5F59AC) \ X("barrel1", MI_CARMINE) \
X("cranetopb", MODELID_CRANE_2, 0x5F59B0) \ X("dk_paynspraydoor", MI_GARAGEDOOR2) \
X("cranetopa", MODELID_CRANE_3, 0x5F59B4) \ X("dk_waretankdoor1", MI_GARAGEDOOR3) \
X("package1", MI_COLLECTABLE1, 0x5F5A04) \ X("hav_garagedoor1", MI_GARAGEDOOR4) \
X("Money", MI_MONEY, 0x5F5A08) \ X("hav_garagedoor02", MI_GARAGEDOOR5) \
X("barrel1", MI_CARMINE, 0x5F5A0C) \ X("hav_garagedoor03", MI_GARAGEDOOR6) \
/*X("oddjgaragdoor", MI_GARAGEDOOR1, 0x5F5A10)*/ \ X("hav_garagedoor04", MI_GARAGEDOOR7) \
X("dk_paynspraydoor", MI_GARAGEDOOR2, 0x5F5A14) \ X("lh_showdoor03", MI_GARAGEDOOR9) \
X("dk_waretankdoor1", MI_GARAGEDOOR3, 0x5F5A18) \ X("lh_showdoor1", MI_GARAGEDOOR10) \
X("hav_garagedoor1", MI_GARAGEDOOR4, 0x5F5A1C) \ X("lhtankdoor", MI_GARAGEDOOR11) \
X("hav_garagedoor02", MI_GARAGEDOOR5, 0x5F5A20) \ X("nbtgardoor", MI_GARAGEDOOR12) \
X("hav_garagedoor03", MI_GARAGEDOOR6, 0x5F5A24) \ X("dk_camjonesdoor", MI_GARAGEDOOR13) \
X("hav_garagedoor04", MI_GARAGEDOOR7, 0x5F5A28) \ X("nbtgardoor02", MI_GARAGEDOOR14) \
X("lh_showdoor03", MI_GARAGEDOOR9, 0x5F5A2C) \ X("dt_savedra", MI_GARAGEDOOR15) \
X("lh_showdoor1", MI_GARAGEDOOR10, 0x5F5A30) \ X("dt_savedrb", MI_GARAGEDOOR16) \
X("lhtankdoor", MI_GARAGEDOOR11, 0x5F5A34) \ X("dk_bombdoor", MI_GARAGEDOOR18) \
X("nbtgardoor", MI_GARAGEDOOR12, 0x5F5A38) \ X("haiwshpnsdoor", MI_GARAGEDOOR19) \
X("dk_camjonesdoor", MI_GARAGEDOOR13, 0x5F5A3C) \ X("wshpnsdoor", MI_GARAGEDOOR20) \
X("nbtgardoor02", MI_GARAGEDOOR14, 0x5F5A40) \ X("nbecpnsdoor", MI_GARAGEDOOR21) \
X("dt_savedra", MI_GARAGEDOOR15, 0x5F5A44) \ X("nbtgardoor03", MI_GARAGEDOOR22) \
X("dt_savedrb", MI_GARAGEDOOR16, 0x5F5A48) \ X("dt_savedrc", MI_GARAGEDOOR23) \
/*X("dk_bombdoor", MI_GARAGEDOOR17, 0x5F5A4C)*/ \ X("dt_savedrd", MI_GARAGEDOOR24) \
X("dk_bombdoor", MI_GARAGEDOOR18, 0x5F5A50) \ X("man_frntstepGD", MI_GARAGEDOOR25) \
X("haiwshpnsdoor", MI_GARAGEDOOR19, 0x5F5A54) \ X("svegrgedoor", MI_GARAGEDOOR26) \
X("wshpnsdoor", MI_GARAGEDOOR20, 0x5F5A58) \ X("barrel2", MI_NAUTICALMINE) \
X("nbecpnsdoor", MI_GARAGEDOOR21, 0x5F5A5C) \ X("briefcase", MI_BRIEFCASE) \
X("nbtgardoor03", MI_GARAGEDOOR22, 0x5F5A60) \ X("wglasssmash", MI_GLASS1) \
X("dt_savedrc", MI_GARAGEDOOR23, 0x5F5A64) \ X("glassfx_composh", MI_GLASS8) \
X("dt_savedrd", MI_GARAGEDOOR24, 0x5F5A68) \ X("barrel4", MI_EXPLODINGBARREL) \
X("man_frntstepGD", MI_GARAGEDOOR25, 0x5F5A6C) \ X("adrenaline", MI_PICKUP_ADRENALINE) \
X("svegrgedoor", MI_GARAGEDOOR26, 0x5F5A70) \ X("bodyarmour", MI_PICKUP_BODYARMOUR) \
/*X("towergaragedoor3", MI_GARAGEDOOR27, 0x5F5A74)*/ \ X("info", MI_PICKUP_INFO) \
/*X("plysve_gragedoor", MI_GARAGEDOOR28, 0x5F5A78)*/ \ X("health", MI_PICKUP_HEALTH) \
/*X("impexpsubgrgdoor", MI_GARAGEDOOR29, 0x5F5A7C)*/ \ X("bonus", MI_PICKUP_BONUS) \
/*X("Sub_sprayshopdoor", MI_GARAGEDOOR30, 0x5F5A80)*/ \ X("bribe", MI_PICKUP_BRIBE) \
/*X("ind_plyrwoor", MI_GARAGEDOOR31, 0x5F5A84)*/ \ X("killfrenzy", MI_PICKUP_KILLFRENZY) \
/*X("8ballsuburbandoor", MI_GARAGEDOOR32, 0x5F5A88)*/ \ X("camerapickup", MI_PICKUP_CAMERA) \
X("barrel2", MI_NAUTICALMINE, 0x5F5A8C) \ X("bigdollar", MI_PICKUP_REVENUE) \
X("crushercrush", MI_CRUSHERBODY, 0x5F5A90) \ X("pickupsave", MI_PICKUP_SAVEGAME) \
X("crushertop", MI_CRUSHERLID, 0x5F5A94) \ X("property_locked", MI_PICKUP_PROPERTY) \
X("donkeymag", MI_DONKEYMAG, 0x5F5A98) \ X("property_fsale", MI_PICKUP_PROPERTY_FORSALE) \
X("bullion", MI_BULLION, 0x5F5A9C) \ X("clothesp", MI_PICKUP_CLOTHES) \
X("floatpackge1", MI_FLOATPACKAGE1, 0x5F5AA0) \ X("bollardlight", MI_BOLLARDLIGHT) \
X("briefcase", MI_BRIEFCASE, 0x5F5AA4) \ X("bar_barrier10", MI_FENCE) \
X("chinabanner1", MI_CHINABANNER1, 0x5F5AA8) \ X("bar_barrier12", MI_FENCE2) \
X("chinabanner2", MI_CHINABANNER2, 0x5F5AAC) \ X("petrolpump", MI_PETROLPUMP) \
X("chinabanner3", MI_CHINABANNER3, 0x5F5AB0) \ X("washgaspump", MI_PETROLPUMP2) \
X("chinabanner4", MI_CHINABANNER4, 0x5F5AB4) \ X("bouy", MI_BUOY) \
X("iten_chinatown5", MI_CHINABANNER5, 0x5F5AB8) \ X("parktable1", MI_PARKTABLE) \
X("iten_chinatown7", MI_CHINABANNER6, 0x5F5ABC) \ X("lamppost1", MI_LAMPPOST1) \
X("iten_chinatown3", MI_CHINABANNER7, 0x5F5AC0) \ X("veg_palm04", MI_VEG_PALM01) \
X("iten_chinatown2", MI_CHINABANNER8, 0x5F5AC4) \ X("veg_palwee02", MI_VEG_PALM02) \
X("iten_chinatown4", MI_CHINABANNER9, 0x5F5AC8) \ X("veg_palmkbb11", MI_VEG_PALM03) \
X("iten_washline01", MI_CHINABANNER10, 0x5F5ACC) \ X("veg_palmkb4", MI_VEG_PALM04) \
X("iten_washline02", MI_CHINABANNER11, 0x5F5AD0) \ X("veg_palm02", MI_VEG_PALM05) \
X("iten_washline03", MI_CHINABANNER12, 0x5F5AD4) \ X("veg_palmkb3", MI_VEG_PALM06) \
X("chinalanterns", MI_CHINALANTERN, 0x5F5AD8) \ X("veg_palmbig14", MI_VEG_PALM07) \
X("glassfx1", MI_GLASS1, 0x5F5ADC) \ X("veg_palm01", MI_VEG_PALM08) \
X("glassfx2", MI_GLASS2, 0x5F5AE0) \ X("mlamppost", MI_MLAMPPOST) \
X("glassfx3", MI_GLASS3, 0x5F5AE4) \ X("roadworkbarrier1", MI_BARRIER1) \
X("glassfx4", MI_GLASS4, 0x5F5AE8) \ X("littleha_police", MI_LITTLEHA_POLICE) \
X("glassfx55", MI_GLASS5, 0x5F5AEC) \ X("telgrphpole02", MI_TELPOLE02) \
X("glassfxsub1", MI_GLASS6, 0x5F5AF0) \ X("trafficlight1", MI_TRAFFICLIGHT01) \
X("glassfxsub2", MI_GLASS7, 0x5F5AF4) \ X("parkbench1", MI_PARKBENCH) \
X("glassfx_composh", MI_GLASS8, 0x5F5AF8) \ X("plc_stinger", MI_PLC_STINGER) \
X("bridge_liftsec", MI_BRIDGELIFT, 0x5F5AFC) \ X("od_lightbeam", MI_LIGHTBEAM) \
X("bridge_liftweight", MI_BRIDGEWEIGHT, 0x5F5B00) \ X("ap_radar1_01", MI_AIRPORTRADAR) \
X("subbridge_lift", MI_BRIDGEROADSEGMENT, 0x5F5B04) \ X("rcbomb", MI_RCBOMB) \
X("barrel4", MI_EXPLODINGBARREL, 0x5F5B08) \ X("beachball", MI_BEACHBALL) \
X("flagsitaly", MI_ITALYBANNER1, 0x5F5B0C) \ X("sandcastle1", MI_SANDCASTLE1) \
X("adrenaline", MI_PICKUP_ADRENALINE, 0x5F5B10) \ X("sandcastle2", MI_SANDCASTLE2) \
X("bodyarmour", MI_PICKUP_BODYARMOUR, 0x5F5B14) \ X("jellyfish", MI_JELLYFISH) \
X("info", MI_PICKUP_INFO, 0x5F5B18) \ X("jellyfish01", MI_JELLYFISH01) \
X("health", MI_PICKUP_HEALTH, 0x5F5B1C) \ X("fish1single", MI_FISH1SINGLE) \
X("bonus", MI_PICKUP_BONUS, 0x5F5B20) \ X("fish1s", MI_FISH1S) \
X("bribe", MI_PICKUP_BRIBE, 0x5F5B24) \ X("fish2single", MI_FISH2SINGLE) \
X("killfrenzy", MI_PICKUP_KILLFRENZY, 0x5F5B28) \ X("fish2s", MI_FISH2S) \
X("camerapickup", MI_PICKUP_CAMERA, 0x5F5B2C) \ X("fish3single", MI_FISH3SINGLE) \
X("bollardlight", MI_BOLLARDLIGHT, 0x5F5B30) \ X("fish3s", MI_FISH3S) \
X("magnet", MI_MAGNET, 0x5F5B34) \ X("turtle", MI_TURTLE) \
X("streetlamp1", MI_STREETLAMP1, 0x5F5B38) \ X("dolphin", MI_DOLPHIN) \
X("streetlamp2", MI_STREETLAMP2, 0x5F5B3C) \ X("shark", MI_SHARK) \
X("railtrax_lo4b", MI_RAILTRACKS, 0x5F5B40) \ X("submarine", MI_SUBMARINE) \
X("bar_barrier10", MI_FENCE, 0x5F5B44) \ X("Esc_step", MI_ESCALATORSTEP) \
X("bar_barrier12", MI_FENCE2, 0x5F5B48) \ X("lounge_wood_up", MI_LOUNGE_WOOD_UP) \
X("petrolpump", MI_PETROLPUMP, 0x5F5B4C) \ X("lounge_towel_up", MI_LOUNGE_TOWEL_UP) \
X("bodycast", MI_BODYCAST, 0x5F5B50) \ X("lounge_wood_dn", MI_LOUNGE_WOOD_DN) \
X("backdoor", MI_BACKDOOR, 0x5F5B54) \ X("lotion", MI_LOTION) \
X("coffee", MI_COFFEE, 0x5F5B58) \ X("beachtowel01", MI_BEACHTOWEL01) \
X("bouy", MI_BUOY, 0x5F5B5C) \ X("beachtowel02", MI_BEACHTOWEL02) \
X("parktable1", MI_PARKTABLE, 0x5F5B60) \ X("beachtowel03", MI_BEACHTOWEL03) \
X("sbwy_tunl_start", MI_SUBWAY1, 0x5F5B64) \ X("beachtowel04", MI_BEACHTOWEL04) \
X("sbwy_tunl_bit", MI_SUBWAY2, 0x5F5B68) \ X("blimp_night", MI_BLIMP_NIGHT) \
X("sbwy_tunl_bend", MI_SUBWAY3, 0x5F5B6C) \ X("blimp_day", MI_BLIMP_DAY) \
X("sbwy_tunl_cstm6", MI_SUBWAY4, 0x5F5B70) \ X("yt_main_body", MI_YT_MAIN_BODY) \
X("sbwy_tunl_cstm7", MI_SUBWAY5, 0x5F5B74) \ X("yt_main_body2", MI_YT_MAIN_BODY2)
X("sbwy_tunl_cstm8", MI_SUBWAY6, 0x5F5B78) \
X("sbwy_tunl_cstm10", MI_SUBWAY7, 0x5F5B7C) \
X("sbwy_tunl_cstm9", MI_SUBWAY8, 0x5F5B80) \
X("sbwy_tunl_cstm11", MI_SUBWAY9, 0x5F5B84) \
X("sbwy_tunl_cstm1", MI_SUBWAY10, 0x5F5B88) \
X("sbwy_tunl_cstm2", MI_SUBWAY11, 0x5F5B8C) \
X("sbwy_tunl_cstm4", MI_SUBWAY12, 0x5F5B90) \
X("sbwy_tunl_cstm3", MI_SUBWAY13, 0x5F5B94) \
X("sbwy_tunl_cstm5", MI_SUBWAY14, 0x5F5B98) \
X("subplatform_n2", MI_SUBWAY15, 0x5F5B9C) \
X("suby_tunl_start", MI_SUBWAY16, 0x5F5BA0) \
X("sbwy_tunl_start2", MI_SUBWAY17, 0x5F5BA4) \
X("indy_tunl_start", MI_SUBWAY18, 0x5F5BA8) \
X("indsubway03", MI_SUBPLATFORM_IND, 0x5F5BAC) \
X("comerside_subway", MI_SUBPLATFORM_COMS, 0x5F5BB0) \
X("subplatform", MI_SUBPLATFORM_COMS2, 0x5F5BB4) \
X("subplatform_n", MI_SUBPLATFORM_COMN, 0x5F5BB8) \
X("Otherside_subway", MI_SUBPLATFORM_SUB, 0x5F5BBC) \
X("subplatform_sub", MI_SUBPLATFORM_SUB2, 0x5F5BC0) \
X("files", MI_FILES, 0x5F5BC4) \
X("property_locked", MI_PICKUP_PROPERTY, 0x0) \
X("property_fsale", MI_PICKUP_PROPERTY_FORSALE, 0x0) \
X("clothesp", MI_PICKUP_CLOTHES, 0x0) \
X("bigdollar", MI_PICKUP_REVENUE, 0x0)
#define X(name, var, addr) extern int16 var; #define X(name, var) extern int16 var;
MODELINDICES MODELINDICES
#undef X #undef X
@ -211,90 +187,10 @@ enum
MI_WFYG2 = 106, // last regular ped MI_WFYG2 = 106, // last regular ped
MI_SPECIAL01 = 109, MI_SPECIAL01 = 109,
MI_SPECIAL21 = 129, MI_SPECIAL21 = 129,
/*
MI_TAXI_D,
MI_PIMP,
MI_GANG01,
MI_GANG02,
MI_GANG03,
MI_GANG04,
MI_GANG05,
MI_GANG06,
MI_GANG07,
MI_GANG08,
MI_GANG09,
MI_GANG10,
MI_GANG11,
MI_GANG12,
MI_GANG13,
MI_GANG14,
MI_CRIMINAL01,
MI_CRIMINAL02,
MI_SPECIAL01,
MI_SPECIAL02,
MI_SPECIAL03,
MI_SPECIAL04,
MI_MALE02,
MI_MALE03,
MI_FATMALE01,
MI_FATMALE02,
MI_FEMALE01,
MI_FEMALE02,
MI_FEMALE03,
MI_FATFEMALE01,
MI_FATFEMALE02,
MI_PROSTITUTE,
MI_PROSTITUTE2,
MI_P_MAN1,
MI_P_MAN2,
MI_P_WOM1,
MI_P_WOM2,
MI_CT_MAN1,
MI_CT_MAN2,
MI_CT_WOM1,
MI_CT_WOM2,
MI_LI_MAN1,
MI_LI_MAN2,
MI_LI_WOM1,
MI_LI_WOM2,
MI_DOCKER1,
MI_DOCKER2,
MI_SCUM_MAN,
MI_SCUM_WOM,
MI_WORKER1,
MI_WORKER2,
MI_B_MAN1,
MI_B_MAN2,
MI_B_MAN3,
MI_B_WOM1,
MI_B_WOM2,
MI_B_WOM3,
MI_MOD_MAN,
MI_MOD_WOM,
MI_ST_MAN,
MI_ST_WOM,
MI_FAN_MAN1,
MI_FAN_MAN2,
MI_FAN_WOM,
MI_HOS_MAN,
MI_HOS_WOM,
MI_CONST1,
MI_CONST2,
MI_SHOPPER1,
MI_SHOPPER2,
MI_SHOPPER3,
MI_STUD_MAN,
MI_STUD_WOM,
MI_CAS_MAN,
MI_CAS_WOM,
MI_BUSKER1,
MI_BUSKER2,
MI_BUSKER3,
MI_BUSKER4,
// three more peds possible
*/
MI_FIRST_VEHICLE = 130, MI_LAST_PED = MI_SPECIAL21,
MI_FIRST_VEHICLE,
MI_LANDSTAL = MI_FIRST_VEHICLE, MI_LANDSTAL = MI_FIRST_VEHICLE,
MI_IDAHO, MI_IDAHO,
MI_STINGER, MI_STINGER,
@ -440,9 +336,8 @@ enum
MI_BODYPARTB, MI_BODYPARTB,
MI_AIRTRAIN_VLO = 257, MI_AIRTRAIN_VLO = 257,
// MI_LOPOLYGUY,
NUM_DEFAULT_MODELS = 300 // MIAMI NUM_DEFAULT_MODELS = 300
}; };
enum{ enum{
@ -462,13 +357,16 @@ IsGlass(int16 id)
} }
inline bool inline bool
IsTrafficLight(int16 id) IsStreetLight(int16 id)
{ {
return id == MI_TRAFFICLIGHTS || return id == MI_SINGLESTREETLIGHTS1 ||
id == MI_SINGLESTREETLIGHTS1 ||
id == MI_SINGLESTREETLIGHTS2 || id == MI_SINGLESTREETLIGHTS2 ||
id == MI_SINGLESTREETLIGHTS3 || id == MI_SINGLESTREETLIGHTS3 ||
id == MI_DOUBLESTREETLIGHTS; id == MI_TRAFFICLIGHTS_MIAMI ||
id == MI_TRAFFICLIGHTS_TWOVERTICAL ||
id == MI_MLAMPPOST ||
id == MI_STREETLAMP1 ||
id == MI_STREETLAMP2;
} }
inline bool inline bool
@ -477,60 +375,32 @@ IsBodyPart(int16 id)
return id == MI_BODYPARTA || id == MI_BODYPARTB; return id == MI_BODYPARTA || id == MI_BODYPARTB;
} }
// This is bad and should perhaps not be used
/*
inline bool
IsBoatModel(int16 id)
{
return id == MI_PREDATOR ||
id == MI_REEFER ||
id == MI_SPEEDER ||
id == MI_GHOST;
}
*/
inline bool inline bool
IsPedModel(int16 id) IsPedModel(int16 id)
{ {
return id >= 0 && id <= 89; return id >= MI_PLAYER && id <= MI_LAST_PED;
}
inline bool
IsPalmTreeModel(int16 id)
{
return id == MI_VEG_PALM01 ||
id == MI_VEG_PALM02 ||
id == MI_VEG_PALM03 ||
id == MI_VEG_PALM04 ||
id == MI_VEG_PALM05 ||
id == MI_VEG_PALM06 ||
id == MI_VEG_PALM07 ||
id == MI_VEG_PALM08;
} }
inline bool inline bool
IsTreeModel(int16 id) IsTreeModel(int16 id)
{ {
return id == MI_TREE1 || return id == MI_TREE2 ||
id == MI_TREE2 ||
id == MI_TREE3 || id == MI_TREE3 ||
id == MI_TREE4 ||
id == MI_TREE5 ||
id == MI_TREE6 || id == MI_TREE6 ||
id == MI_TREE7 ||
id == MI_TREE8 || id == MI_TREE8 ||
id == MI_TREE9 || IsPalmTreeModel(id);
id == MI_TREE10 ||
id == MI_TREE11 ||
id == MI_TREE12 ||
id == MI_TREE13 ||
id == MI_TREE14;
}
inline bool
IsBannerModel(int16 id)
{
return id == MI_CHINABANNER1 ||
id == MI_CHINABANNER2 ||
id == MI_CHINABANNER3 ||
id == MI_CHINABANNER4 ||
id == MI_CHINABANNER5 ||
id == MI_CHINABANNER6 ||
id == MI_CHINABANNER7 ||
id == MI_CHINABANNER8 ||
id == MI_CHINABANNER9 ||
id == MI_CHINABANNER10 ||
id == MI_CHINABANNER11 ||
id == MI_CHINABANNER12 ||
id == MI_ITALYBANNER1 ||
id == MI_CHINALANTERN;
} }
inline bool inline bool

View File

@ -14,7 +14,8 @@
#include "soundlist.h" #include "soundlist.h"
int16 CObject::nNoTempObjects; int16 CObject::nNoTempObjects;
int16 CObject::nBodyCastHealth = 1000; //int16 CObject::nBodyCastHealth = 1000;
float CObject::fDistToNearestTree;
void *CObject::operator new(size_t sz) { return CPools::GetObjectPool()->New(); } void *CObject::operator new(size_t sz) { return CPools::GetObjectPool()->New(); }
void *CObject::operator new(size_t sz, int handle) { return CPools::GetObjectPool()->New(handle);}; void *CObject::operator new(size_t sz, int handle) { return CPools::GetObjectPool()->New(handle);};
@ -161,6 +162,7 @@ CObject::ObjectDamage(float amount)
return; return;
static int8 nFrameGen = 0; static int8 nFrameGen = 0;
bool bBodyCastDamageEffect = false; bool bBodyCastDamageEffect = false;
#if 0
if (GetModelIndex() == MI_BODYCAST) { if (GetModelIndex() == MI_BODYCAST) {
if (amount > 50.0f) if (amount > 50.0f)
nBodyCastHealth = (int16)(nBodyCastHealth - 0.5f * amount); nBodyCastHealth = (int16)(nBodyCastHealth - 0.5f * amount);
@ -170,6 +172,7 @@ CObject::ObjectDamage(float amount)
bBodyCastDamageEffect = true; bBodyCastDamageEffect = true;
amount = 0.0f; amount = 0.0f;
} }
#endif
if ((amount * m_fCollisionDamageMultiplier > 150.0f || bBodyCastDamageEffect) && m_nCollisionDamageEffect) { if ((amount * m_fCollisionDamageMultiplier > 150.0f || bBodyCastDamageEffect) && m_nCollisionDamageEffect) {
const CVector& vecPos = m_matrix.GetPosition(); const CVector& vecPos = m_matrix.GetPosition();
const float fDirectionZ = 0.0002f * amount; const float fDirectionZ = 0.0002f * amount;
@ -335,9 +338,12 @@ CObject::Init(void)
m_pCurSurface = outEntity; m_pCurSurface = outEntity;
else else
m_pCurSurface = nil; m_pCurSurface = nil;
#if 0
if (GetModelIndex() == MI_BODYCAST) if (GetModelIndex() == MI_BODYCAST)
nBodyCastHealth = 1000; nBodyCastHealth = 1000;
else if (GetModelIndex() == MI_BUOY) else
#endif
if (GetModelIndex() == MI_BUOY)
bTouchingWater = true; bTouchingWater = true;
} }

View File

@ -86,7 +86,9 @@ public:
int8 m_colour1, m_colour2; int8 m_colour1, m_colour2;
static int16 nNoTempObjects; static int16 nNoTempObjects;
static int16 nBodyCastHealth; // static int16 nBodyCastHealth;
static float fDistToNearestTree;
static void *operator new(size_t); static void *operator new(size_t);
static void *operator new(size_t, int); static void *operator new(size_t, int);

View File

@ -853,18 +853,12 @@ CPopulation::ConvertToRealObject(CDummyObject *dummy)
if (!obj) if (!obj)
return; return;
bool makeInvisible;
CWorld::Remove(dummy); CWorld::Remove(dummy);
delete dummy; delete dummy;
CWorld::Add(obj); CWorld::Add(obj);
int16 mi = obj->GetModelIndex();
if (mi == MI_GLASS1 || mi == MI_GLASS2 || mi == MI_GLASS3 || mi == MI_GLASS4 ||
mi == MI_GLASS5 || mi == MI_GLASS6 || mi == MI_GLASS7 || mi == MI_GLASS8)
makeInvisible = true;
else
makeInvisible = false;
if (makeInvisible) { CSimpleModelInfo *mi = (CSimpleModelInfo*)CModelInfo::GetModelInfo(obj->GetModelIndex());
if (IsGlass(obj->GetModelIndex()) && !mi->m_isArtistGlass) {
obj->bIsVisible = false; obj->bIsVisible = false;
} else if (obj->GetModelIndex() == MI_BUOY) { } else if (obj->GetModelIndex() == MI_BUOY) {
obj->bIsStatic = false; obj->bIsStatic = false;
@ -883,17 +877,9 @@ CPopulation::ConvertToDummyObject(CObject *obj)
dummy->GetMatrix().UpdateRW(); dummy->GetMatrix().UpdateRW();
dummy->UpdateRwFrame(); dummy->UpdateRwFrame();
bool makeInvisible; CSimpleModelInfo *mi = (CSimpleModelInfo*)CModelInfo::GetModelInfo(obj->GetModelIndex());
int16 mi = obj->GetModelIndex(); if (IsGlass(obj->GetModelIndex()) && !mi->m_isArtistGlass)
if (mi == MI_GLASS1 || mi == MI_GLASS2 || mi == MI_GLASS3 || mi == MI_GLASS4 ||
mi == MI_GLASS5 || mi == MI_GLASS6 || mi == MI_GLASS7 || mi == MI_GLASS8)
makeInvisible = true;
else
makeInvisible = false;
if (makeInvisible) {
dummy->bIsVisible = false; dummy->bIsVisible = false;
}
CWorld::Remove(obj); CWorld::Remove(obj);
delete obj; delete obj;

View File

@ -4,7 +4,8 @@ enum {
EFFECT_LIGHT, EFFECT_LIGHT,
EFFECT_PARTICLE, EFFECT_PARTICLE,
EFFECT_ATTRACTOR, EFFECT_ATTRACTOR,
EFFECT_PED_ATTRACTOR EFFECT_PED_ATTRACTOR,
EFFECT_SUNGLARE
}; };
enum { enum {
@ -35,6 +36,8 @@ enum {
// same order as CPointLights flags, must start at 2 // same order as CPointLights flags, must start at 2
LIGHTFLAG_FOG_NORMAL = 2, // can have light and fog LIGHTFLAG_FOG_NORMAL = 2, // can have light and fog
LIGHTFLAG_FOG_ALWAYS = 4, // fog only LIGHTFLAG_FOG_ALWAYS = 4, // fog only
LIGHTFLAG_HIDE_OBJECT = 8, // hide the object instead of rendering light (???)
LIGHTFLAG_LONG_DIST = 16,
LIGHTFLAG_FOG = (LIGHTFLAG_FOG_NORMAL|LIGHTFLAG_FOG_ALWAYS) LIGHTFLAG_FOG = (LIGHTFLAG_FOG_NORMAL|LIGHTFLAG_FOG_ALWAYS)
}; };

View File

@ -62,8 +62,6 @@ void
CClouds::Update(void) CClouds::Update(void)
{ {
float s = Sin(TheCamera.Orientation - 0.85f); float s = Sin(TheCamera.Orientation - 0.85f);
CloudRotation += CWeather::Wind*s*0.001f;
IndividualRotation += (CWeather::Wind*CTimer::GetTimeStep()*0.5f + 0.3f) * 60.0f;
#ifdef FIX_BUGS #ifdef FIX_BUGS
CloudRotation += CWeather::Wind*s*0.001f*CTimer::GetTimeStepFix(); CloudRotation += CWeather::Wind*s*0.001f*CTimer::GetTimeStepFix();
IndividualRotation += (CWeather::Wind*CTimer::GetTimeStep()*0.5f + 0.3f*CTimer::GetTimeStepFix()) * 60.0f; IndividualRotation += (CWeather::Wind*CTimer::GetTimeStep()*0.5f + 0.3f*CTimer::GetTimeStepFix()) * 60.0f;

View File

@ -129,7 +129,8 @@ CCoronas::Update(void)
void void
CCoronas::RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha, CCoronas::RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha,
const CVector &coors, float size, float drawDist, RwTexture *tex, const CVector &coors, float size, float drawDist, RwTexture *tex,
int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle) int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle,
bool longDist, float nearDist)
{ {
int i; int i;
@ -192,11 +193,13 @@ CCoronas::RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 al
void void
CCoronas::RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha, CCoronas::RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha,
const CVector &coors, float size, float drawDist, uint8 type, const CVector &coors, float size, float drawDist, uint8 type,
int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle) int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle,
bool longDist, float nearDist)
{ {
RegisterCorona(id, red, green, blue, alpha, coors, size, drawDist, RegisterCorona(id, red, green, blue, alpha, coors, size, drawDist,
gpCoronaTexture[type], flareType, reflection, LOScheck, drawStreak, someAngle); gpCoronaTexture[type], flareType, reflection, LOScheck, drawStreak, someAngle,
longDist, nearDist);
} }
void void

View File

@ -90,10 +90,12 @@ public:
static void Update(void); static void Update(void);
static void RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha, static void RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha,
const CVector &coors, float size, float drawDist, RwTexture *tex, const CVector &coors, float size, float drawDist, RwTexture *tex,
int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle); int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle,
bool longDist = false, float nearClip = 1.5f);
static void RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha, static void RegisterCorona(uint32 id, uint8 red, uint8 green, uint8 blue, uint8 alpha,
const CVector &coors, float size, float drawDist, uint8 type, const CVector &coors, float size, float drawDist, uint8 type,
int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle); int8 flareType, uint8 reflection, uint8 LOScheck, uint8 drawStreak, float someAngle,
bool longDist = false, float nearClip = 1.5f);
static void UpdateCoronaCoors(uint32 id, const CVector &coors, float drawDist, float someAngle); static void UpdateCoronaCoors(uint32 id, const CVector &coors, float drawDist, float someAngle);
static void Render(void); static void Render(void);
static void RenderReflections(void); static void RenderReflections(void);

View File

@ -1245,9 +1245,11 @@ CRenderer::ShouldModelBeStreamed(CEntity *ent, const CVector &campos)
void void
CRenderer::RemoveVehiclePedLights(CEntity *ent, bool reset) CRenderer::RemoveVehiclePedLights(CEntity *ent, bool reset)
{ {
if(ent->bRenderScorched) if(!ent->bRenderScorched){
return; CPointLights::RemoveLightsAffectingObject();
CPointLights::RemoveLightsAffectingObject(); if(reset)
if(reset) ReSetAmbientAndDirectionalColours();
ReSetAmbientAndDirectionalColours(); }
SetAmbientColours();
DeActivateDirectional();
} }

View File

@ -0,0 +1,8 @@
#include "common.h"
#include "WindModifiers.h"
int32
CWindModifiers::FindWindModifier(CVector pos, float *x, float *y)
{
return 0;
}

View File

@ -0,0 +1,7 @@
#pragma once
class CWindModifiers
{
public:
static int32 FindWindModifier(CVector pos, float *x, float *y);
};

View File

@ -2192,6 +2192,7 @@ CAutomobile::ProcessEntityCollision(CEntity *ent, CColPoint *colpoints)
phys->RegisterReference((CEntity**)&m_aGroundPhysical[i]); phys->RegisterReference((CEntity**)&m_aGroundPhysical[i]);
m_aGroundOffset[i] = m_aWheelColPoints[i].point - phys->GetPosition(); m_aGroundOffset[i] = m_aWheelColPoints[i].point - phys->GetPosition();
#if 0
if(phys->GetModelIndex() == MI_BODYCAST && GetStatus() == STATUS_PLAYER){ if(phys->GetModelIndex() == MI_BODYCAST && GetStatus() == STATUS_PLAYER){
// damage body cast // damage body cast
float speed = m_vecMoveSpeed.MagnitudeSqr(); float speed = m_vecMoveSpeed.MagnitudeSqr();
@ -2208,6 +2209,7 @@ CAutomobile::ProcessEntityCollision(CEntity *ent, CColPoint *colpoints)
phys->AddToMovingList(); phys->AddToMovingList();
} }
} }
#endif
} }
m_nSurfaceTouched = m_aWheelColPoints[i].surfaceB; m_nSurfaceTouched = m_aWheelColPoints[i].surfaceB;

View File

@ -88,6 +88,7 @@ void CCranes::AddThisOneCrane(CEntity* pEntity)
if (pCrane->m_nAudioEntity >= 0) if (pCrane->m_nAudioEntity >= 0)
DMAudio.SetEntityStatus(pCrane->m_nAudioEntity, 1); DMAudio.SetEntityStatus(pCrane->m_nAudioEntity, 1);
pCrane->m_bIsTop = (MODELID_CRANE_1 != pEntity->GetModelIndex()); pCrane->m_bIsTop = (MODELID_CRANE_1 != pEntity->GetModelIndex());
#if 0
// Is this used to avoid military crane? // Is this used to avoid military crane?
if (pCrane->m_bIsTop || pEntity->GetPosition().y > 0.0f) { if (pCrane->m_bIsTop || pEntity->GetPosition().y > 0.0f) {
CObject* pHook = new CObject(MI_MAGNET, false); CObject* pHook = new CObject(MI_MAGNET, false);
@ -100,6 +101,7 @@ void CCranes::AddThisOneCrane(CEntity* pEntity)
pCrane->SetHookMatrix(); pCrane->SetHookMatrix();
} }
else else
#endif
pCrane->m_pHook = nil; pCrane->m_pHook = nil;
NumCranes++; NumCranes++;
} }

View File

@ -4,6 +4,8 @@
#include "FileMgr.h" #include "FileMgr.h"
#include "HandlingMgr.h" #include "HandlingMgr.h"
//--MIAMI: done
cHandlingDataMgr mod_HandlingManager; cHandlingDataMgr mod_HandlingManager;
const char *HandlingFilename = "HANDLING.CFG"; const char *HandlingFilename = "HANDLING.CFG";