예제 #1
0
        private void GeneratePawns(Map map, float points)
        {
            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms
            {
                faction = Faction,
                points  = points,
                generateFightersOnly = true,
                groupKind            = PawnGroupKindDefOf.Combat,
                raidStrategy         = RaidStrategyDefOf.ImmediateAttack,
                forceOneIncap        = true
            };

            var pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList();

            foreach (var pawn in pawns)
            {
                if (CellFinder.TryFindRandomCellNear(map.Center, map, 15, (IntVec3 x) => x.Standable(map) && !x.Fogged(map), out IntVec3 loc))
                {
                    GenSpawn.Spawn(pawn, loc, map, Rot4.Random);
                }
            }

            LordJob_AssaultColony lordJob_AssaultColony = new LordJob_AssaultColony(Faction);
            Lord lord = LordMaker.MakeNewLord(Faction, lordJob_AssaultColony, map, pawns);
        }
예제 #2
0
        protected override void RunInt()
        {
            Slate slate = QuestGen.slate;
            Map   map   = slate.Get <Map>("map");
            QuestPart_ThreatsGenerator questPart_ThreatsGenerator = new QuestPart_ThreatsGenerator();

            questPart_ThreatsGenerator.threatStartTicks = threatStartTicks.GetValue(slate);
            questPart_ThreatsGenerator.inSignalEnable   = (QuestGenUtility.HardcodedSignalWithQuestID(inSignalEnable.GetValue(slate)) ?? slate.Get <string>("inSignal"));
            questPart_ThreatsGenerator.inSignalDisable  = QuestGenUtility.HardcodedSignalWithQuestID(inSignalDisable.GetValue(slate));
            ThreatsGeneratorParams value = parms.GetValue(slate);

            value.faction = (faction.GetValue(slate) ?? value.faction);
            questPart_ThreatsGenerator.parms     = value;
            questPart_ThreatsGenerator.mapParent = map.Parent;
            QuestGen.quest.AddPart(questPart_ThreatsGenerator);
            if (!storeThreatExampleAs.GetValue(slate).NullOrEmpty())
            {
                PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms();
                pawnGroupMakerParms.groupKind    = PawnGroupKindDefOf.Combat;
                pawnGroupMakerParms.raidStrategy = RaidStrategyDefOf.ImmediateAttack;
                pawnGroupMakerParms.faction      = (value.faction ?? (from x in Find.FactionManager.GetFactions(allowHidden: false, allowDefeated: false, allowNonHumanlike: true, TechLevel.Industrial)
                                                                      where x.HostileTo(Faction.OfPlayer)
                                                                      select x).RandomElement());
                float num = value.threatPoints ?? (StorytellerUtility.DefaultThreatPointsNow(map) * value.currentThreatPointsFactor);
                if (value.minThreatPoints.HasValue)
                {
                    num = Mathf.Max(num, value.minThreatPoints.Value);
                }
                pawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(num, PawnsArrivalModeDefOf.EdgeWalkIn, RaidStrategyDefOf.ImmediateAttack, pawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
                IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(pawnGroupMakerParms);
                slate.Set(storeThreatExampleAs.GetValue(slate), PawnUtility.PawnKindsToLineList(pawnKinds, "  - "));
            }
        }
        private void GeneratePawns(Map map, float points)
        {
            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms
            {
                faction = Faction,
                points  = points,
                generateFightersOnly = true,
                groupKind            = PawnGroupKindDefOf.Combat,
                raidStrategy         = RaidStrategyDefOf.ImmediateAttack,
                forceOneIncap        = true
            };

            var pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList();

            GenerateItems();
            foreach (var carrier in GenerateCarriers())
            {
                pawns.Add(carrier);
            }

            IncidentParms parms = new IncidentParms
            {
                target      = map,
                spawnCenter = CellFinder.RandomClosewalkCellNear(map.Center, map, 15, x => x.Walkable(map) && !x.Fogged(map))
            };

            foreach (var pawn in pawns)
            {
                IntVec3 loc = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8);
                GenSpawn.Spawn(pawn, loc, map, parms.spawnRotation);
            }

            LordJob_DefendBase lordJob = new LordJob_DefendBase(Faction, parms.spawnCenter);
            Lord lord = LordMaker.MakeNewLord(Faction, lordJob, map, pawns);
        }
        protected virtual IEnumerable <Pawn> GenerateNewPawns(IncidentParms parms, int preferredAmount)
        {
            int i = 0;

            while (i < preferredAmount)
            {
                var newPawns = PawnGroupMakerUtility.GeneratePawns(IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDef, parms, true), false).ToArray();
                Log.Message($"Created {newPawns.Length} new pawns for {parms.faction.Name}.");
                foreach (var pawn in newPawns)
                {
                    Find.World.worldPawns.PassToWorld(pawn);
                }

                foreach (var pawn in newPawns.RandomlyUsingTitleAsChance())
                {
                    yield return(pawn);

                    i++;
                    if (i >= preferredAmount)
                    {
                        yield break;
                    }
                }

                // To avoid infinite loop
                if (!newPawns.Any())
                {
                    i++;
                }
            }
        }
 private void Outcome_Disaster(Caravan caravan)
 {
     LongEventHandler.QueueLongEvent(delegate()
     {
         FactionRelationKind playerRelationKind = this.Faction.PlayerRelationKind;
         int randomInRange = DiplomacyTuning.Goodwill_PeaceTalksDisasterRange.RandomInRange;
         this.Faction.TryAffectGoodwillWith(Faction.OfPlayer, randomInRange, false, false, null, null);
         this.Faction.TrySetRelationKind(Faction.OfPlayer, FactionRelationKind.Hostile, false, null, null);
         IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, caravan);
         incidentParms.faction       = this.Faction;
         PawnGroupMakerParms defaultPawnGroupMakerParms  = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms, true);
         defaultPawnGroupMakerParms.generateFightersOnly = true;
         List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();
         Map map          = CaravanIncidentUtility.SetupCaravanAttackMap(caravan, list, false);
         if (list.Any <Pawn>())
         {
             LordMaker.MakeNewLord(incidentParms.faction, new LordJob_AssaultColony(this.Faction, true, true, false, false, true), map, list);
         }
         Find.TickManager.Notify_GeneratedPotentiallyHostileMap();
         GlobalTargetInfo target = (!list.Any <Pawn>()) ? GlobalTargetInfo.Invalid : new GlobalTargetInfo(list[0].Position, map, false);
         string label            = "LetterLabelPeaceTalks_Disaster".Translate();
         string letterText       = this.GetLetterText("LetterPeaceTalks_Disaster".Translate(new object[]
         {
             this.Faction.def.pawnsPlural.CapitalizeFirst(),
             this.Faction.Name,
             Mathf.RoundToInt((float)randomInRange)
         }), caravan, playerRelationKind);
         PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref label, ref letterText, "LetterRelatedPawnsGroupGeneric".Translate(new object[]
         {
             Faction.OfPlayer.def.pawnsPlural
         }), true, true);
         Find.LetterStack.ReceiveLetter(label, letterText, LetterDefOf.ThreatBig, target, this.Faction, null);
     }, "GeneratingMapForNewEncounter", false, null);
 }
        private IEnumerable <Pawn> GeneratePawns(Map map, Faction faction, GenStepParams parms)
        {
            float p;

            if (parms.sitePart?.parms != null && parms.sitePart.parms.threatPoints >= defaultPointsRange.min && parms.sitePart.parms.threatPoints <= defaultPointsRange.max)
            {
                p = parms.sitePart.parms.threatPoints;
                KLog.Message($"Using sitePart parms threat points: {p}");
            }
            else
            {
                p = defaultPointsRange.RandomInRange;
                KLog.Message($"Using in-range threat points: {p}. Choosen from {defaultPointsRange}");
            }
            p = Math.Max(p, 150) * pointMultiplier;
            KLog.Message($"Final threat points: {p}");

            return(PawnGroupMakerUtility.GeneratePawns(new PawnGroupMakerParms
            {
                groupKind = PawnGroupKindDefOf.Combat,
                tile = map.Tile,
                faction = faction,
                points = p
            }, true));
        }
