public static bool AnyBlockingHostileLord(Map map, Faction forFaction)
        {
            Faction     faction = map.ParentFaction ?? Faction.OfPlayer;
            List <Lord> lords   = map.lordManager.lords;

            for (int i = 0; i < lords.Count; i++)
            {
                if (lords[i].faction != null && lords[i].faction != forFaction && lords[i].faction != faction)
                {
                    if (lords[i].AnyActivePawn)
                    {
                        LordJob lordJob = lords[i].LordJob;
                        if (lordJob == null || lordJob.CanBlockHostileVisitors)
                        {
                            if (!(lordJob is LordJob_VoluntarilyJoinable))
                            {
                                if (lords[i].faction.HostileTo(forFaction))
                                {
                                    if (!lords[i].faction.HostileTo(faction))
                                    {
                                        return(true);
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(false);
        }
        public static void VampiresGuestTracker(Faction faction, LordJob lordJob, Map map,
                                                IEnumerable <Pawn> startingPawns, ref Lord __result)
        {
            //Only a few lords will have vampires with these issues.
            if (!(lordJob is LordJob_VisitColony) && !(lordJob is LordJob_AssistColony) &&
                !(lordJob is LordJob_TravelAndExit))
            {
                return;
            }
            if (startingPawns == null || !startingPawns.Any())
            {
                return;
            }

            foreach (var startingPawn in startingPawns)
            {
                if (startingPawn.IsVampire())
                {
                    if (HarmonyPatches.VampGuestCache.ContainsKey(startingPawn))
                    {
                        HarmonyPatches.VampGuestCache.Remove(startingPawn);
                    }

                    int curTicks = Find.TickManager.TicksGame;
                    HarmonyPatches.VampGuestCache.Add(startingPawn, curTicks);
                    //////Log.Message("Vampire tracking: " + startingPawn.Label + " " + curTicks);
                }
            }
        }
Пример #3
0
        public bool TryExecute(Pawn organizer, Pawn target)
        {
            if (organizer == null || !TryFindGatherSpot(organizer, out IntVec3 spot))
            {
                return(false);
            }
            var alter = spot.GetFirstThing <Building_SkavenAlter>(organizer.Map);

            //skaven alter must have a chair
            if (alter?.HasChair != true)
            {
                return(false);
            }
            LordJob lordJob1 = CreateLordJob(spot, organizer, target);
            Faction faction  = organizer.Faction;
            LordJob lordJob2 = lordJob1;
            Map     map1     = organizer.Map;

            Pawn[] pawnArray;
            if (!lordJob1.OrganizerIsStartingPawn)
            {
                pawnArray = null;
            }
            else
            {
                pawnArray = new Pawn[1] {
                    organizer
                }
            };
            LordMaker.MakeNewLord(faction, lordJob2, map1, pawnArray);
            SendLetter(spot, organizer, target);
            return(true);
        }
Пример #4
0
        // Token: 0x06000042 RID: 66 RVA: 0x00003515 File Offset: 0x00001715
        protected override IEnumerable <Toil> MakeNewToils()
        {
            LordJob lj = Actor.GetLord().LordJob;

            yield return(new Toil
            {
                defaultCompleteMode = ToilCompleteMode.Delay,
                initAction = delegate()
                {
                    ticksLeftThisToil = 500;
                },
                tickAction = delegate()
                {
                    if (lj is LordJob_PerformComedySet)
                    {
                        if (lj is LordJob_PerformComedySet lordJob_PerformComedySet && lordJob_PerformComedySet.Lead != null)
                        {
                            var num = 1f * (float)lordJob_PerformComedySet.Lead.skills.GetSkill(SkillDefOf.Social).Level;
                            if (lordJob_PerformComedySet.punchline && Rand.Value < num * 0.001f)
                            {
                                MoteMaker.ThrowMetaIcon(Actor.Position, Actor.Map, ThingDefOf_RazzleDazzle.Mote_Comedy);
                            }
                        }
                    }
                }
            });
        public override void Resolve(ResolveParams rp)
        {
            int? mechanoidsCount = rp.mechanoidsCount;
            int  num             = (!mechanoidsCount.HasValue) ? SymbolResolver_RandomMechanoidGroup.DefaultMechanoidCountRange.RandomInRange : mechanoidsCount.Value;
            Lord lord            = rp.singlePawnLord;

            if (lord == null && num > 0)
            {
                Map     map     = BaseGen.globalSettings.map;
                IntVec3 point   = default(IntVec3);
                LordJob lordJob = (!Rand.Bool || !(from x in rp.rect.Cells
                                                   where !x.Impassable(map)
                                                   select x).TryRandomElement <IntVec3>(out point)) ? ((LordJob) new LordJob_AssaultColony(Faction.OfMechanoids, false, false, false, false, false)) : ((LordJob) new LordJob_DefendPoint(point));
                lord = LordMaker.MakeNewLord(Faction.OfMechanoids, lordJob, map, null);
            }
            for (int i = 0; i < num; i++)
            {
                PawnKindDef pawnKindDef = rp.singlePawnKindDef;
                if (pawnKindDef == null)
                {
                    pawnKindDef = (from kind in DefDatabase <PawnKindDef> .AllDefsListForReading
                                   where kind.RaceProps.IsMechanoid
                                   select kind).RandomElementByWeight((PawnKindDef kind) => (float)(1.0 / kind.combatPower));
                }
                ResolveParams resolveParams = rp;
                resolveParams.singlePawnKindDef = pawnKindDef;
                resolveParams.singlePawnLord    = lord;
                resolveParams.faction           = Faction.OfMechanoids;
                BaseGen.symbolStack.Push("pawn", resolveParams);
            }
        }
		private bool DoExecute(IncidentParms parms, List<Pawn> generatedEnemies, IntVec3 existingMapEdgeCell)
		{
			Map map = parms.target as Map;
			bool flag = false;
			if (map == null)
			{
				map = CaravanIncidentUtility.SetupCaravanAttackMap((Caravan)parms.target, generatedEnemies, false);
				flag = true;
			}
			else
			{
				for (int i = 0; i < generatedEnemies.Count; i++)
				{
					IntVec3 loc = CellFinder.RandomSpawnCellForPawnNear(existingMapEdgeCell, map, 4);
					GenSpawn.Spawn(generatedEnemies[i], loc, map, Rot4.Random, WipeMode.Vanish, false);
				}
			}
			this.PostProcessGeneratedPawnsAfterSpawning(generatedEnemies);
			LordJob lordJob = this.CreateLordJob(generatedEnemies, parms);
			if (lordJob != null)
			{
				LordMaker.MakeNewLord(parms.faction, lordJob, map, generatedEnemies);
			}
			string letterLabel = this.GetLetterLabel(generatedEnemies[0], parms);
			string letterText = this.GetLetterText(generatedEnemies[0], parms);
			PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(generatedEnemies, ref letterLabel, ref letterText, this.GetRelatedPawnsInfoLetterText(parms), true, true);
			Find.LetterStack.ReceiveLetter(letterLabel, letterText, this.GetLetterDef(generatedEnemies[0], parms), generatedEnemies[0], parms.faction, null);
			if (flag)
			{
				Find.TickManager.CurTimeSpeed = TimeSpeed.Paused;
			}
			return true;
		}
Пример #7
0
        public static bool IsGuest(Pawn pawn)
        {
            bool result = false;

            if (HospitalityEnabled)
            {
                try
                {
                    result = ((Func <bool>) delegate
                    {
                        if (!pawn.IsValidGuestPawn())
                        {
                            return(false);
                        }
                        LordJob lordJob = ((((ThingWithComps)pawn)?.GetComp <CompGuest>())?.lord)?.LordJob;
                        return(lordJob is Hospitality.LordJob_VisitColony);
                    })();
                }
                catch (TypeLoadException ex)
                {
                    Log.Warning("Failed to check whether ped is a guest. " + ex.Message);
                }
            }
            return(result);
        }
Пример #8
0
        public LordJob CreateJobForLord(IntVec3 point)
        {
            LordJob job = null;

            if (lordJob.GetConstructors().Any(constructor => constructor.GetParameters() is ParameterInfo[] args && args.Count() > 0 && args[0].ParameterType == typeof(IntVec3)))
            {
                job = (LordJob)Activator.CreateInstance(lordJob, new object[] { point });
            }
Пример #9
0
 public static Pawn SpawnInhabitant(IntVec3 pos, Map map, LordJob job = null, bool friendlyJob = false, bool randomWorkSpot = false)
 {
     if (job == null || (!friendlyJob && !map.ParentFaction.HostileTo(Faction.OfPlayer)))
     {
         var workPos = randomWorkSpot ? CellRect.WholeMap(map).RandomCell : pos;
         job = new LordJob_LiveInCity(FindPawnSpot(workPos, map));
     }
     return(SpawnInhabitant(pos, map, job != null ? LordMaker.MakeNewLord(map.ParentFaction, job, map) : null));
 }
Пример #10
0
 private bool CheckVisitor(LordJob lordJob)
 {
     if (hasHospitality || !Settings.VisitorsGoToTradeSpot)
     {
         return(false);
     }
     if (lordJob is LordJob_VisitColony)
     {
         return(true);
     }
     return(false);
 }
        public static bool AnyLordJobPreventsNewGatherings(Map map)
        {
            List <Lord> lords = map.lordManager.lords;

            for (int i = 0; i < lords.Count; i++)
            {
                LordJob lordJob = lords[i].LordJob;
                if (!lordJob.AllowStartNewGatherings)
                {
                    return(true);
                }
            }
            return(false);
        }
Пример #12
0
 public static Pawn SpawnInhabitant(IntVec3 pos, Map map, LordJob job = null, bool friendlyJob = false, bool randomWorkSpot = false, PawnKindDef kind = null)
 {
     if (job == null || (!friendlyJob && !map.ParentFaction.HostileTo(Faction.OfPlayer)))
     {
         var workPos = randomWorkSpot ? CellRect.WholeMap(map).RandomCell : pos;
         workPos = FindPawnSpot(workPos, map);
         job     = map.Parent is Citadel
             ? new LordJob_LiveInCitadel()
             : map.Parent is City city && city.Abandoned
                 ? (LordJob) new LordJob_LiveInAbandonedCity(workPos)
                 : new LordJob_LiveInCity(workPos);
     }
     return(SpawnInhabitant(pos, map, LordMaker.MakeNewLord(map.ParentFaction, job, map)));
 }
Пример #13
0
        private void SpawnGroup(int points, CellRect locationRect, Faction faction, Map map)
        {
            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms();

            pawnGroupMakerParms.groupKind            = PawnGroupKindDefOf.Combat;
            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("Pawns list is null");
            }
            else
            {
                Debug.Log("Pawns list contains {0} records", pawns.Count);
            }

            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("Can't find location!");
                }
            }

            LordJob lordJob = null;

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

            if (lordJob != null)
            {
                LordMaker.MakeNewLord(faction, lordJob, map, pawns);
            }
        }
Пример #14
0
        public Lord GetLord(Pawn forPawn)
        {
            Lord    lord    = null;
            Faction faction = forPawn.Faction;

            if (forPawn.Map.mapPawns.SpawnedPawnsInFaction(faction).Any((Pawn p) => p != forPawn))
            {
                Pawn p2 = (Pawn)GenClosest.ClosestThing_Global(forPawn.Position, forPawn.Map.mapPawns.SpawnedPawnsInFaction(faction), SpawnerProps.lordJoinRadius, (Thing p) => p != forPawn && ((Pawn)p).GetLord() != null, null);
                lord = p2.GetLord();
            }
            if (lord == null)
            {
                LordJob lordJob = SpawnerProps.CreateJobForLord(forPawn.Position);
                lord = LordMaker.MakeNewLord(faction, lordJob, Map, null);
            }

            return(lord);
        }
        private bool DoExecute(IncidentParms parms)
        {
            Map     map     = parms.target as Map;
            IntVec3 invalid = IntVec3.Invalid;

            if (map != null && !CellFinder.TryFindRandomEdgeCellWith((Predicate <IntVec3>)((IntVec3 x) => x.Standable(map) && map.reachability.CanReachColony(x)), map, CellFinder.EdgeRoadChance_Hostile, out invalid))
            {
                return(false);
            }
            List <Pawn> list = this.GeneratePawns(parms);

            if (!list.Any())
            {
                return(false);
            }
            bool flag = false;

            if (map == null)
            {
                map  = CaravanIncidentUtility.SetupCaravanAttackMap((Caravan)parms.target, list);
                flag = true;
            }
            else
            {
                for (int i = 0; i < list.Count; i++)
                {
                    IntVec3 loc = CellFinder.RandomSpawnCellForPawnNear(invalid, map, 4);
                    GenSpawn.Spawn(list[i], loc, map, Rot4.Random, false);
                }
            }
            this.PostProcessGeneratedPawnsAfterSpawning(list);
            LordJob lordJob = this.CreateLordJob(list, parms);

            if (lordJob != null)
            {
                LordMaker.MakeNewLord(parms.faction, lordJob, map, list);
            }
            this.SendAmbushLetter(list[0], parms);
            if (flag)
            {
                Find.TickManager.CurTimeSpeed = TimeSpeed.Paused;
            }
            return(true);
        }
        public static Lord CreateNewLord(this Pawn pawn, IntVec3 loc, LordJob lordJob)
        {
            IntVec3 c = loc;

            if (pawn.GetLord() != null && pawn.GetLord() is Lord l)
            {
                if (l.ownedPawns.Count > 0)
                {
                    l.ownedPawns.Remove(pawn);
                }
                if (l.ownedPawns.Count == 0)
                {
                    l.lordManager.RemoveLord(l);
                }
            }
            Lord lord = LordMaker.MakeNewLord(pawn.Faction, lordJob, pawn.Map, null);

            lord.AddPawn(pawn);
            return(lord);
        }
Пример #17
0
        private void SpawnGroup(int points, CellRect locationRect, Faction faction, Map map)
        {
            PawnGroupMakerParms pawnGroupMakerParms = new PawnGroupMakerParms();

            pawnGroupMakerParms.groupKind            = PawnGroupKindDefOf.Combat;
            pawnGroupMakerParms.tile                 = map.Tile;
            pawnGroupMakerParms.points               = points;
            pawnGroupMakerParms.faction              = faction;
            pawnGroupMakerParms.generateFightersOnly = true;
            pawnGroupMakerParms.raidStrategy         = RaidStrategyDefOf.ImmediateAttack;
            pawnGroupMakerParms.forceOneIncap        = false;
            pawnGroupMakerParms.seed                 = Rand.Int;

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

            if (pawns == null)
            {
                Debug.Warning(Debug.ForceGen, "Pawns list is null");
            }

            foreach (Pawn p in pawns)
            {
                bool result = CellFinder.TryFindRandomSpawnCellForPawnNear(locationRect.RandomCell, map, out IntVec3 location);

                if (result)
                {
                    GenSpawn.Spawn(p, location, map, Rot4.Random);
                }
            }

            LordJob lordJob = null;

            lordJob = new LordJob_AssaultColony(faction, canKidnap: false, canTimeoutOrFlee: Rand.Chance(0.5f));


            if (lordJob != null)
            {
                LordMaker.MakeNewLord(faction, lordJob, map, pawns);
            }
        }
Пример #18
0
        private bool TryStartParty(string reason, bool wholeDay, Pawn starter, List <Pawn> invitedPawns)
        {
            Map currentMap = Find.CurrentMap;

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

            if (starter == null)
            {
                starter = PartyUtil.FindRandomPartyOrganizer(Faction.OfPlayer, currentMap);
                if (starter == null)
                {
                    Messages.Message("DM.Error.NoStarter".Translate(), MessageTypeDefOf.NegativeEvent);
                    return(false);
                }
            }

            IntVec3 intVec;

            if (!PartyUtil.TryFindPartySpot(starter, out intVec))
            {
                Messages.Message("DM.Error.NoSpot".Translate(), MessageTypeDefOf.NegativeEvent);
                return(false);
            }

            List <Pawn> invited = null;

            if (_privateAnniversaries.Value && invitedPawns.Count > 0)
            {
                invited = invitedPawns;
            }
            LordJob partyJob = wholeDay ? new LongJoinableParty(intVec, invited, starter) : new JoinableParty(intVec, invited, starter);

            LordMaker.MakeNewLord(starter.Faction, partyJob, currentMap);

            Find.LetterStack.ReceiveLetter("DM.Letter.PartyTitle".Translate(), "DM.Letter.Party".Translate(reason), LetterDefOf.PositiveEvent, new TargetInfo(intVec, currentMap));
            return(true);
        }
Пример #19
0
        // Token: 0x060000CA RID: 202 RVA: 0x00007AC0 File Offset: 0x00005CC0
        protected override void Impact(Thing hitThing)
        {
            SoundDef soundExplode = this.def.projectile.soundExplode;
            bool     flag         = soundExplode != null;

            if (flag)
            {
                soundExplode.PlayOneShot(new TargetInfo(base.Position, base.Map, false));
            }
            bool joinSameLordFromProjectile = this.SpawnerProps.joinSameLordFromProjectile;

            if (joinSameLordFromProjectile)
            {
                LordJob lordJob = this.SpawnerProps.CreateJobForLord(base.Position);
                this.lord = LordMaker.MakeNewLord(base.Faction, lordJob, Find.VisibleMap, null);
            }
            for (int i = 0; i < this.SpawnerProps.amount; i++)
            {
                this.DoSpawn(hitThing);
            }
            this.Destroy(DestroyMode.Vanish);
        }
Пример #20
0
        protected override void Impact(Thing hitThing)
        {
            SoundDef soundExplode = def.projectile.soundExplode;

            if (soundExplode != null)
            {
                soundExplode.PlayOneShot(new TargetInfo(base.Position, base.Map, false));
            }

            if (SpawnerProps.joinSameLordFromProjectile)
            {
                LordJob lordJob = SpawnerProps.CreateJobForLord(Position);
                lord = LordMaker.MakeNewLord(Faction, lordJob, Map, null);
            }

            //Spawn on impact point.
            for (int i = 0; i < SpawnerProps.amount; i++)
            {
                DoSpawn(hitThing);
            }

            Destroy(DestroyMode.Vanish);
        }
        public virtual bool TryExecute(Map map, Pawn organizer = null)
        {
            if (organizer == null)
            {
                organizer = FindOrganizer(map);
            }
            if (organizer == null)
            {
                return(false);
            }
            if (!TryFindGatherSpot(organizer, out var spot))
            {
                return(false);
            }
            LordJob lordJob = CreateLordJob(spot, organizer);

            LordMaker.MakeNewLord(organizer.Faction, lordJob, organizer.Map, (!lordJob.OrganizerIsStartingPawn) ? null : new Pawn[1]
            {
                organizer
            });
            SendLetter(spot, organizer);
            return(true);
        }
Пример #22
0
        protected virtual void ReinforcementsArrived()
        {
            if (!CellFinder.TryFindRandomEdgeCellWith((IntVec3 x) => x.Standable(Map) && Map.reachability.CanReachColony(x), Map, CellFinder.EdgeRoadChance_Hostile, out IntVec3 edgeCell))
            {
                return;
            }

            IncidentParms parms = new IncidentParms()
            {
                target  = Map,
                points  = StorytellerUtility.DefaultThreatPointsNow(Find.CurrentMap),
                faction = reinforcementsFrom.Faction
            };
            PawnGroupMakerParms defaultPawnGroupMakerParms = IncidentParmsUtility.GetDefaultPawnGroupMakerParms(PawnGroupKindDefOf.Combat, parms, false);

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

            for (int i = 0; i < enemies.Count; i++)
            {
                IntVec3 loc = CellFinder.RandomSpawnCellForPawnNear(edgeCell, Map, 4);
                GenSpawn.Spawn(enemies[i], loc, Map, Rot4.Random, WipeMode.Vanish, false);
            }

            LordJob lordJob = CreateLordJob(enemies, parms);

            if (lordJob != null)
            {
                LordMaker.MakeNewLord(parms.faction, lordJob, Map, enemies);
            }

            var letter = LetterMaker.MakeLetter("ReinforcementsArrivedLabel".Translate(), "ReinforcementsArrived".Translate(reinforcementsFrom.Label), LetterDefOf.ThreatBig, reinforcementsFrom.Faction);

            Find.LetterStack.ReceiveLetter(letter);
            ticksTillReinforcements = Mathf.RoundToInt(pathToSite.TotalCost * scaleFactor.RandomInRange);
        }
Пример #23
0
        private bool DoExecute(IncidentParms parms, List <Pawn> generatedEnemies, IntVec3 existingMapEdgeCell)
        {
            Map  map  = parms.target as Map;
            bool flag = false;

            if (map == null)
            {
                map  = CaravanIncidentUtility.SetupCaravanAttackMap((Caravan)parms.target, generatedEnemies, sendLetterIfRelatedPawns: false);
                flag = true;
            }
            else
            {
                for (int i = 0; i < generatedEnemies.Count; i++)
                {
                    IntVec3 loc = CellFinder.RandomSpawnCellForPawnNear(existingMapEdgeCell, map);
                    GenSpawn.Spawn(generatedEnemies[i], loc, map, Rot4.Random);
                }
            }
            PostProcessGeneratedPawnsAfterSpawning(generatedEnemies);
            LordJob lordJob = CreateLordJob(generatedEnemies, parms);

            if (lordJob != null)
            {
                LordMaker.MakeNewLord(parms.faction, lordJob, map, generatedEnemies);
            }
            TaggedString letterLabel = GetLetterLabel(generatedEnemies[0], parms);
            TaggedString letterText  = GetLetterText(generatedEnemies[0], parms);

            PawnRelationUtility.Notify_PawnsSeenByPlayer_Letter(generatedEnemies, ref letterLabel, ref letterText, GetRelatedPawnsInfoLetterText(parms), informEvenIfSeenBefore: true);
            SendStandardLetter(letterLabel, letterText, GetLetterDef(generatedEnemies[0], parms), parms, generatedEnemies[0]);
            if (flag)
            {
                Find.TickManager.Notify_GeneratedPotentiallyHostileMap();
            }
            return(true);
        }
Пример #24
0
        private static void FleeTrigger_PostFix(ref LordJob lordJob)
        {
            float randomRetreatvalue = Rand.Range(MeMiMoSettings.retreatDefeatRange.min, MeMiMoSettings.retreatDefeatRange.max);

            if (lordJob.lord.faction != null && lordJob.lord.faction.def.autoFlee && MeMiMoSettings.variableRaidRetreat)
            {
                for (int j = 0; j < lordJob.lord.Graph.transitions.Count; j++)
                {
                    if (lordJob.lord.Graph.transitions[j].target is LordToil_PanicFlee)
                    {
                        for (int i = 0; i < lordJob.lord.Graph.transitions[j].triggers.Count; i++)
                        {
                            if (lordJob.lord.Graph.transitions[j].triggers[i] is Trigger_FractionPawnsLost)
                            {
                                if (MeMiMoSettings.variableRaidRetreat)
                                {
                                    lordJob.lord.Graph.transitions[j].triggers[i] = new Trigger_FractionPawnsLost(randomRetreatvalue);
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #25
0
        protected override void Impact(Thing hitThing)
        {
            Map map = base.Map;

            base.Impact(hitThing);
            ThingDef def = this.def;

            if (!initialized && this.age < this.duration && hitThing != null)
            {
                caster           = this.launcher as Pawn;
                hitPawn          = hitThing as Pawn;
                this.oldPosition = caster.Position;
                MightPowerSkill        pwr         = caster.GetComp <CompAbilityUserMight>().MightData.MightPowerSkill_Possess.FirstOrDefault((MightPowerSkill x) => x.label == "TM_Possess_pwr");
                MightPowerSkill        ver         = caster.GetComp <CompAbilityUserMight>().MightData.MightPowerSkill_Possess.FirstOrDefault((MightPowerSkill x) => x.label == "TM_Possess_ver");
                ModOptions.SettingsRef settingsRef = new ModOptions.SettingsRef();
                pwrVal = pwr.level;
                verVal = ver.level;
                if (settingsRef.AIHardMode && !caster.IsColonist)
                {
                    pwrVal = 3;
                    verVal = 3;
                }
                this.duration += pwrVal * 300;
                if (hitPawn != null && hitPawn.Faction != null && hitPawn.RaceProps.Humanlike)
                {
                    possessedFlag = hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_CoOpPossessionHD) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_CoOpPossessionHD_I) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_CoOpPossessionHD_II) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_CoOpPossessionHD_III) ||
                                    hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_PossessionHD) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_PossessionHD_I) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_PossessionHD_II) || hitPawn.health.hediffSet.HasHediff(TorannMagicDefOf.TM_PossessionHD_III);
                    if (!hitPawn.Downed && !hitPawn.Dead && !possessedFlag && !hitPawn.IsPrisoner)
                    {
                        this.pFaction = hitPawn.Faction;
                        this.prisoner = hitPawn.IsPrisoner;
                        if (!caster.IsColonist && hitPawn.IsColonist)
                        {
                            IEnumerable <WorkTypeDef> allWorkTypes = WorkTypeDefsUtility.WorkTypeDefsInPriorityOrder;
                            this.hitPawnWorkSetting = new List <int>();
                            foreach (var workType in allWorkTypes)
                            {
                                hitPawnWorkSetting.Add(hitPawn.workSettings.GetPriority(workType));
                            }
                        }

                        if (this.pFaction != caster.Faction)
                        {
                            if (Rand.Chance(TM_Calc.GetSpellSuccessChance(caster, hitPawn, true)))
                            {
                                //possess enemy or neutral
                                int weaponCount = 0;
                                if (hitPawn.equipment.PrimaryEq != null)
                                {
                                    weaponCount = 1;
                                }
                                this.inventoryCount = hitPawn.inventory.innerContainer.Count + hitPawn.apparel.WornApparelCount + weaponCount;
                                if (ModCheck.Validate.GiddyUp.Core_IsInitialized())
                                {
                                    ModCheck.GiddyUp.ForceDismount(caster);
                                    ModCheck.GiddyUp.ForceDismount(hitPawn);
                                }
                                hitPawn.SetFaction(caster.Faction, null);
                                HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_DisguiseHD_II, 20f + (5f * pwrVal));
                                switch (verVal)
                                {
                                case 0:
                                    HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_PossessionHD, 20f + (5f * pwrVal));
                                    break;

                                case 1:
                                    HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_PossessionHD_I, 20f + (5f * pwrVal));
                                    break;

                                case 2:
                                    HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_PossessionHD_II, 20f + (5f * pwrVal));
                                    break;

                                case 3:
                                    HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_PossessionHD_III, 20f + (5f * pwrVal));
                                    break;
                                }
                                initialized = true;
                                MoteMaker.ThrowSmoke(caster.DrawPos, caster.Map, 1f);
                                MoteMaker.ThrowSmoke(caster.DrawPos, caster.Map, 1.2f);
                                MoteMaker.ThrowHeatGlow(caster.Position, caster.Map, .8f);
                                if (!caster.IsColonist)
                                {
                                    Lord    lord    = caster.GetLord();
                                    LordJob lordJob = caster.GetLord().LordJob;
                                    try
                                    {
                                        PawnDuty duty = caster.mindState.duty;
                                        hitPawn.mindState.duty = duty;
                                        lord.AddPawn(hitPawn);
                                    }
                                    catch
                                    {
                                        Log.Message("error attempting to assign a duty to pawn during possession");
                                    }
                                }
                                //loadPawn = caster;
                                //loadPawn.ThingID += Rand.Range(0, 214).ToString();
                                if (caster.IsColonist)
                                {
                                    //
                                    ModOptions.Constants.SetPawnInFlight(true);
                                    //
                                }
                                if (hitPawn.IsColonist && !caster.IsColonist)
                                {
                                    TM_Action.SpellAffectedPlayerWarning(hitPawn);
                                }
                                caster.DeSpawn();
                            }
                            else
                            {
                                MoteMaker.ThrowText(hitThing.DrawPos, hitThing.Map, "TM_ResistedSpell".Translate(), -1);
                                this.age = this.duration;
                                this.Destroy(DestroyMode.Vanish);
                            }
                        }
                        else
                        {
                            //possess friendly
                            if (ModCheck.Validate.GiddyUp.Core_IsInitialized())
                            {
                                ModCheck.GiddyUp.ForceDismount(caster);
                            }
                            HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_DisguiseHD_II, 20f + (5f * pwrVal));
                            switch (verVal)
                            {
                            case 0:
                                HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_CoOpPossessionHD, 20f + (5f * pwrVal));
                                break;

                            case 1:
                                HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_CoOpPossessionHD_I, 20f + (5f * pwrVal));
                                break;

                            case 2:
                                HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_CoOpPossessionHD_II, 20f + (5f * pwrVal));
                                break;

                            case 3:
                                HealthUtility.AdjustSeverity(hitPawn, TorannMagicDefOf.TM_CoOpPossessionHD_III, 20f + (5f * pwrVal));
                                break;
                            }
                            initialized = true;
                            MoteMaker.ThrowSmoke(caster.DrawPos, caster.Map, 1f);
                            MoteMaker.ThrowSmoke(caster.DrawPos, caster.Map, 1.2f);
                            MoteMaker.ThrowHeatGlow(caster.Position, caster.Map, .8f);
                            caster.DeSpawn();
                        }
                    }
                    else
                    {
                        Messages.Message("TM_CannotPossessNow".Translate(
                                             caster.LabelShort,
                                             hitPawn.LabelShort
                                             ), MessageTypeDefOf.RejectInput);
                        this.age = this.duration;
                        this.Destroy(DestroyMode.Vanish);
                    }
                }
                else
                {
                    Messages.Message("TM_CannotPossess".Translate(
                                         caster.LabelShort,
                                         hitThing.LabelShort
                                         ), MessageTypeDefOf.RejectInput);
                    this.age = this.duration;
                    this.Destroy(DestroyMode.Vanish);
                }
            }
            else
            {
                if (!this.initialized)
                {
                    this.age = this.duration;
                    Destroy(DestroyMode.Vanish);
                }
            }

            if (hitPawn != null && (hitPawn.Downed || hitPawn.Dead))
            {
                this.age = this.duration;
            }
        }
