public static bool MoveOff(Beaver beaver) { if (!beaver.CanMove()) { return(false); } var target = beaver.Tile.GetNeighbors().FirstOrDefault(n => n.IsPathable() && beaver.Moves >= GetMoveCost(beaver.Tile, n)); return(target != null && beaver.Move(target)); }
public static void MoveAndAttack(Beaver attacker, IEnumerable <Beaver> targets) { if (attacker.CanMove()) { var targetPoints = targets .Where(t => t.Health > 0) .SelectMany(t => t.Tile.GetNeighbors().Select(n => n.ToPoint())); Move(attacker, targetPoints); } Attack(attacker, targets); }
public static void MoveAndDrop(Beaver dropper, IEnumerable <Tile> targets, string resource) { if (!dropper.CanAct() || dropper.GetCount(resource) == 0) { return; } if (dropper.CanMove()) { var movePoints = targets.Concat(targets.SelectMany(t => t.GetNeighbors())) .Select(n => n.ToPoint()); Move(dropper, movePoints); } Drop(dropper, targets, resource); }
public static void Move(Beaver mover, IEnumerable <Point> targets) { var targetPoints = targets.ToHashSet <Point>(); if (mover.CanMove()) { var search = new AStar <Point>( new[] { mover.ToPoint() }, p => targetPoints.Contains(p), (p1, p2) => GetMoveCost(p1.ToTile(), p2.ToTile()), p => 0, p => p.ToTile().GetReachableNeighbors(mover.Job.Moves).Select(t => t.ToPoint()) ); MoveAlong(mover, search.Path); } }
public static void MoveAndHarvest(Beaver harvester, IEnumerable <Spawner> spawners) { if (harvester.OpenCarryCapacity() == 0) { return; } if (harvester.CanMove()) { var movePoints = spawners .SelectMany(s => s.Tile.GetNeighbors().Select(n => n.ToPoint())); Move(harvester, movePoints); } Harvest(harvester, spawners); }
public static void MoveAndPickup(Beaver picker, IEnumerable <Tile> targets, string resource) { if (!picker.CanAct() || picker.OpenCarryCapacity() == 0) { return; } var targetPoints = targets.Where(t => t.GetCount(resource) > 0); if (picker.CanMove()) { var movePoints = targetPoints.Concat(targetPoints.SelectMany(t => t.GetNeighbors())) .Select(n => n.ToPoint()); Move(picker, movePoints); } Pickup(picker, targets, resource); }
public static void MoveAlong(Beaver beaver, IEnumerable <Point> steps, bool dontStopInDanger = false) { if (!steps.Any()) { return; } IEnumerable <Point> dontStops = new Point[0]; if (dontStopInDanger) { var fears = AI._Player.Opponent.Beavers .Where(b => b.CanBeAttacked()) .Where(b => b.Job == AI.Basic || b.Job == AI.Fighter || b.Job == AI.Bulky || b.Job == AI.HotLady) .Where(b => !b.Tile.GetNeighbors().Any(n => n.Beaver != null && n.Beaver.Owner == AI._Player)); if (fears.Any()) { dontStops = AI._Game.Tiles.Where(t => fears.Select(b => b.ToPoint().ManhattanDistance(t.ToPoint())).Min() == 2) .ToPoints() .ToHashSet(); } } AI.GoalLocations[beaver.Id] = steps.Last(); if (!beaver.CanMove()) { return; } var queue = steps.SkipWhile(p => p.Equals(beaver.ToPoint())).ToQueue(); while (queue.Count > 0 && queue.Peek().ToTile().IsPathable() && GetMoveCost(beaver.Tile, queue.Peek().ToTile()) <= beaver.Moves && !dontStops.Contains(queue.Peek())) { beaver.Move(queue.Dequeue().ToTile()); } }