예제 #7
0
        public void SendRaid()
        {
            if (!TryFindSpawnSpot(Map, out IntVec3 spawnSpot))
            {
                return;
            }

            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms
            {
                faction = Faction,
                points  = Rand.Range(1800, 2400),
                generateFightersOnly = true,
                groupKind            = PawnGroupKindDefOf.Combat,
                raidStrategy         = RaidStrategyDefOf.ImmediateAttack
            };

            LordJob lordJob = new LordJob_AssaultColony(Faction, canKidnap: false, canTimeoutOrFlee: false, canSteal: false);
            Lord    lord    = LordMaker.MakeNewLord(Faction, lordJob, Map);

            lord.numPawnsLostViolently = int.MaxValue;

            IEnumerable <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms);

            foreach (var p in pawns)
            {
                GenSpawn.Spawn(p, spawnSpot, Map);

                lord.AddPawn(p);
            }

            Find.LetterStack.ReceiveLetter("DoomsdayContrAttackTitle".Translate(), "DoomsdayContrAttack".Translate(), LetterDefOf.ThreatBig);

            RaidSent = true;
        }
예제 #8
0
        protected void TreasureWithHumanAmbush(Caravan caravan)
        {
            List <Thing> rewardList = GenerateReward();

            for (int i = 0; i < rewardList.Count; i++)
            {
                caravan.AddPawnOrItem(rewardList[i], true);
            }
            LongEventHandler.QueueLongEvent(delegate
            {
                IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, caravan);
                //make sure a minimum point threshold is hit
                if (incidentParms.points < MinimumPointThreshold)
                {
                    incidentParms.points = MinimumPointThreshold + 100f;
                }
                incidentParms.faction = Find.FactionManager.RandomEnemyFaction();
                PawnGroupMakerParms defaultPawnGroupMakerParms  = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms, true);
                defaultPawnGroupMakerParms.generateFightersOnly = true;
                List <Pawn> pawnList = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();
                Map map = CaravanIncidentUtility.SetupCaravanAttackMap(caravan, pawnList, false);
                if (pawnList.Any <Pawn>())
                {
                    LordMaker.MakeNewLord(incidentParms.faction, new LordJob_AssaultColony(incidentParms.faction, true, true, false, false, true), map, pawnList);
                }
                Find.TickManager.CurTimeSpeed = TimeSpeed.Paused;
                GlobalTargetInfo lookTarget   = (!pawnList.Any <Pawn>()) ? GlobalTargetInfo.Invalid : new GlobalTargetInfo(pawnList[0].Position, map, false);
                Find.LetterStack.ReceiveLetter("LetterLabelTreasureAmbushLGE".Translate(), "LetterTreasureAmbushLGE".Translate(GenThing.GetMarketValue(rewardList).ToStringMoney(null), GenLabel.ThingsLabel(rewardList, string.Empty)), LetterDefOf.ThreatBig, lookTarget, null);
            }, "GeneratingMapForNewEncounter", false, null);
        }
