public static Command SettleCommand(Caravan caravan)
        {
            Command_Settle command_Settle = new Command_Settle();

            command_Settle.defaultLabel = "CommandSettle".Translate();
            command_Settle.defaultDesc  = "CommandSettleDesc".Translate();
            command_Settle.icon         = SettleUtility.SettleCommandTex;
            command_Settle.action       = delegate
            {
                SoundDefOf.Tick_High.PlayOneShotOnCamera(null);
                SettlementProximityGoodwillUtility.CheckConfirmSettle(caravan.Tile, delegate
                {
                    SettleInEmptyTileUtility.Settle(caravan);
                });
            };
            SettleInEmptyTileUtility.tmpSettleFailReason.Length = 0;
            if (!TileFinder.IsValidTileForNewSettlement(caravan.Tile, SettleInEmptyTileUtility.tmpSettleFailReason))
            {
                command_Settle.Disable(SettleInEmptyTileUtility.tmpSettleFailReason.ToString());
            }
            else if (SettleUtility.PlayerSettlementsCountLimitReached)
            {
                if (Prefs.MaxNumberOfPlayerSettlements > 1)
                {
                    command_Settle.Disable("CommandSettleFailReachedMaximumNumberOfBases".Translate());
                }
                else
                {
                    command_Settle.Disable("CommandSettleFailAlreadyHaveBase".Translate());
                }
            }
            return(command_Settle);
        }
Beispiel #2
0
 public static int RandomFactionBaseTileFor(Faction faction, bool mustBeAutoChoosable = false, Predicate <int> extraValidator = null)
 {
     for (int i = 0; i < 500; i++)
     {
         int num;
         if ((from _ in Enumerable.Range(0, 100)
              select Rand.Range(0, Find.WorldGrid.TilesCount)).TryRandomElementByWeight(delegate(int x)
         {
             Tile tile = Find.WorldGrid[x];
             if (!tile.biome.canBuildBase || !tile.biome.implemented || tile.hilliness == Hilliness.Impassable)
             {
                 return(0f);
             }
             if (mustBeAutoChoosable && !tile.biome.canAutoChoose)
             {
                 return(0f);
             }
             if (extraValidator != null && !extraValidator(x))
             {
                 return(0f);
             }
             return(tile.biome.factionBaseSelectionWeight);
         }, out num))
         {
             if (TileFinder.IsValidTileForNewSettlement(num, null))
             {
                 return(num);
             }
         }
     }
     Log.Error("Failed to find faction base tile for " + faction);
     return(0);
 }
Beispiel #3
0
        public static bool TryFindNewSiteTile(out int tile, int minDist = 8, int maxDist = 30, bool allowCaravans = false, bool preferCloserTiles = true, int nearThisTile = -1)
        {
            Func <int, int> findTile = delegate(int root)
            {
                int             minDist2           = minDist;
                int             maxDist2           = maxDist;
                Predicate <int> validator          = (int x) => !Find.WorldObjects.AnyWorldObjectAt(x) && TileFinder.IsValidTileForNewSettlement(x, null);
                bool            preferCloserTiles2 = preferCloserTiles;
                int             result;
                if (TileFinder.TryFindPassableTileWithTraversalDistance(root, minDist2, maxDist2, out result, validator, false, preferCloserTiles2))
                {
                    return(result);
                }
                return(-1);
            };
            int arg;

            if (nearThisTile != -1)
            {
                arg = nearThisTile;
            }
            else if (!TileFinder.TryFindRandomPlayerTile(out arg, allowCaravans, (int x) => findTile(x) != -1))
            {
                tile = -1;
                return(false);
            }
            tile = findTile(arg);
            return(tile != -1);
        }
Beispiel #4
0
        private void GenerateRoadEndpoints()
        {
            List <int> list = (from wo in Find.WorldObjects.AllWorldObjects
                               where Rand.Value > 0.05000000074505806
                               select wo.Tile).ToList();
            int num = GenMath.RoundRandom((float)((float)Find.WorldGrid.TilesCount / 100000.0 * WorldGenStep_Roads.ExtraRoadNodesPer100kTiles.RandomInRange));

            for (int i = 0; i < num; i++)
            {
                list.Add(TileFinder.RandomFactionBaseTileFor(null, false, null));
            }
            List <int> list2 = new List <int>();

            for (int j = 0; j < list.Count; j++)
            {
                int num2 = Mathf.Max(0, WorldGenStep_Roads.RoadDistanceFromSettlement.RandomInRange);
                int num3 = list[j];
                for (int k = 0; k < num2; k++)
                {
                    Find.WorldGrid.GetTileNeighbors(num3, list2);
                    num3 = list2.RandomElement();
                }
                if (Find.WorldReachability.CanReach(list[j], num3))
                {
                    list[j] = num3;
                }
            }
            list = list.Distinct().ToList();
            Find.World.genData.roadNodes = list;
        }
        private void GenerateAncientSites()
        {
            int num = GenMath.RoundRandom((float)((float)Find.WorldGrid.TilesCount / 100000.0 * this.ancientSitesPer100kTiles.RandomInRange));

            for (int i = 0; i < num; i++)
            {
                Find.World.genData.ancientSites.Add(TileFinder.RandomFactionBaseTileFor(null, false, null));
            }
        }
        private void GenerateAncientSites()
        {
            int num = GenMath.RoundRandom((float)Find.WorldGrid.TilesCount / 100000f * ancientSitesPer100kTiles.RandomInRange);

            for (int i = 0; i < num; i++)
            {
                Find.World.genData.ancientSites.Add(TileFinder.RandomSettlementTileFor(null));
            }
        }
Beispiel #7
0
 public static bool TryFindNewSiteTile(out int tile, int minDist = 7, int maxDist = 27, bool allowCaravans = false, bool preferCloserTiles = true, int nearThisTile = -1)
 {
     Func <int, int> findTile = delegate(int root)
     {
         int             minDist2 = minDist;
         int             maxDist2 = maxDist;
         int             result2;
         ref int         result             = ref result2;
         Predicate <int> validator          = (int x) => !Find.WorldObjects.AnyWorldObjectAt(x) && TileFinder.IsValidTileForNewSettlement(x, null);
         bool            preferCloserTiles2 = preferCloserTiles;
         if (TileFinder.TryFindPassableTileWithTraversalDistance(root, minDist2, maxDist2, out result, validator, false, preferCloserTiles2))
         {
             return(result2);
         }
         return(-1);
     };
Beispiel #8
0
 public static int RandomStartingTile()
 {
     return(TileFinder.RandomFactionBaseTileFor(Faction.OfPlayer, true, null));
 }