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);
        }
Exemple #2
0
        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));
        }