Beispiel #1
0
        protected bool Execute(IncidentParms parms, Map map)
        {
            IntVec3 spawnSpot = IntVec3.Invalid;

            if (map != null && !CellFinder.TryFindRandomEdgeCellWith(vec => vec.Standable(map) && map.reachability.CanReachColony(vec), map, CellFinder.EdgeRoadChance_Ignore, out spawnSpot) ||
                !WanderingCaravansUtility.AllWanderingCaravansSpawnableInMap(map).TryRandomElementByWeight(animal => map.Biome.CommonalityOfAnimal(animal) / animal.wildGroupSize.Average
                                                                                                           , out PawnKindDef wanderingCaravanDef))
            {
                return(false);
            }
            IEnumerable <Pawn> wanderingCaravans = this.GenerateWanderingCaravans(wanderingCaravanDef);
            Pawn p = null;

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

            foreach (Pawn pawn in wanderingCaravans)
            {
                p = pawn;
                list.Add(p);
                GenSpawn.Spawn(pawn, CellFinder.RandomSpawnCellForPawnNear(spawnSpot, map), map, Rot4.Random);
            }
            //    this.SpawnPawns(wanderingCaravans, map, spawnSpot);

            base.SendStandardLetter(parms, list, wanderingCaravans.First().def.LabelCap);
            return(true);
        }
Beispiel #2
0
        private IEnumerable <Pawn> GenerateWanderingCaravans(PawnKindDef def)
        {
            int wanderingCaravansCount = def.RaceProps.wildness != 0 ? def.wildGroupSize.RandomInRange : Rand.Range(3, 9);

            for (int i = 0; i < wanderingCaravansCount; i++)
            {
                yield return(WanderingCaravansUtility.GenerateWanderingCaravan(def));
            }
        }
        protected virtual bool TryResolveParms(IncidentParms parms, out PawnKindDef chasedCaravan)
        {
            Map map = (Map)parms.target;

            chasedCaravan = null;
            return(CellFinder.TryFindRandomEdgeCellWith(c => map.reachability.CanReachColony(c), map, CellFinder.EdgeRoadChance_Neutral, out parms.spawnCenter) &&
                   Find.FactionManager.AllFactions.Where(f => !f.def.hidden && f.HostileTo(Faction.OfPlayer)).TryRandomElement(out parms.faction) &&
                   WanderingCaravansUtility.AllWanderingCaravansSpawnableInMap(map).TryRandomElement(out chasedCaravan));
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map         map           = (Map)parms.target;
            List <Pawn> pawns         = new List <Pawn>(WanderingCaravansUtility.SpawnedWanderingCaravansInMap(map));
            Pawn        targetCaravan = pawns.RandomElement();

            if (!this.TryResolveParms(parms, targetCaravan))
            {
                return(false);
            }
            IEnumerable <Pawn> retrieverPawns = this.SpawnPawns(IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms, true), parms.spawnCenter, map);

            LordMaker.MakeNewLord(parms.faction, new LordJob_RetrieveWanderingCaravan(targetCaravan), map, retrieverPawns);
            Find.LetterStack.ReceiveLetter("WanderingCaravan.CaravanReturnDemand_OptionTitle".Translate(), $"WanderingCaravan.CaravanReturnDemand_OptionText".Translate(parms.faction.def.pawnsPlural.CapitalizeFirst(), parms.faction.Name, parms.faction.def.pawnsPlural), LetterDefOf.NeutralEvent, pawns);
            return(true);
        }
Beispiel #5
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map  map           = (Map)parms.target;
            Pawn targetCaravan = WanderingCaravansUtility.SpawnedWanderingCaravansInMap(map).RandomElement();

            if (!this.TryResolveParms(parms, targetCaravan))
            {
                return(false);
            }
            IEnumerable <Pawn> retrieverPawns = this.SpawnPawns(IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms, true), parms.spawnCenter, map);

            LordMaker.MakeNewLord(parms.faction, new LordJob_RetrieveWanderingCaravan(targetCaravan), map, retrieverPawns);
            Find.LetterStack.ReceiveLetter("Wandering Caravan Retrieval", $"{parms.faction.def.pawnsPlural.CapitalizeFirst()} from {parms.faction.Name} have claimed ownership of a neaby wandering trade caravan and have come to retrieve it.\n\n"
                                           + $"You can let the {parms.faction.def.pawnsPlural} retrieve the caravan, or you can kill, tame or fight the {parms.faction.def.pawnsPlural} to make sure the wandering caravan stays near "
                                           + $"your colony so you can obtain its potentially valuable inventory!\n\nBe warned - if you kill or tame the wandering caravan, {parms.faction.Name} will be angered.", LetterDefOf.NeutralEvent, targetCaravan);
            return(true);
        }
