public static Building_Bed FindPatientBedFor(Pawn pawn) { Predicate <Thing> medBedValidator = delegate(Thing t) { Building_Bed building_Bed2 = t as Building_Bed; if (building_Bed2 == null) { return(false); } if (!building_Bed2.Medical && building_Bed2.def.building.bed_humanlike) { return(false); } if (!RestUtility.IsValidBedFor(building_Bed2, pawn, pawn, pawn.IsPrisoner, false, true, false)) { return(false); } return(true); }; if (pawn.InBed() && medBedValidator(pawn.CurrentBed())) { return(pawn.CurrentBed()); } for (int i = 0; i < 2; i++) { Danger maxDanger = (Danger)((i == 0) ? 1 : 3); Building_Bed building_Bed = (Building_Bed)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.BuildingArtificial), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, (Thing b) => (int)b.Position.GetDangerFor(pawn, pawn.Map) <= (int)maxDanger && medBedValidator(b), null, 0, -1, false, RegionType.Set_Passable, false); if (building_Bed != null) { return(building_Bed); } } return(RestUtility.FindBedFor(pawn)); }
public static Building_Bed FindBedFor(Pawn sleeper, Pawn traveler, bool sleeperWillBePrisoner, bool checkSocialProperness, bool ignoreOtherReservations = false) { if (HealthAIUtility.ShouldSeekMedicalRest(sleeper)) { if (sleeper.InBed() && sleeper.CurrentBed().Medical) { Building_Bed bedThing = sleeper.CurrentBed(); Pawn pawn = sleeper; Pawn pawn2 = traveler; bool flag = sleeperWillBePrisoner; bool checkSocialProperness2 = checkSocialProperness; bool flag2 = ignoreOtherReservations; if (RestUtility.IsValidBedFor(bedThing, pawn, pawn2, flag, checkSocialProperness2, false, flag2)) { return(sleeper.CurrentBed()); } } for (int i = 0; i < RestUtility.bedDefsBestToWorst_Medical.Count; i++) { ThingDef thingDef = RestUtility.bedDefsBestToWorst_Medical[i]; if (RestUtility.CanUseBedEver(sleeper, thingDef)) { for (int j = 0; j < 2; j++) { Danger maxDanger = (j != 0) ? Danger.Deadly : Danger.None; Building_Bed building_Bed = (Building_Bed)GenClosest.ClosestThingReachable(sleeper.Position, sleeper.Map, ThingRequest.ForDef(thingDef), PathEndMode.OnCell, TraverseParms.For(traveler, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, delegate(Thing b) { bool arg_92_0; if (((Building_Bed)b).Medical && b.Position.GetDangerFor(sleeper, sleeper.Map) <= maxDanger) { Pawn sleeper2 = sleeper; Pawn traveler2 = traveler; bool sleeperWillBePrisoner2 = sleeperWillBePrisoner; bool checkSocialProperness3 = checkSocialProperness; bool ignoreOtherReservations2 = ignoreOtherReservations; arg_92_0 = RestUtility.IsValidBedFor(b, sleeper2, traveler2, sleeperWillBePrisoner2, checkSocialProperness3, false, ignoreOtherReservations2); } else { arg_92_0 = false; } return(arg_92_0); }, null, 0, -1, false, RegionType.Set_Passable, false); if (building_Bed != null) { return(building_Bed); } } } } } if (sleeper.ownership != null && sleeper.ownership.OwnedBed != null) { Building_Bed bedThing = sleeper.ownership.OwnedBed; Pawn pawn2 = sleeper; Pawn pawn = traveler; bool flag2 = sleeperWillBePrisoner; bool checkSocialProperness2 = checkSocialProperness; bool flag = ignoreOtherReservations; if (RestUtility.IsValidBedFor(bedThing, pawn2, pawn, flag2, checkSocialProperness2, false, flag)) { return(sleeper.ownership.OwnedBed); } } DirectPawnRelation directPawnRelation = LovePartnerRelationUtility.ExistingMostLikedLovePartnerRel(sleeper, false); if (directPawnRelation != null) { Building_Bed ownedBed = directPawnRelation.otherPawn.ownership.OwnedBed; if (ownedBed != null) { Building_Bed bedThing = ownedBed; Pawn pawn = sleeper; Pawn pawn2 = traveler; bool flag = sleeperWillBePrisoner; bool checkSocialProperness2 = checkSocialProperness; bool flag2 = ignoreOtherReservations; if (RestUtility.IsValidBedFor(bedThing, pawn, pawn2, flag, checkSocialProperness2, false, flag2)) { return(ownedBed); } } } for (int k = 0; k < 2; k++) { Danger maxDanger = (k != 0) ? Danger.Deadly : Danger.None; for (int l = 0; l < RestUtility.bedDefsBestToWorst_RestEffectiveness.Count; l++) { ThingDef thingDef2 = RestUtility.bedDefsBestToWorst_RestEffectiveness[l]; if (RestUtility.CanUseBedEver(sleeper, thingDef2)) { Building_Bed building_Bed2 = (Building_Bed)GenClosest.ClosestThingReachable(sleeper.Position, sleeper.Map, ThingRequest.ForDef(thingDef2), PathEndMode.OnCell, TraverseParms.For(traveler, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, delegate(Thing b) { bool arg_92_0; if (!((Building_Bed)b).Medical && b.Position.GetDangerFor(sleeper, sleeper.Map) <= maxDanger) { Pawn sleeper2 = sleeper; Pawn traveler2 = traveler; bool sleeperWillBePrisoner2 = sleeperWillBePrisoner; bool checkSocialProperness3 = checkSocialProperness; bool ignoreOtherReservations2 = ignoreOtherReservations; arg_92_0 = RestUtility.IsValidBedFor(b, sleeper2, traveler2, sleeperWillBePrisoner2, checkSocialProperness3, false, ignoreOtherReservations2); } else { arg_92_0 = false; } return(arg_92_0); }, null, 0, -1, false, RegionType.Set_Passable, false); if (building_Bed2 != null) { return(building_Bed2); } } } } return(null); }