Esempio n. 1
0
 internal static bool _CheckAcceptArrest(this Pawn _this, Pawn arrester)
 {
     if (_this.health.hediffSet.HasHediff(HediffDefOfPsychology.Saboteur))
     {
         _this.health.hediffSet.hediffs.RemoveAll(h => h.def == HediffDefOfPsychology.Saboteur);
         Faction faction = Find.FactionManager.RandomEnemyFaction();
         _this.SetFaction(faction);
         List <Pawn> thisPawn = new List <Pawn>();
         thisPawn.Add(_this);
         IncidentParms parms = new IncidentParms();
         parms.faction     = faction;
         parms.spawnCenter = _this.Position;
         Lord lord = LordMaker.MakeNewLord(faction, RaidStrategyDefOf.ImmediateAttack.Worker.MakeLordJob(parms, _this.Map), _this.Map, thisPawn);
         AvoidGridMaker.RegenerateAvoidGridsFor(faction, _this.Map);
         LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
         if (faction != null)
         {
             Find.LetterStack.ReceiveLetter("LetterLabelSabotage".Translate(), "SaboteurRevealedFaction".Translate(new object[] { _this.LabelShort, faction.Name }).AdjustedFor(_this), LetterType.BadUrgent, _this, null);
         }
         else
         {
             Find.LetterStack.ReceiveLetter("LetterLabelSabotage".Translate(), "SaboteurRevealed".Translate(new object[] { _this.LabelShort }).AdjustedFor(_this), LetterType.BadUrgent, _this, null);
         }
     }
     if (_this.health.Downed)
     {
         return(true);
     }
     if (_this.story != null && _this.story.WorkTagIsDisabled(WorkTags.Violent))
     {
         return(true);
     }
     if (_this.Faction != null && _this.Faction != arrester.GetFactionInt())
     {
         _this.Faction.Notify_MemberCaptured(_this, arrester.Faction);
     }
     if (Rand.Value < (arrester.GetStatValue(StatDefOfPsychology.ArrestPeacefullyChance) * (Mathf.InverseLerp(-100f, 100f, _this.relations.OpinionOf(arrester))) * (arrester.Faction == _this.Faction ? 1.5 : 1)))
     {
         return(true);
     }
     Messages.Message("MessageRefusedArrest".Translate(new object[]
     {
         _this.LabelShort
     }), _this, MessageSound.SeriousAlert);
     if (_this.Faction == null || !arrester.HostileTo(_this))
     {
         _this.mindState.mentalStateHandler.TryStartMentalState(MentalStateDefOf.Berserk, null, false, false, null);
     }
     return(false);
 }
Esempio n. 2
0
        private void TrySpawnMadSailors()
        {
            List <Pawn> lordList = new List <Pawn>();
            Faction     faction  = Find.FactionManager.FirstFactionOfDef(CultsDefOf.Cults_Sailors);

            Cthulhu.Utility.DebugReport(faction.ToString());
            LordJob_DefendPoint lordJob = new LordJob_DefendPoint(this.Position);

            if (this.pointsLeft <= 0f)
            {
                return;
            }
            if (this.lord == null)
            {
                this.lord = LordMaker.MakeNewLord(faction, lordJob, Map, lordList);
            }
            while (pointsLeft > 0f)
            {
                IntVec3 center;
                if ((from cell in GenAdj.CellsAdjacent8Way(this)
                     where cell.Walkable(Map)
                     select cell).TryRandomElement(out center))
                {
                    PawnGenerationRequest request = new PawnGenerationRequest(CultsDefOf.Cults_Sailor, faction, PawnGenerationContext.NonPlayer, Map.Tile, false, false, false, false, true, true, 20f, false, true, true, false, false, false, false, null, null, null, null);
                    Pawn pawn = PawnGenerator.GeneratePawn(request);
                    if (GenPlace.TryPlaceThing(pawn, center, Map, ThingPlaceMode.Near, null))
                    {
                        if (LordUtility.GetLord(pawn) != null)
                        {
                            LordUtility.GetLord(pawn).Cleanup();
                            LordUtility.GetLord(pawn).CurLordToil.Cleanup();
                            LordUtility.GetLord(pawn).LordJob.Cleanup();
                        }
                        this.lord.AddPawn(pawn);
                        this.pointsLeft -= pawn.kindDef.combatPower;
                        Cthulhu.Utility.ApplySanityLoss(pawn, 1f);
                        continue;
                    }
                    //Find.WorldPawns.PassToWorld(pawn, PawnDiscardDecideMode.Discard);
                }
            }
            AvoidGridMaker.RegenerateAvoidGridsFor(faction, Map);
            this.pointsLeft = 0f;
            SoundDefOf.PsychicPulseGlobal.PlayOneShotOnCamera();
            return;
        }