예제 #9
0
        public static List <Pawn> GenerateRaidPawns(IncidentParms parms)
        {
            if (PES_Settings.DebugModeOn)
            {
                Log.Message("-=PS=- GenerateRaidPawns Start", false);
            }
            if (parms != null && parms.questTag != null)             //Lt. Bob - "Temporary" bypass fix? for Quest handling
            {
                Log.Message("-=PS=- GenerateRaidPawns - questTag!=Null == " + parms.questTag);
            }

            IsIntercepting_PawnGeneration = GeneratorPatchFlag.Generate;

            PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;

            parms.points = IncidentWorker_Raid.AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat);
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms, false);
            List <Pawn>         list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();

            if (list.Count == 0)
            {
                Log.Error("Got no pawns spawning raid from parms " + parms, false);
            }
            return(list);
        }
예제 #10
0
 private void Outcome_Disaster(Caravan caravan)
 {
     LongEventHandler.QueueLongEvent(delegate
     {
         int randomInRange = WorldObject_ResearchRequestLGE.DisasterFactionRelationOffset.RandomInRange;
         this.Faction.TryAffectGoodwillWith(Faction.OfPlayer, randomInRange, false, false, null, null);
         if (!this.Faction.HostileTo(Faction.OfPlayer))
         {
             this.Faction.TrySetRelationKind(Faction.OfPlayer, FactionRelationKind.Hostile, false, null, null);
         }
         IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, caravan);
         incidentParms.faction       = this.Faction;
         PawnGroupMakerParms defaultPawnGroupMakerParms  = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms, true);
         defaultPawnGroupMakerParms.generateFightersOnly = true;
         List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();
         Map map          = CaravanIncidentUtility.SetupCaravanAttackMap(caravan, list, false);
         if (list.Any <Pawn>())
         {
             LordMaker.MakeNewLord(incidentParms.faction, new LordJob_AssaultColony(this.Faction, true, true, false, false, true), map, list);
         }
         Find.TickManager.CurTimeSpeed = TimeSpeed.Paused;
         GlobalTargetInfo lookTarget   = (!list.Any <Pawn>()) ? GlobalTargetInfo.Invalid : new GlobalTargetInfo(list[0].Position, map, false);
         Find.LetterStack.ReceiveLetter("LetterLabelResearchRequest_DisasterLGE".Translate(), this.GetLetterText("LetterResearchRequest_DisasterLGE".Translate(this.Faction.def.pawnsPlural.CapitalizeFirst(),
                                                                                                                                                               this.Faction.Name,
                                                                                                                                                               Mathf.RoundToInt(randomInRange)), caravan), LetterDefOf.ThreatBig, lookTarget, null);
     }, "GeneratingMapForNewEncounter", false, null);
 }
        private void SpawnCaravan()
        {
            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms
            {
                faction   = faction,
                groupKind = PawnGroupKindDefOf.Combat,
                points    = Rand.Range(200, 500),
            };
            List <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList();

            if (CellFinder.TryFindRandomEdgeCellWith((IntVec3 c) => !c.Roofed(map) && c.Walkable(map) && c.Standable(map), map, 0f, out IntVec3 pos))
            {
                foreach (var pawn in pawns)
                {
                    GenSpawn.Spawn(pawn, pos, map);
                }
            }

            Pawn p = pawns.RandomElement();

            foreach (var item in ContainedItems)
            {
                p.inventory.innerContainer.TryAdd(item);
            }

            Find.LetterStack.ReceiveLetter("AssistCaravan_GifterArrivedTitle".Translate(), "AssistCaravan_GifterArrived".Translate(), LetterDefOf.PositiveEvent, new LookTargets(pawns[0]));

            RCellFinder.TryFindRandomSpotJustOutsideColony(pawns[0], out IntVec3 result);

            LordJob_CaravanBringItems lordJob = new LordJob_CaravanBringItems(result, p);
            Lord lord = LordMaker.MakeNewLord(faction, lordJob, map, pawns);

            QuestsManager.Communications.RemoveComponent(this);
        }
        public override void Generate(Map map, GenStepParams parms)
        {
            IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatSmall, map);

            incidentParms.faction = Find.FactionManager.AllFactionsListForReading.FindAll(f => (f.def == VFEV_DefOf.VFEV_VikingsClan || f.def == VFEV_DefOf.VFEV_VikingsSlaver) && f.HostileTo(Faction.OfPlayer))?.RandomElement();            /*parms.sitePart.site.Faction;*/
            if (incidentParms.faction == null)
            {
                incidentParms.faction = Faction.OfMechanoids;
            }

            incidentParms.points = Mathf.Max(incidentParms.points * 0.5f, incidentParms.faction.def.MinPointsToGeneratePawnGroup(PawnGroupKindDefOf.Combat));

            List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms, false), true).ToList();

            if (list.Count > 0)
            {
                foreach (Pawn pawn in list)
                {
                    IntVec3 result = new IntVec3();
                    CellFinder.TryFindRandomCellNear(map.Center, map, 10, c => c.Walkable(map), out result);
                    GenSpawn.Spawn(pawn, result, map);
                }
            }
            MapGenerator.SetVar("RectOfInterest", CellRect.CenteredOn(map.Center, 1, 1));

            if (incidentParms.faction == Faction.OfMechanoids)
            {
                LordMaker.MakeNewLord(incidentParms.faction, new LordJob_DefendPoint(map.Center, 10, addFleeToil: false), map, list);
            }
            else
            {
                LordMaker.MakeNewLord(incidentParms.faction, new LordJob_DefendBase(incidentParms.faction, map.Center), map, list);
            }
        }
        private void CaravanDelivery()
        {
            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms
            {
                faction   = SignedFaction.Faction,
                groupKind = PawnGroupKindDefOf.Trader,
                points    = Rand.Range(300, 1000),
                tile      = Settlement.Tile
            };

            Caravan = CaravanAIMaker.MakeCaravan(PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms), SignedFaction.Faction, Settlement.Tile, true, CaravanAIMaker.GetCaravanColor(SignedFaction.Faction, Faction.OfPlayer), true, true);
            TryGetRandomPawnGroupMaker(pawnGroupMakerParms, out PawnGroupMaker maker);

            foreach (var p in Caravan.PawnsListForReading)
            {
                p.inventory.innerContainer.Clear();
            }

            GenerateCarriers(pawnGroupMakerParms, maker, Items, Caravan);

            Items.ForEach(item =>
            {
                if (item is Pawn p)
                {
                    Find.WorldPawns.PassToWorld(p);
                    Caravan.AddPawn(p, false);
                }
            });
            Items.Clear();

            Caravan.pather.StartPath(DestinationMap.Tile, new CaravanArrivalAction_AIEnterCaravan(DestinationMap.Parent));

            Find.LetterStack.ReceiveLetter("TradeSchedulingAgreementComp_CaravanFormedTitle".Translate(), "TradeSchedulingAgreementComp_CaravanFormedDesc".Translate(), LetterDefOf.PositiveEvent, new LookTargets(Caravan));
        }
        protected override bool TryResolveRaidFaction(IncidentParms parms)
        {
            var map = (Map)parms.target;

            if (parms.faction != null)
            {
                return(true);
            }

            float num = parms.points;

            if (num <= 0f)
            {
                num = 999999f;
            }

            return(PawnGroupMakerUtility.TryGetRandomFactionForCombatPawnGroup(
                       points: num,
                       faction: out parms.faction,
                       validator: f => FactionCanBeGroupSource(f: f, map: map, desperate: false),
                       allowNonHostileToPlayer: false,
                       allowHidden: true,
                       allowDefeated: true,
                       allowNonHumanlike: false
                       ) ||
                   PawnGroupMakerUtility.TryGetRandomFactionForCombatPawnGroup(
                       points: num,
                       faction: out parms.faction,
                       validator: f => FactionCanBeGroupSource(f: f, map: map, desperate: true),
                       allowNonHostileToPlayer: false,
                       allowHidden: true,
                       allowDefeated: true,
                       allowNonHumanlike: false
                       ));
        }
