private void ChooseNextTarget() { InsultingSpreeMentalStateUtility.GetInsultCandidatesFor(this.pawn, MentalState_InsultingSpreeAll.candidates, true); if (!MentalState_InsultingSpreeAll.candidates.Any <Pawn>()) { this.target = null; this.insultedTargetAtLeastOnce = false; this.targetFoundTicks = -1; } else { Pawn pawn; if (this.target != null && Find.TickManager.TicksGame - this.targetFoundTicks > 1250 && MentalState_InsultingSpreeAll.candidates.Any((Pawn x) => x != this.target)) { pawn = (from x in MentalState_InsultingSpreeAll.candidates where x != this.target select x).RandomElementByWeight((Pawn x) => this.GetCandidateWeight(x)); } else { pawn = MentalState_InsultingSpreeAll.candidates.RandomElementByWeight((Pawn x) => this.GetCandidateWeight(x)); } if (pawn != this.target) { this.target = pawn; this.insultedTargetAtLeastOnce = false; this.targetFoundTicks = Find.TickManager.TicksGame; } } }
public static void GetInsultCandidatesFor(Pawn bully, List <Pawn> outCandidates, bool allowPrisoners = true) { outCandidates.Clear(); Region region = bully.GetRegion(RegionType.Set_Passable); if (region == null) { return; } TraverseParms traverseParams = TraverseParms.For(bully, Danger.Deadly, TraverseMode.ByPawn, false); RegionTraverser.BreadthFirstTraverse(region, (Region from, Region to) => to.Allows(traverseParams, false), delegate(Region r) { List <Thing> list = r.ListerThings.ThingsInGroup(ThingRequestGroup.Pawn); for (int i = 0; i < list.Count; i++) { Pawn pawn = (Pawn)list[i]; if (InsultingSpreeMentalStateUtility.CanChaseAndInsult(bully, pawn, true, allowPrisoners)) { outCandidates.Add(pawn); } } return(false); }, 40, RegionType.Set_Passable); }
public override void MentalStateTick() { if (this.target != null && (!this.target.Spawned || !this.pawn.CanReach(this.target, PathEndMode.Touch, Danger.Deadly, false, TraverseMode.ByPawn))) { Pawn target = this.target; if (!this.TryFindNewTarget()) { base.RecoverFromState(); } else { Messages.Message("MessageTargetedInsultingSpreeChangedTarget".Translate(new object[] { this.pawn.LabelShort, target.Label, this.target.Label }).AdjustedFor(this.pawn, "PAWN"), this.pawn, MessageTypeDefOf.NegativeEvent, true); base.MentalStateTick(); } } else if (this.target == null || !InsultingSpreeMentalStateUtility.CanChaseAndInsult(this.pawn, this.target, false, false)) { base.RecoverFromState(); } else { base.MentalStateTick(); } }
private bool TryFindNewTarget() { InsultingSpreeMentalStateUtility.GetInsultCandidatesFor(this.pawn, MentalState_TargetedInsultingSpree.candidates, false); bool result = MentalState_TargetedInsultingSpree.candidates.TryRandomElement(out this.target); MentalState_TargetedInsultingSpree.candidates.Clear(); return(result); }
private bool TryFindNewTarget() { InsultingSpreeMentalStateUtility.GetInsultCandidatesFor(pawn, candidates, allowPrisoners: false); bool result = candidates.TryRandomElement(out target); candidates.Clear(); return(result); }
private bool TryFindNewTarget() { InsultingSpreeMentalStateUtility.GetInsultCandidatesFor(base.pawn, MentalState_TargetedInsultingSpree.candidates, false); bool result = ((IEnumerable <Pawn>)MentalState_TargetedInsultingSpree.candidates).TryRandomElement <Pawn>(out base.target); MentalState_TargetedInsultingSpree.candidates.Clear(); return(result); }
public override bool StateCanOccur(Pawn pawn) { if (!base.StateCanOccur(pawn)) { return(false); } InsultingSpreeMentalStateUtility.GetInsultCandidatesFor(pawn, MentalStateWorker_TargetedInsultingSpree.candidates, false); bool result = MentalStateWorker_TargetedInsultingSpree.candidates.Any <Pawn>(); MentalStateWorker_TargetedInsultingSpree.candidates.Clear(); return(result); }
public override bool StateCanOccur(Pawn pawn) { if (!base.StateCanOccur(pawn)) { return(false); } InsultingSpreeMentalStateUtility.GetInsultCandidatesFor(pawn, MentalStateWorker_InsultingSpreeAll.candidates, true); bool result = MentalStateWorker_InsultingSpreeAll.candidates.Count >= 2; MentalStateWorker_InsultingSpreeAll.candidates.Clear(); return(result); }
public override void MentalStateTick() { if (base.target != null && !InsultingSpreeMentalStateUtility.CanChaseAndInsult(base.pawn, base.target, false, true)) { this.ChooseNextTarget(); } if (base.pawn.IsHashIntervalTick(250) && (base.target == null || base.insultedTargetAtLeastOnce)) { this.ChooseNextTarget(); } base.MentalStateTick(); }
public override void MentalStateTick() { if (target != null && !InsultingSpreeMentalStateUtility.CanChaseAndInsult(pawn, target)) { ChooseNextTarget(); } if (pawn.IsHashIntervalTick(250) && (target == null || insultedTargetAtLeastOnce)) { ChooseNextTarget(); } base.MentalStateTick(); }
public override bool StateCanOccur(Pawn pawn) { if (!base.StateCanOccur(pawn)) { return(false); } InsultingSpreeMentalStateUtility.GetInsultCandidatesFor(pawn, candidates, allowPrisoners: false); bool result = candidates.Any(); candidates.Clear(); return(result); }
internal bool <> m__1(Region r) { List <Thing> list = r.ListerThings.ThingsInGroup(ThingRequestGroup.Pawn); for (int i = 0; i < list.Count; i++) { Pawn pawn = (Pawn)list[i]; if (InsultingSpreeMentalStateUtility.CanChaseAndInsult(this.bully, pawn, true, this.allowPrisoners)) { this.outCandidates.Add(pawn); } } return(false); }
private void ChooseNextTarget() { InsultingSpreeMentalStateUtility.GetInsultCandidatesFor(base.pawn, candidates); if (!candidates.Any()) { target = null; insultedTargetAtLeastOnce = false; targetFoundTicks = -1; return; } Pawn pawn = (target == null || Find.TickManager.TicksGame - targetFoundTicks <= 1250 || !candidates.Any((Pawn x) => x != target)) ? candidates.RandomElementByWeight((Pawn x) => GetCandidateWeight(x)) : candidates.Where((Pawn x) => x != target).RandomElementByWeight((Pawn x) => GetCandidateWeight(x)); if (pawn != target) { target = pawn; insultedTargetAtLeastOnce = false; targetFoundTicks = Find.TickManager.TicksGame; } }
private void ChooseNextTarget() { InsultingSpreeMentalStateUtility.GetInsultCandidatesFor(base.pawn, MentalState_InsultingSpreeAll.candidates, true); if (!MentalState_InsultingSpreeAll.candidates.Any()) { base.target = null; base.insultedTargetAtLeastOnce = false; this.targetFoundTicks = -1; } else { Pawn pawn = (base.target == null || Find.TickManager.TicksGame - this.targetFoundTicks <= 1250 || !MentalState_InsultingSpreeAll.candidates.Any((Pawn x) => x != base.target)) ? MentalState_InsultingSpreeAll.candidates.RandomElementByWeight((Pawn x) => this.GetCandidateWeight(x)) : (from x in MentalState_InsultingSpreeAll.candidates where x != base.target select x).RandomElementByWeight((Pawn x) => this.GetCandidateWeight(x)); if (pawn != base.target) { base.target = pawn; base.insultedTargetAtLeastOnce = false; this.targetFoundTicks = Find.TickManager.TicksGame; } } }
public override void MentalStateTick() { if (base.target != null && (!base.target.Spawned || !pawn.CanReach(base.target, PathEndMode.Touch, Danger.Deadly) || !base.target.Awake())) { Pawn target = base.target; if (!TryFindNewTarget()) { RecoverFromState(); return; } Messages.Message("MessageTargetedInsultingSpreeChangedTarget".Translate(pawn.LabelShort, target.Label, base.target.Label, pawn.Named("PAWN"), target.Named("OLDTARGET"), base.target.Named("TARGET")).AdjustedFor(pawn), pawn, MessageTypeDefOf.NegativeEvent); base.MentalStateTick(); } else if (base.target == null || !InsultingSpreeMentalStateUtility.CanChaseAndInsult(pawn, base.target, skipReachabilityCheck: false, allowPrisoners: false)) { RecoverFromState(); } else { base.MentalStateTick(); } }