public override bool TryExecute(IncidentParms parms)
 {
     IntVec3 dropCenter = CellFinderLoose.RandomCellWith((IntVec3 c) => GenGrid.Standable(c) && !Find.RoofGrid.Roofed(c) && !Find.FogGrid.IsFogged(c), 1000);
     GenSpawn.Spawn(ThingDef.Named("Thing_MeteorSpawner"), dropCenter);
     Find.LetterStack.ReceiveLetter("Meteor Shower Incoming", "A shower of meteoroids have entered the planets gravity well and come crashing down in a fiery explosion! weeee", LetterType.BadUrgent);
     return true;
 }
		public override bool TryExecute(IncidentParms parms)
		{
            Log.Message("IncidentWorker_ShipChunkDropInCave:TryExecute");
            if (Find.Map.Biome != Util_CaveBiome.CaveBiomeDef)
            {
                return base.TryExecute(parms);
            }
            
            IntVec3 firstChunkPosition = IntVec3.Invalid;
            TryFindShipChunkDropSpot(out firstChunkPosition);
            if (firstChunkPosition.IsValid)
            {
                // Spawn ship chunks.
                int partsCount = this.RandomCountToDrop;
                GenSpawn.Spawn(ThingDefOf.ShipChunk, firstChunkPosition);
                for (int shipShunkIndex = 0; shipShunkIndex < partsCount - 1; shipShunkIndex++)
                {
                    IntVec3 nexChunkPosition = IntVec3.Invalid;
                    TryFindShipChunkDropSpotNear(firstChunkPosition, out nexChunkPosition);
                    if (nexChunkPosition.IsValid)
                    {
                        GenSpawn.Spawn(ThingDefOf.ShipChunk, nexChunkPosition);
                    }
                }
                return true;
            }
            return false;
        }
 public override bool TryExecute(IncidentParms parms)
 {
     if (!TryResolveParms(parms))
     {
         return false;
     }
     var list = SpawnPawns(parms);
     if (list.Count == 0)
     {
         return false;
     }
     IntVec3 chillSpot;
     RCellFinder.TryFindRandomSpotJustOutsideColony(list[0], out chillSpot);
     var lordJob = new LordJob_VisitColony(parms.faction, chillSpot);
     LordMaker.MakeNewLord(parms.faction, lordJob, list);
     string label;
     string text2;
     if (list.Count == 1)
     {
         label = "LetterLabelSingleVisitorArrives".Translate();
         text2 = "SingleVisitorArrives".Translate(list[0].story.adulthood.title.ToLower(), parms.faction.Name,
             list[0].Name, string.Empty);
         text2 = text2.AdjustedFor(list[0]);
     }
     else
     {
         var text3 = string.Empty;
         label = "LetterLabelGroupVisitorsArrive".Translate();
         text2 = "GroupVisitorsArrive".Translate(parms.faction.Name, text3);
     }
     Find.LetterStack.ReceiveLetter(label, text2, LetterType.Good, list[0]);
     return true;
 }
 public override bool TryExecute(IncidentParms parms)
 {
     int num = 0;
     int countToSpawn = this.CountToSpawn;
     IntVec3 vec = IntVec3.Invalid;
     for (int i = 0; i < countToSpawn; i++)
     {
         Predicate<IntVec3> validator = delegate(IntVec3 c)
         {
             if (c.Fogged())
             {
                 return false;
             }
             if (Find.Map.Biome == Util_CaveBiome.CaveBiomeDef)
             {
                 if (c.GetFirstThing(Util_CaveBiome.CaveWellDef) == null)
                 {
                     Log.Warning("Not in cave well at " + c.ToString());
                     return false;
                 }
             }
             foreach (IntVec3 current in GenAdj.CellsOccupiedBy(c, Rot4.North, this.def.shipPart.size))
             {
                 if (!current.Standable())
                 {
                     bool result = false;
                     return result;
                 }
                 if (Find.RoofGrid.Roofed(current))
                 {
                     bool result = false;
                     return result;
                 }
             }
             return c.CanReachColony();
         };
         IntVec3 spawnCell = IntVec3.Invalid;
         TryFindShipCrashSite(out spawnCell);
         if (spawnCell.IsValid == false)
         {
             break;
         }
         GenExplosion.DoExplosion(spawnCell, 3f, DamageDefOf.Flame, null, null, null, null, null, 0f, 1, false, null, 0f, 1);
         Building_CrashedShipPartCopy building_CrashedShipPart = (Building_CrashedShipPartCopy)GenSpawn.Spawn(this.def.shipPart, spawnCell);
         building_CrashedShipPart.SetFaction(Faction.OfMechanoids, null);
         building_CrashedShipPart.pointsLeft = parms.points * ShipPointsFactor;
         if (building_CrashedShipPart.pointsLeft < IncidentMinimumPoints)
         {
             building_CrashedShipPart.pointsLeft = IncidentMinimumPoints;
         }
         num++;
         vec = spawnCell;
     }
     if (num > 0)
     {
         Find.CameraDriver.shaker.DoShake(1f);
         Find.LetterStack.ReceiveLetter(this.def.letterLabel, this.def.letterText, this.def.letterType, vec, null);
     }
     return num > 0;
 }
 public override bool TryExecute(IncidentParms parms)
 {
     IntVec3 intVec;
     if (!RCellFinder.TryFindRandomPawnEntryCell(out intVec))
     {
         return false;
     }
     PawnKindDef pawnKindDef = (
         from a in Find.Map.Biome.AllWildAnimals
         where GenTemperature.SeasonAcceptableFor(a.race)
         select a).RandomElement();
     float points = IncidentMakerUtility.DefaultParmsNow(Find.Storyteller.def, IncidentCategory.ThreatBig).points;
     int num = Rand.RangeInclusive(12, 24);
     int num2 = Rand.RangeInclusive(90000, 150000);
     IntVec3 invalid = IntVec3.Invalid;
     if (!RCellFinder.TryFindRandomCellOutsideColonyNearTheCenterOfTheMap(intVec, 10f, out invalid))
     {
         invalid = IntVec3.Invalid;
     }
     Pawn pawn = null;
     for (int i = 0; i < num; i++)
     {
         IntVec3 loc = CellFinder.RandomClosewalkCellNear(intVec, 10);
         pawn = PawnGenerator.GeneratePawn(pawnKindDef, null);
         GenSpawn.Spawn(pawn, loc, Rot4.Random);
         pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + num2;
         if (invalid.IsValid)
         {
             pawn.mindState.forcedGotoPosition = CellFinder.RandomClosewalkCellNear(invalid, 10);
         }
     }
     Find.LetterStack.ReceiveLetter("Migration", "A group of animals is migrating through your region.", LetterType.Good, intVec, null);
     return true;
 }
 public override bool TryExecute(IncidentParms parms)
 {
     string[] array = new string[]
     {
         "StoneBoulder",
         "StoneBoulder",
         "StoneBoulder",
         "StoneBoulder",
         "MineralBoulder",
         "MineralBoulder",
         "MineralBoulder",
         "SilverBoulder",
         "SilverBoulder",
         "UraniumBoulder"
     };
     System.Random random = new System.Random();
     int num = random.Next(array.Length);
     ThingDef thingDef = ThingDef.Named(array[num]);
     Thing thing = ThingMaker.MakeThing(thingDef);
     IntVec3 intVec = GenCellFinder.RandomCellWith((IntVec3 sq) => sq.Standable() && !Find.RoofGrid.Roofed(sq) && !sq.Fogged());
     MeteorUtility.MakeMeteorAt(intVec, new MeteorInfo
     {
         SingleContainedThing = thing,
         openDelay = 1,
         leaveSlag = false
     });
     Find.History.AddGameEvent("A meteoroid has entered the planets gravity well and come crashing down in a fiery explosion! weeee", GameEventType.BadNonUrgent, true, intVec, string.Empty);
     return true;
 }
        public override bool TryExecute(IncidentParms parms)
        {
            IntVec3 intVec;
            if (!RCellFinder.TryFindRandomPawnEntryCell(out intVec))
            {
                return false;
            }
            PawnKindDef feenix = PawnKindDef.Named("Fluffy_Feenix");
            IntVec3 invalid = IntVec3.Invalid;
            if (!RCellFinder.TryFindRandomCellOutsideColonyNearTheCenterOfTheMap(intVec, 10f, out invalid))
            {
                invalid = IntVec3.Invalid;
            }
            Pawn pawn = null;
            IntVec3 loc = CellFinder.RandomClosewalkCellNear(intVec, 10);
            pawn = PawnGenerator.GeneratePawn(feenix, null, false, 0);
            GenSpawn.Spawn(pawn, loc, Rot4.Random);
            pawn.mindState.exitMapAfterTick = Find.TickManager.TicksGame + Rand.RangeInclusive(90000, 150000);
            if (invalid.IsValid)
            {
                pawn.mindState.forcedGotoPosition = CellFinder.RandomClosewalkCellNear(invalid, 10);
            }

            Find.LetterStack.ReceiveLetter("LetterLabelFeenixPasses".Translate(new object[]
            {
                feenix.label
            }).CapitalizeFirst(), "LetterFeenixPasses".Translate(new object[]
            {
                feenix.label
            }), LetterType.Good, pawn, null);
            return true;
        }
 public override bool TryExecute(IncidentParms parms)
 {
     Log.Message("IncidentWorker_RefugeePodCrashInCave:TryExecute");
     if (Find.Map.Biome != Util_CaveBiome.CaveBiomeDef)
     {
         return base.TryExecute(parms);
     }
     IntVec3 intVec = IntVec3.Invalid;
     TryFindRefugeePodSpot(out intVec);
     if (intVec.IsValid == false)
     {
         return false;
     }
     Faction faction = Find.FactionManager.FirstFactionOfDef(FactionDefOf.Spacer);
     PawnGenerationRequest request = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, faction, PawnGenerationContext.NonPlayer, false, false, false, false, true, false, 20f, false, true, true, null, null, null, null, null, null);
     Pawn pawn = PawnGenerator.GeneratePawn(request);
     HealthUtility.GiveInjuriesToForceDowned(pawn);
     string label = "LetterLabelRefugeePodCrash".Translate();
     string text = "RefugeePodCrash".Translate();
     PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref text, ref label, pawn);
     Find.LetterStack.ReceiveLetter(label, text, LetterType.BadNonUrgent, intVec, null);
     DropPodUtility.MakeDropPodAt(intVec, new DropPodInfo
     {
         SingleContainedThing = pawn,
         openDelay = 180,
         leaveSlag = true
     });
     return true;
 }
        public override bool TryExecute( IncidentParms parms )
        {
            ThingDef solarCellDef = DefDatabase<ThingDef>.GetNamed( "BTSGSolarCell" );

            if ( solarCellDef != null )
            {
                List<Thing> solarCellThingsList = new List<Thing>();

                int iNumCellStacksDropped = Rand.Range( m_iMinStacks, m_iMaxStacks + 1 );

                for ( int iTempCount = 0; iTempCount < iNumCellStacksDropped; iTempCount++ )
                {
                    Thing tempSolarCellThing = ThingMaker.MakeThing( solarCellDef, null);

                    tempSolarCellThing.stackCount = Rand.Range( m_iMinStackSize, m_iMaxStackSize + 1 );

                    solarCellThingsList.Add( tempSolarCellThing );
                }

                if ( solarCellThingsList.Count > 0 )
                {
                    IntVec3 crashPosVec = RCellFinder.RandomDropSpot();

                    DropPodUtility.DropThingsNear( crashPosVec, solarCellThingsList, 110, true, true);

                    Find.History.AddGameEvent( "BTSGSolarArrayCrash".Translate(), GameEventType.Good, true, crashPosVec );

                    return true;
                }
            }

            return false;
        }
        public override bool TryExecute(IncidentParms parms)
        {
            if (!TryResolveParms(parms))
            {
                return false;
            }
            var pawns = SpawnPawns(parms);
            if (!pawns.Any())
            {
                return false;
            }
            foreach (var pawn in pawns.Where(pawn => pawn.needs?.food != null))
            {
                pawn.needs.food.CurLevel = pawn.needs.food.MaxLevel;
            }

            ModifycaravanGroup(ref pawns);

            Find.LetterStack.ReceiveLetter("LetterLabelTraderCaravanArrival".Translate(parms.faction.Name),
                "LetterTraderCaravanArrival".Translate(parms.faction.Name), LetterType.Good, pawns[0]);
            IntVec3 chillSpot;
            RCellFinder.TryFindRandomSpotJustOutsideColony(pawns[0], out chillSpot);
            var lordJob = new RA_LordJob_TradeWithColony(parms.faction, chillSpot);
            LordMaker.MakeNewLord(parms.faction, lordJob, pawns);
            return true;
        }
 public override bool TryExecute(IncidentParms parms)
 {
     string[] array = new string[]
     {
         "SandstoneBoulder",
         "LimestoneBoulder",
         "GraniteBoulder",
         "SlateBoulder",
         "MarbleBoulder",
         "MineralBoulder",
         "SilverBoulder",
         "UraniumBoulder",
         "JadeBoulder"
     };
     Random random = new Random();
     int num = random.Next(array.Length);
     ThingDef thingDef = ThingDef.Named(array[num]);
     Thing singleContainedThing = ThingMaker.MakeThing(thingDef);
     IntVec3 dropCenter = CellFinderLoose.RandomCellWith((IntVec3 c) => GenGrid.Standable(c) && !Find.RoofGrid.Roofed(c) && !Find.FogGrid.IsFogged(c), 1000);
     MeteorUtility.MakeMeteorAt(dropCenter, new MeteorInfo
     {
         SingleContainedThing = singleContainedThing,
         openDelay = 1,
         leaveSlag = false
     });
     Find.LetterStack.ReceiveLetter("Meteor Incoming", "A meteoroid has entered the planets gravity well and come crashing down in a fiery explosion! weeee", LetterType.BadNonUrgent, dropCenter, null);
     return true;
 }
 public override bool TryExecute(IncidentParms parms)
 {
     IntVec3 dropCenter = CellFinderLoose.RandomCellWith((IntVec3 c) => GenGrid.Standable(c) && !Find.RoofGrid.Roofed(c) && !Find.FogGrid.IsFogged(c), 1000);
     GenSpawn.Spawn(ThingDef.Named("Thing_RazorSpawner"), dropCenter);
     Find.LetterStack.ReceiveLetter("Razor rain imminent", "Some debris in orbit around the planet has started to fall in the area, brace yourselves.", LetterType.BadUrgent);
     return true;
 }
    public override bool TryExecute( IncidentParms parms )
    {
        if( parms.points <= 0 )
        {
            Log.Error("AnimalInsanity running without points.");
            parms.points = (int)(Find.StoryWatcher.watcherStrength.StrengthRating * 50);
        }

        //Choose an animal type
        List<ThingDef> animalDefs = DefDatabase<ThingDef>.AllDefs
                                            .Where( def => def.category == EntityCategory.Pawn
                                                            && !def.race.humanoid
                                                            && AnimalInsanityUtility.PointsPerAnimal(def) <= parms.points)
                                            .ToList();

        //Remove all animal types for whom less than 3 are on the map
        animalDefs.RemoveAll( d=> Find.ListerPawns.AllPawns.Where(p=>p.def == d).Count() < 3 );

        if( animalDefs.Count == 0 )
            return false;

        ThingDef animalDef = animalDefs.RandomListElement();

        List<Pawn> allUsableAnimals = Find.ListerPawns.AllPawns
                                                .Where(p=>p.def == animalDef )
                                                .ToList();

        float pointsPerAnimal = AnimalInsanityUtility.PointsPerAnimal( animalDef );
        float pointsSpent = 0;
        int animalsMaddened = 0;
        Pawn lastAnimal = null;
        foreach( Pawn animal in allUsableAnimals.InRandomOrder() )
        {
            if( pointsSpent+pointsPerAnimal > parms.points )
                break;

            PsychologyUtility.TryDoMentalBreak(animal, SanityState.Psychotic);

            pointsSpent += pointsPerAnimal;
            animalsMaddened++;
            lastAnimal = animal;
        }

        //Not enough points/animals for even one animal to be maddened
        if( pointsSpent == 0 )
            return false;

        string letter;
        if( animalsMaddened == 1 )
            letter = "AnimalInsanitySingle".Translate(  animalDef.label.ToLower() );
        else
            letter = "AnimalInsanityMultiple".Translate(  animalDef.label.ToLower() );

        Find.LetterStack.ReceiveLetter( new UI.Letter(letter, UI.LetterType.BadUrgent, lastAnimal) );

        return true;
    }
 public static IncidentParms DefaultParmsNow(StorytellerDef tellerDef, IncidentCategory incCat)
 {
     var incidentParms = new IncidentParms();
     if (incCat == IncidentCategory.ThreatSmall || incCat == IncidentCategory.ThreatBig)
     {
         var wealthSummaryCost = Find.StoryWatcher.watcherWealth.WealthItems + Find.StoryWatcher.watcherWealth.WealthBuildings * BuildingWealthFactor;
         wealthSummaryCost -= WealthBase;
         if (wealthSummaryCost < 0f)
         {
             wealthSummaryCost = 0f;
         }
         var threatPointsOfWealth = wealthSummaryCost / 1000f * PointsPer1000Wealth;
         var threatPointsOfPopulation = Find.MapPawns.FreeColonistsCount * PointsPerColonist;
         incidentParms.points = threatPointsOfWealth + threatPointsOfPopulation;
         incidentParms.points *= Find.StoryWatcher.watcherRampUp.TotalThreatPointsFactor;
         incidentParms.points *= Find.Storyteller.difficulty.threatScale;
         switch (Find.StoryWatcher.statsRecord.numThreatBigs)
         {
             case 0:
                 incidentParms.points = 35f;
                 incidentParms.raidForceOneIncap = true;
                 incidentParms.raidNeverFleeIndividual = true;
                 break;
             case 1:
                 incidentParms.points *= 0.5f;
                 break;
             case 2:
                 incidentParms.points *= 0.7f;
                 break;
             case 3:
                 incidentParms.points *= 0.8f;
                 break;
             case 4:
                 incidentParms.points *= 0.9f;
                 break;
             default:
                 incidentParms.points *= 1f;
                 break;
         }
         if (incidentParms.points < 0f)
         {
             incidentParms.points = 0f;
         }
         if (incidentParms.points > HalveLimitLo)
         {
             if (incidentParms.points > HalveLimitHi)
             {
                 incidentParms.points = HalveLimitHi + (incidentParms.points - HalveLimitHi) * 0.5f;
             }
             incidentParms.points = HalveLimitLo + (incidentParms.points - HalveLimitLo) * 0.5f;
         }
     }
     return incidentParms;
 }
        public override bool TryExecute(IncidentParms parms)
        {
            // Spawn me in the game world, please
            IntVec3 intVec = GenCellFinder.RandomCellWith((IntVec3 sq) => sq.Standable() && !Find.RoofGrid.Roofed(sq) && !sq.Fogged());
            GenSpawn.Spawn(ThingDef.Named("Thing_MeteorSpawner"), intVec);

            // Message the player that Quaggan is going to foo up their day
            Find.History.AddGameEvent("Meteor shower imminent.", GameEventType.BadUrgent, true, string.Empty);

            // We successfully initialized our event, return true
            return true;
        }
 // added tech level check for raid faction (not higher than current)
 protected override bool TryResolveRaidFaction(IncidentParms parms)
 {
     if (parms.faction != null)
     {
         return true;
     }
     var maxPoints = parms.points;
     if (maxPoints <= 0f)
     {
         maxPoints = 999999f;
     }
     return (from faction in Find.FactionManager.AllFactions
             where faction.HostileTo(Faction.OfPlayer) && faction.def.techLevel <= Faction.OfPlayer.def.techLevel && maxPoints >= faction.def.MinPointsToGenerateNormalPawnGroup() && GenDate.DaysPassed >= faction.def.earliestRaidDays
             select faction).TryRandomElementByWeight(fac => fac.def.raidCommonality, out parms.faction);
 }
        public override bool TryExecute(IncidentParms parms)
        {
            Building_AquacultureBasin aquacultureBasin = null;
            foreach (Building building in Find.ListerBuildings.AllBuildingsColonistOfDef(Util_FishIndustry.AquacultureBasinDef))
            {
                aquacultureBasin = building as Building_AquacultureBasin;
                aquacultureBasin.StartMicroFungusInfestation((int)(60000f * Rand.Range(this.def.durationDays.min, this.def.durationDays.max)));
            }
            if (aquacultureBasin != null)
            {
                Find.LetterStack.ReceiveLetter("Micro fungus", "Some of your aquaculture basins have been infected by a strange aquatic fungus.\nIt seems to consume all the water's oxygen.\nLet's hope the fishes will survive this deprivation.", LetterType.BadNonUrgent, aquacultureBasin);
            }

            return true;
        }
        public override bool TryExecute(IncidentParms parms)
        {
            IntVec3 migrationEnterVec;
            IntVec3 migrationExitVec;
            PawnKindDef animalPawnDef;

            IncidentParms_MigrationWave ip = parms as IncidentParms_MigrationWave;

            if(ip != null) {
                animalPawnDef = ip.animalPawnKindDef;
                migrationEnterVec = ip.enterVec;
                migrationExitVec = ip.exitVec;
            } else
            { /*For some reason this was not passed the correct subclass of IncidentParms.
                The incident was probably triggered by development console or the def for it has been changed.
                Need to generate all the data ourself.*/
                migrationEnterVec = MigrationUtilities.FindMigrationEnterVec();
                migrationExitVec = MigrationUtilities.FindMigrationExitVec(migrationEnterVec);
                animalPawnDef = MigrationUtilities.GetMigrationAnimalDef();
            }

            float challengeModifier = MigrationUtilities.GetChallengeModifier();

            int minAnimals = (int) Math.Ceiling(10 * challengeModifier);
            int maxAnimals = (int) Math.Ceiling(20 * challengeModifier);

            int numberOfAnimals = Rand.RangeInclusive(minAnimals, maxAnimals);
            for (int i = 0; i < numberOfAnimals; i++)
            {
                IntVec3 animalSpawnLocation = MigrationUtilities.RandomStandableEdgeCellNear(migrationEnterVec, 20);

                Pawn animalPawn = PawnGenerator.GeneratePawn(animalPawnDef, null,Rand.RangeInclusive(1,10) <= 4 ? true : false);
                GenSpawn.Spawn(animalPawn, animalSpawnLocation);
                animalPawn.jobs.StopAll();

                //find a random exit position
                IntVec3 animalExitLocation = MigrationUtilities.RandomStandableEdgeCellNear(migrationExitVec, 20);
                Job animalJob = new Job(JobDefOf.Goto, new TargetInfo(animalExitLocation));
                animalJob.exitMapOnArrival = true;

                animalPawn.jobs.StartJob(animalJob);

                //Make 'em crazy!
                //animalPawn.mindState.broken.StartBrokenState(BrokenStateDefOf.Berserk);
            }

            return true;
        }
    public override bool TryExecute(IncidentParms parms)
    {
        Pawn pawn;
        if( Find.ListerPawns.FreeColonists.Where( col=>col.Incapacitated ).TryRandomElement(out pawn) )
        {
            int healthAmount = pawn.healthTracker.MaxHealth - pawn.healthTracker.Health - Random.Range(2,10);

            pawn.TakeDamage( new DamageInfo( DamageTypeDefOf.Healing, healthAmount, null) );

            Letter letter = new Letter( "MiracleHeal".Translate(pawn.Name.nick), LetterType.BadNonUrgent, pawn );
            Find.LetterStack.ReceiveLetter( letter );

            return true;
        }

        return true;
    }
    public override bool TryExecute( IncidentParms parms )
    {
        IntVec3 dropSpot = GenSquareFinder.RandomSquareWith( (sq)=>sq.Standable() && !sq.IsFogged() );

        Find.LetterStack.ReceiveLetter( new UI.Letter("RefugeePodCrash".Translate(), UI.LetterType.BadNonUrgent, dropSpot));

        Faction fac = Find.FactionManager.FirstFactionOfDef( FactionDef.Named("Spacer") );

        Pawn refugee = PawnGenerator.GeneratePawn( PawnKindDef.Named("SpaceRefugee"), fac );
        refugee.healthTracker.ForceIncap();

        DropPodInfo contents = new DropPodInfo(refugee, 180);
        DropPodUtility.MakeDropPodAt( dropSpot, contents );

        Find.Storyteller.intenderPopulation.Notify_PopulationGainIncident();
        return true;
    }
        public override bool TryExecute(IncidentParms parms)
        {
            var candidates = BulkWaterStorageNotEmpty();
            if (!candidates.Any()) { return false; }

            var target = candidates.RandomElement();
            var wc = target.GetComp<CompWaterContainer>();
            if (wc == null) { return false; }

            float severity = UnityEngine.Random.Range(0.2f, 0.8f);
            float toLeak = Math.Max(MinLeak, severity * wc.StoredLitres);
            wc.RemoveWater(toLeak);

            target.TakeDamage(new DamageInfo(DamageDefOf.Deterioration, (int) (target.HitPoints * severity)));
            Find.LetterStack.ReceiveLetter(this.def.letterLabel, this.def.letterText, this.def.letterType,
                target.Position, null);
            return true;
        }
 public override bool TryExecute(IncidentParms parms)
 {
     Log.Message("IncidentWorker_ResourcePodCrashInCave:TryExecute");
     if (Find.Map.Biome != Util_CaveBiome.CaveBiomeDef)
     {
         return base.TryExecute(parms);
     }
     
     ThingDef thingDef = IncidentWorker_ResourcePodCrashInCave.RandomPodContentsDef();
     List<Thing> list = new List<Thing>();
     float num = (float)Rand.Range(150, 900);
     do
     {
         Thing thing = ThingMaker.MakeThing(thingDef, null);
         int num2 = Rand.Range(20, 40);
         if (num2 > thing.def.stackLimit)
         {
             num2 = thing.def.stackLimit;
         }
         if ((float)num2 * thing.def.BaseMarketValue > num)
         {
             num2 = Mathf.FloorToInt(num / thing.def.BaseMarketValue);
         }
         if (num2 == 0)
         {
             num2 = 1;
         }
         thing.stackCount = num2;
         list.Add(thing);
         num -= (float)num2 * thingDef.BaseMarketValue;
     }
     while (list.Count < MaxStacks && num > thingDef.BaseMarketValue);
     IntVec3 intVec = IntVec3.Invalid;
     TryFindDropPodSpot(out intVec);
     if (intVec.IsValid)
     {
         DropPodUtility.DropThingsNear(intVec, list, 110, false, true, true);
         Find.LetterStack.ReceiveLetter("LetterLabelCargoPodCrash".Translate(), "CargoPodCrash".Translate(), LetterType.Good, intVec, null);
         return true;
     }
     return false;
 }
        public override bool TryExecute(IncidentParms parms)
        {
            Predicate<IntVec3> validator = delegate(IntVec3 testedCell)
            {
                if (testedCell.Fogged())
                {
                    return false;
                }
                IntVec2 freeSpaceSize = new IntVec2(16, 16);
                foreach (IntVec3 current in GenAdj.CellsOccupiedBy(testedCell, Rot4.North, freeSpaceSize))
                {
                    if (current.Walkable() == false)
                    {
                        bool result = false;
                        return result;
                    }                    
                    if (Find.RoofGrid.Roofed(current))
                    {
                        bool result = false;
                        return result;
                    }
                }
                return testedCell.CanReachColony();
            };
            IntVec3 landingCell;
            if (CellFinderLoose.TryFindRandomNotEdgeCellWith(20, validator, out landingCell) == false)
            {
                return false;
            }
            string eventText = "   You have detected a strange thing falling from the sky. It is quite bigger than a drop pod and does not emit the standard trading federation emergency call.\n"
                + "You should send someone to scout it but be careful, this stinks mechanoid technology...";
            Find.LetterStack.ReceiveLetter("Artifact", eventText, LetterType.BadNonUrgent, landingCell);
            Thing mechanoidTerraformerIncoming = ThingMaker.MakeThing(Util_MechanoidTerraformer.MechanoidTerraformerIncomingDef);
            mechanoidTerraformerIncoming.SetFactionDirect(Faction.OfMechanoids);
            GenSpawn.Spawn(mechanoidTerraformerIncoming, landingCell);

            return true;
        }
    public override bool TryExecute( IncidentParms parms )
    {
        bool cropFound = false;
        foreach( Plant plant in Find.Map.listerThings.ThingsInGroup( ThingRequestGroup.CultivatedPlant ) )
        {
        //	Plant plant = (Plant)t;

            if( plant.LifeStage == PlantLifeStage.Growing || plant.LifeStage == PlantLifeStage.Mature )
                cropFound = true;;
        }

        if( !cropFound )
            return false;

        List<Thing> plants = Find.Map.listerThings.ThingsInGroup( ThingRequestGroup.CultivatedPlant ).ToList();
        for( int i=plants.Count-1; i>=0; i-- )
        {
            ((Plant)plants[i]).CropBlighted();
        }

        Find.LetterStack.ReceiveLetter( new UI.Letter("CropBlight".Translate(), UI.LetterType.BadNonUrgent) );

        return true;
    }