예제 #15
0
 private void Outcome_Disaster(Caravan caravan)
 {
     LongEventHandler.QueueLongEvent(delegate
     {
         FactionRelationKind playerRelationKind = base.Faction.PlayerRelationKind;
         int randomInRange = DiplomacyTuning.Goodwill_PeaceTalksDisasterRange.RandomInRange;
         base.Faction.TryAffectGoodwillWith(Faction.OfPlayer, randomInRange, canSendMessage: false, canSendHostilityLetter: false);
         base.Faction.TrySetRelationKind(Faction.OfPlayer, FactionRelationKind.Hostile, canSendLetter: false);
         IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, caravan);
         incidentParms.faction       = base.Faction;
         PawnGroupMakerParms defaultPawnGroupMakerParms  = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms, ensureCanGenerateAtLeastOnePawn: true);
         defaultPawnGroupMakerParms.generateFightersOnly = true;
         List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms).ToList();
         Map map          = CaravanIncidentUtility.SetupCaravanAttackMap(caravan, list, sendLetterIfRelatedPawns: false);
         if (list.Any())
         {
             LordMaker.MakeNewLord(incidentParms.faction, new LordJob_AssaultColony(base.Faction), map, list);
         }
         Find.TickManager.Notify_GeneratedPotentiallyHostileMap();
         GlobalTargetInfo target  = (list.Any() ? new GlobalTargetInfo(list[0].Position, map) : GlobalTargetInfo.Invalid);
         TaggedString letterLabel = "LetterLabelPeaceTalks_Disaster".Translate();
         TaggedString letterText  = GetLetterText("LetterPeaceTalks_Disaster".Translate(base.Faction.def.pawnsPlural.CapitalizeFirst(), base.Faction.NameColored, Mathf.RoundToInt(randomInRange)), caravan, playerRelationKind);
         PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, "LetterRelatedPawnsGroupGeneric".Translate(Faction.OfPlayer.def.pawnsPlural), informEvenIfSeenBefore: true);
         Find.LetterStack.ReceiveLetter(letterLabel, letterText, LetterDefOf.ThreatBig, target, base.Faction);
     }, "GeneratingMapForNewEncounter", doAsynchronously: false, null);
 }
        private void GenerateAndSpawnPawns(Faction faction, IncidentParms parms, IntVec3 spot)
        {
            Map map = (Map)parms.target;

            LordJob lordJob = new LordJob_AssaultColony(faction, canKidnap: true, canTimeoutOrFlee: false, true);
            Lord    lord    = LordMaker.MakeNewLord(faction, lordJob, map);

            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms
            {
                faction = faction,
                points  = Mathf.Clamp(parms.points / 2, 0, parms.points),
                generateFightersOnly = true,
                groupKind            = PawnGroupKindDefOf.Combat,
                raidStrategy         = RaidStrategyDefOf.ImmediateAttack,
                forceOneIncap        = true
            };

            IEnumerable <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms);

            foreach (var pawn in pawns)
            {
                IntVec3 loc = CellFinder.RandomSpawnCellForPawnNear(spot, map);
                GenSpawn.Spawn(pawn, loc, map, Rot4.Random);
                lord.AddPawn(pawn);
            }
        }
