public static IEnumerable <FloatMenuOption> GetSettle(
            SettlementBase bs,
            IEnumerable <IThingHolder> pods,
            CompLaunchableHelicopter representative,
            Caravan car)
        {
            foreach (FloatMenuOption floatMenuOption in HelicopterStatic.GetMapParent((MapParent)bs, pods, representative, car))
            {
                FloatMenuOption o = floatMenuOption;
                yield return(o);

                o = (FloatMenuOption)null;
            }
            foreach (FloatMenuOption visitFloatMenuOption in HelicoptersArrivalActionUtility.GetVisitFloatMenuOptions(representative, pods, bs, car))
            {
                FloatMenuOption f = visitFloatMenuOption;
                yield return(f);

                f = (FloatMenuOption)null;
            }
            foreach (FloatMenuOption giftFloatMenuOption in HelicoptersArrivalActionUtility.GetGIFTFloatMenuOptions(representative, pods, bs, car))
            {
                FloatMenuOption f2 = giftFloatMenuOption;
                yield return(f2);

                f2 = (FloatMenuOption)null;
            }
            foreach (FloatMenuOption atkFloatMenuOption in HelicoptersArrivalActionUtility.GetATKFloatMenuOptions(representative, pods, bs, car))
            {
                FloatMenuOption f3 = atkFloatMenuOption;
                yield return(f3);

                f3 = (FloatMenuOption)null;
            }
        }
示例#2
0
    public SettlementBuilder(GameGenerator gameGen, SettlementBase set)
    {
        GameGenerator = gameGen;
        if (gameGen != null)
        {
            GenerationRandom = new GenerationRandom(gameGen.Seed);
        }
        else
        {
            GenerationRandom = new GenerationRandom(0);
        }
        BaseChunk         = set.BaseChunk;
        Centre            = set.Centre;
        BaseCoord         = set.BaseCoord;
        SettlementChunks  = set.SettlementChunks;
        TileSize          = set.TileSize;
        PathTile          = Tile.STONE_PATH;
        MidTile           = new Vec2i(TileSize / 2, TileSize / 2);
        Tiles             = new Tile[TileSize, TileSize];
        SettlementObjects = new WorldObjectData[TileSize, TileSize];
        Buildings         = new List <Building>();
        //PathNodes = new List<Vec2i>();
        BuildingPlots  = new List <Recti>();
        SettlementType = set.SettlementType;
        //TestNodes = new List<SettlementPathNode>();
        TestNodes2 = new SettlementPathNode[TileSize / NODE_RES, TileSize / NODE_RES];

        //Defines a path node to be once every chunk
        PathNodeRes = World.ChunkSize;
        PathNodes   = new float[TileSize / NODE_RES, TileSize / NODE_RES];
        PNSize      = TileSize / PathNodeRes;
    }
示例#3
0
        public static void TradeRequests()
        {
            Map currentMap = Find.CurrentMap;
            IncidentWorker_QuestTradeRequest incidentWorker_QuestTradeRequest = (IncidentWorker_QuestTradeRequest)IncidentDefOf.Quest_TradeRequest.Worker;
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("Randomly-generated trade requests for map " + currentMap.ToString() + ":");
            stringBuilder.AppendLine();
            for (int i = 0; i < 50; i++)
            {
                SettlementBase settlementBase = IncidentWorker_QuestTradeRequest.RandomNearbyTradeableSettlement(currentMap.Tile);
                if (settlementBase == null)
                {
                    break;
                }
                stringBuilder.AppendLine("Settlement: " + settlementBase.LabelCap);
                TradeRequestComp component = settlementBase.GetComponent <TradeRequestComp>();
                if (incidentWorker_QuestTradeRequest.TryGenerateTradeRequest(component, currentMap))
                {
                    stringBuilder.AppendLine("Duration: " + (component.expiration - Find.TickManager.TicksGame).ToStringTicksToDays("F1"));
                    string str = GenLabel.ThingLabel(component.requestThingDef, null, component.requestCount) + " ($" + (component.requestThingDef.BaseMarketValue * (float)component.requestCount).ToString("F0") + ")";
                    stringBuilder.AppendLine("Request: " + str);
                    string str2 = GenThing.ThingsToCommaList(component.rewards, false, true, -1) + " ($" + (from t in component.rewards
                                                                                                            select t.MarketValue * (float)t.stackCount).Sum().ToString("F0") + ")";
                    stringBuilder.AppendLine("Reward: " + str2);
                }
                else
                {
                    stringBuilder.AppendLine("TryGenerateTradeRequest failed.");
                }
                stringBuilder.AppendLine();
                settlementBase.GetComponent <TradeRequestComp>().Disable();
            }
            Log.Message(stringBuilder.ToString(), false);
        }
