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); }
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); }
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); }
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); }
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); }
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();