EnhanceItemStatus CItemEnhancement::Combine (const CItem &Item, CItemEnhancement Enhancement) // Combine // // Combine the current enhancement with the given one { DWORD dwNewMods = Enhancement.m_dwMods; // If we're losing the enhancement, then clear it if (dwNewMods == etLoseEnhancement) { if (IsEnhancement()) { *this = CItemEnhancement(); return eisEnhancementRemoved; } else return eisNoEffect; } // If the item is not currently enhanced, then we take the new enhancement else if (m_dwMods == etNone) { // For strength/hpBonus, use the following rules: // // etStrengthen 0 -> Min(10%, maxHPBonus) // etStrengthen {level} -> Min( {level} * 10, maxHPBonus ) if (Enhancement.GetType() == etStrengthen || Enhancement.GetType() == etHPBonus) { int iMaxBonus = Item.GetType()->GetMaxHPBonus(); int iNewBonus = Min((Enhancement.IsStacking() ? 10 : Enhancement.GetHPBonus()), iMaxBonus); if (iNewBonus > 0) { SetModBonus(iNewBonus); return eisOK; } else return eisNoEffect; } // For all others, take the enhancement else *this = Enhancement; return eisOK; } // If already enhanced else if (m_dwMods == dwNewMods) { if (IsDisadvantage()) return eisNoEffect; else return eisAlreadyEnhanced; } // We currently have a disadvantage else if (IsDisadvantage()) { // We have a disadvantage and the enhancement is another // disadvantage. if (Enhancement.IsDisadvantage()) { switch (Enhancement.GetType()) { // If we're making the disadvantage worse, then // continue; otherwise, no effect. case etRegenerate: case etResist: case etResistEnergy: case etResistMatter: case etPowerEfficiency: { if (Enhancement.GetType() == GetType() && Enhancement.GetLevel() > GetLevel()) { *this = Enhancement; return eisWorse; } else return eisNoEffect; } case etHPBonus: case etStrengthen: { if ((GetType() == etHPBonus || GetType() == etStrengthen) && Enhancement.GetHPBonus() < GetHPBonus()) { *this = Enhancement; return eisWorse; } else return eisNoEffect; } case etSpeed: case etSpeedOld: { if ((GetType() == etSpeed || GetType() == etSpeedOld) && Enhancement.GetActivateRateAdj() > GetActivateRateAdj()) { *this = Enhancement; return eisWorse; } else return eisNoEffect; } case etResistByLevel: case etResistByDamage: case etResistByDamage2: { if (Enhancement.GetType() == GetType() && Enhancement.GetDamageType() == GetDamageType() && Enhancement.GetLevel() > GetLevel()) { *this = Enhancement; return eisWorse; } else return eisNoEffect; } // Otherwise, a disadvantage does not affect a disadvantage default: return eisNoEffect; } } // We have a disadvantage and we use an enhancement. else { switch (Enhancement.GetType()) { // Regeneration enhancement always repairs a disadvantage case etRegenerate: { *this = CItemEnhancement(); return eisRepaired; } // If the enhancement is the opposite of the disadvantage // then the disadvantage is repaired. case etResist: case etResistEnergy: case etResistMatter: case etPowerEfficiency: case etResistByLevel: case etResistByDamage: case etResistByDamage2: case etReflect: { if (GetType() == Enhancement.GetType()) { *this = CItemEnhancement(); return eisRepaired; } else return eisNoEffect; } case etHPBonus: case etStrengthen: { if (GetType() == etHPBonus || GetType() == etStrengthen) { *this = CItemEnhancement(); return eisRepaired; } else return eisNoEffect; } case etSpeed: case etSpeedOld: { if (GetType() == etSpeed || GetType() == etSpeedOld) { *this = CItemEnhancement(); return eisRepaired; } else return eisNoEffect; } // Otherwise, no effect default: return eisNoEffect; } } } // We currently have an enhancement else { if (!Enhancement.IsDisadvantage()) { switch (Enhancement.GetType()) { case etHPBonus: case etStrengthen: { if (GetType() != etHPBonus && GetType() != etStrengthen) return eisNoEffect; // If improving... int iOldBonus = GetHPBonus(); int iMaxBonus = Item.GetType()->GetMaxHPBonus(); int iNewBonus = Min((Enhancement.IsStacking() ? iOldBonus + 10 : Enhancement.GetHPBonus()), iMaxBonus); if (iNewBonus > iOldBonus) { SetModBonus(iNewBonus); return eisBetter; } else return eisNoEffect; } // If this is the same type of enhancement and it is better, // then take it (otherwise, no effect) case etRegenerate: case etResist: case etResistEnergy: case etResistMatter: case etPowerEfficiency: { if (Enhancement.GetType() == GetType() && Enhancement.GetLevel() > GetLevel()) { *this = Enhancement; return eisBetter; } else return eisNoEffect; } case etSpeed: case etSpeedOld: { if (Enhancement.GetType() == GetType() && Enhancement.GetActivateRateAdj() < GetActivateRateAdj()) { *this = Enhancement; return eisBetter; } else return eisNoEffect; } case etResistByLevel: case etResistByDamage: case etResistByDamage2: { if (Enhancement.GetType() != GetType()) return eisNoEffect; else if (Enhancement.GetDamageType() != GetDamageType()) { *this = Enhancement; return eisEnhancementReplaced; } else if (Enhancement.GetLevel() > GetLevel()) { *this = Enhancement; return eisBetter; } else return eisNoEffect; } default: return eisNoEffect; } } else { // A disadvantage always destroys any enhancement *this = CItemEnhancement(); return eisEnhancementRemoved; } } }
EnhanceItemStatus CItemEnhancement::Combine (CItemEnhancement Enhancement) // Combine // // Combine the current enhancement with the given one { DWORD dwNewMods = Enhancement.m_dwMods; // If we're losing the enhancement, then clear it if (dwNewMods == etLoseEnhancement) { if (IsEnhancement()) { *this = CItemEnhancement(); return eisEnhancementRemoved; } else return eisNoEffect; } // If the item is not currently enhanced, then we take the new enhancement else if (m_dwMods == etNone) { // For stackable strengthening, start at 1 if (Enhancement.GetType() == etStrengthen && Enhancement.GetLevel() == 0 && Enhancement.GetEnhancementType() == GetEnhancementType()) m_dwMods = dwNewMods + 1; // For all others, take the enhancement else *this = Enhancement; return eisOK; } // If already enhanced else if (m_dwMods == dwNewMods) { if (IsDisadvantage()) return eisNoEffect; else return eisAlreadyEnhanced; } // We currently have a disadvantage else if (IsDisadvantage()) { // We have a disadvantage and the enhancement is another // disadvantage. if (Enhancement.IsDisadvantage()) { switch (Enhancement.GetType()) { // If we're making the disadvantage worse, then // continue; otherwise, no effect. case etStrengthen: case etRegenerate: case etResist: case etResistEnergy: case etResistMatter: case etPowerEfficiency: case etSpeed: { if (Enhancement.GetType() == GetType() && Enhancement.GetLevel() > GetLevel()) { *this = Enhancement; return eisWorse; } else return eisNoEffect; } case etResistByLevel: case etResistByDamage: case etResistByDamage2: { if (Enhancement.GetType() == GetType() && Enhancement.GetDamageType() == GetDamageType() && Enhancement.GetLevel() > GetLevel()) { *this = Enhancement; return eisWorse; } else return eisNoEffect; } // Otherwise, a disadvantage does not affect a disadvantage default: return eisNoEffect; } } // We have a disadvantage and we use an enhancement. else { switch (Enhancement.GetType()) { // Regeneration enhancement always repairs a disadvantage case etRegenerate: { *this = CItemEnhancement(); return eisRepaired; } // If the enhancement is the opposite of the disadvantage // then the disadvantage is repaired. case etStrengthen: case etResist: case etResistEnergy: case etResistMatter: case etPowerEfficiency: case etResistByLevel: case etResistByDamage: case etResistByDamage2: case etReflect: case etSpeed: { if (GetType() == Enhancement.GetType()) { *this = CItemEnhancement(); return eisRepaired; } else return eisNoEffect; } // Otherwise, no effect default: return eisNoEffect; } } } // We currently have an enhancement else { if (!Enhancement.IsDisadvantage()) { if (Enhancement.GetType() == GetType()) { switch (Enhancement.GetType()) { case etStrengthen: { // If stackable... if (Enhancement.GetLevel() == 0) { if (GetLevel() == 15) return eisNoEffect; else { m_dwMods++; return eisBetter; } } // If improving... else if (Enhancement.GetLevel() > GetLevel()) { *this = Enhancement; return eisBetter; } else return eisNoEffect; } // If this is the same type of enhancement and it is better, // then take it (otherwise, no effect) case etRegenerate: case etResist: case etResistEnergy: case etResistMatter: case etPowerEfficiency: case etSpeed: { if (Enhancement.GetLevel() > GetLevel()) { *this = Enhancement; return eisBetter; } else return eisNoEffect; } case etResistByLevel: case etResistByDamage: case etResistByDamage2: { if (Enhancement.GetDamageType() != GetDamageType()) { *this = Enhancement; return eisEnhancementReplaced; } else if (Enhancement.GetLevel() > GetLevel()) { *this = Enhancement; return eisBetter; } else return eisNoEffect; } default: return eisNoEffect; } } // No effect if we're already enhanced else { return eisNoEffect; } } else { // A disadvantage always destroys any enhancement *this = CItemEnhancement(); return eisEnhancementRemoved; } } }