示例#4
0
        public static Command TradeCommand(WorldShip worldShip)
        {
            Pawn           bestNegotiator = BestNegotiator(worldShip);
            Command_Action command_Action = new Command_Action();

            command_Action.defaultLabel = "CommandTrade".Translate();
            command_Action.defaultDesc  = "CommandTradeDesc".Translate();
            command_Action.icon         = DropShipUtility.TradeCommandTex;
            command_Action.action       = delegate
            {
                SettlementBase Settlement = (SettlementBase)Find.WorldObjects.SettlementBaseAt(worldShip.Tile);
                if (Settlement != null && Settlement.CanTradeNow)
                {
                    //caravan.UnloadCargoForTrading();
                    //Find.WindowStack.Add(new Dialog_TradeFromShips(caravan, bestNegotiator, Settlement));
                    Find.WindowStack.Add(new Dialog_TradeFromShips(worldShip, bestNegotiator, Settlement));
                    string empty  = string.Empty;
                    string empty2 = string.Empty;
                    PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(Settlement.Goods.OfType <Pawn>(), ref empty, ref empty2, "LetterRelatedPawnsTradingWithSettlement".Translate(), false);
                    if (!empty2.NullOrEmpty())
                    {
                        Find.LetterStack.ReceiveLetter(empty, empty2, LetterDefOf.PositiveEvent, Settlement, null);
                    }
                }
            };
            if (bestNegotiator == null)
            {
                command_Action.Disable("CommandTradeFailNoNegotiator".Translate());
            }
            return(command_Action);
        }
示例#5
0
        static void Postfix(ref IEnumerable <Gizmo> __result, SettlementBase __instance)
        {
            if (EmbarkShipUtility.AdjacentOceanTile(__instance.Tile) == -1)
            {
                return;
            }
            List <Gizmo> newResult = new List <Gizmo>();

            foreach (Gizmo gizmo in __result)
            {
                newResult.Add(gizmo);
            }
            //FEATURE NOT IMPLEMENTED

            /*
             * //adds an embark ship button for every shipyard in the map
             * foreach (Zone zone in __instance.Map.zoneManager.AllZones)
             * {
             *  if (zone is Zone_Shipyard)
             *  {
             *      newResult.Add(EmbarkShipUtility.EmbarkCommand());
             *      (Command)newResult.Last()).def
             *  }
             * }
             */
            newResult.Add(EmbarkShipUtility.EmbarkCommand());
            newResult.Add(ShipMoverTest.MoveCommand());
            __result = newResult;
        }
        public static IEnumerable <FloatMenuOption> GetATKFloatMenuOptions(
            CompLaunchableSRTS representative,
            IEnumerable <IThingHolder> pods,
            SettlementBase settlement,
            Caravan car)
        {
            Func <FloatMenuAcceptanceReport> acceptanceReportGetter1 = (Func <FloatMenuAcceptanceReport>)(() => TransportPodsArrivalAction_AttackSettlement.CanAttack(pods, settlement));
            Func <TransportPodsArrivalAction_AttackSettlement> arrivalActionGetter1 = (Func <TransportPodsArrivalAction_AttackSettlement>)(() => new TransportPodsArrivalAction_AttackSettlement(settlement, PawnsArrivalModeDefOf.EdgeDrop));

            object[] objArray1 = new object[1]
            {
                (object)settlement.Label
            };
            foreach (FloatMenuOption floatMenuOption in SRTSArrivalActionUtility.GetFloatMenuOptions <TransportPodsArrivalAction_AttackSettlement>(acceptanceReportGetter1, arrivalActionGetter1, "AttackAndDropAtEdge".Translate(objArray1), representative, settlement.Tile, car))
            {
                FloatMenuOption f = floatMenuOption;
                yield return(f);

                f = (FloatMenuOption)null;
            }
            Func <FloatMenuAcceptanceReport> acceptanceReportGetter2 = (Func <FloatMenuAcceptanceReport>)(() => TransportPodsArrivalAction_AttackSettlement.CanAttack(pods, settlement));
            Func <TransportPodsArrivalAction_AttackSettlement> arrivalActionGetter2 = (Func <TransportPodsArrivalAction_AttackSettlement>)(() => new TransportPodsArrivalAction_AttackSettlement(settlement, PawnsArrivalModeDefOf.CenterDrop));

            object[] objArray2 = new object[1]
            {
                (object)settlement.Label
            };
            foreach (FloatMenuOption floatMenuOption in SRTSArrivalActionUtility.GetFloatMenuOptions <TransportPodsArrivalAction_AttackSettlement>(acceptanceReportGetter2, arrivalActionGetter2, "AttackAndDropInCenter".Translate(objArray2), representative, settlement.Tile, car))
            {
                FloatMenuOption f2 = floatMenuOption;
                yield return(f2);

                f2 = (FloatMenuOption)null;
            }
        }
