Esempio n. 1
0
 protected void CaravanAmbushHumansNoTreasure(Caravan caravan)
 {
     LongEventHandler.QueueLongEvent(delegate
     {
         IncidentParms incidentParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, caravan);
         //make sure a minimum point threshold is hit
         if (incidentParms.points < MinimumPointThreshold)
         {
             incidentParms.points = MinimumPointThreshold;
         }
         incidentParms.faction = Find.FactionManager.RandomEnemyFaction();
         PawnGroupMakerParms defaultPawnGroupMakerParms  = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, incidentParms, true);
         defaultPawnGroupMakerParms.generateFightersOnly = true;
         List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();
         Map map          = CaravanIncidentUtility.SetupCaravanAttackMap(caravan, list, false);
         if (list.Any <Pawn>())
         {
             LordMaker.MakeNewLord(incidentParms.faction, new LordJob_AssaultColony(incidentParms.faction, true, true, false, false, true), map, list);
         }
         Find.TickManager.CurTimeSpeed = TimeSpeed.Paused;
         GlobalTargetInfo lookTarget   = (!list.Any <Pawn>()) ? GlobalTargetInfo.Invalid : new GlobalTargetInfo(list[0].Position, map, false);
         Find.LetterStack.ReceiveLetter("LetterLabelIMAmbushLGE".Translate(), "LetterIMAmbushLGE".Translate(), LetterDefOf.ThreatBig, lookTarget, null);
     }, "GeneratingMapForNewEncounter", false, null);
 }
Esempio n. 2
0
        // Token: 0x060069B7 RID: 27063 RVA: 0x0024FA38 File Offset: 0x0024DC38
        public override void Resolve(ResolveParams rp)
        {
            Map map = BaseGen.globalSettings.map;
            PawnGroupMakerParms pawnGroupMakerParms = rp.pawnGroupMakerParams;

            if (pawnGroupMakerParms == null)
            {
                pawnGroupMakerParms         = new PawnGroupMakerParms();
                pawnGroupMakerParms.tile    = map.Tile;
                pawnGroupMakerParms.faction = Find.FactionManager.RandomEnemyFaction(false, false, true, TechLevel.Undefined);
                pawnGroupMakerParms.points  = 250f;
            }
            pawnGroupMakerParms.groupKind = (rp.pawnGroupKindDef ?? RimWorld.PawnGroupKindDefOf.Combat);
            List <PawnKindDef> list = new List <PawnKindDef>();

            foreach (Pawn pawn in PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms, true))
            {
                list.Add(pawn.kindDef);
                //	Log.Message("generating "+ pawn);
                ResolveParams resolveParams = rp;
                resolveParams.singlePawnToSpawn = pawn;
                BaseGen.symbolStack.Push("ExtraHives_Pawn", resolveParams, null);
            }
        }
