Beispiel #1
0
        public static void GetTileGraphicDataFromNeighbors(this WorldGrid grid, int tileID, out int atlasX, out int atlasZ, out int rotDir, TileNeightborPredicate validator)
        {
            atlasX = 0;
            atlasZ = 0;
            rotDir = 0;
            List <int> neighborDirs = new List <int>();
            List <int> adjacentIds  = new List <int>();

            grid.GetTileDirsOfNeighborsByValidator(tileID, neighborDirs, adjacentIds, validator);
            int dirCount = neighborDirs.Count();

            if (dirCount > 0)
            {
                int dirSum       = neighborDirs.Sum();
                int dirMin       = neighborDirs.Min();
                int dirMax       = neighborDirs.Max();
                int rotTargetDir = dirMin;
                if (dirCount == 1)
                {
                    atlasZ = 1;
                }
                else if (dirCount == 2)
                {
                    atlasX = 1;
                    int diff = dirMax - dirMin;
                    if (diff == 1 || diff == 5)
                    {
                        atlasX++;
                    }
                    if (diff == 2 || diff == 4)
                    {
                        atlasZ = 1;
                    }
                    if (diff == 4 || diff == 5)
                    {
                        rotTargetDir = dirMax;
                    }
                }
                else if (dirCount == 3)
                {
                    atlasX = 3;
                    int diff1 = Math.Abs(neighborDirs[0] - neighborDirs[1]);
                    int diff2 = Math.Abs(neighborDirs[1] - neighborDirs[2]);
                    int diff3 = Math.Abs(neighborDirs[0] - neighborDirs[2]);
                    if (diff1 == 3 || diff2 == 3 || diff3 == 3)
                    {
                        atlasZ = 1;
                        if ((dirSum - 1) % 3 == 0)
                        {
                            atlasX++;
                        }
                        if (diff1 == 1 || diff1 == 5)
                        {
                            rotTargetDir = neighborDirs[2];
                        }
                        else if (diff2 == 1 || diff2 == 5)
                        {
                            rotTargetDir = neighborDirs[0];
                        }
                        else if (diff3 == 1 || diff3 == 5)
                        {
                            rotTargetDir = neighborDirs[1];
                        }
                    }
                    else
                    {
                        if ((diff1 == 2 || diff1 == 4) && (diff2 == 2 || diff2 == 4) && (diff3 == 2 || diff3 == 4))
                        {
                            atlasX++;
                        }
                        else
                        {
                            if (dirMin == 0 && dirMax == 5)
                            {
                                if (dirSum == 9)
                                {
                                    rotTargetDir = 4;
                                }
                                else
                                {
                                    rotTargetDir = 5;
                                }
                            }
                        }
                    }
                }
                else if (dirCount == 4)
                {
                    atlasX = 5;
                    int diff1     = Math.Abs(neighborDirs[0] - neighborDirs[1]);
                    int diff2     = Math.Abs(neighborDirs[0] - neighborDirs[2]);
                    int diff3     = Math.Abs(neighborDirs[0] - neighborDirs[3]);
                    int diff4     = Math.Abs(neighborDirs[1] - neighborDirs[2]);
                    int diff5     = Math.Abs(neighborDirs[1] - neighborDirs[3]);
                    int diff6     = Math.Abs(neighborDirs[3] - neighborDirs[3]);
                    int distance3 = 0;
                    if (diff1 == 3)
                    {
                        distance3++;
                    }
                    if (diff2 == 3)
                    {
                        distance3++;
                    }
                    if (diff3 == 3)
                    {
                        distance3++;
                    }
                    if (diff4 == 3)
                    {
                        distance3++;
                    }
                    if (diff5 == 3)
                    {
                        distance3++;
                    }
                    if (diff6 == 3)
                    {
                        distance3++;
                    }
                    if (distance3 == 2)
                    {
                        atlasZ = 1;
                        if (dirMin == 0 && dirMax == 5)
                        {
                            rotTargetDir = 5;
                        }
                    }
                    else if (dirSum % 2 == 0)
                    {
                        atlasX++;
                        if (dirMin == 0 && dirMax == 5)
                        {
                            rotTargetDir = 9 - dirSum / 2;
                        }
                    }
                    else
                    {
                        if (!neighborDirs.Contains(5) && !neighborDirs.Contains(1))
                        {
                        }
                        else if (!neighborDirs.Contains(4) && !neighborDirs.Contains(0))
                        {
                            rotTargetDir = 5;
                        }
                        else
                        {
                            rotTargetDir = (15 - dirSum) / 2;
                        }
                    }
                }
                else if (dirCount == 5)
                {
                    atlasX = 6;
                    atlasZ = 1;
                    if (dirSum > 10)
                    {
                        rotTargetDir = 16 - dirSum;
                    }
                }
                else
                {
                    atlasX = 2;
                    atlasZ = 1;
                }
                // Get real rotation dir on planet surface
                int neighborIndex = neighborDirs.IndexOf(rotTargetDir);
                if (neighborIndex >= 0)
                {
                    if (adjacentIds.Count <= neighborIndex)
                    {
                        Log.Error("GetTileGraphicDataFromNeighbors: adjacentIds[neighborIndex] out of range");
                    }
                    int        rotTargetAdjId = adjacentIds[neighborIndex];
                    List <int> sameIndex      = new List <int>();
                    grid.GetTileVertices(tileID, tmpVertsSelf);
                    grid.GetTileVertices(grid.GetTileNeighbor(tileID, rotTargetAdjId), tmpVertsNeighbor);
                    for (int i = 0; i < tmpVertsSelf.Count; i++)
                    {
                        if (tmpVertsSelf.Count <= i)
                        {
                            Log.Error("GetTileGraphicDataFromNeighbors: tmpVertsSelf[i] out of range");
                        }
                        if (tmpVertsNeighbor.Contains(tmpVertsSelf[i]))
                        {
                            sameIndex.Add(i);
                        }
                    }
                    if (sameIndex.Contains(0) && sameIndex.Contains(5))
                    {
                        rotDir = 1;
                    }
                    else
                    {
                        rotDir = sameIndex.Max() + 1;
                    }
                    rotDir = rotDir % 6;
                }
            }
        }