Beispiel #25
0
 protected override bool CanFireNowSub(IncidentParms parms)
 {
     return(false);
 }
Beispiel #26
0
        public override bool TryExecute(IncidentParms parms)
        {
            Map map = (Map)parms.target;
            List<Building> batteries = UsableBatteries(map).ToList();
            if (batteries.Count() == 0) return false;

            PowerNet powerNet = batteries.RandomElement().PowerComp.PowerNet;
            List<CompPower> victims = (
                from transmitter in powerNet.transmitters
                where transmitter.parent.def == ThingDefOf.PowerConduit
                select transmitter
                ).ToList();
            if (victims.Count == 0) return false;

            List<Building> fuses = (
                from transmitter in powerNet.transmitters
                where transmitter.parent.GetComp<CompRTFuse>() != null
                select transmitter.parent as Building
                ).ToList();

            float energyTotal = 0.0f;
            foreach (CompPowerBattery battery in powerNet.batteryComps)
            {
                energyTotal += battery.StoredEnergy;
                battery.DrawPower(battery.StoredEnergy);
            }

            float energyTotalHistoric = energyTotal;
            foreach (Building fuse in fuses)
            {
                energyTotal -= fuse.GetComp<CompRTFuse>().MitigateSurge(energyTotal);
                if (energyTotal <= 0) break;
            }

            StringBuilder stringBuilder = new StringBuilder();
            Thing victim = victims.RandomElement().parent;

            if (energyTotal > 0)
            {
                float explosionRadius = Mathf.Sqrt(energyTotal) * 0.05f;
                if (explosionRadius > 14.9f) explosionRadius = 14.9f;

                GenExplosion.DoExplosion(
                    victim.Position, map, explosionRadius, DamageDefOf.Flame,
                    null, null, null, null, null, 0f, 1, false, null, 0f, 1);

                if (explosionRadius > 3.5f)
                    GenExplosion.DoExplosion(
                        victim.Position, map, explosionRadius * 0.3f, DamageDefOf.Bomb,
                        null, null, null, null, null, 0f, 1, false, null, 0f, 1);

                if (!victim.Destroyed)
                    victim.TakeDamage(new DamageInfo(
                        DamageDefOf.Bomb, 200, -1f, null, null));

                if (energyTotal == energyTotalHistoric)
                {
                    stringBuilder.Append("ShortCircuit".Translate(new object[]
                    {
                        "AnElectricalConduit".Translate(),
                        energyTotalHistoric.ToString("F0")
                    }));
                }
                else
                {
                    stringBuilder.Append("IncidentWorker_RTShortCircuit_PartialMitigation".Translate(new object[]
                    {
                        "AnElectricalConduit".Translate(),
                        energyTotalHistoric.ToString("F0"),
                        (energyTotalHistoric - energyTotal).ToString("F0")
                    }));
                }

                if (explosionRadius > 5f)
                {
                    stringBuilder.AppendLine();
                    stringBuilder.AppendLine();
                    stringBuilder.Append("ShortCircuitWasLarge".Translate());
                }

                if (explosionRadius > 8f)
                {
                    stringBuilder.AppendLine();
                    stringBuilder.AppendLine();
                    stringBuilder.Append("ShortCircuitWasHuge".Translate());
                }
            }
            else
            {
                victim.TakeDamage(new DamageInfo(
                    DamageDefOf.Bomb, Rand.Range(0, (int)Math.Floor(0.1f * victim.MaxHitPoints)),
                    -1f, null, null));

                stringBuilder.Append("IncidentWorker_RTShortCircuit_FullMitigation".Translate(new object[]
                {
                    "AnElectricalConduit".Translate(),
                    energyTotalHistoric.ToString("F0")
                }));
            }

            Find.LetterStack.ReceiveLetter(
                "LetterLabelShortCircuit".Translate(), stringBuilder.ToString(),
                LetterType.BadNonUrgent, new TargetInfo(victim.Position, map, false), null);

            return true;
        }
        public override bool TryExecute(IncidentParms parms)
        {
            List<Building_Battery> batteries = this.FullBatteries().ToList<Building_Battery>();
            if (batteries.Count<Building_Battery>() == 0)
            {       // Check for existing batteries.
                return false;
            }

            PowerNet powerNet = batteries.RandomElement<Building_Battery>().PowerComp.PowerNet;     // Choose a powernet with batteries.
            List<CompPower> victimList = (
                from transmitter in powerNet.transmitters
                where transmitter.parent.def == ThingDefOf.PowerConduit
                select transmitter).ToList<CompPower>();
            if (victimList.Count == 0)
            {       // Form a list of things that can get shorted on the chosen powerned.
                return false;
            }

            List<Building> surgeProtectors = (
                from transmitter in powerNet.transmitters
                where transmitter.parent.GetComp<CompRTSurgeProtector>() != null
                select transmitter.parent as Building).ToList<Building>();
                    // Form a list of fuses in the chosen powernet.

            float energyTotal = 0f;
            foreach (CompPowerBattery battery in powerNet.batteryComps)
            {
                energyTotal += battery.StoredEnergy;
            }

            float energyTotalHistoric = energyTotal;
            foreach (Building surgeProtector in surgeProtectors)
            {       // Try to mitigate the discharge with fuses.
                energyTotal -= surgeProtector.GetComp<CompRTSurgeProtector>().MitigateDischarge(energyTotal);
                if (energyTotal <= 0)
                {
                    break;
                }
            }

            // Discharge all unprotected energy + half the protected sum
            float discharge = energyTotal + ((energyTotalHistoric - energyTotal) / 2.0f);
            foreach (CompPowerBattery battery in powerNet.batteryComps)
            {
                float batteryDischarge = Math.Min(battery.StoredEnergy, discharge);
                battery.DrawPower(batteryDischarge);

                discharge -= batteryDischarge;
                    if (discharge <= 0)
                        break;
            }

            if (energyTotal == energyTotalHistoric)
            {       // No mitigation, vanilla behavior.
                float explosionRadius = Mathf.Sqrt(energyTotal) * 0.05f;
                if (explosionRadius > 14.9f)
                {
                    explosionRadius = 14.9f;
                }
                Thing victim = victimList.RandomElement<CompPower>().parent;
                GenExplosion.DoExplosion(victim.Position, explosionRadius, DamageDefOf.Flame, null, null, null);
                if (explosionRadius > 3.5f)
                {
                    GenExplosion.DoExplosion(victim.Position, explosionRadius * 0.3f, DamageDefOf.Bomb, null, null, null);
                }
                if (!victim.Destroyed)
                {
                    victim.TakeDamage(new DamageInfo(DamageDefOf.Bomb, 200, null, null, null));
                }
                string text = "a thing";
                if (victim.def == ThingDefOf.PowerConduit)
                {
                    text = "AnElectricalConduit".Translate();
                }
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.Append("ShortCircuit".Translate(new object[]{
                text,
                energyTotalHistoric.ToString("F0"),
                (energyTotalHistoric - energyTotal).ToString("F0")}));
                if (explosionRadius > 5f)
                {
                    stringBuilder.AppendLine();
                    stringBuilder.AppendLine();
                    stringBuilder.Append("ShortCircuitWasLarge".Translate());
                }
                if (explosionRadius > 8f)
                {
                    stringBuilder.AppendLine();
                    stringBuilder.AppendLine();
                    stringBuilder.Append("ShortCircuitWasHuge".Translate());
                }
                Find.LetterStack.ReceiveLetter("LetterLabelShortCircuit".Translate(), stringBuilder.ToString(), LetterType.BadNonUrgent, victim.Position, null);
                return true;
            }
            else if (energyTotal > 0)
            {       // Partial mitigation.
                float explosionRadius = Mathf.Sqrt(energyTotal) * 0.05f;
                if (explosionRadius > 14.9f)
                {
                    explosionRadius = 14.9f;
                }
                Thing victim = victimList.RandomElement<CompPower>().parent;
                GenExplosion.DoExplosion(victim.Position, explosionRadius, DamageDefOf.Flame, null, null, null);
                if (explosionRadius > 3.5f)
                {
                    GenExplosion.DoExplosion(victim.Position, explosionRadius * 0.3f, DamageDefOf.Bomb, null, null, null);
                }
                if (!victim.Destroyed)
                {
                    victim.TakeDamage(new DamageInfo(DamageDefOf.Bomb, 200, null, null, null));
                }
                string text = "a thing";
                if (victim.def == ThingDefOf.PowerConduit)
                {
                    text = "AnElectricalConduit".Translate();
                }
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.Append("ShortCircuitPartial".Translate(new object[]{
                text,
                energyTotalHistoric.ToString("F0"),
                (energyTotalHistoric - energyTotal).ToString("F0")}));
                if (explosionRadius > 5f)
                {
                    stringBuilder.AppendLine();
                    stringBuilder.AppendLine();
                    stringBuilder.Append("ShortCircuitWasLarge".Translate());
                }
                if (explosionRadius > 8f)
                {
                    stringBuilder.AppendLine();
                    stringBuilder.AppendLine();
                    stringBuilder.Append("ShortCircuitWasHuge".Translate());
                }
                Find.LetterStack.ReceiveLetter("LetterLabelShortCircuit".Translate(), stringBuilder.ToString(), LetterType.BadNonUrgent, victim.Position, null);
                return true;
            }
            else
            {       // Full mitigation.
                Thing victim = victimList.RandomElement<CompPower>().parent;
                victim.TakeDamage(new DamageInfo(DamageDefOf.Bomb, Rand.Range(0, (int)Math.Floor(0.1f * victim.MaxHitPoints)), null, null, null));
                string text = "a thing";
                if (victim.def == ThingDefOf.PowerConduit)
                {
                    text = "AnElectricalConduit".Translate();
                }
                StringBuilder stringBuilder = new StringBuilder();
                stringBuilder.Append("ShortCircuitProtected".Translate(new object[]{
                text,
                energyTotalHistoric.ToString("F0")}));
                Find.LetterStack.ReceiveLetter("LetterLabelShortCircuit".Translate(), stringBuilder.ToString(), LetterType.BadNonUrgent, victim.Position, null);
                return true;
            }
        }
 public static void Postfix(IncidentParms parms)
 {
     //Traverse traverse = Traverse.Create(__parms);
     //Thing value3 = traverse.Field("launcher").GetValue<Thing>();
     IncidentWorker_Ra2RaidEnemy.TryExecuteWorker(parms);
 }
        public static bool TryExecuteWorker(IncidentParms parms)
        {
            var builder = new StringBuilder();

            if (parms.faction.def.defName.EqualsIgnoreCase("ra2_soviet"))
            {
                Find.MusicManagerPlay.ForceStartSong(DefDatabase <SongDef> .GetNamed("ra2_soviet_music"), false);

                // Log.Warning("your points is :"+ parms.points);
                if (parms.points >= 600)
                {
                    spawnSpecialPawn(parms, "ra2_SovietEngineer");
                }

                if (!(parms.points >= 3600))
                {
                    return(true);
                }

                var apoTank = spawnSpecialPawn(parms, "ra2_ApoTank");
                DefDatabase <SoundDef> .GetNamed("ra2_apo_enter").PlayOneShotOnCamera((Map)parms.target);

                var text = "DangerousunitMsg".Translate(parms.faction.Name, apoTank.def.label);
                builder.AppendLine(text);

                Find.LetterStack.ReceiveLetter("Dangerousunit".Translate(), builder.ToString(), LetterDefOf.Death,
                                               apoTank);

                //  Messages.Message(text+apoTank,MessageTypeDefOf.PawnDeath);


                return(true);
            }

            if (parms.faction.def.defName.EqualsIgnoreCase("ra2_allied"))
            {
                Find.MusicManagerPlay.ForceStartSong(DefDatabase <SongDef> .GetNamed("ra2_allied_music"), false);

                if (parms.points >= 600)
                {
                    spawnSpecialPawn(parms, "ra2_AlliedEngineer");
                }

                if (!(parms.points >= 3600))
                {
                    return(true);
                }

                var item   = getTanya(parms);
                var et     = item.equipment;
                var nr     = new Random((int)parms.points);
                var result = nr.Next(100);
                et.AddEquipment((ThingWithComps)ThingMaker.MakeThing(
                                    DefDatabase <ThingDef> .GetNamed(result > 33 ? "ra2_Gun_Tanya" : "ra2_TanyaC4Bomb")));


                var loc = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, (Map)parms.target, 8);
                var pp  = (Pawn)GenSpawn.Spawn(item, loc, (Map)parms.target, parms.spawnRotation);
                //Lord ld = LordMaker.MakeNewLord(parms.faction, new LordJob_AssaultColony(parms.faction, false, false, true, false, true), (Map)parms.target);
                //ld.AddPawn(pp);
                var pl = new List <Pawn> {
                    pp
                };
                parms.raidStrategy.Worker.MakeLords(parms, pl);

                DefDatabase <SoundDef> .GetNamed("ra2_tanya_enter").PlayOneShotOnCamera((Map)parms.target);

                var text = "DangerousunitMsg".Translate(parms.faction.Name, item.Name);
                builder.AppendLine(text);
                builder.AppendLine("TanyaWeaponUse".Translate() + ":" + DefDatabase <ThingDef>
                                   .GetNamed(result > 33 ? "ra2_Gun_Tanya" : "ra2_TanyaC4Bomb").label);

                Find.LetterStack.ReceiveLetter("Dangerousunit".Translate(), builder.ToString(), LetterDefOf.Death,
                                               pp);


                return(true);
            }

            if (!parms.faction.def.defName.EqualsIgnoreCase("ra2_yuri"))
            {
                return(false);
            }

            Find.MusicManagerPlay.ForceStartSong(DefDatabase <SongDef> .GetNamed("ra2_yuri_music"), false);

            // Log.Warning("your points is :"+ parms.points);
            if (parms.points >= 500)
            {
                spawnSpecialPawn(parms, "ra2_YuriEngineer");
            }

            return(true);
        }
 protected abstract string GetLetterLabel(IncidentParms parms);
