/// <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);
         }
     }
 }
Exemple #3
0
        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);
                }
            }
        }
Exemple #4
0
        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++;
            }
        }