Beispiel #2
0
        /*public static int?[] GetTileNeighborsSorted(this WorldGrid wg, int tileID)
         * {
         *  int?[] sortedNeighbors = new int?[] { null, null, null, null, null, null };
         *  wg.GetTileNeighbors(tileID, tmpNeighbors);
         *  foreach (int tile2 in tmpNeighbors)
         *  {
         *      int dir = wg.GetDirection6WayIntFromTo(tileID, tile2);
         *      sortedNeighbors[dir] = tile2;
         *  }
         *  return sortedNeighbors;
         * }*/

        /*public static void GetTileDirsOfNeighborsWithSameBiome(this WorldGrid wg, int tileID, List<int> outNeighborDirs, List<int> outAdjacentIds)
         * {
         *  BiomeDef biome = wg[tileID].biome;
         *  wg.GetTileNeighbors(tileID, tmpNeighbors);
         *  for (int i = 0; i < tmpNeighbors.Count; i++)
         *  {
         *      if (wg[tmpNeighbors[i]].biome == biome)
         *      {
         *          outNeighborDirs.Add(wg.GetDirection6WayIntFromTo(tileID, tmpNeighbors[i]));
         *          outAdjacentIds.Add(i);
         *      }
         *  }
         * }*/

        public static void GetTileDirsOfNeighborsByValidator(this WorldGrid wg, int tileID, List <int> outNeighborDirs, List <int> outAdjacentIds, TileNeightborPredicate validator)
        {
            Tile tile = wg[tileID];

            wg.GetTileNeighbors(tileID, tmpNeighbors);
            for (int i = 0; i < tmpNeighbors.Count; i++)
            {
                if (validator(tile, wg[tmpNeighbors[i]]))
                {
                    outNeighborDirs.Add(wg.GetDirection6WayIntFromTo(tileID, tmpNeighbors[i]));
                    outAdjacentIds.Add(i);
                }
            }
        }