示例#7
0
 static void Postfix(ref SettlementBase __result, int originTile)
 {
     if (__result is City city && (city.Abandoned || city.Faction.HostileTo(Faction.OfPlayer)))
     {
         __result = null;
     }
 }
示例#8
0
        public static void TradeRequestsSampled()
        {
            Map currentMap = Find.CurrentMap;
            IncidentWorker_QuestTradeRequest incidentWorker_QuestTradeRequest = (IncidentWorker_QuestTradeRequest)IncidentDefOf.Quest_TradeRequest.Worker;
            Dictionary <ThingDef, int>       counts = new Dictionary <ThingDef, int>();

            for (int i = 0; i < 100; i++)
            {
                SettlementBase settlementBase = IncidentWorker_QuestTradeRequest.RandomNearbyTradeableSettlement(currentMap.Tile);
                if (settlementBase == null)
                {
                    break;
                }
                TradeRequestComp component = settlementBase.GetComponent <TradeRequestComp>();
                if (incidentWorker_QuestTradeRequest.TryGenerateTradeRequest(component, currentMap))
                {
                    if (!counts.ContainsKey(component.requestThingDef))
                    {
                        counts.Add(component.requestThingDef, 0);
                    }
                    Dictionary <ThingDef, int> dictionary;
                    ThingDef requestThingDef;
                    (dictionary = counts)[requestThingDef = component.requestThingDef] = dictionary[requestThingDef] + 1;
                }
                settlementBase.GetComponent <TradeRequestComp>().Disable();
            }
            DebugTables.MakeTablesDialog(from d in DefDatabase <ThingDef> .AllDefs
                                         where counts.ContainsKey(d)
                                         orderby counts[d] descending
                                         select d, new TableDataGetter <ThingDef>("defName", (ThingDef d) => d.defName), new TableDataGetter <ThingDef>("appearance rate in " + 100 + " trade requests", (ThingDef d) => ((float)counts[d] / 100f).ToStringPercent()));
        }
示例#9
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map;

            if (!this.TryGetRandomAvailableTargetMap(out map))
            {
                return(false);
            }
            SettlementBase settlementBase = IncidentWorker_QuestTradeRequest.RandomNearbyTradeableSettlement(map.Tile);

            if (settlementBase == null)
            {
                return(false);
            }
            TradeRequestComp component = settlementBase.GetComponent <TradeRequestComp>();

            if (!this.TryGenerateTradeRequest(component, map))
            {
                return(false);
            }
            string text = "LetterCaravanRequest".Translate(new object[]
            {
                settlementBase.Label,
                TradeRequestUtility.RequestedThingLabel(component.requestThingDef, component.requestCount).CapitalizeFirst(),
                (component.requestThingDef.GetStatValueAbstract(StatDefOf.MarketValue, null) * (float)component.requestCount).ToStringMoney("F0"),
                GenThing.ThingsToCommaList(component.rewards, true, true, -1).CapitalizeFirst(),
                GenThing.GetMarketValue(component.rewards).ToStringMoney("F0"),
                (component.expiration - Find.TickManager.TicksGame).ToStringTicksToDays("F0"),
                CaravanArrivalTimeEstimator.EstimatedTicksToArrive(map.Tile, settlementBase.Tile, null).ToStringTicksToDays("0.#")
            });

            GenThing.TryAppendSingleRewardInfo(ref text, component.rewards);
            Find.LetterStack.ReceiveLetter("LetterLabelCaravanRequest".Translate(), text, LetterDefOf.PositiveEvent, settlementBase, settlementBase.Faction, null);
            return(true);
        }
 public static IEnumerable <FloatMenuOption> GetVisitFloatMenuOptions(
     CompLaunchableSRTS representative,
     IEnumerable <IThingHolder> pods,
     SettlementBase settlement,
     Caravan car)
 {
     return(SRTSArrivalActionUtility.GetFloatMenuOptions <TransportPodsArrivalAction_VisitSettlement>((Func <FloatMenuAcceptanceReport>)(() => TransportPodsArrivalAction_VisitSettlement.CanVisit(pods, settlement)), (Func <TransportPodsArrivalAction_VisitSettlement>)(() => new TransportPodsArrivalAction_VisitSettlement(settlement)), "VisitSettlement".Translate((object)settlement.Label), representative, settlement.Tile, car));
 }
