Пример #1
0
        public void DropTeam()
        {
            // Find exit spot.
            IntVec3 exitSpot        = IntVec3.Invalid;
            bool    exitSpotIsValid = Expedition.TryFindRandomExitSpot(this.Map, this.Position, out exitSpot);

            if (exitSpotIsValid)
            {
                // Spawn expedition pawns.
                List <Pawn> stayingAboardPawns = new List <Pawn>();
                List <Pawn> droppedPawns       = new List <Pawn>();
                foreach (Pawn pawn in this.pawnsAboard)
                {
                    if (pawn.kindDef == Util_PawnKindDefOf.Pilot)
                    {
                        stayingAboardPawns.Add(pawn);
                    }
                    else
                    {
                        droppedPawns.Add(pawn);
                        GenSpawn.Spawn(pawn, this.Position + IntVec3Utility.RandomHorizontalOffset(3f), this.Map);
                    }
                }
                this.pawnsAboard = stayingAboardPawns;
                // Make lord.
                LordMaker.MakeNewLord(Util_Faction.MiningCoFaction, new LordJob_ExitMap(exitSpot), this.Map, droppedPawns);
                // Spawn payment.
                SpawnPayment(droppedPawns.Count);
                Util_Faction.AffectGoodwillWith(Util_Faction.MiningCoFaction, Faction.OfPlayer, droppedPawns.Count);
            }
        }
Пример #2
0
        private void MakeTradeCaravan(Faction faction, IntVec3 spot, Map map)
        {
            IncidentParms incidentParms = Find.Storyteller.storytellerComps[0].GenerateParms(IncidentCategoryDefOf.OrbitalVisitor, map);

            incidentParms.points      = Mathf.Min(800f, incidentParms.points);
            incidentParms.spawnCenter = spot;
            incidentParms.faction     = faction;
            List <Pawn> list = this.SpawnPawns(incidentParms);

            if (list.Count != 0)
            {
                for (int i = 0; i < list.Count; i++)
                {
                    if (list[i].needs != null && list[i].needs.food != null)
                    {
                        list[i].needs.food.CurLevel = list[i].needs.food.MaxLevel;
                    }
                }
                for (int j = 0; j < list.Count; j++)
                {
                    Pawn pawn = list[j];
                    if (pawn.TraderKind != null)
                    {
                        TraderKindDef traderKind = pawn.TraderKind;
                        break;
                    }
                }
                LordJob_TradeWithColony lordJob = new LordJob_TradeWithColony(incidentParms.faction, spot);
                LordMaker.MakeNewLord(incidentParms.faction, lordJob, map, list);
            }
        }
Пример #3
0
        public override void Generate(Map map, GenStepParams parms)
        {
            IntVec3 intVec;

            if (RCellFinder.TryFindRandomCellNearTheCenterOfTheMapWith((IntVec3 x) => GenGrid.Standable(x, map) && !GridsUtility.Fogged(x, map) && GridsUtility.GetRoom(x, map, (RegionType)6).CellCount >= 4, map, out intVec))
            {
                float       num  = this.pointsRange.RandomInRange;
                List <Pawn> list = new List <Pawn>();
                for (int i = 0; i < 50; i++)
                {
                    PawnKindDef pawnKindDef = GenCollection.RandomElementByWeight <PawnKindDef>(from kind in DefDatabase <PawnKindDef> .AllDefsListForReading
                                                                                                where kind.RaceProps.IsMechanoid
                                                                                                select kind, (PawnKindDef kind) => 1f / kind.combatPower);
                    list.Add(PawnGenerator.GeneratePawn(pawnKindDef, Faction.OfMechanoids));
                    num -= pawnKindDef.combatPower;
                    if (num <= 0f)
                    {
                        break;
                    }
                }
                IntVec3 intVec2 = default(IntVec3);
                for (int j = 0; j < list.Count; j++)
                {
                    IntVec3 intVec3 = CellFinder.RandomSpawnCellForPawnNear(intVec, map, 10);
                    intVec2 = intVec3;
                    GenSpawn.Spawn(list[j], intVec3, map, Rot4.Random, WipeMode.Vanish, false);
                }
                LordMaker.MakeNewLord(Faction.OfMechanoids, new LordJob_DefendPoint(intVec2), map, list);
            }
        }
        private void AssaultColony()
        {
            faction.TrySetRelationKind(Faction.OfPlayer, FactionRelationKind.Hostile, canSendLetter: false);
            for (int i = 0; i < pawns.Count; i++)
            {
                pawns[i].GetLord()?.Notify_PawnLost(pawns[i], PawnLostCondition.ForcedByQuest);
            }
            for (int j = 0; j < pawns.Count; j++)
            {
                pawns[j].SetFaction(faction);
                if (!pawns[j].Awake())
                {
                    RestUtility.WakeUp(pawns[j]);
                }
            }
            Lord lord = LordMaker.MakeNewLord(faction, new LordJob_AssaultColony(faction), mapParent.Map);

            for (int k = 0; k < pawns.Count; k++)
            {
                if (!pawns[k].Dead)
                {
                    lord.AddPawn(pawns[k]);
                }
            }
            Complete();
        }
