public static void ResolveSketch(ResolveParams parms) { if (!ModLister.RoyaltyInstalled) { Log.ErrorOnce("Mech clusters are a Royalty-specific game system. If you want to use this code please check ModLister.RoyaltyInstalled before calling it. See rules on the Ludeon forum for more info.", 673321); return; } bool canBeDormant = !parms.mechClusterDormant.HasValue || parms.mechClusterDormant.Value; float num; if (parms.points.HasValue) { num = parms.points.Value; } else { num = 2000f; Log.Error("No points given for mech cluster generation. Default to " + num); } float value = parms.totalPoints.HasValue ? parms.totalPoints.Value : num; IntVec2 intVec; if (parms.mechClusterSize.HasValue) { intVec = parms.mechClusterSize.Value; } else { int num2 = GenMath.RoundRandom(PointsToSizeCurve.Evaluate(num) * SizeRandomFactorRange.RandomInRange); int num3 = GenMath.RoundRandom(PointsToSizeCurve.Evaluate(num) * SizeRandomFactorRange.RandomInRange); if (parms.mechClusterForMap != null) { CellRect cellRect = LargestAreaFinder.FindLargestRect(parms.mechClusterForMap, (IntVec3 x) => !x.Impassable(parms.mechClusterForMap) && x.GetTerrain(parms.mechClusterForMap).affordances.Contains(TerrainAffordanceDefOf.Heavy), Mathf.Max(num2, num3)); num2 = Mathf.Min(num2, cellRect.Width); num3 = Mathf.Min(num3, cellRect.Height); } intVec = new IntVec2(num2, num3); } Sketch sketch = new Sketch(); if (Rand.Chance(WallsChanceCurve.Evaluate(num))) { ResolveParams parms2 = parms; parms2.sketch = sketch; parms2.mechClusterSize = intVec; SketchResolverDefOf.MechClusterWalls.Resolve(parms2); } List <ThingDef> buildingDefsForCluster_NewTemp = GetBuildingDefsForCluster_NewTemp(num, intVec, canBeDormant, value); AddBuildingsToSketch(sketch, intVec, buildingDefsForCluster_NewTemp); parms.sketch.MergeAt(sketch, default(IntVec3), Sketch.SpawnPosType.OccupiedCenter); }
private int GetLargestSize(Slate slate) { Map mapResolved = map.GetValue(slate) ?? slate.Get <Map>("map"); if (mapResolved == null) { return(0); } int value = max.GetValue(slate); CellRect cellRect = LargestAreaFinder.FindLargestRect(mapResolved, (IntVec3 x) => IsClear(x, mapResolved), value); return(Mathf.Min(cellRect.Width, cellRect.Height, value)); }