Ejemplo n.º 1
0
    public static void Initialize(DiffusionLimitedAggregationSettings settings, bool[,] map)
    //public static void Initialize(int maxStepsAmount, int maxStuckCount, float chanceToStick, bool allowDiagonal, bool stickDiagonal, bool allowNSWE, bool stickNSWE, bool[,] map)
    {
        if (map == null && !hasSetMap)
        {
            Debug.LogError("Map is set to null.");
        }

        if (!isInitialized)
        {
            if (!hasSetMap)
            {
                DifLimAgrWalker.width  = map.GetLength(0);
                DifLimAgrWalker.height = map.GetLength(1);
                System.Buffer.BlockCopy(map, 0, DifLimAgrWalker.map, 0, sizeof(bool) * DifLimAgrWalker.width * DifLimAgrWalker.height);
            }

            //DifLimAgrWalker.allowMovementDiagonal = allowDiagonal;
            //DifLimAgrWalker.allowStickDiagonal = stickDiagonal;
            //DifLimAgrWalker.allowMovementNSWE = allowNSWE;
            //DifLimAgrWalker.allowStickNSWE = stickNSWE;

            //DifLimAgrWalker.chanceToStick = chanceToStick;

            //DifLimAgrWalker.maxStepsAmount = maxStepsAmount;
            //DifLimAgrWalker.maxStuckCount = maxStuckCount;
            DifLimAgrWalker.settings = settings;

            DifLimAgrWalker.cellsCreated      = 0;
            DifLimAgrWalker.overallStuckCount = 0;

            DifLimAgrWalker.isInitialized = true;
        }
        else
        {
            Debug.LogError("Static variables are already initialized.");
        }

        //string debug = "";

        //for (int z = 0; z < height; z++)
        //{
        //    for (int x = 0; x < width; x++)
        //    {
        //        if (DifLimAgrWalker.map[x, z])
        //        {
        //            debug += "T";
        //        }
        //        else
        //        {
        //            debug += "F";
        //        }
        //    }
        //    debug += "\n";
        //}

        //Debug.Log(debug);
        //Debug.Log("width " + width);
        //Debug.Log("height " + height);
    }
Ejemplo n.º 2
0
 public static TileMapSettings PreprocessMap(TileMapSettings mapSettings, DiffusionLimitedAggregationSettings settings)
 {
     if (mapSettings.mapWidth < 10)
     {
         mapSettings.mapWidth = 10;
     }
     if (mapSettings.mapHeight < 10)
     {
         mapSettings.mapHeight = 10;
     }
     return(mapSettings);
 }
Ejemplo n.º 3
0
 private static int ChooseSpawnPool(ref DiffusionLimitedAggregationSettings settings, ref float spawnChance)
 {
     do
     {
         if (settings.spawnWalkersAlongNorthWall)
         {
             if (Random.value < spawnChance * northWall.Count)
             {
                 return(0);
             }
         }
         if (settings.spawnWalkersAlongSouthWall)
         {
             if (Random.value < spawnChance * southWall.Count)
             {
                 return(1);
             }
         }
         if (settings.spawnWalkersAlongEastWall)
         {
             if (Random.value < spawnChance * eastWall.Count)
             {
                 return(2);
             }
         }
         if (settings.spawnWalkersAlongWestWall)
         {
             if (Random.value < spawnChance * westWall.Count)
             {
                 return(3);
             }
         }
         if (settings.spawnWalkersAtCenter)
         {
             if (Random.value < spawnChance)
             {
                 return(4);
             }
         }
     } while (true);
 }