Пример #5
0
        private bool TryAccept()
        {
            List <Pawn> pawnsFromTransferables = TransferableUtility.GetPawnsFromTransferables(this.transferables);

            if (!this.CheckForErrors(pawnsFromTransferables))
            {
                return(false);
            }
            this.AssignTransferablesToShip();
            IEnumerable <Pawn> enumerable = from x in pawnsFromTransferables
                                            where x.IsColonist && !x.Downed
                                            select x;

            if (enumerable.Any <Pawn>())
            {
                foreach (Pawn current in enumerable)
                {
                    Lord lord = current.GetLord();
                    if (lord != null)
                    {
                        lord.Notify_PawnLost(current, PawnLostCondition.ForcedToJoinOtherLord, null);
                    }
                }
                LordMaker.MakeNewLord(Faction.OfPlayer, new LordJob_LoadShipCargo(this.ship), this.map, enumerable);
                foreach (Pawn current2 in enumerable)
                {
                    if (current2.Spawned)
                    {
                        current2.jobs.EndCurrentJob(JobCondition.InterruptForced, true);
                    }
                }
            }
            Messages.Message("MessageShipCargoLoadStarted".Translate(new object[] { ship.ShipNick }), this.ship, MessageTypeDefOf.TaskCompletion, false);
            return(true);
        }
        public PawnSummoned SpawnPawn(SpawnThings spawnables, Faction faction)
        {
            var newPawn = (PawnSummoned)PawnGenerator.GeneratePawn(spawnables.kindDef, faction);

            newPawn.Spawner   = Caster;
            newPawn.Temporary = spawnables.temporary;
            if (newPawn.Faction != Faction.OfPlayerSilentFail && this?.Caster?.Faction is Faction f)
            {
                newPawn.SetFaction(f);
            }
            GenSpawn.Spawn(newPawn, PositionHeld, Find.CurrentMap);
            if (faction != null && faction != Faction.OfPlayer)
            {
                Lord lord = null;
                if (newPawn.Map.mapPawns.SpawnedPawnsInFaction(faction).Any(p => p != newPawn))
                {
                    Predicate <Thing> validator = p => p != newPawn && ((Pawn)p).GetLord() != null;
                    var p2 = (Pawn)GenClosest.ClosestThing_Global(newPawn.Position,
                                                                  newPawn.Map.mapPawns.SpawnedPawnsInFaction(faction), 99999f, validator);
                    lord = p2.GetLord();
                }
                if (lord == null)
                {
                    var lordJob = new LordJob_DefendPoint(newPawn.Position);
                    lord = LordMaker.MakeNewLord(faction, lordJob, Find.CurrentMap, null);
                }
                lord.AddPawn(newPawn);
            }
            return(newPawn);
        }
Пример #7
0
        public override void Generate(Map map)
        {
            CellRect around;
            IntVec3  near;

            if (!SiteGenStepUtility.TryFindRootToSpawnAroundRectOfInterest(out around, out near, map))
            {
                return;
            }
            List <Pawn> list = new List <Pawn>();

            foreach (Pawn current in this.GeneratePawns(map))
            {
                IntVec3 loc;
                if (!SiteGenStepUtility.TryFindSpawnCellAroundOrNear(around, near, map, out loc))
                {
                    Find.WorldPawns.PassToWorld(current, PawnDiscardDecideMode.Discard);
                    break;
                }
                GenSpawn.Spawn(current, loc, map);
                list.Add(current);
            }
            if (!list.Any <Pawn>())
            {
                return;
            }
            LordMaker.MakeNewLord(Faction.OfMechanoids, new LordJob_SleepThenAssaultColony(Faction.OfMechanoids, Rand.Bool), map, list);
            for (int i = 0; i < list.Count; i++)
            {
                list[i].jobs.EndCurrentJob(JobCondition.InterruptForced, true);
            }
        }
