Пример #1
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (pawn.mindState.nextMoveOrderIsWait)
            {
                Job job = JobMaker.MakeJob(JobDefOf.Wait_Wander);
                job.expiryInterval = waitTicks.RandomInRange;
                pawn.mindState.nextMoveOrderIsWait = false;
                return(job);
            }
            if (Rand.Value < 0.75f)
            {
                Thing thing = TryFindRandomIgniteTarget(pawn);
                if (thing != null)
                {
                    pawn.mindState.nextMoveOrderIsWait = true;
                    return(JobMaker.MakeJob(JobDefOf.Ignite, thing));
                }
            }
            IntVec3 c = RCellFinder.RandomWanderDestFor(pawn, pawn.Position, 10f, null, Danger.Deadly);

            if (c.IsValid)
            {
                pawn.mindState.nextMoveOrderIsWait = true;
                return(JobMaker.MakeJob(JobDefOf.GotoWander, c));
            }
            return(null);
        }
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (pawn.mindState.nextMoveOrderIsWait)
            {
                Job job = new Job(JobDefOf.WaitWander);
                job.expiryInterval = this.waitTicks.RandomInRange;
                pawn.mindState.nextMoveOrderIsWait = false;
                return(job);
            }
            if (Rand.Value < 0.75f)
            {
                Thing thing = this.TryFindRandomIgniteTarget(pawn);
                if (thing != null)
                {
                    pawn.mindState.nextMoveOrderIsWait = true;
                    return(new Job(JobDefOf.Ignite, thing));
                }
            }
            IntVec3 intVec = RCellFinder.RandomWanderDestFor(pawn, pawn.Position, 10f, null, Danger.Deadly);

            if (intVec.IsValid)
            {
                pawn.mindState.nextMoveOrderIsWait = true;
                Job job2 = new Job(JobDefOf.GotoWander, intVec);
                pawn.Map.pawnDestinationReservationManager.Reserve(pawn, job2, intVec);
                return(job2);
            }
            return(null);
        }
Пример #3
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            CompEggLayer compEggLayer = pawn.TryGetComp <CompEggLayer>();

            if (compEggLayer != null && compEggLayer.CanLayNow)
            {
                IntVec3 c = RCellFinder.RandomWanderDestFor(pawn, pawn.Position, 5f, null, Danger.Some);
                return(new Job(JobDefOf.LayEgg, c));
            }
            return(null);
        }
        protected override Job TryGiveJob(Pawn pawn)
        {
            CompEggLayer compEggLayer = pawn.TryGetComp <CompEggLayer>();
            Job          result;

            if (compEggLayer == null || !compEggLayer.CanLayNow)
            {
                result = null;
            }
            else
            {
                IntVec3 c = RCellFinder.RandomWanderDestFor(pawn, pawn.Position, 5f, null, Danger.Some);
                result = new Job(JobDefOf.LayEgg, c);
            }
            return(result);
        }