예제 #17
0
        public static IEnumerable <Pawn> MountAnimals(PawnGroupMakerParms groupParms, bool warnOnZeroResults, IncidentParms parms)
        {
            List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(groupParms, true).ToList();

            if (list.Count == 0)
            {
                return(list);
            }
            parms.raidArrivalMode.Worker.Arrive(list, parms);
            if (!(parms.raidArrivalMode == null || parms.raidArrivalMode == PawnsArrivalModeDefOf.EdgeWalkIn) || (parms.raidStrategy != null && parms.raidStrategy.workerClass == typeof(RaidStrategyWorker_Siege)))
            {
                return(list);
            }
            NPCMountUtility.generateMounts(ref list, parms, Base.inBiomeWeight, Base.outBiomeWeight, Base.nonWildWeight, Base.enemyMountChance, Base.enemyMountChanceTribal);

            foreach (Pawn pawn in list)
            {
                if (pawn.equipment == null)
                {
                    pawn.equipment = new Pawn_EquipmentTracker(pawn);
                }
            }
            foreach (Pawn pawn in list)//Moved this code here so we can check if the pawn actually has apparel.
            {
                if (pawn.apparel != null && pawn.apparel.WornApparel != null && pawn.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt))
                {
                    LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical);
                    break;
                }
            }
            return(list);
        }
        public override void Generate(Map map, GenStepParams parms)
        {
            IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatSmall, map);

            incidentParms.faction = parms.sitePart.site.Faction;
            if (incidentParms.faction == null)
            {
                incidentParms.faction = Faction.OfMechanoids;
            }
            incidentParms.points = parms.sitePart.parms.threatPoints;

            List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms, false), true).ToList <Pawn>();

            if (list.Count > 0)
            {
                foreach (Pawn pawn in list)
                {
                    IntVec3 result = new IntVec3();
                    CellFinder.TryFindRandomCellNear(map.Center, map, 10, c => c.Walkable(map), out result);
                    GenSpawn.Spawn(pawn, result, map);
                }
            }
            MapGenerator.SetVar <CellRect>("RectOfInterest", CellRect.CenteredOn(map.Center, 1, 1));
            LordMaker.MakeNewLord(incidentParms.faction, new LordJob_DefendBase(incidentParms.faction, map.Center), map, list);
        }
        public override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;
            List <TargetInfo> list        = new List <TargetInfo>();
            ThingDef          shipPartDef = def.mechClusterBuilding;
            IntVec3           intVec      = FindDropPodLocation(map, (IntVec3 spot) => CanPlaceAt(spot));

            if (intVec == IntVec3.Invalid)
            {
                return(false);
            }
            float    points = Mathf.Max(parms.points * 0.9f, 300f);
            Thing    thing  = ThingMaker.MakeThing(shipPartDef);
            Building building_CrashedShipPart = (Building)thing;
            CompPawnSpawnerOnDamaged damaged  = building_CrashedShipPart.TryGetCompFast <CompPawnSpawnerOnDamaged>();

            thing.SetFaction(faction, null);
            List <Pawn> list2 = PawnGroupMakerUtility.GeneratePawns(new PawnGroupMakerParms
            {
                groupKind = PawnGroupKindDefOf.Combat,
                tile      = map.Tile,
                faction   = faction,
                points    = points
            }).ToList();

            LordMaker.MakeNewLord(faction, new LordJob_SleepThenMechanoidsDefend(new List <Thing>
            {
                thing
            }, faction, 28f, intVec, canAssaultColony: false, isMechCluster: false), map, list2);
            DropPodUtility.DropThingsNear(intVec, map, list2.Cast <Thing>());
            foreach (Pawn item in list2)
            {
                item.TryGetCompFast <CompCanBeDormant>()?.ToSleep();
            }
            list.AddRange(list2.Select((Pawn p) => new TargetInfo(p)));
            GenSpawn.Spawn(SkyfallerMaker.MakeSkyfaller(ThingDefOf.CrashedShipPartIncoming, thing), intVec, map);
            list.Add(new TargetInfo(intVec, map));
            SendStandardLetter(parms, list);
            return(true);

            bool CanPlaceAt(IntVec3 loc)
            {
                CellRect cellRect = GenAdj.OccupiedRect(loc, Rot4.North, shipPartDef.Size);

                if (loc.Fogged(map) || !cellRect.InBounds(map))
                {
                    return(false);
                }
                foreach (IntVec3 item2 in cellRect)
                {
                    RoofDef roof = item2.GetRoof(map);
                    if (roof != null && roof.isNatural)
                    {
                        return(false);
                    }
                }
                return(GenConstruct.CanBuildOnTerrain(shipPartDef, loc, map, Rot4.North));
            }
        }
 protected virtual IEnumerable <Pawn> SpawnPawns(PawnGroupMakerParms pawnGroupMakerParms, IntVec3 spawnCenter, Map map)
 {
     foreach (Pawn retrieverPawn in PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms))
     {
         GenSpawn.Spawn(retrieverPawn, CellFinder.RandomClosewalkCellNear(spawnCenter, map, 5), map);
         yield return(retrieverPawn);
     }
 }
        protected override List <Pawn> GeneratePawns(IncidentParms parms)
        {
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms);

            defaultPawnGroupMakerParms.generateFightersOnly            = true;
            defaultPawnGroupMakerParms.dontUseSingleUseRocketLaunchers = true;
            return(PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms).ToList());
        }