Пример #8
0
        private bool TryAccept()
        {
            List <Pawn> pawnsFromTransferables = TransferableUtility.GetPawnsFromTransferables(transferables);

            if (!CheckForErrors(pawnsFromTransferables))
            {
                return(false);
            }
            int transportersGroup = CreateAndAssignNewTransportersGroup();

            AssignTransferablesToRandomTransporters();
            IEnumerable <Pawn> enumerable = from x in pawnsFromTransferables
                                            where x.IsColonist && !x.Downed
                                            select x;

            if (enumerable.Any())
            {
                foreach (Pawn item in enumerable)
                {
                    item.GetLord()?.Notify_PawnLost(item, PawnLostCondition.ForcedToJoinOtherLord);
                }
                LordMaker.MakeNewLord(Faction.OfPlayer, new LordJob_LoadAndEnterTransporters(transportersGroup), map, enumerable);
                foreach (Pawn item2 in enumerable)
                {
                    if (item2.Spawned)
                    {
                        item2.jobs.EndCurrentJob(JobCondition.InterruptForced);
                    }
                }
            }
            Messages.Message("MessageTransportersLoadingProcessStarted".Translate(), transporters[0].parent, MessageTypeDefOf.TaskCompletion, historical: false);
            return(true);
        }
        private static void CreateLord(Faction faction, IntVec3 chillSpot, List <Pawn> pawns, Map map)
        {
            var mapComp = Hospitality_MapComponent.Instance(map);

            int stayDuration = (int)(Rand.Range(1f, 2.4f) * GenDate.TicksPerDay);
            var lordJob      = new LordJob_VisitColony(faction, chillSpot, stayDuration);

            LordMaker.MakeNewLord(faction, lordJob, map, pawns);


            // Set default interaction
            pawns.ForEach(delegate(Pawn p) {
                var compGuest = p.GetComp <CompGuest>();
                if (compGuest != null)
                {
                    compGuest.mayBuy    = mapComp.defaultMayBuy;
                    compGuest.chat      = mapComp.defaultInteractionMode == PrisonerInteractionModeDefOf.Chat;
                    compGuest.GuestArea = mapComp.defaultAreaRestriction;
                }
            });

            bool gotTrader = false;

            if (Rand.Value < 0.75f)
            {
                gotTrader = TryConvertOnePawnToSmallTrader(pawns, faction, map);
            }
            string label;
            string description;
            Pawn   pawn = pawns.Find(x => faction.leader == x);

            if (pawns.Count == 1)
            {
                string traderDesc = (!gotTrader) ? string.Empty : "SingleVisitorArrivesTraderInfo".Translate();
                string leaderDesc = (pawn == null) ? string.Empty : "SingleVisitorArrivesLeaderInfo".Translate();
                label       = "LetterLabelSingleVisitorArrives".Translate();
                description = "SingleVisitorArrives".Translate(new object[]
                {
                    pawns[0].GetTitle().ToLower(),
                    faction.Name,
                    pawns[0].Name,
                    traderDesc,
                    leaderDesc
                });
                description = description.AdjustedFor(pawns[0]);
            }
            else
            {
                string traderDesc = (!gotTrader) ? string.Empty : "GroupVisitorsArriveTraderInfo".Translate();
                string leaderDesc = (pawn == null) ? string.Empty : "GroupVisitorsArriveLeaderInfo".Translate(new object[] { pawn.LabelShort });
                label       = "LetterLabelGroupVisitorsArrive".Translate();
                description = "GroupVisitorsArrive".Translate(new object[]
                {
                    faction.Name,
                    traderDesc,
                    leaderDesc
                });
            }
            Find.LetterStack.ReceiveLetter(label, description, LetterDefOf.Good, pawns[0]);
        }
Пример #10
0
        public void TransferColonists(bool toPlayer)
        {
            if (toPlayer)
            {
                foreach (var p in friendlyPawns)
                {
                    if (p != null && !p.Dead)
                    {
                        p.SetFaction(Faction.OfPlayer);
                        p.playerSettings.hostilityResponse = HostilityResponseMode.Attack;
                    }
                }
            }
            else
            {
                Lord lord = LordMaker.MakeNewLord(settlement.Faction, new LordJob_DefendBase(settlement.Faction, settlement.Map.Center), settlement.Map);

                foreach (var p in friendlyPawns)
                {
                    if (p != null)
                    {
                        p.SetFaction(settlement.Faction);

                        if (!p.Dead && !p.Downed)
                        {
                            lord.AddPawn(p);
                        }
                    }
                }
            }
        }
        public override void Resolve(ResolveParams rp)
        {
            int? mechanoidsCount = rp.mechanoidsCount;
            int  num             = (!mechanoidsCount.HasValue) ? SymbolResolver_RandomMechanoidGroup.DefaultMechanoidCountRange.RandomInRange : mechanoidsCount.Value;
            Lord lord            = rp.singlePawnLord;

            if (lord == null && num > 0)
            {
                Map     map     = BaseGen.globalSettings.map;
                IntVec3 point   = default(IntVec3);
                LordJob lordJob = (!Rand.Bool || !(from x in rp.rect.Cells
                                                   where !x.Impassable(map)
                                                   select x).TryRandomElement <IntVec3>(out point)) ? ((LordJob) new LordJob_AssaultColony(Faction.OfMechanoids, false, false, false, false, false)) : ((LordJob) new LordJob_DefendPoint(point));
                lord = LordMaker.MakeNewLord(Faction.OfMechanoids, lordJob, map, null);
            }
            for (int i = 0; i < num; i++)
            {
                PawnKindDef pawnKindDef = rp.singlePawnKindDef;
                if (pawnKindDef == null)
                {
                    pawnKindDef = (from kind in DefDatabase <PawnKindDef> .AllDefsListForReading
                                   where kind.RaceProps.IsMechanoid
                                   select kind).RandomElementByWeight((PawnKindDef kind) => (float)(1.0 / kind.combatPower));
                }
                ResolveParams resolveParams = rp;
                resolveParams.singlePawnKindDef = pawnKindDef;
                resolveParams.singlePawnLord    = lord;
                resolveParams.faction           = Faction.OfMechanoids;
                BaseGen.symbolStack.Push("pawn", resolveParams);
            }
        }