Пример #26
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);
            }
        }
            public static bool Prefix(IncidentParms parms, Map map, List <Pawn> pawns, int raidSeed, ref LordJob __result)
            {
                // Conditionally detour the method
                var faction             = parms.faction;
                var factionDefExtension = FactionDefExtension.Get(faction.def);

                if (factionDefExtension.siegeParameterSetDef != null)
                {
                    var   entrySpot       = (!parms.spawnCenter.IsValid) ? pawns[0].PositionHeld : parms.spawnCenter;
                    var   siegeSpot       = RCellFinder.FindSiegePositionFrom(entrySpot, map);
                    float blueprintPoints = Mathf.Max(parms.points * Rand.Range(0.2f, 0.3f), factionDefExtension.siegeParameterSetDef.lowestArtilleryBlueprintPoints);
                    __result = new LordJob_SiegeCustom(faction, siegeSpot, blueprintPoints);
                    return(false);
                }

                return(true);
            }
Пример #28
0
        public void XenoLordTick()
        {
            if (map != null)
            {
                IntVec3            c             = IntVec3.Invalid;
                Lord               lord          = null;
                List <Lord>        Hivelords     = new List <Lord>();
                Lord               Hivelord      = null;
                LordJob            Hivejob       = null;
                Pawn               Hivequeen     = null;
                IEnumerable <Lord> lords         = pawn.Map.lordManager.lords.Where(x => x.faction == pawn.Faction);
                bool               isDefendPoint = pawn.GetLord() != null?pawn.GetLord().LordJob is LordJob_DefendPoint : false;

                bool isAssaultColony = pawn.GetLord() != null?pawn.GetLord().LordJob is LordJob_AssaultColony : false;

                bool hostsPresent    = map.mapPawns.AllPawnsSpawned.Any(x => x.isPotentialHost() && !x.isCocooned() && IsAcceptablePreyFor(pawn, x, true));
                bool LordReplaceable = (isDefendPoint || (isAssaultColony && !hostsPresent));
                //   Log.Message(string.Format("LordReplaceable: {0}, isDefendPoint: {1}, isAssaultColony: {2}, hostsPresent: {3}", LordReplaceable, isDefendPoint, isAssaultColony, !hostsPresent));
                if (lords.Count() != 0 && ((pawn.GetLord() != null && LordReplaceable) || pawn.GetLord() == null))
                {
                    foreach (var l in lords)
                    {
                        if (l != null)
                        {
                            if (XenomorphUtil.HivelikesPresent(map))
                            {
                                if (l.LordJob is LordJob_DefendAndExpandHiveLike j)
                                {
                                    Hivelord = l;
                                    Hivejob  = j;
                                    if (l.ownedPawns.Any(x => x.kindDef == QueenDef))
                                    {
                                        Hivequeen = l.ownedPawns.Find(x => x.kindDef == QueenDef);
                                    }
                                    if (pawn.kindDef != XenomorphDefOf.RRY_Xenomorph_Queen || (pawn.kindDef == XenomorphDefOf.RRY_Xenomorph_Queen && Hivequeen != null))
                                    {
                                        Hivelords.Add(l);
                                    }
                                }
                            }
                            else if (XenomorphUtil.HiveSlimePresent(map))
                            {
                                if (l.LordJob is LordJob_DefendHiveLoc j)
                                {
                                    Hivelord = l;
                                    Hivejob  = j;
                                    if (l.ownedPawns.Any(x => x.kindDef == QueenDef))
                                    {
                                        Hivequeen = l.ownedPawns.Find(x => x.kindDef == QueenDef);
                                    }
                                    if (pawn.kindDef != XenomorphDefOf.RRY_Xenomorph_Queen || (pawn.kindDef == XenomorphDefOf.RRY_Xenomorph_Queen && Hivequeen != null))
                                    {
                                        Hivelords.Add(l);
                                    }
                                }
                            }
                        }
                        else
                        {
                            /*
                             * lord = l;
                             * lord.AddPawn(pawn);
                             * pawn.mindState.duty = lord.ownedPawns.FindAll(x => x.mindState.duty != null && x != pawn).RandomElement().mindState.duty;
                             * break;
                             */
                        }
                    }
                }
                if (pawn.GetLord() != null && LordReplaceable)
                {
                    lord = pawn.GetLord();
                    if (lord.ownedPawns.Count == 0)
                    {
                        Log.Message(string.Format("got no pawns, wtf?"));
                    }
                    if (lord.ownedPawns.Count == 1)
                    {
                    }
                    if (c == IntVec3.Invalid && XenomorphUtil.HivelikesPresent(map))
                    {
                        c = !XenomorphUtil.ClosestReachableHivelike(pawn).DestroyedOrNull() ? XenomorphUtil.ClosestReachableHivelike(pawn).Position : IntVec3.Invalid;
                    }
                    if (c == IntVec3.Invalid && XenomorphUtil.EggsPresent(map))
                    {
                        c = !XenomorphUtil.ClosestReachableEgg(pawn).DestroyedOrNull() ? XenomorphUtil.ClosestReachableEgg(pawn).Position : IntVec3.Invalid;
                    }
                    if (c == IntVec3.Invalid && XenomorphUtil.CocoonsPresent(map, XenomorphDefOf.RRY_Xenomorph_Humanoid_Cocoon))
                    {
                        c = !XenomorphUtil.ClosestReachableCocoon(pawn, XenomorphDefOf.RRY_Xenomorph_Humanoid_Cocoon).DestroyedOrNull() ? XenomorphUtil.ClosestReachableCocoon(pawn, XenomorphDefOf.RRY_Xenomorph_Humanoid_Cocoon).Position : IntVec3.Invalid;
                    }
                    if (c == IntVec3.Invalid && XenomorphUtil.CocoonsPresent(map, XenomorphDefOf.RRY_Xenomorph_Animal_Cocoon))
                    {
                        c = !XenomorphUtil.ClosestReachableCocoon(pawn, XenomorphDefOf.RRY_Xenomorph_Animal_Cocoon).DestroyedOrNull() ? XenomorphUtil.ClosestReachableCocoon(pawn, XenomorphDefOf.RRY_Xenomorph_Animal_Cocoon).Position : IntVec3.Invalid;
                    }
                    if (c == IntVec3.Invalid)
                    {
                        if (InfestationLikeCellFinder.TryFindCell(out c, pawn.Map, false))
                        {
                            if (Prefs.DevMode)
                            {
                                ThingDef td = XenomorphDefOf.RRY_Filth_Slime;
                                GenSpawn.Spawn(td, c, pawn.Map);
                                Find.LetterStack.ReceiveLetter(string.Format("Lord Created"), string.Format("@: {0} ", c), LetterDefOf.NegativeEvent, c.GetFirstThing(pawn.Map, td), null, null);
                            }
                        }
                        if (pawn.CanReach(c, PathEndMode.OnCell, Danger.Deadly, true))
                        {
                            c = RCellFinder.RandomWanderDestFor(pawn, c, 3f, null, Danger.Some);
                        }
                        else
                        {
                            c = RCellFinder.RandomWanderDestFor(pawn, pawn.Position, 3f, null, Danger.Some);
                        }
                    }
                    if (c != IntVec3.Invalid)
                    {
                        LordJob newJob;
                        if (XenomorphUtil.HivelikesPresent(map))
                        {
                            newJob = new LordJob_DefendAndExpandHiveLike(false);
                        }
                        else
                        {
                            newJob = new LordJob_DefendHiveLoc(parent.Faction, c);
                        }
                        if (LordReplaceable)
                        {
                            if (!Hivelords.NullOrEmpty())
                            {
                                Hivelord = Hivelords.RandomElement();
                                SwitchToLord(Hivelord);
                                CreateNewLord(pawn, c, newJob);
                            }
                            else
                            {
                                CreateNewLord(pawn, c, newJob);
                            }
                            if (HiveLoc == IntVec3.Invalid)
                            {
                                HiveLoc = c;
                            }
                        }
                    }
                }
                else if (c == IntVec3.Invalid && (pawn.GetLord() != null && pawn.GetLord().LordJob is LordJob LordJob))
                {
                    lord = pawn.GetLord();
                    c    = LordJob.lord.Graph.StartingToil.FlagLoc;
                    if (c == IntVec3.Invalid)
                    {
                        c = LordJob.lord.CurLordToil.FlagLoc;
                    }
                }
                else if (pawn.GetLord() == null)
                {
                    if (!Hivelords.NullOrEmpty())
                    {
                        Hivelord = Hivelords.RandomElement();
                        SwitchToLord(Hivelord);
                    }
                }
                if (pawn.GetLord() != null)
                {
                    List <Pawn> list = pawn.GetLord().ownedPawns.Where(x => x.mindState.duty != null).ToList();
                    if (pawn.GetLord() != null && pawn.mindState.duty == null && !list.NullOrEmpty())
                    {
                        pawn.mindState.duty = list.RandomElement().mindState.duty;
                    }
                }
            }
        }
Пример #29
0
 public static bool HasRightLordJob(LordJob lordJob)
 {
     return(lordJob is LordJob_VoluntarilyJoinable || lordJob is LordJob_SearchAndDestroy || lordJob is LordJob_ControlMechanoid);
 }