Пример #1
0
 public void PrintMoveMap(Movemap movemap, Node.TileGameStatus characterFraction)
 {
     foreach (var tilePosition in movemap.MoveCoords)
     {
         Movemap.SetTile(tilePosition, MoveTile);
     }
     foreach (var tilePosition in movemap.MeleeCoords)
     {
         if (GetNode(tilePosition).GameStatus == characterFraction)
         {
             Movemap.SetTile(tilePosition, AllyTile);
         }
         else
         {
             Movemap.SetTile(tilePosition, EnemyTile);
         }
     }
     foreach (var tilePosition in movemap.RangeCoords)
     {
         if (GetNode(tilePosition).GameStatus == characterFraction)
         {
             Movemap.SetTile(tilePosition, AllyTile);
         }
         else
         {
             Movemap.SetTile(tilePosition, EnemyTile);
         }
     }
 }
Пример #2
0
 public List <Vector3Int> GetMeleeTileCoordsFromMovemap(Node.TileGameStatus gameStatus)
 {
     if (gameStatus == Node.TileGameStatus.Empty)
     {
         return(MoveCoords);
     }
     else
     {
         return(MeleeCoords);
     }
 }
Пример #3
0
    //Build movemap and additional tiles (attack influence) that character can attack
    public void GetInfluenceMap(Character character, out List <Vector3Int> moveInfluence, out List <Vector3Int> attackInfluence)
    {
        moveInfluence   = new List <Vector3Int>();
        attackInfluence = new List <Vector3Int>();
        List <Node> nodesToProcess = new List <Node>();

        Node currentNode = _graph.GetNode(character.Coords);

        currentNode.ProcessValue  = character.Properties.Speed;
        currentNode.ProcessStatus = Node.NodeProcessStatus.InOpenList;
        nodesToProcess.Add(currentNode);
        moveInfluence.Add(currentNode.Coords);

        Node.TileGameStatus fraction = Node.GetTileStatusFromCharacter(character);
        Node.TileGameStatus oppositeFraction;
        if (fraction == Node.TileGameStatus.Ally)
        {
            oppositeFraction = Node.TileGameStatus.Enemy;
        }
        else
        {
            oppositeFraction = Node.TileGameStatus.Ally;
        }

        while (nodesToProcess.Count != 0)
        {
            currentNode = nodesToProcess[0];
            foreach (var connection in currentNode.Connections)
            {
                Node endNode = connection.EndNode;

                if ((endNode.ProcessStatus == Node.NodeProcessStatus.NotVisited ||
                     endNode.ProcessValue < currentNode.ProcessValue - 1) && endNode.GameStatus != fraction)
                {
                    //first entry in open list and not taken by ally
                    if (endNode.ProcessStatus == Node.NodeProcessStatus.NotVisited)
                    {
                        moveInfluence.Add(endNode.Coords);
                    }

                    //hit to enemy ends turn
                    if (endNode.GameStatus == oppositeFraction)
                    {
                        endNode.ProcessValue  = 0;
                        endNode.ProcessStatus = Node.NodeProcessStatus.InClosedList;
                    }
                    else
                    {
                        endNode.ProcessValue = currentNode.ProcessValue - 1;
                    }

                    //if node has been already waiting processing in open list then change order
                    if (endNode.ProcessStatus == Node.NodeProcessStatus.InOpenList)
                    {
                        nodesToProcess.Remove(endNode);
                    }

                    if (endNode.ProcessValue > 0)
                    {
                        int indexToInsert = nodesToProcess.FindLastIndex(delegate(Node node)
                        {
                            return(node.ProcessValue >= endNode.ProcessValue);
                        });
                        nodesToProcess.Insert(indexToInsert, endNode);
                        endNode.ProcessStatus = Node.NodeProcessStatus.InOpenList;
                    }
                    else
                    {
                        //check all near tiles and find these that beyond move influence on 1 step
                        for (int i = 0; i < 4; ++i)
                        {
                            Vector3Int offsetPosition = endNode.Coords + offsets[i];
                            Node       offsetNode     = _graph.GetNode(offsetPosition);
                            if (offsetNode != null &&
                                offsetNode.ProcessStatus == Node.NodeProcessStatus.NotVisited)
                            {
                                attackInfluence.Add(offsetNode.Coords);
                                offsetNode.ProcessStatus = Node.NodeProcessStatus.InClosedList;
                                offsetNode.ProcessValue  = 0;
                            }
                        }
                        endNode.ProcessStatus = Node.NodeProcessStatus.InClosedList;
                    }
                }
            }
            nodesToProcess.Remove(currentNode);
            currentNode.ProcessStatus = Node.NodeProcessStatus.InClosedList;
        }
    }
Пример #4
0
    /*
     * Movemap section
     */

    public Movemap BuildMovemap(Node.TileGameStatus fraction, int moveDistance, Vector3Int position)
    {
        Movemap     map            = new Movemap();
        List <Node> nodesToProcess = new List <Node>();

        Node currentNode = _graph.GetNode(position);

        if (currentNode.GameStatus == Node.TileGameStatus.Block)
        {
            return(map);
        }
        currentNode.ProcessValue  = moveDistance;
        currentNode.ProcessStatus = Node.NodeProcessStatus.InOpenList;
        nodesToProcess.Add(currentNode);
        map.MoveCoords.Add(currentNode.Coords);

        while (nodesToProcess.Count != 0)
        {
            currentNode = nodesToProcess[0];
            foreach (var connection in currentNode.Connections)
            {
                Node endNode = connection.EndNode;

                if ((endNode.ProcessStatus == Node.NodeProcessStatus.NotVisited ||
                     endNode.ProcessValue < currentNode.ProcessValue - 1) &&
                    endNode.GameStatus == Node.TileGameStatus.Empty)
                {
                    //first entry in open list and not taken by characters
                    if (endNode.ProcessStatus == Node.NodeProcessStatus.NotVisited)
                    {
                        map.MoveCoords.Add(endNode.Coords);
                    }

                    endNode.ProcessValue = currentNode.ProcessValue - 1;

                    //if node has been already waiting processing in open list then change order
                    if (endNode.ProcessStatus == Node.NodeProcessStatus.InOpenList)
                    {
                        nodesToProcess.Remove(endNode);
                    }

                    if (endNode.ProcessValue > 0)
                    {
                        int indexToInsert = nodesToProcess.FindLastIndex(delegate(Node node)
                        {
                            return(node.ProcessValue >= endNode.ProcessValue);
                        });
                        nodesToProcess.Insert(indexToInsert, endNode);
                        endNode.ProcessStatus = Node.NodeProcessStatus.InOpenList;
                    }
                    else
                    {
                        endNode.ProcessStatus = Node.NodeProcessStatus.InClosedList;
                    }
                }
            }
            nodesToProcess.Remove(currentNode);
            currentNode.ProcessStatus = Node.NodeProcessStatus.InClosedList;
        }
        _graph.RestoreProcessStatus();
        return(map);
    }
Пример #5
0
 public void SetTileGameplayStatus(Vector3Int coords, Node.TileGameStatus status)
 {
     _graph.GetNode(coords).GameStatus = status;
 }