public static void CoverWithTrash(AI ai, Mission mission) { Fish fish = mission.m_agent; int weight = fish.CarryingWeight; if (weight == 0) { return; } Point fishPoint = fish.Point(); Bb.Update(ai); BitArray targetsNotCovered = new BitArray(Bb.TrashMap).Not().And(mission.m_targets()); Bb.Set(targetsNotCovered, fishPoint, false); BitArray passableOrNotCovered = Bb.GetPassable(fishPoint).Or(targetsNotCovered); var path = Pather.aStar(fishPoint, targetsNotCovered, passableOrNotCovered).ToArray(); if (path.Length > 1 && MoveAlong(fish, path.Range(0, path.Length - 1), mission.m_attackAlongTheWay)) { var dump = path[path.Length - 1]; var tile = ai.getTile(dump.X, dump.Y); fish.drop(tile, weight); } else if (path.Length > 1) { onADropMission.Add(fish); } }
public static void GetTrash(AI ai, Mission mission) { Fish fish = mission.m_agent; int availableCapacity = fish.CarryCap - fish.CarryingWeight; if (availableCapacity == 0) { return; } Point fishPoint = fish.Point(); Bb.Update(ai); BitArray targetsInTrash = new BitArray(mission.m_targets()).And(Bb.TrashMap); BitArray passableOrTargetsInTrash = Bb.GetPassable(fishPoint).Or(targetsInTrash); while (availableCapacity > 0) { var path = Pather.aStar(fishPoint, targetsInTrash, passableOrTargetsInTrash).ToArray(); var trash = path[path.Length - 1]; var tile = ai.getTile(trash.X, trash.Y); var amount = Math.Min(Math.Min(tile.TrashAmount, availableCapacity), fish.CurrentHealth - 1); if (amount == 0) { return; // Can't pick it up } if (path.Length > 1 && MoveAlong(fish, path.Range(0, path.Length - 1), mission.m_attackAlongTheWay)) { fish.pickUp(tile, amount); fishPoint = path[path.Length - 2]; availableCapacity -= amount; if (tile.TrashAmount == 0) { Bb.Set(targetsInTrash, trash, false); } } else { return; // no trash found, or didn't move far enough. } } }
public static void AttackTarget(AI ai, Mission mission) { Fish fish = mission.m_agent; if (fish.AttacksLeft == 0) { return; } int range = fish.Range; HashSet <Fish> previousTargets = GetAlreadyAttacked(fish); while (fish.AttacksLeft > 0) { Bb.Update(ai); Point fishPoint = fish.Point(); BitArray dontAttack = Bb.ToBitArray(previousTargets); BitArray attackable = new BitArray(dontAttack).Not().And(Bb.TheirFishMap); BitArray targetsInAttackable = new BitArray(mission.m_targets()).And(attackable); BitArray passableOrTargetInAttackable = Bb.GetPassable(fishPoint).Or(targetsInAttackable); var path = Pather.aStar(fishPoint, targetsInAttackable, passableOrTargetInAttackable).ToArray(); if (path.Length > 1) { int attacks = fish.AttacksLeft; MoveAlong(fish, path.Range(0, path.Length - range), true); if (fish.AttacksLeft == attacks) { return; } } else { return; } if (fish.MovementLeft == 0) { return; } } }
public static void GoTo(AI ai, Mission mission) { Fish fish = mission.m_agent; if (fish.MovementLeft == 0) { return; } Point fishPoint = fish.Point(); Bb.Update(ai); BitArray passable = Bb.GetPassable(fishPoint); BitArray targetsInPassable = new BitArray(mission.m_targets()).And(passable); var path = Pather.aStar(fishPoint, targetsInPassable, passable); MoveAlong(fish, path, mission.m_attackAlongTheWay); }