Skip to content

Commit 04d099b

Browse files
committed
Allow Warheads to apply multiplier to shield ReceivedDamage caps
1 parent da248f6 commit 04d099b

File tree

4 files changed

+16
-3
lines changed

4 files changed

+16
-3
lines changed

docs/New-or-Enhanced-Logics.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,8 @@ Shield.AbsorbPercent= ; floating point value
324324
Shield.PassPercent= ; floating point value
325325
Shield.ReceivedDamage.Minimum= ; integer
326326
Shield.ReceivedDamage.Maximum= ; integer
327+
Shield.ReceivedDamage.MinMultiplier=1.0 ; floating point value
328+
Shield.ReceivedDamage.MaxMultiplier=1.0 ; floating point value
327329
Shield.Respawn.Duration=0 ; integer, game frames
328330
Shield.Respawn.Amount=0.0 ; floating point value, percents or absolute
329331
Shield.Respawn.Rate=-1.0 ; floating point value, ingame minutes
@@ -399,6 +401,7 @@ Shield.InheritStateOnReplace=false ; boolean
399401
- `Shield.AbsorbPercent` overrides the `AbsorbPercent` value set in the ShieldType that is being damaged.
400402
- `Shield.PassPercent` overrides the `PassPercent` value set in the ShieldType that is being damaged.
401403
- `Shield.ReceivedDamage.Minimum` & `Shield.ReceivedDamage.Maximum` override the values set in in the ShieldType that is being damaged.
404+
- `Shield.ReceivedDamage.MinMultiplier` and `Shield.ReceivedDamage.MinMultiplier` are multipliers to the effective `Shield.ReceivedDamage.Minimum` and `Shield.ReceivedDamage.Maximum` respectively that are applied when the Warhead deals damage to a shield.
402405
- `Shield.Respawn.Rate` & `Shield.Respawn.Amount` override ShieldType `Respawn.Rate` and `Respawn.Amount` for duration of `Shield.Respawn.Duration` amount of frames. Negative rate & zero or lower amount default to ShieldType values. If `Shield.Respawn.RestartTimer` is set, currently running shield respawn timer is reset, otherwise the timer's duration is adjusted in proportion to the new `Shield.Respawn.Rate` (e.g timer will be same percentage through before and after) without restarting the timer. If the effect expires while respawn timer is running, remaining time is adjusted to proportionally match ShieldType `Respawn.Rate`. Re-applying the effect resets the duration to `Shield.Respawn.Duration`
403406
- `Shield.SelfHealing.Rate` & `Shield.SelfHealing.Amount` override ShieldType `SelfHealing.Rate` and `SelfHealing.Amount` for duration of `Shield.SelfHealing.Duration` amount of frames. Negative rate & zero or lower amount default to ShieldType values. If `Shield.SelfHealing.RestartTimer` is set, currently running self-healing timer is restarted, otherwise timer's duration is adjusted in proportion to the new `Shield.SelfHealing.Rate` (e.g timer will be same percentage through before and after) without restarting the timer. If the effect expires while self-healing timer is running, remaining time is adjusted to proportionally match ShieldType `SelfHealing.Rate`. Re-applying the effect resets the duration to `Shield.SelfHealing.Duration`.
404407
- Additionally `Shield.SelfHealing.RestartInCombat` & `Shield.SelfHealing.RestartInCombatDelay` can be used to override ShieldType settings.

