public static bool IsAcceptablePreyFor(Pawn predator, Pawn prey)
        {
            if (predator.jobs.debugLog)
            {
                predator.jobs.DebugLogEvent(string.Format("{0} hunting {1}? XenoInfection:{2} IsXenos:{3}", predator.Label, prey.Label, XenomorphUtil.IsInfectedPawn(prey), XenomorphUtil.IsXenomorph(prey)));
            }
            if (XenomorphUtil.IsInfectedPawn(prey))
            {
                if (predator.jobs.debugLog)
                {
                    predator.jobs.DebugLogEvent(string.Format("{0} cant hunt {1} cause XenoInfection:{2}", predator.Label, prey.Label, XenomorphUtil.IsInfectedPawn(prey)));
                }
                return(false);
            }
            if (XenomorphUtil.IsXenomorph(prey))
            {
                if (predator.jobs.debugLog)
                {
                    predator.jobs.DebugLogEvent(string.Format("{0} cant hunt {1} cause IsXenos:{2}", predator.Label, prey.Label, XenomorphUtil.IsXenomorph(prey)));
                }
                return(false);
            }
            if (!prey.RaceProps.IsFlesh)
            {
                return(false);
            }
            if (prey.BodySize > predator.RaceProps.maxPreyBodySize)
            {
                return(false);
            }
            if (prey.BodySize < 0.65f)
            {
                return(false);
            }

            /*
             * if (!prey.Downed)
             * {
             *  if (prey.kindDef.combatPower > 2f * predator.kindDef.combatPower)
             *  {
             *      return false;
             *  }
             *  float num = prey.kindDef.combatPower * prey.health.summaryHealth.SummaryHealthPercent * prey.ageTracker.CurLifeStage.bodySizeFactor;
             *  float num2 = predator.kindDef.combatPower * predator.health.summaryHealth.SummaryHealthPercent * predator.ageTracker.CurLifeStage.bodySizeFactor;
             *  if (num >= num2)
             *  {
             *      return false;
             *  }
             * }
             */
            if (predator.jobs.debugLog)
            {
                predator.jobs.DebugLogEvent(string.Format("{0}@{1} can hunt {2}@{3}", predator.Label, predator.Position, prey.Label, prey.Position));
            }
            return((predator.Faction == null || prey.Faction == null || predator.HostileTo(prey)) && (predator.Faction == null || prey.HostFaction == null || predator.HostileTo(prey)) && (predator.Faction != Faction.OfPlayer || prey.Faction != Faction.OfPlayer) && (!predator.RaceProps.herdAnimal || predator.def != prey.def) && (!prey.health.hediffSet.HasHediff(XenomorphDefOf.RRY_FaceHuggerInfection) && !prey.health.hediffSet.HasHediff(XenomorphDefOf.RRY_HiddenXenomorphImpregnation) && !prey.health.hediffSet.HasHediff(XenomorphDefOf.RRY_XenomorphImpregnation)));
        }
Beispiel #2
0
        // Token: 0x060009B3 RID: 2483 RVA: 0x0004DFD8 File Offset: 0x0004C3D8
        protected override bool Satisfied(Pawn pawn)
        {
            bool result;

            if (pawn.Spawned && XenomorphUtil.IsXenomorph(pawn))
            {
                result = pawn.Map.mapPawns.AllPawns.Any((Pawn x) => x.Downed && XenomorphUtil.isInfectablePawn(x));
            }
            else
            {
                result = false;
            }
            return(result);
        }
        // Token: 0x060009B3 RID: 2483 RVA: 0x0004DFD8 File Offset: 0x0004C3D8
        protected override bool Satisfied(Pawn pawn)
        {
            bool result;

            if (pawn.Spawned && XenomorphUtil.IsXenomorph(pawn))
            {
                List <Pawn> list = pawn.Map.mapPawns.AllPawns.Where((Pawn x) => x.RaceProps.FleshType != XenomorphRacesDefOf.RRY_Xenomorph && x.RaceProps.FleshType != XenomorphRacesDefOf.RRY_Neomorph && !x.health.hediffSet.HasHediff(XenomorphDefOf.RRY_Hediff_Cocooned) && x.Downed && XenomorphUtil.isInfectablePawn(x) && pawn.CanReach(x, PathEndMode.InteractionCell, Danger.Deadly, false, TraverseMode.NoPassClosedDoors)).ToList();
                result = !list.NullOrEmpty() ? list.Any <Pawn>(x => x.Spawned) : false;
            }
            else
            {
                result = false;
            }
            if (Find.Selector.SelectedObjects.Contains(pawn))
            {
                Log.Message(string.Format("{0} Result: {1}", this, result));
            }
            return(result);
        }
