protected override bool TryExecuteWorker(IncidentParms parms)
        {
            parms.raidArrivalMode = ForcedArriveMode;

            ResolveRaidPoints(parms: parms);

            if (!TryResolveRaidFaction(parms: parms))
            {
                Log.Message(text: "Failed solar raid: no faction found.");

                return(false);
            }

            PawnGroupKindDef combat = Defs_Rimworld.CombatGroup;

            ResolveRaidStrategy(parms: parms, groupKind: combat);

            if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms: parms))
            {
                return(false);
            }

            parms.points = AdjustedRaidPoints(
                points: parms.points,
                raidArrivalMode: parms.raidArrivalMode,
                raidStrategy: parms.raidStrategy,
                faction: parms.faction,
                groupKind: combat
                );

            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(
                groupKind: combat,
                parms: parms,
                ensureCanGenerateAtLeastOnePawn: false
                );

            SolarRaidGroupMaker.TryGetRandomPawnGroupMaker(parms: defaultPawnGroupMakerParms, pawnGroupMaker: out PawnGroupMaker pawnGroupMaker);

            List <Pawn> list = SolarRaid_PawnGenerator.GeneratePawns(parms: defaultPawnGroupMakerParms, groupMaker: pawnGroupMaker).ToList();

            if (list.Count == 0)
            {
                return(false);
            }

            parms.raidArrivalMode.Worker.Arrive(pawns: list, parms: parms);
            var stringBuilder = new StringBuilder();

            stringBuilder.AppendLine(value: "Points = " + parms.points.ToString(format: "F0"));

            foreach (Pawn pawn in list)
            {
                string str = pawn.equipment?.Primary == null ? "unarmed" : pawn.equipment.Primary.LabelCap;
                stringBuilder.AppendLine(value: pawn.KindLabel + " - " + str);
            }

#if RW10
            string letterLabel = GetLetterLabel(parms: parms);
            string letterText  = GetLetterText(parms: parms, pawns: list);
#else
            TaggedString letterLabel = GetLetterLabel(parms: parms);
            TaggedString letterText  = GetLetterText(parms: parms, pawns: list);
#endif

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(
                seenPawns: list,
                letterLabel: ref letterLabel,
                letterText: ref letterText,
                relationsInfoHeader: GetRelatedPawnsInfoLetterText(parms: parms),
                informEvenIfSeenBefore: true,
                writeSeenPawnsNames: true
                );

            var list2 = new List <TargetInfo>();

            if (parms.pawnGroups != null)
            {
                List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(pawns: list, groups: parms.pawnGroups);
                List <Pawn>         list4 = list3.MaxBy(selector: x => x.Count);

                if (list4.Any())
                {
                    list2.Add(item: list4[index: 0]);
                }

                for (var i = 0; i < list3.Count; i++)
                {
                    if (list3[index: i] != list4)
                    {
                        if (list3[index: i].Any())
                        {
                            list2.Add(item: list3[index: i][index: 0]);
                        }
                    }
                }
            }
            else if (list.Any())
            {
                list2.Add(item: list[index: 0]);
            }

            Find.LetterStack.ReceiveLetter(
                label: letterLabel,
                text: letterText,
                textLetterDef: GetLetterDef(),
                lookTargets: list2,
                relatedFaction: parms.faction,
                debugInfo: stringBuilder.ToString()
                );

            parms.raidStrategy.Worker.MakeLords(parms: parms, pawns: list);
            LessonAutoActivator.TeachOpportunity(conc: ConceptDefOf.EquippingWeapons, opp: OpportunityType.Critical);

            if (!PlayerKnowledgeDatabase.IsComplete(conc: ConceptDefOf.ShieldBelts))
            {
                for (var j = 0; j < list.Count; j++)
                {
                    Pawn pawn2 = list[index : j];

                    if (pawn2.apparel.WornApparel.Any(predicate: ap => ap is ShieldBelt))
                    {
                        LessonAutoActivator.TeachOpportunity(conc: ConceptDefOf.ShieldBelts, opp: OpportunityType.Critical);

                        break;
                    }
                }
            }

            Find.TickManager.slower.SignalForceNormalSpeedShort();
            Find.StoryWatcher.statsRecord.numRaidsEnemy++;

            return(true);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            this.ResolveRaidPoints(parms);
            if (!this.TryResolveRaidFaction(parms))
            {
                return(false);
            }
            PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;

            this.ResolveRaidStrategy(parms, combat);
            this.ResolveRaidArriveMode(parms);
            parms.raidStrategy.Worker.TryGenerateThreats(parms);
            if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms))
            {
                return(false);
            }
            parms.points = IncidentWorker_Raid.AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat);
            List <Pawn> list = parms.raidStrategy.Worker.SpawnThreats(parms);

            if (list == null)
            {
                list = PawnGroupMakerUtility.GeneratePawns(IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms, false), true).ToList <Pawn>();
                if (list.Count == 0)
                {
                    Log.Error("Got no pawns spawning raid from parms " + parms, false);
                    return(false);
                }
                parms.raidArrivalMode.Worker.Arrive(list, parms);
            }
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("Points = " + parms.points.ToString("F0"));
            foreach (Pawn pawn in list)
            {
                string str = (pawn.equipment != null && pawn.equipment.Primary != null) ? pawn.equipment.Primary.LabelCap : "unarmed";
                stringBuilder.AppendLine(pawn.KindLabel + " - " + str);
            }
            TaggedString baseLetterLabel = this.GetLetterLabel(parms);
            TaggedString baseLetterText  = this.GetLetterText(parms, list);

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref baseLetterLabel, ref baseLetterText, this.GetRelatedPawnsInfoLetterText(parms), true, 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 <Pawn>())
                {
                    list2.Add(list4[0]);
                }
                for (int i = 0; i < list3.Count; i++)
                {
                    if (list3[i] != list4 && list3[i].Any <Pawn>())
                    {
                        list2.Add(list3[i][0]);
                    }
                }
            }
            else if (list.Any <Pawn>())
            {
                foreach (Pawn t in list)
                {
                    list2.Add(t);
                }
            }
            base.SendStandardLetter(baseLetterLabel, baseLetterText, this.GetLetterDef(), parms, list2, Array.Empty <NamedArgument>());
            parms.raidStrategy.Worker.MakeLords(parms, list);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
            if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts))
            {
                for (int j = 0; j < list.Count; j++)
                {
                    if (list[j].apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt))
                    {
                        LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical);
                        break;
                    }
                }
            }
            return(true);
        }