示例#11
0
 private void AddSettlementBaseToKingdom(Kingdom k, SettlementBase b)
 {
     foreach (Vec2i v in b.SettlementChunks)
     {
         TerrainGenerator.ChunkBases[v.x, v.z].SetHasSettlement(true);
     }
     KingdomSettlements[k].Add(b);
 }
示例#12
0
 public SettlementBase AllyOfNearbySettlement(SettlementBase origin)
 => (from settlement in Find.WorldObjects.SettlementBases
         where settlement.Tile != origin.Tile &&
     (settlement.Faction == origin.Faction || settlement.Faction?.GoodwillWith(origin.Faction) >= 0) &&
     settlement.trader.CanTradeNow &&
     Find.WorldGrid.ApproxDistanceInTiles(origin.Tile, settlement.Tile) < 20f &&
     Find.WorldReachability.CanReach(origin.Tile, settlement.Tile)
     select settlement).RandomElement();
示例#13
0
 static bool Prefix(ref FloatMenuAcceptanceReport __result, Caravan caravan, SettlementBase settlement)
 {
     if (settlement is City city && city.Abandoned)
     {
         __result = false;
         return(false);
     }
     return(true);
 }
示例#14
0
        public override void Tick()
        {
            base.Tick();
            SettlementBase colony = Find.WorldObjects.ObjectsAt(worldTileElectedOn).OfType <SettlementBase>().FirstOrDefault();

            if (this.pawn.Dead || !PsychologyBase.ActivateElections() || colony == null || colony.Map.lordManager.lords.Find(l => l.LordJob is LordJob_Joinable_Election) != null)
            {
                this.pawn.health.RemoveHediff(this);
            }
        }
示例#15
0
        private static void WorldReachUtility_PostFix(ref bool __result, Caravan c)
        {
            SettlementBase settlement = CaravanVisitUtility.SettlementVisitedNow(caravan: c);
            WorldObjectComp_SettlementBumperCropComp bumperCropComponent = settlement?.GetComponent <WorldObjectComp_SettlementBumperCropComp>();

            if (bumperCropComponent != null)
            {
                __result = !bumperCropComponent.CaravanIsWorking;
            }
        }
示例#16
0
 public SettlementBase AllyOfNearbySettlement(SettlementBase origin)
 {
     return((from settlement in Find.WorldObjects.SettlementBases
             where settlement.Tile != origin.Tile &&
             (settlement.Faction == origin.Faction || settlement.Faction.GoodwillWith(origin.Faction) >= 0) &&
             settlement.trader.CanTradeNow &&
             Find.WorldGrid.ApproxDistanceInTiles(origin.Tile, settlement.Tile) < 20f &&
             Find.WorldReachability.CanReach(origin.Tile, settlement.Tile)
             select settlement).RandomElement());
     //ByWeight(x => x.Faction.GoodwillWith(origin.Faction)); //tried get relation w/ itself.
 }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map            map            = (Map)parms.target;
            SettlementBase settlementBase = Find.WorldObjects.ObjectsAt(map.Tile).OfType <SettlementBase>().First();
            int            duration       = Mathf.RoundToInt(this.def.durationDays.RandomInRange * GenDate.TicksPerDay);
            GameCondition  cond           = GameConditionMaker.MakeCondition(this.def.gameCondition, duration, 0);

            map.gameConditionManager.RegisterCondition(cond);
            Find.LetterStack.ReceiveLetter("LetterLabelNewElection".Translate(settlementBase.Label), "LetterNewElection".Translate(settlementBase.Label), LetterDefOf.PositiveEvent, new TargetInfo(map.Center, map, false), null);
            return(true);
        }
 public static IEnumerable <FloatMenuOption> GetGIFTFloatMenuOptions(
     CompLaunchableSRTS representative,
     IEnumerable <IThingHolder> pods,
     SettlementBase settlement,
     Caravan car)
 {
     if (settlement.Faction == Faction.OfPlayer)
     {
         return(Enumerable.Empty <FloatMenuOption>());
     }
     return(SRTSArrivalActionUtility.GetFloatMenuOptions <TransportPodsArrivalAction_GiveGift>((Func <FloatMenuAcceptanceReport>)(() => TransportPodsArrivalAction_GiveGift.CanGiveGiftTo(pods, settlement)), (Func <TransportPodsArrivalAction_GiveGift>)(() => new TransportPodsArrivalAction_GiveGift(settlement)), "GiveGiftViaTransportPods".Translate((object)settlement.Faction.Name, (object)FactionGiftUtility.GetGoodwillChange(pods, settlement).ToStringWithSign()), representative, settlement.Tile, car));
 }
