From 03ef438a7283fde341cc4938936ba882c3609993 Mon Sep 17 00:00:00 2001 From: "Walied K. Yassen" Date: Sun, 29 Nov 2020 04:20:28 +0200 Subject: Fix CObject::DeleteAllTempObjectsInArea not considering the given point --- src/objects/Object.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/objects/Object.cpp b/src/objects/Object.cpp index 93b6d581..2319c0d9 100644 --- a/src/objects/Object.cpp +++ b/src/objects/Object.cpp @@ -515,7 +515,8 @@ CObject::DeleteAllTempObjectsInArea(CVector point, float fRadius) CObjectPool *objectPool = CPools::GetObjectPool(); for (int32 i = 0; i < objectPool->GetSize(); i++) { CObject *pObject = objectPool->GetSlot(i); - if (pObject && pObject->ObjectCreatedBy == TEMP_OBJECT && fRadius * fRadius > pObject->GetPosition().MagnitudeSqr()) { + CVector dist = point - pObject->GetPosition(); + if (pObject && pObject->ObjectCreatedBy == TEMP_OBJECT && dist.MagnitudeSqr() < fRadius * fRadius) { CWorld::Remove(pObject); delete pObject; } -- cgit v1.2.3 From afe70003f4c48683c287ca3d16662cc710f8602e Mon Sep 17 00:00:00 2001 From: "Walied K. Yassen" Date: Sun, 29 Nov 2020 08:52:43 +0200 Subject: Fix MI_RCBOMB gravity force and treat MI_PETROLPUMP2 as explosive --- src/objects/Object.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/objects/Object.cpp b/src/objects/Object.cpp index 2319c0d9..9322418f 100644 --- a/src/objects/Object.cpp +++ b/src/objects/Object.cpp @@ -107,7 +107,8 @@ CObject::ProcessControl(void) m_vecMoveSpeed *= fTimeStep; m_vecTurnSpeed *= fTimeStep; } - if ((GetModelIndex() == MI_EXPLODINGBARREL || GetModelIndex() == MI_PETROLPUMP) && bHasBeenDamaged && bIsVisible + auto mi = GetModelIndex(); + if ((mi == MI_EXPLODINGBARREL || mi == MI_PETROLPUMP || mi == MI_PETROLPUMP2) && bHasBeenDamaged && bIsVisible && (CGeneral::GetRandomNumber() & 0x1F) == 10) { bExplosionProof = true; bIsVisible = false; @@ -115,6 +116,13 @@ CObject::ProcessControl(void) bAffectedByGravity = false; m_vecMoveSpeed = CVector(0.0f, 0.0f, 0.0f); } + if (mi == MI_RCBOMB) { + float fTurnForce = -(m_fTurnMass / 20.0f); + CPhysical::ApplyTurnForce(m_vecMoveSpeed * fTurnForce, -GetForward()); + float fScalar = 1.0f - m_vecMoveSpeed.MagnitudeSqr() / 5.0f; + float fScalarTimed = Pow(fScalar, CTimer::GetTimeStep()); + m_vecMoveSpeed *= fScalarTimed; + } } void -- cgit v1.2.3 From a1ab82b1887a9d2bf8d64b2223c0f135e1403a1d Mon Sep 17 00:00:00 2001 From: "Walied K. Yassen" Date: Sun, 29 Nov 2020 09:14:15 +0200 Subject: Implement MI_BEACHBALL behaviours --- src/core/General.h | 5 +++++ src/objects/Object.cpp | 53 ++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/core/General.h b/src/core/General.h index 7e06b96e..52850794 100644 --- a/src/core/General.h +++ b/src/core/General.h @@ -159,6 +159,11 @@ public: static int32 GetRandomNumberInRange(int32 low, int32 high) { return low + (high - low)*(GetRandomNumber()/float(MYRAND_MAX + 1)); } + + // Returns inclusive value in the specified range + static int32 GetRandomNumberInRangeInc(int32 low, int32 high) + { return GetRandomNumberInRange(low - 1, high + 1); } + static void SetRandomSeed(int32 seed) { mysrand(seed); } }; diff --git a/src/objects/Object.cpp b/src/objects/Object.cpp index 9322418f..c5365920 100644 --- a/src/objects/Object.cpp +++ b/src/objects/Object.cpp @@ -14,6 +14,8 @@ #include "soundlist.h" #include "WaterLevel.h" #include "Timecycle.h" +#include "Stats.h" +#include "SpecialFX.h" int16 CObject::nNoTempObjects; //int16 CObject::nBodyCastHealth = 1000; @@ -91,9 +93,9 @@ CObject::~CObject(void) nNoTempObjects--; } -void -CObject::ProcessControl(void) -{ +void +CObject::ProcessControl(void) +{ CVector point, impulse; if (m_nCollisionDamageEffect) ObjectDamage(m_fDamageImpulse); @@ -118,11 +120,54 @@ CObject::ProcessControl(void) } if (mi == MI_RCBOMB) { float fTurnForce = -(m_fTurnMass / 20.0f); - CPhysical::ApplyTurnForce(m_vecMoveSpeed * fTurnForce, -GetForward()); + CPhysical::ApplyTurnForce(m_vecMoveSpeed * fTurnForce, -GetForward()); float fScalar = 1.0f - m_vecMoveSpeed.MagnitudeSqr() / 5.0f; float fScalarTimed = Pow(fScalar, CTimer::GetTimeStep()); m_vecMoveSpeed *= fScalarTimed; } + if (mi == MI_BEACHBALL) { + constexpr uint8 BEACHBALL_MAX_SCORE = 250; + constexpr float BEACHBALL_DEACCELERATION = 2.5f; + float fMoveSpeedMag = m_vecMoveSpeed.Magnitude2D(); + float fTimeScale = powf(0.95, CTimer::GetTimeStep()); + m_vecMoveSpeed.x *= fTimeScale; + m_vecMoveSpeed.y *= fTimeScale; + m_vecMoveSpeed.z += fMoveSpeedMag - m_vecMoveSpeed.Magnitude2D(); + if (!FindPlayerVehicle()) { + CVector distance = FindPlayerCoors() - GetPosition(); + float distanceMagnitude = distance.Magnitude2D(); + if (distance.z > 0.0 && distance.z < 1.5f && distanceMagnitude < 1.0) { + CVector playerSpeed = FindPlayerSpeed(); + if (fMoveSpeedMag < 0.05 && playerSpeed.Magnitude() > 0.1) { + playerSpeed.z = 0.0f; + playerSpeed.Normalise(); + playerSpeed.z = 0.3; + m_vecMoveSpeed = CVector(playerSpeed.x / BEACHBALL_DEACCELERATION, playerSpeed.y / BEACHBALL_DEACCELERATION, 1.0f / BEACHBALL_DEACCELERATION * 0.3); + PlayOneShotScriptObject(SCRIPT_SOUND_HIT_BALL, GetPosition()); + if (m_nBeachballBounces > 0) { + m_nBeachballBounces++; + sprintf(gString, "%d", m_nBeachballBounces); + CMoneyMessages::RegisterOne(GetPosition(), gString, 255, 50, 0, 0.6f, 0.5f); + CStats::RegisterHighestScore(3, m_nBeachballBounces); + } + } + } + if (distance.z > -1.05 && distance.z < -0.6 && distanceMagnitude < 0.9 && m_vecMoveSpeed.z < 0.0f) { + m_vecMoveSpeed.x += CGeneral::GetRandomNumberInRangeInc(-3, 4) / 100.0; + m_vecMoveSpeed.y += CGeneral::GetRandomNumberInRangeInc(-3, 4) / 100.0; + m_vecMoveSpeed.z = Max(m_vecMoveSpeed.z + 0.3f, 0.2f); + PlayOneShotScriptObject(SCRIPT_SOUND_HIT_BALL, GetPosition()); + m_vecTurnSpeed.x += CGeneral::GetRandomNumberInRangeInc(-7, 8) / 10.0f; + m_vecTurnSpeed.y += CGeneral::GetRandomNumberInRangeInc(-7, 8) / 10.0f; + if (++m_nBeachballBounces >= BEACHBALL_MAX_SCORE) { + m_nBeachballBounces = BEACHBALL_MAX_SCORE; + } + sprintf(gString, "%d", m_nBeachballBounces); + CMoneyMessages::RegisterOne(GetPosition(), gString, 255, 50, 0, 0.6f, 0.5f); + CStats::RegisterHighestScore(3, m_nBeachballBounces); + } + } + } } void -- cgit v1.2.3 From ac7ea2b9fafca17900a9106c85dbbdb3b508c175 Mon Sep 17 00:00:00 2001 From: "Walied K. Yassen" Date: Mon, 30 Nov 2020 02:09:35 +0200 Subject: Implement the missing damage effects and fix the existing ones --- src/objects/Object.cpp | 458 ++++++++++++++++++++++++++++++++++--------------- src/objects/Object.h | 12 +- 2 files changed, 326 insertions(+), 144 deletions(-) (limited to 'src') diff --git a/src/objects/Object.cpp b/src/objects/Object.cpp index c5365920..42021054 100644 --- a/src/objects/Object.cpp +++ b/src/objects/Object.cpp @@ -21,10 +21,10 @@ int16 CObject::nNoTempObjects; //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, int handle) { return CPools::GetObjectPool()->New(handle);}; -void CObject::operator delete(void *p, size_t sz) { CPools::GetObjectPool()->Delete((CObject*)p); } -void CObject::operator delete(void *p, int handle) { CPools::GetObjectPool()->Delete((CObject*)p); } +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 delete(void* p, size_t sz) { CPools::GetObjectPool()->Delete((CObject*)p); } +void CObject::operator delete(void* p, int handle) { CPools::GetObjectPool()->Delete((CObject*)p); } CObject::CObject(void) { @@ -35,8 +35,8 @@ CObject::CObject(void) m_bCameraToAvoidThisObject = false; ObjectCreatedBy = UNKNOWN_OBJECT; m_nEndOfLifeTime = 0; -// m_nRefModelIndex = -1; // duplicate -// bUseVehicleColours = false; // duplicate + // m_nRefModelIndex = -1; // duplicate + // bUseVehicleColours = false; // duplicate m_colour2 = 0; m_colour1 = m_colour2; m_nBonusValue = 0; @@ -49,7 +49,7 @@ CObject::CObject(void) bHasBeenDamaged = false; m_nRefModelIndex = -1; bUseVehicleColours = false; -// bIsStreetLight = false; // duplicate + // bIsStreetLight = false; // duplicate m_pCurSurface = nil; m_pCollidingEntity = nil; m_nBeachballBounces = 0; @@ -66,7 +66,7 @@ CObject::CObject(int32 mi, bool createRW) Init(); } -CObject::CObject(CDummyObject *dummy) +CObject::CObject(CDummyObject* dummy) { SetModelIndexNoCreate(dummy->GetModelIndex()); @@ -86,10 +86,10 @@ CObject::~CObject(void) { CRadar::ClearBlipForEntity(BLIP_OBJECT, CPools::GetObjectPool()->GetIndex(this)); - if(m_nRefModelIndex != -1) + if (m_nRefModelIndex != -1) CModelInfo::GetModelInfo(m_nRefModelIndex)->RemoveRef(); - if(ObjectCreatedBy == TEMP_OBJECT && nNoTempObjects != 0) + if (ObjectCreatedBy == TEMP_OBJECT && nNoTempObjects != 0) nNoTempObjects--; } @@ -170,9 +170,9 @@ CObject::ProcessControl(void) } } -void +void CObject::Teleport(CVector vecPos) -{ +{ CWorld::Remove(this); m_matrix.GetPosition() = vecPos; m_matrix.UpdateRW(); @@ -187,7 +187,7 @@ CObject::Render(void) return; if (m_nRefModelIndex != -1 && ObjectCreatedBy == TEMP_OBJECT && bUseVehicleColours) { - CVehicleModelInfo *mi = (CVehicleModelInfo*)CModelInfo::GetModelInfo(m_nRefModelIndex); + CVehicleModelInfo* mi = (CVehicleModelInfo*)CModelInfo::GetModelInfo(m_nRefModelIndex); assert(mi->GetModelType() == MITYPE_VEHICLE); mi->SetVehicleColour(m_colour1, m_colour2); } @@ -298,13 +298,15 @@ CObject::Render(void) bool CObject::SetupLighting(void) { - if(bRenderScorched){ + if (bRenderScorched) { WorldReplaceNormalLightsWithScorched(Scene.world, 0.1f); return true; - } else if (bIsPickup) { + } + else if (bIsPickup) { SetFullAmbient(); return true; - } else if (bIsWeapon) { + } + else if (bIsWeapon) { ActivateDirectional(); SetAmbientColoursForPedsCarsAndObjects(); return true; @@ -315,14 +317,14 @@ CObject::SetupLighting(void) void CObject::RemoveLighting(bool reset) { - if(reset) { + if (reset) { SetAmbientColours(); DeActivateDirectional(); } } -void -CObject::ObjectDamage(float amount) +void +CObject::ObjectDamage(float amount) { if (!m_nCollisionDamageEffect || !bUsesCollision) return; @@ -344,128 +346,308 @@ CObject::ObjectDamage(float amount) const float fDirectionZ = 0.0002f * amount; switch (m_nCollisionDamageEffect) { - case DAMAGE_EFFECT_CHANGE_MODEL: - bRenderDamaged = true; - break; - case DAMAGE_EFFECT_SPLIT_MODEL: - break; - case DAMAGE_EFFECT_SMASH_COMPLETELY: - bIsVisible = false; - bUsesCollision = false; - SetIsStatic(true); - bExplosionProof = true; - SetMoveSpeed(0.0f, 0.0f, 0.0f); - SetTurnSpeed(0.0f, 0.0f, 0.0f); - break; - case DAMAGE_EFFECT_CHANGE_THEN_SMASH: - if (!bRenderDamaged) { + case DAMAGE_EFFECT_CHANGE_MODEL: bRenderDamaged = true; + return; + case DAMAGE_EFFECT_SPLIT_MODEL: + return; + case DAMAGE_EFFECT_SMASH_AND_DAMAGE_TRAFFICLIGHTS: { + static RwRGBA debrisColor = { 0xc8,0xc8,0xc8,0xff }; + if (bRenderDamaged) { + break; + } + bRenderDamaged = true; + CBaseModelInfo* modelInfo = CModelInfo::GetModelInfo(GetModelIndex()); + CVector min = modelInfo->GetColModel()->boundingBox.min * 0.85f; + CVector max = modelInfo->GetColModel()->boundingBox.max * 0.85f; + min.z = max.z; + min = GetMatrix() * min; + max = GetMatrix() * max; + CVector temp = (max - min) * 0.02; + + for (int32 i = 0; i < 50; i++) { + float fDirX = CGeneral::GetRandomNumberInRange(-0.35f, 0.35f); + float fDirY = CGeneral::GetRandomNumberInRange(-0.35f, 0.35f); + float fDirZ = CGeneral::GetRandomNumberInRange(0.10f, 0.25f); + ++nFrameGen; + int32 currentFrame = nFrameGen & 3; + CVector pos = min + temp * (float)i; + CVector dir = CVector(fDirX, fDirY, fDirZ); + float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); + float fColorFactor = CGeneral::GetRandomNumberInRange(0.6f, 1.2f); + RwRGBA color = debrisColor; + color.red *= fColorFactor; + color.green *= fColorFactor; + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-0.40f, 0.40f); + CParticle::AddParticle(PARTICLE_CAR_DEBRIS, pos, dir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0); + } + PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, min); + break; } - else { + case DAMAGE_EFFECT_SMASH_COMPLETELY: + case DAMAGE_EFFECT_CHANGE_THEN_SMASH: { + if (m_nCollisionDamageEffect == DAMAGE_EFFECT_CHANGE_THEN_SMASH && !bRenderDamaged) { + bRenderDamaged = true; + return; + } bIsVisible = false; bUsesCollision = false; + if (!GetIsStatic()) { + RemoveFromMovingList(); + } SetIsStatic(true); bExplosionProof = true; SetMoveSpeed(0.0f, 0.0f, 0.0f); SetTurnSpeed(0.0f, 0.0f, 0.0f); + break; } - break; - case DAMAGE_EFFECT_SMASH_CARDBOARD_COMPLETELY: { - bIsVisible = false; - bUsesCollision = false; - SetIsStatic(true); - bExplosionProof = true; - SetMoveSpeed(0.0f, 0.0f, 0.0f); - SetTurnSpeed(0.0f, 0.0f, 0.0f); - const RwRGBA color = { 96, 48, 0, 255 }; - for (int32 i = 0; i < 25; i++) { - CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f), - CGeneral::GetRandomNumberInRange(-0.35f, 0.7f), - CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ); - ++nFrameGen; - int32 currentFrame = nFrameGen & 3; - float fRandom = CGeneral::GetRandomNumberInRange(0.01f, 1.0f); - RwRGBA randomColor = { uint8(color.red * fRandom), uint8(color.green * fRandom) , color.blue, color.alpha }; - float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80); - CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0); + case DAMAGE_EFFECT_SMASH_CARDBOARD_COMPLETELY: + case DAMAGE_EFFECT_SMASH_YELLOW_TARGET_COMPLETELY: { + bIsVisible = false; + bUsesCollision = false; + if (!GetIsStatic()) { + RemoveFromMovingList(); + } + SetIsStatic(true); + bExplosionProof = true; + SetMoveSpeed(0.0f, 0.0f, 0.0f); + SetTurnSpeed(0.0f, 0.0f, 0.0f); + const RwRGBA color = { 96, 48, 0, 255 }; + for (int32 i = 0; i < 25; i++) { + CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ); + ++nFrameGen; + int32 currentFrame = nFrameGen & 3; + float fRandom = CGeneral::GetRandomNumberInRange(0.01f, 1.0f); + RwRGBA randomColor = color; + if (m_nCollisionDamageEffect == DAMAGE_EFFECT_SMASH_CARDBOARD_COMPLETELY) { + randomColor.red *= fRandom; + randomColor.green *= fRandom; + randomColor.blue *= fRandom; + } + else { + randomColor.red = 0xff; + randomColor.blue = 0xfc; + } + float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0); + } + PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_2, vecPos); + break; } - PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_2, vecPos); - break; - } - case DAMAGE_EFFECT_SMASH_WOODENBOX_COMPLETELY: { - bIsVisible = false; - bUsesCollision = false; - SetIsStatic(true); - bExplosionProof = true; - SetMoveSpeed(0.0f, 0.0f, 0.0f); - SetTurnSpeed(0.0f, 0.0f, 0.0f); - const RwRGBA color = { 128, 128, 128, 255 }; - for (int32 i = 0; i < 45; i++) { - CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f), - CGeneral::GetRandomNumberInRange(-0.35f, 0.7f), - CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ); - ++nFrameGen; - int32 currentFrame = nFrameGen & 3; - float fRandom = CGeneral::GetRandomNumberInRange(0.5f, 0.5f); - RwRGBA randomColor = { uint8(color.red * fRandom), uint8(color.green * fRandom), uint8(color.blue * fRandom), color.alpha }; - float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80); - CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0); + case DAMAGE_EFFECT_SMASH_WOODENBOX_COMPLETELY: { + bIsVisible = false; + bUsesCollision = false; + if (!GetIsStatic()) { + RemoveFromMovingList(); + } + SetIsStatic(true); + bExplosionProof = true; + SetMoveSpeed(0.0f, 0.0f, 0.0f); + SetTurnSpeed(0.0f, 0.0f, 0.0f); + static const RwRGBA color = { 128, 128, 128, 255 }; + CVector position = GetPosition(); + for (int32 i = 0; i < 45; i++) { + CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ); + ++nFrameGen; + int32 currentFrame = nFrameGen & 3; + float fRandom = CGeneral::GetRandomNumberInRange(0.5f, 1.0f); + RwRGBA randomColor = { uint8(color.red * fRandom), uint8(color.green * fRandom), uint8(color.blue * fRandom), color.alpha }; + float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0); + } + PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_1, vecPos); + break; } - PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_1, vecPos); - break; - } - case DAMAGE_EFFECT_SMASH_TRAFFICCONE_COMPLETELY: { - bIsVisible = false; - bUsesCollision = false; - SetIsStatic(true); - bExplosionProof = true; - SetMoveSpeed(0.0f, 0.0f, 0.0f); - SetTurnSpeed(0.0f, 0.0f, 0.0f); - const RwRGBA color1 = { 200, 0, 0, 255 }; - const RwRGBA color2 = { 200, 200, 200, 255 }; - for (int32 i = 0; i < 10; i++) { - CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f), - CGeneral::GetRandomNumberInRange(-0.35f, 0.7f), - CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ); - ++nFrameGen; - int32 currentFrame = nFrameGen & 3; - RwRGBA color = color2; - if (nFrameGen & 1) - color = color1; - float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80); - CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0); + case DAMAGE_EFFECT_SMASH_TRAFFICCONE_COMPLETELY: + case DAMAGE_EFFECT_BURST_BEACHBALL: { + bIsVisible = false; + bUsesCollision = false; + if (!GetIsStatic()) { + RemoveFromMovingList(); + } + SetIsStatic(true); + bExplosionProof = true; + SetMoveSpeed(0.0f, 0.0f, 0.0f); + SetTurnSpeed(0.0f, 0.0f, 0.0f); + const RwRGBA color1 = { 200, 0, 0, 255 }; + const RwRGBA color2 = { 200, 200, 200, 255 }; + for (int32 i = 0; i < 10; i++) { + CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ); + ++nFrameGen; + int32 currentFrame = nFrameGen & 3; + RwRGBA color = color2; + if (nFrameGen & 1) + color = color1; + float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0); + } + if (m_nCollisionDamageEffect == DAMAGE_EFFECT_BURST_BEACHBALL) { + PlayOneShotScriptObject(SCRIPT_SOUND_HIT_BALL, vecPos); + } + else { + PlayOneShotScriptObject(SCRIPT_SOUND_TIRE_COLLISION, vecPos); + } + break; } - PlayOneShotScriptObject(SCRIPT_SOUND_TIRE_COLLISION, vecPos); - break; - } - case DAMAGE_EFFECT_SMASH_BARPOST_COMPLETELY: { - bIsVisible = false; - bUsesCollision = false; - SetIsStatic(true); - bExplosionProof = true; - SetMoveSpeed(0.0f, 0.0f, 0.0f); - SetTurnSpeed(0.0f, 0.0f, 0.0f); - const RwRGBA color1 = { 200, 0, 0, 255 }; - const RwRGBA color2 = { 200, 200, 200, 255 }; - for (int32 i = 0; i < 32; i++) { - CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.7f), - CGeneral::GetRandomNumberInRange(-0.35f, 0.7f), - CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ); - ++nFrameGen; - int32 currentFrame = nFrameGen & 3; - RwRGBA color = color2; - if (nFrameGen & 1) - color = color1; - float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.18f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 80); - CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0); + case DAMAGE_EFFECT_SMASH_BARPOST_COMPLETELY: { + bIsVisible = false; + bUsesCollision = false; + if (!GetIsStatic()) { + RemoveFromMovingList(); + } + SetIsStatic(true); + bExplosionProof = true; + SetMoveSpeed(0.0f, 0.0f, 0.0f); + SetTurnSpeed(0.0f, 0.0f, 0.0f); + const RwRGBA color1 = { 200, 0, 0, 255 }; + const RwRGBA color2 = { 200, 200, 200, 255 }; + SetMoveSpeed(0.0f, 0.0f, 0.0f); + SetTurnSpeed(0.0f, 0.0f, 0.0f); + for (int32 i = 0; i < 32; i++) { + CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ); + ++nFrameGen; + int32 currentFrame = nFrameGen & 3; + const RwRGBA& color = nFrameGen & 1 ? color1 : color2; + float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0); + } + PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, vecPos); + break; } - PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, vecPos); - break; - } + case DAMAGE_EFFECT_SMASH_NEWSTANDNEW1: + case DAMAGE_EFFECT_SMASH_NEWSTANDNEW2: + case DAMAGE_EFFECT_SMASH_NEWSTANDNEW3: + case DAMAGE_EFFECT_SMASH_NEWSTANDNEW4: + case DAMAGE_EFFECT_SMASH_NEWSTANDNEW5: { + bIsVisible = false; + bUsesCollision = false; + if (!GetIsStatic()) { + RemoveFromMovingList(); + } + SetIsStatic(true); + bExplosionProof = true; + SetMoveSpeed(0.0f, 0.0f, 0.0f); + SetTurnSpeed(0.0f, 0.0f, 0.0f); + CRGBA possibleColor1; + CRGBA possibleColor2; + switch (m_nCollisionDamageEffect) { + case DAMAGE_EFFECT_SMASH_NEWSTANDNEW1: + possibleColor1 = CRGBA(0xC0, 0x3E, 0xC, 0xFF); + possibleColor2 = possibleColor1; + break; + case DAMAGE_EFFECT_SMASH_NEWSTANDNEW2: + possibleColor1 = CRGBA(0xA3, 0x36, 0x21, 0xFF); + possibleColor2 = possibleColor1; + break; + case DAMAGE_EFFECT_SMASH_NEWSTANDNEW3: + possibleColor1 = CRGBA(0x12, 0x31, 0x24, 0xFF); + possibleColor2 = possibleColor1; + break; + case DAMAGE_EFFECT_SMASH_NEWSTANDNEW4: + possibleColor1 = CRGBA(0xC0, 0xC8, 0xBE, 0xFF); + possibleColor2 = CRGBA(0x10, 0x57, 0x85, 0xFF); + break; + case DAMAGE_EFFECT_SMASH_NEWSTANDNEW5: + possibleColor1 = CRGBA(0xD0, 0x94, 0x1B, 0xFF); + possibleColor2 = possibleColor1; + break; + } + for (int32 i = 0; i < 16; i++) { + CVector vecDir( + CGeneral::GetRandomNumberInRange(-0.35f, 0.7f), + CGeneral::GetRandomNumberInRange(-0.35f, 0.7f), + CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ + ); + float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + nFrameGen++; + int32 nCurFrame = nFrameGen & 0x3; + CRGBA& selectedColor = nFrameGen & 0x1 ? possibleColor1 : possibleColor2; + CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, selectedColor, nRotationSpeed, 0, nCurFrame, 0); + if ((i % 7) == 0) + { + static CRGBA secondParticleColors[4] = { + CRGBA(0xA0, 0x60, 0x60, 0xFF), + CRGBA(0x60, 0xA0, 0x60, 0xFF), + CRGBA(0x60, 0x60, 0xA0, 0xFF), + CRGBA(0xA0, 0xA0, 0xA0, 0xFF) + }; + vecDir *= 0.5f; + CRGBA& secondParticleColor = secondParticleColors[nFrameGen & 3]; + int32 nSecondRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + CParticle::AddParticle(PARTICLE_DEBRIS, vecPos, vecDir, nil, 0.1f, secondParticleColor, nSecondRotationSpeed, 0, 1, 0); + } + } + PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, vecPos); + break; + } + case DAMAGE_EFFECT_SMASH_BLACKBAG: + case DAMAGE_EFFECT_SMASH_BEACHLOUNGE_WOOD: + case DAMAGE_EFFECT_SMASH_BEACHLOUNGE_TOWEL: { + bIsVisible = false; + bUsesCollision = false; + if (!GetIsStatic()) { + RemoveFromMovingList(); + } + SetIsStatic(true); + bExplosionProof = true; + SetMoveSpeed(0.0f, 0.0f, 0.0f); + SetTurnSpeed(0.0f, 0.0f, 0.0f); + CRGBA possibleColor1; + CRGBA possibleColor2; + switch (m_nCollisionDamageEffect) + { + case DAMAGE_EFFECT_SMASH_BLACKBAG: + possibleColor1 = CRGBA(0, 0, 0, 0xFF); + possibleColor2 = possibleColor1; + break; + case DAMAGE_EFFECT_SMASH_BEACHLOUNGE_WOOD: + possibleColor1 = CRGBA(0x8F, 0x8A, 0x8C, 0xFF); + possibleColor2 = CRGBA(0x73, 0x75, 0x7B, 0xFF); + break; + case DAMAGE_EFFECT_SMASH_BEACHLOUNGE_TOWEL: + possibleColor1 = CRGBA(0x52, 0x92, 0x4A, 0xFF); + possibleColor2 = CRGBA(0xCE, 0xCF, 0xCE, 0xFF); + break; + } + for (int32 i = 0; i < 16; i++) { + CVector vecDir( + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ + ); + nFrameGen++; + int32 nCurFrame = nFrameGen & 3; + CRGBA& selectedColor = nFrameGen & 1 ? possibleColor1 : possibleColor2; + float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, selectedColor, nRotationSpeed, 0, nCurFrame, 0); + } + if (m_nCollisionDamageEffect == DAMAGE_EFFECT_SMASH_BLACKBAG) + { + PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_2, vecPos); + } + else if (m_nCollisionDamageEffect == DAMAGE_EFFECT_SMASH_BEACHLOUNGE_WOOD) + { + PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, vecPos); + } + break; + } + default: + DEV("Unhandled collision damage effect id: %d\n", m_nCollisionDamageEffect); + return; } } } @@ -477,9 +659,9 @@ CObject::RefModelInfo(int32 modelId) CModelInfo::GetModelInfo(modelId)->AddRef(); } -void -CObject::Init(void) -{ +void +CObject::Init(void) +{ m_type = ENTITY_TYPE_OBJECT; CObjectData::SetObjectData(GetModelIndex(), *this); m_nEndOfLifeTime = 0; @@ -510,7 +692,7 @@ CObject::Init(void) if (GetModelIndex() == MI_BUOY) bTouchingWater = true; - if(CModelInfo::GetModelInfo(GetModelIndex())->GetModelType() == MITYPE_WEAPON) + if (CModelInfo::GetModelInfo(GetModelIndex())->GetModelType() == MITYPE_WEAPON) bIsWeapon = true; bIsStreetLight = IsLightObject(GetModelIndex()); @@ -549,8 +731,8 @@ CObject::DeleteAllMissionObjects() } } -void -CObject::DeleteAllTempObjects() +void +CObject::DeleteAllTempObjects() { CObjectPool* objectPool = CPools::GetObjectPool(); for (int32 i = 0; i < objectPool->GetSize(); i++) { @@ -562,12 +744,12 @@ CObject::DeleteAllTempObjects() } } -void -CObject::DeleteAllTempObjectsInArea(CVector point, float fRadius) +void +CObject::DeleteAllTempObjectsInArea(CVector point, float fRadius) { - CObjectPool *objectPool = CPools::GetObjectPool(); + CObjectPool* objectPool = CPools::GetObjectPool(); for (int32 i = 0; i < objectPool->GetSize(); i++) { - CObject *pObject = objectPool->GetSlot(i); + CObject* pObject = objectPool->GetSlot(i); CVector dist = point - pObject->GetPosition(); if (pObject && pObject->ObjectCreatedBy == TEMP_OBJECT && dist.MagnitudeSqr() < fRadius * fRadius) { CWorld::Remove(pObject); diff --git a/src/objects/Object.h b/src/objects/Object.h index bc74b58b..80f3b4a1 100644 --- a/src/objects/Object.h +++ b/src/objects/Object.h @@ -32,23 +32,23 @@ enum CollisionDamageEffect DAMAGE_EFFECT_CHANGE_THEN_SMASH, DAMAGE_EFFECT_SMASH_CARDBOARD_COMPLETELY = 50, - DAMAGE_EFFECT_SMASH_YELLOW_TARGET_COMPLETELY, + DAMAGE_EFFECT_SMASH_YELLOW_TARGET_COMPLETELY = 51, DAMAGE_EFFECT_SMASH_WOODENBOX_COMPLETELY = 60, DAMAGE_EFFECT_SMASH_TRAFFICCONE_COMPLETELY = 70, DAMAGE_EFFECT_SMASH_BARPOST_COMPLETELY = 80, DAMAGE_EFFECT_SMASH_NEWSTANDNEW1 = 91, - DAMAGE_EFFECT_SMASH_NEWSTANDNEW21, - DAMAGE_EFFECT_SMASH_NEWSTANDNEW31, - DAMAGE_EFFECT_SMASH_NEWSTANDNEW41, - DAMAGE_EFFECT_SMASH_NEWSTANDNEW51, + DAMAGE_EFFECT_SMASH_NEWSTANDNEW2 = 92, + DAMAGE_EFFECT_SMASH_NEWSTANDNEW3 = 93, + DAMAGE_EFFECT_SMASH_NEWSTANDNEW4 = 94, + DAMAGE_EFFECT_SMASH_NEWSTANDNEW5 = 95, DAMAGE_EFFECT_SMASH_BLACKBAG = 100, DAMAGE_EFFECT_SMASH_VEGPALM = 110, DAMAGE_EFFECT_BURST_BEACHBALL = 120, DAMAGE_EFFECT_SMASH_BEACHLOUNGE_WOOD = 131, - DAMAGE_EFFECT_SMASH_BEACHLOUNGE_TOWEL, + DAMAGE_EFFECT_SMASH_BEACHLOUNGE_TOWEL = 132, }; class CVehicle; -- cgit v1.2.3 From 1dcd7c5b14b6ce771347c48b53eae7f2411e1113 Mon Sep 17 00:00:00 2001 From: "Walied K. Yassen" Date: Mon, 30 Nov 2020 02:57:58 +0200 Subject: Fix the code style issues --- src/core/General.h | 4 - src/objects/Object.cpp | 203 ++++++++++++++++++++++++++----------------------- src/objects/Object.h | 2 +- 3 files changed, 110 insertions(+), 99 deletions(-) (limited to 'src') diff --git a/src/core/General.h b/src/core/General.h index 52850794..4cc0ebf8 100644 --- a/src/core/General.h +++ b/src/core/General.h @@ -160,10 +160,6 @@ public: static int32 GetRandomNumberInRange(int32 low, int32 high) { return low + (high - low)*(GetRandomNumber()/float(MYRAND_MAX + 1)); } - // Returns inclusive value in the specified range - static int32 GetRandomNumberInRangeInc(int32 low, int32 high) - { return GetRandomNumberInRange(low - 1, high + 1); } - static void SetRandomSeed(int32 seed) { mysrand(seed); } }; diff --git a/src/objects/Object.cpp b/src/objects/Object.cpp index 42021054..12ae5294 100644 --- a/src/objects/Object.cpp +++ b/src/objects/Object.cpp @@ -17,14 +17,17 @@ #include "Stats.h" #include "SpecialFX.h" +#define BEACHBALL_MAX_SCORE 250 +#define BEACHBALL_DEACCELERATION 2.5f + int16 CObject::nNoTempObjects; //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, int handle) { return CPools::GetObjectPool()->New(handle); }; -void CObject::operator delete(void* p, size_t sz) { CPools::GetObjectPool()->Delete((CObject*)p); } -void CObject::operator delete(void* p, int handle) { CPools::GetObjectPool()->Delete((CObject*)p); } +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 delete(void *p, size_t sz) { CPools::GetObjectPool()->Delete((CObject *)p); } +void CObject::operator delete(void *p, int handle) { CPools::GetObjectPool()->Delete((CObject *)p); } CObject::CObject(void) { @@ -66,7 +69,7 @@ CObject::CObject(int32 mi, bool createRW) Init(); } -CObject::CObject(CDummyObject* dummy) +CObject::CObject(CDummyObject *dummy) { SetModelIndexNoCreate(dummy->GetModelIndex()); @@ -109,7 +112,7 @@ CObject::ProcessControl(void) m_vecMoveSpeed *= fTimeStep; m_vecTurnSpeed *= fTimeStep; } - auto mi = GetModelIndex(); + int16 mi = GetModelIndex(); if ((mi == MI_EXPLODINGBARREL || mi == MI_PETROLPUMP || mi == MI_PETROLPUMP2) && bHasBeenDamaged && bIsVisible && (CGeneral::GetRandomNumber() & 0x1F) == 10) { bExplosionProof = true; @@ -126,48 +129,54 @@ CObject::ProcessControl(void) m_vecMoveSpeed *= fScalarTimed; } if (mi == MI_BEACHBALL) { - constexpr uint8 BEACHBALL_MAX_SCORE = 250; - constexpr float BEACHBALL_DEACCELERATION = 2.5f; - float fMoveSpeedMag = m_vecMoveSpeed.Magnitude2D(); - float fTimeScale = powf(0.95, CTimer::GetTimeStep()); - m_vecMoveSpeed.x *= fTimeScale; - m_vecMoveSpeed.y *= fTimeScale; - m_vecMoveSpeed.z += fMoveSpeedMag - m_vecMoveSpeed.Magnitude2D(); + float fTimeStep = Pow(0.95f, CTimer::GetTimeStep()); + float fPreviousVecSpeedMag = m_vecMoveSpeed.Magnitude2D(); + m_vecMoveSpeed.x *= fTimeStep; + m_vecMoveSpeed.y *= fTimeStep; + m_vecMoveSpeed.z += fPreviousVecSpeedMag - m_vecMoveSpeed.Magnitude2D(); if (!FindPlayerVehicle()) { CVector distance = FindPlayerCoors() - GetPosition(); float distanceMagnitude = distance.Magnitude2D(); if (distance.z > 0.0 && distance.z < 1.5f && distanceMagnitude < 1.0) { CVector playerSpeed = FindPlayerSpeed(); - if (fMoveSpeedMag < 0.05 && playerSpeed.Magnitude() > 0.1) { + if (fPreviousVecSpeedMag < 0.05 && playerSpeed.Magnitude() > 0.1) { playerSpeed.z = 0.0f; playerSpeed.Normalise(); playerSpeed.z = 0.3; m_vecMoveSpeed = CVector(playerSpeed.x / BEACHBALL_DEACCELERATION, playerSpeed.y / BEACHBALL_DEACCELERATION, 1.0f / BEACHBALL_DEACCELERATION * 0.3); PlayOneShotScriptObject(SCRIPT_SOUND_HIT_BALL, GetPosition()); + m_vecTurnSpeed += CVector( + ((CGeneral::GetRandomNumber() % 16) - 7) / 10.0f, + ((CGeneral::GetRandomNumber() % 16) - 7) / 10.0f, + 0.0f); if (m_nBeachballBounces > 0) { m_nBeachballBounces++; + } + if (m_nBeachballBounces > 0) { sprintf(gString, "%d", m_nBeachballBounces); CMoneyMessages::RegisterOne(GetPosition(), gString, 255, 50, 0, 0.6f, 0.5f); CStats::RegisterHighestScore(3, m_nBeachballBounces); } } } - if (distance.z > -1.05 && distance.z < -0.6 && distanceMagnitude < 0.9 && m_vecMoveSpeed.z < 0.0f) { - m_vecMoveSpeed.x += CGeneral::GetRandomNumberInRangeInc(-3, 4) / 100.0; - m_vecMoveSpeed.y += CGeneral::GetRandomNumberInRangeInc(-3, 4) / 100.0; + if (distanceMagnitude < 0.9 && distance.z > -1.05 && distance.z < -0.6 && m_vecMoveSpeed.z < 0.0f) { + m_vecMoveSpeed.x += (CGeneral::GetRandomNumber() % 8 - 3) / 100.0f; + m_vecMoveSpeed.y += (CGeneral::GetRandomNumber() % 8 - 3) / 100.0f; m_vecMoveSpeed.z = Max(m_vecMoveSpeed.z + 0.3f, 0.2f); PlayOneShotScriptObject(SCRIPT_SOUND_HIT_BALL, GetPosition()); - m_vecTurnSpeed.x += CGeneral::GetRandomNumberInRangeInc(-7, 8) / 10.0f; - m_vecTurnSpeed.y += CGeneral::GetRandomNumberInRangeInc(-7, 8) / 10.0f; - if (++m_nBeachballBounces >= BEACHBALL_MAX_SCORE) { - m_nBeachballBounces = BEACHBALL_MAX_SCORE; - } + m_vecTurnSpeed.x += (CGeneral::GetRandomNumber() % 16 - 7) / 10.0f; + m_vecTurnSpeed.y += (CGeneral::GetRandomNumber() % 16 - 7) / 10.0f; + m_nBeachballBounces++; + m_nBeachballBounces = Min(m_nBeachballBounces, BEACHBALL_MAX_SCORE); sprintf(gString, "%d", m_nBeachballBounces); CMoneyMessages::RegisterOne(GetPosition(), gString, 255, 50, 0, 0.6f, 0.5f); CStats::RegisterHighestScore(3, m_nBeachballBounces); } } } + if (bIsBIGBuilding) { + bIsInSafePosition = true; + } } void @@ -187,7 +196,7 @@ CObject::Render(void) return; if (m_nRefModelIndex != -1 && ObjectCreatedBy == TEMP_OBJECT && bUseVehicleColours) { - CVehicleModelInfo* mi = (CVehicleModelInfo*)CModelInfo::GetModelInfo(m_nRefModelIndex); + CVehicleModelInfo *mi = (CVehicleModelInfo *)CModelInfo::GetModelInfo(m_nRefModelIndex); assert(mi->GetModelType() == MITYPE_VEHICLE); mi->SetVehicleColour(m_colour1, m_colour2); } @@ -301,12 +310,10 @@ CObject::SetupLighting(void) if (bRenderScorched) { WorldReplaceNormalLightsWithScorched(Scene.world, 0.1f); return true; - } - else if (bIsPickup) { + } else if (bIsPickup) { SetFullAmbient(); return true; - } - else if (bIsWeapon) { + } else if (bIsWeapon) { ActivateDirectional(); SetAmbientColoursForPedsCarsAndObjects(); return true; @@ -342,50 +349,51 @@ CObject::ObjectDamage(float amount) } #endif 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; - switch (m_nCollisionDamageEffect) - { + switch (m_nCollisionDamageEffect) { case DAMAGE_EFFECT_CHANGE_MODEL: bRenderDamaged = true; return; case DAMAGE_EFFECT_SPLIT_MODEL: return; - case DAMAGE_EFFECT_SMASH_AND_DAMAGE_TRAFFICLIGHTS: { + case DAMAGE_EFFECT_SMASH_AND_DAMAGE_TRAFFICLIGHTS: + { static RwRGBA debrisColor = { 0xc8,0xc8,0xc8,0xff }; if (bRenderDamaged) { break; } bRenderDamaged = true; - CBaseModelInfo* modelInfo = CModelInfo::GetModelInfo(GetModelIndex()); + CBaseModelInfo *modelInfo = CModelInfo::GetModelInfo(GetModelIndex()); CVector min = modelInfo->GetColModel()->boundingBox.min * 0.85f; CVector max = modelInfo->GetColModel()->boundingBox.max * 0.85f; min.z = max.z; min = GetMatrix() * min; max = GetMatrix() * max; - CVector temp = (max - min) * 0.02; - + CVector temp = (max - min) * 0.02f; for (int32 i = 0; i < 50; i++) { - float fDirX = CGeneral::GetRandomNumberInRange(-0.35f, 0.35f); - float fDirY = CGeneral::GetRandomNumberInRange(-0.35f, 0.35f); - float fDirZ = CGeneral::GetRandomNumberInRange(0.10f, 0.25f); + CVector vecDir = CVector( + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + ); ++nFrameGen; int32 currentFrame = nFrameGen & 3; CVector pos = min + temp * (float)i; - CVector dir = CVector(fDirX, fDirY, fDirZ); float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); float fColorFactor = CGeneral::GetRandomNumberInRange(0.6f, 1.2f); RwRGBA color = debrisColor; color.red *= fColorFactor; color.green *= fColorFactor; int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-0.40f, 0.40f); - CParticle::AddParticle(PARTICLE_CAR_DEBRIS, pos, dir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0); + CParticle::AddParticle(PARTICLE_CAR_DEBRIS, pos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0); } PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, min); break; } case DAMAGE_EFFECT_SMASH_COMPLETELY: - case DAMAGE_EFFECT_CHANGE_THEN_SMASH: { + case DAMAGE_EFFECT_CHANGE_THEN_SMASH: + { if (m_nCollisionDamageEffect == DAMAGE_EFFECT_CHANGE_THEN_SMASH && !bRenderDamaged) { bRenderDamaged = true; return; @@ -402,7 +410,8 @@ CObject::ObjectDamage(float amount) break; } case DAMAGE_EFFECT_SMASH_CARDBOARD_COMPLETELY: - case DAMAGE_EFFECT_SMASH_YELLOW_TARGET_COMPLETELY: { + case DAMAGE_EFFECT_SMASH_YELLOW_TARGET_COMPLETELY: + { bIsVisible = false; bUsesCollision = false; if (!GetIsStatic()) { @@ -414,9 +423,11 @@ CObject::ObjectDamage(float amount) SetTurnSpeed(0.0f, 0.0f, 0.0f); const RwRGBA color = { 96, 48, 0, 255 }; for (int32 i = 0; i < 25; i++) { - CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CVector vecDir = CVector( + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), - CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ); + CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ + ); ++nFrameGen; int32 currentFrame = nFrameGen & 3; float fRandom = CGeneral::GetRandomNumberInRange(0.01f, 1.0f); @@ -425,19 +436,19 @@ CObject::ObjectDamage(float amount) randomColor.red *= fRandom; randomColor.green *= fRandom; randomColor.blue *= fRandom; - } - else { + } else { randomColor.red = 0xff; - randomColor.blue = 0xfc; + randomColor.green = 0xfc; } float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0); } PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_2, vecPos); break; } - case DAMAGE_EFFECT_SMASH_WOODENBOX_COMPLETELY: { + case DAMAGE_EFFECT_SMASH_WOODENBOX_COMPLETELY: + { bIsVisible = false; bUsesCollision = false; if (!GetIsStatic()) { @@ -450,22 +461,25 @@ CObject::ObjectDamage(float amount) static const RwRGBA color = { 128, 128, 128, 255 }; CVector position = GetPosition(); for (int32 i = 0; i < 45; i++) { - CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CVector vecDir = CVector( + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), - CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ); + CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ + ); ++nFrameGen; int32 currentFrame = nFrameGen & 3; float fRandom = CGeneral::GetRandomNumberInRange(0.5f, 1.0f); RwRGBA randomColor = { uint8(color.red * fRandom), uint8(color.green * fRandom), uint8(color.blue * fRandom), color.alpha }; float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0); } PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_1, vecPos); break; } case DAMAGE_EFFECT_SMASH_TRAFFICCONE_COMPLETELY: - case DAMAGE_EFFECT_BURST_BEACHBALL: { + case DAMAGE_EFFECT_BURST_BEACHBALL: + { bIsVisible = false; bUsesCollision = false; if (!GetIsStatic()) { @@ -478,27 +492,29 @@ CObject::ObjectDamage(float amount) const RwRGBA color1 = { 200, 0, 0, 255 }; const RwRGBA color2 = { 200, 200, 200, 255 }; for (int32 i = 0; i < 10; i++) { - CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CVector vecDir = CVector( CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), - CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ); + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ + ); ++nFrameGen; int32 currentFrame = nFrameGen & 3; RwRGBA color = color2; if (nFrameGen & 1) color = color1; float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0); } if (m_nCollisionDamageEffect == DAMAGE_EFFECT_BURST_BEACHBALL) { PlayOneShotScriptObject(SCRIPT_SOUND_HIT_BALL, vecPos); - } - else { + } else { PlayOneShotScriptObject(SCRIPT_SOUND_TIRE_COLLISION, vecPos); } break; } - case DAMAGE_EFFECT_SMASH_BARPOST_COMPLETELY: { + case DAMAGE_EFFECT_SMASH_BARPOST_COMPLETELY: + { bIsVisible = false; bUsesCollision = false; if (!GetIsStatic()) { @@ -513,14 +529,16 @@ CObject::ObjectDamage(float amount) SetMoveSpeed(0.0f, 0.0f, 0.0f); SetTurnSpeed(0.0f, 0.0f, 0.0f); for (int32 i = 0; i < 32; i++) { - CVector vecDir(CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CVector vecDir = CVector( CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), - CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ); + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ + ); ++nFrameGen; int32 currentFrame = nFrameGen & 3; - const RwRGBA& color = nFrameGen & 1 ? color1 : color2; + const RwRGBA &color = nFrameGen & 1 ? color1 : color2; float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0); } PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, vecPos); @@ -530,7 +548,8 @@ CObject::ObjectDamage(float amount) case DAMAGE_EFFECT_SMASH_NEWSTANDNEW2: case DAMAGE_EFFECT_SMASH_NEWSTANDNEW3: case DAMAGE_EFFECT_SMASH_NEWSTANDNEW4: - case DAMAGE_EFFECT_SMASH_NEWSTANDNEW5: { + case DAMAGE_EFFECT_SMASH_NEWSTANDNEW5: + { bIsVisible = false; bUsesCollision = false; if (!GetIsStatic()) { @@ -566,18 +585,17 @@ CObject::ObjectDamage(float amount) } for (int32 i = 0; i < 16; i++) { CVector vecDir( - CGeneral::GetRandomNumberInRange(-0.35f, 0.7f), - CGeneral::GetRandomNumberInRange(-0.35f, 0.7f), - CGeneral::GetRandomNumberInRange(0.1f, 0.15f) + fDirectionZ + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), + CGeneral::GetRandomNumberInRange(0.10f, 0.15f) + fDirectionZ ); float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); - nFrameGen++; + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); + ++nFrameGen; int32 nCurFrame = nFrameGen & 0x3; - CRGBA& selectedColor = nFrameGen & 0x1 ? possibleColor1 : possibleColor2; + CRGBA &selectedColor = nFrameGen & 0x1 ? possibleColor1 : possibleColor2; CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, selectedColor, nRotationSpeed, 0, nCurFrame, 0); - if ((i % 7) == 0) - { + if (!(i % 7)) { static CRGBA secondParticleColors[4] = { CRGBA(0xA0, 0x60, 0x60, 0xFF), CRGBA(0x60, 0xA0, 0x60, 0xFF), @@ -585,8 +603,8 @@ CObject::ObjectDamage(float amount) CRGBA(0xA0, 0xA0, 0xA0, 0xFF) }; vecDir *= 0.5f; - CRGBA& secondParticleColor = secondParticleColors[nFrameGen & 3]; - int32 nSecondRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + CRGBA &secondParticleColor = secondParticleColors[nFrameGen & 3]; + int32 nSecondRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); CParticle::AddParticle(PARTICLE_DEBRIS, vecPos, vecDir, nil, 0.1f, secondParticleColor, nSecondRotationSpeed, 0, 1, 0); } } @@ -595,7 +613,8 @@ CObject::ObjectDamage(float amount) } case DAMAGE_EFFECT_SMASH_BLACKBAG: case DAMAGE_EFFECT_SMASH_BEACHLOUNGE_WOOD: - case DAMAGE_EFFECT_SMASH_BEACHLOUNGE_TOWEL: { + case DAMAGE_EFFECT_SMASH_BEACHLOUNGE_TOWEL: + { bIsVisible = false; bUsesCollision = false; if (!GetIsStatic()) { @@ -607,8 +626,7 @@ CObject::ObjectDamage(float amount) SetTurnSpeed(0.0f, 0.0f, 0.0f); CRGBA possibleColor1; CRGBA possibleColor2; - switch (m_nCollisionDamageEffect) - { + switch (m_nCollisionDamageEffect) { case DAMAGE_EFFECT_SMASH_BLACKBAG: possibleColor1 = CRGBA(0, 0, 0, 0xFF); possibleColor2 = possibleColor1; @@ -628,19 +646,16 @@ CObject::ObjectDamage(float amount) CGeneral::GetRandomNumberInRange(-0.35f, 0.35f), CGeneral::GetRandomNumberInRange(0.10f, 0.25f) + fDirectionZ ); - nFrameGen++; - int32 nCurFrame = nFrameGen & 3; - CRGBA& selectedColor = nFrameGen & 1 ? possibleColor1 : possibleColor2; + ++nFrameGen; + int32 nCurFrame = nFrameGen & 0x3; + CRGBA &selectedColor = nFrameGen & 0x1 ? possibleColor1 : possibleColor2; float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, selectedColor, nRotationSpeed, 0, nCurFrame, 0); } - if (m_nCollisionDamageEffect == DAMAGE_EFFECT_SMASH_BLACKBAG) - { + if (m_nCollisionDamageEffect == DAMAGE_EFFECT_SMASH_BLACKBAG) { PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_2, vecPos); - } - else if (m_nCollisionDamageEffect == DAMAGE_EFFECT_SMASH_BEACHLOUNGE_WOOD) - { + } else if (m_nCollisionDamageEffect == DAMAGE_EFFECT_SMASH_BEACHLOUNGE_WOOD) { PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, vecPos); } break; @@ -682,8 +697,8 @@ CObject::Init(void) m_nCostValue = 0; m_pCollidingEntity = nil; CColPoint point; - CEntity* outEntity = nil; - const CVector& vecPos = m_matrix.GetPosition(); + CEntity *outEntity = nil; + const CVector &vecPos = m_matrix.GetPosition(); if (CWorld::ProcessVerticalLine(vecPos, vecPos.z - 10.0f, point, outEntity, true, false, false, false, false, false, nil)) m_pCurSurface = outEntity; else @@ -721,9 +736,9 @@ CObject::CanBeDeleted(void) void CObject::DeleteAllMissionObjects() { - CObjectPool* objectPool = CPools::GetObjectPool(); + CObjectPool *objectPool = CPools::GetObjectPool(); for (int32 i = 0; i < objectPool->GetSize(); i++) { - CObject* pObject = objectPool->GetSlot(i); + CObject *pObject = objectPool->GetSlot(i); if (pObject && pObject->ObjectCreatedBy == MISSION_OBJECT) { CWorld::Remove(pObject); delete pObject; @@ -734,9 +749,9 @@ CObject::DeleteAllMissionObjects() void CObject::DeleteAllTempObjects() { - CObjectPool* objectPool = CPools::GetObjectPool(); + CObjectPool *objectPool = CPools::GetObjectPool(); for (int32 i = 0; i < objectPool->GetSize(); i++) { - CObject* pObject = objectPool->GetSlot(i); + CObject *pObject = objectPool->GetSlot(i); if (pObject && pObject->ObjectCreatedBy == TEMP_OBJECT) { CWorld::Remove(pObject); delete pObject; @@ -747,9 +762,9 @@ CObject::DeleteAllTempObjects() void CObject::DeleteAllTempObjectsInArea(CVector point, float fRadius) { - CObjectPool* objectPool = CPools::GetObjectPool(); + CObjectPool *objectPool = CPools::GetObjectPool(); for (int32 i = 0; i < objectPool->GetSize(); i++) { - CObject* pObject = objectPool->GetSlot(i); + CObject *pObject = objectPool->GetSlot(i); CVector dist = point - pObject->GetPosition(); if (pObject && pObject->ObjectCreatedBy == TEMP_OBJECT && dist.MagnitudeSqr() < fRadius * fRadius) { CWorld::Remove(pObject); @@ -759,7 +774,7 @@ CObject::DeleteAllTempObjectsInArea(CVector point, float fRadius) } bool -IsObjectPointerValid(CObject* pObject) +IsObjectPointerValid(CObject *pObject) { if (!pObject) return false; diff --git a/src/objects/Object.h b/src/objects/Object.h index 80f3b4a1..e34043a8 100644 --- a/src/objects/Object.h +++ b/src/objects/Object.h @@ -76,7 +76,7 @@ public: uint8 m_nCollisionDamageEffect; uint8 m_nSpecialCollisionResponseCases; bool m_bCameraToAvoidThisObject; - int8 m_nBeachballBounces; + uint8 m_nBeachballBounces; uint32 m_obj_unused1; uint32 m_nEndOfLifeTime; int16 m_nRefModelIndex; -- cgit v1.2.3 From 190bcf68f340538ab727baacddaac32541d571be Mon Sep 17 00:00:00 2001 From: "Walied K. Yassen" Date: Thu, 3 Dec 2020 10:03:23 +0200 Subject: Implement DAMAGE_EFFECT_SMASH_VEGPALM and code style fixes --- src/core/General.h | 1 - src/objects/Object.cpp | 118 ++++++++++++++++++++++++++++++++++--------------- 2 files changed, 83 insertions(+), 36 deletions(-) (limited to 'src') diff --git a/src/core/General.h b/src/core/General.h index 4cc0ebf8..7e06b96e 100644 --- a/src/core/General.h +++ b/src/core/General.h @@ -159,7 +159,6 @@ public: static int32 GetRandomNumberInRange(int32 low, int32 high) { return low + (high - low)*(GetRandomNumber()/float(MYRAND_MAX + 1)); } - static void SetRandomSeed(int32 seed) { mysrand(seed); } }; diff --git a/src/objects/Object.cpp b/src/objects/Object.cpp index 12ae5294..21aeb1e4 100644 --- a/src/objects/Object.cpp +++ b/src/objects/Object.cpp @@ -18,16 +18,17 @@ #include "SpecialFX.h" #define BEACHBALL_MAX_SCORE 250 -#define BEACHBALL_DEACCELERATION 2.5f +// the proportion of the ball speed compared to the player speed when it hits the player +#define BEACHBALL_SPEED_PROPORTION 0.4f int16 CObject::nNoTempObjects; //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, int handle) { return CPools::GetObjectPool()->New(handle); }; -void CObject::operator delete(void *p, size_t sz) { CPools::GetObjectPool()->Delete((CObject *)p); } -void CObject::operator delete(void *p, int handle) { CPools::GetObjectPool()->Delete((CObject *)p); } +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 delete(void *p, size_t sz) { CPools::GetObjectPool()->Delete((CObject*)p); } +void CObject::operator delete(void *p, int handle) { CPools::GetObjectPool()->Delete((CObject*)p); } CObject::CObject(void) { @@ -135,15 +136,21 @@ CObject::ProcessControl(void) m_vecMoveSpeed.y *= fTimeStep; m_vecMoveSpeed.z += fPreviousVecSpeedMag - m_vecMoveSpeed.Magnitude2D(); if (!FindPlayerVehicle()) { - CVector distance = FindPlayerCoors() - GetPosition(); - float distanceMagnitude = distance.Magnitude2D(); - if (distance.z > 0.0 && distance.z < 1.5f && distanceMagnitude < 1.0) { + CVector distance; + distance.x = FindPlayerCoors().x - GetPosition().x; + distance.y = FindPlayerCoors().y - GetPosition().y; + distance.z = FindPlayerCoors().z - GetPosition().z; + if (distance.z > 0.0 && distance.z < 1.5f && distance.Magnitude2D() < 1.0f) { CVector playerSpeed = FindPlayerSpeed(); - if (fPreviousVecSpeedMag < 0.05 && playerSpeed.Magnitude() > 0.1) { + if (fPreviousVecSpeedMag < 0.05f && playerSpeed.Magnitude() > 0.1f) { playerSpeed.z = 0.0f; playerSpeed.Normalise(); - playerSpeed.z = 0.3; - m_vecMoveSpeed = CVector(playerSpeed.x / BEACHBALL_DEACCELERATION, playerSpeed.y / BEACHBALL_DEACCELERATION, 1.0f / BEACHBALL_DEACCELERATION * 0.3); + playerSpeed.z = 0.3f; + m_vecMoveSpeed = CVector( + playerSpeed.x * BEACHBALL_SPEED_PROPORTION, + playerSpeed.y * BEACHBALL_SPEED_PROPORTION, + 0.3f * BEACHBALL_SPEED_PROPORTION + ); PlayOneShotScriptObject(SCRIPT_SOUND_HIT_BALL, GetPosition()); m_vecTurnSpeed += CVector( ((CGeneral::GetRandomNumber() % 16) - 7) / 10.0f, @@ -159,7 +166,7 @@ CObject::ProcessControl(void) } } } - if (distanceMagnitude < 0.9 && distance.z > -1.05 && distance.z < -0.6 && m_vecMoveSpeed.z < 0.0f) { + if (distance.z > -1.05 && distance.z < -0.6 && m_vecMoveSpeed.z < 0.0f && distance.Magnitude2D() < 0.9f) { m_vecMoveSpeed.x += (CGeneral::GetRandomNumber() % 8 - 3) / 100.0f; m_vecMoveSpeed.y += (CGeneral::GetRandomNumber() % 8 - 3) / 100.0f; m_vecMoveSpeed.z = Max(m_vecMoveSpeed.z + 0.3f, 0.2f); @@ -196,7 +203,7 @@ CObject::Render(void) return; if (m_nRefModelIndex != -1 && ObjectCreatedBy == TEMP_OBJECT && bUseVehicleColours) { - CVehicleModelInfo *mi = (CVehicleModelInfo *)CModelInfo::GetModelInfo(m_nRefModelIndex); + CVehicleModelInfo *mi = (CVehicleModelInfo*)CModelInfo::GetModelInfo(m_nRefModelIndex); assert(mi->GetModelType() == MITYPE_VEHICLE); mi->SetVehicleColour(m_colour1, m_colour2); } @@ -364,9 +371,8 @@ CObject::ObjectDamage(float amount) break; } bRenderDamaged = true; - CBaseModelInfo *modelInfo = CModelInfo::GetModelInfo(GetModelIndex()); - CVector min = modelInfo->GetColModel()->boundingBox.min * 0.85f; - CVector max = modelInfo->GetColModel()->boundingBox.max * 0.85f; + CVector min = 0.85f * GetColModel()->boundingBox.min; + CVector max = 0.85f * GetColModel()->boundingBox.max; min.z = max.z; min = GetMatrix() * min; max = GetMatrix() * max; @@ -391,13 +397,14 @@ CObject::ObjectDamage(float amount) PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, min); break; } - case DAMAGE_EFFECT_SMASH_COMPLETELY: - case DAMAGE_EFFECT_CHANGE_THEN_SMASH: - { - if (m_nCollisionDamageEffect == DAMAGE_EFFECT_CHANGE_THEN_SMASH && !bRenderDamaged) { + case DAMAGE_EFFECT_CHANGE_THEN_SMASH: { + if (!bRenderDamaged) { bRenderDamaged = true; return; } + // fall through + } + case DAMAGE_EFFECT_SMASH_COMPLETELY: { bIsVisible = false; bUsesCollision = false; if (!GetIsStatic()) { @@ -430,18 +437,23 @@ CObject::ObjectDamage(float amount) ); ++nFrameGen; int32 currentFrame = nFrameGen & 3; - float fRandom = CGeneral::GetRandomNumberInRange(0.01f, 1.0f); RwRGBA randomColor = color; - if (m_nCollisionDamageEffect == DAMAGE_EFFECT_SMASH_CARDBOARD_COMPLETELY) { - randomColor.red *= fRandom; - randomColor.green *= fRandom; - randomColor.blue *= fRandom; - } else { - randomColor.red = 0xff; - randomColor.green = 0xfc; + switch (m_nCollisionDamageEffect) { + case DAMAGE_EFFECT_SMASH_CARDBOARD_COMPLETELY: { + float fRandom = CGeneral::GetRandomNumberInRange(0.01f, 1.0f); + randomColor.red *= fRandom; + randomColor.green *= fRandom; + randomColor.blue *= fRandom; + break; + } + case DAMAGE_EFFECT_SMASH_YELLOW_TARGET_COMPLETELY: { + randomColor.red = 0xff; + randomColor.green = 0xfc; + break; + } } float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0); } PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_2, vecPos); @@ -471,7 +483,7 @@ CObject::ObjectDamage(float amount) float fRandom = CGeneral::GetRandomNumberInRange(0.5f, 1.0f); RwRGBA randomColor = { uint8(color.red * fRandom), uint8(color.green * fRandom), uint8(color.blue * fRandom), color.alpha }; float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, randomColor, nRotationSpeed, 0, currentFrame, 0); } PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_1, vecPos); @@ -503,7 +515,7 @@ CObject::ObjectDamage(float amount) if (nFrameGen & 1) color = color1; float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0); } if (m_nCollisionDamageEffect == DAMAGE_EFFECT_BURST_BEACHBALL) { @@ -538,7 +550,7 @@ CObject::ObjectDamage(float amount) int32 currentFrame = nFrameGen & 3; const RwRGBA &color = nFrameGen & 1 ? color1 : color2; float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, color, nRotationSpeed, 0, currentFrame, 0); } PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, vecPos); @@ -590,7 +602,7 @@ CObject::ObjectDamage(float amount) CGeneral::GetRandomNumberInRange(0.10f, 0.15f) + fDirectionZ ); float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); ++nFrameGen; int32 nCurFrame = nFrameGen & 0x3; CRGBA &selectedColor = nFrameGen & 0x1 ? possibleColor1 : possibleColor2; @@ -604,13 +616,49 @@ CObject::ObjectDamage(float amount) }; vecDir *= 0.5f; CRGBA &secondParticleColor = secondParticleColors[nFrameGen & 3]; - int32 nSecondRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); + int32 nSecondRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); CParticle::AddParticle(PARTICLE_DEBRIS, vecPos, vecDir, nil, 0.1f, secondParticleColor, nSecondRotationSpeed, 0, 1, 0); } } PlayOneShotScriptObject(SCRIPT_SOUND_METAL_COLLISION, vecPos); break; } + case DAMAGE_EFFECT_SMASH_VEGPALM: + { + static RwRGBA primaryColor1 = { 0x39, 0x4D, 0x29, 0xff }; + static RwRGBA primaryColor2 = { 0x94, 0x7D, 0x73, 0xff }; + bIsVisible = false; + bUsesCollision = false; + if (!GetIsStatic()) { + RemoveFromMovingList(); + } + SetIsStatic(true); + bExplosionProof = true; + SetMoveSpeed(0.0f, 0.0f, 0.0f); + SetTurnSpeed(0.0f, 0.0f, 0.0f); + float fRadius = GetColModel()->boundingSphere.radius; + for (int32 i = 0; i < 32; i++) { + CVector particleDir = CVector( + CGeneral::GetRandomNumberInRange(-0.25f, 0.25f), + CGeneral::GetRandomNumberInRange(-0.25f, 0.25f), + CGeneral::GetRandomNumberInRange(-0.05f, 0.05f) + fDirectionZ + ); + CVector particlePos = vecPos; + particlePos.z += CGeneral::GetRandomNumberInRange(0.0f, 1.0f) * fRadius; + ++nFrameGen; + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); + int32 nCurFrame = nFrameGen & 0x3; + float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); + RwRGBA& particleColor = nFrameGen & 1 ? primaryColor1 : primaryColor2; + CParticle::AddParticle(PARTICLE_CAR_DEBRIS, particlePos, particleDir, nil, fSize, particleColor, nRotationSpeed, 0, nCurFrame, 0); + if ((i % 7) == 0) { + static RwRGBA secondaryColor = { 0x9A, 0x99, 0x99, 0x3E }; + CParticle::AddParticle(PARTICLE_DEBRIS, particlePos, particleDir, nil, 0.3, secondaryColor, nRotationSpeed, 0, 0, 0); + } + } + PlayOneShotScriptObject(SCRIPT_SOUND_BOX_DESTROYED_2, vecPos); + break; + } case DAMAGE_EFFECT_SMASH_BLACKBAG: case DAMAGE_EFFECT_SMASH_BEACHLOUNGE_WOOD: case DAMAGE_EFFECT_SMASH_BEACHLOUNGE_TOWEL: @@ -650,7 +698,7 @@ CObject::ObjectDamage(float amount) int32 nCurFrame = nFrameGen & 0x3; CRGBA &selectedColor = nFrameGen & 0x1 ? possibleColor1 : possibleColor2; float fSize = CGeneral::GetRandomNumberInRange(0.02f, 0.20f); - int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-41, 41); + int32 nRotationSpeed = CGeneral::GetRandomNumberInRange(-40, 40); CParticle::AddParticle(PARTICLE_CAR_DEBRIS, vecPos, vecDir, nil, fSize, selectedColor, nRotationSpeed, 0, nCurFrame, 0); } if (m_nCollisionDamageEffect == DAMAGE_EFFECT_SMASH_BLACKBAG) { -- cgit v1.2.3 From 64049f0f81c22b321a790636fca502e9d267623c Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Mon, 7 Dec 2020 22:56:22 +0200 Subject: Fix font bug --- src/render/Font.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/render/Font.cpp b/src/render/Font.cpp index 5a6ff94f..9b022394 100644 --- a/src/render/Font.cpp +++ b/src/render/Font.cpp @@ -390,9 +390,9 @@ CFont::PrintChar(float x, float y, wchar c) x + 32.0f * RenderState.scaleX * 1.0f, y + 33.0f * RenderState.scaleY * 0.5f), RenderState.color, - xoff / 16.0f, yoff / 12.8f, - (xoff + 1.0f) / 16.0f - 0.001f, yoff / 12.8f - 0.017f, - xoff / 16.0f, (yoff + 1.0f) / 12.8f, + xoff / 16.0f, yoff / 12.8f + 0.0021f, + (xoff + 1.0f) / 16.0f - 0.001f, yoff / 12.8f + 0.0021f, + xoff / 16.0f, (yoff + 1.0f) / 12.8f - 0.017f, (xoff + 1.0f) / 16.0f - 0.001f, (yoff + 1.0f) / 12.8f - 0.017f); } } else -- cgit v1.2.3 From 8844caf44deda3dd53c4c253d54c79cb2879a633 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Tue, 8 Dec 2020 02:22:02 +0200 Subject: Fix vanilla font bug --- src/render/Font.cpp | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'src') diff --git a/src/render/Font.cpp b/src/render/Font.cpp index 9b022394..a3132627 100644 --- a/src/render/Font.cpp +++ b/src/render/Font.cpp @@ -374,7 +374,11 @@ CFont::PrintChar(float x, float y, wchar c) if(Details.style == FONT_BANK || Details.style == FONT_STANDARD){ if (bDontPrint) return; if (RenderState.slant == 0.0f) { +#ifdef FIX_BUGS + if (c < 192) { +#else if (c < 193) { +#endif CSprite2d::AddToBuffer( CRect(x, y, x + 32.0f * RenderState.scaleX * 1.0f, -- cgit v1.2.3 From aae4f3319f4dcc4b3338116572bcb3f6d0f05b7e Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Tue, 8 Dec 2020 03:29:08 +0200 Subject: Fixes --- src/control/CarCtrl.cpp | 25 +++++-------------------- src/control/Garages.cpp | 2 -- src/control/Garages.h | 4 ++-- src/control/Record.h | 2 -- src/core/Camera.cpp | 2 ++ src/core/World.cpp | 4 ++-- src/weapons/Weapon.cpp | 7 ++++--- 7 files changed, 15 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/control/CarCtrl.cpp b/src/control/CarCtrl.cpp index 19f2c628..3d52a0b0 100644 --- a/src/control/CarCtrl.cpp +++ b/src/control/CarCtrl.cpp @@ -442,6 +442,11 @@ CCarCtrl::GenerateOneRandomCar() pVehicle->GetRight() = CVector(forwardY, -forwardX, 0.0f); pVehicle->GetUp() = CVector(0.0f, 0.0f, 1.0f); + float currentPathLinkForwardX = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirX(); + float currentPathLinkForwardY = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirY(); + float nextPathLinkForwardX = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirX(); + float nextPathLinkForwardY = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirY(); + #ifdef FIX_BUGS CCarPathLink* pCurrentLink; CCarPathLink* pNextLink; @@ -452,10 +457,6 @@ CCarCtrl::GenerateOneRandomCar() float directionNextLinkX; float directionNextLinkY; if (positionBetweenNodes < 0.5f) { - float currentPathLinkForwardX = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirX(); - float currentPathLinkForwardY = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirY(); - float nextPathLinkForwardX = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirX(); - float nextPathLinkForwardY = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirY(); pCurrentLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo]; pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo]; @@ -486,11 +487,6 @@ CCarCtrl::GenerateOneRandomCar() pVehicle->AutoPilot.m_nTimeEnteredCurve = CTimer::GetTimeInMilliseconds() - (uint32)((positionBetweenNodes - 0.5f) * pVehicle->AutoPilot.m_nTimeToSpendOnCurrentCurve); - float currentPathLinkForwardX = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirX(); - float currentPathLinkForwardY = pVehicle->AutoPilot.m_nCurrentDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo].GetDirY(); - float nextPathLinkForwardX = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirX(); - float nextPathLinkForwardY = pVehicle->AutoPilot.m_nNextDirection * ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo].GetDirY(); - pCurrentLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nCurrentPathNodeInfo]; pNextLink = &ThePaths.m_carPathLinks[pVehicle->AutoPilot.m_nNextPathNodeInfo]; positionOnCurrentLinkIncludingLane = CVector( @@ -1907,7 +1903,6 @@ void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle) } if (pVehicle->AutoPilot.m_bStayInFastLane) pVehicle->AutoPilot.m_nNextLane = 0; -#ifdef FIX_BUGS CVector positionOnCurrentLinkIncludingLane( pCurLink->GetX() + ((pVehicle->AutoPilot.m_nCurrentLane + pCurLink->OneWayLaneOffset()) * LANE_WIDTH) #ifdef FIX_BUGS @@ -1922,16 +1917,6 @@ void CCarCtrl::PickNextNodeRandomly(CVehicle* pVehicle) #endif ,pNextLink->GetY() - ((pVehicle->AutoPilot.m_nNextLane + pNextLink->OneWayLaneOffset()) * LANE_WIDTH) * nextPathLinkForwardX, 0.0f); -#else - CVector positionOnCurrentLinkIncludingLane( - pCurLink->GetX() + ((pVehicle->AutoPilot.m_nCurrentLane + pCurLink->OneWayLaneOffset()) * LANE_WIDTH), - pCurLink->GetY() - ((pVehicle->AutoPilot.m_nCurrentLane + pCurLink->OneWayLaneOffset()) * LANE_WIDTH) * currentPathLinkForwardX, - 0.0f); - CVector positionOnNextLinkIncludingLane( - pNextLink->GetX() + ((pVehicle->AutoPilot.m_nNextLane + pNextLink->OneWayLaneOffset()) * LANE_WIDTH) * nextPathLinkForwardY, - pNextLink->GetY() - ((pVehicle->AutoPilot.m_nNextLane + pNextLink->OneWayLaneOffset()) * LANE_WIDTH) * nextPathLinkForwardX, - 0.0f); -#endif float directionCurrentLinkX = pCurLink->GetDirX() * pVehicle->AutoPilot.m_nCurrentDirection; float directionCurrentLinkY = pCurLink->GetDirY() * pVehicle->AutoPilot.m_nCurrentDirection; float directionNextLinkX = pNextLink->GetDirX() * pVehicle->AutoPilot.m_nNextDirection; diff --git a/src/control/Garages.cpp b/src/control/Garages.cpp index b27b3c20..93067079 100644 --- a/src/control/Garages.cpp +++ b/src/control/Garages.cpp @@ -4,9 +4,7 @@ #include "main.h" #include "Bike.h" -#ifdef FIX_BUGS #include "Boat.h" -#endif #include "DMAudio.h" #include "General.h" #include "Font.h" diff --git a/src/control/Garages.h b/src/control/Garages.h index 04c01719..d570c5b3 100644 --- a/src/control/Garages.h +++ b/src/control/Garages.h @@ -148,8 +148,8 @@ class CGarage return Abs(TheCamera.GetPosition().x - GetGarageCenterX()) > SWITCH_GARAGE_DISTANCE_CLOSE || Abs(TheCamera.GetPosition().y - GetGarageCenterY()) > SWITCH_GARAGE_DISTANCE_CLOSE; #else - return Abs(TheCamera.GetPosition().x - m_fX1) > SWITCH_GARAGE_DISTANCE_CLOSE || - Abs(TheCamera.GetPosition().y - m_fY1) > SWITCH_GARAGE_DISTANCE_CLOSE; + return Abs(TheCamera.GetPosition().x - m_fInfX) > SWITCH_GARAGE_DISTANCE_CLOSE || + Abs(TheCamera.GetPosition().y - m_fInfY) > SWITCH_GARAGE_DISTANCE_CLOSE; #endif } void TidyUpGarageClose(); diff --git a/src/control/Record.h b/src/control/Record.h index 8b55b1f4..6a94c408 100644 --- a/src/control/Record.h +++ b/src/control/Record.h @@ -57,9 +57,7 @@ public: static void RestoreInfoForMatrix(CMatrix&, CCarStateEachFrame*); static void RestoreInfoForCar(CAutomobile*, CCarStateEachFrame*, bool); static void ProcessControlCars(void); -#if (defined(GTA_PS2) || defined(FIX_BUGS)) static bool ShouldThisPadBeLeftAlone(uint8 pad); -#endif static void GiveUsACar(int32, CVector, float, CAutomobile**, uint8, uint8); static void StartChaseScene(float); static void CleanUpChaseScene(void); diff --git a/src/core/Camera.cpp b/src/core/Camera.cpp index a6cf71f1..5d2768de 100644 --- a/src/core/Camera.cpp +++ b/src/core/Camera.cpp @@ -3621,6 +3621,8 @@ CCamera::LoadPathSplines(int file) m_arrPathArray[i].m_arr_PathData[j] = atof(token); i++; j = 0; + if (i == MAX_NUM_OF_SPLINETYPES) + reading = false; memset(token, 0, 32); n = 0; } diff --git a/src/core/World.cpp b/src/core/World.cpp index bc104fe9..7581a8b0 100644 --- a/src/core/World.cpp +++ b/src/core/World.cpp @@ -1164,8 +1164,8 @@ CWorld::FindObjectsIntersectingCube(const CVector &vecStartPos, const CVector &v const int32 nEndX = Min(GetSectorIndexX(vecStartPos.x), NUMSECTORS_X - 1); const int32 nEndY = Min(GetSectorIndexY(vecStartPos.y), NUMSECTORS_Y - 1); #else - const int32 nEndX = Min(GetSectorIndexX(vecSectorPos.x), NUMSECTORS_X); - const int32 nEndY = Min(GetSectorIndexY(vecSectorPos.y), NUMSECTORS_Y); + const int32 nEndX = Min(GetSectorIndexX(vecStartPos.x), NUMSECTORS_X); + const int32 nEndY = Min(GetSectorIndexY(vecStartPos.y), NUMSECTORS_Y); #endif for(int32 y = nStartY; y <= nEndY; y++) { for(int32 x = nStartX; x <= nEndX; x++) { diff --git a/src/weapons/Weapon.cpp b/src/weapons/Weapon.cpp index d1f9490d..26ed2037 100644 --- a/src/weapons/Weapon.cpp +++ b/src/weapons/Weapon.cpp @@ -1457,7 +1457,8 @@ CWeapon::DoBulletImpact(CEntity *shooter, CEntity *victim, #ifndef FIX_BUGS CVector dist = point->point - (*source); - CVector smokePos = point->point - Max(0.1f * dist.Magnitude(), 0.2f) / dist.Magnitude(); + float distMagnitude = dist.Magnitude(); + CVector smokePos = point->point - Max(distMagnitude / 10.0f, 0.2f) * dist / distMagnitude; #else CVector smokePos = point->point; #endif // !FIX_BUGS @@ -1486,9 +1487,9 @@ CWeapon::DoBulletImpact(CEntity *shooter, CEntity *victim, CParticle::AddParticle(PARTICLE_SPARK, point->point, point->normal * 0.05f); #ifndef FIX_BUGS - CVector dist = point.point - (*fireSource); + CVector dist = point->point - (*source); CVector offset = dist - Max(0.2f * dist.Magnitude(), 0.5f) * CVector(ahead.x, ahead.y, 0.0f); - CVector smokePos = *fireSource + offset; + CVector smokePos = *source + offset; #else CVector smokePos = point->point; #endif -- cgit v1.2.3 From 579efc05fcfa2472b3aa6bfeb6c9cb491f6c3cb3 Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Tue, 8 Dec 2020 05:26:48 +0200 Subject: Fix bike's fInAirXRes --- src/vehicles/Bike.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/vehicles/Bike.cpp b/src/vehicles/Bike.cpp index 30d63aca..3a0be35f 100644 --- a/src/vehicles/Bike.cpp +++ b/src/vehicles/Bike.cpp @@ -202,7 +202,7 @@ CVector vecTestResistance(0.9995f, 0.9f, 0.95f); float fDAxisX = 1.0f; float fDAxisXExtra = 100.0f; float fDAxisY = 1000.0f; -float fInAirXRes = 0.88f; +float fInAirXRes = 0.98f; float fFlySpeedMult = -0.6f; void -- cgit v1.2.3 From f3e9c82432a260fa88ed8bc1d4a7432fd4a4fdba Mon Sep 17 00:00:00 2001 From: Sergeanur Date: Tue, 8 Dec 2020 07:52:03 +0200 Subject: Pool fixes from master --- src/control/Garages.cpp | 4 ++-- src/control/Phones.cpp | 2 +- src/control/Pickups.cpp | 4 ++-- src/control/Script5.cpp | 12 ++++++------ src/core/World.cpp | 16 ++++++++++++---- src/core/World.h | 2 +- src/core/templates.h | 12 +++++++++--- src/vehicles/Bike.cpp | 3 ++- src/vehicles/Cranes.cpp | 6 +++--- 9 files changed, 38 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/control/Garages.cpp b/src/control/Garages.cpp index 93067079..a8a7a46b 100644 --- a/src/control/Garages.cpp +++ b/src/control/Garages.cpp @@ -1466,7 +1466,7 @@ static bool DoINeedToRefreshPointer(CEntity * pDoor, bool bIsDummy, uint8 nIndex bool bNeedToFindDoorEntities = false; if (pDoor) { if (bIsDummy) { - if (CPools::GetDummyPool()->IsFreeSlot(CPools::GetDummyPool()->GetJustIndex((CDummy*)pDoor))) + if (CPools::GetDummyPool()->IsFreeSlot(CPools::GetDummyPool()->GetJustIndex_NoFreeAssert((CDummy*)pDoor))) return true; if (nIndex != (CPools::GetDummyPool()->GetIndex((CDummy*)pDoor) & 0x7F)) bNeedToFindDoorEntities = true; @@ -1474,7 +1474,7 @@ static bool DoINeedToRefreshPointer(CEntity * pDoor, bool bIsDummy, uint8 nIndex return true; } else { - if (CPools::GetObjectPool()->IsFreeSlot(CPools::GetObjectPool()->GetJustIndex((CObject*)pDoor))) + if (CPools::GetObjectPool()->IsFreeSlot(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert((CObject*)pDoor))) return true; if (nIndex != (CPools::GetObjectPool()->GetIndex((CObject*)pDoor) & 0x7F)) bNeedToFindDoorEntities = true; diff --git a/src/control/Phones.cpp b/src/control/Phones.cpp index 7f8677ec..edbfe6c2 100644 --- a/src/control/Phones.cpp +++ b/src/control/Phones.cpp @@ -308,7 +308,7 @@ INITSAVEBUF // Convert entity pointer to building pool index while saving if (phone->m_pEntity) { - phone->m_pEntity = (CEntity*) (CPools::GetBuildingPool()->GetJustIndex((CBuilding*)phone->m_pEntity) + 1); + phone->m_pEntity = (CEntity*) (CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert((CBuilding*)phone->m_pEntity) + 1); } } VALIDATESAVEBUF(*size) diff --git a/src/control/Pickups.cpp b/src/control/Pickups.cpp index 1ff4f8f6..45659554 100644 --- a/src/control/Pickups.cpp +++ b/src/control/Pickups.cpp @@ -1458,9 +1458,9 @@ INITSAVEBUF CPickup *buf_pickup = WriteSaveBuf(buf, aPickUps[i]); if (buf_pickup->m_eType != PICKUP_NONE) { if (buf_pickup->m_pObject != nil) - buf_pickup->m_pObject = (CObject*)(CPools::GetObjectPool()->GetJustIndex(buf_pickup->m_pObject) + 1); + buf_pickup->m_pObject = (CObject*)(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(buf_pickup->m_pObject) + 1); if (buf_pickup->m_pExtraObject != nil) - buf_pickup->m_pExtraObject = (CObject*)(CPools::GetObjectPool()->GetJustIndex(buf_pickup->m_pExtraObject) + 1); + buf_pickup->m_pExtraObject = (CObject*)(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(buf_pickup->m_pExtraObject) + 1); } } diff --git a/src/control/Script5.cpp b/src/control/Script5.cpp index 7efebb73..1f47c9b9 100644 --- a/src/control/Script5.cpp +++ b/src/control/Script5.cpp @@ -1784,10 +1784,10 @@ INITSAVEBUF handle = 0; } else if (pBuilding->GetIsATreadable()) { type = 1; - handle = CPools::GetTreadablePool()->GetJustIndex((CTreadable*)pBuilding) + 1; + handle = CPools::GetTreadablePool()->GetJustIndex_NoFreeAssert((CTreadable*)pBuilding) + 1; } else { type = 2; - handle = CPools::GetBuildingPool()->GetJustIndex(pBuilding) + 1; + handle = CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert(pBuilding) + 1; } WriteSaveBuf(buf, type); WriteSaveBuf(buf, handle); @@ -1805,19 +1805,19 @@ INITSAVEBUF case ENTITY_TYPE_BUILDING: if (((CBuilding*)pEntity)->GetIsATreadable()) { type = 1; - handle = CPools::GetTreadablePool()->GetJustIndex((CTreadable*)pEntity) + 1; + handle = CPools::GetTreadablePool()->GetJustIndex_NoFreeAssert((CTreadable*)pEntity) + 1; } else { type = 2; - handle = CPools::GetBuildingPool()->GetJustIndex((CBuilding*)pEntity) + 1; + handle = CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert((CBuilding*)pEntity) + 1; } break; case ENTITY_TYPE_OBJECT: type = 3; - handle = CPools::GetObjectPool()->GetJustIndex((CObject*)pEntity) + 1; + handle = CPools::GetObjectPool()->GetJustIndex_NoFreeAssert((CObject*)pEntity) + 1; break; case ENTITY_TYPE_DUMMY: type = 4; - handle = CPools::GetDummyPool()->GetJustIndex((CDummy*)pEntity) + 1; + handle = CPools::GetDummyPool()->GetJustIndex_NoFreeAssert((CDummy*)pEntity) + 1; default: break; } } diff --git a/src/core/World.cpp b/src/core/World.cpp index 7581a8b0..dc04738a 100644 --- a/src/core/World.cpp +++ b/src/core/World.cpp @@ -35,7 +35,7 @@ CColPoint gaTempSphereColPoints[MAX_COLLISION_POINTS]; -CPtrList CWorld::ms_bigBuildingsList[4]; +CPtrList CWorld::ms_bigBuildingsList[NUM_LEVELS]; CPtrList CWorld::ms_listMovingEntityPtrs; CSector CWorld::ms_aSectors[NUMSECTORS_Y][NUMSECTORS_X]; uint16 CWorld::ms_nCurrentScanCode; @@ -1781,21 +1781,29 @@ CWorld::ShutDown(void) CWorld::Remove(pEntity); delete pEntity; } +#ifndef FIX_BUGS pSector->m_lists[ENTITYLIST_BUILDINGS].Flush(); pSector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP].Flush(); pSector->m_lists[ENTITYLIST_DUMMIES].Flush(); pSector->m_lists[ENTITYLIST_DUMMIES_OVERLAP].Flush(); +#endif } - for(int32 i = 0; i < 4; i++) { - for(CPtrNode *pNode = GetBigBuildingList((eLevelName)i).first; pNode; pNode = pNode->next) { + for(int32 i = 0; i < NUM_LEVELS; i++) { + for(CPtrNode *pNode = ms_bigBuildingsList[i].first; pNode; pNode = pNode->next) { CEntity *pEntity = (CEntity *)pNode->item; // Maybe remove from world here? delete pEntity; } - GetBigBuildingList((eLevelName)i).Flush(); + ms_bigBuildingsList[i].Flush(); } for(int i = 0; i < NUMSECTORS_X * NUMSECTORS_Y; i++) { CSector *pSector = GetSector(i % NUMSECTORS_X, i / NUMSECTORS_Y); +#ifdef FIX_BUGS + pSector->m_lists[ENTITYLIST_BUILDINGS].Flush(); + pSector->m_lists[ENTITYLIST_BUILDINGS_OVERLAP].Flush(); + pSector->m_lists[ENTITYLIST_DUMMIES].Flush(); + pSector->m_lists[ENTITYLIST_DUMMIES_OVERLAP].Flush(); +#endif if(pSector->m_lists[ENTITYLIST_BUILDINGS].first) { sprintf(gString, "Building list %d,%d not empty\n", i % NUMSECTORS_X, i / NUMSECTORS_Y); pSector->m_lists[ENTITYLIST_BUILDINGS].Flush(); diff --git a/src/core/World.h b/src/core/World.h index be32db20..74ee4d8a 100644 --- a/src/core/World.h +++ b/src/core/World.h @@ -55,7 +55,7 @@ struct CStoredCollPoly; class CWorld { - static CPtrList ms_bigBuildingsList[4]; + static CPtrList ms_bigBuildingsList[NUM_LEVELS]; static CPtrList ms_listMovingEntityPtrs; static CSector ms_aSectors[NUMSECTORS_Y][NUMSECTORS_X]; static uint16 ms_nCurrentScanCode; diff --git a/src/core/templates.h b/src/core/templates.h index 9f5bd5ea..704331c3 100644 --- a/src/core/templates.h +++ b/src/core/templates.h @@ -124,12 +124,18 @@ public: (T*)&m_entries[handle >> 8] : nil; } int GetIndex(T *entry){ - int i = GetJustIndex(entry); + int i = GetJustIndex_NoFreeAssert(entry); return m_flags[i].u + (i<<8); } int GetJustIndex(T *entry){ - // TODO: the cast is unsafe - return (int)((U*)entry - m_entries); + int index = GetJustIndex_NoFreeAssert(entry); + assert(!IsFreeSlot(index)); + return index; + } + int GetJustIndex_NoFreeAssert(T* entry){ + int index = ((U*)entry - m_entries); + assert((U*)entry == (U*)&m_entries[index]); // cast is unsafe - check required + return index; } int GetNoOfUsedSpaces(void) const { int i; diff --git a/src/vehicles/Bike.cpp b/src/vehicles/Bike.cpp index 3a0be35f..faf31077 100644 --- a/src/vehicles/Bike.cpp +++ b/src/vehicles/Bike.cpp @@ -1213,7 +1213,8 @@ CBike::ProcessControl(void) // Balance bike if(bBalancedByRider || bIsBeingPickedUp || bIsStanding){ - float onSideness = clamp(DotProduct(GetRight(), m_vecAvgSurfaceNormal), -1.0f, 1.0f); + float onSideness = DotProduct(GetRight(), m_vecAvgSurfaceNormal); + onSideness = clamp(onSideness, -1.0f, 1.0f); CVector worldCOM = Multiply3x3(GetMatrix(), m_vecCentreOfMass); // Keep bike upright if(bBalancedByRider){ diff --git a/src/vehicles/Cranes.cpp b/src/vehicles/Cranes.cpp index 2a571a67..8433a0ba 100644 --- a/src/vehicles/Cranes.cpp +++ b/src/vehicles/Cranes.cpp @@ -629,11 +629,11 @@ void CCranes::Save(uint8* buf, uint32* size) for (int i = 0; i < NUM_CRANES; i++) { CCrane *pCrane = WriteSaveBuf(buf, aCranes[i]); if (pCrane->m_pCraneEntity != nil) - pCrane->m_pCraneEntity = (CBuilding*)(CPools::GetBuildingPool()->GetJustIndex(pCrane->m_pCraneEntity) + 1); + pCrane->m_pCraneEntity = (CBuilding*)(CPools::GetBuildingPool()->GetJustIndex_NoFreeAssert(pCrane->m_pCraneEntity) + 1); if (pCrane->m_pHook != nil) - pCrane->m_pHook = (CObject*)(CPools::GetObjectPool()->GetJustIndex(pCrane->m_pHook) + 1); + pCrane->m_pHook = (CObject*)(CPools::GetObjectPool()->GetJustIndex_NoFreeAssert(pCrane->m_pHook) + 1); if (pCrane->m_pVehiclePickedUp != nil) - pCrane->m_pVehiclePickedUp = (CVehicle*)(CPools::GetVehiclePool()->GetJustIndex(pCrane->m_pVehiclePickedUp) + 1); + pCrane->m_pVehiclePickedUp = (CVehicle*)(CPools::GetVehiclePool()->GetJustIndex_NoFreeAssert(pCrane->m_pVehiclePickedUp) + 1); } VALIDATESAVEBUF(*size); -- cgit v1.2.3