示例#1
0
    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);
    }