Esempio n. 3
0
        public void AlertThief(Pawn pawn, Pawn observer)
        {
            pawn.jobs.EndCurrentJob(JobCondition.InterruptForced);
            List <Pawn> thisPawn = new List <Pawn>();

            thisPawn.Add(pawn);
            IncidentParms parms = new IncidentParms();

            parms.faction     = pawn.Faction;
            parms.spawnCenter = pawn.Position;
            Lord lord = LordMaker.MakeNewLord(pawn.Faction, RaidStrategyDefOf.ImmediateAttack.Worker.MakeLordJob(parms, pawn.Map), pawn.Map, thisPawn);

            AvoidGridMaker.RegenerateAvoidGridsFor(pawn.Faction, pawn.Map);
            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);
            if (observer != null)
            {
                Find.LetterStack.ReceiveLetter("LetterLabelThief".Translate(), "ThiefRevealed".Translate(new object[] { observer.LabelShort, pawn.Faction.Name }).AdjustedFor(pawn), LetterType.BadUrgent, pawn, null);
            }
            else
            {
                Find.LetterStack.ReceiveLetter("LetterLabelThief".Translate(), "ThiefInjured".Translate(new object[] { pawn.Faction.Name }).AdjustedFor(pawn), LetterType.BadNonUrgent, pawn, null);
            }
        }
Esempio n. 4
0
        public override void DeSpawn()
        {
            Map map = base.Map;

            base.DeSpawn();
            if (this.def.IsEdifice())
            {
                map.edificeGrid.DeRegister(this);
            }
            if (this.def.MakeFog)
            {
                map.fogGrid.Notify_FogBlockerRemoved(base.Position);
            }
            if (this.def.holdsRoof)
            {
                RoofCollapseCellsFinder.Notify_RoofHolderDespawned(this, map);
            }
            if (this.sustainerAmbient != null)
            {
                this.sustainerAmbient.End();
            }
            CellRect cellRect = this.OccupiedRect();

            for (int i = cellRect.minZ; i <= cellRect.maxZ; i++)
            {
                for (int j = cellRect.minX; j <= cellRect.maxX; j++)
                {
                    IntVec3     loc         = new IntVec3(j, 0, i);
                    MapMeshFlag mapMeshFlag = MapMeshFlag.Buildings;
                    if (this.def.coversFloor)
                    {
                        mapMeshFlag |= MapMeshFlag.Terrain;
                    }
                    if (this.def.Fillage == FillCategory.Full)
                    {
                        mapMeshFlag |= MapMeshFlag.Roofs;
                        mapMeshFlag |= MapMeshFlag.Snow;
                    }
                    map.mapDrawer.MapMeshDirty(loc, mapMeshFlag);
                    map.glowGrid.MarkGlowGridDirty(loc);
                }
            }
            map.listerBuildings.Remove(this);
            map.listerBuildingsRepairable.Notify_BuildingDeSpawned(this);
            if (this.def.leaveTerrain != null && Current.ProgramState == ProgramState.Playing)
            {
                CellRect.CellRectIterator iterator = this.OccupiedRect().GetIterator();
                while (!iterator.Done())
                {
                    map.terrainGrid.SetTerrain(iterator.Current, this.def.leaveTerrain);
                    iterator.MoveNext();
                }
            }
            map.designationManager.Notify_BuildingDespawned(this);
            if (!this.CanBeSeenOver())
            {
                map.exitMapGrid.Notify_LOSBlockerDespawned();
            }
            if (this.def.building.hasFuelingPort)
            {
                IntVec3        fuelingPortCell = FuelingPortUtility.GetFuelingPortCell(base.Position, base.Rotation);
                CompLaunchable compLaunchable  = FuelingPortUtility.LaunchableAt(fuelingPortCell, map);
                if (compLaunchable != null)
                {
                    compLaunchable.Notify_FuelingPortSourceDeSpawned();
                }
            }
            if (this.def.building.ai_combatDangerous)
            {
                AvoidGridMaker.Notify_CombatDangerousBuildingDespawned(this, map);
            }
        }
