public override void OnSucessfullCast(Saveable_Caster pawn, IEnumerable <Thing> targets, IExposable effectState) { List <Pawn> newPawns = new List <Pawn>(); foreach (PawnKindDef pawnKind in this.pawnKinds) { Pawn newPawn = PawnGenerator.GeneratePawn(pawnKind, pawn.pawn.Faction); IntVec3 loc = CellFinder.RandomClosewalkCellNear(pawn.pawn.Position, this.range); GenSpawn.Spawn(newPawn, loc); newPawns.Add(newPawn); if (this.spawnedMote != null) { this.spawnedMote.AbilityStarted(pawn, newPawn); } } Brain brain = pawn.pawn.GetSquadBrain(); if (brain == null) { StateGraph squadBrainStateGraph = GraphMaker.AssaultColonyGraph(pawn.pawn.Faction, false, false); newPawns.Insert(0, pawn.pawn); BrainMaker.MakeNewBrain(pawn.pawn.Faction, squadBrainStateGraph, newPawns); } else { foreach (Pawn newPawn in newPawns) { brain.AddPawn(newPawn); } } }
internal static void Discover(Pawn pawn, IntVec3 position) { Log.Message(pawn.Name + ": Discovered."); pawn.kindDef = Verse.PawnKindDef.Named("MechanoidAgent"); pawn.SetFactionDirect(Faction.OfMechanoids); pawn.health.GetType() .GetField("healthState", BindingFlags.NonPublic | BindingFlags.Instance) .SetValue(pawn.health, PawnHealthState.Mobile); Log.Message("Revived"); //TaleRecorder.RecordTale(TaleDef.Named("ExposedAgent"), new object[] { newPawn }); pawn.pather = new Pawn_PathFollower(pawn); pawn.jobs = new Pawn_JobTracker(pawn); pawn.stances = new Pawn_StanceTracker(pawn); pawn.mindState = new Pawn_MindState(pawn); pawn.carrier = new Pawn_CarryTracker(pawn); pawn.drafter = new Pawn_DraftController(pawn); pawn.needs = new Pawn_NeedsTracker(pawn); pawn.workSettings = new Pawn_WorkSettings(pawn); pawn.outfits = new Pawn_OutfitTracker(pawn); pawn.timetable = new Pawn_TimetableTracker(); pawn.ownership = new Pawn_Ownership(pawn); pawn.thinker = new Pawn_Thinker(pawn); Log.Message(pawn.Name + ": New settings."); var agent = (MechanoidAgent)pawn; agent.discovered = true; agent.disguiseDamage = false; Log.Message("Agent settings."); typeof(Thing).GetField("thingStateInt", BindingFlags.NonPublic | BindingFlags.Instance) .SetValue(pawn, ThingState.Unspawned); GenPlace.TryPlaceThing(pawn, position, ThingPlaceMode.Direct); Log.Message(pawn.Name + ": Spawned new instance."); // Not discovered before? if (pawn.story.skinColor != Color.white) { Find.LetterStack.ReceiveLetter("Mechanoid Agent", pawn.Name + " has been exposed as a Mechanoid agent!", LetterType.BadUrgent, pawn); } //State singleState = new State_ExitMapNearest(); //StateGraph stateGraph = GraphMaker.SingleStateGraph(singleState); //BrainMaker.MakeNewBrain(Faction.OfMechanoids, stateGraph, new[] {pawn}); pawn.ClearMind(); var brain = BrainMaker.MakeNewBrain(Faction.OfMechanoids, CreateAttackGraph(), new[] { pawn }); Log.Message(pawn.Name + ": " + pawn.mindState.Active); }
public void LaunchInvasion(string eventTitle, string eventText, float raidPointsFactor, int dropsNumber, LetterType letterType, IntVec3 spawnPosition) { this.invasionIsDone = true; // Get an indicative amount of points based on the colony wealth so it scales up well for late-game colonies. IncidentParms invasionParameters = IncidentMakerUtility.DefaultParmsNow(Find.Storyteller.def, IncidentCategory.ThreatBig); invasionParameters.faction = Faction.OfMechanoids; invasionParameters.raidStrategy = RaidStrategyDefOf.ImmediateAttack; invasionParameters.raidArrivalMode = PawnsArriveMode.EdgeDrop; invasionParameters.raidNeverFleeIndividual = true; invasionParameters.raidPodOpenDelay = 800; if (dropsNumber > 0) { invasionParameters.points *= (raidPointsFactor / dropsNumber); if (invasionParameters.points < 320) { invasionParameters.points = 320; } for (int dropIndex = 0; dropIndex < dropsNumber; dropIndex++) { IntVec3 dropPodSpawningPosition; float squadPoint = invasionParameters.points; if (spawnPosition.IsValid) { invasionParameters.spawnCenter = spawnPosition; } else { RCellFinder.TryFindRandomPawnEntryCell(out invasionParameters.spawnCenter); } List <Pawn> mechanoidsList = new List <Pawn>(); while (squadPoint >= PawnKindDef.Named("Scyther").combatPower) { bool validDropPodCellIsFound = DropCellFinder.TryFindDropSpotNear(invasionParameters.spawnCenter, out dropPodSpawningPosition, false, true); if (validDropPodCellIsFound) { Faction faction = Faction.OfMechanoids; Pawn squadMember; if (Rand.Value < 0.6f) { squadMember = PawnGenerator.GeneratePawn(PawnKindDef.Named("Scyther"), faction); squadPoint -= PawnKindDef.Named("Scyther").combatPower; } else { squadMember = PawnGenerator.GeneratePawn(PawnKindDef.Named("Centipede"), faction); squadPoint -= (int)PawnKindDef.Named("Centipede").combatPower; } mechanoidsList.Add(squadMember); DropPodUtility.MakeDropPodAt(dropPodSpawningPosition, new DropPodInfo { SingleContainedThing = squadMember, openDelay = 800, leaveSlag = true }); } } StateGraph stateGraph = GraphMaker.AssaultColonyGraph(Faction.OfMechanoids, false, false); BrainMaker.MakeNewBrain(Faction.OfMechanoids, stateGraph, mechanoidsList); } } Find.LetterStack.ReceiveLetter(eventTitle, eventText, letterType, this.Position); }
protected override IEnumerable <Toil> MakeNewToils() { yield return(Toils_Reserve.Reserve(terraformerIndex)); yield return(Toils_Goto.GotoCell(terraformerIndex, PathEndMode.InteractionCell).FailOnDestroyed(terraformerIndex)); yield return(Toils_General.Wait(240).FailOnDestroyed(terraformerIndex)); Toil scytherScoutsArrivalToil = new Toil() { initAction = () => { IntVec3 spawningCell; List <Pawn> scytherScoutsList = new List <Pawn>(); for (int scytherIndex = 0; scytherIndex < 4; scytherIndex++) { bool validDropPodCellIsFound = DropCellFinder.TryFindDropSpotNear(this.TargetThingA.InteractionCell, out spawningCell, true, true); if (validDropPodCellIsFound) { Faction faction = Faction.OfMechanoids; Pawn scytherScout = PawnGenerator.GeneratePawn(PawnKindDef.Named("Scyther"), faction); scytherScoutsList.Add(scytherScout); DropPodUtility.MakeDropPodAt(spawningCell, new DropPodInfo { SingleContainedThing = scytherScout, openDelay = 600, leaveSlag = false }); } } StateGraph stateGraph = GraphMaker.MechanoidsDefendShipGraph(this.TargetThingA, defensiveRadiusAroundTerraformer); BrainMaker.MakeNewBrain(Faction.OfMechanoids, stateGraph, scytherScoutsList); }, defaultCompleteMode = ToilCompleteMode.Instant }; yield return(scytherScoutsArrivalToil); Toil pawnEscapingToil = new Toil() { initAction = () => { (this.TargetThingA as Building_MechanoidTerraformer).reverseEngineeringState = Building_MechanoidTerraformer.ReverseEngineeringState.BuildingNotSecured; ThingRequest thingRequest = new ThingRequest(); thingRequest.singleDef = ThingDefOf.CommsConsole; Thing commsConsole = GenClosest.ClosestThingReachable(pawn.Position, thingRequest, PathEndMode.InteractionCell, TraverseParms.For(pawn)); if (commsConsole != null) { pawn.pather.StartPath(commsConsole, PathEndMode.InteractionCell); } else { // The player has no comms console. He should move his colonist manually... and fast! pawn.pather.StartPath(pawn.Position, PathEndMode.OnCell); } string herHimOrIt = "it"; string sheHeOrIt = "it"; if (pawn.gender == Gender.Female) { herHimOrIt = "her"; sheHeOrIt = "she"; } else if (pawn.gender == Gender.Male) { herHimOrIt = "him"; sheHeOrIt = "he"; } string eventText = " " + pawn.Name.ToStringShort + " is just arriving near the strange building when " + sheHeOrIt + " hears the loud noise of incoming drop pods.\n\n" + "You should better take " + herHimOrIt + " to safety... and fast!\n"; Find.LetterStack.ReceiveLetter("Drop pods", eventText, LetterType.BadUrgent, this.pawn.Position); }, defaultCompleteMode = ToilCompleteMode.PatherArrival }; yield return(pawnEscapingToil); yield return(Toils_Reserve.Release(terraformerIndex)); }