Пример #12
0
        public void SetPlace(CaravanAI caravanAI, Caravan playerCaravan, IntVec3 mapSize)
        {
            MapSize = mapSize;

            this.caravanAI = caravanAI;
            aiFaction      = caravanAI.Faction;
            aiTarget       = caravanAI.pather.Destination;
            aiAction       = caravanAI.pather.ArrivalAction;

            this.playerCaravan = playerCaravan;
            List <Pawn> aiPawns = new List <Pawn>(caravanAI.pawns);

            caravanAI.Tile     = Tile;
            playerCaravan.Tile = Tile;

            Map map = GetOrGenerateMap(Tile, MapSize, null);

            Find.TickManager.Notify_GeneratedPotentiallyHostileMap();

            MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out IntVec3 first, out IntVec3 second);

            CaravanEnterMapUtility.Enter(caravanAI, map, x => CellFinder.RandomSpawnCellForPawnNear(first, map), CaravanDropInventoryMode.DoNotDrop);
            CaravanEnterMapUtility.Enter(playerCaravan, map, x => CellFinder.RandomSpawnCellForPawnNear(second, map), CaravanDropInventoryMode.DoNotDrop);

            LordJob lordJob = new LordJob_AssaultColony(caravanAI.Faction, canKidnap: true, canTimeoutOrFlee: false);

            LordMaker.MakeNewLord(caravanAI.Faction, lordJob, map, aiPawns);

            winner = CaravanBattleWinner.None;

            Find.LetterStack.ReceiveLetter("CaravanBattlePlacePlace_BattleStarted".Translate(), "CaravanBattlePlacePlace_BattleDescription".Translate(playerCaravan.Name, caravanAI.Name), LetterDefOf.ThreatBig);
        }
Пример #13
0
            internal void <> m__3()
            {
                Pawn                t        = this.caravan.PawnsListForReading[0];
                Faction             faction  = this.faction;
                Faction             ofPlayer = Faction.OfPlayer;
                FactionRelationKind kind     = FactionRelationKind.Hostile;
                string              reason   = "GoodwillChangedReason_AttackedCaravan".Translate();

                faction.TrySetRelationKind(ofPlayer, kind, true, reason, new GlobalTargetInfo?(t));
                Map     map = CaravanIncidentUtility.GetOrGenerateMapForIncident(this.caravan, new IntVec3(100, 1, 100), WorldObjectDefOf.AttackedNonPlayerCaravan);
                IntVec3 playerSpot;
                IntVec3 enemySpot;

                MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out playerSpot, out enemySpot);
                CaravanEnterMapUtility.Enter(this.caravan, map, (Pawn p) => CellFinder.RandomClosewalkCellNear(playerSpot, map, 12, null), CaravanDropInventoryMode.DoNotDrop, true);
                List <Pawn> list = this.metCaravan.PawnsListForReading.ToList <Pawn>();

                CaravanEnterMapUtility.Enter(this.metCaravan, map, (Pawn p) => CellFinder.RandomClosewalkCellNear(enemySpot, map, 12, null), CaravanDropInventoryMode.DoNotDrop, false);
                LordMaker.MakeNewLord(this.faction, new LordJob_DefendAttackedTraderCaravan(list[0].Position), map, list);
                Find.TickManager.CurTimeSpeed = TimeSpeed.Paused;
                CameraJumper.TryJumpAndSelect(t);
                PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter_Send(list, "LetterRelatedPawnsGroupGeneric".Translate(new object[]
                {
                    Faction.OfPlayer.def.pawnsPlural
                }), LetterDefOf.NeutralEvent, true, true);
            }
Пример #14
0
        private static Gizmo CreateGizmo_SearchAndDestroy(Pawn __instance, ExtendedPawnData pawnData)
        {
            string disabledReason = "";
            bool   disabled       = false;

            if (__instance.Downed)
            {
                disabled       = true;
                disabledReason = "WTH_Reason_MechanoidDowned".Translate();
            }
            else if (__instance.ShouldRecharge())
            {
                disabled       = true;
                disabledReason = "WTH_Reason_PowerLow".Translate();
            }
            else if (__instance.ShouldBeMaintained())
            {
                disabled       = true;
                disabledReason = "WTH_Reason_MaintenanceLow".Translate();
            }
            Gizmo gizmo = new Command_Toggle
            {
                defaultLabel   = "WTH_Gizmo_SearchAndDestroy_Label".Translate(),
                defaultDesc    = "WTH_Gizmo_SearchAndDestroy_Description".Translate(),
                disabled       = disabled,
                disabledReason = disabledReason,
                icon           = ContentFinder <Texture2D> .Get(("UI/" + "Enable_SD"), true),
                isActive       = () => pawnData.isActive,
                toggleAction   = () =>
                {
                    pawnData.isActive = !pawnData.isActive;
                    if (pawnData.isActive)
                    {
                        if (__instance.GetLord() == null || __instance.GetLord().LordJob == null)
                        {
                            LordMaker.MakeNewLord(Faction.OfPlayer, new LordJob_SearchAndDestroy(), __instance.Map, new List <Pawn> {
                                __instance
                            });
                        }
                        __instance.jobs.EndCurrentJob(JobCondition.InterruptForced);
                        if (__instance.relations == null) //Added here to fix existing saves.
                        {
                            __instance.relations = new Pawn_RelationsTracker(__instance);
                        }
                    }
                    else
                    {
                        __instance.jobs.EndCurrentJob(JobCondition.InterruptForced);
                        Building_BaseMechanoidPlatform closestAvailablePlatform = Utilities.GetAvailableMechanoidPlatform(__instance, __instance);
                        if (closestAvailablePlatform != null)
                        {
                            Job job = new Job(WTH_DefOf.WTH_Mechanoid_Rest, closestAvailablePlatform);
                            __instance.jobs.TryTakeOrderedJob(job);
                        }
                    }
                }
            };

            return(gizmo);
        }