示例#3
0
        public void Notify_CaravanArrived(Caravan caravan)
        {
            var participants    = new List <Pawn>();
            var nonParticipants = new List <Pawn>();

            MedievalTournamentUtility.GroupParticipants(caravan.PlayerPawnsForStoryteller.Where(p => p.RaceProps.Humanlike).ToList(), category, participants, nonParticipants);

            // Create dialogue tree
            var leader      = Faction.leader;
            var tourneyNode = new DiaNode("VanillaFactionsExpanded.MedievalTournamentInitial".Translate(leader.LabelShort, Faction.Name, category.label, competitorCount, GenLabel.ThingsLabel(rewards), leader.Named("PAWN")));

            // Option 1: Participate
            var participateNode   = new DiaNode("VanillaFactionsExpanded.ParticipateInitial".Translate());
            var participateOption = new DiaOption("VanillaFactionsExpanded.Participate".Translate())
            {
                link = participateNode
            };

            tourneyNode.options.Add(participateOption);
            for (int i = 0; i < participants.Count; i++)
            {
                var pawn       = participants[i];
                var pawnOption = new DiaOption(MedievalTournamentUtility.ParticipantOptionText(pawn, category))
                {
                    action      = () => DoTournament(caravan, pawn),
                    resolveTree = true
                };
                participateNode.options.Add(pawnOption);
            }
            for (int i = 0; i < nonParticipants.Count; i++)
            {
                var pawn       = nonParticipants[i];
                var pawnOption = new DiaOption(MedievalTournamentUtility.ParticipantOptionText(pawn, category))
                {
                    disabled = true
                };
                participateNode.options.Add(pawnOption);
            }
            var participateGoBack = new DiaOption("GoBack".Translate())
            {
                link = tourneyNode
            };

            participateNode.options.Add(participateGoBack);

            // Option 2: Attack (angers faction)
            var attackOption = new DiaOption($"{"CommandAttackSettlement".Translate()} ({"AngersFaction".Translate()})")
            {
                action = () =>
                {
                    LongEventHandler.QueueLongEvent(() =>
                    {
                        Faction.TrySetRelationKind(Faction.OfPlayer, FactionRelationKind.Hostile, false);
                        var competitorPool       = PossibleCompetitors.ToList();
                        var extraPawnParams      = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, caravan);
                        extraPawnParams.faction  = Faction;
                        var pawnGroupMakerParams = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, extraPawnParams, true);
                        pawnGroupMakerParams.generateFightersOnly = true;
                        var hostilePawns = MedievalTournamentUtility.GenerateCompetitors(competitorCount, category, Faction, PossibleCompetitors).Concat(PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParams)).ToList();
                        var map          = CaravanIncidentUtility.SetupCaravanAttackMap(caravan, hostilePawns, true);
                        if (hostilePawns.Any())
                        {
                            LordMaker.MakeNewLord(Faction, new LordJob_AssaultColony(Faction), map, hostilePawns);
                        }
                        Find.TickManager.Notify_GeneratedPotentiallyHostileMap();
                        for (int i = 0; i < rewards.Count; i++)
                        {
                            GenPlace.TryPlaceThing(rewards[i], map.Center, map, ThingPlaceMode.Near);
                        }
                    },
                                                    "GeneratingMapForNewEncounter", false, null);
                    Find.WorldObjects.Remove(this);
                },
                resolveTree = true
            };

            tourneyNode.options.Add(attackOption);

            // Option 3: Leave
            var leaveOption = new DiaOption("VanillaFactionsExpanded.Leave".Translate())
            {
                resolveTree = true
            };

            tourneyNode.options.Add(leaveOption);

            // Add dialogue menu
            Find.WindowStack.Add(new Dialog_NodeTree(tourneyNode, title: LabelCap));
        }
示例#4
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            ResolveRaidPoints(parms);
            if (!TryResolveRaidFaction(parms))
            {
                return(false);
            }
            if (!parms.faction.HostileTo(Faction.OfPlayer))
            {
                return(false);
            }
            PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;

            ResolveRaidStrategy(parms, combat);
            ResolveRaidArriveMode(parms);
            parms.raidStrategy.Worker.TryGenerateThreats(parms);
            if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms))
            {
                return(false);
            }
            float points = parms.points;

            parms.points = AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat);
            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), informEvenIfSeenBefore: 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);
                }
            }
            SendStandardLetter(letterLabel, letterText, GetLetterDef(), parms, list2);
            var ignitors = new List <Pawn>();

            foreach (var p in list)
            {
                if (p.apparel != null && Rand.Chance(0.5f))
                {
                    var throwableTorches = ThingMaker.MakeThing(VFEV_DefOf.VFEV_Apparel_TorchBelt) as Apparel;
                    p.apparel.Wear(throwableTorches, false);
                    ignitors.Add(p);
                }
            }
            foreach (var pawn in list)
            {
                //Log.Message("Checking2 : " + pawn, true);
                if (pawn.RaceProps.Humanlike)
                {
                    if (Rand.Chance(0.3f) && !ignitors.Contains(pawn))
                    {
                        //Log.Message(pawn + " got duty: " + DutyDefOf.AssaultColony, true);
                        pawn.mindState.duty = new PawnDuty(DutyDefOf.AssaultColony);
                    }
                    else
                    {
                        //Log.Message(pawn + " got duty: " + VFEV_DefOf.VFEV_BurnAndStealColony, true);
                        pawn.mindState.duty = new PawnDuty(VFEV_DefOf.VFEV_BurnAndStealColony);
                    }
                }
                else
                {
                    //Log.Message(pawn + " got duty: " + DutyDefOf.AssaultColony, true);
                    pawn.mindState.duty = new PawnDuty(DutyDefOf.AssaultColony);
                }
            }

            var lord = new LordJob_BurnAndStealColony(parms.faction, false, true, true, true, true);

            LordMaker.MakeNewLord(parms.faction, lord, (Map)parms.target, list);

            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
            if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts))
            {
                for (int j = 0; j < list.Count; j++)
                {
                    if (list[j].apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt))
                    {
                        LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical);
                        break;
                    }
                }
            }
            return(true);
        }