Esempio n. 3
0
        public override void PostMapGenerate(Map map)
        {
            base.PostMapGenerate(map);

            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms
            {
                faction = Faction,
                points  = Mathf.Clamp(Rand.Range(300, 500) * (int)Faction.def.techLevel, 450, 1600),
                generateFightersOnly = true,
                groupKind            = PawnGroupKindDefOf.Combat,
                raidStrategy         = RaidStrategyDefOf.ImmediateAttack
            };

            List <Pawn> rebels = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList();

            IntVec3 spot;

            MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out spot, out IntVec3 second);
            foreach (var rebel in rebels)
            {
                if (CellFinder.TryFindRandomCellNear(spot, map, 6, (IntVec3 x) => x.Standable(map) && !x.Fogged(map), out IntVec3 loc))
                {
                    GenSpawn.Spawn(rebel, loc, map, Rot4.Random);
                    rebel.SetFaction(Faction.OfAncientsHostile);
                }
            }

            LordJob lordJob = new LordJob_AssaultColony(Faction.OfPlayer, canKidnap: false, canTimeoutOrFlee: false, canSteal: false);

            LordMaker.MakeNewLord(Faction.OfAncientsHostile, lordJob, map, rebels);

            supress       = true;
            UnlimitedTime = true;

            ShowInfo();
        }
        public static IEnumerable <Pawn> MountAnimals(PawnGroupMakerParms groupParms, bool warnOnZeroResults, IncidentParms parms)
        {
            List <Pawn> list = PawnGroupMakerUtility.GeneratePawns(groupParms, true).ToList();

            if (list.Count == 0)
            {
                return(list);
            }
            parms.raidArrivalMode.Worker.Arrive(list, parms);
            if (!(parms.raidArrivalMode == null || parms.raidArrivalMode == PawnsArrivalModeDefOf.EdgeWalkIn) || (parms.raidStrategy != null && parms.raidStrategy.workerClass == typeof(RaidStrategyWorker_Siege)))
            {
                return(list);
            }
            NPCMountUtility.generateMounts(ref list, parms, Base.inBiomeWeight, Base.outBiomeWeight, Base.nonWildWeight, Base.enemyMountChance, Base.enemyMountChanceTribal);

            foreach (Pawn pawn in list)
            {
                if (pawn.equipment == null)
                {
                    pawn.equipment = new Pawn_EquipmentTracker(pawn);
                }
            }
            return(list);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            if (!TryFindSpawnSpot(map, out IntVec3 spawnSpot))
            {
                return(false);
            }
            if (!TryFindEnemyFaction(out Faction enemyFac))
            {
                return(false);
            }
            int           @int      = Rand.Int;
            IncidentParms raidParms = StorytellerUtility.DefaultParmsNow(IncidentCategoryDefOf.ThreatBig, map);

            raidParms.forced             = true;
            raidParms.faction            = enemyFac;
            raidParms.raidStrategy       = RaidStrategyDefOf.ImmediateAttack;
            raidParms.raidArrivalMode    = PawnsArrivalModeDefOf.EdgeWalkIn;
            raidParms.spawnCenter        = spawnSpot;
            raidParms.points             = Mathf.Max(raidParms.points * RaidPointsFactorRange.RandomInRange, enemyFac.def.MinPointsToGeneratePawnGroup(PawnGroupKindDefOf.Combat));
            raidParms.pawnGroupMakerSeed = @int;
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, raidParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(defaultPawnGroupMakerParms.points, raidParms.raidArrivalMode, raidParms.raidStrategy, defaultPawnGroupMakerParms.faction, PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(defaultPawnGroupMakerParms);
            PawnGenerationRequest     request   = new PawnGenerationRequest(PawnKindDefOf.SpaceRefugee, null, PawnGenerationContext.NonPlayer, -1, forceGenerateNewPawn: false, newborn: false, allowDead: false, allowDowned: false, canGeneratePawnRelations: true, mustBeCapableOfViolence: false, colonistRelationChanceFactor: 20f);
            Pawn refugee = PawnGenerator.GeneratePawn(request);

            refugee.relations.everSeenByPlayer = true;
            string text = "RefugeeChasedInitial".Translate(refugee.Name.ToStringFull, refugee.story.Title, enemyFac.def.pawnsPlural, enemyFac.Name, refugee.ageTracker.AgeBiologicalYears, PawnUtility.PawnKindsToCommaList(pawnKinds, useAnd: true), refugee.Named("PAWN"));

            text = text.AdjustedFor(refugee);
            TaggedString temp = new TaggedString(text);

            PawnRelationUtility.TryAppendRelationsWithColonistsInfo(ref temp, refugee);
            DiaNode   diaNode   = new DiaNode(text);
            DiaOption diaOption = new DiaOption("RefugeeChasedInitial_Accept".Translate());

            diaOption.action = delegate
            {
                GenSpawn.Spawn(refugee, spawnSpot, map);
                refugee.SetFaction(Faction.OfPlayer);
                CameraJumper.TryJump(refugee);
                QueuedIncident qi = new QueuedIncident(new FiringIncident(IncidentDefOf.RaidEnemy, null, raidParms), Find.TickManager.TicksGame + RaidDelay.RandomInRange);
                Find.Storyteller.incidentQueue.Add(qi);
            };
            diaOption.resolveTree = true;
            diaNode.options.Add(diaOption);
            string    text2      = "RefugeeChasedRejected".Translate(refugee.LabelShort, refugee);
            DiaNode   diaNode2   = new DiaNode(text2);
            DiaOption diaOption2 = new DiaOption("OK".Translate());

            diaOption2.resolveTree = true;
            diaNode2.options.Add(diaOption2);
            DiaOption diaOption3 = new DiaOption("RefugeeChasedInitial_Reject".Translate());

            diaOption3.action = delegate
            {
                Find.WorldPawns.PassToWorld(refugee);
            };
            diaOption3.link = diaNode2;
            diaNode.options.Add(diaOption3);
            string title = "RefugeeChasedTitle".Translate(map.Parent.Label);

            Find.WindowStack.Add(new Dialog_NodeTreeWithFactionInfo(diaNode, enemyFac, delayInteractivity: true, radioMode: true, title: title));
            Find.Archive.Add(new ArchivedDialog(diaNode.text, title, enemyFac));
            return(true);
        }
Esempio n. 6
0
        // RimWorld.PawnGroupKindWorker_Normal
        public static void GeneratePawns_PostFix(PawnGroupMakerParms parms, PawnGroupMaker groupMaker, bool errorOnZeroResults, ref List <Pawn> __result)
        {
            //Anyone special?
            if (__result.Any() && __result.FindAll(x => x.TryGetComp <CompAbilityUser>() is CompAbilityUser cu && cu.CombatPoints() > 0) is List <Pawn> specialPawns)
            {
                //Log.Message("Special Pawns Detected");
                //Log.Message("------------------");

                //Points
                var previousPoints = parms.points;
                //Log.Message("Points: " +  previousPoints);

                //Log.Message("Average Characters");
                //Log.Message("------------------");

                //Anyone average?
                int avgPawns        = 0;
                var avgCombatPoints = new Dictionary <Pawn, float>();
                if (__result.FindAll(x => x.TryGetComp <CompAbilityUser>() == null) is List <Pawn> averagePawns)
                {
                    avgPawns = averagePawns.Count;
                    averagePawns.ForEach(x =>
                    {
                        avgCombatPoints.Add(x, x.kindDef.combatPower);
                        //Log.Message(x.LabelShort + " : " + x.kindDef.combatPower);
                    });
                }

                //Log.Message("------------------");
                //Log.Message("Special Characters");
                //Log.Message("------------------");

                //What's your powers?
                var specCombatPoints = new Dictionary <Pawn, float>();
                specialPawns.ForEach(x =>
                {
                    var combatValue = x.kindDef.combatPower;
                    foreach (var thingComp in x.AllComps.FindAll(y => y is CompAbilityUser))
                    {
                        //var compAbilityUser = (CompAbilityUser) thingComp;
                        var val      = Traverse.Create(thingComp).Method("CombatPoints").GetValue <float>();
                        combatValue += val; //compAbilityUser.CombatPoints();
                    }
                    specCombatPoints.Add(x, combatValue);
                    //Log.Message(x.LabelShort + " : " + combatValue);
                });


                //Special case -- single raider/character should not be special to avoid problems (e.g. Werewolf raid destroys everyone).
                if (avgPawns == 0 && specCombatPoints.Sum(x => x.Value) > 0 && specialPawns.Count == 1)
                {
                    //Log.Message("Special case called: Single character");
                    specialPawns.First().TryGetComp <CompAbilityUser>().DisableAbilityUser();
                    return;
                }

                //Should we rebalance?
                int tryLimit             = avgPawns + specialPawns.Count + 1;
                int initTryLimit         = tryLimit;
                var tempAvgCombatPoints  = new Dictionary <Pawn, float>(avgCombatPoints);
                var tempSpecCombatPoints = new Dictionary <Pawn, float>(specCombatPoints);
                var removedCharacters    = new List <Pawn>();
                while (previousPoints < tempAvgCombatPoints.Sum(x => x.Value) + tempSpecCombatPoints.Sum(x => x.Value))
                {
                    //Log.Message("------------------");
                    //Log.Message("Rebalance Attempt # " + (initTryLimit - tryLimit + 1));
                    //Log.Message("------------------");
                    //Log.Message("Scenario Points: " + previousPoints + ". Total Points: " + tempAvgCombatPoints.Sum(x => x.Value) + tempSpecCombatPoints.Sum(x => x.Value));

                    //In-case some stupid stuff occurs
                    --tryLimit;
                    if (tryLimit < 0)
                    {
                        break;
                    }

                    //If special characters outnumber the avg characters, try removing some of the special characters instead.
                    if (tempSpecCombatPoints.Count >= tempAvgCombatPoints.Count)
                    {
                        var toRemove = tempSpecCombatPoints.Keys.RandomElement();
                        //Log.Message("Removed: " + toRemove.LabelShort + " : " + tempSpecCombatPoints[toRemove]);
                        removedCharacters.Add(toRemove);
                        tempSpecCombatPoints.Remove(toRemove);
                    }
                    //If average characters outnumber special characters, then check if the combat value of avg is greater.
                    else if (tempSpecCombatPoints.Count < tempAvgCombatPoints.Count)
                    {
                        //Remove a random average character if the average characters have more combat points for a score
                        if (tempAvgCombatPoints.Sum(x => x.Value) > tempSpecCombatPoints.Sum(x => x.Value))
                        {
                            var toRemove = tempAvgCombatPoints.Keys.RandomElement();
                            //Log.Message("Removed: " + toRemove.LabelShort + " : " + tempSpecCombatPoints[toRemove]);
                            removedCharacters.Add(toRemove);
                            tempAvgCombatPoints.Remove(toRemove);
                        }
                        else
                        {
                            var toRemove = tempSpecCombatPoints.Keys.RandomElement();
                            //Log.Message("Removed: " + toRemove.LabelShort + " : " + tempSpecCombatPoints[toRemove]);
                            removedCharacters.Add(toRemove);
                            tempSpecCombatPoints.Remove(toRemove);
                        }
                    }
                }
                avgCombatPoints  = tempAvgCombatPoints;
                specCombatPoints = tempSpecCombatPoints;

//                Log.Message("------------");
//                Log.Message("Final Report");
//                Log.Message("------------");
//                Log.Message("Scenario Points: " + previousPoints + ". Total Points: " + tempAvgCombatPoints.Sum(x => x.Value) + tempSpecCombatPoints.Sum(x => x.Value));
//                Log.Message("------------");
//                Log.Message("Characters");
//                Log.Message("------------------");
                __result.ForEach(x =>
                {
                    var combatValue = x.kindDef.combatPower + x?.TryGetComp <CompAbilityUser>()?.CombatPoints() ?? 0f;
                    //Log.Message(x.LabelShort + " : " + combatValue);
                });
                foreach (var x in removedCharacters)
                {
                    if (x.TryGetComp <CompAbilityUser>() is CompAbilityUser cu && cu.CombatPoints() > 0)
                    {
                        cu.DisableAbilityUser();
                    }
Esempio n. 7
0
            public static void Listener(PawnGroupMakerParms parms, bool warnOnZeroResults, ref IEnumerable <Pawn> __result)
            {
                try {
                    //If active solar flare then no surrogates are generated to prevent ridiculous spawn of dawned surrogates
                    if (!Settings.otherFactionsCanUseSurrogate || Utils.ExceptionBlacklistedFactionNoSurrogate.Contains(parms.faction.def.defName) || Utils.getRandomMapOfPlayer().gameConditionManager.ConditionIsActive(GameConditionDefOf.SolarFlare) || (Settings.androidsAreRare && Rand.Chance(0.95f)))
                    {
                        return;
                    }

                    int nbHumanoids = 0;

                    foreach (var e in __result)
                    {
                        //Si humanoide
                        if (e.def.race != null && e.def.race.Humanlike)
                        {
                            //Si pas commercant
                            if (e.trader == null && e.TraderKind == null)
                            {
                                nbHumanoids++;
                            }

                            //Si android T1/T2 suppression traits ==> Je suis bete cest a cause des surrogates que j'ai crus qu'il avais des traits

                            /*if(e.def.defName == Utils.T1 || e.def.defName == Utils.T2)
                             * {
                             *  Utils.removeAllTraits(e);
                             * }*/
                        }
                    }

                    //Faction de niveau industriel et plus ET nb pawn généré supérieur ou égal à 5
                    if (parms.faction.def.techLevel >= TechLevel.Industrial && nbHumanoids >= 5)
                    {
                        List <Pawn> other = new List <Pawn>();
                        List <Pawn> ret   = new List <Pawn>();
                        List <Pawn> tmp   = __result.ToList();

                        //On supprime les non humains ET trader
                        //int nba = tmp.RemoveAll((Pawn x) => (x.def.race == null || !x.def.race.Humanlike || x.trader != null || x.TraderKind != null));
                        foreach (var x in tmp)
                        {
                            if (x.def.race == null || !x.def.race.Humanlike || x.trader != null || x.TraderKind != null)
                            {
                                other.Add(x);
                            }
                        }

                        //Purge dans list de travail
                        foreach (var e in other)
                        {
                            tmp.Remove(e);
                        }

                        //Log.Message(other.Count + " animaux et traders virés");

                        //Calcul nb pawn a recreer en mode surrogate
                        int nb = (int)(tmp.Count() * Rand.Range(Settings.percentageOfSurrogateInAnotherFactionGroupMin, Settings.percentageOfSurrogateInAnotherFactionGroup));
                        if (nb <= 0)
                        {
                            if (Settings.percentageOfSurrogateInAnotherFactionGroupMin == 0.0f)
                            {
                                return;
                            }
                            else
                            {
                                nb = 1;
                            }
                        }

                        //On va supprimer aleatoirement N pawns pour arriver a nb
                        while (tmp.Count > nb)
                        {
                            Pawn p = tmp.RandomElement();
                            other.Add(p);
                            tmp.Remove(p);
                        }

                        //Log.Message("HERE");
                        //On va se servir des nb pawn pregénéré par la fonction patché comme controller
                        for (int i = 0; i != nb; i++)
                        {
                            //PawnGenerationRequest request = new PawnGenerationRequest(Utils.AndroidsPKD[3], parms.faction, PawnGenerationContext.NonPlayer, parms.tile, false, false, false, false, true, false, 1f, false, true, true, false, false, false, false, null, null, null, null, null, null, null, null);
                            //Pawn surrogate = PawnGenerator.GeneratePawn(request);

                            PawnKindDef rpkd = null;

                            if (parms.groupKind == PawnGroupKindDefOf.Peaceful || parms.groupKind == PawnGroupKindDefOf.Trader)
                            {
                                if (Rand.Chance(0.10f))
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f))
                                    {
                                        rpkd = Utils.AndroidsPKDNeutral[3];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDNeutral[3];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDNeutral[3];
                                    }
                                }
                                else if (Rand.Chance(0.35f))
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f))
                                    {
                                        rpkd = Utils.AndroidsPKDNeutral[2];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDNeutral[2];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDNeutral[2];
                                    }
                                }
                                else if (Rand.Chance(0.55f))
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsPKDNeutral[1];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDNeutral[1];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDNeutral[1];
                                    }
                                }
                                else
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f))
                                    {
                                        rpkd = Utils.AndroidsPKDNeutral[0];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDNeutral[0];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDNeutral[0];
                                    }
                                }
                            }
                            else
                            {
                                if (Rand.Chance(0.10f))
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f))
                                    {
                                        rpkd = Utils.AndroidsPKDHostile[3];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDHostile[3];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDHostile[3];
                                    }
                                }
                                else if (Rand.Chance(0.35f))
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f))
                                    {
                                        rpkd = Utils.AndroidsPKDHostile[2];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDHostile[2];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDHostile[2];
                                    }
                                }
                                else if (Rand.Chance(0.55f))
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsPKDHostile[1];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDHostile[1];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDHostile[1];
                                    }
                                }
                                else
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f))
                                    {
                                        rpkd = Utils.AndroidsPKDHostile[0];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDHostile[0];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDHostile[0];
                                    }
                                }
                            }

                            //Utils.AndroidsPKD.RandomElement();
                            Pawn surrogate = Utils.generateSurrogate(parms.faction, rpkd, IntVec3.Invalid, null, false, true, parms.tile, true, parms.inhabitants);

                            //Si en mode rare alors override de la creation d'androides en ancient, on squeeze l'init du pawn
                            if (!surrogate.IsAndroidTier())
                            {
                                surrogate.Destroy();
                                ret.Add(tmp[i]);
                                continue;
                            }

                            //Log.Message("--Surrogate generated pour "+tmp[i].def.defName);

                            //On vire les equipements/inventaires/vetements du surrogate
                            if (surrogate.inventory != null && surrogate.inventory.innerContainer != null)
                            {
                                surrogate.inventory.innerContainer.Clear();
                            }

                            surrogate.apparel.DestroyAll();

                            surrogate.equipment.DestroyAllEquipment();


                            CompAndroidState cas = surrogate.ATCompState;
                            if (cas != null)
                            {
                                cas.externalController = tmp[i];
                                CompSurrogateOwner cso = tmp[i].ATCompSurrogateOwner;
                                if (cso != null)
                                {
                                    cso.setControlledSurrogate(surrogate, true);
                                }
                            }

                            //Transfere equipement
                            //Log.Message("--Traitement des equipements");
                            if (tmp[i].equipment != null && surrogate.equipment != null)
                            {
                                /*Pawn_EquipmentTracker pet = tmp[i].equipment;
                                 * pet.pawn = surrogate;
                                 * tmp[i].equipment = surrogate.equipment;
                                 * tmp[i].equipment.pawn = tmp[i];
                                 * surrogate.equipment = pet;*/
                                surrogate.equipment.DestroyAllEquipment();

                                foreach (var e in tmp[i].equipment.AllEquipmentListForReading.ToList())
                                {
                                    try
                                    {
                                        tmp[i].equipment.Remove(e);
                                        if (!(e.def.equipmentType == EquipmentType.Primary && surrogate.equipment.Primary != null))
                                        {
                                            surrogate.equipment.AddEquipment(e);
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        Log.Message("[ATPP] PawnGroupMakerUtility.GeneratePawns.transfertEquipment " + ex.Message + " " + ex.StackTrace);
                                    }
                                }


                                foreach (var e in surrogate.equipment.AllEquipmentListForReading)
                                {
                                    try
                                    {
                                        if (Utils.CELOADED && e != null && e.def.IsRangedWeapon)
                                        {
                                            ThingComp ammoUser = Utils.TryGetCompByTypeName(e, "CompAmmoUser", "CombatExtended");
                                            if (ammoUser != null)
                                            {
                                                var      props        = Traverse.Create(ammoUser).Property("Props").GetValue();
                                                int      magazineSize = Traverse.Create(props).Field("magazineSize").GetValue <int>();
                                                ThingDef def          = Traverse.Create(ammoUser).Field("selectedAmmo").GetValue <ThingDef>();
                                                if (def != null)
                                                {
                                                    Traverse.Create(ammoUser).Method("ResetAmmoCount", new object[] { def }).GetValue();
                                                }
                                            }
                                        }
                                    }
                                    catch (Exception)
                                    {
                                    }
                                }
                            }

                            /*foreach(var e in tmp[i].equipment.AllEquipmentListForReading.ToList())
                             * {
                             *  e.
                             *  surrogate.equipment.AddEquipment(e);
                             * }*/


                            //Transfert vetements
                            if (tmp[i].apparel != null)
                            {
                                try
                                {
                                    //Log.Message("--Traitement des vetements");
                                    foreach (var e in tmp[i].apparel.WornApparel.ToList())
                                    {
                                        //Check si vetement peut etre porté par le surrogate
                                        string path = "";
                                        if (e.def.apparel.LastLayer == ApparelLayerDefOf.Overhead)
                                        {
                                            path = e.def.apparel.wornGraphicPath;
                                        }
                                        else
                                        {
                                            path = e.def.apparel.wornGraphicPath + "_" + surrogate.story.bodyType.defName + "_south";
                                        }

                                        Texture2D appFoundTex = null;
                                        Texture2D appTex      = null;
                                        //CHeck dans les mods de la texture
                                        for (int j = LoadedModManager.RunningModsListForReading.Count - 1; j >= 0; j--)
                                        {
                                            appTex = LoadedModManager.RunningModsListForReading[j].GetContentHolder <Texture2D>().Get(path);
                                            if (appTex != null)
                                            {
                                                appFoundTex = appTex;
                                                break;
                                            }
                                        }
                                        //Check RW mods  de la texture
                                        if (appFoundTex == null)
                                        {
                                            path        = GenFilePaths.ContentPath <Texture2D>() + path;
                                            appFoundTex = (Texture2D)((object)Resources.Load <Texture2D>(path));
                                        }

                                        //SI pb avec texture on ne l'ajoute pas
                                        if (appFoundTex != null)
                                        {
                                            tmp[i].apparel.Remove(e);
                                            surrogate.apparel.Wear(e);
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Log.Message("[ATPP] PawnGroupMakerUtility.TransfertApparel " + ex.Message + " " + ex.StackTrace);
                                }
                            }


                            //Log.Message((tmp[i].inventory == null)+" "+(tmp[i].inventory.innerContainer == null)+" "+(surrogate.inventory == null)+" "+(surrogate.inventory.innerContainer== null));
                            //Inventaire
                            if (tmp[i].inventory != null && tmp[i].inventory.innerContainer != null && surrogate.inventory != null && surrogate.inventory.innerContainer != null)
                            {
                                //foreach (var e in tmp[i].inventory.innerContainer.ToList())
                                //{
                                //Log.Message("Items transfered " + tmp[i].inventory.innerContainer.Count);
                                try
                                {
                                    tmp[i].inventory.innerContainer.TryTransferAllToContainer(surrogate.inventory.innerContainer);

                                    //Suppression des drogues
                                    foreach (var el in surrogate.inventory.innerContainer.ToList())
                                    {
                                        if (el.def.IsDrug)
                                        {
                                            surrogate.inventory.innerContainer.Remove(el);
                                        }
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Log.Message("[ATPP] PawnGroupMakerUtility.GeneratePawns.transfertInventory " + ex.Message + " " + ex.StackTrace);
                                }
                                //}
                            }

                            ret.Add(surrogate);
                        }

                        //On remet dans le ret les autres pawns non "surogatisés"
                        __result = other.Concat(ret);
                    }
                }
                catch (Exception ex)
                {
                    Log.Message("[ATPP] PawnGroupMakerUtility.GeneratePawns " + ex.Message + " " + ex.StackTrace);
                }
            }
Esempio n. 8
0
        public override void Resolve(ResolveParams rp)
        {
            Map     map              = BaseGen.globalSettings.map;
            Faction faction          = rp.faction ?? Find.FactionManager.RandomEnemyFaction(false, false, true, TechLevel.Undefined);
            int     num              = 0;
            int?    edgeDefenseWidth = rp.edgeDefenseWidth;

            if (edgeDefenseWidth.HasValue)
            {
                num = rp.edgeDefenseWidth.Value;
            }
            else if (rp.rect.Width >= 20 && rp.rect.Height >= 20 && (faction.def.techLevel >= TechLevel.Industrial || Rand.Bool))
            {
                num = ((!Rand.Bool) ? 4 : 2);
            }
            float num2 = (float)rp.rect.Area / 144f * 0.17f;

            BaseGen.globalSettings.minEmptyNodes = ((num2 >= 1f) ? GenMath.RoundRandom(num2) : 0);
            Lord          singlePawnLord = rp.singlePawnLord ?? LordMaker.MakeNewLord(faction, new LordJob_DefendBase(faction, rp.rect.CenterCell), map, null);
            TraverseParms traverseParms  = TraverseParms.For(TraverseMode.PassDoors, Danger.Deadly, false);
            ResolveParams resolveParams  = rp;

            resolveParams.rect             = rp.rect;
            resolveParams.faction          = faction;
            resolveParams.singlePawnLord   = singlePawnLord;
            resolveParams.pawnGroupKindDef = (rp.pawnGroupKindDef ?? PawnGroupKindDefOf.Settlement);
            resolveParams.singlePawnSpawnCellExtraPredicate = (rp.singlePawnSpawnCellExtraPredicate ?? ((IntVec3 x) => map.reachability.CanReachMapEdge(x, traverseParms)));
            if (resolveParams.pawnGroupMakerParams == null)
            {
                resolveParams.pawnGroupMakerParams         = new PawnGroupMakerParms();
                resolveParams.pawnGroupMakerParams.tile    = map.Tile;
                resolveParams.pawnGroupMakerParams.faction = faction;
                PawnGroupMakerParms arg_209_0   = resolveParams.pawnGroupMakerParams;
                float?settlementPawnGroupPoints = rp.settlementPawnGroupPoints;
                arg_209_0.points = ((!settlementPawnGroupPoints.HasValue) ? SymbolResolver_Settlement.DefaultPawnsPoints.RandomInRange : settlementPawnGroupPoints.Value);
                resolveParams.pawnGroupMakerParams.inhabitants = true;
                resolveParams.pawnGroupMakerParams.seed        = rp.settlementPawnGroupSeed;
            }
            BaseGen.symbolStack.Push("pawnGroup", resolveParams);
            BaseGen.symbolStack.Push("outdoorLighting", rp);
            if (faction.def.techLevel >= TechLevel.Industrial)
            {
                int num3 = (!Rand.Chance(0.75f)) ? 0 : GenMath.RoundRandom((float)rp.rect.Area / 400f);
                for (int i = 0; i < num3; i++)
                {
                    ResolveParams resolveParams2 = rp;
                    resolveParams2.faction = faction;
                    BaseGen.symbolStack.Push("firefoamPopper", resolveParams2);
                }
            }
            if (num > 0)
            {
                ResolveParams resolveParams3 = rp;
                resolveParams3.faction          = faction;
                resolveParams3.edgeDefenseWidth = new int?(num);
                BaseGen.symbolStack.Push("edgeDefense", resolveParams3);
            }
            ResolveParams resolveParams4 = rp;

            resolveParams4.rect    = rp.rect.ContractedBy(num);
            resolveParams4.faction = faction;
            BaseGen.symbolStack.Push("ensureCanReachMapEdge", resolveParams4);
            ResolveParams resolveParams5 = rp;

            resolveParams5.rect    = rp.rect.ContractedBy(num);
            resolveParams5.faction = faction;
            BaseGen.symbolStack.Push("basePart_outdoors", resolveParams5);
        }