Esempio n. 5
0
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

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

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

            if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop || parms.raidArrivalMode == PawnsArriveMode.EdgeDrop)
            {
                DropPodUtility.DropThingsNear(parms.spawnCenter, map, list.Cast <Thing>(), parms.raidPodOpenDelay, false, true, true, false);
                target = new TargetInfo(parms.spawnCenter, map, false);
            }
            else
            {
                foreach (Pawn item in list)
                {
                    IntVec3 loc = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8, null);
                    GenSpawn.Spawn(item, loc, map, parms.spawnRotation, false);
                    target = item;
                }
            }
            StringBuilder stringBuilder = new StringBuilder();

            stringBuilder.AppendLine("Points = " + parms.points.ToString("F0"));
            foreach (Pawn item2 in list)
            {
                string str = (item2.equipment == null || item2.equipment.Primary == null) ? "unarmed" : item2.equipment.Primary.LabelCap;
                stringBuilder.AppendLine(item2.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);
            Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), target, stringBuilder.ToString());
            if (this.GetLetterDef() == LetterDefOf.ThreatBig)
            {
                TaleRecorder.RecordTale(TaleDefOf.RaidArrived);
            }
            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("Market value threshold to start stealing: " + StealAIUtility.StartStealingMarketValueThreshold(lord) + " (colony wealth = " + map.wealthWatcher.WealthTotal + ")");
            }
            return(true);
        }
        protected override bool TryExecuteWorker(IncidentParms parms)
        {
            Map map = (Map)parms.target;

            this.ResolveRaidPoints(parms);
            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>();

            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 pawn in list)
            {
                string str = (pawn.equipment == null || pawn.equipment.Primary == null) ? "unarmed" : pawn.equipment.Primary.LabelCap;
                stringBuilder.AppendLine(pawn.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);
            AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction, map);
            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;
                    }
                }
            }
            return(true);
        }
        public override bool TryExecute(IncidentParms parms)
        {
            ResolveRaidPoints(parms);
            if (!TryResolveRaidFaction(parms))
            {
                return(false);
            }
            ResolveRaidStrategy(parms);
            ResolveRaidArriveMode(parms);
            ResolveRaidSpawnCenter(parms);
            PawnGroupMakerUtility.AdjustPointsForGroupArrivalParams(parms);
            List <Pawn> list = PawnGroupMakerUtility.GenerateArrivingPawns(parms).ToList();

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

            if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop || parms.raidArrivalMode == PawnsArriveMode.EdgeDrop)
            {
                DropPodUtility.DropThingsNear(parms.spawnCenter, list.Cast <Thing>(), parms.raidPodOpenDelay, true, true);
                letterLookTarget = parms.spawnCenter;
            }
            else
            {
                foreach (Pawn current in list)
                {
                    float   value  = Rand.Value;
                    IntVec3 intVec = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, 8);
                    GenSpawn.Spawn(current, intVec);

                    letterLookTarget = current;

                    if (parms.faction.def.techLevel >= TechLevel.Industrial && value >= 0.5f && current.RaceProps.fleshType != FleshType.Mechanoid)
                    {
                        CellFinder.RandomClosewalkCellNear(current.Position, 5);
                        Thing thing = ThingMaker.MakeThing(ThingDef.Named("VehicleATV"));
                        thing.SetFaction(parms.faction);
                        GenSpawn.Spawn(thing, current.Position);

                        Job job = new Job(HaulJobDefOf.Mount);
                        Find.Reservations.ReleaseAllForTarget(thing);
                        job.targetA = thing;
                        current.jobs.StartJob(job, JobCondition.InterruptForced);
                    }
                }
            }
            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);
            }
            Find.LetterStack.ReceiveLetter(this.GetLetterLabel(parms), this.GetLetterText(parms, list), this.GetLetterType(), letterLookTarget, stringBuilder.ToString());
            if (this.GetLetterType() == LetterType.BadUrgent)
            {
                TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]);
            }
            PawnRelationUtility.Notify_PawnsSeenByPlayer(list, GetRelatedPawnsInfoLetterText(parms), true);
            Lord lord = LordMaker.MakeNewLord(parms.faction, parms.raidStrategy.Worker.MakeLordJob(ref parms), list);

            AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction);
            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 = ",
                    Find.StoryWatcher.watcherWealth.WealthTotal,
                    ")"
                }));
            }
            return(true);
        }
