diff --git a/src/Ext/Techno/Body.cpp b/src/Ext/Techno/Body.cpp index f50b33243e..cc36605a38 100644 --- a/src/Ext/Techno/Body.cpp +++ b/src/Ext/Techno/Body.cpp @@ -320,68 +320,75 @@ void TechnoExt::EatPassengers(TechnoClass* pThis) if (pThis->Passengers.NumPassengers > 0) { - if (pExt->PassengerDeletionTimer.Expired()) + FootClass* pPassenger = pThis->Passengers.GetFirstPassenger(); + + if (pExt->PassengerDeletionCountDown < 0) { - FootClass* pPassenger = pThis->Passengers.GetFirstPassenger(); - ObjectClass* pLastPassenger = nullptr; + // Setting & start countdown. Bigger units needs more time + int passengerSize = pData->PassengerDeletion_Rate; + if (pData->PassengerDeletion_Rate_SizeMultiply && pPassenger->GetTechnoType()->Size > 1.0) + passengerSize *= (int)(pPassenger->GetTechnoType()->Size + 0.5); - // Passengers are designed as a FIFO queue but being implemented as a list - while (pPassenger->NextObject) + pExt->PassengerDeletionCountDown = passengerSize; + pExt->PassengerDeletionTimer.Start(passengerSize); + } + else + { + if (pExt->PassengerDeletionTimer.Completed()) { - pLastPassenger = pPassenger; - pPassenger = static_cast(pPassenger->NextObject); - } + ObjectClass* pLastPassenger = nullptr; - if (pLastPassenger) - pLastPassenger->NextObject = nullptr; - else - pThis->Passengers.FirstPassenger = nullptr; + // Passengers are designed as a FIFO queue but being implemented as a list + while (pPassenger->NextObject) + { + pLastPassenger = pPassenger; + pPassenger = static_cast(pPassenger->NextObject); + } - --pThis->Passengers.NumPassengers; + if (pLastPassenger) + pLastPassenger->NextObject = nullptr; + else + pThis->Passengers.FirstPassenger = nullptr; - if (pPassenger) - { - if (auto const pPassengerType = pPassenger->GetTechnoType()) - { - VocClass::PlayAt(pData->PassengerDeletion_ReportSound, pThis->GetCoords(), nullptr); + --pThis->Passengers.NumPassengers; - // Check if there is money refund - if (pData->PassengerDeletion_Soylent) + if (pPassenger) + { + if (auto const pPassengerType = pPassenger->GetTechnoType()) { - int nMoneyToGive = 0; + VocClass::PlayAt(pData->PassengerDeletion_ReportSound, pThis->GetCoords(), nullptr); - // Refund money to the Attacker - if (pPassengerType && pPassengerType->Soylent > 0) - nMoneyToGive = pPassengerType->Soylent; + // Check if there is money refund + if (pData->PassengerDeletion_Soylent) + { + int nMoneyToGive = 0; - // Is allowed the refund of friendly units? - if (!pData->PassengerDeletion_SoylentFriendlies && pPassenger->Owner->IsAlliedWith(pThis)) - nMoneyToGive = 0; + // Refund money to the Attacker + if (pPassengerType && pPassengerType->Soylent > 0) + nMoneyToGive = pPassengerType->Soylent; - if (nMoneyToGive > 0) - pThis->Owner->GiveMoney(nMoneyToGive); - } - } - - pPassenger->UnInit(); - } - pExt->PassengerDeletionTimer.Stop(); + // Is allowed the refund of friendly units? + if (!pData->PassengerDeletion_SoylentFriendlies && pPassenger->Owner->IsAlliedWith(pThis)) + nMoneyToGive = 0; - if (pThis->Passengers.NumPassengers > 0) - { - pPassenger = pThis->Passengers.GetFirstPassenger(); + if (nMoneyToGive > 0) + pThis->Owner->GiveMoney(nMoneyToGive); + } + } - // Setting & start countdown. Bigger units needs more time - int passengerSize = pData->PassengerDeletion_Rate; - if (pData->PassengerDeletion_Rate_SizeMultiply && pPassenger->GetTechnoType()->Size > 1.0) - passengerSize *= (int)(pPassenger->GetTechnoType()->Size + 0.5); + pPassenger->UnInit(); + } - pExt->PassengerDeletionTimer.Start(passengerSize); + pExt->PassengerDeletionTimer.Stop(); + pExt->PassengerDeletionCountDown = -1; } } } else + { pExt->PassengerDeletionTimer.Stop(); + pExt->PassengerDeletionCountDown = -1; + } } } @@ -411,6 +418,7 @@ void TechnoExt::ExtData::Serialize(T& Stm) .Process(this->LaserTrails) .Process(this->ReceiveDamage) .Process(this->PassengerDeletionTimer) + .Process(this->PassengerDeletionCountDown) .Process(this->CurrentShieldType) ; } diff --git a/src/Ext/Techno/Body.h b/src/Ext/Techno/Body.h index 67a4c429c7..b6832f49f7 100644 --- a/src/Ext/Techno/Body.h +++ b/src/Ext/Techno/Body.h @@ -24,6 +24,7 @@ class TechnoExt Valueable ReceiveDamage; Valueable LastKillWasTeamTarget; TimerStruct PassengerDeletionTimer; + Valueable PassengerDeletionCountDown; Valueable CurrentShieldType; ExtData(TechnoClass* OwnerObject) : Extension(OwnerObject) @@ -32,7 +33,8 @@ class TechnoExt , LaserTrails {} , ReceiveDamage { false } , LastKillWasTeamTarget { false } - , PassengerDeletionTimer { -1 } + , PassengerDeletionTimer {} + , PassengerDeletionCountDown { -1 } , CurrentShieldType {} { }