Skip to content

Commit e47ca8e

Browse files
committed
optimize Spawner.LimitRange & fix #371
1 parent d594920 commit e47ca8e

File tree

3 files changed

+44
-17
lines changed

3 files changed

+44
-17
lines changed

src/Ext/Techno/Body.Update.cpp

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -497,22 +497,7 @@ void TechnoExt::ExtData::ApplySpawnLimitRange()
497497

498498
if (auto const pManager = pThis->SpawnManager)
499499
{
500-
auto const pTechnoType = pThis->GetTechnoType();
501-
int weaponRange = 0;
502-
int weaponRangeExtra = pTypeExt->Spawner_ExtraLimitRange * Unsorted::LeptonsPerCell;
503-
504-
auto setWeaponRange = [&weaponRange](WeaponTypeClass* pWeaponType)
505-
{
506-
if (pWeaponType && pWeaponType->Spawner && pWeaponType->Range > weaponRange)
507-
weaponRange = pWeaponType->Range;
508-
};
509-
510-
setWeaponRange(pTechnoType->Weapon[0].WeaponType);
511-
setWeaponRange(pTechnoType->Weapon[1].WeaponType);
512-
setWeaponRange(pTechnoType->EliteWeapon[0].WeaponType);
513-
setWeaponRange(pTechnoType->EliteWeapon[1].WeaponType);
514-
515-
weaponRange += weaponRangeExtra;
500+
const int weaponRange = pThis->Veterancy.IsElite() ? pTypeExt->EliteSpawnerRange : pTypeExt->SpawnerRange;
516501

517502
if (pManager->Target && (pThis->DistanceFrom(pManager->Target) > weaponRange))
518503
pManager->ResetTarget();

src/Ext/TechnoType/Body.cpp

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,37 @@ void TechnoTypeExt::ExtData::ParseBurstFLHs(INI_EX& exArtINI, const char* pArtSe
151151
}
152152
}
153153

154+
void TechnoTypeExt::ExtData::CalculateSpawnerRange()
155+
{
156+
const auto pTechnoType = this->OwnerObject();
157+
const int weaponRangeExtra = this->Spawner_ExtraLimitRange * Unsorted::LeptonsPerCell;
158+
159+
auto setWeaponRange = [](int& weaponRange, WeaponTypeClass* pWeaponType)
160+
{
161+
if (pWeaponType && pWeaponType->Spawner && pWeaponType->Range > weaponRange)
162+
weaponRange = pWeaponType->Range;
163+
};
164+
165+
if (pTechnoType->IsGattling)
166+
{
167+
for (int i = 0; i < pTechnoType->WeaponCount; i++)
168+
{
169+
setWeaponRange(this->SpawnerRange, pTechnoType->Weapon[i].WeaponType);
170+
setWeaponRange(this->EliteSpawnerRange, pTechnoType->EliteWeapon[i].WeaponType);
171+
}
172+
}
173+
else
174+
{
175+
setWeaponRange(this->SpawnerRange, pTechnoType->Weapon[0].WeaponType);
176+
setWeaponRange(this->SpawnerRange, pTechnoType->Weapon[1].WeaponType);
177+
setWeaponRange(this->EliteSpawnerRange, pTechnoType->EliteWeapon[0].WeaponType);
178+
setWeaponRange(this->EliteSpawnerRange, pTechnoType->EliteWeapon[1].WeaponType);
179+
}
180+
181+
this->SpawnerRange += weaponRangeExtra;
182+
this->EliteSpawnerRange += weaponRangeExtra;
183+
}
184+
154185
//TODO: YRpp this with proper casting
155186
TechnoTypeClass* TechnoTypeExt::GetTechnoType(ObjectTypeClass* pType)
156187
{
@@ -757,6 +788,10 @@ void TechnoTypeExt::ExtData::LoadFromINIFile(CCINIClass* const pINI)
757788
}
758789
}
759790

791+
// Spawner range
792+
if (this->Spawner_LimitRange)
793+
this->CalculateSpawnerRange();
794+
760795
// Art tags
761796
INI_EX exArtINI(CCINIClass::INI_Art);
762797
auto pArtSection = pThis->ImageFile;
@@ -932,7 +967,9 @@ void TechnoTypeExt::ExtData::Serialize(T& Stm)
932967
.Process(this->ShadowIndices)
933968
.Process(this->ShadowIndex_Frame)
934969
.Process(this->Spawner_LimitRange)
935-
.Process(this->Spawner_ExtraLimitRange)
970+
//.Process(this->Spawner_ExtraLimitRange)
971+
.Process(this->SpawnerRange)
972+
.Process(this->EliteSpawnerRange)
936973
.Process(this->Spawner_DelayFrames)
937974
.Process(this->Spawner_AttackImmediately)
938975
.Process(this->Spawner_UseTurretFacing)

src/Ext/TechnoType/Body.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,8 @@ class TechnoTypeExt
4848
std::map<int, int> ShadowIndices;
4949
Valueable<bool> Spawner_LimitRange;
5050
Valueable<int> Spawner_ExtraLimitRange;
51+
int SpawnerRange;
52+
int EliteSpawnerRange;
5153
Nullable<int> Spawner_DelayFrames;
5254
Valueable<bool> Spawner_AttackImmediately;
5355
Valueable<bool> Spawner_UseTurretFacing;
@@ -392,6 +394,8 @@ class TechnoTypeExt
392394
, ShadowIndex_Frame { 0 }
393395
, Spawner_LimitRange { false }
394396
, Spawner_ExtraLimitRange { 0 }
397+
, SpawnerRange { 0 }
398+
, EliteSpawnerRange { 0 }
395399
, Spawner_DelayFrames {}
396400
, Spawner_AttackImmediately { false }
397401
, Spawner_UseTurretFacing { false }
@@ -708,6 +712,7 @@ class TechnoTypeExt
708712
void LoadFromINIByWhatAmI(INI_EX& exArtINI, const char* pArtSection);
709713

710714
void ApplyTurretOffset(Matrix3D* mtx, double factor = 1.0);
715+
void CalculateSpawnerRange();
711716
bool IsSecondary(int nWeaponIndex);
712717

713718
int SelectForceWeapon(TechnoClass* pThis, AbstractClass* pTarget);

0 commit comments

Comments
 (0)