示例#5
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            this.ResolveRaidPoints(parms);
            if (this.disableEvent)
            {
                return(false);
            }
            if (!this.TryResolveRaidFaction(parms))
            {
                return(false);
            }
            PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;

            this.ResolveRaidStrategy(parms, combat);
            this.ResolveRaidArriveMode(parms);
            if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms))
            {
                return(false);
            }
            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>();
            List <string>       viewernames = Viewers.ParseViewersFromJsonAndFindActiveViewers();

            if (list.Count > 0 && viewernames != null)
            {
                int count        = 0;
                int totalviewers = viewernames.Count();
                foreach (Pawn pawn in list)
                {
                    if (count == list.Count() || viewernames.NullOrEmpty() || pawn.RaceProps.IsMechanoid)
                    {
                        continue;
                    }
                    int        thisviewer = Verse.Rand.Range(0, viewernames.Count());
                    NameTriple name       = pawn.Name as NameTriple;
                    NameTriple newname    = new NameTriple(name.First, viewernames[thisviewer], name.Last);
                    if (!newname.UsedThisGame || ToolkitSettings.RepeatViewerNames)
                    {
                        pawn.Name = newname;
                    }

                    viewernames.RemoveAt(thisviewer);
                    count++;
                }
            }
            if (list.Count == 0)
            {
                Log.Error("Got no pawns spawning raid from parms " + parms, false);
                return(false);
            }
            parms.raidArrivalMode.Worker.Arrive(list, parms);
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("Points = " + parms.points.ToString("F0"));
            foreach (Pawn current in list)
            {
                string str = (current.equipment == null || current.equipment.Primary == null) ? "unarmed" : current.equipment.Primary.LabelCap;
                stringBuilder.AppendLine(current.KindLabel + " - " + str);
            }
            string letterLabel = this.GetLetterLabel(parms);
            string letterText  = this.GetLetterText(parms, list);

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true, 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 <Pawn>())
                {
                    list2.Add(list4[0]);
                }
                for (int i = 0; i < list3.Count; i++)
                {
                    if (list3[i] != list4)
                    {
                        if (list3[i].Any <Pawn>())
                        {
                            list2.Add(list3[i][0]);
                        }
                    }
                }
            }
            else if (list.Any <Pawn>())
            {
                list2.Add(list[0]);
            }

            Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), list2, parms.faction, stringBuilder.ToString());
            parms.raidStrategy.Worker.MakeLords(parms, list);
            return(true);
        }
