public override void Update(GameTime gameTime) { base.Update(gameTime); if (mTarget == null || mTarget.Health <= 0 || (mTarget is IDespawningUnit despawningUnit && despawningUnit.ForRemoval)) { mTarget = null; return; } if (Vector2.Distance(mTarget.Position, mLastTargetPos) >= mAttackRange && mFollow) { mLastTargetPos = mTarget.Position; base.SetMovingTarget(mTarget.Position); } var canAttack = Vector2.Distance(mTarget.Position, Position) <= mAttackRange; if (mTarget is ABuilding building) { if (building.BlockedFields() .Select(gridPosition => gridPosition.ToVector2() * GameScreen.GridSize) .Any(position => Vector2.Distance(position, Position) - 2 * GameScreen.GridSize <= mAttackRange)) { canAttack = true; } } if (canAttack) { DealDamage(); } }
public bool AttackUnitsAtPosition(Point entityGameFieldPosition) { IDamageableUnit damageableUnit = null; foreach (var key in UnitsByPlayer) { if (key.Key != Players.Global && key.Key != Players.Player) { damageableUnit = GetDamageableUnitAtPosition(entityGameFieldPosition, key.Key); } } if (damageableUnit == null) { return(false); } var isTarget = false; foreach (var entity in SelectedEntities.OfType <IAttackingUnit>()) { entity.SetTarget(damageableUnit, true); isTarget = true; } return(isTarget); }
public void SetTarget(IDamageableUnit target, bool follow) { if (target != null && follow) { mLastTargetPos = target.Position; base.SetMovingTarget(target.Position); } mTarget = target; mFollow = follow; }
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 HoverSelectionMode(Vector2 gameFieldPosition) { var unit = GameState.Current.GetDamageableUnitAtPosition(gameFieldPosition.ToPoint(), Players.Player); if (unit != null) { unit.IsHit = true; } if (mLastSelectedUnit != null && mLastSelectedUnit != unit) { mLastSelectedUnit.IsHit = false; } mLastSelectedUnit = unit; }
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++; } }
public override Task <bool> SetMovingTarget(Vector2?target) { mTarget = null; return(base.SetMovingTarget(target)); }
public HitHelper(IDamageableUnit damageableUnit, int health) { mDamageableUnit = damageableUnit; mHealth = health; mMaxHealth = health; }