コード例 #1
0
 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;
         }
     }
 }
コード例 #2
0
        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();
     }
 }
コード例 #4
0
        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);
        }
コード例 #5
0
        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);
        }
コード例 #8
0
        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);
        }
コード例 #9
0
 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();
 }
コード例 #10
0
 public override void MentalStateTick()
 {
     if (target != null && !InsultingSpreeMentalStateUtility.CanChaseAndInsult(pawn, target))
     {
         ChooseNextTarget();
     }
     if (pawn.IsHashIntervalTick(250) && (target == null || insultedTargetAtLeastOnce))
     {
         ChooseNextTarget();
     }
     base.MentalStateTick();
 }
コード例 #11
0
        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);
        }
コード例 #12
0
            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);
            }
コード例 #13
0
        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;
            }
        }
コード例 #14
0
 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;
         }
     }
 }
コード例 #15
0
 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();
     }
 }