Пример #15
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map         map = (Map)parms.target;
            PawnKindDef pawnKindDef;

            if (!this.TryFindAnimalKind(map.Tile, out pawnKindDef))
            {
                return(false);
            }
            IntVec3 intVec;
            IntVec3 near;

            if (!this.TryFindStartAndEndCells(map, out intVec, out near))
            {
                return(false);
            }
            Rot4        rot  = Rot4.FromAngleFlat((map.Center - intVec).AngleFlat);
            List <Pawn> list = this.GenerateAnimals(pawnKindDef, map.Tile);

            for (int i = 0; i < list.Count; i++)
            {
                Pawn    newThing = list[i];
                IntVec3 loc      = CellFinder.RandomClosewalkCellNear(intVec, map, 10, null);
                GenSpawn.Spawn(newThing, loc, map, rot, WipeMode.Vanish, false);
            }
            LordMaker.MakeNewLord(null, new LordJob_ExitMapNear(near, LocomotionUrgency.Walk, 12f, false, false), map, list);
            string text  = string.Format(this.def.letterText, pawnKindDef.GetLabelPlural(-1)).CapitalizeFirst();
            string label = string.Format(this.def.letterLabel, pawnKindDef.GetLabelPlural(-1).CapitalizeFirst());

            Find.LetterStack.ReceiveLetter(label, text, this.def.letterDef, list[0], null, null);
            return(true);
        }
        public static bool TryStartGathering(Map map)
        {
            Pawn organizer = GatheringsUtility.FindRandomGatheringOrganizer(Faction.OfPlayer, map, GatheringDefOf.Party);


            //Pawn pawn = PartyUtility.FindRandomPartyOrganizer(Faction.OfPlayer, map);
            if (organizer == null)
            {
                Messages.Message("ElectionFail_ColonistsNotFound", MessageTypeDefOf.RejectInput);

                return(false);
            }

            IntVec3 intVec;

            //RCellFinder.TryFindGatheringSpot(pawn, GatheringDef.Named(""), intVec)
            if (!RCellFinder.TryFindGatheringSpot(organizer, GatheringDefOf.Party, out intVec))
            {
                Messages.Message("Couldn't find a suitable safe spot for the election.", MessageTypeDefOf.RejectInput);

                return(false);
            }
            LordMaker.MakeNewLord(organizer.Faction, new LordJob_Joinable_SetLeadership(intVec), map, null);
            Find.LetterStack.ReceiveLetter("Election", "ElectionGathering", LetterDefOf.PositiveEvent, new TargetInfo(intVec, map, false), null);
            return(true);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            if (!base.TryResolveParms(parms))
            {
                return(false);
            }
            if (parms.faction.HostileTo(Faction.OfPlayer))
            {
                return(false);
            }
            List <Pawn> list = base.SpawnPawns(parms);

            if (list.Count == 0)
            {
                return(false);
            }
            for (int i = 0; i < list.Count; i++)
            {
                if (list[i].needs != null && list[i].needs.food != null)
                {
                    list[i].needs.food.CurLevel = list[i].needs.food.MaxLevel;
                }
            }
            TraderKindDef traderKindDef = null;

            for (int j = 0; j < list.Count; j++)
            {
                Pawn pawn = list[j];
                if (pawn.TraderKind != null)
                {
                    traderKindDef = pawn.TraderKind;
                    break;
                }
            }
            string label = "LetterLabelTraderCaravanArrival".Translate(new object[]
            {
                parms.faction.Name,
                traderKindDef.label
            }).CapitalizeFirst();
            string text = "LetterTraderCaravanArrival".Translate(new object[]
            {
                parms.faction.Name,
                traderKindDef.label
            }).CapitalizeFirst();

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref label, ref text, "LetterRelatedPawnsNeutralGroup".Translate(new object[]
            {
                Faction.OfPlayer.def.pawnsPlural
            }), true, true);
            Find.LetterStack.ReceiveLetter(label, text, LetterDefOf.PositiveEvent, list[0], parms.faction, null);
            IntVec3 chillSpot;

            RCellFinder.TryFindRandomSpotJustOutsideColony(list[0], out chillSpot);
            LordJob_TradeWithColony lordJob = new LordJob_TradeWithColony(parms.faction, chillSpot);

            LordMaker.MakeNewLord(parms.faction, lordJob, map, list);
            return(true);
        }
