protected override IEnumerable <Toil> MakeNewToils()
        {
            yield return(Toils_General.DoAtomic(delegate
            {
                Pawn pawn = job.targetA.Thing as Pawn;
                //if (pawn != null && pawn.Downed && base.pawn.mindState.duty != null && base.pawn.mindState.duty.attackDownedIfStarving && base.pawn.Starving())
                //{
                job.killIncappedTarget = true;
                //}
            }));

            yield return(Toils_Misc.ThrowColonistAttackingMote(TargetIndex.A));

            yield return(Toils_Combat.FollowAndMeleeAttack(TargetIndex.A, delegate
            {
                Thing thing = job.GetTarget(TargetIndex.A).Thing;
                Pawn p;
                //if (job.reactingToMeleeThreat && (p = (thing as Pawn)) != null && !p.Awake())
                //{
                //    EndJobWith(JobCondition.InterruptForced);
                //}
                InteractionUtility.TryGetRandomVerbForSocialFight(base.pawn, out Verb verb);
                if (BeatDecider.shouldStopBeating(base.pawn, base.TargetA.Thing as Pawn))
                {
                    EndJobWith(JobCondition.Succeeded);
                }
                else
                {
                    pawn.meleeVerbs.TryMeleeAttack(thing, verb);
                }
            }).FailOnDespawnedOrNull(TargetIndex.A));
Ejemplo n.º 2
0
 public static bool CanTalkTo(this Pawn talker, Pawn talkee)
 {
     return(talker.MapHeld == talkee.MapHeld &&
            InteractionUtility.CanInitiateInteraction(talker) &&
            InteractionUtility.CanReceiveInteraction(talkee) &&
            CanSee(talker, talkee));
 }
Ejemplo n.º 3
0
        public static void roll_to_hit(Pawn rapist, Pawn p)
        {
            if (!Mod_Settings.prisoner_beating)
            {
                return;
            }

            float rand_value  = Rand.Value;
            float victim_pain = p.health.hediffSet.PainTotal;
            // bloodlust makes the aggressor more likely to hit the prisoner
            float beating_chance = xxx.config.base_chance_to_hit_prisoner * (xxx.is_bloodlust(rapist) ? 1.25f : 1.0f);
            // psychopath makes the aggressor more likely to hit the prisoner past the significant_pain_threshold
            float beating_threshold = xxx.is_psychopath(rapist) ? xxx.config.extreme_pain_threshold : xxx.config.significant_pain_threshold;

            //--Log.Message("roll_to_hit:  rand = " + rand_value + ", beating_chance = " + beating_chance + ", victim_pain = " + victim_pain + ", beating_threshold = " + beating_threshold);
            if ((victim_pain < beating_threshold && rand_value < beating_chance) || (rand_value < (beating_chance / 2)))
            {
                //--Log.Message("   done told her twice already...");
                if (InteractionUtility.TryGetRandomVerbForSocialFight(rapist, out Verb v))
                {
                    rapist.meleeVerbs.TryMeleeAttack(p, v);
                }
            }

            /*
             * //if (p.health.hediffSet.PainTotal < xxx.config.significant_pain_threshold)
             * if ((Rand.Value < 0.50f) &&
             *      ((Rand.Value < 0.33f) || (p.health.hediffSet.PainTotal < xxx.config.significant_pain_threshold) ||
             *   (xxx.is_bloodlust (rapist) || xxx.is_psychopath (rapist)))) {
             *      Verb v;
             *      if (InteractionUtility.TryGetRandomVerbForSocialFight (rapist, out v))
             *              rapist.meleeVerbs.TryMeleeAttack (p, v);
             * }
             */
        }
Ejemplo n.º 4
0
 private static bool CanInteractNowWith(Pawn pawn, Pawn recipient) // Had to add, copy
 {
     return(recipient.Spawned &&
            ((pawn.Position - recipient.Position).LengthHorizontalSquared <= 36.0 &&
             InteractionUtility.CanInitiateInteraction(pawn) &&
             (InteractionUtility.CanReceiveInteraction(recipient) &&
              GenSight.LineOfSight(pawn.Position, recipient.Position, pawn.MapHeld, true))));
 }
Ejemplo n.º 5
0
 public static bool CanTalkTo(this Pawn talker, Pawn talkee)
 {
     return(talker.MapHeld == talkee.MapHeld &&
            InteractionUtility.CanInitiateInteraction(talker) &&
            InteractionUtility.CanReceiveInteraction(talkee) &&
            (talker.Position - talkee.Position).LengthHorizontalSquared <= 36.0 &&
            GenSight.LineOfSight(talker.Position, talkee.Position, talker.MapHeld, true));
 }
            static bool SapientAnimalPatch([NotNull] Pawn p, ref bool __result)
            {
                if (p.IsSapientOrFeralFormerHuman())
                {
                    __result = InteractionUtility.CanReceiveInteraction(p) && (!p.Downed && !p.InAggroMentalState);
                    return(false);
                }

                return(true);
            }
Ejemplo n.º 7
0
            public static bool Replacement(Pawn_InteractionsTracker __instance, ref bool __result)
            {
                // Added
                var pawn = Traverse.Create(__instance).Field("pawn").GetValue <Pawn>();

                if (!IsInteractable(pawn))
                {
                    __result = false;
                    return(false);
                }
                var workingList = Traverse.Create(__instance).Field("workingList").GetValue <List <Pawn> >(); // Had to add

                if (InteractedTooRecentlyToInteract(__instance))                                              // Changed to own
                {
                    __result = false;
                    return(false);
                }
                // BASE
                if (!InteractionUtility.CanInitiateRandomInteraction(pawn))
                {
                    __result = false;
                    return(false);
                }
                var collection = pawn.MapHeld.mapPawns.AllPawnsSpawned.Where(IsInteractable); // Added

                workingList.Clear();
                workingList.AddRange(collection);
                workingList.Shuffle <Pawn>();
                List <InteractionDef> allDefsListForReading = DefDatabase <InteractionDef> .AllDefsListForReading;

                for (int i = 0; i < workingList.Count; i++)
                {
                    Pawn p = workingList[i];
                    if (p != pawn && CanInteractNowWith(pawn, p) && InteractionUtility.CanReceiveRandomInteraction(p) &&
                        !pawn.HostileTo(p))
                    {
                        InteractionDef intDef;
                        if (
                            allDefsListForReading.TryRandomElementByWeight(
                                (InteractionDef x) => x.Worker.RandomSelectionWeight(pawn, p), out intDef))
                        {
                            if (__instance.TryInteractWith(p, intDef))
                            {
                                __result = true;
                                return(false);
                            }
                            Log.Error(pawn + " failed to interact with " + p);
                        }
                    }
                }
                __result = false;
                return(false);
            }
Ejemplo n.º 8
0
        static bool Prefix(Pawn pawn, Pawn sick, JoyCategory maxPatientJoy, ref bool __result)
        {
            if (sick.needs.rest != null)
            {
                return(true);
            }

            __result = sick.IsColonist && !sick.Dead && pawn != sick && sick.InBed() &&
                       sick.Awake() && !sick.IsForbidden(pawn) && sick.needs.joy != null &&
                       sick.needs.joy.CurCategory <= maxPatientJoy &&
                       InteractionUtility.CanReceiveInteraction(sick) && !sick.needs.food.Starving &&
                       pawn.CanReserveAndReach(sick, PathEndMode.InteractionCell, Danger.None, 1, -1, null, false);
            return(false);
        }
Ejemplo n.º 9
0
            public static bool Replacement(Pawn_InteractionsTracker __instance, ref bool __result, Pawn ___pawn, List <Pawn> ___workingList, int ___lastInteractionTime)
            {
                // Added
                if (!IsInteractable(___pawn))
                {
                    __result = false;
                    return(false);
                }

                if (InteractedTooRecentlyToInteract(___lastInteractionTime)) // Changed to own
                {
                    __result = false;
                    return(false);
                }
                // BASE
                if (!InteractionUtility.CanInitiateRandomInteraction(___pawn))
                {
                    __result = false;
                    return(false);
                }
                var collection = ___pawn.MapHeld.mapPawns.AllPawnsSpawned.Where(IsInteractable); // Added

                ___workingList.Clear();
                ___workingList.AddRange(collection);
                ___workingList.Shuffle();
                List <InteractionDef> allDefsListForReading = DefDatabase <InteractionDef> .AllDefsListForReading;

                foreach (var p in ___workingList)
                {
                    if (p != ___pawn && CanInteractNowWith(___pawn, p) && InteractionUtility.CanReceiveRandomInteraction(p) &&
                        !___pawn.HostileTo(p))
                    {
                        var p1 = p;
                        if (
                            allDefsListForReading.TryRandomElementByWeight(
                                x => x.Worker.RandomSelectionWeight(___pawn, p1), out var intDef))
                        {
                            if (__instance.TryInteractWith(p, intDef))
                            {
                                __result = true;
                                return(false);
                            }
                            Log.Warning($"{___pawn} failed to interact with {p}.");
                        }
                    }
                }
                __result = false;
                return(false);
            }
        protected override bool Satisfied(Pawn p)
        {
            // No animal whorin' for now.
            if (xxx.is_animal(p))
            {
                return(false);
            }

            if (!InteractionUtility.CanInitiateInteraction(p))
            {
                return(false);
            }

            return(xxx.is_whore(p));
        }
Ejemplo n.º 11
0
        // RimWorld.SickPawnVisitUtility
        public static bool Vamp_CanVisit(ref bool __result, Pawn pawn, Pawn sick, JoyCategory maxPatientJoy)
        {
            if (sick.IsVampire())
            {
                __result = sick.IsColonist && !sick.Dead && pawn != sick && sick.InBed() && sick.Awake() &&
                           !sick.IsForbidden(pawn) && sick.needs.joy != null &&
                           sick.needs.joy.CurCategory <= maxPatientJoy &&
                           InteractionUtility.CanReceiveInteraction(sick) &&
                           pawn.CanReserveAndReach(sick, PathEndMode.InteractionCell, Danger.None) &&
                           !AboutToRecover(sick);
                return(false);
            }

            return(true);
        }
Ejemplo n.º 12
0
        public static bool TryInteractRandomly(this Source _this)
        {
            var pawn =
                (Pawn)
                typeof(Source).GetField("pawn",
                                        BindingFlags.Instance | BindingFlags.NonPublic).GetValue(_this);

            if (!IsInteractable(pawn))
            {
                return(false);
            }
            var workingList = (List <Pawn>) typeof(Source).GetField("workingList", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null); // Had to add

            // BASE
            if (_this.InteractedTooRecentlyToInteract())
            {
                return(false);
            }
            if (!InteractionUtility.CanInitiateRandomInteraction(pawn))
            {
                return(false);
            }
            var collection = pawn.MapHeld.mapPawns.AllPawnsSpawned.Where(IsInteractable).InRandomOrder(); // Added

            workingList.Clear();
            workingList.AddRange(collection);
            workingList.Shuffle <Pawn>();
            List <InteractionDef> allDefsListForReading = DefDatabase <InteractionDef> .AllDefsListForReading;

            for (int i = 0; i < workingList.Count; i++)
            {
                Pawn p = workingList[i];
                if (p != pawn && CanInteractNowWith(pawn, p) && InteractionUtility.CanReceiveRandomInteraction(p) && !pawn.HostileTo(p))
                {
                    InteractionDef intDef;
                    if (allDefsListForReading.TryRandomElementByWeight((InteractionDef x) => x.Worker.RandomSelectionWeight(pawn, p), out intDef))
                    {
                        if (_this.TryInteractWith(p, intDef))
                        {
                            return(true);
                        }
                        Log.Error(pawn + " failed to interact with " + p);
                    }
                }
            }
            return(false);
        }
        public static bool TryInteractRandomly(Pawn_InteractionsTracker __instance, ref bool __result)
        {
            if (__instance.InteractedTooRecentlyToInteract())
            {
                __result = false;
                return(false);
            }
            if (!InteractionUtility.CanInitiateRandomInteraction(pawn(__instance)))
            {
                __result = false;
                return(false);
            }
            List <Pawn> collection = pawn(__instance).Map.mapPawns.SpawnedPawnsInFaction(pawn(__instance).Faction);
            //Pawn_InteractionsTracker.workingList.Clear();
            List <Pawn> workingList = getWorkingList(); //ADDED

            workingList.AddRange(collection);           //REPLACED workingList with local
            workingList.Shuffle();                      //REPLACED workingList with local
            List <InteractionDef> allDefsListForReading = DefDatabase <InteractionDef> .AllDefsListForReading;

            for (int i = 0; i < workingList.Count; i++) //REPLACED workingList with local
            {
                Pawn           p = workingList[i];      //REPLACED workingList with local
                InteractionDef intDef;
                if (p != pawn(__instance) && __instance.CanInteractNowWith(p, null) && InteractionUtility.CanReceiveRandomInteraction(p) && !pawn(__instance).HostileTo(p) && allDefsListForReading.TryRandomElementByWeight(delegate(InteractionDef x)
                {
                    if (!__instance.CanInteractNowWith(p, x))
                    {
                        return(0f);
                    }
                    return(x.Worker.RandomSelectionWeight(pawn(__instance), p));
                }, out intDef))
                {
                    if (__instance.TryInteractWith(p, intDef))
                    {
                        workingList.Clear();                        //REPLACED workingList with local
                        __result = true;
                        return(false);
                    }
                    Log.Error(pawn(__instance) + " failed to interact with " + p, false);
                }
            }
            //Pawn_InteractionsTracker.workingList.Clear();
            __result = false;
            return(false);
        }
Ejemplo n.º 14
0
        public static bool ShouldImproveRelationship(this Pawn pawn, Pawn guest)
        {
            if (!pawn.IsColonist)
            {
                return(false);
            }
            if (!ViableGuestTarget(guest))
            {
                return(false);
            }
            if (!guest.ImproveRelationship())
            {
                return(false);
            }
            //if (guest.Faction.ColonyGoodwill >= 100) return false;
            if (guest.relations.OpinionOf(pawn) >= 100)
            {
                return(false);
            }
            if (guest.InMentalState)
            {
                return(false);
            }
            if (!guest.IsInGuestZone(guest))
            {
                return(false);
            }
            if (!InteractionUtility.CanInitiateInteraction(pawn))
            {
                return(false);
            }
            if (!InteractionUtility.CanReceiveInteraction(guest))
            {
                return(false);
            }
            if (!pawn.HasReserved(guest) && !pawn.CanReserveAndReach(guest, PathEndMode.OnCell, pawn.NormalMaxDanger()))
            {
                return(false);
            }
            if (guest.CurJob?.def.suspendable == false)
            {
                return(false);
            }

            return(true);
        }
Ejemplo n.º 15
0
 public static Action GetAttackAction(Pawn pawn, LocalTargetInfo target, out string failStr)
 {
     failStr = "";
     if (!pawn.IsColonistPlayerControlled)
     {
         failStr = "CannotOrderNonControlledLower".Translate();
     }
     else if (target.IsValid && !pawn.CanReach(target, PathEndMode.Touch, Danger.Deadly))
     {
         failStr = "NoPath".Translate();
     }
     else if (pawn.WorkTagIsDisabled(WorkTags.Violent))
     {
         failStr = "IsIncapableOfViolenceLower".Translate(pawn.LabelShort, pawn);
     }
     else if (pawn.meleeVerbs.TryGetMeleeVerb(target.Thing) == null)
     {
         failStr = "Incapable".Translate();
     }
     else if (pawn == target.Thing)
     {
         failStr = "CannotAttackSelf".Translate();
     }
     else
     {
         Pawn target2;
         if ((target2 = (target.Thing as Pawn)) == null || (!pawn.InSameExtraFaction(target2, ExtraFactionType.HomeFaction) && !pawn.InSameExtraFaction(target2, ExtraFactionType.MiniFaction)))
         {
             return(delegate
             {
                 if (InteractionUtility.TryGetRandomVerbForSocialFight(pawn, out Verb verb))
                 {
                     Job job = JobMaker.MakeJob(jobDef, target.Thing as Pawn);
                     //job.maxNumMeleeAttacks = 1;
                     //job.killIncappedTarget = false;
                     Pawn pawn2 = target.Thing as Pawn;
                     if (pawn2 != null)
                     {
                         job.killIncappedTarget = pawn2.Downed;
                     }
                     //job.verbToUse = verb;
                     pawn.jobs.TryTakeOrderedJob(job);
                 }
                 //Job job = JobMaker.MakeJob(JobDefOf.AttackMelee, target);
                 //pawn.jobs.TryTakeOrderedJob(job);
             });
Ejemplo n.º 16
0
        public override void MentalStateTick()
        {
            // Insult a nearby pawn
            if (this.pawn.IsHashIntervalTick(180))
            {
                IEnumerable <Pawn> targets = from thing in GenRadial.RadialDistinctThingsAround(this.pawn.Position, this.pawn.Map, 5.0f, false)
                                             where (thing as Pawn) != null && InteractionUtility.CanReceiveRandomInteraction(thing as Pawn)
                                             select thing as Pawn;
                Pawn target;
                if (targets.TryRandomElement(out target))
                {
                    // Try to insult the target.  Use the enemy insult interaction for enemies, so we don't start social fights with them.
                    this.pawn.interactions.TryInteractWith(target, /*this.pawn.HostileTo(target)*/ true ? GMT_DefOf.GMT_Interaction_InsultEnemy : InteractionDefOf.Insult);
                }
            }

            base.MentalStateTick();
        }
Ejemplo n.º 17
0
        public static bool ShouldMakeFriends(this Pawn pawn, Pawn guest)
        {
            if (!pawn.IsColonist)
            {
                return(false);
            }
            if (!ViableGuestTarget(guest, true))
            {
                return(false);
            }
            if (!guest.MakeFriends())
            {
                return(false);
            }
            if (guest.InMentalState)
            {
                return(false);
            }
            //if (guest.relations.OpinionOf(pawn) >= 100) return false;
            //if (guest.RelativeTrust() < 50) return false;
            if (guest.relations.OpinionOf(pawn) <= -10)
            {
                return(false);
            }
            if (!InteractionUtility.CanInitiateInteraction(pawn))
            {
                return(false);
            }
            if (!InteractionUtility.CanReceiveInteraction(guest))
            {
                return(false);
            }
            if (!pawn.HasReserved(guest) && !pawn.CanReserveAndReach(guest, PathEndMode.OnCell, pawn.NormalMaxDanger()))
            {
                return(false);
            }
            if (guest.CurJob?.def.suspendable == false)
            {
                return(false);
            }

            return(true);
        }
        public override Job TryGiveJob(Pawn pawn)
        {
            if (pawn.RaceProps.Humanlike && pawn.WorkTagIsDisabled(WorkTags.Violent))
            {
                return(null);
            }
            Pawn otherPawn = ((MentalState_Ork_Scrapping)pawn.MentalState).otherPawn;
            Verb verbToUse;

            if (!InteractionUtility.TryGetRandomVerbForSocialFight(pawn, out verbToUse))
            {
                return(null);
            }
            Job job = JobMaker.MakeJob(AdeptusJobDefOf.OGO_Orkoid_Scrap, otherPawn);

            job.maxNumMeleeAttacks = 1;
            job.verbToUse          = verbToUse;
            return(job);
        }
Ejemplo n.º 19
0
        public override bool ShouldSkip(Pawn pawn, bool forced = false)
        {
            if (!InteractionUtility.CanInitiateInteraction(pawn))
            {
                return(true);
            }

            if (!pawn.GetRestaurant().IsOpenedRightNow)
            {
                return(true);
            }
            var list = pawn.GetRestaurant().SpawnedDiningPawns;

            var anyPatrons = list.Any(p => {
                var driver = p.jobs.curDriver as JobDriver_Dine;
                return(driver?.wantsToOrder == true);
            });

            return(!anyPatrons);
        }
        protected override bool Satisfied(Pawn p)
        {
            // No animal whorin' for now.
            if (xxx.is_animal(p))
            {
                return(false);
            }

            if (!InteractionUtility.CanInitiateInteraction(p))
            {
                return(false);
            }

            if (DebugSettings.alwaysDoLovin)
            {
                return(true);
            }

            return(xxx.is_whore(p) || RJWSettings.WildMode);
        }
Ejemplo n.º 21
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            //--Log.Message("[RJW] JobGiver_WhoreInvitingVisitors::TryGiveJob( " + pawn.NameStringShort + " ) called0");
            if (pawn == null || !InteractionUtility.CanInitiateInteraction(pawn))
            {
                return(null);
            }
            if (PawnUtility.WillSoonHaveBasicNeed(pawn) || !xxx.is_healthy(pawn) || !xxx.can_be_fucked(pawn))             //As long as pawns is older than minimum sex age, they can be assigned as w****s.
            {
                return(null);
            }

            if (Find.TickManager.TicksGame >= pawn.mindState.canLovinTick && pawn.CurJob == null)
            {
                int  price;
                Pawn pawn2 = FindAttractivePawn(pawn, out price);
                //--Log.Message("[RJW] JobGiver_WhoreInvitingVisitors::TryGiveJob( " + pawn.NameStringShort + " ) called1 - pawn2 is " + (pawn2 == null ? "NULL" : pawn2.NameStringShort));
                if (pawn2 == null)
                {
                    return(null);
                }
                Building_WhoreBed whorebed = xxx.FindWhoreBed(pawn);
                if ((whorebed == null) || !xxx.CanUse(pawn, whorebed) || (100f * Rand.Value) > percentRate)
                {
                    //--Log.Message("resetting ticks");
                    if (xxx.config.whores_always_findjob)
                    {
                        pawn.mindState.canLovinTick = Find.TickManager.TicksGame + 5;
                    }
                    else
                    {
                        pawn.mindState.canLovinTick = Find.TickManager.TicksGame + Rand.Range(75, 150);
                    }
                    return(null);
                }
                //--Log.Message("[RJW] JobGiver_WhoreInvitingVisitors::TryGiveJob( " + pawn.NameStringShort + " ) called2 - " + pawn2.NameStringShort + " is pawn2.");
                whorebed.priceOfWhore = price;
                return(new Job(xxx.inviting_visitors, pawn2, whorebed));
            }
            return(null);
        }
Ejemplo n.º 22
0
 public override void Tick()
 {
     base.Tick();
     if (this.realPawn == null)
     {
         this.realPawn = this.pawn as PsychologyPawn;
     }
     if (this.otherPawn == null)
     {
         this.pawn.health.RemoveHediff(this);
         return;
     }
     if (!this.otherPawn.Spawned || !this.pawn.Spawned || !InteractionUtility.CanReceiveInteraction(this.pawn) || !InteractionUtility.CanReceiveInteraction(this.otherPawn))
     {
         this.pawn.health.RemoveHediff(this);
         return;
     }
     if ((this.pawn.Position - this.otherPawn.Position).LengthHorizontalSquared >= 54f || !GenSight.LineOfSight(this.pawn.Position, this.otherPawn.Position, this.pawn.Map, true))
     {
         this.pawn.health.RemoveHediff(this);
         return;
     }
     if (this.otherPawn.Dead || this.otherPawn.Downed || this.otherPawn.InAggroMentalState)
     {
         this.pawn.health.RemoveHediff(this);
         return;
     }
     if (this.pawn.IsHashIntervalTick(200))
     {
         if (Rand.Value > 1f - (this.ageTicks / 400000f))
         {
             this.pawn.health.RemoveHediff(this);
             return;
         }
         else if (Rand.Value < 0.2f && this.pawn.Map != null)
         {
             MoteMaker.MakeInteractionBubble(this.pawn, otherPawn, InteractionDefOf.DeepTalk.interactionMote, InteractionDefOf.DeepTalk.Symbol);
         }
     }
 }
Ejemplo n.º 23
0
        public virtual void roll_to_hit(Pawn pawn, Pawn partner)
        {
            if (!RJWSettings.rape_beating || !xxx.is_human(pawn))
            {
                return;
            }

            //Rand.PopState();
            //Rand.PushState(RJW_Multiplayer.PredictableSeed());
            float rand_value    = Rand.Value;
            float victim_pain   = partner.health.hediffSet.PainTotal;
            float chance_to_hit = xxx.config.base_chance_to_hit_prisoner / 5;
            float threshold     = xxx.config.minor_pain_threshold;

            if ((victim_pain < threshold && rand_value < chance_to_hit))
            {
                if (InteractionUtility.TryGetRandomVerbForSocialFight(pawn, out Verb v))
                {
                    pawn.meleeVerbs.TryMeleeAttack(partner, v);
                }
            }
        }
Ejemplo n.º 24
0
        public static bool ShouldRecruit(this Pawn pawn, Pawn guest)
        {
            if (!ViableGuestTarget(guest, true))
            {
                return(false);
            }
            if (!guest.TryRecruit())
            {
                return(false);
            }
            if (guest.InMentalState)
            {
                return(false);
            }
            //if (guest.relations.OpinionOf(pawn) >= 100) return false;
            //if (guest.RelativeTrust() < 50) return false;
            if (guest.relations.OpinionOf(pawn) <= -10)
            {
                return(false);
            }
            //if (guest.interactions.InteractedTooRecentlyToInteract()) return false;
            //if (pawn.interactions.InteractedTooRecentlyToInteract()) return false;
            if (!InteractionUtility.CanInitiateInteraction(pawn))
            {
                return(false);
            }
            if (!InteractionUtility.CanReceiveInteraction(guest))
            {
                return(false);
            }
            if (!pawn.HasReserved(guest) && !pawn.CanReserveAndReach(guest, PathEndMode.OnCell, pawn.NormalMaxDanger()))
            {
                return(false);
            }

            return(true);
        }
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (!InteractionUtility.CanInitiateInteraction(pawn))
            {
                return(null);
            }
            Pawn patient = SickPawnVisitUtility.FindRandomSickPawn(pawn, JoyCategory.High);

            if (patient == null)
            {
                return(null);
            }

            Thing wheelChair = ToolsForHaulUtility.FindWheelChair(patient, pawn);

            if (wheelChair == null || !pawn.CanReserve(wheelChair))
            {
                return(null);
            }
            return(new Job(DefDatabase <JobDef> .GetNamed("TakeToWheelChair"), patient, wheelChair)
            {
                maxNumToCarry = 1
            });
        }
Ejemplo n.º 26
0
        public async Task CreateDebt(IUser user, decimal amount, string unit, [Remainder] string?note = null)
        {
            if (amount < 0)
            {
                await RespondAsync("You cannot owe a negative amount!");

                return;
            }

            var message = $"{Context.User.Mention} owes {TransactionFormatting.FormatCurrency(amount, unit)} to {user.Mention}";

            var confirmed = await InteractionUtility.ConfirmAsync(_client, Context.Channel, TimeSpan.FromMinutes(1), message);

            if (!confirmed)
            {
                await RespondAsync("Confirmation timed out. Cancelled transaction!");

                return;
            }

            await _transactions.CreateTransaction(user.Id, Context.User.Id, amount, unit, note, DateTime.UtcNow);

            await RespondAsync(message);
        }
Ejemplo n.º 27
0
 public override void Tick()
 {
     base.Tick();
     if (this.otherPawn == null)
     {
         this.pawn.health.RemoveHediff(this);
         return;
     }
     if (!this.otherPawn.Spawned || !this.pawn.Spawned || !InteractionUtility.CanReceiveInteraction(this.pawn) || !InteractionUtility.CanReceiveInteraction(this.otherPawn))
     {
         this.pawn.health.RemoveHediff(this);
         return;
     }
     if (this.pawn.Map != null && this.otherPawn.Map != null && ((this.pawn.Position - this.otherPawn.Position).LengthHorizontalSquared >= 54f || !GenSight.LineOfSight(this.pawn.Position, this.otherPawn.Position, this.pawn.Map, true)))
     {
         this.pawn.health.RemoveHediff(this);
         return;
     }
     if (this.otherPawn.Dead || this.otherPawn.Downed || this.otherPawn.InAggroMentalState)
     {
         this.pawn.health.RemoveHediff(this);
         return;
     }
     if (this.pawn.IsHashIntervalTick(200))
     {
         /* When a conversation first starts, the mean time for it to last is 3 hours.
          * When it reaches half an hour, the mean time for it to continue is 2 hours.
          * When it reaches an hour, the mean time for it to continue is 1 hour.
          * When it surpasses 2 hours, it will on average last for half an hour more.
          * Conversations will thus usually not surpass 2 hours, and very rarely surpass 2 and a half hours, but are very likely to last up to an hour.
          */
         float mtb = 3f;
         if (this.ageTicks > GenDate.TicksPerHour * 2)
         {
             mtb = 0.5f;
         }
         else if (this.ageTicks > GenDate.TicksPerHour)
         {
             mtb = 1f;
         }
         else if (this.ageTicks > (GenDate.TicksPerHour / 2))
         {
             mtb = 2f;
         }
         if (pawn.story.traits.HasTrait(TraitDefOfPsychology.Chatty))
         {
             mtb *= 2f;
         }
         if (this.otherPawn.story.traits.HasTrait(TraitDefOfPsychology.Chatty))
         {
             mtb *= 2f;
         }
         if (Rand.MTBEventOccurs(mtb, GenDate.TicksPerHour, 200))
         {
             this.pawn.health.RemoveHediff(this);
             return;
         }
         else if (Rand.Value < 0.2f && this.pawn.Map != null)
         {
             MoteMaker.MakeInteractionBubble(this.pawn, otherPawn, InteractionDefOfPsychology.EndConversation.interactionMote, InteractionDefOfPsychology.EndConversation.Symbol);
         }
     }
 }
 public static bool CanChaseAndInsult(Pawn bully, Pawn insulted, bool skipReachabilityCheck = false, bool allowPrisoners = true)
 {
     return(insulted.RaceProps.Humanlike && (insulted.Faction == bully.Faction || (allowPrisoners && insulted.HostFaction == bully.Faction)) && insulted != bully && !insulted.Dead && !insulted.Downed && insulted.Spawned && insulted.Awake() && insulted.Position.InHorDistOf(bully.Position, 40f) && InteractionUtility.CanReceiveInteraction(insulted) && !insulted.HostileTo(bully) && Find.TickManager.TicksGame - insulted.mindState.lastHarmTick >= 833 && (skipReachabilityCheck || bully.CanReach(insulted, PathEndMode.Touch, Danger.Deadly, false, TraverseMode.ByPawn)));
 }
Ejemplo n.º 29
0
        // Token: 0x06000095 RID: 149 RVA: 0x00005528 File Offset: 0x00003728
        protected override Job TryGiveJob(Pawn pawn)
        {
            //IL_003f: Unknown result type (might be due to invalid IL or missing references)
            //IL_0051: Unknown result type (might be due to invalid IL or missing references)
            //IL_0060: Unknown result type (might be due to invalid IL or missing references)
            //IL_0081: Unknown result type (might be due to invalid IL or missing references)
            //IL_0087: Expected O, but got Unknown
            //IL_00ae: Unknown result type (might be due to invalid IL or missing references)
            //IL_00b3: Unknown result type (might be due to invalid IL or missing references)
            //IL_00b9: Expected O, but got Unknown
            if (pawn.interactions.InteractedTooRecentlyToInteract() || lastInteractionTick > Find.TickManager.TicksGame - 500)
            {
                return(null);
            }
            Pawn val = (Pawn)(object)(Pawn)GenClosest.ClosestThingReachable(((Thing)pawn).Position, ((Thing)pawn).Map, ThingRequest.ForGroup((ThingRequestGroup)11), (PathEndMode)1, TraverseParms.For(pawn, (Danger)3, (TraverseMode)0, false), 9999f, (Predicate <Thing>)validator, (IEnumerable <Thing>)null, 0, -1, false, (RegionType)6, false);

            if (val == null || Rand.Value > 0.5f)
            {
                return(null);
            }
            lastInteractionTick = Find.TickManager.TicksGame;
            return((Job)(object)new Job(JobDefOfEvaineQMentalWorker.StormMark, (LocalTargetInfo)val));

            bool validator(Thing t)
            {
                //IL_0001: Unknown result type (might be due to invalid IL or missing references)
                //IL_0007: Expected O, but got Unknown
                Pawn val2 = (Pawn)(object)(Pawn)t;

                if (val2 != pawn && !val2.Dead && !val2.Downed && RestUtility.Awake(val2) && InteractionUtility.CanReceiveInteraction(val2))
                {
                    return(val2.RaceProps.Humanlike);
                }
                return(false);
            }
        }
Ejemplo n.º 30
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (pawn.interactions.InteractedTooRecentlyToInteract() || lastInteractionTick > Find.TickManager.TicksGame - 500)
            {
                return(null);
            }
            Predicate <Thing> validator = delegate(Thing t)
            {
                Pawn pawn3 = (Pawn)t;
                return(pawn3 != pawn && !pawn3.Dead && !pawn3.Downed && pawn3.Awake() && InteractionUtility.CanReceiveInteraction(pawn3) && pawn3.RaceProps.Humanlike);
            };
            Pawn pawn2 = (Pawn)GenClosest.ClosestThingReachable(pawn.Position, pawn.Map, ThingRequest.ForGroup(ThingRequestGroup.Pawn), PathEndMode.OnCell, TraverseParms.For(pawn, Danger.Deadly, TraverseMode.ByPawn, false), 9999f, validator);

            if (pawn2 == null || Rand.Value > 0.5f)
            {
                return(null);
            }
            lastInteractionTick = Find.TickManager.TicksGame;
            return(new Job(JobDefOfPsychology.Abuse, pawn2));
        }