Beispiel #1
0
        //static void Prefix(IEnumerable<GenStepWithParams> genStepDefs, Map map, int seed)
        static bool Prefix(Map map, int seed)
        {
            if (!map.Biome.defName.Equals("Ocean"))
            {
                return(true);
            }

            //based on MapGenerator.GenerateMap
            //MapGenerator.data.Clear();
            Rand.PushState();
            try
            {
                Rand.Seed = seed;
                RockNoises.Init(map);
                //OceanGenSteps.Clear();
                //OceanGenSteps.AddRange((IEnumerable<GenStepWithParams>)genStepDefs.OrderBy<GenStepWithParams, float>((Func<GenStepWithParams, float>)(x => x.def.order)).ThenBy<GenStepWithParams, ushort>((Func<GenStepWithParams, ushort>)(x => x.def.index)));
                for (int index = 0; index < WaterGenerator.oceanGenSteps.Count; ++index)
                {
                    DeepProfiler.Start("GenStep - " + (object)WaterGenerator.oceanGenSteps[index].def);
                    try
                    {
                        //Rand.Seed = Gen.HashCombineInt(seed, MapGenerator.GetSeedPart(OceanGenSteps, index));
                        WaterGenerator.oceanGenSteps[index].def.genStep.Generate(map, WaterGenerator.oceanGenSteps[index].parms);
                    }
                    catch (Exception ex)
                    {
                        Log.Error("Error in GenStep: " + (object)ex, false);
                    }
                    finally
                    {
                        DeepProfiler.End();
                    }
                }
            }
            finally
            {
                Rand.PopState();
                RockNoises.Reset();
                //MapGenerator.data.Clear();
            }

            return(false);
        }
Beispiel #2
0
        /// <summary>
        /// Generate a minimal map with elevation and fertility grids
        /// </summary>
        private static MapGridSet GenerateMapGrids(int mapTile, int mapSize, bool revealCaves)
        {
            DeepProfiler.Start("generateMapPreviewGrids");
            try {
                Rand.PushState();
                var mapGeneratorData = (Dictionary <string, object>)ReflectionCache.MapGenerator_Data.GetValue(null);
                mapGeneratorData.Clear();

                var map = CreateMapStub(mapSize, mapTile);
                MapGenerator.mapBeingGenerated = map;

                var mapSeed = Gen.HashCombineInt(Find.World.info.Seed, map.Tile);
                Rand.Seed = mapSeed;
                RockNoises.Init(map);

                var elevationFertilityGenstep = new GenStep_ElevationFertility();
                Rand.Seed = Gen.HashCombineInt(mapSeed, elevationFertilityGenstep.SeedPart);
                elevationFertilityGenstep.Generate(map, new GenStepParams());

                if (revealCaves)
                {
                    var cavesGenstep = new GenStep_Caves();
                    Rand.Seed = Gen.HashCombineInt(mapSeed, cavesGenstep.SeedPart);
                    cavesGenstep.Generate(map, new GenStepParams());
                }

                var result = new MapGridSet(MapGenerator.Elevation, MapGenerator.Fertility, MapGenerator.Caves, map);
                mapGeneratorData.Clear();

                return(result);
            } finally {
                DeepProfiler.End();
                MapGenerator.mapBeingGenerated = null;
                Rand.PopState();
            }
        }
Beispiel #3
0
        private static void GeneratePreviewForSeed(string seed, int mapTile, int mapSize, bool revealCaves, ThreadableTexture texture)
        {
            var prevSeed = Find.World.info.seedString;

            try {
                MapRerollController.HasCavesOverride.HasCaves        = Find.World.HasCaves(mapTile);
                MapRerollController.HasCavesOverride.OverrideEnabled = true;
                Find.World.info.seedString = seed;

                MapRerollController.RandStateStackCheckingPaused = true;
                var grids = GenerateMapGrids(mapTile, mapSize, revealCaves);
                DeepProfiler.Start("generateMapPreviewTexture");
                const string terrainGenStepName = "Terrain";
                var          terrainGenStepDef  = DefDatabase <GenStepDef> .GetNamedSilentFail(terrainGenStepName);

                if (terrainGenStepDef == null)
                {
                    throw new Exception("Named GenStepDef not found: " + terrainGenStepName);
                }
                var terrainGenstep         = terrainGenStepDef.genStep;
                var riverMaker             = ReflectionCache.GenStepTerrain_GenerateRiver.Invoke(terrainGenstep, new object[] { grids.Map });
                var beachTerrainAtDelegate = (BeachMakerBeachTerrainAt)Delegate.CreateDelegate(typeof(BeachMakerBeachTerrainAt), null, ReflectionCache.BeachMaker_BeachTerrainAt);
                var riverTerrainAtDelegate = riverMaker == null ? null
                                        : (RiverMakerTerrainAt)Delegate.CreateDelegate(typeof(RiverMakerTerrainAt), riverMaker, ReflectionCache.RiverMaker_TerrainAt);
                ReflectionCache.BeachMaker_Init.Invoke(null, new object[] { grids.Map });

                var mapBounds = CellRect.WholeMap(grids.Map);
                foreach (var cell in mapBounds)
                {
                    const float rockCutoff = .7f;
                    var         terrainDef = TerrainFrom(cell, grids.Map, grids.ElevationGrid[cell], grids.FertilityGrid[cell], riverTerrainAtDelegate, beachTerrainAtDelegate, false);
                    if (!terrainColors.TryGetValue(terrainDef.defName, out Color pixelColor))
                    {
                        pixelColor = missingTerrainColor;
                    }
                    if (grids.ElevationGrid[cell] > rockCutoff && !terrainDef.IsRiver)
                    {
                        pixelColor = solidStoneColor;
                        if (grids.CavesGrid[cell] > 0)
                        {
                            pixelColor = caveColor;
                        }
                    }
                    texture.SetPixel(cell.x, cell.z, pixelColor);
                }

                AddBevelToSolidStone(texture);

                foreach (var terrainPatchMaker in grids.Map.Biome.terrainPatchMakers)
                {
                    terrainPatchMaker.Cleanup();
                }
            } catch (Exception e) {
                MapRerollController.Instance.Logger.ReportException(e, null, false, "preview generation");
            } finally {
                RockNoises.Reset();
                DeepProfiler.End();
                Find.World.info.seedString = prevSeed;
                MapRerollController.RandStateStackCheckingPaused     = false;
                MapRerollController.HasCavesOverride.OverrideEnabled = false;
                try {
                    ReflectionCache.BeachMaker_Cleanup.Invoke(null, null);
                } catch (Exception e) {
                    MapRerollController.Instance.Logger.ReportException(e, null, false, "BeachMaker preview cleanup");
                }
            }
        }