Exemplo n.º 1
0
    //testeado
    public static bool IsReachable(Hex start, Hex end)
    {
        int startIslandNumber;
        int endIslandNumber;

        if (!IslandNumberDictionary.TryGetValue(start, out startIslandNumber))
        {
            return(false);
        }
        if (!IslandNumberDictionary.TryGetValue(end, out endIslandNumber))
        {
            return(false);
        }

        if (startIslandNumber == endIslandNumber)
        {
            return(true);
        }
        else
        {
            return(false);
        }
    }
Exemplo n.º 2
0
    //testeado
    private void UpdateIslandDictionaries(RuntimeMap map)
    {
        IslandHexesDictionary.Clear();
        IslandNumberDictionary.Clear();


        var walkableHexes = new List <Hex>();

        foreach (var mapKeyValuePair in map.MovementMapValues)
        {
            if (mapKeyValuePair.Value)
            {
                walkableHexes.Add(mapKeyValuePair.Key);
            }
        }

        if (walkableHexes.Count <= 0)
        {
            return;
        }

        int infinityLoopBreak = 0;
        int islandNumber      = 0;

        while (walkableHexes.Count > 0)
        {
            Hex startingHex = walkableHexes[0];

            var openList   = new List <Hex>();
            var closedList = new List <Hex>();

            openList.Add(startingHex);
            while (openList.Count > 0)
            {
                var currentHex = openList[0];
                IslandNumberDictionary.Add(currentHex, islandNumber); //IslandNumberDictionary!!!
                walkableHexes.Remove(currentHex);

                openList.Remove(currentHex);
                closedList.Add(currentHex);

                for (int i = 0; i < 6; i++)
                {
                    var neightbor = currentHex.Neightbor(i);
                    if (map.MovementMapValues.ContainsKey(neightbor))
                    {
                        if (!MapUtilities.IsTraversable(neightbor, currentHex, MapUtilities.MapType.MOVEMENT) || closedList.Contains(neightbor))
                        {
                            continue;
                        }

                        if (!openList.Contains(neightbor))
                        {
                            openList.Add(neightbor);
                        }
                    }
                }

                infinityLoopBreak++;
                if (infinityLoopBreak > 1000000)
                {
                    Debug.LogError("there is a infinite loop in the system: update reachable hex list");
                    return;
                }
            }
            IslandHexesDictionary.Add(islandNumber, closedList); //IslndHexesDictionary!!!

            islandNumber++;
        }
    }