Beispiel #1
0
        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);
                }
            }
        }
Beispiel #2
0
        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);
        }
Beispiel #3
0
 public void Reproduce(Creature other)
 {
     if (Genotype.Compare(other.Genotype) > 1 - MAXGENDIFFREP)
     {
         GameManager.instance.SpawnCreature(BrainMaker.OneSizeBrain(this, this), Genotype);
     }
     else
     {
         Debug.Log("creature too different");
     }
 }
Beispiel #4
0
    public void SpawnCreature(GeneticCode GCode)
    {
        if (creatures.Count < MaxCreature)
        {
            Creature newCreature = Instantiate(toInst);

            newCreature.Init(BrainMaker.OneSizeBrain(newCreature), GCode, new Vector2(0, 0), new Vector2(1, 0));


            creatures.Add(newCreature);
        }
    }
        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);
        }
Beispiel #6
0
        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));
        }