/// <summary> /// Adds Attack modifications to the Attack dictionary /// </summary> /// <param name="mod">Mod to apply</param> private void ApplyWeaponModifiers(KeyValuePair <DamageModifiers, int> mod) { if (AttackModifiers.ContainsKey(mod.Key)) { AttackModifiers[mod.Key] += mod.Value; } else { AttackModifiers.Add(mod.Key, mod.Value); } }
/// <summary> /// Removes Attack modifiers from the Attack mod dict /// </summary> /// <param name="mod">Mod to remove</param> private void RemoveWeaponModifiers(KeyValuePair <DamageModifiers, int> mod) { if (AttackModifiers.ContainsKey(mod.Key)) { AttackModifiers[mod.Key] -= mod.Value; // If the value is 0 after subtraction, remove modifier if (AttackModifiers[mod.Key] == 0) { AttackModifiers.Remove(mod.Key); } } }
private void AttackEnemyUnits(IEnumerable <IAttackingUnit> myUnits, IReadOnlyList <IDamageableUnit> enemyUnits) { foreach (var unit in myUnits) { // Bowmen only defend the base if (unit.UnitType == UnitTypes.Bowman) { continue; } if (unit.HasTarget()) { continue; } var tries = 0; IDamageableUnit targetUnit = null; do { if (tries <= 5) { if (tries == 0) { var unitsInRange = GameState.Current.SpatialUnitsByPlayer.UnitsInRange(mEnemies.First(), unit.Position, 150); if (unitsInRange.Count != 0) { targetUnit = (IDamageableUnit)unitsInRange[sRandom.Next((unitsInRange.Count - 1))]; } } if (tries > 0 || targetUnit == null) { targetUnit = enemyUnits[sRandom.Next(enemyUnits.Count)]; } } else { targetUnit = null; break; } tries++; } while (Math.Abs(AttackModifiers.GetModifier(unit.UnitType, targetUnit.UnitType)) < float.Epsilon); if (targetUnit != null) { unit.SetTarget(targetUnit, true); } } }
private void DealDamage() { if (mDamageTimeout == 0) { var damage = mBaseDamage * AttackModifiers.GetModifier(UnitType, mTarget.UnitType) * GameState.Current.mDamageFactor[Owner]; if (damage > 0) { mTarget.Health = MathHelper.Clamp(mTarget.Health - (int)damage, 0, mTarget.MaxHealth); } mDamageTimeout++; mLastAttacked = mTarget; } else if (mDamageTimeout == mDamageInterval) { mDamageTimeout = 0; } else { mDamageTimeout++; } }