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); }
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); }
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); }
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)); } }
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); };
public static int RandomStartingTile() { return(TileFinder.RandomFactionBaseTileFor(Faction.OfPlayer, true, null)); }