Esempio n. 9
0
        private static void RebalanceGeneratedPawns(PawnGroupMakerParms parms, List <Pawn> pawns)
        {
            // PawnGroupKindWorker does not guaranteed that the sum of pawn points (pawn.kindDef.combatPower) <= parms.points.
            // Chattel pawns (slaves and animals) are not included in parms.points yet are in __result.
            // Also, PawnGroupKindWorker_Trader decrements parms.points for trader pawns, effectively likewise excluding them.
            var targetPoints = parms.points; // parms.points + special trader points (see below)
            var targetCount  = 0;            // debug only, represents the pawns contributing to targetPoints
            var origCount    = 0;            // debug only, represents the pawns contributing to parms.points

            // Partition into special and normal pawns, calculating combat points for each.
            // Note: entry lists are allocated only if necessary.
            var specials = new PawnAbilityPointsEntries();
            var normals  = new PawnAbilityPointsEntries();
            var excluded = new PawnAbilityPointsEntries(); // debug only

            foreach (var pawn in pawns)
            {
                var entry = PawnAbilityPointsEntry.For(pawn);
                // parms.points is not used for slaves and animals, so exclude them.
                // Using GetTraderCaravanRole() for this, since Humanoid Alien Races patches this method to account for alienslavekinds.
                var traderCaravanRole = pawn.GetTraderCaravanRole();
                if (traderCaravanRole == TraderCaravanRole.Chattel || traderCaravanRole == TraderCaravanRole.Carrier)
                {
                    DebugAdd(ref excluded, entry);
                }
                // Not using TraderCaravanRole.Trader for determining traders - non-null pawn.traders is the authoritative source.
                else if (pawn.trader == null)
                {
                    if (entry.IsSpecial)
                    {
                        specials.Add(entry);
                    }
                    else
                    {
                        normals.Add(entry);
                    }
                    DebugAdd(ref origCount, 1);
                    DebugAdd(ref targetCount, 1);
                }
                else
                {
                    // PawnGroupKindWorker_Trader reduces parms.points by trader's cost, so exclude them as well.
                    if (entry.IsSpecial)
                    {
                        // Not excluding 'special' traders yet, to allow them to be disabled into normal traders in below rebalancing loop.
                        specials.Add(entry);
                        // Since they're not excluded yet, include them in targetPoints (and targetCount);
                        // this will be "undone" if disabled in below rebalancing loop.
                        DebugAdd(ref targetCount, 1);
                        targetPoints += entry.basePoints;
                    }
                    else
                    {
                        DebugAdd(ref excluded, entry, isDebugLog);
                    }
                }
            }

            if (specials.count > 0)
            {
                DebugMessage(rgpMsgPrefix + "Target: " + (targetCount != origCount
                    ? $"#pawns = {origCount} orig + {targetCount - origCount} special trader = {targetCount}, " +
                                                          $"points = {parms.points} orig + {targetPoints - parms.points} special trader = {targetPoints}"
                    : $"#pawns = {targetCount}, points = {targetPoints}"));
                DebugMessage(rgpMsgPrefix + "Special: " + specials);
                DebugMessage(rgpMsgPrefix + "Normal: " + normals);
                DebugMessage(rgpMsgPrefix + "Excluded: " + excluded);

                // Rebalancing loop:
                // Until # special pawns = 0 or # pawns <= 1 or special pawn + normal pawn points <= target points:
                //   If # special pawns > # normal pawns or special pawn points > normal pawn points:
                //     Try to disable a random special pawn into a normal pawn.
                //     If this fails, remove the special pawn instead.
                //     Except if the special pawn being disabled is a trader, just exclude them like normal traders even if disabling fails.
                //   Else:
                //     Remove a random normal pawn.
                var iterCount = 0;                              // debug only
                var destroyed = new PawnAbilityPointsEntries(); // debug only
                while (true)
                {
                    var condition = specials.count > 0 && specials.count + normals.count > 1 &&
                                    specials.points + normals.points > targetPoints;
                    DebugMessage(rgpMsgPrefix + (condition ? $"Rebalance iteration {++iterCount}" : "Final"));
                    DebugMessage(rgpMsgPrefix + "#pawns: " + (targetCount != origCount
                            ? $"{origCount} orig + {targetCount - origCount} special trader = {targetCount}"
                            : $"{targetCount} orig") +
                                 $", {specials.count} special + {normals.count} normal = {specials.count + normals.count}, " +
                                 $"{excluded.count} excluded, {destroyed.count} destroyed");
                    DebugMessage(rgpMsgPrefix + "points: " + (targetPoints != parms.points
                            ? $"{parms.points} orig + {targetPoints - parms.points} special trader = {targetPoints}"
                            : $"{targetPoints} orig") +
                                 $", {specials.points} special + {normals.points} normal = {specials.points + normals.points}, " +
                                 $"{excluded.points} excluded, {destroyed.points} destroyed");
                    if (!condition)
                    {
                        break;
                    }

                    if (specials.count >= normals.count || specials.points >= normals.points)
                    {
                        var entry = specials.list.RandomElement();
                        var pawn  = entry.pawn;
                        specials.Remove(entry);
                        var newEntry = entry.DisableAbilityUser();
                        if (pawn.trader != null)
                        {
                            if (newEntry.IsSpecial)
                            {
                                Log.Warning(rgpMsgPrefix + "DisableAbilityUser on 'special' trader pawn {entry} into " +
                                            $"'normal' trader pawn {newEntry} may not have worked, but keeping this pawn due to trader status");
                                // Even if disabling didn't work, exclude them like normal trader pawns from more rebalancing, but do NOT
                                // "undo" their inclusion in targetPoints, so that rebalancing still has to account for their base points.
                            }
                            else
                            {
                                DebugMessage(rgpMsgPrefix + "Disabled special trader pawn {entry} into normal trader pawn {newEntry}");
                                // Once disabled, exclude them like normal trader pawns from more rebalancing,
                                // and "undo" their inclusion in targetPoints (and targetCount).
                                targetPoints -= newEntry.basePoints;
                                DebugAdd(ref targetCount, -1);
                            }
                            DebugAdd(ref excluded, newEntry, addToList: false);
                        }
                        else
                        {
                            if (newEntry.IsSpecial)
                            {
                                Log.Warning(rgpMsgPrefix + "DisableAbilityUser on 'special' pawn {entry} into 'normal' pawn {newEntry} " +
                                            "may not have worked, so destroying this pawn");
                                pawn.DestroyOrPassToWorld();
                                pawns.Remove(pawn);
                                DebugAdd(ref destroyed, newEntry, addToList: false);
                            }
                            else
                            {
                                DebugMessage(rgpMsgPrefix + "Disabled special non-trader pawn {entry} into normal non-trader pawn {newEntry}");
                                normals.Add(newEntry);
                            }
                        }
                    }
                    else
                    {
                        // Note: Since specCount < avgCount, there's at least one normal pawn.
                        var entry = normals.list.RandomElement();
                        var pawn  = entry.pawn;
                        DebugMessage(rgpMsgPrefix + "Destroyed normal non-trader pawn {entry}");
                        normals.Remove(entry);
                        pawn.DestroyOrPassToWorld();
                        pawns.Remove(pawn);
                        DebugAdd(ref destroyed, entry, addToList: false);
                    }
                }
                DebugMessage(rgpMsgPrefix + "Result: #pawns = {pawns.Count}" +
                             pawns.Join(pawn => $"\n\t{PawnAbilityPointsEntry.For(pawn)}", ""));
            }
        }
Esempio n. 10
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            ResolveRaidPoints(parms);
            if (!TryResolveRaidFaction(parms))
            {
                return(false);
            }
            PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;

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

            if (list.Count == 0)
            {
                Log.Error("Got no pawns spawning raid from parms " + parms);
                return(false);
            }

            GenerateAnimals(parms.faction, list, (Map)parms.target, parms.points);

            parms.raidArrivalMode.Worker.Arrive(list, parms);
            StringBuilder stringBuilder = new StringBuilder();

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

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, GetRelatedPawnsInfoLetterText(parms), informEvenIfSeenBefore: 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())
                {
                    list2.Add(list4[0]);
                }
                for (int i = 0; i < list3.Count; i++)
                {
                    if (list3[i] != list4 && list3[i].Any())
                    {
                        list2.Add(list3[i][0]);
                    }
                }
            }
            else if (list.Any())
            {
                list2.Add(list[0]);
            }
            SendStandardLetter(letterLabel, letterText, GetLetterDef(), parms, list2);
            parms.raidStrategy.Worker.MakeLords(parms, list);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
            if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts))
            {
                for (int j = 0; j < list.Count; j++)
                {
                    Pawn pawn = list[j];
                    if (pawn.RaceProps.Humanlike && pawn.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt))
                    {
                        LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical);
                        break;
                    }
                }
            }

            Find.TickManager.slower.SignalForceNormalSpeedShort();
            Find.StoryWatcher.statsRecord.numRaidsEnemy++;
            return(true);
        }