Esempio n. 8
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);
        }
        private void DoRaiderAttack()
        {
            IntVec3 startPos;
            string  str = txtArtefactActivatedRaiders.Translate();

            // Find a valid spawn position
            if (!RCellFinder.TryFindRandomPawnEntryCell(out startPos, Map, CellFinder.EdgeRoadChance_Hostile, null))
            {
                return;
            }

            int countPawns;
            IEnumerable <Faction> factions = Find.FactionManager.AllFactions.Where <Faction>(f => f.HostileTo(Faction.OfPlayer) && f != Faction.OfMechanoids && f != Faction.OfInsects);
            Faction faction;

            if (!factions.TryRandomElement(out faction))
            {
                return;
            }

            List <Pawn> pawns = new List <Pawn>();

            // Spawn raiders
            float rvalue = UnityEngine.Random.@value;

            countPawns = (int)UnityEngine.Random.Range(0.0f, 15.0f); // Random: max. count of pawns
            if (countPawns <= 0)
            {
                countPawns = 1;
            }

            // Create raider
            for (int i = 0; i < countPawns; i++)
            {
                IntVec3 spawnPos;
                if (i == 0)
                {
                    spawnPos = startPos;
                }
                else
                {
                    spawnPos = CellFinder.RandomClosewalkCellNear(startPos, Map, 8);
                }

                //pawnKindDefs = DefDatabase<PawnKindDef>.AllDefs.Where<PawnKindDef>(pk => pk.defaultFactionType.defName == "Spacer" || pk.defaultFactionType.defName == "Pirate").ToList();

                Pawn pawn = PawnGenerator.GeneratePawn(pawnKindDefs.RandomElement(), faction);
                if (GenPlace.TryPlaceThing(pawn, spawnPos, Map, ThingPlaceMode.Near))
                {
                    pawns.Add(pawn);
                    pointsToSpend -= pawn.kindDef.combatPower;
                    //Log.Error("Points: " + pointsToSpend.ToString() + " // Costs: " + pawn.kindDef.pointsCost.ToString()); // TEST!!!
                    if (pointsToSpend <= 0.0f)
                    {
                        break;
                    }
                }
            }

            // Create Lord
            string empty  = string.Empty;
            string empty2 = string.Empty;

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(pawns, ref empty, ref empty2, "LetterFamilyMembersRaidFriendly".Translate(), false);
            if (!empty2.NullOrEmpty())
            {
                Find.LetterStack.ReceiveLetter(empty, empty2, LetterDefOf.PositiveEvent, new GlobalTargetInfo(pawns[0].Position, pawns[0].Map), null);
            }

            LordJob lordJob = new LordJob_AssaultColony(faction, false, false, false);
            Lord    lord    = LordMaker.MakeNewLord(faction, lordJob, Map, pawns);

            AvoidGridMaker.RegenerateAvoidGridsFor(faction, Map);

            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);

            string label = labelLetterArtefact.Translate();

            // add game event
            Find.LetterStack.ReceiveLetter(label, str, LetterDefOf.ThreatSmall, pawns[0], null);


            // add raid to story watcher
            StatsRecord storyWatcher = Find.StoryWatcher.statsRecord;

            storyWatcher.numRaidsEnemy = storyWatcher.numRaidsEnemy + 1;
        }
        private void DoMechanoidAttack()
        {
            IntVec3 startPos;
            string  str = txtArtefactActivatedMechanoids.Translate();

            // Find a valid spawn position
            startPos = CellFinderLoose.RandomCellWith((IntVec3 c) =>
            {
                if (Map.fogGrid.IsFogged(c))
                {
                    return(false);
                }

                if (!Map.reachability.CanReachColony(c))
                {
                    return(false);
                }

                if (Map.roofGrid.Roofed(c))
                {
                    return(false);
                }

                return(true);
            }, Map);


            int         countPawns;
            Faction     faction = Faction.OfMechanoids;
            List <Pawn> pawns   = new List <Pawn>();
            PawnKindDef pawnKindDef;

            // Spawn mechanoids

            // Random: What type is spawned?
            float rvalue = UnityEngine.Random.@value;

            if (rvalue < 0.5f)
            {
                // Spawn Centipedes

                rvalue = UnityEngine.Random.@value; // Random: How many?
                if (rvalue < 0.30f)
                {
                    countPawns = 1;
                }
                else if (rvalue < 0.65f)
                {
                    countPawns = 2;
                }
                else
                {
                    countPawns = 5; // max or when points to spend are done
                }
                pawnKindDef = PawnKindDef.Named(pawnKindDefNameCentipede);
            }
            else
            {
                // Spawn Scythers

                rvalue = UnityEngine.Random.@value; // Random: How many?
                if (rvalue < 0.30f)
                {
                    countPawns = 1;
                }
                else if (rvalue < 0.55f)
                {
                    countPawns = 2;
                }
                else
                {
                    countPawns = 7; // max or when points to spend are done
                }
                pawnKindDef = PawnKindDef.Named(pawnKindDefNameScyther);
            }

            // Create mechanoids
            for (int i = 0; i < countPawns; i++)
            {
                IntVec3 spawnPos;
                if (i == 0)
                {
                    spawnPos = startPos;
                }
                else
                {
                    spawnPos = CellFinder.RandomClosewalkCellNear(startPos, Map, 15);
                }

                Pawn pawn = PawnGenerator.GeneratePawn(pawnKindDef, faction);
                if (GenPlace.TryPlaceThing(pawn, spawnPos, Map, ThingPlaceMode.Near))
                {
                    pawns.Add(pawn);
                    pointsToSpend -= pawn.kindDef.combatPower;
                    //Log.Error("Points: " + pointsToSpend.ToString() + " // Costs: " + pawn.kindDef.pointsCost.ToString()); // TEST!!!
                    if (pointsToSpend <= 0.5f)
                    {
                        break;
                    }
                }
            }

            // Create Lord
            string empty  = string.Empty;
            string empty2 = string.Empty;

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(pawns, ref empty, ref empty2, "LetterFamilyMembersRaidFriendly".Translate(), false);
            if (!empty2.NullOrEmpty())
            {
                Find.LetterStack.ReceiveLetter(empty, empty2, LetterDefOf.PositiveEvent, new GlobalTargetInfo(pawns[0].Position, pawns[0].Map), null);
            }

            LordJob lordJob = new LordJob_AssaultColony(faction, true, false, false);
            Lord    lord    = LordMaker.MakeNewLord(faction, lordJob, Map, pawns);

            AvoidGridMaker.RegenerateAvoidGridsFor(faction, Map);

            LessonAutoActivator.TeachOpportunity(ConceptDefOf.EquippingWeapons, OpportunityType.Critical);

            string label = labelLetterArtefact.Translate();

            // add game event
            Find.LetterStack.ReceiveLetter(label, str, LetterDefOf.ThreatSmall, pawns[0], null);

            // add raid to story watcher
            StatsRecord storyWatcher = Find.StoryWatcher.statsRecord;

            storyWatcher.numRaidsEnemy = storyWatcher.numRaidsEnemy + 1;
        }