示例#19
0
 public static void Prefix(List <ActiveDropPodInfo> pods, SettlementBase giveTo)
 {
     if (Utilities.FactionsWar().GetByFaction(giveTo.Faction) != null)
     {
         float totalValue = 0;
         foreach (ActiveDropPodInfo i in pods)
         {
             foreach (Thing t in i.innerContainer)
             {
                 totalValue += t.MarketValue;
             }
         }
         Utilities.FactionsWar().GetByFaction(giveTo.Faction).resources += totalValue;
     }
 }
示例#20
0
        public override IEnumerable <Gizmo> GetGizmos()
        {
            if (this.IsPlayerControlled)
            {
                Command_Action command_Action = new Command_Action();
                command_Action.defaultLabel = "CommandLaunchShip".Translate();
                command_Action.defaultDesc  = "CommandLaunchShipDesc".Translate();
                command_Action.icon         = DropShipUtility.LaunchSingleCommandTex;
                command_Action.action       = delegate
                {
                    SoundDef.Named("ShipTakeoff_SuborbitalLaunch").PlayOneShotOnCamera();
                    this.ships[0].StartChoosingDestination(false);
                };
                yield return(command_Action);

                if (Find.WorldSelector.SingleSelectedObject == this)
                {
                    yield return(TravelingShipsUtility.ShipTouchdownCommand(this, true));

                    yield return(TravelingShipsUtility.ShipTouchdownCommand(this, false));
                }
                SettlementBase Settlement = CaravanVisitUtility.SettlementVisitedNow(this);
                if (Settlement != null && Settlement.CanTradeNow)
                {
                    yield return(TravelingShipsUtility.TradeCommand(this));
                }
                //if (CaravanJourneyDestinationUtility.AnyJurneyDestinationAt(base.Tile))
                //{
                //    yield return CaravanJourneyDestinationUtility.TakeOffCommand(base.Tile);
                //}

                if (!this.ships.Any(x => x.ParkingMap == null))
                {
                    Command_Action command_Action4 = new Command_Action();
                    command_Action4.defaultLabel = "CommandTravelParkingPosition".Translate();
                    command_Action4.defaultDesc  = "CommandTravelParkingPositionDesc".Translate();
                    command_Action4.icon         = DropShipUtility.ReturnParkingFleet;
                    command_Action4.action       = delegate
                    {
                        foreach (ShipBase ship in this.ships)
                        {
                            ship.TryLaunch(new GlobalTargetInfo(ship.ParkingPosition, ship.ParkingMap), PawnsArrivalModeDefOf.CenterDrop, ShipArrivalAction.EnterMapFriendly, false);
                        }
                    };
                    yield return(command_Action4);
                }
            }
        }
示例#21
0
        protected override bool CanFireNowSub(IncidentParms parms)
        {
            if (!base.CanFireNowSub(parms))
            {
                return(false);
            }
            if (!TryGetRandomAvailableTargetMap(out Map map))
            {
                return(false);
            }
            SettlementBase settlementBase = RandomNearbyTradeableSettlement(map.Tile);

            if (settlementBase == null)
            {
                return(false);
            }
            return(true);
        }
示例#22
0
    private Color GetSettlementColor(SettlementBase set)
    {
        switch (set.SettlementType)
        {
        case SettlementType.CAPITAL:
            return(Color.red);

        case SettlementType.CITY:
            return(Color.yellow);

        case SettlementType.TOWN:
            return(Color.magenta);

        case SettlementType.VILLAGE:
            return(Color.white);
        }
        return(Color.black);
    }