src/Ext/WarheadType/Body.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,8 @@ void WarheadTypeExt::ExtData::LoadFromINIFile(CCINIClass* const pINI)
204204
this->Shield_PassPercent.Read(exINI, pSection, "Shield.PassPercent");
205205
this->Shield_ReceivedDamage_Minimum.Read(exINI, pSection, "Shield.ReceivedDamage.Minimum");
206206
this->Shield_ReceivedDamage_Maximum.Read(exINI, pSection, "Shield.ReceivedDamage.Maximum");
207+
this->Shield_ReceivedDamage_MinMultiplier.Read(exINI, pSection, "Shield.ReceivedDamage.MinMultiplier");
208+
this->Shield_ReceivedDamage_MaxMultiplier.Read(exINI, pSection, "Shield.ReceivedDamage.MaxMultiplier");
207209
this->Shield_Respawn_Duration.Read(exINI, pSection, "Shield.Respawn.Duration");
208210
this->Shield_Respawn_Amount.Read(exINI, pSection, "Shield.Respawn.Amount");
209211
this->Shield_Respawn_Rate_InMinutes.Read(exINI, pSection, "Shield.Respawn.Rate");
@@ -415,6 +417,8 @@ void WarheadTypeExt::ExtData::Serialize(T& Stm)
415417
.Process(this->Shield_PassPercent)
416418
.Process(this->Shield_ReceivedDamage_Minimum)
417419
.Process(this->Shield_ReceivedDamage_Maximum)
420+
.Process(this->Shield_ReceivedDamage_MinMultiplier)
421+
.Process(this->Shield_ReceivedDamage_MaxMultiplier)
418422
.Process(this->Shield_Respawn_Duration)
419423
.Process(this->Shield_Respawn_Amount)
420424
.Process(this->Shield_Respawn_Rate)

src/Ext/WarheadType/Body.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,8 @@ class WarheadTypeExt
7979
Nullable<double> Shield_PassPercent;
8080
Nullable<int> Shield_ReceivedDamage_Minimum;
8181
Nullable<int> Shield_ReceivedDamage_Maximum;
82+
Valueable<double> Shield_ReceivedDamage_MinMultiplier;
83+
Valueable<double> Shield_ReceivedDamage_MaxMultiplier;
8284

8385
Valueable<int> Shield_Respawn_Duration;
8486
Nullable<double> Shield_Respawn_Amount;
@@ -227,6 +229,8 @@ class WarheadTypeExt
227229
, Shield_PassPercent {}
228230
, Shield_ReceivedDamage_Minimum {}
229231
, Shield_ReceivedDamage_Maximum {}
232+
, Shield_ReceivedDamage_MinMultiplier { 1.0 }
233+
, Shield_ReceivedDamage_MaxMultiplier { 1.0 }
230234

231235
, Shield_Respawn_Duration { 0 }
232236
, Shield_Respawn_Amount { 0.0 }

src/New/Entity/ShieldClass.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -189,9 +189,11 @@ int ShieldClass::ReceiveDamage(args_ReceiveDamage* args)
189189
}
190190

191191
int originalShieldDamage = shieldDamage;
192-
193-
shieldDamage = Math::clamp(shieldDamage, pWHExt->Shield_ReceivedDamage_Minimum.Get(this->Type->ReceivedDamage_Minimum),
194-
pWHExt->Shield_ReceivedDamage_Maximum.Get(this->Type->ReceivedDamage_Maximum));
192+
int min = pWHExt->Shield_ReceivedDamage_Minimum.Get(this->Type->ReceivedDamage_Minimum);
193+
int max = pWHExt->Shield_ReceivedDamage_Maximum.Get(this->Type->ReceivedDamage_Maximum);
194+
int minDmg = static_cast<int>(min * pWHExt->Shield_ReceivedDamage_MinMultiplier);
195+
int maxDmg = static_cast<int>(max * pWHExt->Shield_ReceivedDamage_MaxMultiplier);
196+
shieldDamage = Math::clamp(shieldDamage, minDmg, maxDmg);
195197

196198
if (Phobos::DisplayDamageNumbers && shieldDamage != 0)
197199
GeneralUtils::DisplayDamageNumberString(shieldDamage, DamageDisplayType::Shield, this->Techno->GetRenderCoords(), TechnoExt::ExtMap.Find(this->Techno)->DamageNumberOffset);

0 commit comments

Comments
 (0)