Beispiel #6
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            if (!this.TryResolveParms(parms, out PawnKindDef chasedCaravanDef))
            {
                return(false);
            }
            DiaNode descDiaNode = new DiaNode($"A group of {parms.faction.def.pawnsPlural} from {parms.faction.Name} can be seen in the distance, and are chasing down a "
                                              + $"trade caravan carrying a potentially valuable inventory.\n\nYou can either defend the caravan from the {parms.faction.def.pawnsPlural} and obtain its "
                                              + $"inventory or let them have it.\n\nBe warned - if you accept, you'll have to fight off the {parms.faction.def.pawnsPlural} on its tail.");

            descDiaNode.options.Add(new DiaOption("Defend the caravan")
            {
                action = delegate
                {
                    Pawn chasedCaravan = WanderingCaravansUtility.GenerateWanderingCaravan(chasedCaravanDef);
                    chasedCaravan.SetFaction(Faction.OfPlayer);
                    GenSpawn.Spawn(chasedCaravan, parms.spawnCenter, map);
                    CameraJumper.TryJump(chasedCaravan);
                    IncidentParms incidentParams   = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, map);
                    incidentParams.forced          = true;
                    incidentParams.faction         = parms.faction;
                    incidentParams.raidStrategy    = RaidStrategyDefOf.ImmediateAttack;
                    incidentParams.raidArrivalMode = PawnsArrivalModeDefOf.EdgeWalkIn;
                    incidentParams.spawnCenter     = parms.spawnCenter;
                    incidentParams.points          = parms.points;
                    Find.Storyteller.incidentQueue.Add(new QueuedIncident(new FiringIncident(IncidentDefOf.RaidEnemy, null, incidentParams), Find.TickManager.TicksGame
                                                                          + new IntRange(1000, 2500).RandomInRange));
                },
                resolveTree = true
            });
            DiaNode rejectDiaNode = new DiaNode("The hunters have almost caught up to the caravan and will be able to obtain its potentially valuable items.");

            rejectDiaNode.options.Add(new DiaOption("OK")
            {
                resolveTree = true
            });
            descDiaNode.options.Add(new DiaOption($"Let the {parms.faction.def.pawnsPlural} have it")
            {
                link = rejectDiaNode
            });
            Find.WindowStack.Add(new Dialog_NodeTree(descDiaNode, true, true, "Wandering caravan chased to " + map.info.parent.Label));
            return(true);
        }
Beispiel #7
0
        protected bool Execute(IncidentParms parms, Map map)
        {
            IntVec3 spawnSpot = IntVec3.Invalid;

            if (map != null && !CellFinder.TryFindRandomEdgeCellWith(vec => vec.Standable(map) && map.reachability.CanReachColony(vec), map, CellFinder.EdgeRoadChance_Ignore, out spawnSpot) ||
                !WanderingCaravansUtility.AllWanderingCaravansSpawnableInMap(map).TryRandomElementByWeight(animal => map.Biome.CommonalityOfAnimal(animal) / animal.wildGroupSize.Average
                                                                                                           , out PawnKindDef wanderingCaravanDef))
            {
                return(false);
            }
            IEnumerable <Pawn> wanderingCaravans = this.GenerateWanderingCaravans(wanderingCaravanDef);

            this.SpawnPawns(wanderingCaravans, map, spawnSpot);
            Pawn infoPawn = wanderingCaravans.First();

            SendStandardLetter(parms, infoPawn, infoPawn.def.LabelCap);
            return(true);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            if (!this.TryResolveParms(parms, out PawnKindDef chasedCaravanDef))
            {
                return(false);
            }
            DiaNode descDiaNode = new DiaNode($"WanderingCaravan.CaravanChased_OptionText".Translate(parms.faction.def.pawnsPlural, parms.faction.Name));

            descDiaNode.options.Add(new DiaOption("WanderingCaravan.CaravanChased_OptionDefend".Translate())
            {
                action = delegate
                {
                    Pawn chasedCaravan = WanderingCaravansUtility.GenerateWanderingCaravan(chasedCaravanDef);
                    chasedCaravan.SetFaction(Faction.OfPlayer);
                    GenSpawn.Spawn(chasedCaravan, parms.spawnCenter, map);
                    CameraJumper.TryJump(chasedCaravan);
                    IncidentParms incidentParams   = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, map);
                    incidentParams.forced          = true;
                    incidentParams.faction         = parms.faction;
                    incidentParams.raidStrategy    = RaidStrategyDefOf.ImmediateAttack;
                    incidentParams.raidArrivalMode = PawnsArrivalModeDefOf.EdgeWalkIn;
                    incidentParams.spawnCenter     = parms.spawnCenter;
                    incidentParams.points          = parms.points;
                    Find.Storyteller.incidentQueue.Add(new QueuedIncident(new FiringIncident(IncidentDefOf.RaidEnemy, null, incidentParams), Find.TickManager.TicksGame
                                                                          + new IntRange(1000, 2500).RandomInRange));
                },
                resolveTree = true
            });
            DiaNode rejectDiaNode = new DiaNode("WanderingCaravan.CaravanChased_Rejected".Translate(parms.faction.def.pawnsPlural));

            rejectDiaNode.options.Add(new DiaOption("OK")
            {
                resolveTree = true
            });
            descDiaNode.options.Add(new DiaOption($"WanderingCaravan.CaravanChased_OptionReject".Translate(parms.faction.def.pawnsPlural))
            {
                link = rejectDiaNode
            });
            Find.WindowStack.Add(new Dialog_NodeTree(descDiaNode, true, true, "WanderingCaravan.CaravanChased_OptionTitle".Translate(map.info.parent.Label)));
            return(true);
        }