Esempio n. 11
0
        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.ParseViewersFromJsonAndFindActiveViewers();

            if (list.Count > 0 && viewernames != null)
            {
                int count        = 0;
                int totalviewers = viewernames.Count();
                foreach (Pawn pawn in list)
                {
                    if (count == list.Count() || viewernames.NullOrEmpty() || pawn.RaceProps.IsMechanoid)
                    {
                        continue;
                    }
                    int        thisviewer = Verse.Rand.Range(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);
        }
Esempio n. 12
0
        static void Postfix(ref IEnumerable <Pawn> __result, PawnGroupMakerParms parms, bool warnOnZeroResults = true)
        {
            Faction faction = parms.faction;

            if (faction == null)
            {
                //    if (Prefs.DevMode) Log.Message("Faction null");
                return;
            }
            if (__result.EnumerableNullOrEmpty())
            {
                //    if (Prefs.DevMode) Log.Message("no pawns");
                return;
            }
            List <Pawn> resultingPawns = __result.ToList();
            int         pawnsInRaid    = resultingPawns.Count;

            for (int i = 0; i < pawnsInRaid; i++)
            {
                Pawn trainer = resultingPawns[i];
                SpawnWithAnimalsExtension ext = null;
                if (trainer.kindDef.HasModExtension <SpawnWithAnimalsExtension>())
                {
                    ext = trainer.kindDef.GetModExtensionFast <SpawnWithAnimalsExtension>();
                }
                if (ext != null)
                {
                    if (ext.kindDefs.NullOrEmpty())
                    {
                        continue;
                    }
                    int         animalPoints;
                    int         amountToAdd;
                    PawnKindDef kindDef;
                    if (ext.animalPoints > 0)
                    {
                        if (ext.kindDefs.Any(x => x.Cost < ext.animalPoints))
                        {
                            animalPoints = (int)ext.animalPoints;
                        }
                        else
                        {
                            animalPoints = (int)(parms.points * ext.animalPoints);
                        }
                    }
                    else
                    {
                        animalPoints = (int)(parms.points / pawnsInRaid);
                    }
                    kindDef     = ext.kindDefs.RandomElementByWeight(x => x.selectionWeight).kind;
                    amountToAdd = (int)Mathf.Clamp(animalPoints / kindDef.combatPower, ext.animalCount.min, ext.animalCount.max);
                    if (amountToAdd == 0)
                    {
                        //if (Prefs.DevMode) Log.Message("[AnimalHusbandryRaids] Too few pawns to add animals to, ignoring.");
                        return;
                    }
                    if (Prefs.DevMode)
                    {
                        Log.Message($"[AnimalHusbandryRaids] Adding {amountToAdd} animals to raid from {faction.Name}, {faction.def.defName}.");
                    }
                    for (int i2 = 0; i2 < amountToAdd; i2++)
                    {
                        Pawn foundPawn = PawnGenerator.GeneratePawn(ext.kindDefs.RandomElementByWeight(x => x.selectionWeight).kind, faction);
                        if (foundPawn == null)
                        {
                            return;
                        }
                        foundPawn.SetFaction(faction);
                        foundPawn.training.Train(TrainableDefOf.Obedience, null, true);
                        foundPawn.training.SetWantedRecursive(TrainableDefOf.Obedience, true);
                        trainer.relations.AddDirectRelation(PawnRelationDefOf.Bond, foundPawn);
                        foundPawn.playerSettings.Master = trainer;
                        resultingPawns.Add(foundPawn);
                    }
                }
            }

            __result = resultingPawns;
        }
Esempio n. 13
0
        public static List <Pawn> GeneratePawnsForBoats(IncidentParms parms, PawnGroupKindDef group)
        {
            PawnGroupMakerParms pawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(group, parms, true);

            return(PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms, false).ToList <Pawn>());
        }
        // Token: 0x0600007E RID: 126 RVA: 0x00004D24 File Offset: 0x00002F24
        public override void Resolve(ResolveParams rp)
        {
            Map     map              = BaseGen.globalSettings.map;
            Faction faction          = rp.faction ?? Find.FactionManager.RandomEnemyFaction(false, false, true, TechLevel.Undefined);
            int     num              = 0;
            int?    edgeDefenseWidth = rp.edgeDefenseWidth;

            if (edgeDefenseWidth != null)
            {
                num = rp.edgeDefenseWidth.Value;
            }
            else if (rp.rect.Width >= 40 && rp.rect.Height >= 20 && (faction.def.techLevel >= TechLevel.Animal || Rand.Bool))
            {
                num = ((!Rand.Bool) ? 4 : 2);
            }
            float num2 = (float)rp.rect.Area / 144f * 0.17f;

            BaseGen.globalSettings.minEmptyNodes = ((num2 >= 1f) ? GenMath.RoundRandom(num2) : 0);
            Lord          singlePawnLord = rp.singlePawnLord ?? LordMaker.MakeNewLord(faction, new LordJob_DefendBase(faction, rp.rect.CenterCell), map, null);
            TraverseParms traverseParms  = TraverseParms.For(TraverseMode.PassDoors, Danger.Deadly, false);
            ResolveParams resolveParams  = rp;

            resolveParams.rect             = rp.rect;
            resolveParams.faction          = faction;
            resolveParams.singlePawnLord   = singlePawnLord;
            resolveParams.pawnGroupKindDef = (rp.pawnGroupKindDef ?? PawnGroupKindDefOf.Settlement);
            resolveParams.singlePawnSpawnCellExtraPredicate = (rp.singlePawnSpawnCellExtraPredicate ?? ((IntVec3 x) => map.reachability.CanReachMapEdge(x, traverseParms)));
            if (resolveParams.pawnGroupMakerParams == null)
            {
                resolveParams.pawnGroupMakerParams         = new PawnGroupMakerParms();
                resolveParams.pawnGroupMakerParams.tile    = map.Tile;
                resolveParams.pawnGroupMakerParams.faction = faction;
                PawnGroupMakerParms pawnGroupMakerParams = resolveParams.pawnGroupMakerParams;
                float?settlementPawnGroupPoints          = rp.settlementPawnGroupPoints;
                pawnGroupMakerParams.points = ((settlementPawnGroupPoints == null) ? SymbolResolver_AdvancedGeneration.DefaultPawnsPoints.RandomInRange : settlementPawnGroupPoints.Value);
                resolveParams.pawnGroupMakerParams.inhabitants = true;
                resolveParams.pawnGroupMakerParams.seed        = rp.settlementPawnGroupSeed;
            }
            BaseGen.symbolStack.Push("hives", resolveParams);
            BaseGen.symbolStack.Push("hives", rp);
            if (faction.def.techLevel >= TechLevel.Animal)
            {
                int num3 = Rand.Chance(1f) ? GenMath.RoundRandom((float)rp.rect.Area / 400f) : 0;
                for (int i = 0; i < num3; i++)
                {
                    ResolveParams resolveParams2 = rp;
                    resolveParams2.faction = faction;
                    BaseGen.symbolStack.Push("hives", resolveParams2);
                }
                ResolveParams resolveParams3 = rp;
                resolveParams3.hivesCount = new int?(Rand.RangeInclusive(4, 5));
                BaseGen.symbolStack.Push("hives", resolveParams3);
            }
            if (num > 0)
            {
                ResolveParams resolveParams4 = rp;
                resolveParams4.faction          = faction;
                resolveParams4.edgeDefenseWidth = new int?(num);
                BaseGen.symbolStack.Push("edgeDefense", resolveParams4);
            }
            ResolveParams resolveParams5 = rp;

            resolveParams5.rect    = rp.rect.ContractedBy(num);
            resolveParams5.faction = faction;
            BaseGen.symbolStack.Push("ensureCanReachMapEdge", resolveParams5);
            ResolveParams resolveParams6 = rp;

            resolveParams6.rect    = rp.rect.ContractedBy(num);
            resolveParams6.faction = faction;
            BaseGen.symbolStack.Push("basePart_outdoors", resolveParams6);
            ResolveParams resolveParams7 = rp;

            resolveParams7.floorDef = TerrainDefOf.Bridge;
            bool?floorOnlyIfTerrainSupports = rp.floorOnlyIfTerrainSupports;

            resolveParams7.floorOnlyIfTerrainSupports = new bool?(floorOnlyIfTerrainSupports == null || floorOnlyIfTerrainSupports.Value);
            BaseGen.symbolStack.Push("floor", resolveParams7);
        }
Esempio n. 15
0
        private void DrawFactionButtons(Rect inRect, int buttonSize)         //Used to draw a list of buttons from the 'buttons' list
        {
            Text.Anchor = TextAnchor.MiddleCenter;
            Text.Font   = GameFont.Small;
            for (int i = 0; i < buttons.Count; i++)
            {
                if (Widgets.ButtonText(new Rect(140, 110 + ((buttonSize + 5) * i), 170, buttonSize), buttons[i]))
                {
                    if (buttons[i] == "FCOverview".Translate())
                    {                     //if click trade policy button
                                          //Log.Message(buttons[i]);
                        Log.Message("Success");
                        Find.WindowStack.Add(new FCWindow_Overview());
                    }


                    if (buttons[i] == "Military".Translate())
                    {
                        if (FactionColonies.getPlayerColonyFaction() == null)
                        {
                            Messages.Message(new Message("NoFactionForMilitary".Translate(), MessageTypeDefOf.RejectInput));
                        }
                        else
                        {
                            Find.WindowStack.Add(new militaryCustomizationWindowFC());
                        }
                    }

                    if (buttons[i] == "Actions".Translate())
                    {
                        List <FloatMenuOption> list = new List <FloatMenuOption>();

                        list.Add(new FloatMenuOption("TaxDeliveryMap".Translate(), delegate
                        {
                            List <FloatMenuOption> list2 = new List <FloatMenuOption>();


                            list2.Add(new FloatMenuOption("SetMap".Translate(), delegate
                            {
                                List <FloatMenuOption> settlementList = new List <FloatMenuOption>();

                                foreach (Map map in Find.Maps)
                                {
                                    if (map.IsPlayerHome)
                                    {
                                        settlementList.Add(new FloatMenuOption(map.Parent.LabelCap, delegate
                                        {
                                            faction.taxMap = map;
                                            Find.LetterStack.ReceiveLetter("Map Set!", "The tax delivery map has been set to the player colony of " + map.Parent.LabelCap + ".\n All taxes and other goods will be delivered there", LetterDefOf.NeutralEvent);
                                        }
                                                                               ));
                                    }
                                }

                                if (settlementList.Count == 0)
                                {
                                    settlementList.Add(new FloatMenuOption("No valid settlements to use.", null));
                                }

                                FloatMenu floatMenu2            = new FloatMenu(settlementList);
                                floatMenu2.vanishIfMouseDistant = true;
                                Find.WindowStack.Add(floatMenu2);
                            }));

                            FloatMenu floatMenu            = new FloatMenu(list2);
                            floatMenu.vanishIfMouseDistant = true;
                            Find.WindowStack.Add(floatMenu);
                        }));

                        list.Add(new FloatMenuOption("SetCapital".Translate(), delegate
                        {
                            faction.setCapital();
                        }));

                        list.Add(new FloatMenuOption("ActivateResearch".Translate(), delegate
                        {
                            faction.updateDailyResearch();
                        }));

                        list.Add(new FloatMenuOption("ResearchLevel".Translate(), delegate
                        {
                            Messages.Message("CurrentResearchLevel".Translate(faction.techLevel.ToString(), faction.returnNextTechToLevel()), MessageTypeDefOf.NeutralEvent);
                        }));

                        if (faction.hasPolicy(FCPolicyDefOf.technocratic))
                        {
                            list.Add(new FloatMenuOption("FCSendResearchItems".Translate(), delegate
                            {
                                if (Find.ColonistBar.GetColonistsInOrder().Count > 0)
                                {
                                    Pawn playerNegotiator = Find.ColonistBar.GetColonistsInOrder()[0];
                                    //Log.Message(playerNegotiator.Name + " Negotiator");

                                    FCTrader_Research trader = new FCTrader_Research();

                                    Find.WindowStack.Add(new Dialog_Trade(playerNegotiator, trader));
                                }
                                else
                                {
                                    Log.Message("Where are all the colonists?");
                                }
                            }));
                        }

                        if (faction.hasPolicy(FCPolicyDefOf.feudal))
                        {
                            list.Add(new FloatMenuOption("FCRequestMercenary".Translate(), delegate
                            {
                                if (faction.traitFeudalBoolCanUseMercenary)
                                {
                                    faction.traitFeudalBoolCanUseMercenary   = false;
                                    faction.traitFeudalTickLastUsedMercenary = Find.TickManager.TicksGame;
                                    List <PawnKindDef> listKindDef           = new List <PawnKindDef>();
                                    foreach (ThingDef def in Find.World.GetComponent <FactionFC>().raceFilter.AllowedThingDefs)
                                    {
                                        listKindDef.Add(def.race.AnyPawnKind);
                                    }
                                    PawnGroupMaker groupMaker             = FactionColonies.getPlayerColonyFaction().def.pawnGroupMakers.RandomElement();
                                    PawnGroupMakerParms group             = new PawnGroupMakerParms();
                                    group.groupKind                       = groupMaker.kindDef;
                                    group.faction                         = FactionColonies.getPlayerColonyFaction();
                                    group.dontUseSingleUseRocketLaunchers = true;
                                    group.generateFightersOnly            = true;
                                    group.points = 2000;

                                    group.raidStrategy = RaidStrategyDefOf.ImmediateAttackFriendly;


                                    PawnKindDef pawnkind = new PawnKindDef();
                                    PawnKindDef kind     = groupMaker.GeneratePawns(group).RandomElement().kindDef;
                                    pawnkind             = listKindDef.RandomElement();

                                    pawnkind.techHediffsTags            = kind.techHediffsTags;
                                    pawnkind.apparelTags                = kind.apparelTags;
                                    pawnkind.isFighter                  = kind.isFighter;
                                    pawnkind.combatPower                = kind.combatPower;
                                    pawnkind.gearHealthRange            = kind.gearHealthRange;
                                    pawnkind.weaponTags                 = kind.weaponTags;
                                    pawnkind.apparelMoney               = kind.apparelMoney;
                                    pawnkind.weaponMoney                = kind.weaponMoney;
                                    pawnkind.apparelAllowHeadgearChance = kind.apparelAllowHeadgearChance;
                                    pawnkind.techHediffsMoney           = kind.techHediffsMoney;
                                    pawnkind.label = kind.label;

                                    Pawn pawn = PawnGenerator.GeneratePawn(new PawnGenerationRequest(pawnkind, Find.FactionManager.OfPlayer, PawnGenerationContext.NonPlayer, -1, false, false, false, false, true, false, 20f));


                                    IncidentParms parms = new IncidentParms();
                                    parms.target        = Find.CurrentMap;
                                    parms.faction       = FactionColonies.getPlayerColonyFaction();
                                    parms.points        = 999;
                                    parms.raidArrivalModeForQuickMilitaryAid = true;
                                    parms.raidNeverFleeIndividual            = true;
                                    parms.raidForceOneIncap = true;
                                    parms.raidArrivalMode   = PawnsArrivalModeDefOf.CenterDrop;
                                    parms.raidStrategy      = RaidStrategyDefOf.ImmediateAttackFriendly;
                                    parms.raidArrivalModeForQuickMilitaryAid = true;
                                    PawnsArrivalModeWorker_EdgeWalkIn worker = new PawnsArrivalModeWorker_EdgeWalkIn();
                                    worker.TryResolveRaidSpawnCenter(parms);
                                    worker.Arrive(new List <Pawn> {
                                        pawn
                                    }, parms);

                                    Find.LetterStack.ReceiveLetter("FCMercenaryJoined".Translate(), "FCMercenaryJoinedText".Translate(pawn.NameFullColored), LetterDefOf.PositiveEvent, new LookTargets(pawn));
                                }
                                else
                                {
                                    Messages.Message("FCActionMercenaryOnCooldown".Translate(((faction.traitFeudalTickLastUsedMercenary + GenDate.TicksPerSeason) - Find.TickManager.TicksGame).ToStringTicksToDays()), MessageTypeDefOf.RejectInput);
                                }
                            }));
                        }


                        FloatMenu menu = new FloatMenu(list);
                        Find.WindowStack.Add(menu);
                    }
                }
            }
        }
Esempio n. 16
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;
            IEnumerable <Building> source = map.listerBuildings.AllBuildingsColonistOfDef(ThingDef.Named("RD_Stargate"));
            bool result;

            if (source.Count <Building>() == 0)
            {
                result = false;
            }
            else
            {
                Building building = source.FirstOrDefault <Building>();
                this.ResolveRaidPoints(parms);
                if (!this.TryResolveRaidFaction(parms))
                {
                    result = false;
                }
                else
                {
                    this.ResolveRaidStrategy(parms, PawnGroupKindDefOf.Combat);
                    this.ResolveRaidArriveMode(parms);
                    if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms))
                    {
                        result = false;
                    }
                    else
                    {
                        PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms, true);
                        List <Pawn>         list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();
                        if (list.Count == 0)
                        {
                            Log.Error("Got no pawns spawning raid from parms " + parms);
                            result = false;
                        }
                        else
                        {
                            TargetInfo target = TargetInfo.Invalid;
                            foreach (Pawn pawn in list)
                            {
                                IntVec3 position = building.Position;
                                GenSpawn.Spawn(pawn, position, map, parms.spawnRotation, WipeMode.Vanish, false);
                                target = pawn;
                            }
                            // TODO: Check if these parameters are correct in this raid
                            Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AssaultColony(parms.faction, true, true, false, false, true), map, list);

                            // not sure what to write here instead, while commented out
                            //AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map);

                            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
                            if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts))
                            {
                                for (int i = 0; i < list.Count; i++)
                                {
                                    Pawn pawn2 = list[i];
                                    if (pawn2.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt))
                                    {
                                        LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical);
                                        break;
                                    }
                                }
                            }
                            base.SendStandardLetter(parms, target, new NamedArgument[]
                            {
                                parms.faction.Name
                            });
                            Find.TickManager.slower.SignalForceNormalSpeedShort();
                            Find.StoryWatcher.statsRecord.numRaidsEnemy++;
                            result = true;
                        }
                    }
                }
            }
            return(result);
        }