Beispiel #31
0
 protected override bool CanFireNowSub(IncidentParms parms) => Find.WorldObjects.AllWorldObjects.Any(wo => wo is Outpost {
Beispiel #32
0
        public override void NeedInterval()
        {
            if (ticks >= 5)
            {
                float totalOpinion = 0;
                int   totalPawns   = 0;
                foreach (Pawn p in IncidentWorker_LeaderElection.getAllColonists())
                {
                    if (p != this.pawn && !p.Dead)
                    {
                        totalOpinion += p.relations.OpinionOf(this.pawn);
                        totalPawns++;
                    }
                }
                float medium = (totalOpinion / totalPawns);

                this.opinion = medium;
                float newlevel = (Mathf.Clamp(medium, 0f, 100f) / 100f) * getSkillFactor(this.pawn);



                if (this.curLevelInt < newlevel)
                {
                    this.lastGainTick = Find.TickManager.TicksGame;
                }
                else if (this.curLevelInt > newlevel)
                {
                    this.lastLoseTick = Find.TickManager.TicksGame;
                }
                if (newlevel > 1f)
                {
                    newlevel = 1f;
                }
                this.curLevelInt = newlevel;;



                if (totalPawns == 0)
                {
                    this.curLevelInt = 0.5f * getSkillFactor(this.pawn);
                }
                ticks = 0;
                bool flag5 = false;
                if (!Utility.isDictatorship)
                {
                    if (!this.chosenToStay && opinion < -40 && opinion > -80)
                    {
                        if (Rand.MTBEventOccurs(1.25f, 60000f, 150f))
                        {
                            flag5 = true;
                            StringBuilder str = new StringBuilder();
                            String        s   = "she";
                            if (this.pawn.gender == Gender.Male)
                            {
                                s = "he";
                            }

                            String b = "her";
                            if (this.pawn.gender == Gender.Male)
                            {
                                b = "his";
                            }

                            str.AppendLine("UnpopularM".Translate(new object[] { this.pawn.Name.ToStringFull }));
                            str.AppendLine("");
                            str.AppendLine("ResignLetterText".Translate(new object[] { this.pawn.Name.ToStringFull }));
                            str.AppendLine("");
                            str.AppendLine("OnlyOnce".Translate());
                            Action removeLeader = delegate
                            {
                                Find.LetterStack.ReceiveLetter("LeaderEndLetter".Translate(), "LeaderEndLetterDesc".Translate(new object[] { pawn.Name.ToStringFull }), LetterDefOf.BadNonUrgent, this.pawn, null);
                                this.pawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtDef.Named("LeaderEnd"));
                                IncidentWorker_Rebellion.removeLeadership(this.pawn);
                            };
                            Action keepLeader = delegate
                            {
                                this.chosenToStay = true;
                            };


                            Dialog_MessageBox window = new Dialog_MessageBox(str.ToString(), "Resign".Translate(), removeLeader, "DontTesign".Translate(), keepLeader, "ResignationProposal".Translate(), false);
                            Find.WindowStack.Add(window);
                        }
                    }

                    if (!flag5 && opinion < -60)
                    {
                        float mtb = 0.50f;
                        if (opinion < -70)
                        {
                            mtb = 0.35f;
                        }
                        if (opinion < -80)
                        {
                            mtb = 0.20f;
                        }
                        if (opinion < -90)
                        {
                            mtb = 0.10f;
                        }

                        if (Rand.MTBEventOccurs(mtb, 60000f, 150f))
                        {
                            bool flag = false;
                            foreach (Pawn pa in IncidentWorker_LeaderElection.getAllColonists())
                            {
                                if (pa != null && pa.MentalState != null && pa.MentalState.def == DefDatabase <MentalStateDef> .GetNamed("Rebelling"))
                                {
                                    flag = true;
                                }
                            }
                            if (!flag)
                            {
                                IncidentParms parms = StorytellerUtility.DefaultParmsNow(Find.Storyteller.def, IncidentDef.Named("RebellionL").category, (this.pawn.Map));
                                if (IncidentDef.Named("RebellionL").Worker.TryExecute(parms))
                                {
                                    String s = "her";
                                    if (this.pawn.gender == Gender.Male)
                                    {
                                        s = "his";
                                    }
                                    Find.LetterStack.ReceiveLetter("RebellionLetter".Translate(), "RebellionLetterDesc".Translate(new object[] { this.pawn.Name.ToStringFull }), LetterDefOf.BadNonUrgent, this.pawn, null);
                                }
                            }
                        }
                    }
                }
            }
            ticks++;
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            if (!TryResolveParms(parms))
            {
                Log.ErrorOnce($"Trying to spawn visitors, but parms couldn't be resolved.", 84289426);
                return(false);
            }

            // Is map not available anymore?
            if (!(parms.target is Map map))
            {
                Log.ErrorOnce("Trying to spawn visitors, but map does not exist anymore.", 43692862);
                return(true);
            }

            if (parms.points < 40)
            {
                Log.Error("Trying to spawn visitors, but points are too low.");
                return(false);
            }

            if (parms.faction == null)
            {
                Log.ErrorOnce("Trying to spawn visitors, but couldn't find valid faction.", 43638973);
                return(true);
            }
            if (!parms.spawnCenter.IsValid)
            {
                Log.ErrorOnce("Trying to spawn visitors, but could not find a valid spawn point.", 94839643);
                return(false);
            }

            if (parms.faction == Faction.OfPlayer)
            {
                Log.ErrorOnce("Trying to spawn visitors, but they are of Faction.OfPlayer.", 3464363);
                return(true);
            }
            if (parms.faction.RelationWith(Faction.OfPlayer).kind == FactionRelationKind.Hostile)
            {
                Log.Message($"Trying to spawn visitors of faction {parms.faction.Name}, but they are hostile to the player (now).");
                return(true);
            }

            if (parms.faction.defeated)
            {
                Log.Message($"Trying to spawn visitors of faction {parms.faction.Name}, but they have been defeated.");
                return(true);
            }

            if (Settings.disableGuests || map.mapPawns.ColonistCount == 0 || !map.GetMapComponent().guestsAreWelcome)
            {
                if (Settings.disableGuests)
                {
                    Log.Message($"Guest group arrived, but guests are disabled in the options.");
                }
                else if (map.mapPawns.ColonistCount == 0)
                {
                    Log.Message($"Guest group arrived, but there are no remaining colonists on the map.");
                }
                else if (!map.GetMapComponent().guestsAreWelcome)
                {
                    Log.Message($"Guest group arrived, but the player disabled guests for this map.");
                }

                GenericUtility.PlanNewVisit(map, Rand.Range(5f, 25f), parms.faction);
            }
            else
            {
                // Did the player refuse guests until beds are made and there are no beds yet?
                if (!BedCheck(map))
                {
                    Log.Message("Guest group arrived, but there are no guest beds and the player asked to wait until they are built.");

                    GenericUtility.PlanNewVisit(map, Rand.Range(5f, 10f), parms.faction);
                    return(true);
                }

                // We check here instead of CanFireNow, so we can reschedule the visit.
                // Any reasons not to come?
                if (CheckCanCome(map, parms.faction, out var reasons))
                {
                    // No, spawn
                    return(SpawnGroup(parms, map));
                }

                // Yes, ask the player for permission
                void Allow() => SpawnGroup(parms, map);
                void Refuse() => GenericUtility.PlanNewVisit(map, Rand.Range(2f, 5f), parms.faction);

                AskForPermission(parms, map, reasons, Allow, Refuse);
            }
            return(true);
        }
        private bool DoExecute(IncidentParms parms)
        {
            List <Pair <Faction, Faction> > factions = new List <Pair <Faction, Faction> >();

            foreach (var faction in Find.FactionManager.AllFactionsVisible)
            {
                if (faction == Faction.OfPlayer)
                {
                    continue;
                }

                foreach (var faction2 in Find.FactionManager.AllFactionsVisible)
                {
                    if (faction2 == Faction.OfPlayer)
                    {
                        continue;
                    }

                    if (faction.HostileTo(faction2))
                    {
                        factions.Add(new Pair <Faction, Faction>(faction, faction2));
                    }
                }
            }

            Pair <Faction, Faction>          pairFactions = factions.RandomElement();
            Pair <List <Pawn>, List <Pawn> > pawns        = new Pair <List <Pawn>, List <Pawn> >(new List <Pawn>(), new List <Pawn>());

            parms.faction = pairFactions.First;
            GeneratePawns(parms).ForEach(p => pawns.First.Add(p));

            if (pawns.First.Count == 0)
            {
                return(false);
            }

            parms.faction = pairFactions.Second;
            GeneratePawns(parms).ForEach(p => pawns.Second.Add(p));

            if (pawns.Second.Count == 0)
            {
                return(false);
            }

            Map     map  = parms.target as Map;
            bool    flag = false;
            IntVec3 existingMapEdgeCell = IntVec3.Invalid;

            if (map == null)
            {
                map  = SetupCaravanAttackMap((Caravan)parms.target, pawns.First, pawns.Second);
                flag = true;
            }
            else
            {
                MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out existingMapEdgeCell, out IntVec3 third);
                SpawnEnemies(existingMapEdgeCell, third, pawns.First, pawns.Second, map);
            }

            LordJob lordJob = new LordJob_AssaultColony(pairFactions.Second, canKidnap: true, canTimeoutOrFlee: false);

            if (lordJob != null)
            {
                LordMaker.MakeNewLord(pairFactions.First, lordJob, map, pawns.First);
            }
            LordJob lordJob2 = new LordJob_AssaultColony(pairFactions.First, canKidnap: true, canTimeoutOrFlee: false);

            if (lordJob != null)
            {
                LordMaker.MakeNewLord(pairFactions.Second, lordJob2, map, pawns.Second);
            }

            Caravan caravan    = parms.target as Caravan;
            string  letterText = string.Format(def.letterText, (caravan == null) ? "yourCaravan".Translate().ToString() : caravan.Name, pairFactions.First.Name, pairFactions.Second.Name);

            Find.LetterStack.ReceiveLetter(def.letterLabel, letterText, def.letterDef);
            if (flag)
            {
                Find.TickManager.Notify_GeneratedPotentiallyHostileMap();
            }

            return(true);
        }
 public override bool CanUseWith(IncidentParms parms)
 {
     if (!base.CanUseWith(parms))
         return false;
     return parms.faction.def.canStageAttacks;
 }
 protected abstract string GetRelatedPawnsInfoLetterText(IncidentParms parms);
 protected abstract string GetLetterText(IncidentParms parms, List <Pawn> pawns);
 protected abstract bool TryResolveRaidFaction(IncidentParms parms);
        //returns pawns for compatibility reasons.
        public static void SpawnHackedMechanoids(List <Pawn> pawns, IncidentParms parms)
        {
            //only call Arrive method when sure it's not already called. (can happen due to other mods)
            if (pawns.Count > 0 && !pawns[0].Spawned)
            {
                parms.raidArrivalMode.Worker.Arrive(pawns, parms);
            }

            if (pawns.Count == 0)
            {
                return;
            }
            if (parms.faction == Faction.OfMechanoids)
            {
                return;
            }
            Random rand = new Random(DateTime.Now.Millisecond);

            if (rand.Next(0, 100) > Base.hackedMechChance)
            {
                return;
            }

            int         minHackedMechPoints = Math.Min(Base.minHackedMechPoints, Base.maxHackedMechPoints);
            float       maxMechPoints       = parms.points * ((float)rand.Next(minHackedMechPoints, Base.maxHackedMechPoints)) / 100f; //TODO: no magic numbers
            float       cumulativePoints    = 0;
            Map         map        = parms.target as Map;
            List <Pawn> addedPawns = new List <Pawn>();

            while (cumulativePoints < maxMechPoints)
            {
                PawnKindDef pawnKindDef = null;
                IEnumerable <PawnKindDef> selectedPawns = (from a in DefDatabase <PawnKindDef> .AllDefs
                                                           where a.RaceProps.IsMechanoid &&
                                                           cumulativePoints + a.combatPower < maxMechPoints &&
                                                           Utilities.IsAllowedInModOptions(a.race.defName, parms.faction) &&
                                                           (parms.raidArrivalMode == PawnsArrivalModeDefOf.EdgeWalkIn || a.RaceProps.baseBodySize <= 1) //Only allow small mechs to use drop pods
                                                           select a);

                if (selectedPawns != null)
                {
                    selectedPawns.TryRandomElement(out pawnKindDef);
                }
                if (pawnKindDef != null)
                {
                    Pawn mechanoid = PawnGenerator.GeneratePawn(pawnKindDef, parms.faction);
                    if (parms.raidArrivalMode == PawnsArrivalModeDefOf.EdgeWalkIn)
                    {
                        IntVec3 loc = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8, null);
                        GenSpawn.Spawn(mechanoid, loc, map, parms.spawnRotation);
                    }
                    mechanoid.health.AddHediff(WTH_DefOf.WTH_TargetingHacked);
                    mechanoid.health.AddHediff(WTH_DefOf.WTH_BackupBattery);
                    Need_Power powerNeed = (Need_Power)mechanoid.needs.TryGetNeed(WTH_DefOf.WTH_Mechanoid_Power);
                    powerNeed.CurLevel = powerNeed.MaxLevel;
                    addedPawns.Add(mechanoid);
                    cumulativePoints += pawnKindDef.combatPower;
                    AddModules(mechanoid);
                }
                else
                {
                    break;
                }
            }
            if (addedPawns.Count > 0 && !addedPawns[0].Spawned)
            {
                parms.raidArrivalMode.Worker.Arrive(addedPawns, parms);
            }
            pawns.AddRange(addedPawns);

            foreach (Pawn pawn in pawns)
            {
                if (pawn.equipment == null)
                {
                    pawn.equipment = new Pawn_EquipmentTracker(pawn);
                }
            }
        }
