diff --git a/src/audio/AudioLogic.cpp b/src/audio/AudioLogic.cpp index 18fe4fc5..9a8dda28 100644 --- a/src/audio/AudioLogic.cpp +++ b/src/audio/AudioLogic.cpp @@ -4784,11 +4784,10 @@ void cAudioManager::ProcessExplosions(int32 explosion) { uint8 type; - CVector *pos; float distSquared; for (uint8 i = 0; i < ARRAY_SIZE(gaExplosion); i++) { - if (CExplosion::GetExplosionActiveCounter(i) == 1) { + if (CExplosion::DoesExplosionMakeSound(i) && CExplosion::GetExplosionActiveCounter(i) == 1) { CExplosion::ResetExplosionActiveCounter(i); type = CExplosion::GetExplosionType(i); switch (type) { @@ -4796,42 +4795,44 @@ cAudioManager::ProcessExplosions(int32 explosion) case EXPLOSION_ROCKET: case EXPLOSION_BARREL: case EXPLOSION_TANK_GRENADE: - m_sQueueSample.m_fSoundIntensity = 400.0f; + m_sQueueSample.m_fSoundIntensity = 200.0f; m_sQueueSample.m_nSampleIndex = SFX_EXPLOSION_2; - m_sQueueSample.m_nFrequency = RandomDisplacement(2000) + 38000; + m_sQueueSample.m_nFrequency = RandomDisplacement(1000) + 19000; m_sQueueSample.m_nReleasingVolumeModificator = 0; m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bRequireReflection = true; break; case EXPLOSION_MOLOTOV: - m_sQueueSample.m_fSoundIntensity = 200.0f; + m_sQueueSample.m_fSoundIntensity = 150.0f; m_sQueueSample.m_nSampleIndex = SFX_EXPLOSION_3; m_sQueueSample.m_nFrequency = RandomDisplacement(1000) + 19000; m_sQueueSample.m_nReleasingVolumeModificator = 0; m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bRequireReflection = false; break; case EXPLOSION_MINE: case EXPLOSION_HELI_BOMB: - m_sQueueSample.m_fSoundIntensity = 300.0f; + m_sQueueSample.m_fSoundIntensity = 200.0f; m_sQueueSample.m_nSampleIndex = SFX_ROCKET_LEFT; m_sQueueSample.m_nFrequency = RandomDisplacement(1000) + 12347; m_sQueueSample.m_nReleasingVolumeModificator = 0; m_sQueueSample.m_nBankIndex = SFX_BANK_0; + m_sQueueSample.m_bRequireReflection = true; break; default: - m_sQueueSample.m_fSoundIntensity = 400.0f; + m_sQueueSample.m_fSoundIntensity = 200.0f; m_sQueueSample.m_nSampleIndex = SFX_EXPLOSION_1; - m_sQueueSample.m_nFrequency = RandomDisplacement(2000) + 38000; + m_sQueueSample.m_nFrequency = RandomDisplacement(1000) + 19500; if (type == EXPLOSION_HELI) - m_sQueueSample.m_nFrequency = 8 * m_sQueueSample.m_nFrequency / 10; + m_sQueueSample.m_nFrequency = 8 * m_sQueueSample.m_nFrequency / 10; //same *= 8 / 10; m_sQueueSample.m_nReleasingVolumeModificator = 0; m_sQueueSample.m_nBankIndex = SFX_BANK_GENERIC_EXTRA; break; } - pos = CExplosion::GetExplosionPosition(i); - m_sQueueSample.m_vecPos = *pos; + m_sQueueSample.m_vecPos = *CExplosion::GetExplosionPosition(i); distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos); if (distSquared < SQR(m_sQueueSample.m_fSoundIntensity)) { - m_sQueueSample.m_fDistance = Sqrt(distSquared); + m_sQueueSample.m_fDistance = distSquared <= 0.0f ? 0.0f : Sqrt(distSquared); m_sQueueSample.m_nVolume = ComputeVolume(MAX_VOLUME, m_sQueueSample.m_fSoundIntensity, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = i; @@ -4839,12 +4840,10 @@ cAudioManager::ProcessExplosions(int32 explosion) m_sQueueSample.m_bIs2D = false; m_sQueueSample.m_nLoopCount = 1; m_sQueueSample.m_bReleasingSoundFlag = true; - m_sQueueSample.m_bReverbFlag = true; m_sQueueSample.m_nEmittingVolume = MAX_VOLUME; m_sQueueSample.m_nLoopStart = 0; m_sQueueSample.m_nLoopEnd = -1; m_sQueueSample.m_bReverbFlag = true; - m_sQueueSample.m_bRequireReflection = true; AddSampleToRequestedQueue(); } } @@ -5933,15 +5932,15 @@ cAudioManager::ProcessGarages() void cAudioManager::ProcessFireHydrant() { + const int SOUND_INTENSITY = 35; + float distSquared; - bool distCalculated = false; - static const int intensity = 35; m_sQueueSample.m_vecPos = ((CEntity *)m_asAudioEntities[m_sQueueSample.m_nEntityIndex].m_pEntity)->GetPosition(); distSquared = GetDistanceSquared(m_sQueueSample.m_vecPos); - if (distSquared < SQR(intensity)) { - CalculateDistance(distCalculated, distSquared); - m_sQueueSample.m_nVolume = ComputeVolume(40, 35.f, m_sQueueSample.m_fDistance); + if (distSquared < SQR(SOUND_INTENSITY)) { + m_sQueueSample.m_fDistance = distSquared <= 0.0f ? 0.0f : Sqrt(distSquared); + m_sQueueSample.m_nVolume = ComputeVolume(40, 35.0f, m_sQueueSample.m_fDistance); if (m_sQueueSample.m_nVolume != 0) { m_sQueueSample.m_nCounter = 0; m_sQueueSample.m_nSampleIndex = SFX_JUMBO_TAXI; @@ -5954,7 +5953,7 @@ cAudioManager::ProcessFireHydrant() m_sQueueSample.m_nLoopStart = SampleManager.GetSampleLoopStartOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_nLoopEnd = SampleManager.GetSampleLoopEndOffset(m_sQueueSample.m_nSampleIndex); m_sQueueSample.m_fSpeedMultiplier = 2.0f; - m_sQueueSample.m_fSoundIntensity = intensity; + m_sQueueSample.m_fSoundIntensity = SOUND_INTENSITY; m_sQueueSample.m_bReleasingSoundFlag = false; m_sQueueSample.m_nReleasingVolumeDivider = 3; m_sQueueSample.m_bReverbFlag = true; diff --git a/src/audio/AudioManager.h b/src/audio/AudioManager.h index 267260c5..a43b4309 100644 --- a/src/audio/AudioManager.h +++ b/src/audio/AudioManager.h @@ -257,9 +257,9 @@ public: uint8 ComputeVolume(uint8 emittingVolume, float soundIntensity, float distance) const; // done int32 CreateEntity(eAudioType type, void *entity); // done - void DestroyAllGameCreatedEntities(); - void DestroyEntity(int32 id); //done (inlined in vc) - void DoPoliceRadioCrackle(); + void DestroyAllGameCreatedEntities(); // done ? I don't seed pEntity = nil; + void DestroyEntity(int32 id); // done (inlined in vc) ? I not seen id checks + void DoPoliceRadioCrackle(); // done // functions returning talk sfx, // order from GetPedCommentSfx @@ -296,12 +296,12 @@ public: bool MissionScriptAudioUsesPoliceChannel(int32 soundMission) const; - void PlayLoadedMissionAudio(uint8 slot); // done - void PlayOneShot(int32 index, int16 sound, float vol); // done - void PlaySuspectLastSeen(float x, float y, float z); - void PlayerJustGotInCar() const; // done - void PlayerJustLeftCar() const; // done - void PostInitialiseGameSpecificSetup(); + void PlayLoadedMissionAudio(uint8 slot); // done + void PlayOneShot(int32 index, int16 sound, float vol); // done + void PlaySuspectLastSeen(float x, float y, float z); // + void PlayerJustGotInCar() const; // done + void PlayerJustLeftCar() const; // done + void PostInitialiseGameSpecificSetup(); // void PostTerminateGameSpecificShutdown(); // done void PreInitialiseGameSpecificSetup() const; // done void PreloadMissionAudio(uint8 slot, Const char *name); // done @@ -317,40 +317,40 @@ public: void ProcessBridgeOneShots(); void ProcessBridgeWarning(); #endif - bool ProcessCarBombTick(cVehicleParams *params); //done - void ProcessCesna(cVehicleParams *params); - //void ProcessCrane(); - bool ProcessEngineDamage(cVehicleParams *params); //done - void ProcessEntity(int32 sound); //done - void ProcessExplosions(int32 explosion); - void ProcessFireHydrant(); - void ProcessFires(int32 entity); - void ProcessFrontEnd(); - void ProcessGarages(); - void ProcessCarHeli(cVehicleParams* params); //done - void ProcessVehicleFlatTyre(cVehicleParams* params); //done - void ProcessJumbo(cVehicleParams *); - void ProcessJumboAccel(CPlane *plane); - void ProcessJumboDecel(CPlane *plane); - void ProcessJumboFlying(); - void ProcessJumboLanding(CPlane *plane); - void ProcessJumboTakeOff(CPlane *plane); - void ProcessJumboTaxi(); - void ProcessLoopingScriptObject(uint8 sound); - void ProcessMissionAudio(); - void ProcessMissionAudioSlot(uint8 slot); - void ProcessModelCarEngine(cVehicleParams *params); - void ProcessOneShotScriptObject(uint8 sound); - void ProcessPed(CPhysical *ped); - void ProcessPedOneShots(cPedParams *params); - void ProcessPhysical(int32 id); //done - void ProcessPlane(cVehicleParams *params); //done - void ProcessPlayersVehicleEngine(cVehicleParams *params, CVehicle* veh); //done - void ProcessProjectiles(); - void ProcessRainOnVehicle(cVehicleParams *params); - void ProcessReverb() const; - bool ProcessReverseGear(cVehicleParams *params); //done - void ProcessScriptObject(int32 id); //done + bool ProcessCarBombTick(cVehicleParams *params); // done + void ProcessCesna(cVehicleParams *params); // + //void ProcessCrane(); // + bool ProcessEngineDamage(cVehicleParams *params); // done + void ProcessEntity(int32 sound); // done + void ProcessExplosions(int32 explosion); // done + void ProcessFireHydrant(); // done + void ProcessFires(int32 entity); // + void ProcessFrontEnd(); // + void ProcessGarages(); // + void ProcessCarHeli(cVehicleParams* params); // done + void ProcessVehicleFlatTyre(cVehicleParams* params); // done + void ProcessJumbo(cVehicleParams *); // + void ProcessJumboAccel(CPlane *plane); // + void ProcessJumboDecel(CPlane *plane); // + void ProcessJumboFlying(); // + void ProcessJumboLanding(CPlane *plane); // + void ProcessJumboTakeOff(CPlane *plane); // + void ProcessJumboTaxi(); // + void ProcessLoopingScriptObject(uint8 sound); // + void ProcessMissionAudio(); // + void ProcessMissionAudioSlot(uint8 slot); // + void ProcessModelCarEngine(cVehicleParams *params); // + void ProcessOneShotScriptObject(uint8 sound); // + void ProcessPed(CPhysical *ped); // + void ProcessPedOneShots(cPedParams *params); // + void ProcessPhysical(int32 id); // done + void ProcessPlane(cVehicleParams *params); // done + void ProcessPlayersVehicleEngine(cVehicleParams *params, CVehicle* veh); // done + void ProcessProjectiles(); // + void ProcessRainOnVehicle(cVehicleParams *params); // + void ProcessReverb() const; // + bool ProcessReverseGear(cVehicleParams *params); // done + void ProcessScriptObject(int32 id); // done void ProcessSpecial(); #ifdef GTA_TRAIN bool ProcessTrainNoise(cVehicleParams *params); diff --git a/src/weapons/Explosion.cpp b/src/weapons/Explosion.cpp index 5d4b8f80..515dff94 100644 --- a/src/weapons/Explosion.cpp +++ b/src/weapons/Explosion.cpp @@ -25,6 +25,9 @@ CExplosion gaExplosion[NUM_EXPLOSIONS]; RwRGBA colMedExpl = { 0, 0, 0, 0 }; RwRGBA colUpdate = { 0, 0, 0, 0 }; +const RwRGBA colAddExplosion = { 160, 160, 160, 255 }; +const RwRGBA colGrenade = { 96, 96, 96, 255 }; + int AudioHandle = AEHANDLE_NONE; void @@ -53,6 +56,7 @@ CExplosion::ClearAllExplosions() gaExplosion[i].m_nIteration = 0; gaExplosion[i].m_fStartTime = 0.0f; gaExplosion[i].m_bIsBoat = false; + gaExplosion[i].m_bMakeSound = true; } } @@ -85,6 +89,12 @@ CExplosion::GetExplosionType(uint8 id) return gaExplosion[id].m_ExplosionType; } +bool +CExplosion::DoesExplosionMakeSound(uint8 id) +{ + return gaExplosion[id].m_bMakeSound; +}; + CVector * CExplosion::GetExplosionPosition(uint8 id) { @@ -92,14 +102,15 @@ CExplosion::GetExplosionPosition(uint8 id) } bool -CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type, const CVector &pos, uint32 lifetime, bool unk) +CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type, const CVector &pos, uint32 lifetime, bool makeSound) { CVector pPosn; CVector posGround; RwRGBA colorMedium = colMedExpl; + RwRGBA color = colAddExplosion; + RwRGBA colorGrenade = colGrenade; bool bDontExplode = false; - const RwRGBA color = { 160, 160, 160, 255 }; pPosn = pos; pPosn.z += 5.0f; #ifdef FIX_BUGS @@ -129,6 +140,7 @@ CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionT explosion.m_nIteration = 1; explosion.m_nActiveCounter = 1; explosion.m_bIsBoat = false; + explosion.m_bMakeSound = makeSound; explosion.m_nParticlesExpireTime = lifetime != 0 ? CTimer::GetTimeInMilliseconds() + lifetime : 0; switch (type) { @@ -140,8 +152,12 @@ CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionT posGround = pos; posGround.z = CWorld::FindGroundZFor3DCoord(posGround.x, posGround.y, posGround.z + 3.0f, nil); CEventList::RegisterEvent(EVENT_EXPLOSION, posGround, 250); - if (Distance(explosion.m_vecPosition, TheCamera.GetPosition()) < 40.0f) - CParticle::AddParticle(PARTICLE_EXPLOSION_LFAST, explosion.m_vecPosition, CVector(0.0f, 0.0f, 0.0f), nil, 5.5f, color); + if (Distance(explosion.m_vecPosition, TheCamera.GetPosition()) < 40.0f) { + uint8 tmp = CGeneral::GetRandomNumberInRange(0, 64) - 64; + colorGrenade.green += tmp; + colorGrenade.blue += tmp; + CParticle::AddParticle(PARTICLE_EXPLOSION_LFAST, explosion.m_vecPosition, CVector(0.0f, 0.0f, 0.0f), nil, 4.5f, colorGrenade); + } break; case EXPLOSION_MOLOTOV: { @@ -151,18 +167,17 @@ CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionT explosion.m_fPropagationRate = 0.5f; posGround = pos; bool found; - posGround.z = CWorld::FindGroundZFor3DCoord(posGround.x, posGround.y, posGround.z + 3.0f, &found); - if (found) { - float waterLevel; - if (CWaterLevel::GetWaterLevelNoWaves(posGround.x, posGround.y, posGround.z, &waterLevel) - && posGround.z < waterLevel - && waterLevel - 6.0f < posGround.z) // some subway/tunnels check? - bDontExplode = true; - else - gFireManager.StartFire(posGround, 1.8f, false); - } - else + float tmp = CWorld::FindGroundZFor3DCoord(posGround.x, posGround.y, posGround.z + 3.0f, &found); + if (found) + posGround.z = tmp; + + float waterLevel; + if (CWaterLevel::GetWaterLevelNoWaves(posGround.x, posGround.y, posGround.z, &waterLevel) + && posGround.z < waterLevel && waterLevel - 6.0f < posGround.z) { // some subway/tunnels check? bDontExplode = true; + } else if (found) { + gFireManager.StartFire(posGround, 1.8f, false); + } break; } case EXPLOSION_ROCKET: @@ -186,60 +201,71 @@ CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionT if (explosion.m_pVictimEntity->IsVehicle() && ((CVehicle*)explosion.m_pVictimEntity)->IsBoat()) explosion.m_bIsBoat = true; CEventList::RegisterEvent(EVENT_EXPLOSION, EVENT_ENTITY_VEHICLE, explosion.m_pVictimEntity, nil, 1000); - } else + } else { CEventList::RegisterEvent(EVENT_EXPLOSION, pos, 1000); + } if (explosion.m_pVictimEntity != nil && !explosion.m_bIsBoat) { - int rn = (CGeneral::GetRandomNumber() & 1) + 2; - for (int i = 0; i < rn; i++) { - CParticle::AddParticle(PARTICLE_EXPLOSION_MEDIUM, explosion.m_pVictimEntity->GetPosition(), CVector(0.0f, 0.0f, 0.0f), nil, 3.5f, colMedExpl); - CParticle::AddParticle(PARTICLE_EXPLOSION_LFAST, explosion.m_pVictimEntity->GetPosition(), CVector(0.0f, 0.0f, 0.0f), nil, 5.5f, color); - } CVehicle *veh = (CVehicle*)explosion.m_pVictimEntity; - int32 component = CAR_WING_LR; + CVector componentPos; - // miami leftover - if (veh->IsBike()) - component = BIKE_FORKS_REAR; - - if (veh->IsComponentPresent(component)) { - CVector componentPos; - veh->GetComponentWorldPosition(component, componentPos); - rn = (CGeneral::GetRandomNumber() & 1) + 1; + if (veh->IsBike()) { + veh->GetComponentWorldPosition(BIKE_FORKS_REAR, componentPos); + } else if (veh->IsComponentPresent(CAR_BUMP_REAR) && veh->IsComponentPresent(CAR_WHEEL_LB)) { //mb it's another enum + CVector tmpVec; + veh->GetComponentWorldPosition(CAR_BUMP_REAR, componentPos); + veh->GetComponentWorldPosition(CAR_WHEEL_LB, tmpVec); + componentPos += tmpVec; + componentPos /= 2.0f; + } else if (veh->IsComponentPresent(CAR_BOOT)) { + veh->GetComponentWorldPosition(CAR_BOOT, componentPos); + } + if (componentPos != nil) { + int rn = (CGeneral::GetRandomNumber() & 1) + 1; for (int i = 0; i < rn; i++) - CParticle::AddJetExplosion(componentPos, 1.4f, 0.0f); + CParticle::AddJetExplosion(componentPos, (CGeneral::GetRandomNumber() & 7) / 7.0f + 1.5f, 0.5f); } } break; case EXPLOSION_HELI: case EXPLOSION_HELI2: - explosion.m_fRadius = 6.0f; - explosion.m_fPower = 300.0f; + if (type == EXPLOSION_HELI2) { + explosion.m_fRadius = 12.0f; + explosion.m_fPower = 500.0f; + } else { + explosion.m_fRadius = 6.0f; + explosion.m_fPower = 300.0f; + } explosion.m_fStopTime = lifetime + CTimer::GetTimeInMilliseconds() + 750; explosion.m_fPropagationRate = 0.5f; explosion.m_fStartTime = CTimer::GetTimeInMilliseconds(); for (int i = 0; i < 10; i++) { CVector randpos; - uint8 x, y, z; - x = CGeneral::GetRandomNumber(); - y = CGeneral::GetRandomNumber(); - z = CGeneral::GetRandomNumber(); - randpos = pos + CVector(x - 128, y - 128, z - 128) / 20.0f; + randpos.x = CGeneral::GetRandomNumber(); + randpos.y = CGeneral::GetRandomNumber(); + randpos.z = CGeneral::GetRandomNumber(); + randpos -= CVector(128, 128, 128); + randpos /= 20.0f; + randpos += pos; CParticle::AddParticle(PARTICLE_EXPLOSION_MFAST, randpos, CVector(0.0f, 0.0f, 0.0f), nil, 2.5f, color); - x = CGeneral::GetRandomNumber(); - y = CGeneral::GetRandomNumber(); - z = CGeneral::GetRandomNumber(); - randpos = pos + CVector(x - 128, y - 128, z - 128) / 20.0f; + randpos.x = CGeneral::GetRandomNumber(); + randpos.y = CGeneral::GetRandomNumber(); + randpos.z = CGeneral::GetRandomNumber(); + randpos -= CVector(128, 128, 128); + randpos /= 20.0f; + randpos += pos; CParticle::AddParticle(PARTICLE_EXPLOSION_LFAST, randpos, CVector(0.0f, 0.0f, 0.0f), nil, 5.0f, color); - x = CGeneral::GetRandomNumber(); - y = CGeneral::GetRandomNumber(); - z = CGeneral::GetRandomNumber(); - randpos = pos + CVector(x - 128, y - 128, z - 128) / 20.0f; + randpos.x = CGeneral::GetRandomNumber(); + randpos.y = CGeneral::GetRandomNumber(); + randpos.z = CGeneral::GetRandomNumber(); + randpos -= CVector(128, 128, 128); + randpos /= 20.0f; + randpos += pos; CParticle::AddJetExplosion(randpos, 1.4f, 3.0f); } @@ -262,13 +288,10 @@ CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionT explosion.m_fPropagationRate = 0.5f; for (int i = 0; i < 6; i++) { CVector randpos; - uint8 x, y, z; - - x = CGeneral::GetRandomNumber(); - y = CGeneral::GetRandomNumber(); - z = CGeneral::GetRandomNumber(); - randpos = CVector(x - 128, y - 128, z - 128); - + randpos.x = CGeneral::GetRandomNumber(); + randpos.y = CGeneral::GetRandomNumber(); + randpos.z = CGeneral::GetRandomNumber(); + randpos -= CVector(128, 128, 128); randpos.x /= 50.0f; randpos.y /= 50.0f; randpos.z /= 25.0f; @@ -300,7 +323,11 @@ CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionT CWorld::FindGroundZFor3DCoord(pos.x, pos.y, pos.z + 4.0f, nil); // BUG? result is unused CEventList::RegisterEvent(EVENT_EXPLOSION, posGround, 250); break; + default: + debug("Undefined explosion type, AddExplosion, Explosion.cpp"); + break; } + if (bDontExplode) { explosion.m_nIteration = 0; return false; @@ -309,8 +336,12 @@ CExplosion::AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionT if (explosion.m_fPower != 0.0f && explosion.m_nParticlesExpireTime == 0) CWorld::TriggerExplosion(pos, explosion.m_fRadius, explosion.m_fPower, culprit, (type == EXPLOSION_ROCKET || type == EXPLOSION_CAR_QUICK || type == EXPLOSION_MINE || type == EXPLOSION_BARREL || type == EXPLOSION_TANK_GRENADE || type == EXPLOSION_HELI_BOMB)); - TheCamera.CamShake(0.6f, pos.x, pos.y, pos.z); - CPad::GetPad(0)->StartShake_Distance(300, 128, pos.x, pos.y, pos.z); + if (type == EXPLOSION_MOLOTOV) { + TheCamera.CamShake(0.2f, pos.x, pos.y, pos.z); + } else { + TheCamera.CamShake(0.6f, pos.x, pos.y, pos.z); + CPad::GetPad(0)->StartShake_Distance(300, 128, pos.x, pos.y, pos.z); + } return true; } @@ -336,6 +367,7 @@ CExplosion::Update() case EXPLOSION_GRENADE: case EXPLOSION_ROCKET: case EXPLOSION_HELI: + case EXPLOSION_HELI2: case EXPLOSION_MINE: case EXPLOSION_BARREL: if (CTimer::GetFrameCounter() & 1) { @@ -354,8 +386,10 @@ CExplosion::Update() point1.z += 5.0f; CColPoint colPoint; CEntity *pEntity; - CWorld::ProcessVerticalLine(point1, -1000.0f, colPoint, pEntity, true, false, false, false, true, false, nil); - explosion.m_fZshift = colPoint.point.z; + if (CWorld::ProcessVerticalLine(point1, -1000.0f, colPoint, pEntity, true, false, false, false, true, false, nil)) + explosion.m_fZshift = colPoint.point.z; + else + explosion.m_fZshift = explosion.m_vecPosition.z; } float ff = ((float)explosion.m_nIteration * 0.55f); for (int i = 0; i < 5 * ff; i++) { @@ -364,8 +398,6 @@ CExplosion::Update() CVector pos = explosion.m_vecPosition; pos.x += ff * Sin(angle); pos.y += ff * Cos(angle); - pos.z += 5.0f; // what is the point of this? - pos.z = explosion.m_fZshift + 0.5f; CParticle::AddParticle(PARTICLE_EXPLOSION_MEDIUM, pos, CVector(0.0f, 0.0f, 0.0f), nil, 0.0f, color, CGeneral::GetRandomNumberInRange(-3.0f, 3.0f), CGeneral::GetRandomNumberInRange(-180.0f, 180.0f)); } @@ -373,9 +405,10 @@ CExplosion::Update() break; case EXPLOSION_CAR: case EXPLOSION_CAR_QUICK: + case EXPLOSION_BOAT: if (someTime >= 3500) { - if (explosion.m_pVictimEntity != nil && !explosion.m_bIsBoat) { - if ((CGeneral::GetRandomNumber() & 0xF) == 0) { + if (explosion.m_pVictimEntity != nil) { + if ((CGeneral::GetRandomNumber() & 0xF) == 0 && !explosion.m_bIsBoat) { CVehicle *veh = (CVehicle*)explosion.m_pVictimEntity; uint8 component = CAR_WING_LR; @@ -386,16 +419,14 @@ CExplosion::Update() if (veh->IsComponentPresent(component)) { CVector componentPos; veh->GetComponentWorldPosition(component, componentPos); - CParticle::AddJetExplosion(componentPos, 1.5f, 0.0f); + CParticle::AddJetExplosion(componentPos, 0.5f, 0.0f); } } if (CTimer::GetTimeInMilliseconds() > explosion.m_fStartTime) { explosion.m_fStartTime = CTimer::GetTimeInMilliseconds() + 125 + (CGeneral::GetRandomNumber() & 0x7F); CVector pos = explosion.m_pVictimEntity->GetPosition(); - for (int i = 0; i < (CGeneral::GetRandomNumber() & 1) + 1; i++) { + for (int i = 0; i < (CGeneral::GetRandomNumber() & 1) + 1; i++) CParticle::AddParticle(PARTICLE_EXPLOSION_MEDIUM, pos, CVector(0.0f, 0.0f, 0.0f), nil, 3.5f, color); - CParticle::AddParticle(PARTICLE_EXPLOSION_LARGE, pos, CVector(0.0f, 0.0f, 0.0f), nil, 5.5f, color); - } } } if (CTimer::GetFrameCounter() & 1) { @@ -422,13 +453,15 @@ CExplosion::Update() CVector pos(x - 128, y - 128, (z % 128) + 1); pos.Normalise(); - pos *= ff / 5.0f; + pos *= (explosion.m_nIteration + 1) * ff / 5.0f; pos += explosion.m_vecPosition; pos.z += 0.5f; CParticle::AddParticle(PARTICLE_EXPLOSION_LARGE, pos, CVector(0.0f, 0.0f, 0.0f), nil, 0.0f, color, CGeneral::GetRandomNumberInRange(-3.0f, 3.0f), CGeneral::GetRandomNumberInRange(-180.0f, 180.0f)); } } break; + default: + break; } if (someTime > 0) explosion.m_nIteration++; diff --git a/src/weapons/Explosion.h b/src/weapons/Explosion.h index f709012e..7aa02b63 100644 --- a/src/weapons/Explosion.h +++ b/src/weapons/Explosion.h @@ -30,24 +30,25 @@ class CExplosion float m_fStopTime; uint8 m_nIteration; uint8 m_nActiveCounter; + bool m_bIsBoat; + bool m_bMakeSound; float m_fStartTime; uint32 m_nParticlesExpireTime; float m_fPower; - bool m_bIsBoat; float m_fZshift; public: - static void Initialise(); - static void ClearAllExplosions(); - static void Shutdown(); - static int8 GetExplosionActiveCounter(uint8 id); - static void ResetExplosionActiveCounter(uint8 id); - static uint8 GetExplosionType(uint8 id); - static CVector *GetExplosionPosition(uint8 id); -// TODO(MIAMI): that new parameter - static bool AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type, const CVector &pos, uint32 lifetime, bool unk = true); - static void Update(); - static bool TestForExplosionInArea(eExplosionType type, float x1, float x2, float y1, float y2, float z1, float z2); - static void RemoveAllExplosionsInArea(CVector pos, float radius); + static bool AddExplosion(CEntity *explodingEntity, CEntity *culprit, eExplosionType type, const CVector &pos, uint32 lifetime, bool makeSound = true); //done(new parametr in android ver is fix for one mission) + static void ClearAllExplosions(); //done + static bool DoesExplosionMakeSound(uint8 id); //done + static int8 GetExplosionActiveCounter(uint8 id); //done + static CVector *GetExplosionPosition(uint8 id); //done + static uint8 GetExplosionType(uint8 id); //done, mb need change type to tExplosionType + static void Initialise(); //done + static void RemoveAllExplosionsInArea(CVector pos, float radius); //done + static void ResetExplosionActiveCounter(uint8 id); //done + static void Shutdown(); //done + static void Update(); //done + static bool TestForExplosionInArea(eExplosionType type, float x1, float x2, float y1, float y2, float z1, float z2); //done, not used }; extern CExplosion gaExplosion[NUM_EXPLOSIONS]; \ No newline at end of file