Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
94 changes: 51 additions & 43 deletions src/Ext/Techno/Body.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<FootClass*>(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<FootClass*>(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;
}
}
}

Expand Down Expand Up @@ -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)
;
}
Expand Down
4 changes: 3 additions & 1 deletion src/Ext/Techno/Body.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ class TechnoExt
Valueable<bool> ReceiveDamage;
Valueable<bool> LastKillWasTeamTarget;
TimerStruct PassengerDeletionTimer;
Valueable<int> PassengerDeletionCountDown;
Valueable<ShieldTypeClass*> CurrentShieldType;

ExtData(TechnoClass* OwnerObject) : Extension<TechnoClass>(OwnerObject)
Expand All @@ -32,7 +33,8 @@ class TechnoExt
, LaserTrails {}
, ReceiveDamage { false }
, LastKillWasTeamTarget { false }
, PassengerDeletionTimer { -1 }
, PassengerDeletionTimer {}
, PassengerDeletionCountDown { -1 }
, CurrentShieldType {}
{ }

Expand Down