Beispiel #40
0
 public VoteIncidentDef(Dictionary <int, IncidentDef> incidents, StorytellerComp source, IncidentParms parms = null) : base(new List <int>(incidents.Keys))
 {
     this.parms = parms;
     try
     {
         this.incidents = incidents;
         this.source    = source;
     }
     catch (InvalidCastException e)
     {
         Log.Error("Invalid VoteIncidentDef. " + e.Message);
     }
 }
        private FiringIncident GenerateIncident(IIncidentTarget target)
        {
            Helper.Log("Trying OnOffCycle Incident");
            List <IncidentDef> pickedoptions = new List <IncidentDef>();
            IncidentParms      parms         = this.GenerateParms(this.Props.IncidentCategory, target);
            IncidentDef        def2;

            if ((float)GenDate.DaysPassed < this.Props.forceRaidEnemyBeforeDaysPassed)
            {
                if (!IncidentDefOf.RaidEnemy.Worker.CanFireNow(parms, false))
                {
                    return(null);
                }
                def2 = IncidentDefOf.RaidEnemy;
            }
            else if (this.Props.incident != null)
            {
                if (!this.Props.incident.Worker.CanFireNow(parms, false))
                {
                    return(null);
                }
                def2 = this.Props.incident;
            }
            else
            {
                options = from def in base.UsableIncidentsInCategory(this.Props.IncidentCategory, parms)
                          where parms.points >= def.minThreatPoints
                          select def;
                Helper.Log($"Trying OFC Category: ${this.Props.IncidentCategory}");
                if (options.TryRandomElementByWeight(new Func <IncidentDef, float>(base.IncidentChanceFinal), out def2))
                {
                    if (options.Count() > 1)
                    {
                        options = options.Where(k => k != def2);
                        pickedoptions.Add(def2);
                        for (int x = 0; x < ToolkitSettings.VoteOptions - 1 && x < options.Count(); x++)
                        {
                            options.TryRandomElementByWeight(new Func <IncidentDef, float>(base.IncidentChanceFinal), out IncidentDef picked);
                            if (picked != null)
                            {
                                options = options.Where(k => k != picked);
                                pickedoptions.Add(picked);
                            }
                        }

                        Dictionary <int, IncidentDef> incidents = new Dictionary <int, IncidentDef>();
                        for (int i = 0; i < pickedoptions.Count(); i++)
                        {
                            incidents.Add(i, pickedoptions.ToList()[i]);
                        }
                        VoteHandler.QueueVote(new VoteIncidentDef(incidents, this, parms));
                        Helper.Log("Events created");
                        return(null);
                    }
                    else if (options.Count() == 1)
                    {
                        Helper.Log("Firing one incident OFC");
                        return(new FiringIncident(def2, this, parms));
                    }
                }

                return(null);
            }
            return(new FiringIncident(def2, this, parms));
        }
 public static IEnumerable <Pawn> GetKnownPawns(IncidentParms parms)
 {
     return(Find.WorldPawns.AllPawnsAlive.Where(pawn => ValidGuest(pawn, parms.faction)));
 }
 public override bool CanFireNowSub(IncidentParms parms)
 {
     return((parms.target is Map map && !map.wildAnimalSpawner.AnimalEcosystemFull) || CaravanIncidentUtility.CanFireIncidentWhichWantsToGenerateMapAt(parms.target.Tile));
 }