示例#6
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            ResolveRaidPoints(parms);
            if (!TryResolveRaidFaction(parms))
            {
                return(false);
            }
            PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;

            ResolveRaidStrategy(parms, combat);
            ResolveRaidArriveMode(parms);
            parms.raidStrategy.Worker.TryGenerateThreats(parms);
            if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms))
            {
                return(false);
            }
            float points = parms.points;

            parms.points = AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat);
            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);
            }
            foreach (var pawn in list)
            {
                pawn.needs.food.CurLevel = Rand.Range(0.01f, 0.1f);                 // we make them hungry, so they will consume pawns during raid
            }
            GenerateRaidLoot(parms, points, list);
            TaggedString letterLabel = GetLetterLabel(parms);
            TaggedString letterText  = GetLetterText(parms, list);

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, GetRelatedPawnsInfoLetterText(parms), informEvenIfSeenBefore: 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);
                }
            }

            SendStandardLetter(letterLabel, letterText, GetLetterDef(), parms, list2);
            MakeLords(parms, list);

            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
            if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts))
            {
                for (int j = 0; j < list.Count; j++)
                {
                    if (list[j].apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt))
                    {
                        LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical);
                        break;
                    }
                }
            }
            Find.TickManager.slower.SignalForceNormalSpeedShort();
            Find.StoryWatcher.statsRecord.numRaidsEnemy++;
            return(true);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            if (!DropCellFinder.TryFindRaidDropCenterClose(spot: out IntVec3 dropSpot, map: (Map)parms.target))
            {
                return(false);
            }
            if (!FindAlliedWarringFaction(faction: out Faction faction))
            {
                return(false);
            }
            if (faction == null)
            {
                return(false);
            }

            bool   bamboozle           = false;
            string arrivalText         = string.Empty;
            int    factionGoodWillLoss = FactionInteractionDiplomacyTuningsBlatantlyCopiedFromPeaceTalks
                                         .GoodWill_FactionWarPeaceTalks_ImpactSmall.RandomInRange / 2;

            IncidentParms raidParms =
                StorytellerUtility.DefaultParmsNow(incCat: IncidentCategoryDefOf.ThreatBig, target: (Map)parms.target);

            raidParms.forced          = true;
            raidParms.faction         = faction.EnemyInFactionWar();
            raidParms.raidStrategy    = RaidStrategyDefOf.ImmediateAttack;
            raidParms.raidArrivalMode = PawnsArrivalModeDefOf.CenterDrop;
            raidParms.spawnCenter     = dropSpot;

            if (faction.EnemyInFactionWar().def.techLevel >= TechLevel.Industrial &&
                faction.EnemyInFactionWar().RelationKindWith(other: Faction.OfPlayer) == FactionRelationKind.Hostile)
            {
                bamboozle = Rand.Chance(chance: 0.25f);
            }

            if (bamboozle)
            {
                arrivalText = string.Format(format: raidParms.raidArrivalMode.textEnemy, arg0: raidParms.faction.def.pawnsPlural, arg1: raidParms.faction.Name);
            }

            //get combat-pawns to spawn.
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(groupKind: PawnGroupKindDefOf.Combat, parms: raidParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(points: defaultPawnGroupMakerParms.points, raidArrivalMode: raidParms.raidArrivalMode, raidStrategy: raidParms.raidStrategy, faction: defaultPawnGroupMakerParms.faction, groupKind: PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(parms: defaultPawnGroupMakerParms).ToList();
            List <Thing> pawnlist = new List <Thing>();

            for (int i = 0; i < this.pawnstoSpawn.RandomInRange; i++)
            {
                PawnGenerationRequest request = new PawnGenerationRequest(kind: pawnKinds.RandomElement(), faction: faction, allowDowned: true, allowDead: true, mustBeCapableOfViolence: true);
                Pawn woundedCombatant         = PawnGenerator.GeneratePawn(request: request);
                woundedCombatant.guest.getRescuedThoughtOnUndownedBecauseOfPlayer = true;
                ThingDef weapon = Rand.Bool ? DefDatabase <ThingDef> .AllDefsListForReading.Where(predicate : x => x.IsWeaponUsingProjectiles).RandomElement() : null;

                ThingDef  usedWeaponDef = weapon;
                DamageDef damageDef     = usedWeaponDef?.Verbs?.First()?.defaultProjectile?.projectile?.damageDef; //null? check? All? THE? THINGS!!!!?
                if (usedWeaponDef != null && damageDef == null)
                {
                    usedWeaponDef = null;
                }
                CustomFaction_HealthUtility.DamageUntilDownedWithSpecialOptions(p: woundedCombatant, allowBleedingWounds: true, damageDef: damageDef, weapon: usedWeaponDef);
                //todo: maybe add some storylogging.
                pawnlist.Add(item: woundedCombatant);
            }

            string  initialMessage = "MFI_WoundedCombatant".Translate(faction.Name);
            DiaNode diaNode        = new DiaNode(text: initialMessage);

            DiaOption diaOptionOk = new DiaOption(text: "OK".Translate())
            {
                resolveTree = true
            };

            DiaOption diaOptionAccept = new DiaOption(text: "RansomDemand_Accept".Translate())
            {
                action = () =>
                {
                    if (bamboozle)
                    {
                        Find.TickManager.slower.SignalForceNormalSpeedShort();
                        IncidentDefOf.RaidEnemy.Worker.TryExecute(parms: raidParms);
                    }
                    else
                    {
                        IntVec3 intVec = IntVec3.Invalid;

                        List <Building> allBuildingsColonist = ((Map)parms.target).listerBuildings.allBuildingsColonist.Where(predicate: x => x.def.thingClass == typeof(Building_Bed)).ToList();
                        for (int i = 0; i < allBuildingsColonist.Count; i++)
                        {
                            if (DropCellFinder.TryFindDropSpotNear(center: allBuildingsColonist[index: i].Position, map: (Map)parms.target, result: out intVec, allowFogged: false, canRoofPunch: false))
                            {
                                break;
                            }
                        }
                        if (intVec == IntVec3.Invalid)
                        {
                            intVec = DropCellFinder.RandomDropSpot(map: (Map)parms.target);
                        }
                        DropPodUtility.DropThingsNear(dropCenter: intVec, map: (Map)parms.target, things: pawnlist, openDelay: 180, leaveSlag: true, canRoofPunch: false);
                        Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction: faction);
                    }
                }
            };
            string  bamboozledAndAmbushed = "MFI_WoundedCombatantAmbush".Translate(faction, arrivalText);
            string  commanderGreatful     = "MFI_WoundedCombatantGratitude".Translate();
            DiaNode acceptDiaNode         = new DiaNode(text: bamboozle ? bamboozledAndAmbushed : commanderGreatful);

            diaOptionAccept.link = acceptDiaNode;
            diaNode.options.Add(item: diaOptionAccept);
            acceptDiaNode.options.Add(item: diaOptionOk);

            DiaOption diaOptionRejection = new DiaOption(text: "RansomDemand_Reject".Translate())
            {
                action = () =>
                {
                    if (bamboozle)
                    {
                        Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction: faction);
                    }
                    else
                    {
                        faction.TryAffectGoodwillWith(other: Faction.OfPlayer, goodwillChange: factionGoodWillLoss, canSendMessage: false);
                    }
                }
            };
            string  rejectionResponse        = "MFI_WoundedCombatantRejected".Translate(faction.Name, factionGoodWillLoss);
            string  bamboozlingTheBamboozler = "MFI_WoundedCombatantAmbushAvoided".Translate();
            DiaNode rejectionDiaNode         = new DiaNode(text: bamboozle ? bamboozlingTheBamboozler : rejectionResponse);

            diaOptionRejection.link = rejectionDiaNode;
            diaNode.options.Add(item: diaOptionRejection);
            rejectionDiaNode.options.Add(item: diaOptionOk);

            string title = "MFI_WoundedCombatantTitle".Translate(((Map)parms.target).Parent.Label);

            Find.WindowStack.Add(window: new Dialog_NodeTreeWithFactionInfo(nodeRoot: diaNode, faction: faction, delayInteractivity: true, radioMode: true, title: title));
            Find.Archive.Add(archivable: new ArchivedDialog(text: diaNode.text, title: title, relatedFaction: faction));
            return(true);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            if (!TryFindSpawnSpot(map, out IntVec3 spawnSpot))
            {
                return(false);
            }
            if (!TryFindEnemyFaction(out Faction enemyFac))
            {
                return(false);
            }
            int           @int      = Rand.Int;
            IncidentParms raidParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, map);

            raidParms.forced             = true;
            raidParms.faction            = enemyFac;
            raidParms.raidStrategy       = RaidStrategyDefOf.ImmediateAttack;
            raidParms.raidArrivalMode    = PawnsArrivalModeDefOf.EdgeWalkIn;
            raidParms.spawnCenter        = spawnSpot;
            raidParms.points             = Mathf.Max(raidParms.points * RaidPointsFactorRange.RandomInRange, enemyFac.def.MinPointsToGeneratePawnGroup(PawnGroupKindDefOf.Combat));
            raidParms.pawnGroupMakerSeed = @int;
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, raidParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(defaultPawnGroupMakerParms.points, raidParms.raidArrivalMode, raidParms.raidStrategy, defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms);
            PawnGenerationRequest     request   = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, null, PawnGenerationContext.NonPlayer, -1, forceGenerateNewPawn: false, newborn: false, allowDead: false, allowDowned: false, canGeneratePawnRelations: true, mustBeCapableOfViolence: false, colonistRelationChanceFactor: 20f);
            Pawn refugee = PawnGenerator.GeneratePawn(request);

            refugee.relations.everSeenByPlayer = true;
            string text = "RefugeeChasedInitial".Translate(refugee.Name.ToStringFull, refugee.story.Title, enemyFac.def.pawnsPlural, enemyFac.Name, refugee.ageTracker.AgeBiologicalYears, PawnUtility.PawnKindsToCommaList(pawnKinds, useAnd: true), refugee.Named("PAWN"));

            text = text.AdjustedFor(refugee);
            TaggedString temp = new TaggedString(text);

            PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref temp, refugee);
            DiaNode   diaNode   = new DiaNode(temp);
            DiaOption diaOption = new DiaOption("RefugeeChasedInitial_Accept".Translate());

            diaOption.action = delegate
            {
                GenSpawn.Spawn(refugee, spawnSpot, map);
                refugee.SetFaction(Faction.OfPlayer);
                CameraJumper.TryJump(refugee);
                QueuedIncident qi = new QueuedIncident(new FiringIncident(IncidentDefOf.RaidEnemy, null, raidParms), Find.TickManager.TicksGame + RaidDelay.RandomInRange);
                Find.Storyteller.incidentQueue.Add(qi);
            };
            diaOption.resolveTree = true;
            diaNode.options.Add(diaOption);
            string    text2      = "RefugeeChasedRejected".Translate(refugee.LabelShort, refugee);
            DiaNode   diaNode2   = new DiaNode(text2);
            DiaOption diaOption2 = new DiaOption("OK".Translate());

            diaOption2.resolveTree = true;
            diaNode2.options.Add(diaOption2);
            DiaOption diaOption3 = new DiaOption("RefugeeChasedInitial_Reject".Translate());

            diaOption3.action = delegate
            {
                Find.WorldPawns.PassToWorld(refugee);
            };
            diaOption3.link = diaNode2;
            diaNode.options.Add(diaOption3);
            string title = "RefugeeChasedTitle".Translate(map.Parent.Label);

            Find.WindowStack.Add(new Dialog_NodeTreeWithFactionInfo(diaNode, enemyFac, delayInteractivity: true, radioMode: true, title: title));
            Find.Archive.Add(new ArchivedDialog(diaNode.text, title, enemyFac));
            return(true);
        }
