From 03ef438a7283fde341cc4938936ba882c3609993 Mon Sep 17 00:00:00 2001 From: "Walied K. Yassen" Date: Sun, 29 Nov 2020 04:20:28 +0200 Subject: [PATCH 1/6] Fix CObject::DeleteAllTempObjectsInArea not considering the given point --- src/objects/Object.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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; } From afe70003f4c48683c287ca3d16662cc710f8602e Mon Sep 17 00:00:00 2001 From: "Walied K. Yassen" Date: Sun, 29 Nov 2020 08:52:43 +0200 Subject: [PATCH 2/6] Fix MI_RCBOMB gravity force and treat MI_PETROLPUMP2 as explosive --- src/objects/Object.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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 From a1ab82b1887a9d2bf8d64b2223c0f135e1403a1d Mon Sep 17 00:00:00 2001 From: "Walied K. Yassen" Date: Sun, 29 Nov 2020 09:14:15 +0200 Subject: [PATCH 3/6] Implement MI_BEACHBALL behaviours --- src/core/General.h | 5 ++++ src/objects/Object.cpp | 53 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 54 insertions(+), 4 deletions(-) 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 From ac7ea2b9fafca17900a9106c85dbbdb3b508c175 Mon Sep 17 00:00:00 2001 From: "Walied K. Yassen" Date: Mon, 30 Nov 2020 02:09:35 +0200 Subject: [PATCH 4/6] 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(-) 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; From 1dcd7c5b14b6ce771347c48b53eae7f2411e1113 Mon Sep 17 00:00:00 2001 From: "Walied K. Yassen" Date: Mon, 30 Nov 2020 02:57:58 +0200 Subject: [PATCH 5/6] 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(-) 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.10f, 0.25f) + fDirectionZ); + 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); @@ -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.10f, 0.25f) + fDirectionZ); + 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); + 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; From 190bcf68f340538ab727baacddaac32541d571be Mon Sep 17 00:00:00 2001 From: "Walied K. Yassen" Date: Thu, 3 Dec 2020 10:03:23 +0200 Subject: [PATCH 6/6] 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(-) 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) {