Beispiel #9
0
        protected bool Execute(Caravan caravan)
        {
            Map map = GetOrGenerateMapUtility.GetOrGenerateMap(caravan.Tile, DefDatabase <WorldObjectDef> .GetNamed("WanderingCaravanEncounter"));

            if (!WanderingCaravansUtility.AllWanderingCaravansSpawnableInMap(map).TryRandomElement(out PawnKindDef wanderingCaravanDef))
            {
                return(false);
            }
            MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out IntVec3 caravanSpot, out IntVec3 wanderingCaravansSpot);
            IEnumerable <Pawn> wanderingCaravans = this.GenerateWanderingCaravans(wanderingCaravanDef);
            Pawn    infoPawn = wanderingCaravans.First();
            DiaNode diaNode  = new DiaNode($"A wandering {infoPawn.LabelCap} has been spotted in the distance by {caravan.LabelCap}, with more wandering caravans possible following it.\n\nYou can "
                                           + $"ignore them, or you can tame or kill them to obtain their potentially valuable inventory.")
            {
                options =
                {
                    new DiaOption("Go and claim their inventory")
                    {
                        action = delegate
                        {
                            string plural = wanderingCaravans.Count() > 1 ? "ies" : "y";
                            CaravanEnterMapUtility.Enter(caravan, map, pawn => CellFinder.RandomSpawnCellForPawnNear(caravanSpot, map));
                            Messages.Message($"You have {TimedForcedExit.GetForceExitAndRemoveMapCountdownTimeLeftString(60000)} to claim the wandering {infoPawn.LabelCap}s inventor{plural} before the "
                                             + $"caravan is reformed.", infoPawn, MessageTypeDefOf.PositiveEvent);
                            ((WorldObject)map.ParentHolder).GetComponent <TimedForcedExit>().StartForceExitAndRemoveMapCountdown();
                        },
                        resolveTree = true
                    }, new DiaOption("Ignore them and continue")
                    {
                        resolveTree = true
                    }
                }
            };

            Find.WindowStack.Add(new Dialog_NodeTree(diaNode, true, false, $"Wandering {infoPawn.LabelCap} spotted"));
            this.SpawnPawns(wanderingCaravans, map, wanderingCaravansSpot);
            return(true);
        }
        protected bool Execute(Caravan caravan)
        {
            Map map = GetOrGenerateMapUtility.GetOrGenerateMap(caravan.Tile, DefDatabase <WorldObjectDef> .GetNamed("WanderingCaravanEncounter"));

            if (!WanderingCaravansUtility.AllWanderingCaravansSpawnableInMap(map).TryRandomElement(out PawnKindDef wanderingCaravanDef))
            {
                return(false);
            }
            MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out IntVec3 caravanSpot, out IntVec3 wanderingCaravansSpot);
            IEnumerable <Pawn> wanderingCaravans = this.GenerateWanderingCaravans(wanderingCaravanDef);
            Pawn    infoPawn = wanderingCaravans.First();
            DiaNode diaNode  = new DiaNode($"WanderingCaravan.WanderingCaravan_Spotted".Translate(infoPawn.LabelCap, caravan.LabelCap))
            {
                options =
                {
                    new DiaOption("WanderingCaravan.WanderingCaravan_Accept")
                    {
                        action = delegate
                        {
                            string plural = wanderingCaravans.Count() > 1 ? "ies" : "y";
                            CaravanEnterMapUtility.Enter(caravan, map, pawn => CellFinder.RandomSpawnCellForPawnNear(caravanSpot, map));
                            Messages.Message($"WanderingCaravan.WanderingCaravan_Accepted".Translate(TimedForcedExit.GetForceExitAndRemoveMapCountdownTimeLeftString(60000), infoPawn.LabelCap, plural), infoPawn, MessageTypeDefOf.PositiveEvent);
                            ((WorldObject)map.ParentHolder).GetComponent <TimedForcedExit>().StartForceExitAndRemoveMapCountdown();
                        },
                        resolveTree = true
                    }, new DiaOption("WanderingCaravan.WanderingCaravan_Reject".Translate())
                    {
                        resolveTree = true
                    }
                }
            };

            Find.WindowStack.Add(new Dialog_NodeTree(diaNode, true, false, $"WanderingCaravan.WanderingCaravan_Title".Translate(infoPawn.LabelCap)));
            this.SpawnPawns(wanderingCaravans, map, wanderingCaravansSpot);
            return(true);
        }
 protected override bool CanFireNowSub(IncidentParms parms) => WanderingCaravansUtility.SpawnedWanderingCaravansInMap((Map)parms.target).Any();