示例#9
0
        public static List <Pawn> GeneratePawnsForBoats(IncidentParms parms, PawnGroupKindDef group)
        {
            PawnGroupMakerParms pawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(group, parms, true);

            return(PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms, false).ToList <Pawn>());
        }
示例#10
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            if (!DropCellFinder.TryFindRaidDropCenterClose(out var dropSpot, (Map)parms.target))
            {
                return(false);
            }

            if (!FindAlliedWarringFaction(out var faction))
            {
                return(false);
            }

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

            var bamboozle           = false;
            var arrivalText         = string.Empty;
            var factionGoodWillLoss = MFI_DiplomacyTunings
                                      .GoodWill_FactionWarPeaceTalks_ImpactSmall.RandomInRange / 2;

            var raidParms =
                StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, (Map)parms.target);

            raidParms.forced          = true;
            raidParms.faction         = faction.EnemyInFactionWar();
            raidParms.raidStrategy    = RaidStrategyDefOf.ImmediateAttack;
            raidParms.raidArrivalMode = PawnsArrivalModeDefOf.CenterDrop;
            raidParms.spawnCenter     = dropSpot;

            if (faction.EnemyInFactionWar().def.techLevel >= TechLevel.Industrial &&
                faction.EnemyInFactionWar().RelationKindWith(Faction.OfPlayer) == FactionRelationKind.Hostile)
            {
                bamboozle = Rand.Chance(0.25f);
            }

            if (bamboozle)
            {
                arrivalText = string.Format(raidParms.raidArrivalMode.textEnemy, raidParms.faction.def.pawnsPlural,
                                            raidParms.faction.Name);
            }

            //get combat-pawns to spawn.
            var defaultPawnGroupMakerParms =
                IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, raidParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(
                defaultPawnGroupMakerParms.points, raidParms.raidArrivalMode, raidParms.raidStrategy,
                defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds =
                PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms).ToList();
            var pawnlist = new List <Thing>();

            for (var i = 0; i < pawnstoSpawn.RandomInRange; i++)
            {
                var request = new PawnGenerationRequest(pawnKinds.RandomElement(), faction, allowDowned: true,
                                                        allowDead: true, mustBeCapableOfViolence: true);
                var woundedCombatant = PawnGenerator.GeneratePawn(request);
                woundedCombatant.guest.getRescuedThoughtOnUndownedBecauseOfPlayer = true;
                var weapon = Rand.Bool
                    ? DefDatabase <ThingDef> .AllDefsListForReading.Where(x => x.IsWeaponUsingProjectiles).RandomElement()
                    : null;

                var usedWeaponDef = weapon;
                var damageDef     =
                    usedWeaponDef?.Verbs?.First()?.defaultProjectile?.projectile
                    ?.damageDef;     //null? check? All? THE? THINGS!!!!?
                if (usedWeaponDef != null && damageDef == null)
                {
                    usedWeaponDef = null;
                }

                CustomFaction_HealthUtility.DamageUntilDownedWithSpecialOptions(woundedCombatant,
                                                                                true, damageDef, usedWeaponDef);
                //todo: maybe add some story logging.
                pawnlist.Add(woundedCombatant);
            }

            string initialMessage = "MFI_WoundedCombatant".Translate(faction.Name);
            var    diaNode        = new DiaNode(initialMessage);

            var diaOptionOk = new DiaOption("OK".Translate())
            {
                resolveTree = true
            };

            var diaOptionAccept = new DiaOption("RansomDemand_Accept".Translate())
            {
                action = () =>
                {
                    if (bamboozle)
                    {
                        Find.TickManager.slower.SignalForceNormalSpeedShort();
                        IncidentDefOf.RaidEnemy.Worker.TryExecute(raidParms);
                    }
                    else
                    {
                        var intVec = IntVec3.Invalid;

                        var allBuildingsColonist = ((Map)parms.target).listerBuildings.allBuildingsColonist
                                                   .Where(x => x.def.thingClass == typeof(Building_Bed)).ToList();
                        foreach (var building in allBuildingsColonist)
                        {
                            if (DropCellFinder.TryFindDropSpotNear(building.Position, (Map)parms.target,
                                                                   out intVec, false, false))
                            {
                                break;
                            }
                        }

                        if (intVec == IntVec3.Invalid)
                        {
                            intVec = DropCellFinder.RandomDropSpot((Map)parms.target);
                        }

                        DropPodUtility.DropThingsNear(intVec, (Map)parms.target, pawnlist, 180, leaveSlag: true,
                                                      canRoofPunch: false);
                        Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction);
                    }
                }
            };
            string bamboozledAndAmbushed = "MFI_WoundedCombatantAmbush".Translate(faction, arrivalText);
            string commanderGreatful     = "MFI_WoundedCombatantGratitude".Translate();
            var    acceptDiaNode         = new DiaNode(bamboozle ? bamboozledAndAmbushed : commanderGreatful);

            diaOptionAccept.link = acceptDiaNode;
            diaNode.options.Add(diaOptionAccept);
            acceptDiaNode.options.Add(diaOptionOk);

            var diaOptionRejection = new DiaOption("RansomDemand_Reject".Translate())
            {
                action = () =>
                {
                    if (bamboozle)
                    {
                        Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction);
                    }
                    else
                    {
                        faction.TryAffectGoodwillWith(Faction.OfPlayer, factionGoodWillLoss, false);
                    }
                }
            };
            string rejectionResponse        = "MFI_WoundedCombatantRejected".Translate(faction.Name, factionGoodWillLoss);
            string bamboozlingTheBamboozler = "MFI_WoundedCombatantAmbushAvoided".Translate();
            var    rejectionDiaNode         = new DiaNode(bamboozle ? bamboozlingTheBamboozler : rejectionResponse);

            diaOptionRejection.link = rejectionDiaNode;
            diaNode.options.Add(diaOptionRejection);
            rejectionDiaNode.options.Add(diaOptionOk);

            string title = "MFI_WoundedCombatantTitle".Translate(((Map)parms.target).Parent.Label);

            Find.WindowStack.Add(new Dialog_NodeTreeWithFactionInfo(diaNode, faction, true, true, title));
            Find.Archive.Add(new ArchivedDialog(diaNode.text, title, faction));
            return(true);
        }