Esempio n. 17
0
            private static bool Prefix(PawnGroupMakerParms parms, PawnGroupMaker groupMaker, Pawn trader, List <Thing> wares, List <Pawn> outPawns)
            {
                Func <Thing, float> massTotaler = t => t.stackCount * t.GetStatValue(StatDefOf.Mass, true);

                List <Thing> list = wares.Where(t => !(t is Pawn)).ToList();

                list.SortByDescending(massTotaler);

                float ttlMassThings = list.Sum(massTotaler);
                float ttlCapacity   = 0f;
                float ttlBodySize   = 0f;
                int   numCarriers   = 0;

                IEnumerable <PawnGenOption> carrierKinds = groupMaker.carriers.Where(p => {
                    if (parms.tile != -1)
                    {
                        return(Find.WorldGrid[parms.tile].biome.IsPackAnimalAllowed(p.kind.race));
                    }
                    return(true);
                });

                PawnKindDef kind = carrierKinds.RandomElementByWeight(x => x.selectionWeight).kind;

                // No slow or small juveniles
                Predicate <Pawn> validator = (p =>
                                              p.ageTracker.CurLifeStage.bodySizeFactor >= 1 &&
                                              p.GetStatValue(StatDefOf.MoveSpeed, true) >= p.kindDef.race.GetStatValueAbstract(StatDefOf.MoveSpeed)
                                              );

                // 50/50 chance of uniform carriers (like vanilla) or mixed carriers
                bool mixedCarriers = Rand.RangeInclusive(0, 1) == 1;

                // Generate all of the carrier pawns (empty).  Either we spawn as many pawns as we need to cover
                // 120% of the weight of the items, or enough pawns before it seems "unreasonable" based on body
                // size.
                for (; ttlCapacity < ttlMassThings * 1.2 && ttlBodySize < 20; numCarriers++)
                {
                    PawnGenerationRequest request = new PawnGenerationRequest(
                        kind:             kind,
                        faction:          parms.faction,
                        tile:             parms.tile,
                        inhabitant:       parms.inhabitants,
                        validatorPreGear: validator
                        );
                    Pawn pawn = PawnGenerator.GeneratePawn(request);
                    outPawns.Add(pawn);

                    ttlCapacity += MassUtility.Capacity(pawn);
                    // Still can't have 100 chickenmuffalos.  That might slow down some PCs.
                    ttlBodySize += Mathf.Max(pawn.BodySize, 0.5f);

                    if (mixedCarriers)
                    {
                        kind = carrierKinds.RandomElementByWeight(x => x.selectionWeight).kind;
                    }
                }

                // Add items (in descending order of weight) to randomly chosen pack animals.  This isn't the most
                // efficient routine, as we're trying to be a bit random.  If I was trying to be efficient, I would
                // use something like SortByDescending(p.Capacity) against the existing thing list.
                foreach (Thing thing in list)
                {
                    List <Pawn> validPawns = outPawns.FindAll(p => !MassUtility.WillBeOverEncumberedAfterPickingUp(p, thing, thing.stackCount));

                    if (validPawns.Count() != 0)
                    {
                        validPawns.RandomElement().inventory.innerContainer.TryAdd(thing, true);
                    }
                    else if (thing.stackCount > 1)
                    {
                        // No carrier can handle the full stack; split it up
                        int countLeft = thing.stackCount;
                        int c         = 0; // safety counter (while loops can be dangerous)
                        while (countLeft > 0)
                        {
                            validPawns = outPawns.FindAll(p => MassUtility.CountToPickUpUntilOverEncumbered(p, thing) >= 1);
                            if (validPawns.Count() != 0 && c < thing.stackCount)
                            {
                                Pawn pawn       = validPawns.RandomElement();
                                int  countToAdd = Mathf.Min(MassUtility.CountToPickUpUntilOverEncumbered(pawn, thing), countLeft);
                                countLeft -= pawn.inventory.innerContainer.TryAdd(thing, countToAdd, true);
                            }
                            else
                            {
                                // Either no carrier can handle a single item, or we're just in some bad while loop breakout.  In
                                // any case, force it in, evenly split among all carriers.
                                int splitCount = Mathf.FloorToInt(countLeft / outPawns.Count());
                                if (splitCount > 0)
                                {
                                    outPawns.ForEach(p => p.inventory.innerContainer.TryAdd(thing, splitCount, true));
                                    countLeft -= splitCount * outPawns.Count();
                                }

                                // Give the remainer to the ones with space (one at a time)
                                while (countLeft > 0)
                                {
                                    validPawns = new List <Pawn>(outPawns);
                                    validPawns.SortByDescending(p => MassUtility.FreeSpace(p));
                                    validPawns.First().inventory.innerContainer.TryAdd(thing, 1, true);
                                    countLeft--;
                                }
                                break;
                            }
                            c++;
                        }
                    }
                    else
                    {
                        // No way to split it; force it in
                        validPawns = new List <Pawn>(outPawns);
                        validPawns.SortByDescending(p => MassUtility.FreeSpace(p));
                        validPawns.First().inventory.innerContainer.TryAdd(thing, true);
                    }
                }

                // Always skip the original method
                return(false);
            }
Esempio n. 18
0
        public override void Resolve(ResolveParams rp)
        {
            REDataCache.TyrantEncounterGenerated    = false;
            REDataCache.ZombieDogEncounterGenerated = false;
            REDataCache.GEncounterGenerated         = false;

            Map     map     = BaseGen.globalSettings.map;
            Faction faction = rp.faction ?? Find.FactionManager.RandomEnemyFaction();

            rp.wallStuff = ThingDefOf.Steel;
            rp.floorDef  = TerrainDef.Named("BrokenAsphalt");
            int num = 0;
            int?edgeDefenseWidth = rp.edgeDefenseWidth;

            if (edgeDefenseWidth.HasValue)
            {
                num = rp.edgeDefenseWidth.Value;
            }
            else if (rp.rect.Width >= 20 && rp.rect.Height >= 20 && ((int)faction.def.techLevel >= 4 || Rand.Bool))
            {
                num = ((!Rand.Bool) ? 4 : 2);
            }
            float num2 = (float)rp.rect.Area / 144f * 0.17f;

            BaseGen.globalSettings.minEmptyNodes = ((!(num2 < 1f)) ? GenMath.RoundRandom(num2) : 0);
            Lord          singlePawnLord = rp.singlePawnLord ?? LordMaker.MakeNewLord(faction, new LordJob_DefendZombieBase(faction, map.Center), map);
            TraverseParms traverseParms  = TraverseParms.For(TraverseMode.PassDoors);


            ResolveParams resolveParams = rp;

            resolveParams.rect             = rp.rect;
            resolveParams.faction          = faction;
            resolveParams.singlePawnLord   = singlePawnLord;
            resolveParams.pawnGroupKindDef = (rp.pawnGroupKindDef ?? PawnGroupKindDefOf.Settlement);
            resolveParams.singlePawnSpawnCellExtraPredicate = (rp.singlePawnSpawnCellExtraPredicate ?? ((Predicate <IntVec3>)((IntVec3 x) => map.reachability.CanReachMapEdge(x, traverseParms))));
            if (resolveParams.pawnGroupMakerParams == null)
            {
                resolveParams.pawnGroupMakerParams         = new PawnGroupMakerParms();
                resolveParams.pawnGroupMakerParams.tile    = map.Tile;
                resolveParams.pawnGroupMakerParams.faction = faction;
                PawnGroupMakerParms pawnGroupMakerParams = resolveParams.pawnGroupMakerParams;
                float?settlementPawnGroupPoints          = rp.settlementPawnGroupPoints;
                pawnGroupMakerParams.points = ((!settlementPawnGroupPoints.HasValue) ? DefaultPawnsPoints.RandomInRange : settlementPawnGroupPoints.Value);
                resolveParams.pawnGroupMakerParams.inhabitants = true;
                resolveParams.pawnGroupMakerParams.seed        = rp.settlementPawnGroupSeed;
            }
            BaseGen.symbolStack.Push("pawnGroup", resolveParams);
            BaseGen.symbolStack.Push("outdoorLighting", rp);
            ResolveParams resolveParams4 = rp;

            resolveParams4.rect    = rp.rect.ContractedBy(num);
            resolveParams4.faction = faction;
            BaseGen.symbolStack.Push("ensureCanReachMapEdge", resolveParams4);

            if (Find.Scenario.name == "Resident Evil - Umbrella Corp")
            {
                ResolveParams umbrellaCorp = rp;
                umbrellaCorp.rect      = new CellRect(map.Center.x - 12, map.Center.z - 12, 24, 24);
                umbrellaCorp.wallStuff = ThingDefOf.Plasteel;
                umbrellaCorp.floorDef  = TerrainDef.Named("SterileTile");
                umbrellaCorp.faction   = Faction.OfPlayer;
                BaseGen.symbolStack.Push("emptyRoom", umbrellaCorp);
                BaseGen.symbolStack.Push("floor", umbrellaCorp);
                BaseGen.symbolStack.Push("clear", umbrellaCorp);
            }

            ResolveParams resolveParams5 = rp;

            resolveParams5.rect    = rp.rect.ContractedBy(num);
            resolveParams5.faction = faction;
            BaseGen.symbolStack.Push("zombieBasePart_outdoors", resolveParams5);
            ResolveParams resolveParams6 = rp;

            //resolveParams6.rect = rp.rect.ExpandedBy(3);
            //resolveParams6.floorDef = TerrainDef.Named("BrokenAsphalt");
            //bool? floorOnlyIfTerrainSupports = rp.floorOnlyIfTerrainSupports;
            //resolveParams6.floorOnlyIfTerrainSupports = false;
            //BaseGen.symbolStack.Push("floor", resolveParams6);
            //Clear the land...
            ResolveParams clearParams = rp;

            clearParams.rect = rp.rect;
            BaseGen.symbolStack.Push("clear", clearParams);
        }
Esempio n. 19
0
        private void CheckAnswer(string answer)
        {
            if (answer == "конец")
            {
                return;
            }

            HelpCount--;

            int    techLevel   = (int)interaction.Faction.def.techLevel;
            bool   useCaravan  = techLevel < (int)TechLevel.Industrial;
            string caravanText = useCaravan ? "UsingCaravan".Translate() : "UsingCapsules".Translate();

            if (answer == "resources")
            {
                ThingSetMaker_MarketValue maker  = new ThingSetMaker_MarketValue();
                ThingSetMakerParams       parms2 = default;
                parms2.totalMarketValueRange = new FloatRange(1000, 2000);
                parms2.filter     = GetFilter();
                parms2.techLevel  = interaction.Faction.def.techLevel;
                maker.fixedParams = parms2;

                if (useCaravan)
                {
                    AssistCaravanWithFixedInventoryComp assistComp = new AssistCaravanWithFixedInventoryComp(maker.Generate(), Rand.Range(1, 3) * 60000, interaction.Faction, speaker.Map);
                    assistComp.id = QuestsManager.Communications.UniqueIdManager.GetNextComponentID();
                    QuestsManager.Communications.RegisterComponent(assistComp);
                }
                else
                {
                    SendCapsules(maker.Generate());
                }

                Find.LetterStack.ReceiveLetter("Help_AskResoucesTitle".Translate(), "Help_AskResouces".Translate(interaction.Faction, caravanText), LetterDefOf.PositiveEvent);
            }
            if (answer == "power")
            {
                PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms
                {
                    faction = interaction.Faction,
                    points  = DiplomacyTuning.RequestedMilitaryAidPointsRange.RandomInRange,
                    generateFightersOnly = true,
                    groupKind            = PawnGroupKindDefOf.Combat,
                    raidStrategy         = RaidStrategyDefOf.ImmediateAttack,
                    forceOneIncap        = true
                };

                IncidentParms incidentParms = new IncidentParms();
                incidentParms.target          = speaker.Map;
                incidentParms.faction         = interaction.Faction;
                incidentParms.raidArrivalMode = PawnsArrivalModeDefOf.CenterDrop;
                incidentParms.points          = DiplomacyTuning.RequestedMilitaryAidPointsRange.RandomInRange;
                interaction.Faction.lastMilitaryAidRequestTick = Find.TickManager.TicksGame;

                if (useCaravan)
                {
                    incidentParms.raidArrivalMode = PawnsArrivalModeDefOf.EdgeWalkIn;
                    Find.Storyteller.incidentQueue.Add(IncidentDefOf.RaidFriendly, Find.TickManager.TicksGame + 11000, incidentParms);
                }
                else
                {
                    IncidentDefOf.RaidFriendly.Worker.TryExecute(incidentParms);
                }

                Find.LetterStack.ReceiveLetter("Help_AskPowerTitle".Translate(), "Help_AskPower".Translate(interaction.Faction, caravanText), LetterDefOf.PositiveEvent);
            }
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            parms.raidArrivalMode = ForcedArriveMode;

            ResolveRaidPoints(parms: parms);

            if (!TryResolveRaidFaction(parms: parms))
            {
                Log.Message(text: "Failed solar raid: no faction found.");

                return(false);
            }

            PawnGroupKindDef combat = Defs_Rimworld.CombatGroup;

            ResolveRaidStrategy(parms: parms, groupKind: combat);

            if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms: parms))
            {
                return(false);
            }

            parms.points = AdjustedRaidPoints(
                points: parms.points,
                raidArrivalMode: parms.raidArrivalMode,
                raidStrategy: parms.raidStrategy,
                faction: parms.faction,
                groupKind: combat
                );

            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(
                groupKind: combat,
                parms: parms,
                ensureCanGenerateAtLeastOnePawn: false
                );

            SolarRaidGroupMaker.TryGetRandomPawnGroupMaker(parms: defaultPawnGroupMakerParms, pawnGroupMaker: out PawnGroupMaker pawnGroupMaker);

            List <Pawn> list = SolarRaid_PawnGenerator.GeneratePawns(parms: defaultPawnGroupMakerParms, groupMaker: pawnGroupMaker).ToList();

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

            parms.raidArrivalMode.Worker.Arrive(pawns: list, parms: parms);
            var stringBuilder = new StringBuilder();

            stringBuilder.AppendLine(value: "Points = " + parms.points.ToString(format: "F0"));

            foreach (Pawn pawn in list)
            {
                string str = pawn.equipment?.Primary == null ? "unarmed" : pawn.equipment.Primary.LabelCap;
                stringBuilder.AppendLine(value: pawn.KindLabel + " - " + str);
            }