Beispiel #44
0
        protected override bool TryCastShot()
        {
            bool flag   = false;
            Pawn caster = base.CasterPawn;

            CompAbilityUserMagic comp = caster.GetComp <CompAbilityUserMagic>();

            pwrVal    = comp.MagicData.MagicPowerSkill_AlterFate.FirstOrDefault((MagicPowerSkill x) => x.label == "TM_AlterFate_pwr").level;
            arcaneDmg = comp.arcaneDmg;

            if (comp.predictionIncidentDef != null)
            {
                if (Rand.Chance((.25f + (.05f * pwrVal)) * this.arcaneDmg)) //success end
                {
                    //Log.Message("remove event");
                    List <QueuedIncident> iQue = Traverse.Create(root: Find.Storyteller.incidentQueue).Field(name: "queuedIncidents").GetValue <List <QueuedIncident> >();
                    if (iQue != null && iQue.Count > 0)
                    {
                        for (int i = 0; i < iQue.Count; i++)
                        {
                            //Log.Message("checking ique " + iQue[i].FiringIncident.def.defName + " against " + comp.predictionIncidentDef.defName);
                            if (iQue[i].FiringIncident.def == comp.predictionIncidentDef)
                            {
                                //Log.Message("Removing incident " + iQue[i].FiringIncident.def.defName);
                                iQue.Remove(iQue[i]);
                                if (Rand.Chance(.6f + (.1f * pwrVal)))
                                {
                                    this.confident = true;
                                }
                                else if (Rand.Chance(.1f))
                                {
                                    this.uneasy = true;
                                }
                                else
                                {
                                    this.unsure = true;
                                }
                                break;
                            }
                        }
                    }
                }
                else if (Rand.Chance(.2f - (.02f * pwrVal))) //shifting incident
                {
                    //Log.Message("shift event");
                    List <QueuedIncident> iQue = Traverse.Create(root: Find.Storyteller.incidentQueue).Field(name: "queuedIncidents").GetValue <List <QueuedIncident> >();
                    if (iQue != null && iQue.Count > 0)
                    {
                        for (int i = 0; i < iQue.Count; i++)
                        {
                            //Log.Message("checking ique " + iQue[i].FiringIncident.def.defName + " against " + comp.predictionIncidentDef.defName);
                            if (iQue[i].FiringIncident.def == comp.predictionIncidentDef)
                            {
                                //Log.Message("replacing incident " + iQue[i].FiringIncident.def.defName);
                                iQue.Remove(iQue[i]);
                            }
                        }
                    }

                    IEnumerable <IncidentDef> enumerable = from def in DefDatabase <IncidentDef> .AllDefs
                                                           where (def != comp.predictionIncidentDef && def.TargetAllowed(this.CasterPawn.Map))
                                                           orderby Rand.ValueSeeded(Find.TickManager.TicksGame)
                                                           select def;

                    foreach (IncidentDef item in enumerable)
                    {
                        //Log.Message("checking incident " + item.defName);
                        IncidentDef   localDef = item;
                        IncidentParms parms    = StorytellerUtility.DefaultParmsNow(localDef.category, this.CasterPawn.Map);
                        if (localDef.Worker.CanFireNow(parms))
                        {
                            QueuedIncident iq = new QueuedIncident(new FiringIncident(localDef, null, parms), comp.predictionTick);
                            Find.Storyteller.incidentQueue.Add(iq);
                            //Log.Message("queueing incident " + localDef.defName + " in " + comp.predictionTick + " ticks");
                            //localDef.Worker.TryExecute(parms);
                            if (Rand.Chance(.6f + (.1f * pwrVal)))
                            {
                                this.uneasy = true;
                            }
                            else if (Rand.Chance(.1f))
                            {
                                this.confident = true;
                            }
                            else
                            {
                                this.unsure = true;
                            }
                            break;
                        }
                    }
                }
                else if (Rand.Chance(.11f - (.011f * pwrVal))) //add another event
                {
                    //Log.Message("add event");
                    IEnumerable <IncidentDef> enumerable = from def in DefDatabase <IncidentDef> .AllDefs
                                                           where (def != comp.predictionIncidentDef && def.TargetAllowed(this.CasterPawn.Map))
                                                           orderby Rand.ValueSeeded(Find.TickManager.TicksGame)
                                                           select def;

                    foreach (IncidentDef item in enumerable)
                    {
                        //Log.Message("checking incident " + item.defName);
                        IncidentDef   localDef = item;
                        IncidentParms parms    = StorytellerUtility.DefaultParmsNow(localDef.category, this.CasterPawn.Map);
                        if (localDef.Worker.CanFireNow(parms))
                        {
                            QueuedIncident iq = new QueuedIncident(new FiringIncident(localDef, null, parms), comp.predictionTick + Rand.Range(-500, 10000));

                            Find.Storyteller.incidentQueue.Add(iq);
                            //Log.Message("queueing incident " + localDef.defName + " in " + comp.predictionTick + " ticks");
                            //localDef.Worker.TryExecute(parms);
                            if (Rand.Chance(.4f + (.1f * pwrVal)))
                            {
                                this.uneasy = true;
                            }
                            else if (Rand.Chance(.2f))
                            {
                                this.terrified = true;
                            }
                            else
                            {
                                this.unsure = true;
                            }
                            break;
                        }
                    }
                }
                else if (Rand.Chance(.05f - (.005f * pwrVal))) //butterfly effect
                {
                    int eventCount     = Rand.RangeInclusive(1, 5);
                    int butterflyCount = 0;
                    //Log.Message("butteryfly event");
                    IEnumerable <IncidentDef> enumerable = from def in DefDatabase <IncidentDef> .AllDefs
                                                           where (def.TargetAllowed(this.CasterPawn.Map))
                                                           orderby Rand.ValueSeeded(Find.TickManager.TicksGame)
                                                           select def;

                    foreach (IncidentDef item in enumerable)
                    {
                        //Log.Message("checking incident " + item.defName);
                        IncidentDef   localDef = item;
                        IncidentParms parms    = StorytellerUtility.DefaultParmsNow(localDef.category, this.CasterPawn.Map);
                        if (localDef.Worker.CanFireNow(parms))
                        {
                            int            eventTick = Find.TickManager.TicksGame + Rand.Range(0, 3600);
                            QueuedIncident iq        = new QueuedIncident(new FiringIncident(localDef, null, parms), eventTick);
                            Find.Storyteller.incidentQueue.Add(iq);
                            //Log.Message("queueing incident " + localDef.defName + " in " + eventTick + " ticks");
                            //localDef.Worker.TryExecute(parms);
                            butterflyCount++;
                            if (butterflyCount > eventCount)
                            {
                                if (Rand.Chance(.6f + (.1f * pwrVal)))
                                {
                                    this.terrified = true;
                                }
                                else if (Rand.Chance(.3f))
                                {
                                    this.uneasy = true;
                                }
                                else
                                {
                                    this.unsure = true;
                                }
                                break;
                            }
                        }
                    }
                }
                else // failed
                {
                    //Log.Message("failed event");
                    if (Rand.Chance(.6f + (.1f * pwrVal)))
                    {
                        this.unsure = true;
                    }
                    else if (Rand.Chance(.1f))
                    {
                        this.uneasy = true;
                    }
                    else
                    {
                        this.confident = true;
                    }
                    //Messages.Message("TM_AlterGameConditionFailed".Translate(this.CasterPawn.LabelShort, localGC.Label), MessageTypeDefOf.NeutralEvent);
                }
                DisplayConfidence(comp.predictionIncidentDef.label);
            }
            else if (pwrVal >= 3)
            {
                if (this.CasterPawn.Map.GameConditionManager.ActiveConditions.Count > 0)
                {
                    GameCondition localGC = null;
                    foreach (GameCondition activeCondition in this.CasterPawn.Map.GameConditionManager.ActiveConditions)
                    {
                        localGC = activeCondition;
                        if (activeCondition.TicksPassed < (2500 + (250 * pwrVal)))
                        {
                            if (Rand.Chance(.25f + (.05f * pwrVal))) //success
                            {
                                Messages.Message("TM_EndingGameCondition".Translate(this.CasterPawn.LabelShort, localGC.Label), MessageTypeDefOf.PositiveEvent);
                                localGC.End();
                            }
                            else if (Rand.Chance(.2f - (.02f * pwrVal))) //shifting game condition
                            {
                                IEnumerable <GameConditionDef> enumerable = from def in DefDatabase <GameConditionDef> .AllDefs
                                                                            where (def != localGC.def)
                                                                            select def;

                                GameConditionDef newGCdef = enumerable.RandomElement();
                                GameConditionMaker.MakeCondition(newGCdef);
                                Messages.Message("TM_GameConditionChanged".Translate(this.CasterPawn.LabelShort, localGC.Label, newGCdef.label), MessageTypeDefOf.NeutralEvent);
                                localGC.End();
                            }
                            else if (Rand.Chance(.02f)) //permanent
                            {
                                Messages.Message("TM_GameConditionMadePermanent".Translate(localGC.Label), MessageTypeDefOf.NeutralEvent);
                                localGC.Permanent = true;
                            }
                            else if (Rand.Chance(.15f - (.015f * pwrVal))) //add another event
                            {
                                IEnumerable <GameConditionDef> enumerable = from def in DefDatabase <GameConditionDef> .AllDefs
                                                                            where (def != localGC.def)
                                                                            select def;
                                GameConditionDef newGCdef = enumerable.RandomElement();
                                GameConditionMaker.MakeCondition(newGCdef);
                                Messages.Message("TM_GameConditionAdded".Translate(this.CasterPawn.LabelShort, newGCdef.label, localGC.Label), MessageTypeDefOf.NeutralEvent);
                            }
                            else
                            {
                                Messages.Message("TM_AlterGameConditionFailed".Translate(this.CasterPawn.LabelShort, localGC.Label), MessageTypeDefOf.NeutralEvent);
                            }
                            break;
                        }
                    }
                }
            }
            TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_AlterFate, CasterPawn.DrawPos, this.CasterPawn.Map, 1f, .2f, 0, 1f, Rand.Range(-500, 500), 0, 0, Rand.Range(0, 360));
            TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_AlterFate, CasterPawn.DrawPos, this.CasterPawn.Map, 2.5f, .2f, .1f, .8f, Rand.Range(-500, 500), 0, 0, Rand.Range(0, 360));
            TM_MoteMaker.ThrowGenericMote(TorannMagicDefOf.Mote_AlterFate, CasterPawn.DrawPos, this.CasterPawn.Map, 6f, 0f, .2f, .6f, Rand.Range(-500, 500), 0, 0, Rand.Range(0, 360));
            this.PostCastShot(flag, out flag);
            return(flag);
        }
 protected abstract void ResolveRaidStrategy(IncidentParms parms, PawnGroupKindDef groupKind);
 protected override string GetLetterLabel(IncidentParms parms)
 {
     return("Retribution".Translate());
 }
