public override List <HexCoords> FindSelectable(HexCoords src) { _source = src; List <HexCoords> selectable = new List <HexCoords>(); UnitData unit = CombatManager.boardState.board[_source].unit.data; Node start = Map.current.TileAt(_source).node; Map.current.graph.resetNodes(); Queue <Node> process = new Queue <Node>(); process.Enqueue(start); start.visited = true; start.distance = 0; FieldMap fieldMap = (FieldMap)Map.current; while (process.Count > 0) { Node n = process.Dequeue(); if (n.Passable(unit) || n.distance == 0) { if (n.Walkable(unit)) { n.selectable = true; } if (n.distance < _range) { foreach (Node node in n.neighbors) { if (node == null) { continue; } int delta = Mathf.Abs(fieldMap.GetHeight(n.coords) - fieldMap.GetHeight((node.coords))); if (!node.visited && node.Passable(unit) && (node.tile.terrain.movementCost + n.distance) <= _range && (delta < 3)) { node.parent = n; node.distance = node.tile.terrain.movementCost + n.distance; node.visited = true; process.Enqueue(node); if (node.Walkable(unit)) { selectable.Add(node.coords); } } } } } } return(selectable); }