private PlayerInstance GetClosestEnemy() { var allEnemyPosition = new List <MapPosition>(); // traverse ViewRadius for (var i = 1; i <= _player.ViewRadius; i++) { for (var j = 1; j <= _player.ViewRadius; j++) { var x = _player.Position.X - _player.ViewRadius + i; var y = _player.Position.Y - _player.ViewRadius + j; var inspectedPosition = new MapPosition(x, y); if (!MapPosition.IsOutOfBounds(inspectedPosition)) { var field = Map.GetField(x, y); if (MapPosition.IsOccupied(field)) { allEnemyPosition.Add(field); } } } } if (allEnemyPosition.Count > 0) { allEnemyPosition.Sort((origin, position) => (int)(Vector2.Distance(position.DistanceAsVector(), origin.DistanceAsVector()) * 100)); return(allEnemyPosition[0].Occupant); } return(null); }
private Direction GetCenterDirection() { var centerFields = MapCenter(); var freeField = centerFields.First(t => MapPosition.IsOccupied(t) == false); var angle = GetAngle(_player.Position, freeField); return(AdvanceDirection(angle)); }
public void Attack(MapPosition targetPosition) { if (MapPosition.IsOccupied(targetPosition) && _player.ActionPoints > 0) { var target = targetPosition.Occupant; target.Hitpoints -= 1; _player.ActionPoints -= 1; } }
public void Move(Direction direction) { var newPosition = _player.Position; switch (direction) { case Direction.Up: newPosition.Y -= 1; break; case Direction.Down: newPosition.Y += 1; break; case Direction.Left: newPosition.X -= 1; break; case Direction.Right: newPosition.X += 1; break; case Direction.None: goto default; default: break; } if (newPosition.MovementOutOfBounds(direction) && !MapPosition.IsOccupied(newPosition) && _player.ActionPoints > 0) { _player.Position = newPosition; _player.ActionPoints -= 1; } }