Beispiel #47
0
 protected override bool TryResolveRaidFaction(IncidentParms parms)
 {
     parms.faction = Find.FactionManager.FirstFactionOfDef(VFEV_DefOf.VFEV_VikingsSlaver);
     return(true);
 }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            HarmonyPatches.DebugMessage("Chaos Theory attempted");
            if (!(parms.target is Map map))
            {
                return(false);
            }

            var pawn = map.GetComponent <MapComponent_SacrificeTracker>().lastUsedAltar.SacrificeData.Executioner;

            HarmonyPatches.DebugMessage("Executioner selected");

            HarmonyPatches.DebugMessage("Obstacle traits being removed:: ");
            RemoveObstacleTraits(pawn);

            if (HasIncapableWorkTags(pawn))
            {
                HarmonyPatches.DebugMessage($"{pawn.Label} has incapable worktags and must be remade.");
                HarmonyPatches.DebugMessage("Childhood redo");
                var fixedChildhood = false;
                _ = new List <WorkTypeDef>(pawn.story.childhood.DisabledWorkTypes);
                HarmonyPatches.DebugMessage("childwork list defined");
                while (fixedChildhood == false)
                {
                    IEnumerable <WorkTypeDef> childWorkList;
                    //200 tries to set to 0 disabled work types
                    for (var i = 0; i < 200; i++)
                    {
                        childWorkList = pawn.story.childhood.DisabledWorkTypes;
                        if (!childWorkList.Any())
                        {
                            goto FirstLeap;
                        }

                        pawn.story.childhood = BackstoryDatabase.RandomBackstory(BackstorySlot.Childhood);
                    }

                    //200 tries to set to 1 disabled work type
                    for (var i = 0; i < 200; i++)
                    {
                        childWorkList = pawn.story.childhood.DisabledWorkTypes;
                        if (childWorkList.Count() <= 1)
                        {
                            goto FirstLeap;
                        }

                        pawn.story.childhood = BackstoryDatabase.RandomBackstory(BackstorySlot.Childhood);
                    }

                    //Give up
                    fixedChildhood = true;
                }

FirstLeap:

                HarmonyPatches.DebugMessage("First leap");
                //Your adulthood is out
                var fixedAdulthood = false;
                _ = pawn.story.adulthood.DisabledWorkTypes;
                while (fixedAdulthood == false)
                {
                    IEnumerable <WorkTypeDef> adultWorkList;
                    //Try 200 times to get to 0 disabled work types
                    for (var i = 0; i < 200; i++)
                    {
                        adultWorkList = pawn.story.adulthood.DisabledWorkTypes;
                        if (adultWorkList?.Count() == 0)
                        {
                            goto SecondLeap;
                        }

                        pawn.story.adulthood = BackstoryDatabase.RandomBackstory(BackstorySlot.Adulthood);
                    }

                    //Try 200 times to get to 1 disabled work types
                    for (var i = 0; i < 200; i++)
                    {
                        adultWorkList = pawn.story.adulthood.DisabledWorkTypes;
                        if (adultWorkList?.Count() <= 1)
                        {
                            goto SecondLeap;
                        }

                        pawn.story.adulthood = BackstoryDatabase.RandomBackstory(BackstorySlot.Adulthood);
                    }

                    //Give up
                    fixedAdulthood = true;
                }

SecondLeap:
                HarmonyPatches.DebugMessage("Second leap");
            }

            if (HasIncapableSkills(pawn))
            {
                HarmonyPatches.DebugMessage($"{pawn.Label} has incapable skills");
                //pawn.story.GenerateSkillsFromBackstory();
                var allDefsListForReading = DefDatabase <SkillDef> .AllDefsListForReading;

                foreach (var skillDef in allDefsListForReading)
                {
                    var skill = pawn.skills.GetSkill(skillDef);
                    if (skill.Level <= 3)
                    {
                        skill.Level = 3;
                    }

                    if (skill.TotallyDisabled)
                    {
                        HarmonyPatches.DebugMessage($"{pawn.Label}'s {skill.def.LabelCap} is now 3");
                        skill.Level = 3;
                    }

                    skill.Notify_SkillDisablesChanged();
                }

                HarmonyPatches.DebugMessage("Skills assigned");
            }

            HarmonyPatches.DebugMessage("Disabled Work Types Attempted");
            Traverse.Create(pawn).Field("cachedDisabledWorkTypes").SetValue(null);
            HarmonyPatches.DebugMessage("Disabled Work Types Succeeded");
            //typeof(Pawn).GetField("cachedDisabledWorkTypes", BindingFlags.Instance | BindingFlags.NonPublic).SetValue(pawn, null);
            map.GetComponent <MapComponent_SacrificeTracker>().lastLocation = pawn.Position;
            Messages.Message(pawn.Label + " has lived their entire life over again.", MessageTypeDefOf.PositiveEvent);
            return(true);
        }