예제 #22
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            parms.raidStrategy.Worker.TryGenerateThreats(parms);
            if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms))
            {
                return(false);
            }

            float       points = parms.points;
            List <Pawn> list   = parms.raidStrategy.Worker.SpawnThreats(parms);

            if (list == null)
            {
                list = PawnGroupMakerUtility.GeneratePawns(IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms)).ToList();
                if (list.Count == 0)
                {
                    Log.Error("Got no pawns spawning raid from parms " + parms);
                    return(false);
                }
                parms.raidArrivalMode.Worker.Arrive(list, parms);
            }
            GenerateRaidLoot(parms, points, list);
            TaggedString letterLabel = GetLetterLabel(parms);
            TaggedString letterText  = GetLetterText(parms, list);

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, GetRelatedPawnsInfoLetterText(parms), true);
            List <TargetInfo> list2 = new List <TargetInfo>();

            if (parms.pawnGroups != null)
            {
                List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(list, parms.pawnGroups);
                List <Pawn>         list4 = list3.MaxBy((List <Pawn> x) => x.Count);
                if (list4.Any())
                {
                    list2.Add(list4[0]);
                }
                for (int i = 0; i < list3.Count; i++)
                {
                    if (list3[i] != list4 && list3[i].Any())
                    {
                        list2.Add(list3[i][0]);
                    }
                }
            }
            else if (list.Any())
            {
                foreach (Pawn item in list)
                {
                    list2.Add(item);
                }
            }
            SendRimWarLetter(letterLabel, letterText, GetLetterDef(), parms, list2);
            parms.raidStrategy.Worker.MakeLords(parms, list);
            Find.TickManager.slower.SignalForceNormalSpeedShort();
            Find.StoryWatcher.statsRecord.numRaidsEnemy++;
            return(true);
        }
예제 #23
0
        public static List <Pawn> GenerateNeutralPawns(PawnGroupKindDef pawnGroupKind, IncidentParms parms)
        {
            IsIntercepting_PawnGeneration = GeneratorPatchFlag.Generate;

            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(pawnGroupKind, parms, true);
            List <Pawn>         list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, false).ToList <Pawn>();

            return(list);
        }
        protected override bool CanFireNowSub(IncidentParms parms)
        {
            Faction faction;

            if (CaravanIncidentUtility.CanFireIncidentWhichWantsToGenerateMapAt(parms.target.Tile))
            {
                return(PawnGroupMakerUtility.TryGetRandomFactionForCombatPawnGroup(parms.points, out faction));
            }
            return(false);
        }
