#region Copyright & License Information /* * Copyright (c) The OpenRA Developers and Contributors * This file is part of OpenRA, which is free software. It is made * available to you under the terms of the GNU General Public License * as published by the Free Software Foundation, either version 3 of * the License, or (at your option) any later version. For more * information, see COPYING. */ #endregion using System; using OpenRA.Mods.Common.Traits; namespace OpenRA.Mods.Common.Pathfinder { /// /// A dense pathfinding graph that supports a search over all cells within a . /// Cells outside the grid area are deemed unreachable and will not be considered. /// It implements the ability to cost and get connections for cells, and supports . /// sealed class GridPathGraph : DensePathGraph { readonly CellInfo[] infos; readonly Grid grid; public GridPathGraph(Locomotor locomotor, Actor actor, World world, BlockedByActor check, Func customCost, Actor ignoreActor, bool laneBias, bool inReverse, Grid grid) : base(locomotor, actor, world, check, customCost, ignoreActor, laneBias, inReverse) { infos = new CellInfo[grid.Width * grid.Height]; this.grid = grid; } protected override bool IsValidNeighbor(CPos neighbor) { // Enforce that we only search within the grid bounds. return grid.Contains(neighbor); } int InfoIndex(CPos pos) { return (pos.Y - grid.TopLeft.Y) * grid.Width + (pos.X - grid.TopLeft.X); } public override CellInfo this[CPos pos] { get => infos[InfoIndex(pos)]; set => infos[InfoIndex(pos)] = value; } } }