示例#11
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map     map = (Map)parms.target;
            IntVec3 spawnSpot;

            if (!this.TryFindSpawnSpot(map, out spawnSpot))
            {
                return(false);
            }
            Faction faction;

            if (!this.TryFindEnemyFaction(out faction))
            {
                return(false);
            }
            int           @int      = Rand.Int;
            IncidentParms raidParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, map);

            raidParms.forced             = true;
            raidParms.faction            = faction;
            raidParms.raidStrategy       = RaidStrategyDefOf.ImmediateAttack;
            raidParms.raidArrivalMode    = PawnsArrivalModeDefOf.EdgeWalkIn;
            raidParms.spawnCenter        = spawnSpot;
            raidParms.points             = Mathf.Max(raidParms.points * IncidentWorker_RefugeeChased.RaidPointsFactorRange.RandomInRange, faction.def.MinPointsToGeneratePawnGroup(PawnGroupKindDefOf.Combat));
            raidParms.pawnGroupMakerSeed = new int?(@int);
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, raidParms, false);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(defaultPawnGroupMakerParms.points, raidParms.raidArrivalMode, raidParms.raidStrategy, defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms);
            PawnGenerationRequest     request   = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, null, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 20f, false, true, true, false, false, false, false, null, null, null, null, null, null, null, null);
            Pawn refugee = PawnGenerator.GeneratePawn(request);

            refugee.relations.everSeenByPlayer = true;
            string text = "RefugeeChasedInitial".Translate(refugee.Name.ToStringFull, refugee.story.Title, faction.def.pawnsPlural, faction.Name, refugee.ageTracker.AgeBiologicalYears, PawnUtility.PawnKindsToCommaList(pawnKinds, true), refugee.Named("PAWN"));

            text = text.AdjustedFor(refugee, "PAWN");

            if (Quote != null)
            {
                text += "\n\n";
                text += Quote;
            }

            PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref text, refugee);
            DiaNode   diaNode   = new DiaNode(text);
            DiaOption diaOption = new DiaOption("RefugeeChasedInitial_Accept".Translate());

            diaOption.action = delegate
            {
                GenSpawn.Spawn(refugee, spawnSpot, map, WipeMode.Vanish);
                refugee.SetFaction(Faction.OfPlayer, null);
                CameraJumper.TryJump(refugee);
                QueuedIncident qi = new QueuedIncident(new FiringIncident(IncidentDefOf.RaidEnemy, null, raidParms), Find.TickManager.TicksGame + IncidentWorker_RefugeeChased.RaidDelay.RandomInRange, 0);
                Find.Storyteller.incidentQueue.Add(qi);
            };
            diaOption.resolveTree = true;
            diaNode.options.Add(diaOption);
            string    text2      = "RefugeeChasedRejected".Translate(refugee.LabelShort, refugee);
            DiaNode   diaNode2   = new DiaNode(text2);
            DiaOption diaOption2 = new DiaOption("OK".Translate());

            diaOption2.resolveTree = true;
            diaNode2.options.Add(diaOption2);
            DiaOption diaOption3 = new DiaOption("RefugeeChasedInitial_Reject".Translate());

            diaOption3.action = delegate
            {
                Find.WorldPawns.PassToWorld(refugee, PawnDiscardDecideMode.Decide);
            };
            diaOption3.link = diaNode2;
            diaNode.options.Add(diaOption3);
            string title = "RefugeeChasedTitle".Translate(map.Parent.Label);

            Find.WindowStack.Add(new Dialog_NodeTreeWithFactionInfo(diaNode, faction, true, true, title));
            Find.Archive.Add(new ArchivedDialog(diaNode.text, title, faction));
            return(true);
        }
        protected virtual bool TryExecuteVehicleRaid(IncidentParms parms)
        {
            ResolveRaidPoints(parms);
            if (!TryResolveRaidFaction(parms))
            {
                return(false);
            }
            PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;

            ResolveRaidStrategy(parms, combat);
            ResolveRaidArriveMode(parms);
            parms.raidStrategy.Worker.TryGenerateThreats(parms);
            if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms))
            {
                return(false);
            }
            float points = parms.points;

            parms.points = AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat);

            List <Pawn> vehicleList = new List <Pawn>();

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

            if (list.Count == 0)
            {
                Log.Error("Got no pawns spawning raid from parms " + parms);
                return(false);
            }
            vehicleList = ReplaceWithVehicles(parms, list);
            parms.raidArrivalMode.Worker.Arrive(vehicleList, parms);

            GenerateRaidLoot(parms, points, vehicleList);
            TaggedString baseLetterLabel = GetLetterLabel(parms);
            TaggedString baseLetterText  = GetLetterText(parms, vehicleList);

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(vehicleList, ref baseLetterLabel, ref baseLetterText, GetRelatedPawnsInfoLetterText(parms), true, true);
            List <TargetInfo> list2 = new List <TargetInfo>();

            if (parms.pawnGroups != null)
            {
                List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(vehicleList, 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 (vehicleList.Any())
            {
                foreach (Pawn t in vehicleList)
                {
                    list2.Add(t);
                }
            }
            SendStandardLetter(baseLetterLabel, baseLetterText, GetLetterDef(), parms, list2, Array.Empty <NamedArgument>());
            parms.raidStrategy.Worker.MakeLords(parms, vehicleList);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
            if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts))
            {
                for (int j = 0; j < vehicleList.Count; j++)
                {
                    if (vehicleList[j].apparel?.WornApparel.Any((Apparel ap) => ap is ShieldBelt) ?? false)
                    {
                        LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical);
                        break;
                    }
                }
            }
            return(true);
        }