#if RW10
            string letterLabel = GetLetterLabel(parms: parms);
            string letterText  = GetLetterText(parms: parms, pawns: list);
#else
            TaggedString letterLabel = GetLetterLabel(parms: parms);
            TaggedString letterText  = GetLetterText(parms: parms, pawns: list);
#endif

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(
                seenPawns: list,
                letterLabel: ref letterLabel,
                letterText: ref letterText,
                relationsInfoHeader: GetRelatedPawnsInfoLetterText(parms: parms),
                informEvenIfSeenBefore: true,
                writeSeenPawnsNames: true
                );

            var list2 = new List <TargetInfo>();

            if (parms.pawnGroups != null)
            {
                List <List <Pawn> > list3 = IncidentParmsUtility.SplitIntoGroups(pawns: list, groups: parms.pawnGroups);
                List <Pawn>         list4 = list3.MaxBy(selector: x => x.Count);

                if (list4.Any())
                {
                    list2.Add(item: list4[index: 0]);
                }

                for (var i = 0; i < list3.Count; i++)
                {
                    if (list3[index: i] != list4)
                    {
                        if (list3[index: i].Any())
                        {
                            list2.Add(item: list3[index: i][index: 0]);
                        }
                    }
                }
            }
            else if (list.Any())
            {
                list2.Add(item: list[index: 0]);
            }

            Find.LetterStack.ReceiveLetter(
                label: letterLabel,
                text: letterText,
                textLetterDef: GetLetterDef(),
                lookTargets: list2,
                relatedFaction: parms.faction,
                debugInfo: stringBuilder.ToString()
                );

            parms.raidStrategy.Worker.MakeLords(parms: parms, pawns: list);
            LessonAutoActivator.TeachOpportunity(conc: ConceptDefOf.EquippingWeapons, opp: OpportunityType.Critical);

            if (!PlayerKnowledgeDatabase.IsComplete(conc: ConceptDefOf.ShieldBelts))
            {
                for (var j = 0; j < list.Count; j++)
                {
                    Pawn pawn2 = list[index : j];

                    if (pawn2.apparel.WornApparel.Any(predicate: ap => ap is ShieldBelt))
                    {
                        LessonAutoActivator.TeachOpportunity(conc: ConceptDefOf.ShieldBelts, opp: OpportunityType.Critical);

                        break;
                    }
                }
            }

            Find.TickManager.slower.SignalForceNormalSpeedShort();
            Find.StoryWatcher.statsRecord.numRaidsEnemy++;

            return(true);
        }
            public static void Listener(PawnGroupMakerParms parms, bool warnOnZeroResults, ref IEnumerable <Pawn> __result)
            {
                try
                {
                    if (!Settings.otherFactionsCanUseSurrogate || Utils.ExceptionBlacklistedFactionNoSurrogate.Contains(parms.faction.def.defName) ||
                        Utils.getRandomMapOfPlayer().gameConditionManager.ConditionIsActive(GameConditionDefOf.SolarFlare) || Settings.androidsAreRare && Rand.Chance(0.95f))
                    {
                        return;
                    }

                    IEnumerable <Pawn> pawn = __result as Pawn[] ?? __result.ToArray();
                    var nbHumanoids         = pawn.Where(e => e.def.race != null && e.def.race.Humanlike).Count(e => e.trader == null && e.TraderKind == null);


                    /*if(e.def.defName == Utils.T1 || e.def.defName == Utils.T2)
                     *  {
                     *      Utils.removeAllTraits(e);
                     *  }*/


                    if (parms.faction.def.techLevel < TechLevel.Industrial || nbHumanoids < 5)
                    {
                        return;
                    }

                    {
                        var ret = new List <Pawn>();
                        var tmp = pawn.ToList();


                        var other = tmp.Where(x => x.def.race == null || !x.def.race.Humanlike || x.trader != null || x.TraderKind != null).ToList();


                        foreach (var e in other)
                        {
                            tmp.Remove(e);
                        }


                        var nb = (int)(tmp.Count() * Rand.Range(Settings.percentageOfSurrogateInAnotherFactionGroupMin, Settings.percentageOfSurrogateInAnotherFactionGroup));
                        if (nb <= 0)
                        {
                            if (Settings.percentageOfSurrogateInAnotherFactionGroupMin == 0.0f)
                            {
                                return;
                            }

                            nb = 1;
                        }


                        while (tmp.Count > nb)
                        {
                            var p = tmp.RandomElement();
                            other.Add(p);
                            tmp.Remove(p);
                        }


                        for (var i = 0; i != nb; i++)
                        {
                            PawnKindDef rpkd = null;

                            if (parms.groupKind == PawnGroupKindDefOf.Peaceful || parms.groupKind == PawnGroupKindDefOf.Trader)
                            {
                                if (Rand.Chance(0.10f))
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f))
                                    {
                                        rpkd = Utils.AndroidsPKDNeutral[3];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDNeutral[3];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDNeutral[3];
                                    }
                                }
                                else if (Rand.Chance(0.35f))
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f))
                                    {
                                        rpkd = Utils.AndroidsPKDNeutral[2];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDNeutral[2];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDNeutral[2];
                                    }
                                }
                                else if (Rand.Chance(0.55f))
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsPKDNeutral[1];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDNeutral[1];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDNeutral[1];
                                    }
                                }
                                else
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f))
                                    {
                                        rpkd = Utils.AndroidsPKDNeutral[0];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDNeutral[0];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDNeutral[0];
                                    }
                                }
                            }
                            else
                            {
                                if (Rand.Chance(0.10f))
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f))
                                    {
                                        rpkd = Utils.AndroidsPKDHostile[3];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDHostile[3];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDHostile[3];
                                    }
                                }
                                else if (Rand.Chance(0.35f))
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f))
                                    {
                                        rpkd = Utils.AndroidsPKDHostile[2];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDHostile[2];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDHostile[2];
                                    }
                                }
                                else if (Rand.Chance(0.55f))
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsPKDHostile[1];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDHostile[1];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDHostile[1];
                                    }
                                }
                                else
                                {
                                    if (!Utils.TXSERIE_LOADED || Rand.Chance(0.5f))
                                    {
                                        rpkd = Utils.AndroidsPKDHostile[0];
                                    }
                                    else if (Rand.Chance(0.75f))
                                    {
                                        rpkd = Utils.AndroidsXISeriePKDHostile[0];
                                    }
                                    else
                                    {
                                        rpkd = Utils.AndroidsXSeriePKDHostile[0];
                                    }
                                }
                            }


                            var surrogate = Utils.generateSurrogate(parms.faction, rpkd, IntVec3.Invalid, null, false, true, parms.tile, true, parms.inhabitants);


                            if (!surrogate.IsAndroidTier())
                            {
                                surrogate.Destroy();
                                ret.Add(tmp[i]);
                                continue;
                            }


                            if (surrogate.inventory != null && surrogate.inventory.innerContainer != null)
                            {
                                surrogate.inventory.innerContainer.Clear();
                            }

                            surrogate.apparel.DestroyAll();

                            surrogate.equipment.DestroyAllEquipment();


                            var cas = surrogate.TryGetComp <CompAndroidState>();
                            if (cas != null)
                            {
                                cas.externalController = tmp[i];
                                var cso = tmp[i].TryGetComp <CompSurrogateOwner>();
                                cso?.setControlledSurrogate(surrogate, true);
                            }


                            if (tmp[i].equipment != null && surrogate.equipment != null)
                            {
                                /*Pawn_EquipmentTracker pet = tmp[i].equipment;
                                 * pet.pawn = surrogate;
                                 * tmp[i].equipment = surrogate.equipment;
                                 * tmp[i].equipment.pawn = tmp[i];
                                 * surrogate.equipment = pet;*/
                                surrogate.equipment.DestroyAllEquipment();

                                foreach (var e in tmp[i].equipment.AllEquipmentListForReading.ToList())
                                {
                                    try
                                    {
                                        tmp[i].equipment.Remove(e);
                                        if (!(e.def.equipmentType == EquipmentType.Primary && surrogate.equipment.Primary != null))
                                        {
                                            surrogate.equipment.AddEquipment(e);
                                        }
                                    }
                                    catch (Exception ex)
                                    {
                                        Log.Message("[ATPP] PawnGroupMakerUtility.GeneratePawns.transfertEquipment " + ex.Message + " " + ex.StackTrace);
                                    }
                                }


                                foreach (var e in surrogate.equipment.AllEquipmentListForReading)
                                {
                                    try
                                    {
                                        if (!Utils.CELOADED || e == null || !e.def.IsRangedWeapon)
                                        {
                                            continue;
                                        }

                                        var ammoUser = Utils.TryGetCompByTypeName(e, "CompAmmoUser", "CombatExtended");
                                        if (ammoUser == null)
                                        {
                                            continue;
                                        }

                                        var props        = Traverse.Create(ammoUser).Property("Props").GetValue();
                                        var magazineSize = Traverse.Create(props).Field("magazineSize").GetValue <int>();
                                        var def          = Traverse.Create(ammoUser).Field("selectedAmmo").GetValue <ThingDef>();
                                        if (def != null)
                                        {
                                            Traverse.Create(ammoUser).Method("ResetAmmoCount", def).GetValue();
                                        }
                                    }
                                    catch (Exception)
                                    {
                                    }
                                }
                            }

                            /*foreach(var e in tmp[i].equipment.AllEquipmentListForReading.ToList())
                             * {
                             *  e.
                             *  surrogate.equipment.AddEquipment(e);
                             * }*/


                            if (tmp[i].apparel != null)
                            {
                                try
                                {
                                    foreach (var e in tmp[i].apparel.WornApparel.ToList())
                                    {
                                        var path = "";
                                        if (e.def.apparel.LastLayer == ApparelLayerDefOf.Overhead)
                                        {
                                            path = e.def.apparel.wornGraphicPath;
                                        }
                                        else
                                        {
                                            path = e.def.apparel.wornGraphicPath + "_" + surrogate.story.bodyType.defName + "_south";
                                        }

                                        Texture2D appFoundTex = null;

                                        for (var j = LoadedModManager.RunningModsListForReading.Count - 1; j >= 0; j--)
                                        {
                                            var appTex = LoadedModManager.RunningModsListForReading[j].GetContentHolder <Texture2D>().Get(path);
                                            if (appTex == null)
                                            {
                                                continue;
                                            }

                                            appFoundTex = appTex;
                                            break;
                                        }


                                        if (appFoundTex == null)
                                        {
                                            path        = GenFilePaths.ContentPath <Texture2D>() + path;
                                            appFoundTex = Resources.Load <Texture2D>(path);
                                        }


                                        if (appFoundTex == null)
                                        {
                                            continue;
                                        }

                                        tmp[i].apparel.Remove(e);
                                        surrogate.apparel.Wear(e);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Log.Message("[ATPP] PawnGroupMakerUtility.TransfertApparel " + ex.Message + " " + ex.StackTrace);
                                }
                            }


                            if (tmp[i].inventory != null && tmp[i].inventory.innerContainer != null && surrogate.inventory != null && surrogate.inventory.innerContainer != null)
                            {
                                try
                                {
                                    tmp[i].inventory.innerContainer.TryTransferAllToContainer(surrogate.inventory.innerContainer);


                                    foreach (var el in surrogate.inventory.innerContainer.ToList().Where(el => el.def.IsDrug))
                                    {
                                        surrogate.inventory.innerContainer.Remove(el);
                                    }
                                }
                                catch (Exception ex)
                                {
                                    Log.Message("[ATPP] PawnGroupMakerUtility.GeneratePawns.transfertInventory " + ex.Message + " " + ex.StackTrace);
                                }
                            }


                            ret.Add(surrogate);
                        }


                        __result = other.Concat(ret);
                    }
                }
                catch (Exception ex)
                {
                    Log.Message("[ATPP] PawnGroupMakerUtility.GeneratePawns " + ex.Message + " " + ex.StackTrace);
                }
            }
Esempio n. 22
0
        public override bool TryExecute(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            this.ResolveRaidPoints(parms);
            if (!this.TryResolveRaidFaction(parms))
            {
                return(false);
            }
            this.ResolveRaidStrategy(parms);
            this.ResolveRaidArriveMode(parms);
            this.ResolveRaidSpawnCenter(parms);
            IncidentParmsUtility.AdjustPointsForGroupArrivalParams(parms);
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(parms);
            List <Pawn>         list = PawnGroupMakerUtility.GeneratePawns(PawnGroupKindDefOf.Normal, defaultPawnGroupMakerParms, true).ToList <Pawn>();

            if (list.Count == 0)
            {
                Log.Error("Got no pawns spawning raid from parms " + parms);
                return(false);
            }
            TargetInfo      target = TargetInfo.Invalid;
            List <ShipBase> ships  = DropShipUtility.CreateDropShips(list, parms.faction);

            DropShipUtility.DropShipGroups(parms.spawnCenter, map, ships, TravelingShipArrivalAction.EnterMapAssault);

            StringBuilder stringBuilder = new StringBuilder();

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

            PawnRelationUtility.Notify_PawnsSeenByPlayer(list, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true);
            Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterType(), target, stringBuilder.ToString());
            if (this.GetLetterType() == LetterType.BadUrgent)
            {
                TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]);
            }
            this.ResolveRaidParmOptions(parms);
            Lord lord = LordMaker.MakeNewLord(parms.faction, new LordJob_AerialAssault(ships, parms.faction, this.Kidnappers(parms.faction), true, this.UseSappers, this.SmartGrid, this.Stealers(parms.faction)), map, list);

            AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
            if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.PersonalShields))
            {
                for (int i = 0; i < list.Count; i++)
                {
                    Pawn pawn = list[i];
                    if (pawn.apparel.WornApparel.Any((Apparel ap) => ap is PersonalShield))
                    {
                        LessonAutoActivator.TeachOpportunity(ConceptDefOf.PersonalShields, OpportunityType.Critical);
                        break;
                    }
                }
            }
            if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer))
            {
                Log.Message(string.Concat(new object[]
                {
                    "Market value threshold to start stealing: ",
                    StealAIUtility.StartStealingMarketValueThreshold(lord),
                    " (colony wealth = ",
                    map.wealthWatcher.WealthTotal,
                    ")"
                }));
            }
            return(true);
        }