Пример #5
0
        // Token: 0x06000424 RID: 1060 RVA: 0x0002CE84 File Offset: 0x0002B284
        protected override Job TryGiveJob(Pawn pawn)
        {
            CompXenoEggLayer compEggLayer = pawn.TryGetComp <CompXenoEggLayer>();

            if (compEggLayer == null || !compEggLayer.CanLayNow)
            {
                return(null);
            }
            IntVec3 c;

            if (pawn.GetLord() != null && pawn.GetLord().LordJob is LordJob_DefendBase lordjob)
            {
                c = lordjob.lord.Graph.StartingToil.FlagLoc;
                c = RCellFinder.RandomWanderDestFor(pawn, c, 5f, null, Danger.Some);
            }
            else
            {
                Thing thing = GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForDef(XenomorphDefOf.RRY_EggXenomorphFertilized), PathEndMode.OnCell, TraverseParms.For(TraverseMode.NoPassClosedDoors, Danger.Deadly, false), 9999f, null, null, 0, -1, false, RegionType.Set_Passable, false);
                if (thing == null)
                {
                    c = RCellFinder.RandomWanderDestFor(pawn, pawn.Position, 5f, null, Danger.Some);
                }
                else
                {
                    InfestationCellFinder.TryFindCell(out c, pawn.Map);
                    if (pawn.CanReach(c, PathEndMode.OnCell, Danger.Deadly))
                    {
                        c = RCellFinder.RandomWanderDestFor(pawn, c, 3f, null, Danger.Some);
                    }
                    else
                    {
                        c = RCellFinder.RandomWanderDestFor(pawn, thing.Position, 3f, null, Danger.Some);
                    }
                }
            }
            return(new Job(XenomorphDefOf.RRY_Job_LayXenomorphEgg, c));
        }
        public static IEnumerable <LocalTargetInfo> AllMeditationSpotCandidates(Pawn pawn, bool allowFallbackSpots = true)
        {
            bool flag = false;

            if (pawn.royalty != null && pawn.royalty.AllTitlesInEffectForReading.Count > 0 && !pawn.IsPrisonerOfColony)
            {
                Building_Throne building_Throne = RoyalTitleUtility.FindBestUsableThrone(pawn);
                if (building_Throne != null)
                {
                    yield return(building_Throne);

                    flag = true;
                }
            }
            if (!pawn.IsPrisonerOfColony)
            {
                foreach (Building item in pawn.Map.listerBuildings.AllBuildingsColonistOfDef(ThingDefOf.MeditationSpot).Where(delegate(Building s)
                {
                    if (s.IsForbidden(pawn) || !s.Position.Standable(s.Map))
                    {
                        return(false);
                    }
                    if (s.GetAssignedPawn() != null && s.GetAssignedPawn() != pawn)
                    {
                        return(false);
                    }
                    Room room4 = s.GetRoom();
                    return((room4 == null || CanUseRoomToMeditate(room4, pawn)) && pawn.CanReserveAndReach(s, PathEndMode.OnCell, pawn.NormalMaxDanger()));
                }))
                {
                    yield return(item);

                    flag = true;
                }
            }
            if (flag || !allowFallbackSpots)
            {
                yield break;
            }
            List <Thing> list = pawn.Map.listerThings.ThingsInGroup(ThingRequestGroup.MeditationFocus);

            foreach (Thing item2 in list)
            {
                if (item2.def == ThingDefOf.Wall)
                {
                    continue;
                }
                Room room = item2.GetRoom();
                if ((room == null || CanUseRoomToMeditate(room, pawn)) && item2.GetStatValueForPawn(StatDefOf.MeditationFocusStrength, pawn) > 0f)
                {
                    LocalTargetInfo localTargetInfo = MeditationSpotForFocus(item2, pawn);
                    if (localTargetInfo.IsValid)
                    {
                        yield return(localTargetInfo);
                    }
                }
            }
            Building_Bed bed   = pawn.ownership.OwnedBed;
            Room         room2 = bed?.GetRoom();
            IntVec3      c2;

            if (room2 != null && !room2.PsychologicallyOutdoors && pawn.CanReserveAndReach(bed, PathEndMode.OnCell, pawn.NormalMaxDanger()))
            {
                foreach (LocalTargetInfo item3 in FocusSpotsInTheRoom(pawn, room2))
                {
                    yield return(item3);
                }
                c2 = RCellFinder.RandomWanderDestFor(pawn, bed.Position, WanderRadius, (Pawn p, IntVec3 c, IntVec3 r) => c.Standable(p.Map) && c.GetDoor(p.Map) == null && WanderRoomUtility.IsValidWanderDest(p, c, r), pawn.NormalMaxDanger());
                if (c2.IsValid)
                {
                    yield return(c2);
                }
            }
            if (pawn.IsPrisonerOfColony)
            {
                yield break;
            }
            IntVec3 colonyWanderRoot = WanderUtility.GetColonyWanderRoot(pawn);

            c2 = RCellFinder.RandomWanderDestFor(pawn, colonyWanderRoot, WanderRadius, delegate(Pawn p, IntVec3 c, IntVec3 r)
            {
                if (!c.Standable(p.Map) || c.GetDoor(p.Map) != null || !p.CanReserveAndReach(c, PathEndMode.OnCell, p.NormalMaxDanger()))
                {
                    return(false);
                }
                Room room3 = c.GetRoom(p.Map);
                return((room3 == null || CanUseRoomToMeditate(room3, pawn)) ? true : false);
            }, pawn.NormalMaxDanger());
            if (c2.IsValid)
            {
                yield return(c2);
            }
        }