示例#23
0
        public override string GetInspectString()
        {
            StringBuilder stringBuilder = new StringBuilder();

            if (this.NightResting)
            {
                stringBuilder.Append("CaravanResting".Translate());
            }
            else if (this.AllOwnersDowned)
            {
                stringBuilder.Append("AllCaravanMembersDowned".Translate());
            }
            else if (this.pather.Moving)
            {
                if (this.pather.ArrivalAction != null)
                {
                    stringBuilder.Append(this.pather.ArrivalAction.ReportString);
                }
                else
                {
                    stringBuilder.Append("CaravanTraveling".Translate());
                }
            }
            else
            {
                SettlementBase Settlement = CaravanVisitUtility.SettlementVisitedNow(this);
                if (Settlement != null)
                {
                    stringBuilder.Append("CaravanVisiting".Translate(new object[]
                    {
                        Settlement.Label
                    }));
                }
                else
                {
                    stringBuilder.Append("CaravanWaiting".Translate());
                }
            }

            return(stringBuilder.ToString());
        }
示例#24
0
 // Token: 0x060000E6 RID: 230 RVA: 0x000072E0 File Offset: 0x000054E0
 public void GenShockwave(int center, int radius)
 {
     Find.WorldFloodFiller.FloodFill(center, (int tile) => true, delegate(int tile, int dist)
     {
         if (dist > radius + 1)
         {
             return(true);
         }
         if (dist == radius + 1)
         {
             Find.WorldGrid.tiles[tile].biome = BiomeDefOf.Tundra;
             SettlementBase settlementBase    = Find.WorldObjects.SettlementBases.FirstOrDefault((SettlementBase x) => x.Tile == tile);
             if (settlementBase != null)
             {
                 Find.WorldObjects.Remove(settlementBase);
             }
             float value = Rand.Value;
         }
         return(false);
     }, int.MaxValue, null);
 }
示例#25
0
        private static string DestroyOldOutpostAndCreateNewAtSpot(SettlementBase someRandomPreferablyNearbySettlement)
        {
            if (Rand.ChanceSeeded(chance: 0.5f, specialSeed: someRandomPreferablyNearbySettlement.ID))
            {
                Settlement factionBase = (Settlement)WorldObjectMaker.MakeWorldObject(def: WorldObjectDefOf.Settlement);
                factionBase.SetFaction(newFaction: someRandomPreferablyNearbySettlement.Faction.EnemyInFactionWar());
                factionBase.Tile = someRandomPreferablyNearbySettlement.Tile;
                factionBase.Name = SettlementNameGenerator.GenerateSettlementName(factionBase: factionBase);
                Find.WorldObjects.Remove(o: someRandomPreferablyNearbySettlement);
                Find.WorldObjects.Add(o: factionBase);
                return("MFI_FactionWarBaseTakenOver".Translate(someRandomPreferablyNearbySettlement.Faction, someRandomPreferablyNearbySettlement.Faction.EnemyInFactionWar()));
            }
            DestroyedSettlement destroyedSettlement = (DestroyedSettlement)WorldObjectMaker.MakeWorldObject(def: WorldObjectDefOf.DestroyedSettlement);

            destroyedSettlement.Tile = someRandomPreferablyNearbySettlement.Tile;
            Faction loserFaction = someRandomPreferablyNearbySettlement.Faction;

            Find.WorldObjects.Add(o: destroyedSettlement);
            Find.WorldObjects.Remove(o: someRandomPreferablyNearbySettlement);
            return("MFI_FactionWarBaseDestroyed".Translate(loserFaction, loserFaction.EnemyInFactionWar()));
        }
示例#26
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            if (!TryGetRandomAvailableTargetMap(map: out Map map))
            {
                return(false);
            }
            SettlementBase settlement = RandomNearbyTradeableSettlement(originTile: map.Tile);

            if (settlement != null)
            {
                //TODO: look into making the below dynamic based on requester's biome, faction, pirate outpost vicinity and other stuff.
                ThingCategoryDef thingCategoryDef = DetermineThingCategoryDef();

                string letterToSend  = DetermineLetterToSend(thingCategoryDef: thingCategoryDef);
                int    feeRequest    = Math.Max(val1: Rand.Range(min: 150, max: 300), val2: (int)parms.points);
                string categorylabel = (thingCategoryDef == ThingCategoryDefOf.PlantFoodRaw) ? thingCategoryDef.label + " items" : thingCategoryDef.label;
                ChoiceLetter_ReverseTradeRequest choiceLetterReverseTradeRequest = (ChoiceLetter_ReverseTradeRequest)LetterMaker.MakeLetter(label: this.def.letterLabel, text: letterToSend.Translate(
                                                                                                                                                settlement.Faction.leader.LabelShort,
                                                                                                                                                settlement.Faction.def.leaderTitle,
                                                                                                                                                settlement.Faction.Name,
                                                                                                                                                settlement.Label,
                                                                                                                                                categorylabel,
                                                                                                                                                feeRequest
                                                                                                                                                ).AdjustedFor(p: settlement.Faction.leader), def: this.def.letterDef);

                choiceLetterReverseTradeRequest.title            = "MFI_ReverseTradeRequestTitle".Translate(map.info.parent.Label).CapitalizeFirst();
                choiceLetterReverseTradeRequest.thingCategoryDef = thingCategoryDef;
                choiceLetterReverseTradeRequest.map = map;
                parms.target = map;
                choiceLetterReverseTradeRequest.incidentParms = parms;
                choiceLetterReverseTradeRequest.faction       = settlement.Faction;
                choiceLetterReverseTradeRequest.fee           = feeRequest;
                choiceLetterReverseTradeRequest.StartTimeout(duration: TimeoutTicks);
                choiceLetterReverseTradeRequest.tile = settlement.Tile;
                Find.LetterStack.ReceiveLetter(let: choiceLetterReverseTradeRequest);
                Find.World.GetComponent <WorldComponent_OutpostGrower>().Registerletter(choiceLetterReverseTradeRequest);
                return(true);
            }
            return(false);
        }