Ejemplo n.º 4
0
    public static EmptyGrid ProcessMap(EmptyGrid map, DiffusionLimitedAggregationSettings settings)
    {
        // Random Generator
        Random.State initialState = Random.state;
        if (settings.useFixedSeed)
        {
            Random.InitState(settings.seed.GetHashCode());
        }
        else
        {
            Random.InitState(Time.time.ToString().GetHashCode());
        }

        if (!(settings.allowMovementDiagonal || settings.allowMovementNSWE))
        {
            settings.allowMovementNSWE = true;
        }

        if (!(settings.allowStickDiagonal || settings.allowStickNSWE))
        {
            settings.allowStickNSWE = true;
        }

        if (settings.usePredefinedSpawnPoints)
        {
            if (settings.isAggregatorAtCenter)
            {
                settings.spawnWalkersAlongNorthWall               =
                    settings.spawnWalkersAlongSouthWall           =
                        settings.spawnWalkersAlongEastWall        =
                            settings.spawnWalkersAlongWestWall    =
                                settings.spawnAggregatorsAtCenter = true;

                settings.spawnWalkersAtCenter =
                    settings.spawnAggregatorsAlongNorthWall            =
                        settings.spawnAggregatorsAlongSouthWall        =
                            settings.spawnAggregatorsAlongEastWall     =
                                settings.spawnAggregatorsAlongWestWall = false;
            }
            else
            {
                settings.spawnWalkersAlongNorthWall               =
                    settings.spawnWalkersAlongSouthWall           =
                        settings.spawnWalkersAlongEastWall        =
                            settings.spawnWalkersAlongWestWall    =
                                settings.spawnAggregatorsAtCenter = false;

                settings.spawnWalkersAtCenter =
                    settings.spawnAggregatorsAlongNorthWall            =
                        settings.spawnAggregatorsAlongSouthWall        =
                            settings.spawnAggregatorsAlongEastWall     =
                                settings.spawnAggregatorsAlongWestWall = true;
            }
        }
        else
        {
            if (!(settings.spawnWalkersAlongNorthWall ||
                  settings.spawnWalkersAlongSouthWall ||
                  settings.spawnWalkersAlongEastWall ||
                  settings.spawnWalkersAlongWestWall ||
                  settings.spawnWalkersAtCenter))
            {
                settings.spawnWalkersAlongNorthWall            =
                    settings.spawnWalkersAlongSouthWall        =
                        settings.spawnWalkersAlongEastWall     =
                            settings.spawnWalkersAlongWestWall = true;
            }

            if (!(settings.spawnAggregatorsAlongNorthWall ||
                  settings.spawnAggregatorsAlongSouthWall ||
                  settings.spawnAggregatorsAlongEastWall ||
                  settings.spawnAggregatorsAlongWestWall ||
                  settings.spawnAggregatorsAtCenter))
            {
                settings.spawnAggregatorsAtCenter = true;
            }

            if (settings.spawnWalkersAlongNorthWall && settings.spawnAggregatorsAlongNorthWall)
            {
                settings.spawnAggregatorsAlongNorthWall = false;
            }
            if (settings.spawnWalkersAlongSouthWall && settings.spawnAggregatorsAlongSouthWall)
            {
                settings.spawnAggregatorsAlongSouthWall = false;
            }
            if (settings.spawnWalkersAlongEastWall && settings.spawnAggregatorsAlongEastWall)
            {
                settings.spawnAggregatorsAlongEastWall = false;
            }
            if (settings.spawnWalkersAlongWestWall && settings.spawnAggregatorsAlongWestWall)
            {
                settings.spawnAggregatorsAlongWestWall = false;
            }
            if (settings.spawnWalkersAtCenter && settings.spawnAggregatorsAtCenter)
            {
                settings.spawnWalkersAtCenter = false;
            }
        }

        if (settings.cellsToCreateCount >= map.width * map.height)
        {
            settings.cellsToCreateCount = Mathf.FloorToInt(map.width * map.height * 0.5f);
        }
        if (settings.aliveWalkersAmount < 1)
        {
            settings.aliveWalkersAmount = 1;
        }
        if (settings.maxStepsAmount < 5)
        {
            settings.maxStepsAmount = 5;
        }
        if (settings.maxStuckCount < 5)
        {
            settings.maxStuckCount = 5;
        }
        if (settings.overallStuckLimit < 10)
        {
            settings.overallStuckLimit = 10;
        }

        // Processing
        center    = new Coordinate(Mathf.FloorToInt((map.width - 1) * 0.5f), Mathf.FloorToInt((map.height - 1) * 0.5f));
        northWall = null;
        southWall = null;
        eastWall  = null;
        westWall  = null;

        if (settings.spawnWalkersAlongNorthWall || settings.spawnAggregatorsAlongNorthWall)
        {
            northWall = new List <Coordinate>(map.width);
            for (int x = 0; x < map.width; x++)
            {
                northWall.Add(new Coordinate(x, map.height - 1));
            }
        }
        if (settings.spawnWalkersAlongSouthWall || settings.spawnAggregatorsAlongSouthWall)
        {
            southWall = new List <Coordinate>(map.width);
            for (int x = 0; x < map.width; x++)
            {
                southWall.Add(new Coordinate(x, 0));
            }
        }
        if (settings.spawnWalkersAlongEastWall || settings.spawnAggregatorsAlongEastWall)
        {
            eastWall = new List <Coordinate>(map.height);
            for (int z = 0; z < map.height; z++)
            {
                eastWall.Add(new Coordinate(map.width - 1, z));
            }
        }
        if (settings.spawnWalkersAlongWestWall || settings.spawnAggregatorsAlongWestWall)
        {
            westWall = new List <Coordinate>(map.height);
            for (int z = 0; z < map.height; z++)
            {
                westWall.Add(new Coordinate(0, z));
            }
        }

        // Fill map
        CellType trueCell  = CellType.Wall;
        CellType falseCell = CellType.Empty;

        // карту заполним сразу trueCell-ами
        if (settings.spawnAggregatorsAlongNorthWall)
        {
            for (int i = 0; i < northWall.Count; i++)
            {
                map.values[northWall[i].x, northWall[i].z] = Cell.CreateCell(trueCell);
            }
        }
        if (settings.spawnAggregatorsAlongSouthWall)
        {
            for (int i = 0; i < southWall.Count; i++)
            {
                map.values[southWall[i].x, southWall[i].z] = Cell.CreateCell(trueCell);
            }
        }
        if (settings.spawnAggregatorsAlongEastWall)
        {
            for (int i = 0; i < eastWall.Count; i++)
            {
                map.values[eastWall[i].x, eastWall[i].z] = Cell.CreateCell(trueCell);
            }
        }
        if (settings.spawnAggregatorsAlongWestWall)
        {
            for (int i = 0; i < westWall.Count; i++)
            {
                map.values[westWall[i].x, westWall[i].z] = Cell.CreateCell(trueCell);
            }
        }
        if (settings.spawnAggregatorsAtCenter)
        {
            map.values[center.x, center.z] = Cell.CreateCell(trueCell);
        }

        trueCell  = CellType.Wall;
        falseCell = CellType.Empty;

        // fill working map mask
        // from cell to bool
        DifLimAgrWalker.SetBoolMapFromCellMap(ref map.values, trueCell, falseCell);

        //DifLimAgrWalker.Initialize(settings.maxStepsAmount, settings.maxStuckCount, settings.chanceToStick, settings.allowMovementDiagonal, settings.allowStickDiagonal, settings.allowMovementNSWE, settings.allowStickNSWE, null);
        DifLimAgrWalker.Initialize(settings, null);

        List <DifLimAgrWalker> walkers = new List <DifLimAgrWalker>(settings.aliveWalkersAmount);

        int spawnPoints = 0;

        spawnPoints += settings.spawnWalkersAlongNorthWall ? northWall.Count : 0;
        spawnPoints += settings.spawnWalkersAlongSouthWall ? southWall.Count : 0;
        spawnPoints += settings.spawnWalkersAlongEastWall ? eastWall.Count : 0;
        spawnPoints += settings.spawnWalkersAlongWestWall ? westWall.Count : 0;
        spawnPoints += settings.spawnWalkersAtCenter ? 1 : 0;

        float spawnChance = 1.0f / spawnPoints;

        for (int i = 0; i < settings.aliveWalkersAmount; i++)
        {
            walkers.Add(DifLimAgrWalker.SpawnWalker(RandomSpawnPoint(ChooseSpawnPool(ref settings, ref spawnChance))));
        }

        // OverallStuck - критерий останова
        while (!DifLimAgrWalker.IsEnoughCellsCreated() && !DifLimAgrWalker.IsOvergoStuckLimit())
        {
            for (int i = 0; i < settings.aliveWalkersAmount; i++)
            {
                bool isTimeToRespawn = walkers[i].Walk();

                if (isTimeToRespawn)
                {
                    if (walkers[i].IsStuck())
                    {
                        if (DifLimAgrWalker.IsOvergoStuckLimit())
                        {
                            break;
                        }
                    }
                    walkers[i].RespawnWalker(RandomSpawnPoint(ChooseSpawnPool(ref settings, ref spawnChance)));
                }
            }
        }

        DifLimAgrWalker.Clear();

        trueCell  = CellType.Wall;
        falseCell = CellType.Floor;

        map.values = DifLimAgrWalker.GetBoolMapAsCellMap(trueCell, falseCell);

        Random.state = initialState;

        return(map);
    }