//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); }
/// <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(); } }
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"); } } }