Пример #18
0
 public static void StartFormingCaravan(List <Pawn> pawns, List <Pawn> downedPawns, Faction faction, List <TransferableOneWay> transferables, IntVec3 meetingPoint, IntVec3 exitSpot, int startingTile, int destinationTile)
 {
     if (startingTile < 0)
     {
         Log.Error("Can't start forming caravan because startingTile is invalid.");
     }
     else if (!pawns.Any())
     {
         Log.Error("Can't start forming caravan with 0 pawns.");
     }
     else
     {
         if (pawns.Any((Pawn x) => x.Downed))
         {
             Log.Warning("Forming a caravan with a downed pawn. This shouldn't happen because we have to create a Lord.");
         }
         List <TransferableOneWay> list = transferables.ToList();
         list.RemoveAll((TransferableOneWay x) => x.CountToTransfer <= 0 || !x.HasAnyThing || x.AnyThing is Pawn);
         for (int i = 0; i < pawns.Count; i++)
         {
             pawns[i].GetLord()?.Notify_PawnLost(pawns[i], PawnLostCondition.ForcedToJoinOtherLord);
         }
         LordJob_FormAndSendCaravan lordJob = new LordJob_FormAndSendCaravan(list, downedPawns, meetingPoint, exitSpot, startingTile, destinationTile);
         LordMaker.MakeNewLord(Faction.OfPlayer, lordJob, pawns[0].MapHeld, pawns);
         for (int j = 0; j < pawns.Count; j++)
         {
             Pawn pawn = pawns[j];
             if (pawn.Spawned)
             {
                 pawn.jobs.EndCurrentJob(JobCondition.InterruptForced);
             }
         }
     }
 }
 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);
 }
        public virtual void MakeLords(IncidentParms parms, List <Pawn> pawns)
        {
            Map map = (Map)parms.target;
            List <List <Pawn> > list = IncidentParmsUtility.SplitIntoGroups(pawns, parms.pawnGroups);
            int @int = Rand.Int;

            for (int i = 0; i < list.Count; i++)
            {
                List <Pawn> list2 = list[i];
                Lord        lord  = LordMaker.MakeNewLord(parms.faction, this.MakeLordJob(parms, map, list2, @int), map, list2);
                if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer))
                {
                    Log.Message(string.Concat(new object[]
                    {
                        "Market value threshold to start stealing (raiders=",
                        lord.ownedPawns.Count,
                        "): ",
                        StealAIUtility.StartStealingMarketValueThreshold(lord),
                        " (colony wealth=",
                        map.wealthWatcher.WealthTotal,
                        ")"
                    }), false);
                }
            }
        }
