int CItemEnhancement::GetEnhancedRate (int iRate) const // GetEnhancedRate // // Returns the enhanced rate { switch (GetType()) { case etSpeed: { int iMin; int iMax; int iAdj = GetActivateRateAdj(&iMin, &iMax); int iNewRate = Max(iMin, (iRate * iAdj + 50) / 100); if (iMax != 0 && iNewRate > iMax) return iMax; else return iNewRate; } case etSpeedOld: return Max(1, (iRate * Level2DamageAdj(GetLevel(), IsDisadvantage()) + 50) / 100); default: return iRate; } }
int CItemEnhancement::GetDamageAdj (const DamageDesc &Damage) const // GetDamageAdj // // Returns the damage adjustment confered by this mod { switch (GetType()) { case etResist: return Level2DamageAdj(GetLevel(), IsDisadvantage()); case etResistEnergy: return (Damage.IsEnergyDamage() ? Level2DamageAdj(GetLevel(), IsDisadvantage()) : 100); case etResistMatter: return (Damage.IsMatterDamage() ? Level2DamageAdj(GetLevel(), IsDisadvantage()) : 100); case etResistByLevel: { if (Damage.GetDamageType() == GetDamageType() || Damage.GetDamageType() == GetDamageType() + 1) return Level2DamageAdj(GetLevel(), IsDisadvantage()); else return 100; } case etResistByDamage: return (Damage.GetDamageType() == GetDamageType() ? Level2DamageAdj(GetLevel(), IsDisadvantage()) : 100); case etResistByDamage2: { if (Damage.GetDamageType() == GetDamageType()) // 0 = 100 100 // 1 = 90 111 // 2 = 80 125 // 3 = 70 143 return Level2DamageAdj(GetLevel(), IsDisadvantage()); else if (Damage.GetDamageType() == GetDamageType() + 2) // 0 = 100 100 // 1 = 95 105 // 2 = 90 112 // 3 = 85 121 return 100 + ((Level2DamageAdj(GetLevel(), IsDisadvantage()) - 100) / 2); else return 100; } default: return 100; } }
int CItemEnhancement::GetEnhancedRate (int iRate) const // GetEnhancedRate // // Returns the enhanced rate { switch (GetType()) { case etSpeed: return Max(1, (iRate * Level2DamageAdj(GetLevel(), IsDisadvantage()) + 50) / 100); default: return iRate; } }
int CItemEnhancement::GetActivateRateAdj (void) const // GetActivateRateAdj // // Returns the adj to activate/fire delay { switch (GetType()) { case etSpeed: return Level2DamageAdj(GetLevel(), IsDisadvantage()); default: return 100; } }
int CItemEnhancement::Level2DamageAdj (int iLevel, bool bDisadvantage) // Level2DamageAdj // // Convert from a level (0-15) to a damage adj (%) { if (bDisadvantage) return (10000 / Level2DamageAdj(iLevel, false)); else { if (iLevel >= 0 && iLevel <= 9) return (100 - (10 * iLevel)); else return 10; } }
int CItemEnhancement::GetAbsorbAdj (const DamageDesc &Damage) const // GetAbsorbAdj // // Returns damage absorbed { switch (GetType()) { case etReflect: { if (IsDisadvantage() && Damage.GetDamageType() == GetDamageType()) return Level2DamageAdj(GetLevel()); else return 100; } default: return 100; } }
int CItemEnhancement::GetActivateRateAdj (int *retiMinDelay, int *retiMaxDelay) const // GetActivateRateAdj // // Returns the adj to activate/fire delay { int iAdj = 100; int iMinDelay = 0; int iMaxDelay = 0; switch (GetType()) { case etSpeed: if (IsDisadvantage()) iAdj = 100 + GetDataA() * 5; else iAdj = GetDataA(); iMinDelay = GetDataB(); iMaxDelay = GetDataC(); break; case etSpeedOld: iAdj = Level2DamageAdj(GetLevel(), IsDisadvantage()); break; default: iAdj = 100; } if (retiMinDelay) *retiMinDelay = iMinDelay; if (retiMaxDelay) *retiMaxDelay = iMaxDelay; return iAdj; }