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))); }
// 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); }
// 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); }