示例#13
0
        // Token: 0x06000D17 RID: 3351 RVA: 0x00061114 File Offset: 0x0005F514
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            ResolveRaidPoints(parms);

            if (!TryResolveRaidFaction(parms))
            {
                return(false);
            }

            IntVec3 intVec;

            if (!RCellFinder.TryFindRandomPawnEntryCell(out intVec, map, CellFinder.EdgeRoadChance_Animal))
            {
                return(false);
            }

            PawnGroupKindDef    combat = PawnGroupKindDefOf.Combat;
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms, false);

            List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();

            if (list.Count < 1)
            {
                Log.Error("Got no pawns spawning raid from parms " + parms, false);
                return(false);
            }
            else
            {
                for (int i = 0; i < list.Count; i++)
                {
                    Pawn pawn = list[i];
                    list[i] = ZombiefiedMod.GenerateZombieFromSource(list[i]);
                    pawn.Destroy(DestroyMode.Vanish);
                }
            }

            Rot4 rot = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat);

            Faction zFaction = Faction.OfInsects;

            foreach (Faction faction in Find.FactionManager.AllFactionsListForReading)
            {
                if (faction.def.defName == "Zombie")
                {
                    zFaction = faction;
                }
            }

            for (int i = 0; i < list.Count; i++)
            {
                Pawn    pawn = list[i];
                IntVec3 loc  = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null);
                pawn.SetFactionDirect(zFaction);
                pawn.apparel.DestroyAll();
                Pawn_Zombiefied zomb = (Pawn_Zombiefied)GenSpawn.Spawn(pawn, loc, map, rot);
                if (zomb != null)
                {
                    zomb.FixZombie();
                }
            }

            if (ZombiefiedMod.zombieRaidNotifications)
            {
                Find.LetterStack.ReceiveLetter("Zombies", "Some zombies walked into your territory. You might want to deal with them before they deal with you."
                                               , LetterDefOf.NeutralEvent, list[0], null);
                Find.TickManager.slower.SignalForceNormalSpeedShort();
            }
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.ForbiddingDoors, OpportunityType.Critical);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.AllowedAreas, OpportunityType.Important);
            return(true);
        }