예제 #25
0
        public override void Generate(Map map, GenStepParams parms)
        {
            var s = new Stencil(map);

            s = s.Bound(s.MinX, s.MaxZ - Mathf.RoundToInt(map.Size.x * HeightRatio), s.MaxX, s.MaxZ)
                .Center();

            // Clear area
            s.Expand(0, 3, 0, 0).ClearThingsInBounds();

            // Courtyard floor
            s.FillTerrain(BaseGenUtility.RandomHightechFloorDef());

            // Outer floor
            s.Bound(0, s.MinZ - 1, 0, s.MinZ - 8).SetTerrain(GenCity.RandomFloor(map));

            // Outer barricade
            s.Fill(s.MinX, s.MinZ - 7, s.MaxX, s.MinZ - 7, ThingDefOf.Barricade, GenCity.RandomStuff(ThingDefOf.Barricade, map), IsValidBarricadeTile);

            // Outer wall
            var wallStuff = BaseGenUtility.RandomHightechWallStuff();
            var doorX     = s.MinX + map.Size.x / 2;

            s.Fill(s.MinX, s.MinZ - 3, doorX - 1, s.MinZ, ThingDefOf.Wall, wallStuff);
            s.Fill(doorX + 1, s.MinZ - 3, s.MaxX, s.MinZ, ThingDefOf.Wall, wallStuff);
            s.Bound(doorX, s.MinZ - 3, doorX, s.MinZ)
            .Fill(ThingDefOf.Door, wallStuff);

            // Inner keep
            s = s.Expand(-marginRange.RandomInRange, -marginRange.RandomInRange, -marginRange.RandomInRange, -marginRange.RandomInRange);

            var genStep = (GenStep_Buildings)buildingGenStepDef.genStep;

            genStep.GenerateRect(s);

            // Mechanoids
            var mechs = PawnGroupMakerUtility.GeneratePawns(new PawnGroupMakerParms {
                groupKind = PawnGroupKindDefOf.Combat,
                tile      = map.Tile,
                faction   = Faction.OfMechanoids,
                points    = 5000,
            }).ToList();

            foreach (var mech in mechs)
            {
                var pos = s.Expand(-10).MoveRand().pos;
                GenSpawn.Spawn(mech, GenCity.FindPawnSpot(pos, map), map);
                mech.SetFactionDirect(map.ParentFaction);
                mech.Name = new NameSingle(mechanoidNames[Rand.Range(0, mechanoidNames.Count)] + " #" + Rand.RangeInclusive(10, 40));
                var lord = LordMaker.MakeNewLord(map.ParentFaction, new LordJob_LiveInCitadel(pos), map);
                lord.AddPawn(mech);
            }

            //TODO throne room
        }
예제 #26
0
        protected override void RunInt()
        {
            Slate              slate              = QuestGen.slate;
            Map                target             = QuestGen.slate.Get <Map>("map");
            float              a                  = QuestGen.slate.Get("points", 0f);
            Faction            faction            = QuestGen.slate.Get <Faction>("enemyFaction");
            QuestPart_Incident questPart_Incident = new QuestPart_Incident();

            questPart_Incident.debugLabel = "raid";
            questPart_Incident.incident   = IncidentDefOf.RaidEnemy;
            IncidentParms incidentParms = new IncidentParms();

            incidentParms.forced             = true;
            incidentParms.target             = target;
            incidentParms.points             = Mathf.Max(a, faction.def.MinPointsToGeneratePawnGroup(PawnGroupKindDefOf.Combat));
            incidentParms.faction            = faction;
            incidentParms.pawnGroupMakerSeed = Rand.Int;
            incidentParms.inSignalEnd        = QuestGenUtility.HardcodedSignalWithQuestID(inSignalLeave.GetValue(slate));
            incidentParms.questTag           = QuestGenUtility.HardcodedTargetQuestTagWithQuestID(tag.GetValue(slate));
            if (!customLetterLabel.GetValue(slate).NullOrEmpty() || customLetterLabelRules.GetValue(slate) != null)
            {
                QuestGen.AddTextRequest("root", delegate(string x)
                {
                    incidentParms.customLetterLabel = x;
                }, QuestGenUtility.MergeRules(customLetterLabelRules.GetValue(slate), customLetterLabel.GetValue(slate), "root"));
            }
            if (!customLetterText.GetValue(slate).NullOrEmpty() || customLetterTextRules.GetValue(slate) != null)
            {
                QuestGen.AddTextRequest("root", delegate(string x)
                {
                    incidentParms.customLetterText = x;
                }, QuestGenUtility.MergeRules(customLetterTextRules.GetValue(slate), customLetterText.GetValue(slate), "root"));
            }
            IncidentWorker_Raid obj = (IncidentWorker_Raid)questPart_Incident.incident.Worker;

            obj.ResolveRaidStrategy(incidentParms, PawnGroupKindDefOf.Combat);
            obj.ResolveRaidArriveMode(incidentParms);
            if (incidentParms.raidArrivalMode.walkIn)
            {
                incidentParms.spawnCenter = walkInSpot.GetValue(slate) ?? QuestGen.slate.Get <IntVec3?>("walkInSpot") ?? IntVec3.Invalid;
            }
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(defaultPawnGroupMakerParms.points, incidentParms.raidArrivalMode, incidentParms.raidStrategy, defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms);

            questPart_Incident.SetIncidentParmsAndRemoveTarget(incidentParms);
            questPart_Incident.inSignal = QuestGenUtility.HardcodedSignalWithQuestID(inSignal.GetValue(slate)) ?? QuestGen.slate.Get <string>("inSignal");
            QuestGen.quest.AddPart(questPart_Incident);
            QuestGen.AddQuestDescriptionRules(new List <Rule>
            {
                new Rule_String("raidPawnKinds", PawnUtility.PawnKindsToLineList(pawnKinds, "  - ", ColoredText.ThreatColor)),
                new Rule_String("raidArrivalModeInfo", incidentParms.raidArrivalMode.textWillArrive.Formatted(faction))
            });
        }
 public static bool Prefix(ref List <Pawn> __result, Faction faction)
 {
     __result = PawnGroupMakerUtility.GeneratePawns(new PawnGroupMakerParms
     {
         tile      = Find.AnyPlayerHomeMap.Tile,
         groupKind = PawnGroupKindDefOf.Trader,
         faction   = faction,
         points    = TraderCaravanUtility.GenerateGuardPoints(),
         dontUseSingleUseRocketLaunchers = true
     }).ToList();
     return(false);
 }
 // Token: 0x0600007C RID: 124 RVA: 0x00004CB8 File Offset: 0x00002EB8
 private int GetEnemiesCount(Site site, SiteCoreOrPartParams parms)
 {
     return(PawnGroupMakerUtility.GeneratePawnKindsExample(new PawnGroupMakerParms
     {
         tile = site.Tile,
         faction = site.Faction,
         groupKind = PawnGroupKindDefOf.Combat,
         points = parms.threatPoints,
         inhabitants = true,
         seed = new int?(OutpostSitePartUtility.GetPawnGroupMakerSeed(parms))
     }).Count <PawnKindDef>());
 }