示例#27
0
        public static IEnumerable <FloatMenuOption> GetSettle(SettlementBase bs, IEnumerable <IThingHolder> pods, CompLaunchableHelicopter representative, Caravan car)
        {
            foreach (FloatMenuOption o in GetMapParent(bs, pods, representative, car))
            {
                yield return(o);
            }

            foreach (FloatMenuOption f in HelicoptersArrivalActionUtility.GetVisitFloatMenuOptions(representative, pods, bs, car))
            {
                yield return(f);
            }

            foreach (FloatMenuOption f2 in HelicoptersArrivalActionUtility.GetGIFTFloatMenuOptions(representative, pods, bs, car))
            {
                yield return(f2);
            }
            foreach (FloatMenuOption f3 in HelicoptersArrivalActionUtility.GetATKFloatMenuOptions(representative, pods, bs, car))
            {
                yield return(f3);
            }
            yield break;
        }
示例#28
0
        public static IEnumerable <FloatMenuOption> GetSettle(
            SettlementBase bs,
            IEnumerable <IThingHolder> pods,
            CompLaunchableSRTS representative,
            Caravan car)
        {
            foreach (FloatMenuOption floatMenuOption in SRTSStatic.GetMapParent((MapParent)bs, pods, representative, car))
            {
                FloatMenuOption o = floatMenuOption;
                yield return(o);

                o = (FloatMenuOption)null;
            }
            foreach (FloatMenuOption visitFloatMenuOption in SRTSArrivalActionUtility.GetVisitFloatMenuOptions(representative, pods, bs, car))
            {
                FloatMenuOption f = visitFloatMenuOption;
                yield return(f);

                f = (FloatMenuOption)null;
            }
            /*Uncomment to allow gifting of Ship and contents to faction -SmashPhil*/

            /*foreach (FloatMenuOption giftFloatMenuOption in SRTSArrivalActionUtility.GetGIFTFloatMenuOptions(representative, pods, bs, car))
             * {
             * FloatMenuOption f2 = giftFloatMenuOption;
             * yield return f2;
             * f2 = (FloatMenuOption) null;
             * }*/
            foreach (FloatMenuOption atkFloatMenuOption in SRTSArrivalActionUtility.GetATKFloatMenuOptions(representative, pods, bs, car))
            {
                FloatMenuOption f3 = atkFloatMenuOption;
                yield return(f3);

                f3 = (FloatMenuOption)null;
            }
        }