Esempio n. 11
0
        public override bool TryExecute(IncidentParms parms)
        {
            {
                this.ResolveRaidPoints(parms);
                if (!this.TryResolveRaidFaction(parms))
                {
                    return(false);
                }
                this.ResolveRaidStrategy(parms);
                this.ResolveRaidArriveMode(parms);
                this.ResolveRaidSpawnCenter(parms);
                PawnGroupMakerUtility.AdjustPointsForGroupArrivalParams(parms);
                List <Pawn> list = PawnGroupMakerUtility.GenerateArrivingPawns(parms, true).ToList <Pawn>();
                if (list.Count == 0)
                {
                    Log.Error("Got no pawns spawning raid from parms " + parms);
                    return(false);
                }
                TargetInfo letterLookTarget = TargetInfo.Invalid;

                Deepstriker_Utilities.UnloadThingsNear(parms.faction, parms.spawnCenter, list.Cast <Thing>(), parms.raidPodOpenDelay, false, true, true);

                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);
                }
                Find.LetterStack.ReceiveLetter(this.GetLetterLabel(parms), this.GetLetterText(parms, list), this.GetLetterType(), letterLookTarget, stringBuilder.ToString());
                if (this.GetLetterType() == LetterType.BadUrgent)
                {
                    TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]);
                }
                PawnRelationUtility.Notify_PawnsSeenByPlayer(list, this.GetRelatedPawnsInfoLetterText(parms), true);
                Lord lord = LordMaker.MakeNewLord(parms.faction, parms.raidStrategy.Worker.MakeLordJob(ref parms), list);
                AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction);
                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 = ",
                        Find.StoryWatcher.watcherWealth.WealthTotal,
                        ")"
                    }));
                }
                return(true);
            }
        }
        public override bool TryExecute(IncidentParms parms)
        {
            //    if (!base.TryExecute(parms))
            {
                ResolveRaidPoints(parms);
                if (!TryResolveRaidFaction(parms))
                {
                    return(false);
                }
                ResolveRaidStrategy(parms);
                ResolveRaidArriveMode(parms);
                ResolveRaidSpawnCenter(parms);
                PawnGroupMakerUtility.AdjustPointsForGroupArrivalParams(parms);
                List <Pawn> list = PawnGroupMakerUtility.GenerateArrivingPawns(parms).ToList();
                if (list.Count == 0)
                {
                    Log.Error("Got no pawns spawning raid from parms " + parms);
                    return(false);
                }
                TargetInfo letterLookTarget = TargetInfo.Invalid;
                if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop || parms.raidArrivalMode == PawnsArriveMode.EdgeDrop)
                {
                    DropPodUtility.DropThingsNear(parms.spawnCenter, list.Cast <Thing>(), parms.raidPodOpenDelay, true, true);
                    letterLookTarget = parms.spawnCenter;
                }
                else
                {
                    foreach (Pawn current in list)
                    {
                        float   value  = Rand.Value;
                        IntVec3 intVec = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, 8);
                        GenSpawn.Spawn(current, intVec);

                        letterLookTarget = current;

                        // Vehicles for raiders
                        // lowered probability for shield users as they are overpowered

                        bool isShieldUser = false;

                        if (parms.faction.def.techLevel >= TechLevel.Industrial && current.RaceProps.fleshType != FleshType.Mechanoid && current.RaceProps.ToolUser)
                        {
                            List <Apparel> wornApparel = current.apparel.WornApparel;
                            for (int i = 0; i < wornApparel.Count; i++)
                            {
                                if (wornApparel[i] is PersonalShield)
                                {
                                    isShieldUser = true;
                                    break;
                                }
                            }
                            if (value >= 0.66f && !isShieldUser || isShieldUser && value > 0.9f)
                            {
                                CellFinder.RandomClosewalkCellNear(current.Position, 5);
                                Thing thing = ThingMaker.MakeThing(ThingDef.Named("VehicleATV"));

                                if (value >= 0.9f && !isShieldUser)
                                {
                                    thing = ThingMaker.MakeThing(ThingDef.Named("VehicleCombatATV"));
                                }

                                GenSpawn.Spawn(thing, current.Position);

                                Job job = new Job(HaulJobDefOf.Mount);
                                Find.Reservations.ReleaseAllForTarget(thing);
                                job.targetA = thing;
                                current.jobs.StartJob(job, JobCondition.InterruptForced, null, true);

                                int num2 = Mathf.FloorToInt(Rand.Value * 0.2f * thing.MaxHitPoints);
                                thing.TakeDamage(new DamageInfo(DamageDefOf.Deterioration, num2, null, null));

                                SoundInfo info = SoundInfo.InWorld(thing);
                                thing.TryGetComp <CompMountable>().sustainerAmbient = thing.TryGetComp <CompVehicle>().compProps.soundAmbient.TrySpawnSustainer(info);
                            }
                        }
                    }
                }
                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);
                }
                Find.LetterStack.ReceiveLetter(GetLetterLabel(parms), GetLetterText(parms, list), GetLetterType(), letterLookTarget, stringBuilder.ToString());
                if (GetLetterType() == LetterType.BadUrgent)
                {
                    TaleRecorder.RecordTale(TaleDefOf.RaidArrived);
                }
                PawnRelationUtility.Notify_PawnsSeenByPlayer(list, GetRelatedPawnsInfoLetterText(parms), true);
                Lord lord = LordMaker.MakeNewLord(parms.faction, parms.raidStrategy.Worker.MakeLordJob(ref parms), list);
                AvoidGridMaker.RegenerateAvoidGridsFor(parms.faction);
                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(ap => ap is PersonalShield))
                        {
                            LessonAutoActivator.TeachOpportunity(ConceptDefOf.PersonalShields, OpportunityType.Critical);
                            break;
                        }
                    }
                }
                if (DebugViewSettings.drawStealDebug && parms.faction.HostileTo(Faction.OfPlayer))
                {
                    Log.Message(string.Concat("Market value threshold to start stealing: ", StealAIUtility.StartStealingMarketValueThreshold(lord), " (colony wealth = ", Find.StoryWatcher.watcherWealth.WealthTotal, ")"));
                }
            }
            Find.TickManager.slower.SignalForceNormalSpeedShort();
            Find.StoryWatcher.statsRecord.numRaidsEnemy++;

            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);
            if (!this.TryResolveRaidFaction(parms))
            {
                Cthulhu.Utility.DebugReport("Cosmic Horror Raid Report: Failed to resolve faction");
                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).ToList <Pawn>();

            if (list.Count == 0)
            {
                Cthulhu.Utility.ErrorReport("Got no pawns spawning raid from parms " + parms);
                return(false);
            }
            TargetInfo target = TargetInfo.Invalid;

            if (parms.raidArrivalMode == PawnsArriveMode.CenterDrop || parms.raidArrivalMode == PawnsArriveMode.EdgeDrop)
            {
                DropPodUtility.DropThingsNear(parms.spawnCenter, map, list.Cast <Thing>(), parms.raidPodOpenDelay, false, true, true);
                target = new TargetInfo(parms.spawnCenter, map);
            }
            else
            {
                foreach (Pawn arg_B3_0 in list)
                {
                    IntVec3 intVec = CellFinder.RandomClosewalkCellNear(parms.spawnCenter, map, 8);
                    GenSpawn.Spawn(arg_B3_0, intVec, map);
                    target = arg_B3_0;
                }
            }
            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);
            string lalalal     = this.GetRelatedPawnsInfoLetterText(parms);

            PawnRelationUtility.Notify_PawnsSeenByPlayer(list, out lalalal, true);
            Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(), target, stringBuilder.ToString());
            if (this.GetLetterDef() == LetterDefOf.ThreatSmall)
            {
                TaleRecorder.RecordTale(TaleDefOf.RaidArrived, new object[0]);
            }
            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.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);
        }