예제 #29
0
        public static void Raid(this Quest quest, Map map, float points, Faction faction, string inSignalLeave = null, string customLetterLabel = null, string customLetterText = null, RulePack customLetterLabelRules = null, RulePack customLetterTextRules = null, IntVec3?walkInSpot = null, string tag = null, string inSignal = null, string rootSymbol = "root", PawnsArrivalModeDef raidArrivalMode = null)
        {
            QuestPart_Incident questPart_Incident = new QuestPart_Incident();

            questPart_Incident.debugLabel = "raid";
            questPart_Incident.incident   = IncidentDefOf.RaidEnemy;
            IncidentParms incidentParms = new IncidentParms();

            incidentParms.forced             = true;
            incidentParms.target             = map;
            incidentParms.points             = Mathf.Max(points, faction.def.MinPointsToGeneratePawnGroup(PawnGroupKindDefOf.Combat));
            incidentParms.faction            = faction;
            incidentParms.pawnGroupMakerSeed = Rand.Int;
            incidentParms.inSignalEnd        = inSignalLeave;
            incidentParms.questTag           = QuestGenUtility.HardcodedTargetQuestTagWithQuestID(tag);
            incidentParms.raidArrivalMode    = raidArrivalMode;
            if (!customLetterLabel.NullOrEmpty() || customLetterLabelRules != null)
            {
                QuestGen.AddTextRequest(rootSymbol, delegate(string x)
                {
                    incidentParms.customLetterLabel = x;
                }, QuestGenUtility.MergeRules(customLetterLabelRules, customLetterLabel, rootSymbol));
            }
            if (!customLetterText.NullOrEmpty() || customLetterTextRules != null)
            {
                QuestGen.AddTextRequest(rootSymbol, delegate(string x)
                {
                    incidentParms.customLetterText = x;
                }, QuestGenUtility.MergeRules(customLetterTextRules, customLetterText, rootSymbol));
            }
            IncidentWorker_Raid obj = (IncidentWorker_Raid)questPart_Incident.incident.Worker;

            obj.ResolveRaidStrategy(incidentParms, PawnGroupKindDefOf.Combat);
            obj.ResolveRaidArriveMode(incidentParms);
            if (incidentParms.raidArrivalMode.walkIn)
            {
                incidentParms.spawnCenter = walkInSpot ?? QuestGen.slate.Get <IntVec3?>("walkInSpot") ?? IntVec3.Invalid;
            }
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(defaultPawnGroupMakerParms.points, incidentParms.raidArrivalMode, incidentParms.raidStrategy, defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms);

            questPart_Incident.SetIncidentParmsAndRemoveTarget(incidentParms);
            questPart_Incident.inSignal = inSignal ?? QuestGen.slate.Get <string>("inSignal");
            QuestGen.quest.AddPart(questPart_Incident);
            QuestGen.AddQuestDescriptionRules(new List <Rule>
            {
                new Rule_String("raidPawnKinds", PawnUtility.PawnKindsToLineList(pawnKinds, "  - ", ColoredText.ThreatColor)),
                new Rule_String("raidArrivalModeInfo", incidentParms.raidArrivalMode.textWillArrive.Formatted(faction))
            });
        }
        protected new List <Pawn> SpawnPawns(IncidentParms parms)
        {
            Map map  = (Map)parms.target;
            var list = PawnGroupMakerUtility.GeneratePawns(IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDef, parms, true), false)
                       .Take(Settings.maxGuestGroupSize) // Added
                       .ToList();

            foreach (Pawn newThing in list)
            {
                GenSpawn.Spawn(newThing, CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 5), map);
            }
            return(list);
        }