示例#14
0
        public override bool TryExecute(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            this.ResolveRaidPoints(parms);
            if (!this.TryResolveRaidFaction(parms))
            {
                return(false);
            }

            IntVec3 dropCenter;

            dropCenter = DropCellFinder.FindRaidDropCenterDistant(map);

            this.ResolveRaidStrategy(parms);
            this.ResolveRaidArriveMode(parms);
            this.ResolveRaidSpawnCenter(parms);
            IncidentParmsUtility.AdjustPointsForGroupArrivalParams(parms);
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(parms);
            List <Pawn>         list = PawnGroupMakerUtility.GeneratePawns(PawnGroupKindDefOf.Normal, defaultPawnGroupMakerParms, true).ToList <Pawn>();

            if (list.Count == 0)
            {
                Log.Error("Got no pawns spawning raid from parms " + parms);
                return(false);
            }
            TargetInfo      target = new TargetInfo(dropCenter, map);
            List <ShipBase> ships  = DropShipUtility.CreateDropShips(list, parms.faction);

            DropShipUtility.DropShipGroups(dropCenter, map, ships, TravelingShipArrivalAction.EnterMapAssault);

            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("Points = " + parms.points.ToString("F0"));
            foreach (Pawn current2 in list)
            {
                string str = (current2.equipment == null || current2.equipment.Primary == null) ? "unarmed" : current2.equipment.Primary.LabelCap;
                stringBuilder.AppendLine(current2.KindLabel + " - " + str);
            }
            string letterLabel = this.GetLetterLabel(parms);
            string letterText  = this.GetLetterText(parms, list);

            PawnRelationUtility.Notify_PawnsSeenByPlayer(list, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true);
            Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), target, stringBuilder.ToString());
            if (this.GetLetterDef() == LetterDefOf.BadUrgent)
            {
                TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]);
            }
            this.ResolveRaidParmOptions(parms);
            Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AerialAssault(ships, parms.faction, this.Kidnappers(parms.faction), true, this.UseSappers, this.SmartGrid, this.Stealers(parms.faction)), map, list);

            //Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AssaultColony(parms.faction, true, true, true, true, true), map, list);
            AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
            if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts))
            {
                for (int i = 0; i < list.Count; i++)
                {
                    Pawn pawn = list[i];
                    if (pawn.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt))
                    {
                        LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical);
                        break;
                    }
                }
            }
            if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer))
            {
                Log.Message(string.Concat(new object[]
                {
                    "Market value threshold to start stealing: ",
                    StealAIUtility.StartStealingMarketValueThreshold(lord),
                    " (colony wealth = ",
                    map.wealthWatcher.WealthTotal,
                    ")"
                }));
            }
            return(true);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            Cthulhu.Utility.DebugReport("Cosmic Horror Raid Report: Trying execution");
            this.ResolveRaidPoints(parms);
            if (!this.TryResolveRaidFaction(parms))
            {
                Cthulhu.Utility.DebugReport("Cosmic Horror Raid Report: Failed to resolve faction");
                return(false);
            }
            this.ResolveRaidStrategy(parms);
            this.ResolveRaidArriveMode(parms);
            this.ResolveRaidSpawnCenter(parms);
            IncidentParmsUtility.AdjustPointsForGroupArrivalParams(parms);
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(parms);

            List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(PawnGroupKindDefOf.Normal, defaultPawnGroupMakerParms).ToList <Pawn>();

            if (list.Count == 0)
            {
                Cthulhu.Utility.ErrorReport("Got no pawns spawning raid from parms " + parms);
                return(false);
            }
            TargetInfo target = TargetInfo.Invalid;

            if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop || parms.raidArrivalMode == PawnsArriveMode.EdgeDrop)
            {
                DropPodUtility.DropThingsNear(parms.spawnCenter, map, list.Cast <Thing>(), parms.raidPodOpenDelay, false, true, true);
                target = new TargetInfo(parms.spawnCenter, map);
            }
            else
            {
                foreach (Pawn arg_B3_0 in list)
                {
                    IntVec3 intVec = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8);
                    GenSpawn.Spawn(arg_B3_0, intVec, map);
                    target = arg_B3_0;
                }
            }
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("Points = " + parms.points.ToString("F0"));
            foreach (Pawn current2 in list)
            {
                string str = (current2.equipment == null || current2.equipment.Primary == null) ? "unarmed" : current2.equipment.Primary.LabelCap;
                stringBuilder.AppendLine(current2.KindLabel + " - " + str);
            }
            string letterLabel = this.GetLetterLabel(parms);
            string letterText  = this.GetLetterText(parms, list);
            string lalalal     = this.GetRelatedPawnsInfoLetterText(parms);

            PawnRelationUtility.Notify_PawnsSeenByPlayer(list, out lalalal, true);
            Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), target, stringBuilder.ToString());
            if (this.GetLetterDef() == LetterDefOf.ThreatSmall)
            {
                TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]);
            }
            Lord lord = LordMaker.MakeNewLord(parms.faction, parms.raidStrategy.Worker.MakeLordJob(parms, map), map, list);

            AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
            //if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.PersonalShields))
            //{
            //    for (int i = 0; i < list.Count; i++)
            //    {
            //        Pawn pawn = list[i];
            //        if (pawn.apparel.WornApparel.Any((Apparel ap) => ap is PersonalShield))
            //        {
            //            LessonAutoActivator.TeachOpportunity(ConceptDefOf.PersonalShields, OpportunityType.Critical);
            //            break;
            //        }
            //    }
            //}
            if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer))
            {
                Log.Message(string.Concat(new object[]
                {
                    "Market value threshold to start stealing: ",
                    StealAIUtility.StartStealingMarketValueThreshold(lord),
                    " (colony wealth = ",
                    map.wealthWatcher.WealthTotal,
                    ")"
                }));
            }
            return(true);
        }