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); }
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); };