Пример #21
0
        public override void EjectContents()
        {
            bool         contentsKnown = base.contentsKnown;
            List <Thing> list          = null;

            if (!contentsKnown)
            {
                list = new List <Thing>();
                list.AddRange(innerContainer);
                list.AddRange(UnopenedCasketsInGroup().SelectMany((Building_AncientCryptosleepCasket c) => c.innerContainer));
                list.RemoveDuplicates();
            }
            base.EjectContents();
            if (!contentsKnown)
            {
                ThingDef filth_Slime = ThingDefOf.Filth_Slime;
                FilthMaker.TryMakeFilth(base.Position, base.Map, filth_Slime, Rand.Range(8, 12));
                SetFaction(null);
                foreach (Building_AncientCryptosleepCasket item in UnopenedCasketsInGroup())
                {
                    item.contentsKnown = true;
                    item.EjectContents();
                }
                IEnumerable <Pawn> enumerable = from p in list.OfType <Pawn>().ToList()
                                                where p.RaceProps.Humanlike && p.GetLord() == null && p.Faction == Faction.OfAncientsHostile
                                                select p;
                if (enumerable.Any())
                {
                    LordMaker.MakeNewLord(Faction.OfAncientsHostile, new LordJob_AssaultColony(Faction.OfAncientsHostile, canKidnap: false, canTimeoutOrFlee: true, sappers: false, useAvoidGridSmart: false, canSteal: false), base.Map, enumerable);
                }
            }
        }
        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 bool TryStartParty()
        {
            Pawn    pawn = PartyUtility.FindRandomPartyOrganizer(Faction.OfPlayer, this.map);
            bool    result;
            IntVec3 intVec;

            if (pawn == null)
            {
                result = false;
            }
            else if (!RCellFinder.TryFindPartySpot(pawn, out intVec))
            {
                result = false;
            }
            else
            {
                LordMaker.MakeNewLord(pawn.Faction, new LordJob_Joinable_Party(intVec, pawn), this.map, null);
                Find.LetterStack.ReceiveLetter("LetterLabelNewParty".Translate(), "LetterNewParty".Translate(new object[]
                {
                    pawn.LabelShort
                }), LetterDefOf.PositiveEvent, new TargetInfo(intVec, this.map, false), null, null);
                this.lastLordStartTick = Find.TickManager.TicksGame;
                this.startPartyASAP    = false;
                result = true;
            }
            return(result);
        }
        public static void StartFormingCaravan(List <Pawn> pawns, List <Pawn> downedPawns, Faction faction, List <TransferableOneWay> transferables,
                                               IntVec3 meetingPoint, IntVec3 exitSpot, int startingTile, int destinationTile)
        {
            if (startingTile < 0)
            {
                Log.Error("Can't start forming caravan because startingTile is invalid.");
                return;
            }
            if (!pawns.NotNullAndAny())
            {
                Log.Error("Can't start forming caravan with 0 pawns.");
                return;
            }
            if (!pawns.NotNullAndAny(x => x is VehiclePawn))
            {
                Log.Error("Can't start forming vehicle caravan without any vehicles");
                return;
            }

            if (pawns.NotNullAndAny(x => x is VehiclePawn vehicle && vehicle.IsBoat() && (vehicle.movementStatus is VehicleMovementStatus.Online)))
            {
                List <TransferableOneWay> list = transferables;
                list.RemoveAll((TransferableOneWay x) => x.CountToTransfer <= 0 || !x.HasAnyThing || x.AnyThing is Pawn);

                foreach (Pawn p in pawns)
                {
                    Lord pLord = p.GetLord();
                    if (pLord != null)
                    {
                        pLord.Notify_PawnLost(p, PawnLostCondition.ForcedToJoinOtherLord, null);
                    }
                }
                List <VehiclePawn> vehicles     = pawns.Where(p => p.IsBoat()).Cast <VehiclePawn>().ToList();
                List <Pawn>        capablePawns = pawns.Where(x => !(x is VehiclePawn) && x.IsColonist && !x.Downed && !x.Dead).ToList();
                List <Pawn>        prisoners    = pawns.Where(x => !(x is VehiclePawn) && !x.IsColonist && !x.RaceProps.Animal).ToList();
                int seats = 0;
                foreach (VehiclePawn vehicle in vehicles)
                {
                    seats += vehicle.SeatsAvailable;
                }
                if ((pawns.Where(p => !p.IsBoat()).ToList().Count + downedPawns.Count) > seats)
                {
                    Log.Error("Can't start forming caravan with vehicles(s) selected and not enough seats to house all pawns. Seats: " + seats + " Pawns boarding: " +
                              (pawns.Where(x => !(x is VehiclePawn)).ToList().Count + downedPawns.Count));
                    return;
                }

                LordJob_FormAndSendVehicles lordJob = new LordJob_FormAndSendVehicles(list, vehicles, capablePawns, downedPawns, prisoners, meetingPoint, exitSpot, startingTile,
                                                                                      destinationTile, true);
                LordMaker.MakeNewLord(Faction.OfPlayer, lordJob, pawns[0].MapHeld, pawns);
                vehicles.ForEach(v => v.DisembarkAll());

                foreach (Pawn p in pawns)
                {
                    if (p.Spawned)
                    {
                        p.jobs.EndCurrentJob(JobCondition.InterruptForced, true);
                    }
                }
            }
        private bool TryAccept()
        {
            List <Pawn> pawnsFromTransferables = TransferableUtility.GetPawnsFromTransferables(this.transferables);

            if (!this.CheckForErrors(pawnsFromTransferables))
            {
                Cthulhu.Utility.DebugReport("TryAccept Failed");
                return(false);
            }
            Cthulhu.Utility.DebugReport("TryAccept Succeeded");
            int transportersGroup = this.CreateAndAssignNewTransportersGroup();

            this.AssignTransferablesToRandomTransporters();
            IEnumerable <Pawn> enumerable = from x in pawnsFromTransferables
                                            where x.IsColonist && !x.Downed
                                            select x;

            if (enumerable.Any <Pawn>())
            {
                Cthulhu.Utility.DebugReport("Pawn List Succeeded");
                LordMaker.MakeNewLord(Faction.OfPlayer, new LordJob_LoadAndEnterTransportersPawn(transportersGroup),
                                      this.map, enumerable);
                foreach (Pawn current in enumerable)
                {
                    if (current.Spawned)
                    {
                        current.jobs.EndCurrentJob(JobCondition.InterruptForced, true);
                    }
                }
            }
            Messages.Message("MessageTransportersLoadingProcessStarted".Translate(), this.transporters[0].parent,
                             MessageTypeDefOf.PositiveEvent);
            return(true);
        }
Пример #26
0
        private static void UnHackMechanoid(Pawn pawn)
        {
            if (pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_TargetingHackedPoorly))
            {
                pawn.health.RemoveHediff(pawn.health.hediffSet.GetFirstHediffOfDef(WTH_DefOf.WTH_TargetingHackedPoorly));
            }
            if (pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_TargetingHacked))
            {
                pawn.health.RemoveHediff(pawn.health.hediffSet.GetFirstHediffOfDef(WTH_DefOf.WTH_TargetingHacked));
            }
            if (pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_BackupBattery))
            {
                pawn.health.RemoveHediff(pawn.health.hediffSet.GetFirstHediffOfDef(WTH_DefOf.WTH_BackupBattery));
            }
            if (pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_VeryLowPower))
            {
                pawn.health.RemoveHediff(pawn.health.hediffSet.GetFirstHediffOfDef(WTH_DefOf.WTH_VeryLowPower));
            }
            if (pawn.health.hediffSet.HasHediff(WTH_DefOf.WTH_NoPower))
            {
                pawn.health.RemoveHediff(pawn.health.hediffSet.GetFirstHediffOfDef(WTH_DefOf.WTH_NoPower));
            }

            pawn.SetFaction(Faction.OfMechanoids);
            pawn.story = null;
            if (pawn.GetLord() == null || pawn.GetLord().LordJob == null)
            {
                LordMaker.MakeNewLord(Faction.OfMechanoids, new LordJob_AssaultColony(Faction.OfMechanoids, true, true, false, false, true), pawn.Map, new List <Pawn> {
                    pawn
                });
            }
            Find.LetterStack.ReceiveLetter("WTH_Letter_Mech_Reverted_Label".Translate(), "WTH_Letter_Mech_Reverted_Description".Translate(), LetterDefOf.ThreatBig, pawn);
        }