Esempio n. 23
0
        public override void PassingParameters(ResolveParams rp)
        {
            string defChair = "DiningChair";
            string defLamp  = "Jecrell_GasLamp";

            ThingDef lampDef      = Cthulhu.Utility.IsIndustrialAgeLoaded() ? ThingDef.Named(defLamp) : ThingDefOf.TorchLamp;
            ThingDef lampStuffDef = Cthulhu.Utility.IsIndustrialAgeLoaded() ? ThingDefOf.Steel : null;

            Map      map      = BaseGen.globalSettings.map;
            bool     @bool    = Rand.Bool;
            bool     hasLamp  = false;
            ThingDef thingDef = ThingDefOf.SleepingSpot;
            ThingDef chairDef = ThingDef.Named(defChair);

            foreach (IntVec3 current in rp.rect)
            {
                if (@bool)
                {
                    if (current.x % 3 != 0 || current.z % 3 != 0)
                    {
                        continue;
                    }
                }
                else if (current.x % 3 != 0 || current.z % 3 != 0)
                {
                    continue;
                }
                Rot4 rot = (!@bool) ? Rot4.South : Rot4.West;
                if (!GenSpawn.WouldWipeAnythingWith(current, rot, thingDef, map, (Thing x) => x.def.category == ThingCategory.Building))
                {
                    bool flag = false;
                    foreach (IntVec3 current2 in GenAdj.CellsOccupiedBy(current, rot, thingDef.Size))
                    {
                        if (BaseGenUtility.AnyDoorAdjacentCardinalTo(current2, map))
                        {
                            flag = true;
                            break;
                        }
                    }
                    if (!flag)
                    {
                        ///Bed
                        ThingDef stuff = null;
                        if (thingDef.MadeFromStuff)
                        {
                            stuff = ThingDefOf.WoodLog;
                        }
                        Thing thing = ThingMaker.MakeThing(thingDef, stuff);
                        thing.SetFaction(rp.faction, null);

                        GenSpawn.Spawn(thing, current, map, rot);

                        if (thing != null)
                        {
                            if (thing.Spawned && thing.Position.InBounds(map))
                            {
                                CellRect thingRect = thing.OccupiedRect();
                                if (thingRect != null)
                                {
                                    thingRect = thingRect.ExpandedBy(1);
                                    List <IntVec3> possibleCells = new List <IntVec3>();
                                    possibleCells.AddRange(thingRect.GetEdgeCells(Rot4.North));
                                    possibleCells.AddRange(thingRect.GetEdgeCells(Rot4.South));
                                    possibleCells.AddRange(thingRect.GetEdgeCells(Rot4.East));
                                    possibleCells.AddRange(thingRect.GetEdgeCells(Rot4.West));
                                    possibleCells.Remove(Cthulhu.Utility.GetCornerPos(thingRect, 0));
                                    possibleCells.Remove(Cthulhu.Utility.GetCornerPos(thingRect, 1));
                                    possibleCells.Remove(Cthulhu.Utility.GetCornerPos(thingRect, 2));
                                    possibleCells.Remove(Cthulhu.Utility.GetCornerPos(thingRect, 3));

                                    IntVec3 spawnPos = IntVec3.Invalid;
                                    spawnPos = possibleCells.InRandomOrder <IntVec3>().FirstOrDefault((IntVec3 x) => x.InBounds(map) && x.Walkable(map));
                                    if (spawnPos != null)
                                    {
                                        possibleCells.Remove(spawnPos);
                                        Thing thing2 = ThingMaker.MakeThing(chairDef, ThingDefOf.WoodLog);
                                        thing2.SetFaction(rp.faction, null);
                                        GenSpawn.Spawn(thing2, spawnPos, map, rot.Opposite);
                                    }
                                    if (!hasLamp)
                                    {
                                        hasLamp  = true;
                                        spawnPos = possibleCells.FirstOrDefault((IntVec3 x) => x.InBounds(map) && x.Walkable(map));
                                        if (spawnPos != null)
                                        {
                                            possibleCells.Remove(spawnPos);
                                            Thing thing3 = ThingMaker.MakeThing(lampDef, lampStuffDef);
                                            thing3.SetFaction(rp.faction, null);
                                            GenSpawn.Spawn(thing3, spawnPos, map, rot.Opposite);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }

            //if (!Cthulhu.Utility.IsCosmicHorrorsLoaded())
            //{
            PawnGroupKindDef    groupKind           = rp.pawnGroupKindDef ?? PawnGroupKindDefOf.Combat;
            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms()
            {
                faction = (from x in Find.FactionManager.AllFactions
                           where x.HostileTo(rp.faction) && x.def.pawnGroupMakers != null &&
                           x.def.pawnGroupMakers.Count > 0 &&
                           x.def.humanlikeFaction &&
                           IsCosmicHorrorFaction(x) == false &&
                           (x.def.pawnGroupMakers.FirstOrDefault((PawnGroupMaker y) => y.kindDef == PawnGroupKindDefOf.Combat) != null)
                           select x).RandomElement <Faction>(),
                tile   = map.Tile,
                points = 5000,
                generateFightersOnly = false,
            };
            int num = 0;

            foreach (Pawn current in PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms, true))
            {
                num++;
                ResolveParams resolveParams = rp;
                resolveParams.singlePawnToSpawn = current;
                BaseGen.symbolStack.Push("pawn", resolveParams);
                if (num == 3)
                {
                    break;
                }
            }
            //}
            //else
            //{
            //    Faction tempFaction = Find.FactionManager.AllFactions.InRandomOrder<Faction>().FirstOrDefault((Faction z) => IsCosmicHorrorFaction(z));
            //    PawnGroupKindDef groupKind = rp.pawnGroupKindDef ?? PawnGroupKindDefOf.Combat;
            //    PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms()
            //    {
            //        faction = tempFaction,
            //        map = map,
            //        points = 5000,
            //        generateFightersOnly = false,
            //        generateMeleeOnly = false
            //    };
            //    int num = 0;
            //    foreach (Pawn current in PawnGroupMakerUtility.GeneratePawns(groupKind, pawnGroupMakerParms, true))
            //    {
            //        num++;
            //        ResolveParams resolveParams = rp;
            //        resolveParams.singlePawnToSpawn = current;
            //        resolveParams.singlePawnLord = null;
            //        BaseGen.symbolStack.Push("pawn", resolveParams);
            //        if (num == 3) break;
            //    }
            //}

            //List<int> corners = new List<int>() { 0, 1, 2, 3 };
            //foreach (int corner in corners.InRandomOrder<int>())
            //{
            //    IntVec3 loc = Cthulhu.Utility.GetCornerPos(rp.rect.ContractedBy(1), corner);
            //    if (!GenSpawn.WouldWipeAnythingWith(loc, Rot4.South, lampDef, map, (Thing x) => x.def.category == ThingCategory.Building))
            //    {
            //        ThingDef singleThingDef3 = (Cthulhu.Utility.IsIndustrialAgeLoaded()) ? lampDef : ThingDefOf.TorchLamp;
            //        Thing thing3 = ThingMaker.MakeThing(singleThingDef3, ThingDefOf.Steel);
            //        GenSpawn.Spawn(thing3, loc, map);
            //        break;
            //    }
            //}
        }
Esempio n. 24
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            if (!settings.Active)
            {
                return(false);
            }

            if (tribalFaction == null)
            {
                return(false);
            }

            if (tribalFaction.PlayerRelationKind != FactionRelationKind.Hostile)
            {
                return(false);
            }

            Map map = (Map)parms.target;

            parms.points = StorytellerUtility.DefaultThreatPointsNow(map) * 1.2f;

            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms
            {
                faction = tribalFaction,
                points  = parms.points,
                generateFightersOnly = true,
                groupKind            = PawnGroupKindDefOf.Combat,
                raidStrategy         = RaidStrategyDefOf.ImmediateAttack,
                forceOneIncap        = true
            };

            List <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList();

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

            LordJob lordJob = new LordJob_AssaultColony(tribalFaction, canKidnap: true, canTimeoutOrFlee: false);
            Lord    lord    = LordMaker.MakeNewLord(tribalFaction, lordJob, map);

            lord.numPawnsLostViolently = int.MaxValue;

            foreach (var pawn in pawns)
            {
                if (CellFinder.TryFindRandomEdgeCellWith((IntVec3 c) => !c.Roofed(map) && c.Walkable(map) && c.Standable(map), map, 0f, out IntVec3 pos))
                {
                    GenSpawn.Spawn(pawn, pos, map);
                    pawn.health.AddHediff(HediffDefOfLocal.ThirstHumanMeat);

                    if (!pawn.story.traits.HasTrait(TraitDefOf.Cannibal))
                    {
                        Trait t = new Trait(TraitDefOf.Cannibal);
                        pawn.story.traits.GainTrait(t);
                    }

                    lord.AddPawn(pawn);
                }
            }

            SendStandardLetter(parms, null);

            Find.TickManager.slower.SignalForceNormalSpeedShort();
            Find.StoryWatcher.statsRecord.numRaidsEnemy++;

            return(true);
        }
Esempio n. 25
0
        private void SpawnGroup(int points, CellRect locationRect, Faction faction, Map map, int countCap)
        {
            PawnGroupKindDef groupKind;

            if (faction.def.pawnGroupMakers.Where((PawnGroupMaker gm) => gm.kindDef == PawnGroupKindDefOf.Settlement).Count() > 0)
            {
                groupKind = PawnGroupKindDefOf.Settlement;
            }
            else
            {
                groupKind = faction.def.pawnGroupMakers.RandomElement().kindDef;
            }

            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms();

            pawnGroupMakerParms.groupKind            = groupKind;
            pawnGroupMakerParms.tile                 = map.Tile;
            pawnGroupMakerParms.points               = points;
            pawnGroupMakerParms.faction              = faction;
            pawnGroupMakerParms.generateFightersOnly = false;
            pawnGroupMakerParms.forceOneIncap        = false;
            pawnGroupMakerParms.seed                 = Rand.Int;

            List <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList();
            CellRect    rect  = locationRect;

            if (pawns == null)
            {
                Debug.Warning(Debug.ForceGen, "Generating starting party: Pawns list is null");
            }
            else
            {
                Debug.Log(Debug.ForceGen, "Pawns list contains {0} records", pawns.Count);
            }

            while (pawns.Count > countCap)
            {
                pawns.Remove(pawns.RandomElement());
            }

            foreach (Pawn p in pawns)
            {
                bool result = CellFinder.TryFindRandomCellInsideWith(locationRect, (IntVec3 x) => x.Standable(map), out IntVec3 location);


                if (result)
                {
                    GenSpawn.Spawn(p, location, map, Rot4.Random);
                }
                else
                {
                    Debug.Warning(Debug.ForceGen, "Can't find spawning location for defender pawn!");
                }
            }

            LordJob lordJob = null;

            lordJob = new LordJob_DefendBase(faction, rect.CenterCell);

            if (lordJob != null)
            {
                LordMaker.MakeNewLord(faction, lordJob, map, pawns);
            }
        }
Esempio n. 26
0
        private void SpawnEnemies(float threatPoints, Faction faction, Verse.Map map)
        {
            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms
            {
                faction = faction,
                points  = threatPoints * 0.4f,
                generateFightersOnly = true,
                groupKind            = PawnGroupKindDefOf.Combat,
                raidStrategy         = RaidStrategyDefOf.ImmediateAttack,
                forceOneIncap        = true
            };

            List <Pawn> pawns = PawnGroupMakerUtility.GeneratePawns(pawnGroupMakerParms).ToList();

            List <int> groups = new List <int>()
            {
                pawns.Count
            };
            int totalPawns = pawns.Count - 1;

            if (pawns.Count > 5)
            {
                groups.Clear();

                if (pawns.Count < maxPawnsInGroup)
                {
                    maxPawnsInGroup = pawns.Count;
                }

                while (groups.Count < maxGroups)
                {
                    if (totalPawns <= 0)
                    {
                        break;
                    }

                    int pawnsGroupCount = Rand.Range(1, maxPawnsInGroup);

                    if (pawnsGroupCount > totalPawns)
                    {
                        pawnsGroupCount = totalPawns;
                    }

                    groups.Add(pawnsGroupCount);
                    totalPawns -= pawnsGroupCount;
                }
            }

            int total = 0;

            for (int i = 0; i < groups.Count; i++)
            {
                MultipleCaravansCellFinder.FindStartingCellsFor2Groups(map, out IntVec3 playerStartingSpot, out IntVec3 second);

                for (int i2 = 0; i2 < groups[i]; i2++)
                {
                    IntVec3 loc = CellFinder.RandomSpawnCellForPawnNear(second, map);
                    GenSpawn.Spawn(pawns[total], loc, map);
                    total++;
                }
            }

            LordJob lordJob = new LordJob_AssaultColony(faction, canKidnap: true, canTimeoutOrFlee: false);

            if (lordJob != null)
            {
                LordMaker.MakeNewLord(faction, lordJob, map, pawns);
            }
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            parms.points *= IncidentPointsFactorRange.RandomInRange;
            Caravan caravan         = (Caravan)parms.target;
            bool    factionCanFight = WorldUtility.FactionCanFight((int)parms.points, parms.faction);
            //if (!PawnGroupMakerUtility.TryGetRandomFactionForCombatPawnGroup(parms.points, out parms.faction))
            //{
            //    return false;
            //}
            List <ThingCount> demands = GenerateDemands(caravan);

            if (demands.NullOrEmpty() && parms.faction.HostileTo(caravan.Faction))
            {
                return(false);
            }
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms);

            defaultPawnGroupMakerParms.generateFightersOnly            = true;
            defaultPawnGroupMakerParms.dontUseSingleUseRocketLaunchers = true;
            List <Pawn> attackers = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms).ToList();

            if (attackers.Count == 0)
            {
                Log.Error("Caravan demand incident couldn't generate any enemies even though min points have been checked. faction=" + defaultPawnGroupMakerParms.faction + "(" + ((defaultPawnGroupMakerParms.faction != null) ? defaultPawnGroupMakerParms.faction.def.ToString() : "null") + ") parms=" + parms);
                return(false);
            }
            CameraJumper.TryJumpAndSelect(caravan);
            DiaNode   diaNode   = new DiaNode(GenerateMessageText(parms.faction, attackers.Count, demands, caravan));
            DiaOption diaOption = new DiaOption("CaravanDemand_Give".Translate());

            diaOption.action = delegate
            {
                ActionGive(caravan, demands, attackers);
                wo.interactable = false;
            };
            if (!wo.Faction.HostileTo(caravan.Faction))
            {
                string str = "RW_CaravanDemand_GiveDisabled".Translate(wo.GetInspectString());
                diaOption.SetText(str);
                diaOption.Disable("");
            }
            diaOption.resolveTree = true;
            diaNode.options.Add(diaOption);
            string fightString = "CaravanDemand_Fight".Translate();

            if (!wo.Faction.HostileTo(caravan.Faction))
            {
                fightString = "RW_Attack_Verbatum".Translate();
            }
            DiaOption diaOption2 = new DiaOption(fightString);

            diaOption2.action = delegate
            {
                ActionFight(caravan, attackers);
                wo.Destroy();
            };
            diaOption2.resolveTree = true;
            diaNode.options.Add(diaOption2);
            DiaOption diaOption3 = new DiaOption("CaravanMeeting_MoveOn".Translate());

            diaOption3.action = delegate
            {
                ActionMoveOn(caravan, attackers);
            };
            if (wo.Faction.HostileTo(caravan.Faction))
            {
                diaOption3.Disable("CaravanMeeting_MoveOn".Translate());
            }
            diaOption3.resolveTree = true;
            diaNode.options.Add(diaOption3);
            TaggedString taggedString = "CaravanDemandTitle".Translate(parms.faction.Name);

            Find.WindowStack.Add(new Dialog_NodeTreeWithFactionInfo(diaNode, parms.faction, true, false, taggedString));
            Find.Archive.Add(new ArchivedDialog(diaNode.text, taggedString, parms.faction));
            return(true);
        }
Esempio n. 28
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            if (!DropCellFinder.TryFindRaidDropCenterClose(spot: out IntVec3 dropSpot, map: (Map)parms.target))
            {
                return(false);
            }
            if (!FindAlliedWarringFaction(faction: out Faction faction))
            {
                return(false);
            }
            if (faction == null)
            {
                return(false);
            }

            bool   bamboozle           = false;
            string arrivalText         = string.Empty;
            int    factionGoodWillLoss = FactionInteractionDiplomacyTuningsBlatantlyCopiedFromPeaceTalks
                                         .GoodWill_FactionWarPeaceTalks_ImpactSmall.RandomInRange / 2;

            IncidentParms raidParms =
                StorytellerUtility.DefaultParmsNow(incCat: IncidentCategoryDefOf.ThreatBig, target: (Map)parms.target);

            raidParms.forced          = true;
            raidParms.faction         = faction.EnemyInFactionWar();
            raidParms.raidStrategy    = RaidStrategyDefOf.ImmediateAttack;
            raidParms.raidArrivalMode = PawnsArrivalModeDefOf.CenterDrop;
            raidParms.spawnCenter     = dropSpot;

            if (faction.EnemyInFactionWar().def.techLevel >= TechLevel.Industrial &&
                faction.EnemyInFactionWar().RelationKindWith(other: Faction.OfPlayer) == FactionRelationKind.Hostile)
            {
                bamboozle = Rand.Chance(chance: 0.25f);
            }

            if (bamboozle)
            {
                arrivalText = string.Format(format: raidParms.raidArrivalMode.textEnemy, arg0: raidParms.faction.def.pawnsPlural, arg1: raidParms.faction.Name);
            }

            //get combat-pawns to spawn.
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(groupKind: PawnGroupKindDefOf.Combat, parms: raidParms);

            defaultPawnGroupMakerParms.points = IncidentWorker_Raid.AdjustedRaidPoints(points: defaultPawnGroupMakerParms.points, raidArrivalMode: raidParms.raidArrivalMode, raidStrategy: raidParms.raidStrategy, faction: defaultPawnGroupMakerParms.faction, groupKind: PawnGroupKindDefOf.Combat);
            IEnumerable <PawnKindDef> pawnKinds = PawnGroupMakerUtility.GeneratePawnKindsExample(parms: defaultPawnGroupMakerParms).ToList();
            List <Thing> pawnlist = new List <Thing>();

            for (int i = 0; i < this.pawnstoSpawn.RandomInRange; i++)
            {
                PawnGenerationRequest request = new PawnGenerationRequest(kind: pawnKinds.RandomElement(), faction: faction, allowDowned: true, allowDead: true, mustBeCapableOfViolence: true);
                Pawn woundedCombatant         = PawnGenerator.GeneratePawn(request: request);
                woundedCombatant.guest.getRescuedThoughtOnUndownedBecauseOfPlayer = true;
                ThingDef weapon = Rand.Bool ? DefDatabase <ThingDef> .AllDefsListForReading.Where(predicate : x => x.IsWeaponUsingProjectiles).RandomElement() : null;

                ThingDef  usedWeaponDef = weapon;
                DamageDef damageDef     = usedWeaponDef?.Verbs?.First()?.defaultProjectile?.projectile?.damageDef; //null? check? All? THE? THINGS!!!!?
                if (usedWeaponDef != null && damageDef == null)
                {
                    usedWeaponDef = null;
                }
                CustomFaction_HealthUtility.DamageUntilDownedWithSpecialOptions(p: woundedCombatant, allowBleedingWounds: true, damageDef: damageDef, weapon: usedWeaponDef);
                //todo: maybe add some storylogging.
                pawnlist.Add(item: woundedCombatant);
            }

            string  initialMessage = "MFI_WoundedCombatant".Translate(faction.Name);
            DiaNode diaNode        = new DiaNode(text: initialMessage);

            DiaOption diaOptionOk = new DiaOption(text: "OK".Translate())
            {
                resolveTree = true
            };

            DiaOption diaOptionAccept = new DiaOption(text: "RansomDemand_Accept".Translate())
            {
                action = () =>
                {
                    if (bamboozle)
                    {
                        Find.TickManager.slower.SignalForceNormalSpeedShort();
                        IncidentDefOf.RaidEnemy.Worker.TryExecute(parms: raidParms);
                    }
                    else
                    {
                        IntVec3 intVec = IntVec3.Invalid;

                        List <Building> allBuildingsColonist = ((Map)parms.target).listerBuildings.allBuildingsColonist.Where(predicate: x => x.def.thingClass == typeof(Building_Bed)).ToList();
                        for (int i = 0; i < allBuildingsColonist.Count; i++)
                        {
                            if (DropCellFinder.TryFindDropSpotNear(center: allBuildingsColonist[index: i].Position, map: (Map)parms.target, result: out intVec, allowFogged: false, canRoofPunch: false))
                            {
                                break;
                            }
                        }
                        if (intVec == IntVec3.Invalid)
                        {
                            intVec = DropCellFinder.RandomDropSpot(map: (Map)parms.target);
                        }
                        DropPodUtility.DropThingsNear(dropCenter: intVec, map: (Map)parms.target, things: pawnlist, openDelay: 180, leaveSlag: true, canRoofPunch: false);
                        Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction: faction);
                    }
                }
            };
            string  bamboozledAndAmbushed = "MFI_WoundedCombatantAmbush".Translate(faction, arrivalText);
            string  commanderGreatful     = "MFI_WoundedCombatantGratitude".Translate();
            DiaNode acceptDiaNode         = new DiaNode(text: bamboozle ? bamboozledAndAmbushed : commanderGreatful);

            diaOptionAccept.link = acceptDiaNode;
            diaNode.options.Add(item: diaOptionAccept);
            acceptDiaNode.options.Add(item: diaOptionOk);

            DiaOption diaOptionRejection = new DiaOption(text: "RansomDemand_Reject".Translate())
            {
                action = () =>
                {
                    if (bamboozle)
                    {
                        Find.World.GetComponent <WorldComponent_MFI_FactionWar>().NotifyBattleWon(faction: faction);
                    }
                    else
                    {
                        faction.TryAffectGoodwillWith(other: Faction.OfPlayer, goodwillChange: factionGoodWillLoss, canSendMessage: false);
                    }
                }
            };
            string  rejectionResponse        = "MFI_WoundedCombatantRejected".Translate(faction.Name, factionGoodWillLoss);
            string  bamboozlingTheBamboozler = "MFI_WoundedCombatantAmbushAvoided".Translate();
            DiaNode rejectionDiaNode         = new DiaNode(text: bamboozle ? bamboozlingTheBamboozler : rejectionResponse);

            diaOptionRejection.link = rejectionDiaNode;
            diaNode.options.Add(item: diaOptionRejection);
            rejectionDiaNode.options.Add(item: diaOptionOk);

            string title = "MFI_WoundedCombatantTitle".Translate(((Map)parms.target).Parent.Label);

            Find.WindowStack.Add(window: new Dialog_NodeTreeWithFactionInfo(nodeRoot: diaNode, faction: faction, delayInteractivity: true, radioMode: true, title: title));
            Find.Archive.Add(archivable: new ArchivedDialog(text: diaNode.text, title: title, relatedFaction: faction));
            return(true);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            Cthulhu.Utility.DebugReport("Cosmic Horror Raid Report: Trying execution");
            this.ResolveRaidPoints(parms);
            bool result = false;

            if (!this.TryResolveRaidFaction(parms))
            {
                Cthulhu.Utility.DebugReport("Cosmic Horror Raid Report: Failed to resolve faction");
                result = false;
            }
            else
            {
                PawnGroupKindDef combat = PawnGroupKindDefOf.Combat;
                this.ResolveRaidStrategy(parms, PawnGroupKindDefOf.Combat);
                this.ResolveRaidArriveMode(parms);
                if (!parms.raidArrivalMode.Worker.TryResolveRaidSpawnCenter(parms))
                {
                    result = false;
                }
                else
                {
                    parms.points = IncidentWorker_Raid.AdjustedRaidPoints(parms.points, parms.raidArrivalMode,
                                                                          parms.raidStrategy, parms.faction, combat);

                    PawnGroupMakerParms defaultPawnGroupMakerParms =
                        IncidentParmsUtility.GetDefaultPawnGroupMakerParms(combat, parms);

                    List <Pawn> list = PawnGroupMakerUtility
                                       .GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();
                    if (list.Count == 0)
                    {
                        Cthulhu.Utility.ErrorReport("Got no pawns spawning raid from parms " + parms);
                        result = false;
                    }
                    parms.raidArrivalMode.Worker.Arrive(list, parms);

                    StringBuilder stringBuilder = new StringBuilder();
                    stringBuilder.AppendLine("Points = " + parms.points.ToString("F0"));
                    foreach (Pawn current2 in list)
                    {
                        string str = (current2.equipment == null || current2.equipment.Primary == null)
                            ? "unarmed"
                            : current2.equipment.Primary.LabelCap;
                        stringBuilder.AppendLine(current2.KindLabel + " - " + str);
                    }
                    string       letterLabel  = this.GetLetterLabel(parms);
                    string       letterText   = this.GetLetterText(parms, list);
                    TaggedString letterLabelS = letterLabel;
                    TaggedString letterTextS  = letterText;
                    //string lalalal = this.GetRelatedPawnsInfoLetterText(parms);
                    PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabelS, ref letterTextS,
                                                                        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);
                    if (this.GetLetterDef() == LetterDefOf.ThreatBig)
                    {
                        //TaleRecorder.RecordTale(TaleDefOf. RaidArrived, new object[0]);
                    }
                    parms.raidStrategy.Worker.MakeLords(parms, list);
                    LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
                    if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts))
                    {
                        for (int j = 0; j < list.Count; j++)
                        {
                            Pawn pawn2 = list[j];
                            if (pawn2.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt))
                            {
                                LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts,
                                                                     OpportunityType.Critical);
                                break;
                            }
                        }
                    }
                    result = true;
                }
            }
            return(result);
        }