Beispiel #4
0
        // Token: 0x060009B3 RID: 2483 RVA: 0x0004DFD8 File Offset: 0x0004C3D8
        protected override bool Satisfied(Pawn pawn)
        {
            bool result;

            if (pawn.Spawned && XenomorphUtil.IsXenomorph(pawn) && pawn.Map.mapPawns.AllPawns.Any((Pawn x) => x.Downed && x.isPotentialHost() && pawn.CanReach(x, PathEndMode.InteractionCell, Danger.Deadly, false, TraverseMode.NoPassClosedDoors)))
            {
                List <Pawn> list = pawn.Map.mapPawns.AllPawns.Where((Pawn x) => x.Downed && x.isPotentialHost() && pawn.CanReach(x, PathEndMode.InteractionCell, Danger.Deadly, false, TraverseMode.NoPassClosedDoors)).ToList();
                result = !list.NullOrEmpty() ? list.Any <Pawn>(x => x.Spawned) : false;
            }
            else
            {
                result = false;
            }
            if (pawn.jobs.debugLog)
            {
                pawn.jobs.DebugLogEvent(string.Format("{0} Result: {1}", this, result));
            }
            return(result);
        }
        // RimWorld.FoodUtility
        private static Pawn BestPawnToHuntForPredator(Pawn predator, bool forceScanWholeMap)
        {
            if (predator.meleeVerbs.TryGetMeleeVerb(null) == null)
            {
                return(null);
            }
            bool  flag = false;
            float summaryHealthPercent = predator.health.summaryHealth.SummaryHealthPercent;

            if (summaryHealthPercent < 0.25f)
            {
                flag = true;
            }
            tmpPredatorCandidates.Clear();
            int maxRegionsToScan = GetMaxRegionsToScan(predator, forceScanWholeMap);

            if (maxRegionsToScan < 0)
            {
                tmpPredatorCandidates.AddRange(predator.Map.mapPawns.AllPawnsSpawned);
            }
            else
            {
                TraverseParms traverseParms = TraverseParms.For(predator, Danger.Deadly, TraverseMode.ByPawn, false);
                RegionTraverser.BreadthFirstTraverse(predator.Position, predator.Map, (Region from, Region to) => to.Allows(traverseParms, true), delegate(Region x)
                {
                    List <Thing> list = x.ListerThings.ThingsInGroup(ThingRequestGroup.Pawn);
                    for (int j = 0; j < list.Count; j++)
                    {
                        Pawn p = ((Pawn)list[j]);
                        if (p.isPotentialHost())
                        {
                            tmpPredatorCandidates.Add(p);
                        }
                        else
                        {
                            if (predator.jobs.debugLog)
                            {
                                predator.jobs.DebugLogEvent(string.Format("{0} cannae hunt {2} XenoInfection:{1} IsXenos:{3}", predator.Label, XenomorphUtil.IsInfectedPawn(p), ((Pawn)list[j]).Label, XenomorphUtil.IsXenomorph(p)));
                            }
                        }
                    }
                    return(false);
                }, 999999, RegionType.Set_Passable);
            }
            Pawn  pawn         = null;
            float num          = 0f;
            bool  tutorialMode = TutorSystem.TutorialMode;

            for (int i = 0; i < tmpPredatorCandidates.Count; i++)
            {
                Pawn pawn2 = tmpPredatorCandidates[i];
                if (predator.GetRoom(RegionType.Set_Passable) == pawn2.GetRoom(RegionType.Set_Passable))
                {
                    if (predator != pawn2)
                    {
                        if (!flag || pawn2.Downed)
                        {
                            if (IsAcceptablePreyFor(predator, pawn2))
                            {
                                if (predator.CanReach(pawn2, PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn))
                                {
                                    if (!pawn2.IsForbidden(predator))
                                    {
                                        if (!tutorialMode || pawn2.Faction != Faction.OfPlayer)
                                        {
                                            float preyScoreFor = FoodUtility.GetPreyScoreFor(predator, pawn2);
                                            if (preyScoreFor > num || pawn == null)
                                            {
                                                num  = preyScoreFor;
                                                pawn = pawn2;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            tmpPredatorCandidates.Clear();
            return(pawn);
        }