Пример #27
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);
        }
Пример #28
0
        private static void HealToStanding(Pawn pawn, BodyPartRecord part)
        {
            bool  shouldStop  = false;
            float extraHealth = 100f; //TODO: no magic number;

            extraHealth *= pawn.HealthScale;
            float healPerIteration = 10f;
            float totalExtraHealed = 0f;
            int   guard            = 0;

            while (totalExtraHealed <= extraHealth && guard < 1000)
            {
                Hediff_Injury hediff_Injury = pawn.health.hediffSet.GetHediffs <Hediff_Injury>().Where(new Func <Hediff_Injury, bool>(HediffUtility.CanHealNaturally)).RandomElement <Hediff_Injury>();
                if (hediff_Injury == null || !pawn.Downed)
                {
                    shouldStop = true;
                }
                hediff_Injury.Heal(healPerIteration);
                if (shouldStop)
                {
                    totalExtraHealed += healPerIteration;
                }
                guard++;
            }
            pawn.jobs.EndCurrentJob(JobCondition.InterruptForced);
            if (pawn.GetLord() == null || pawn.GetLord().LordJob == null)
            {
                LordMaker.MakeNewLord(Faction.OfPlayer, new LordJob_SearchAndDestroy(), pawn.Map, new List <Pawn> {
                    pawn
                });
            }
            Find.LetterStack.ReceiveLetter("WTH_Letter_HealedToStanding_Label".Translate(), "WTH_Letter_HealedToStanding_Description".Translate(), LetterDefOf.ThreatBig, pawn);
        }
Пример #29
0
        private static void SendCaravan(FCEvent evt)
        {
            Map playerHomeMap = Find.World.GetComponent <FactionFC>().TaxMap;

            if (DoDelayCaravanDueToDanger(evt))
            {
                return;
            }

            MakeDeliveryLetterAndMessage(evt);
            List <Pawn> pawns = new List <Pawn>();

            while (evt.goods.Count() > 0)
            {
                Pawn  pawn = PawnGenerator.GeneratePawn(FCPawnGenerator.WorkerOrMilitaryRequest());
                Thing next = evt.goods.First();

                if (pawn.carryTracker.innerContainer.TryAdd(next))
                {
                    evt.goods.Remove(next);
                }

                pawns.Add(pawn);
            }

            PawnsArrivalModeWorker_EdgeWalkIn pawnsArrivalModeWorker = new PawnsArrivalModeWorker_EdgeWalkIn();
            IncidentParms parms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.FactionArrival, playerHomeMap);

            parms.spawnRotation = Rot4.FromAngleFlat((((Map)parms.target).Center - parms.spawnCenter).AngleFlat);

            RCellFinder.TryFindRandomPawnEntryCell(out parms.spawnCenter, playerHomeMap, CellFinder.EdgeRoadChance_Friendly);

            pawnsArrivalModeWorker.Arrive(pawns, parms);
            LordMaker.MakeNewLord(FCPawnGenerator.WorkerOrMilitaryRequest().Faction, new LordJob_DeliverSupplies(parms.spawnCenter), playerHomeMap, pawns);
        }
Пример #30
0
        public override void Resolve(ResolveParams rp)
        {
            var kindStr = "RE_GKind";

            BaseGen.symbolStack.Push("indoorLighting", rp);
            if (Rand.Value < 0.05f)
            {
                BaseGen.symbolStack.Push("randomlyPlaceMealsOnTables", rp);
                BaseGen.symbolStack.Push("placeChairsNearTables", rp);
                int num = Mathf.Max(GenMath.RoundRandom((float)rp.rect.Area / 20f), 1);
                for (int i = 0; i < num; i++)
                {
                    ResolveParams resolveParams = rp;
                    resolveParams.singleThingDef = ThingDefOf.Table2x2c;
                    BaseGen.symbolStack.Push("thing", resolveParams);
                }
            }
            else
            {
                var map = BaseGen.globalSettings.map;
                MiscUtility.SpawnHerbsAtRect(rp.rect, map, 4, 6);
            }
            var monsterParams = rp;

            monsterParams.rect = rp.rect;
            monsterParams.pawnGroupMakerParams = null;
            monsterParams.singlePawnKindDef    = PawnKindDef.Named(kindStr);
            Lord singlePawnLord = LordMaker.MakeNewLord(monsterParams.faction, new LordJob_DefendPoint(monsterParams.rect.CenterCell), BaseGen.globalSettings.map);

            monsterParams.singlePawnLord = singlePawnLord;
            BaseGen.symbolStack.Push("pawn", monsterParams);
        }