Esempio n. 30
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            this.ResolveRaidPoints(parms);
            if (!this.TryResolveRaidFaction(parms))
            {
                return(false);
            }
            this.ResolveRaidStrategy(parms, PawnGroupKindDefOf.Combat);
            parms.raidArrivalMode = PawnsArrivalModeDefOf.CenterDrop;
            this.ResolveRaidPoints(parms);

            //IncidentParmsUtility.AdjustPointsForGroupArrivalParams(parms);
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms);
            List <Pawn>         list = PawnGroupMakerUtility.GeneratePawns(defaultPawnGroupMakerParms, true).ToList <Pawn>();

            if (list.Count == 0)
            {
                Log.Error("Got no pawns spawning raid from parms " + parms);
                return(false);
            }
            TargetInfo target = new TargetInfo(parms.spawnCenter, map, false);

            Thing portal = GenSpawn.Spawn(new ThingDef(), target.Cell, map);

            MoteMaker.ThrowHeatGlow(target.Cell, map, 5f);
            MoteMaker.ThrowHeatGlow(target.Cell, map, 5f);
            MoteMaker.ThrowFireGlow(target.Cell, map, 5f);
            MoteMaker.ThrowFireGlow(target.Cell, map, 5f);
            MoteMaker.ThrowMetaPuffs(target);
            MoteMaker.ThrowMetaPuffs(target);

            foreach (Pawn current in list)
            {
                GenSpawn.Spawn(current, target.Cell, map);
                target = current;
            }

            StringBuilder stringBuilder = new StringBuilder();

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

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(list, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true);
            //Find.LetterStack.ReceiveLetter(letterLabel, letterText, LetterDefOf.BadUrgent, target, stringBuilder.ToString());
            //if (this.GetLetterType() == LetterType.BadUrgent)

            /*{
             *  TaleRecorder.RecordTale(TaleDefOf., new object[0]);
             * }*/

            parms.raidStrategy.Worker.MakeLords(parms, list);

            //Lord lord = LordMaker.MakeNewLord(parms.faction, parms.raidStrategy.Worker.MakeLordJob(parms, map), map, list);
            //AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
            if (!PlayerKnowledgeDatabase.IsComplete(ConceptDefOf.ShieldBelts))
            {
                for (int i = 0; i < list.Count; i++)
                {
                    Pawn pawn = list[i];
                    if (pawn.apparel.WornApparel.Any((Apparel ap) => ap is ShieldBelt))
                    {
                        LessonAutoActivator.TeachOpportunity(ConceptDefOf.ShieldBelts, OpportunityType.Critical);
                        break;
                    }
                }
            }

            /*if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer))
             * {
             *  Log.Message(string.Concat(new object[]
             *  {
             *      "Market value threshold to start stealing: ",
             *      StealAIUtility.StartStealingMarketValueThreshold(lord),
             *      " (colony wealth = ",
             *      map.wealthWatcher.WealthTotal,
             *      ")"
             *  }));
             * }*/



            Find.TickManager.slower.SignalForceNormalSpeedShort();
            Find.StoryWatcher.statsRecord.numRaidsEnemy++;
            return(true);
        }