示例#29
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            if (!TryGetRandomAvailableTargetMap(out map))
            {
                return(false);
            }

            SettlementBase settlementBase = RandomNearbyTradeableSettlement(map.Tile);

            if (settlementBase == null)
            {
                return(false);
            }

            int destination = Rand.Chance(directConnectionChance) ? map.Tile : AllyOfNearbySettlement(settlementBase)?.Tile ?? map.Tile;

            int maxPriority = settlementBase.Faction.def.techLevel >= TechLevel.Medieval ? 30 : 20;

            RoadDef roadToBuild = DefDatabase <RoadDef> .AllDefsListForReading.Where(x => x.priority <= maxPriority).RandomElement();

            WorldPath path = WorldPath.NotFound;
            //StringBuilder stringBuilder = new StringBuilder();

            int    cost2       = 12000;
            int    timeToBuild = 0;
            string letterTitle = "MFI_RoadWorks".Translate();
            List <WorldObject_RoadConstruction> list = new List <WorldObject_RoadConstruction>();

            using (path = Find.WorldPathFinder.FindPath(destination, settlementBase.Tile, null))
            {
                if (path != null && path != WorldPath.NotFound)
                {
                    float roadCount = path.NodesReversed.Count(x => !Find.WorldGrid[x].Roads.NullOrEmpty() &&
                                                               Find.WorldGrid[x].Roads.Any(roadLink => roadLink.road.priority >= roadToBuild.priority) ||
                                                               Find.WorldObjects.AnyWorldObjectOfDefAt(MFI_DefOf.MFI_RoadUnderConstruction, x));

                    if (roadCount / path.NodesReversed.Count >= maxRoadCoverage)
                    {
                        Log.Message($"MFI :: too many roads leading from {(Find.WorldObjects.AnyWorldObjectAt(destination) ? Find.WorldObjects.ObjectsAt(destination).FirstOrDefault()?.Label : destination.ToString())} to {settlementBase} for road project");
                        return(false);
                    }
                    //stringBuilder.Append($"Path found from {settlementBase.Label} to {map.info.parent.Label}. Length = {path.NodesReversed.Count} ");
                    //not 0 and - 1
                    for (int i = 1; i < path.NodesReversed.Count - 1; i++)
                    {
                        cost2 += Caravan_PathFollower.CostToMove(CaravanTicksPerMoveUtility.DefaultTicksPerMove, path.NodesReversed[i], path.NodesReversed[i + 1]);

                        timeToBuild += (int)(2 * GenDate.TicksPerHour
                                             * WorldPathGrid.CalculatedMovementDifficultyAt(path.NodesReversed[i], true)
                                             * Find.WorldGrid.GetRoadMovementDifficultyMultiplier(i, i + 1));

                        if (!Find.WorldGrid[path.NodesReversed[i]].Roads.NullOrEmpty() &&
                            Find.WorldGrid[path.NodesReversed[i]].Roads.Any(roadLink => roadLink.road.priority >= roadToBuild.priority))
                        {
                            timeToBuild = timeToBuild / 2;
                        }

                        WorldObject_RoadConstruction roadConstruction = (WorldObject_RoadConstruction)WorldObjectMaker.MakeWorldObject(MFI_DefOf.MFI_RoadUnderConstruction);
                        roadConstruction.Tile     = path.NodesReversed[i];
                        roadConstruction.nextTile = path.NodesReversed[i + 1];
                        roadConstruction.road     = roadToBuild;
                        roadConstruction.SetFaction(settlementBase.Faction);
                        roadConstruction.projectedTimeOfCompletion = Find.TickManager.TicksGame + timeToBuild;
                        list.Add(roadConstruction);
                    }
                    cost2 = cost2 / 10;
                    DiaNode   node   = new DiaNode("MFI_RoadWorksDialogue".Translate(settlementBase, path.NodesReversed.Count, cost2)); // {settlementBase} wants {cost2 / 10} to build a road of {path.NodesReversed.Count}");
                    DiaOption accept = new DiaOption("OK".Translate())
                    {
                        resolveTree = true,
                        action      = () =>
                        {
                            TradeUtility.LaunchSilver(TradeUtility.PlayerHomeMapWithMostLaunchableSilver(), cost2);
                            foreach (WorldObject_RoadConstruction worldObjectRoadConstruction in list)
                            {
                                Find.WorldObjects.Add(worldObjectRoadConstruction);
                            }
                            list.Clear();
                        }
                    };

                    if (!TradeUtility.ColonyHasEnoughSilver(TradeUtility.PlayerHomeMapWithMostLaunchableSilver(), cost2))
                    {
                        accept.Disable("NeedSilverLaunchable".Translate(cost2));
                    }
                    DiaOption reject = new DiaOption("RejectLetter".Translate())
                    {
                        resolveTree = true,
                        action      = () =>
                        {
                            for (int i = list.Count - 1; i >= 0; i--)
                            {
                                list[i] = null;
                            }
                            list.Clear();
                        }
                    };

                    node.options.Add(accept);
                    node.options.Add(reject);

                    //Log.Message(stringBuilder.ToString());
                    Find.WindowStack.Add(new Dialog_NodeTreeWithFactionInfo(node, settlementBase.Faction));
                    Find.Archive.Add(new ArchivedDialog(node.text, letterTitle, settlementBase.Faction));
                }
            }
            return(true);
        }
 public void GivenAVillageOwnerByTheGivenPlayer()
 {
     _settlement = new Village(_player);
 }