Beispiel #49
0
 protected override string GetLetterLabel(IncidentParms parms)
 {
     return(base.def.letterLabel);
 }
        private void WarUpdate(War war)
        {
            Faction f1 = war.AttackerFaction();
            Faction f2 = war.DefenderFaction();

            if (f1 == null || f2 == null || f1.defeated || f2.defeated)
            {
                Wars.Remove(war);
                return;
            }
            // Settlement conqured
            int chance = WarEventChance.RandomInRange;

            // Event Chance - 0.000675% every 600 ticks

            // Settlement Conqoured 0.00005%
            if (chance < 5)
            {
                Settlement settlement;
                // if f1
                if (Rand.Chance(0.5f + GetByFaction(f2).resources == GetByFaction(f1).resources ? GetByFaction(f2).resources / GetByFaction(f1).resources < 1 ? (0.5f - ((GetByFaction(f2).resources / GetByFaction(f1).resources) / 2f)) : -(0.5f - ((GetByFaction(f2).resources / GetByFaction(f1).resources) / 2f)) : 0))
                {
                    settlement = Find.WorldObjects.Settlements.Where(x => x.Faction == f1).RandomElement();
                    GetByFaction(f1).history += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + "MessageFactionWarSettlementConqueredWinner".Translate(settlement, f2);
                    GetByFaction(f2).history += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + "MessageFactionWarSettlementConqueredLoser".Translate(settlement, f1);
                }
                // if f2
                else
                {
                    settlement = Find.WorldObjects.Settlements.Where(x => x.Faction == f2).RandomElement();
                }

                Settlement set = (Settlement)WorldObjectMaker.MakeWorldObject(WorldObjectDefOf.Settlement);
                set.SetFaction(settlement.Faction == f1 ? f2 : f1);

                set.Tile = settlement.Tile;
                set.Name = settlement.Name;
                Find.WorldObjects.Remove(settlement);
                Find.WorldObjects.Add(set);

                GetByFaction(set.Faction).resources        += SETTLEMENT_RESOURCE_VALUE;
                GetByFaction(settlement.Faction).resources -= SETTLEMENT_RESOURCE_VALUE * 5;
                Messages.Message("MessageFactionWarSettlementConquered".Translate(set.Faction, settlement, settlement.Faction), MessageTypeDefOf.NeutralEvent);
                war.warHistory += "HistoryDate".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks)) + "MessageFactionWarSettlementConquered".Translate(set.Faction, settlement, settlement.Faction) + "\n\n";
                return;
            }
            // Settlement raided 0.00005%
            if (chance < 10)
            {
                Settlement settlement;
                // if f1
                if (Rand.Chance(0.5f + (GetByFaction(f2).resources / GetByFaction(f1).resources) < 1 ? (0.5f - ((GetByFaction(f2).resources / GetByFaction(f1).resources) / 2f)) : -(0.5f - ((GetByFaction(f2).resources / GetByFaction(f1).resources) / 2f))))
                {
                    settlement = Find.WorldObjects.Settlements.Where(x => x.Faction == f1).RandomElement();
                }
                // if f2
                else
                {
                    settlement = Find.WorldObjects.Settlements.Where(x => x.Faction == f2).RandomElement();
                }
                Find.WorldObjects.Remove(settlement);

                GetByFaction(settlement.Faction == f1 ? f2 : f1).resources += SETTLEMENT_RESOURCE_VALUE / 2;
                GetByFaction(settlement.Faction).resources -= SETTLEMENT_RESOURCE_VALUE * 5;
                Messages.Message(FE_GrammarUtility.WarEvent(settlement.Faction == f1 ? f2 : f1, settlement.Faction, settlement), MessageTypeDefOf.NeutralEvent);
                war.warHistory += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + FE_GrammarUtility.WarEvent(settlement.Faction == f1 ? f2 : f1, settlement.Faction, settlement) + "\n\n";
                return;
            }
            // Artifact cache - Background 0.0007%
            if (chance < 80)
            {
                if (Rand.Chance(0.5f))
                {
                    GetByFaction(f1).resources += LARGE_EVENT_Cache_RESOURCE_VALUE;
                    war.warHistory             += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + FE_GrammarUtility.WarEvent(f1) + "\n\n";
                }
                else
                {
                    GetByFaction(f2).resources += LARGE_EVENT_Cache_RESOURCE_VALUE;
                    war.warHistory             += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + FE_GrammarUtility.WarEvent(f2) + "\n\n";
                }
                return;
            }
            // Farms burned - Background 0.001%
            if (chance < 180)
            {
                if (Rand.Chance(0.5f))
                {
                    GetByFaction(f2).resources -= MEDIUM_EVENT_RESOURCE_VALUE;
                    war.warHistory             += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + "MessageFactionWarFarms".Translate(f1, f2) + "\n\n";
                }
                else
                {
                    GetByFaction(f1).resources -= MEDIUM_EVENT_RESOURCE_VALUE;
                    war.warHistory             += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + "MessageFactionWarFarms".Translate(f2, f1) + "\n\n";
                }
                return;
            }
            // Supply Depot 0.00025%
            if (chance < 205)
            {
                if (!Find.WorldObjects.Settlements.Where(x => (x.Faction == f1 && GetByFaction(f1).resources >= MEDIUM_EVENT_RESOURCE_VALUE * 2) || (x.Faction == f2 && GetByFaction(f1).resources >= MEDIUM_EVENT_RESOURCE_VALUE * 2)).TryRandomElement(out Settlement settlement))
                {
                    return;
                }
                if (!GetByFaction(settlement.Faction).SupplyDepots.Any(x => x > 10 * Global.DayInTicks) || !Find.WorldObjects.AllWorldObjects.Any(x => x.GetComponent <WorldObjectComp_SupplyDepot>() != null && x.GetComponent <WorldObjectComp_SupplyDepot>().IsActive&& x.GetComponent <TimeoutComp>().TicksLeft > 10 * Global.DayInTicks))
                {
                    return;
                }
                if (settlement.Faction.HostileTo(Faction.OfPlayer) && TileFinder.TryFindPassableTileWithTraversalDistance(settlement.Tile, 5, 25, out int tile))
                {
                    Site worldObject = SiteMaker.MakeSite(SiteCoreDefOf.Nothing, SitePartDefOf.Outpost, tile, settlement.Faction);
                    worldObject.GetComponent <TimeoutComp>().StartTimeout(Global.DayInTicks * 14);
                    WorldObjectComp_SupplyDepot.Type type = Rand.Chance(0.5f) ? WorldObjectComp_SupplyDepot.Type.Food : WorldObjectComp_SupplyDepot.Type.Weapons;
                    worldObject.GetComponent <WorldObjectComp_SupplyDepot>().StartComp(type);
                    worldObject.customLabel = "Supply Depot: " + type;
                    Find.WorldObjects.Add(worldObject);
                    Messages.Message("MessageFactionWarSupply".Translate(settlement.Faction), worldObject, MessageTypeDefOf.NeutralEvent, false);
                }
                else
                {
                    GetByFaction(settlement.Faction).SupplyDepots.Add(Global.DayInTicks * 14);
                    Messages.Message("MessageFactionWarSupply".Translate(settlement.Faction), null, MessageTypeDefOf.NeutralEvent, false);
                }
                GetByFaction(settlement.Faction).resources -= MEDIUM_EVENT_RESOURCE_VALUE;
                war.warHistory += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + "MessageFactionWarSupply".Translate(settlement.Faction) + "\n\n";
                return;
            }
            // Caravan ambushed - Background 0.00125%
            if (chance < 355)
            {
                Faction ambusher = Rand.Chance(0.5f) ? f2 : f1;

                GetByFaction(ambusher == f1 ? f2 : f1).resources -= MINOR_EVENT_RESOURCE_VALUE;
                war.warHistory += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + "MessageFactionWarCaravanAmbush".Translate(ambusher, ambusher == f1 ? f2 : f1) + "\n\n";
                return;
            }
            // Minor Outpost raided - Background 0.001%
            if (chance < 455)
            {
                Faction raider = Rand.Chance(0.5f) ? f2 : f1;

                GetByFaction(raider == f1 ? f2 : f1).resources -= MEDIUM_EVENT_RESOURCE_VALUE;
                GetByFaction(raider).resources += MEDIUM_EVENT_RESOURCE_VALUE / 2;
                war.warHistory += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + "MessageFactionWarMinorOutpostRaid".Translate(raider, raider == f1 ? f2 : f1) + "\n\n";
                return;
            }
            // Failed Settlement raid - Background 0.001%
            if (chance < 555)
            {
                Settlement settlement;
                // if f1
                if (Rand.Chance(0.5f + (GetByFaction(f2).resources / GetByFaction(f1).resources) < 1 ? (0.5f - ((GetByFaction(f2).resources / GetByFaction(f1).resources) / 2f)) : -(0.5f - ((GetByFaction(f2).resources / GetByFaction(f1).resources) / 2f))))
                {
                    settlement = Find.WorldObjects.Settlements.Where(x => x.Faction == f1).RandomElement();
                }
                // if f2
                else
                {
                    settlement = Find.WorldObjects.Settlements.Where(x => x.Faction == f2).RandomElement();
                }
                Find.WorldObjects.Remove(settlement);

                GetByFaction(settlement.Faction == f1 ? f2 : f1).resources -= LARGE_EVENT_Cache_RESOURCE_VALUE;

                war.warHistory += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + FE_GrammarUtility.WarEvent(settlement.Faction == f1 ? f2 : f1, settlement.Faction, settlement, true) + "\n\n";
                return;
            }

            // settlement Nuked - toxic fallout 0.00005%
            if (chance < 560 && Find.TickManager.TicksGame > Global.DayInTicks * 20 && Find.Storyteller.difficulty.difficulty >= 2 && !Find.AnyPlayerHomeMap.GameConditionManager.ConditionIsActive(GameConditionDefOf.ToxicFallout))
            {
                if (!(Rand.Chance(0.5f + GetByFaction(f2).resources == GetByFaction(f1).resources ? GetByFaction(f2).resources / GetByFaction(f1).resources < 1 ? (0.5f - (GetByFaction(f2).resources / GetByFaction(f1).resources / 2f)) : -(0.5f - ((GetByFaction(f2).resources / GetByFaction(f1).resources) / 2f)) : 0) && (f1.def.techLevel == TechLevel.Industrial || f1.def.techLevel == TechLevel.Spacer) &&
                      Find.WorldObjects.Settlements.Where(x => x.Faction == f2 && Utilities.Reachable(Find.AnyPlayerHomeMap.Tile, x.Tile, 30)).TryRandomElement(out Settlement ruin)))
                {
                    if (!((f2.def.techLevel == TechLevel.Industrial || f1.def.techLevel == TechLevel.Spacer) && Find.WorldObjects.Settlements.Where(x => x.Faction == f1 && Utilities.Reachable(Find.AnyPlayerHomeMap.Tile, x.Tile, 30)).TryRandomElement(out ruin)))
                    {
                        return;
                    }
                }
                Find.WorldObjects.Remove(ruin);

                GetByFaction(ruin.Faction).resources -= SETTLEMENT_RESOURCE_VALUE * 7;
                IncidentParms parms = new IncidentParms()
                {
                    forced = true,
                    target = Find.AnyPlayerHomeMap
                };
                IncidentDefOf.ToxicFallout.Worker.TryExecute(parms);
                Messages.Message("MessageFactionWarSettlementNuked".Translate(ruin, ruin.Faction == f1 ? f2 : f1), MessageTypeDefOf.ThreatSmall);

                GetByFaction(ruin.Faction == f1 ? f2 : f1).history += "HistoryDate".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks)) + "MessageFactionWarSettlementWinner".Translate(ruin, ruin.Faction, ruin.Faction == f1 ? f2 : f1) + "\n\n";
                GetByFaction(ruin.Faction).history += "HistoryDate".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks)) + "MessageFactionWarSettlementNukedLoser".Translate(ruin, ruin.Faction == f1 ? f2 : f1) + "\n\n";
                war.warHistory += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + "MessageFactionWarSettlementNukedHistory".Translate(ruin.Faction == f1 ? f2 : f1, ruin, ruin.Faction) + "\n\n";
                return;
            }
            // Factories sabotaged - background - 0.001%
            if (chance < 660)
            {
                Faction spy = Rand.Chance(0.5f) ? f2 : f1;

                GetByFaction(spy).resources -= MINOR_EVENT_RESOURCE_VALUE;
                war.warHistory += "HistoryDateRecent".Translate(5500 + (Find.TickManager.TicksGame / Global.YearInTicks), GenLocalDate.DayOfYear(Find.AnyPlayerHomeMap)) + FE_GrammarUtility.WarEvent(spy, spy == f1 ? f2 : f1) + "\n\n";
                return;
            }
        }
    private const int FixedPoints = 30; //one squirrel

    #endregion Fields

    #region Methods

    public override bool TryExecute( IncidentParms parms )
    {
        int maxPoints = 150;
        if( Find.TickManager.tickCount < 20000*10 )
            maxPoints = 40;

        //Choose an animal type
        List<Pawn> validAnimals = Find.ListerPawns.AllPawns
                            .Where( p => !p.RaceDef.humanoid && AnimalInsanityUtility.PointsPerAnimal(p.def) <= maxPoints)
                            .ToList();

        if( validAnimals.Count == 0 )
            return false;

        Pawn animal = validAnimals.RandomListElement();
        PsychologyUtility.TryDoMentalBreak(animal, SanityState.Psychotic);

        string letter;
        letter = "AnimalInsanitySingle".Translate(  animal.Label.ToLower() );
        Find.LetterStack.ReceiveLetter( new UI.Letter(letter, UI.LetterType.BadUrgent, animal) );
        return true;
    }
 // Token: 0x060045D8 RID: 17880 RVA: 0x00178337 File Offset: 0x00176537
 public override bool TryResolveRaidSpawnCenter(IncidentParms parms)
 {
     parms.spawnRotation = Rot4.Random;
     return(true);
 }
 public Vote_RaidStrategy(Dictionary <int, RaidStrategyDef> allStrategies, StorytellerPack pack, IncidentWorker worker, StorytellerComp comp, IncidentParms parms, string title = null) : base(new List <int>(allStrategies.Keys))
 {
     this.title         = title;
     this.allStrategies = allStrategies;
     this.pack          = pack;
     this.worker        = worker;
     this.parms         = parms;
     this.comp          = comp;
 }
 protected override bool CanFireNowSub(IncidentParms parms)
 {
     return(base.CanFireNowSub(parms: parms) && TryFindMarriageSeeker(marriageSeeker: out this.marriageSeeker) &&
            this.TryFindBetrothed(betrothed: out this.betrothed) &&
            !this.IsScenarioBlocked());
 }
        private static DiaOption RequestTraderOption(Map map, int silverCost)
        {
            var text = "RequestTrader".Translate(new object[]
            {
                silverCost.ToString()
            });

            if (AmountSendableSilver(map) < silverCost)
            {
                var diaOption = new DiaOption(text);
                diaOption.Disable("NeedSilverLaunchable".Translate(new object[]
                {
                    silverCost
                }));
                return(diaOption);
            }
            if (!faction.def.allowedArrivalTemperatureRange.ExpandedBy(-4f).Includes(map.mapTemperature.SeasonalTemp))
            {
                var diaOption2 = new DiaOption(text);
                diaOption2.Disable("BadTemperature".Translate());
                return(diaOption2);
            }
            var num = faction.lastTraderRequestTick + 240000 - Find.TickManager.TicksGame;

            if (num > 0)
            {
                var diaOption3 = new DiaOption(text);
                diaOption3.Disable("WaitTime".Translate(new object[]
                {
                    num.ToStringTicksToPeriod()
                }));
                return(diaOption3);
            }
            var diaOption4 = new DiaOption(text);
            var diaNode    = new DiaNode("TraderSent".Translate(new object[]
            {
                faction.leader.LabelIndefinite()
            }).CapitalizeFirst());

            diaNode.options.Add(OKToRoot());
            var diaNode2 = new DiaNode("ChooseTraderKind".Translate(new object[]
            {
                faction.leader.LabelIndefinite()
            }));

            foreach (var localTk2 in faction.def.caravanTraderKinds)
            {
                var localTk    = localTk2;
                var diaOption5 = new DiaOption(localTk.LabelCap);
                diaOption5.action = delegate
                {
                    var incidentParms = new IncidentParms();
                    incidentParms.target     = map;
                    incidentParms.faction    = faction;
                    incidentParms.traderKind = localTk;
                    incidentParms.forced     = true;
                    Find.Storyteller.incidentQueue.Add(IncidentDefOf.TraderCaravanArrival, Find.TickManager.TicksGame + 120000, incidentParms);
                    faction.lastTraderRequestTick = Find.TickManager.TicksGame;
                    TradeUtility.LaunchThingsOfType(ThingDefOf.Silver, silverCost, map, null);
                    PlaySoundFor(faction);
                };
                diaOption5.link = diaNode;
                diaNode2.options.Add(diaOption5);
            }
            var diaOption6 = new DiaOption("GoBack".Translate());

            diaOption6.linkLateBind = ResetToRoot();
            diaNode2.options.Add(diaOption6);
            diaOption4.link = diaNode2;
            return(diaOption4);
        }
 protected abstract void ResolveRaidPoints(IncidentParms parms);
 //TODO: Find out what this is and if i need to change it
 protected override bool CanFireNowSub(IncidentParms parms)
 {
     return(base.CanFireNowSub(parms));
 }
 public override StateGraph MakeBrainGraph(ref IncidentParms parms)
 {
     IntVec3 siegePositionFrom = FindSiegePositionFrom(parms.spawnCenter);
     return GraphMaker.StageThenAttackGraph(parms.faction, siegePositionFrom);
 }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            this.ResolveRaidPoints(parms);
            if (this.disableEvent)
            {
                return(false);
            }
            if (!this.TryResolveRaidFaction(parms))
            {
                return(false);
            }
            PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;

            this.ResolveRaidStrategy(parms, combat);
            this.ResolveRaidArriveMode(parms);
            if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms))
            {
                return(false);
            }
            parms.points = IncidentWorker_Raid.AdjustedRaidPoints(parms.points, parms.raidArrivalMode, parms.raidStrategy, parms.faction, combat);
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms, false);
            List <Pawn>         list        = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();
            List <string>       viewernames = Viewers.ParseViewersFromJson();

            if (list.Count > 0 && viewernames != null)
            {
                int           count        = 0;
                int           totalviewers = viewernames.Count();
                System.Random rnd          = new System.Random();
                foreach (Pawn pawn in list)
                {
                    if (count == list.Count() || viewernames.NullOrEmpty() || pawn.RaceProps.IsMechanoid)
                    {
                        continue;
                    }
                    int        thisviewer = rnd.Next(0, viewernames.Count());
                    NameTriple name       = pawn.Name as NameTriple;
                    NameTriple newname    = new NameTriple(name.First, viewernames[thisviewer], name.Last);
                    if (!newname.UsedThisGame || ToolkitSettings.RepeatViewerNames)
                    {
                        pawn.Name = newname;
                    }

                    viewernames.RemoveAt(thisviewer);
                    count++;
                }
            }
            if (list.Count == 0)
            {
                Log.Error("Got no pawns spawning raid from parms " + parms, false);
                return(false);
            }
            parms.raidArrivalMode.Worker.Arrive(list, parms);
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("Points = " + parms.points.ToString("F0"));
            foreach (Pawn current in list)
            {
                string str = (current.equipment == null || current.equipment.Primary == null) ? "unarmed" : current.equipment.Primary.LabelCap;
                stringBuilder.AppendLine(current.KindLabel + " - " + str);
            }
            string letterLabel = this.GetLetterLabel(parms);
            string letterText  = this.GetLetterText(parms, list);

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true, true);
            List <TargetInfo> list2 = new List <TargetInfo>();

            if (parms.pawnGroups != null)
            {
                List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(list, parms.pawnGroups);
                List <Pawn>         list4 = list3.MaxBy((List <Pawn> x) => x.Count);
                if (list4.Any <Pawn>())
                {
                    list2.Add(list4[0]);
                }
                for (int i = 0; i < list3.Count; i++)
                {
                    if (list3[i] != list4)
                    {
                        if (list3[i].Any <Pawn>())
                        {
                            list2.Add(list3[i][0]);
                        }
                    }
                }
            }
            else if (list.Any <Pawn>())
            {
                list2.Add(list[0]);
            }

            Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), list2, parms.faction, stringBuilder.ToString());
            parms.raidStrategy.Worker.MakeLords(parms, list);
            return(true);
        }