Esempio n. 1
0
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (pawn.AnimalOrWildMan())
            {
                return(null);
            }

            if (!pawn.IsColonist)
            {
                return(null);
            }

            if (pawn.Drafted)
            {
                return(null);
            }

            if (pawn.Downed)
            {
                return(null);
            }

            if (HealthAIUtility.ShouldSeekMedicalRest(pawn))
            {
                return(null);
            }

            CompMilkableHumanoid compMilk = pawn.TryGetComp <CompMilkableHumanoid>();

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

            if (!compMilk.ActiveAndCanBeMilked)
            {
                return(null);
            }

            if (!compMilk.MilkProps.canMilkThemselves)
            {
                return(null);
            }

            Pawn lover = LovePartnerRelationUtility.ExistingLovePartner(pawn);

            if (lover != null)
            {
                if (pawn.Faction == lover.Faction)
                {
                    if (!lover.Drafted && !lover.Downed && !HealthAIUtility.ShouldSeekMedicalRest(lover))
                    {
                        return(null);
                    }
                }
            }

            return(new Job(MilkyDefOf.MilkySelf));
        }
Esempio n. 2
0
 //Use this check when p is in the same faction as the w***e
 internal bool RelationCheckPass(Pawn p)
 {
     if (xxx.isSingleOrPartnerNotHere(p) || (Rand.Value < 0.9f))
     {
         if (p != LovePartnerRelationUtility.ExistingLovePartner(p1))
         {
             return((p != p1) & (p.Map == p1.Map) && (p.Faction == p1.Faction) && p.IsColonist && xxx.IsHookupAppealing(p1, p));
         }
     }
     return(false);
 }
 internal bool RelationCheckPass(Pawn client)
 {
     //Rand.PopState();
     //Rand.PushState(RJW_Multiplayer.PredictableSeed());
     if (xxx.isSingleOrPartnerNotHere(client) || xxx.is_lecher(client) || Rand.Value < 0.9f)
     {
         if (client != LovePartnerRelationUtility.ExistingLovePartner(w***e))
         {                     //Exception for prisoners to account for PrisonerWhoreSexualEmergencyTree, which allows prisoners to try to hook up with anyone who's around (mostly other prisoners or warden)
             return((client != w***e) & (client.Map == w***e.Map) && (client.Faction == w***e.Faction || w***e.IsPrisoner) && (client.IsColonist || w***e.IsPrisoner) && WhoringHelper.IsHookupAppealing(w***e, client));
         }
     }
     return(false);
 }
        // Token: 0x06000009 RID: 9 RVA: 0x000023B8 File Offset: 0x000005B8
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            if (!(t is Pawn pawn2))
            {
                return(false);
            }

            var pawn3 = LovePartnerRelationUtility.ExistingLovePartner(pawn);

            if (pawn3 == null)
            {
                return(false);
            }

            if (pawn.Faction != pawn2.Faction)
            {
                return(false);
            }

            if (pawn3 != pawn2)
            {
                return(false);
            }

            var drafted = pawn3.Drafted;

            if (drafted)
            {
                return(false);
            }

            if (pawn3.CurJob != null && pawn3.jobs.curDriver.asleep)
            {
                return(false);
            }

            if (pawn3.CurJob is { playerForced : true })
        public static Pawn FindAttractivePawn(Pawn w***e, out int price)
        {
            price = 0;
            if (w***e == null || xxx.is_asexual(w***e))
            {
                if (RJWSettings.DebugWhoring)
                {
                    Log.Message($" {xxx.get_pawnname(w***e)} is asexual, abort");
                }
                return(null);
            }
            //Rand.PopState();
            //Rand.PushState(RJW_Multiplayer.PredictableSeed());

            FindAttractivePawnHelper client = new FindAttractivePawnHelper
            {
                w***e = w***e
            };

            price = WhoringHelper.PriceOfWhore(w***e);
            int priceOfWhore = price;

            IntVec3 pos = w***e.Position;

            IEnumerable <Pawn> potentialClients = w***e.Map.mapPawns.AllPawnsSpawned;

            potentialClients = potentialClients.Where(x
                                                      => x != w***e &&
                                                      !x.IsForbidden(w***e) &&
                                                      !x.HostileTo(w***e) &&
                                                      !x.IsPrisoner &&
                                                      x.Position.DistanceTo(pos) < 100 &&
                                                      w***e.CanReserveAndReach(x, PathEndMode.ClosestTouch, Danger.Some, 1) &&
                                                      xxx.is_healthy_enough(x));

            potentialClients = potentialClients.Except(potentialClients.Where(client.TraitCheckFail));

            if (!potentialClients.Any())
            {
                return(null);
            }

            if (RJWSettings.DebugWhoring)
            {
                Log.Message($" FindAttractivePawn number of all potential clients {potentialClients.Count()}");
            }

            List <Pawn> valid_targets = new List <Pawn>();

            foreach (Pawn target in potentialClients)
            {
                if (xxx.can_path_to_target(w***e, target.Position))
                {
                    valid_targets.Add(target);
                }
            }

            IEnumerable <Pawn> guestsSpawned = valid_targets.Where(x => x.Faction != w***e.Faction &&
                                                                   WhoringHelper.CanAfford(x, w***e, priceOfWhore) &&
                                                                   !MemoryChecker(x, ThoughtDef.Named("RJWFailedSolicitation")) &&
                                                                   x != LovePartnerRelationUtility.ExistingLovePartner(w***e));

            if (guestsSpawned.Any())
            {
                if (RJWSettings.DebugWhoring)
                {
                    Log.Message($" FindAttractivePawn number of all acceptable Guests {guestsSpawned.Count()}");
                }
                return(guestsSpawned.RandomElement());
            }

            return(null);

            //use casual sex for colonist hooking
            if (RJWSettings.DebugWhoring)
            {
                Log.Message($" FindAttractivePawn found no guests, trying colonists");
            }

            if (!WhoringHelper.WillPawnTryHookup(w***e))            // will hookup colonists?
            {
                return(null);
            }
            IEnumerable <Pawn> freeColonists = valid_targets.Where(x => x.Faction == w***e.Faction &&
                                                                   Roll_to_skip(x, w***e));

            if (RJWSettings.DebugWhoring)
            {
                Log.Message($" FindAttractivePawn number of free colonists {freeColonists.Count()}");
            }

            freeColonists = freeColonists.Where(x => client.RelationCheckPass(x) && !MemoryChecker(x, ThoughtDef.Named("RJWTurnedDownWhore")));

            if (freeColonists.Any())
            {
                if (RJWSettings.DebugWhoring)
                {
                    Log.Message($" FindAttractivePawn number of all acceptable Colonists {freeColonists.Count()}");
                }
                return(freeColonists.RandomElement());
            }

            return(null);
        }
        protected override IEnumerable <Toil> MakeNewToils()
        {
            //Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() - making toils");
            this.FailOnDespawnedOrNull(PartnerInd);
            this.FailOnDespawnedNullOrForbidden(BedInd);
            //Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() fail conditions check " + (Actor is null) + " " + !xxx.CanUse(Actor, Bed) + " " + !Actor.CanReserve(Partner));
            this.FailOn(() => Actor is null || !xxx.CanUse(Actor, Bed) || !Actor.CanReserve(Partner));
            this.FailOn(() => pawn.Drafted);
            int price = WhoringHelper.PriceOfWhore(Actor);

            yield return(Toils_Reserve.Reserve(PartnerInd, 1, 0));

            //yield return Toils_Reserve.Reserve(BedInd, Bed.SleepingSlotsCount, 0);
            bool partnerHasPenis = Genital_Helper.has_penis(Partner) || Genital_Helper.has_penis_infertile(Partner);

            Toil gotoWhoreBed = new Toil
            {
                initAction = delegate
                {
                    //Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() - gotoWhoreBed initAction is called");
                    Actor.pather.StartPath(WhoreSleepSpot, PathEndMode.OnCell);
                    Partner.jobs.StopAll();
                    Partner.pather.StartPath(WhoreSleepSpot, PathEndMode.Touch);
                },
                tickAction = delegate
                {
                    if (Partner.IsHashIntervalTick(150))
                    {
                        Partner.pather.StartPath(Actor, PathEndMode.Touch);
                        //Log.Message(xxx.get_pawnname(Partner) + ": I'm following the w***e");
                    }
                },
                defaultCompleteMode = ToilCompleteMode.PatherArrival
            };

            gotoWhoreBed.FailOnWhorebedNoLongerUsable(BedInd, Bed);
            yield return(gotoWhoreBed);

            Toil waitInBed = new Toil
            {
                initAction = delegate
                {
                    //Rand.PopState();
                    //Rand.PushState(RJW_Multiplayer.PredictableSeed());
                    //Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - waitInBed, initAction is called");
                    ticksLeftThisToil = 5000;
                    ticks_left        = (int)(2000.0f * Rand.Range(0.30f, 1.30f));
                    //Actor.pather.StopDead();  //Let's just make w****s standing at the bed
                    //JobDriver curDriver = Actor.jobs.curDriver;
                    //curDriver.layingDown = LayingDownState.LayingInBed;
                    //curDriver.asleep = false;
                    var gettin_loved = new Job(xxx.gettin_loved, Actor, Bed);
                    Partner.jobs.StartJob(gettin_loved, JobCondition.InterruptForced);
                },
                tickAction = delegate
                {
                    Actor.GainComfortFromCellIfPossible();
                    if (IsInOrByBed(Bed, Partner))
                    {
                        //Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - waitInBed, tickAction pass");
                        ticksLeftThisToil = 0;
                    }
                },
                defaultCompleteMode = ToilCompleteMode.Delay,
            };

            waitInBed.FailOn(() => pawn.GetRoom() == null);
            yield return(waitInBed);

            bool canAfford = WhoringHelper.CanAfford(Partner, Actor, price);

            if (canAfford)
            {
                Toil loveToil = new Toil
                {
                    initAction = delegate
                    {
                        //Actor.jobs.curDriver.ticksLeftThisToil = 1200;
                        //Using ticks_left to control the time of sex
                        //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - loveToil, setting initAction");

                        /*
                         * //Hoge: W***e is just work. no feel cheatedOnMe.
                         * if (xxx.HasNonPolyPartner(Actor))
                         * {
                         *      Pawn pawn = LovePartnerRelationUtility.ExistingLovePartner(Actor);
                         *      if (((Partner != pawn) && !pawn.Dead) && ((pawn.Map == Actor.Map) || (Rand.Value < 0.15)))
                         *      {
                         *              pawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.CheatedOnMe, Actor);
                         *      }
                         * }
                         */
                        if (xxx.HasNonPolyPartnerOnCurrentMap(Partner))
                        {
                            Pawn lover = LovePartnerRelationUtility.ExistingLovePartner(Partner);
                            //Rand.PopState();
                            //Rand.PushState(RJW_Multiplayer.PredictableSeed());
                            // We have to do a few other checks because the pawn might have multiple lovers and ExistingLovePartner() might return the wrong one
                            if (lover != null && Actor != lover && !lover.Dead && (lover.Map == Partner.Map || Rand.Value < 0.25))
                            {
                                lover.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.CheatedOnMe, Partner);
                            }
                        }
                        if (!partnerHasPenis)
                        {
                            Actor.rotationTracker.Face(Partner.DrawPos);
                        }
                    },
                    defaultCompleteMode = ToilCompleteMode.Never,                     //Changed from Delay
                };
                loveToil.AddPreTickAction(delegate
                {
                    //Actor.Reserve(Partner, 1, 0);
                    --ticks_left;
                    xxx.reduce_rest(Partner);
                    xxx.reduce_rest(Actor, 2);

                    if (ticks_left <= 0)
                    {
                        ReadyForNextToil();
                    }
                    else if (pawn.IsHashIntervalTick(ticks_between_hearts))
                    {
                        MoteMaker.ThrowMetaIcon(Actor.Position, Actor.Map, ThingDefOf.Mote_Heart);
                    }
                    Actor.GainComfortFromCellIfPossible();
                    Partner.GainComfortFromCellIfPossible();
                });
                loveToil.AddFinishAction(delegate
                {
                    //Log.Message("[RJW] JobDriver_WhoreIsServingVisitors::MakeNewToils() - finished loveToil");
                    //// Trying to add some interactions and social logs
                    //xxx.processAnalSex(Partner, Actor, ref isAnalSex, partnerHasPenis);
                });
                loveToil.AddFailCondition(() => Partner.Dead || !IsInOrByBed(Bed, Partner));
                loveToil.socialMode = RandomSocialMode.Off;
                yield return(loveToil);

                Toil afterSex = new Toil
                {
                    initAction = delegate
                    {
                        // Adding interactions, social logs, etc
                        SexUtility.ProcessSex(Actor, Partner, false, false, true);

                        //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - Partner should pay the price now in afterSex.initAction");
                        int remainPrice = WhoringHelper.PayPriceToWhore(Partner, price, Actor);

                        /*if (remainPrice <= 0)
                         * {
                         *      --Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - Paying price is success");
                         * }
                         * else
                         * {
                         *      --Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - Paying price failed");
                         * }*/
                        xxx.UpdateRecords(Actor, price - remainPrice);
                        var thought = (Actor.IsPrisoner) ? thought_captive : thought_free;
                        pawn.needs.mood.thoughts.memories.TryGainMemory(thought);
                        if (SexUtility.ConsiderCleaning(pawn))
                        {
                            LocalTargetInfo cum = pawn.PositionHeld.GetFirstThing <Filth>(pawn.Map);

                            Job clean = new Job(JobDefOf.Clean);
                            clean.AddQueuedTarget(TargetIndex.A, cum);

                            pawn.jobs.jobQueue.EnqueueFirst(clean);
                        }
                    },
                    defaultCompleteMode = ToilCompleteMode.Instant
                };
                yield return(afterSex);
            }
        }
        protected override Job TryGiveJob(Pawn pawn)
        {
            bool flag = pawn.AnimalOrWildMan();
            Job  result;

            if (flag)
            {
                result = null;
            }
            else
            {
                bool flag2 = !pawn.IsColonist;
                if (flag2)
                {
                    result = null;
                }
                else
                {
                    bool drafted = pawn.Drafted;
                    if (drafted)
                    {
                        result = null;
                    }
                    else
                    {
                        bool downed = pawn.Downed;
                        if (downed)
                        {
                            result = null;
                        }
                        else
                        {
                            bool flag3 = HealthAIUtility.ShouldSeekMedicalRest(pawn);
                            if (flag3)
                            {
                                result = null;
                            }
                            else
                            {
                                CompWidowMilkableHumanoid compWidowMilkableHumanoid = pawn.TryGetComp <CompWidowMilkableHumanoid>();
                                bool flag4 = compWidowMilkableHumanoid == null;
                                if (flag4)
                                {
                                    result = null;
                                }
                                else
                                {
                                    bool flag5 = !compWidowMilkableHumanoid.ActiveAndCanBeMilked;
                                    if (flag5)
                                    {
                                        result = null;
                                    }
                                    else
                                    {
                                        bool flag6 = !compWidowMilkableHumanoid.MilkProps.canMilkThemselves;
                                        if (flag6)
                                        {
                                            result = null;
                                        }
                                        else
                                        {
                                            Pawn pawn2 = LovePartnerRelationUtility.ExistingLovePartner(pawn);
                                            bool flag7 = pawn2 != null;
                                            if (flag7)
                                            {
                                                bool flag8 = pawn.Faction == pawn2.Faction;
                                                if (flag8)
                                                {
                                                    bool flag9 = !pawn2.Drafted && !pawn2.Downed && !HealthAIUtility.ShouldSeekMedicalRest(pawn2);
                                                    if (flag9)
                                                    {
                                                        return(null);
                                                    }
                                                }
                                            }
                                            result = new Job(WidowDefOf.WidowMilkySelf);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(result);
        }
Esempio n. 8
0
        protected override IEnumerable <Toil> MakeNewToils()
        {
            this.FailOnDespawnedOrNull(PartnerInd);
            this.FailOnDespawnedNullOrForbidden(BedInd);
            this.FailOn(() => Actor is null || !xxx.CanUse(Actor, Bed) || !Actor.CanReserve(Partner));
            int price = Bed.priceOfWhore;

            yield return(Toils_Reserve.Reserve(PartnerInd, 1, 0));

            //yield return Toils_Reserve.Reserve(BedInd, Bed.SleepingSlotsCount, 0);
            bool partnerHasPenis = Genital_Helper.has_penis(Partner);

            Toil gotoWhoreBed = new Toil
            {
                initAction = delegate
                {
                    //--Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() - gotoWhoreBed initAction is called");
                    Actor.pather.StartPath(WhoreSleepSpot, PathEndMode.OnCell);
                    //Actor.Reserve(Partner, 1, 0);
                    Partner.pather.StartPath(Actor, PathEndMode.Touch);
                },
                tickAction = delegate
                {
                    if (Partner.IsHashIntervalTick(150))
                    {
                        Partner.pather.StartPath(Actor, PathEndMode.Touch);
                        //--Log.Message(Partner.NameStringShort + ": I'm following the w***e");
                    }
                },
                defaultCompleteMode = ToilCompleteMode.PatherArrival
            };

            gotoWhoreBed.FailOnWhorebedNoLongerUsable(BedInd, Bed);
            yield return(gotoWhoreBed);

            Toil waitInBed = new Toil
            {
                initAction = delegate
                {
                    //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - waitInBed, initAction is called");
                    ticksLeftThisToil = 5000;
                    ticks_left        = (int)(2000.0f * Rand.Range(0.30f, 1.30f));
                    //Actor.pather.StopDead();  //Let's just make w****s standing at the bed
                    //JobDriver curDriver = Actor.jobs.curDriver;
                    //curDriver.layingDown = LayingDownState.LayingInBed;
                    //curDriver.asleep = false;
                    var gettin_loved = new Job(xxx.gettin_loved, Actor, Bed);
                    Partner.jobs.StartJob(gettin_loved, JobCondition.InterruptForced, null, false, true, null);
                },
                tickAction = delegate
                {
                    Actor.GainComfortFromCellIfPossible();
                    if (IsInOrByBed(Bed, Partner))
                    {
                        //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - waitInBed, tickAction pass");
                        ticksLeftThisToil = 0;
                    }
                },
                defaultCompleteMode = ToilCompleteMode.Delay,
            };

            waitInBed.FailOn(() => pawn.GetRoom(RegionType.Set_Passable) == null);
            yield return(waitInBed);

            bool canAfford = xxx.CanAfford(Partner, Actor, price);

            if (canAfford)
            {
                Toil loveToil = new Toil
                {
                    initAction = delegate
                    {
                        //Actor.jobs.curDriver.ticksLeftThisToil = 1200;
                        //Using ticks_left to control the time of sex
                        //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - loveToil, setting initAction");
                        if (xxx.HasNonPolyPartner(Actor))
                        {
                            Pawn pawn = LovePartnerRelationUtility.ExistingLovePartner(Actor);
                            if (((Partner != pawn) && !pawn.Dead) && ((pawn.Map == Actor.Map) || (Rand.Value < 0.15)))
                            {
                                pawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.CheatedOnMe, Actor);
                            }
                        }
                        if (xxx.HasNonPolyPartner(Partner))
                        {
                            Pawn pawn = LovePartnerRelationUtility.ExistingLovePartner(Partner);
                            if (((Actor != pawn) && !pawn.Dead) && ((pawn.Map == Partner.Map) || (Rand.Value < 0.25)))
                            {
                                pawn.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.CheatedOnMe, Partner);
                            }
                        }
                        if (!partnerHasPenis)
                        {
                            Actor.rotationTracker.Face(Partner.DrawPos);
                        }
                    },
                    defaultCompleteMode = ToilCompleteMode.Never,                     //Changed from Delay
                };
                loveToil.AddPreTickAction(delegate
                {
                    //Actor.Reserve(Partner, 1, 0);
                    --ticks_left;
                    if (ticks_left <= 0)
                    {
                        ReadyForNextToil();
                    }
                    else if (pawn.IsHashIntervalTick(ticks_between_hearts))
                    {
                        MoteMaker.ThrowMetaIcon(Actor.Position, Actor.Map, ThingDefOf.Mote_Heart);
                    }
                    Actor.GainComfortFromCellIfPossible();
                    Partner.GainComfortFromCellIfPossible();
                });
                loveToil.AddFinishAction(delegate
                {
                    //--Log.Message("[RJW] JobDriver_WhoreIsServingVisitors::MakeNewToils() - finished loveToil");
                    //// Trying to add some interactions and social logs
                    //xxx.processAnalSex(Partner, Actor, ref isAnalSex, partnerHasPenis);
                });
                loveToil.AddFailCondition(() => Partner.Dead || !IsInOrByBed(Bed, Partner));
                loveToil.socialMode = RandomSocialMode.Off;
                yield return(loveToil);

                Toil afterSex = new Toil
                {
                    initAction = delegate
                    {
                        //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - calling aftersex in afterSex.initAction");
                        xxx.aftersex(Partner, Actor, false, false, isAnalSex);
                        //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - setting mindstate in second initAction");
                        Actor.mindState.canLovinTick = Find.TickManager.TicksGame + xxx.generate_min_ticks_to_next_lovin(Actor);
                        //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - setting mindstate again in second initAction");
                        Partner.mindState.canLovinTick = Find.TickManager.TicksGame + xxx.generate_min_ticks_to_next_lovin(Partner);

                        //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - Partner should pay the price now in afterSex.initAction");
                        int remainPrice = xxx.PayPriceToWhore(Partner, price, Actor);
                        if (remainPrice <= 0)
                        {
                            //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - Paying price is success");
                        }
                        else
                        {
                            //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - Paying price failed");
                        }
                        xxx.UpdateRecords(Actor, price - remainPrice);
                    },
                    defaultCompleteMode = ToilCompleteMode.Instant
                };
                yield return(afterSex);
            }
        }
        // Token: 0x06000009 RID: 9 RVA: 0x000023B8 File Offset: 0x000005B8
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            Pawn pawn2 = t as Pawn;
            bool flag  = pawn2 == null;
            bool flag2 = flag;
            bool result;

            if (flag2)
            {
                result = false;
            }
            else
            {
                Pawn pawn3 = LovePartnerRelationUtility.ExistingLovePartner(pawn);
                bool flag3 = pawn3 == null;
                bool flag4 = flag3;
                if (flag4)
                {
                    result = false;
                }
                else
                {
                    bool flag5 = pawn.Faction != pawn2.Faction;
                    bool flag6 = flag5;
                    if (flag6)
                    {
                        result = false;
                    }
                    else
                    {
                        bool flag7 = pawn3 != pawn2;
                        bool flag8 = flag7;
                        if (flag8)
                        {
                            result = false;
                        }
                        else
                        {
                            bool drafted = pawn3.Drafted;
                            bool flag9   = drafted;
                            if (flag9)
                            {
                                result = false;
                            }
                            else
                            {
                                bool flag10 = pawn3.CurJob != null && pawn3.jobs.curDriver.asleep;
                                bool flag11 = flag10;
                                if (flag11)
                                {
                                    result = false;
                                }
                                else
                                {
                                    bool flag12 = pawn3.CurJob != null && pawn3.CurJob.playerForced;
                                    bool flag13 = flag12;
                                    if (flag13)
                                    {
                                        result = false;
                                    }
                                    else
                                    {
                                        CompWidowMilkableHumanoid compWidowMilkableHumanoid = pawn3.TryGetComp <CompWidowMilkableHumanoid>();
                                        bool flag14 = compWidowMilkableHumanoid == null;
                                        bool flag15 = flag14;
                                        if (flag15)
                                        {
                                            result = false;
                                        }
                                        else
                                        {
                                            bool flag16 = !compWidowMilkableHumanoid.ActiveAndCanBeMilked;
                                            bool flag17 = flag16;
                                            if (flag17)
                                            {
                                                result = false;
                                            }
                                            else
                                            {
                                                bool flag18 = pawn3.CurJob != null && compWidowMilkableHumanoid.MilkProps.forbiddenJobsToInterrupt.Count > 0 && compWidowMilkableHumanoid.MilkProps.forbiddenJobsToInterrupt.Contains(pawn3.CurJob.def);
                                                bool flag19 = flag18;
                                                if (flag19)
                                                {
                                                    result = false;
                                                }
                                                else
                                                {
                                                    bool flag20 = pawn3.Position.IsForbidden(pawn);
                                                    bool flag21 = flag20;
                                                    if (flag21)
                                                    {
                                                        result = false;
                                                    }
                                                    else
                                                    {
                                                        bool flag22 = !pawn.CanReserve(new LocalTargetInfo(pawn3), 1, -1, null, false);
                                                        bool flag23 = flag22;
                                                        if (flag23)
                                                        {
                                                            result = false;
                                                        }
                                                        else
                                                        {
                                                            bool flag24 = !pawn.CanReach(new LocalTargetInfo(pawn3), PathEndMode.ClosestTouch, Danger.Deadly, false, TraverseMode.ByPawn);
                                                            result = !flag24;
                                                        }
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            return(result);
        }
Esempio n. 10
0
        public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
        {
            Pawn targetPawn = t as Pawn;

            if (targetPawn == null)
            {
                return(false);
            }

            Pawn lover = LovePartnerRelationUtility.ExistingLovePartner(pawn);

            if (lover == null)
            {
                return(false);
            }

            if (pawn.Faction != targetPawn.Faction)
            {
                return(false);
            }

            if (lover != targetPawn)
            {
                return(false);
            }

            if (lover.Drafted)
            {
                return(false);
            }

            //Do not try to milk sleeping lovers. Its rude.
            if (lover.CurJob != null && lover.jobs.curDriver.asleep)
            {
                return(false);
            }

            //Do not intervene in player forced jobs.
            if (lover.CurJob != null && lover.CurJob.playerForced)
            {
                return(false);
            }

            CompMilkableHumanoid spouseMilkComp = lover.TryGetComp <CompMilkableHumanoid>();

            if (spouseMilkComp == null)
            {
                return(false);
            }

            if (!spouseMilkComp.ActiveAndCanBeMilked)
            {
                return(false);
            }

            //Do not interrupt forbidden jobs.
            if (lover.CurJob != null && spouseMilkComp.MilkProps.forbiddenJobsToInterrupt.Count > 0 &&
                spouseMilkComp.MilkProps.forbiddenJobsToInterrupt.Contains(lover.CurJob.def))
            {
                return(false);
            }

            if (lover.Position.IsForbidden(pawn))
            {
                return(false);
            }

            if (!pawn.CanReserve(new LocalTargetInfo(lover)))
            {
                return(false);
            }

            if (!pawn.CanReach(new LocalTargetInfo(lover), PathEndMode.ClosestTouch, Danger.Deadly))
            {
                return(false);
            }

            return(true);
        }
Esempio n. 11
0
        public static Pawn FindAttractivePawn(Pawn p1, out int price)
        {
            price = 0;
            if (p1 == null)
            {
                //--Log.Message("[RJW] JobGiver_WhoreInvitingVisitors::FindAttractivePawn - p1 is null");
                return(null);
            }
            FindAttractivePawnHelper findPawnHelper = new FindAttractivePawnHelper
            {
                p1 = p1
            };

            if (xxx.RomanceDiversifiedIsActive && findPawnHelper.p1.story.traits.HasTrait(xxx.asexual))
            {
                return(null);
            }
            price = xxx.PriceOfWhore(p1);

            int priceOfWhore = price;
            IEnumerable <Pawn> guestsSpawned = p1.Map.mapPawns.AllPawnsSpawned;

            guestsSpawned = (guestsSpawned.Except(guestsSpawned.Where(findPawnHelper.TraitCheckFail)).Where(findPawnHelper.FactionCheckPass));
            if (guestsSpawned.Count() > 0)
            {
                guestsSpawned = guestsSpawned.Where((x => !x.Position.IsForbidden(p1) && (!LovePartnerRelationUtility.HasAnyLovePartner(x) || x != LovePartnerRelationUtility.ExistingLovePartner(p1)) && Roll_to_skip(x, p1) && xxx.CanAfford(x, p1, priceOfWhore) && p1.CanReserve(x, 1, 0)));
            }
            Pawn whoreTarget = null;

            if (guestsSpawned.Count() > 0)
            {
                guestsSpawned.TryRandomElement(out whoreTarget);
            }
            if (whoreTarget != null)
            {
                return(whoreTarget);
            }
            //--Log.Message("[RJW] JobGiver_WhoreInvitingVisitors::FindAttractivePawn - found no visitors");

            if (!xxx.WillPawnTryHookup(p1))
            {
                return(null);
            }
            whoreTarget = null;
            IEnumerable <Pawn> freeColonistsSpawned = findPawnHelper.p1.Map.mapPawns.FreeColonistsSpawned;

            freeColonistsSpawned = (freeColonistsSpawned.Except(freeColonistsSpawned.Where(findPawnHelper.TraitCheckFail)).Where(x => findPawnHelper.RelationCheckPass(x) && !x.Position.IsForbidden(p1) && Roll_to_skip(x, p1) && p1.CanReserve(x, 1, 0)));
            if (freeColonistsSpawned == null || !freeColonistsSpawned.Any())
            {
                return(null);
            }
            freeColonistsSpawned.TryRandomElement(out whoreTarget);
            if (whoreTarget == null)
            {
                return(null);
            }
            if (p1.relations.SecondaryRomanceChanceFactor(whoreTarget) < 0.05f)
            {
                return(null);
            }
            return(whoreTarget);
        }
Esempio n. 12
0
        // Token: 0x0600000C RID: 12 RVA: 0x000025E8 File Offset: 0x000007E8
        protected override Job TryGiveJob(Pawn pawn)
        {
            if (pawn.AnimalOrWildMan())
            {
                return(null);
            }

            if (!pawn.IsColonist)
            {
                return(null);
            }

            var drafted = pawn.Drafted;

            if (drafted)
            {
                return(null);
            }

            var downed = pawn.Downed;

            if (downed)
            {
                return(null);
            }

            if (HealthAIUtility.ShouldSeekMedicalRest(pawn))
            {
                return(null);
            }

            var compWidowMilkableHumanoid = pawn.TryGetComp <CompWidowMilkableHumanoid>();

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

            if (!compWidowMilkableHumanoid.ActiveAndCanBeMilked)
            {
                return(null);
            }

            if (!compWidowMilkableHumanoid.MilkProps.canMilkThemselves)
            {
                return(null);
            }

            var pawn2 = LovePartnerRelationUtility.ExistingLovePartner(pawn);

            if (pawn2 == null)
            {
                return(new Job(WidowDefOf.WidowMilkySelf));
            }

            if (pawn.Faction != pawn2.Faction)
            {
                return(new Job(WidowDefOf.WidowMilkySelf));
            }

            if (!pawn2.Drafted && !pawn2.Downed &&
                !HealthAIUtility.ShouldSeekMedicalRest(pawn2))
            {
                return(null);
            }

            return(new Job(WidowDefOf.WidowMilkySelf));
        }
        protected override IEnumerable <Toil> MakeNewToils()
        {
            //Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() - making toils");
            setup_ticks();

            this.FailOnDespawnedOrNull(iTarget);
            this.FailOnDespawnedNullOrForbidden(iBed);
            //Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() fail conditions check " + !xxx.CanUse(pawn, Bed) + " " + !pawn.CanReserve(Partner));
            this.FailOn(() => !xxx.CanUse(pawn, Bed) || !pawn.CanReserve(Partner));
            this.FailOn(() => pawn.Drafted);
            this.FailOn(() => Partner.IsFighting());
            this.FailOn(() => !Partner.CanReach(pawn, PathEndMode.Touch, Danger.Deadly));

            yield return(Toils_Reserve.Reserve(iTarget, 1, 0));

            //yield return Toils_Reserve.Reserve(BedInd, Bed.SleepingSlotsCount, 0);

            //Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() - generate toils");
            Toil gotoBed = new Toil();

            gotoBed.defaultCompleteMode = ToilCompleteMode.PatherArrival;
            gotoBed.FailOnWhorebedNoLongerUsable(iBed, Bed);
            gotoBed.AddFailCondition(() => Partner.Downed);
            gotoBed.FailOn(() => !Partner.CanReach(Bed, PathEndMode.Touch, Danger.Deadly));
            gotoBed.initAction = delegate
            {
                //Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() - gotoWhoreBed initAction is called");
                pawn.pather.StartPath(SleepSpot, PathEndMode.OnCell);
                Partner.jobs.StopAll();
                Job job = JobMaker.MakeJob(JobDefOf.GotoMindControlled, SleepSpot);
                Partner.jobs.StartJob(job, JobCondition.InterruptForced);
            };
            yield return(gotoBed);

            ticks_left = (int)(2000.0f * Rand.Range(0.30f, 1.30f));

            Toil waitInBed = new Toil();

            waitInBed.initAction = delegate
            {
                ticksLeftThisToil = 5000;
            };
            waitInBed.tickAction = delegate
            {
                pawn.GainComfortFromCellIfPossible();
                if (IsInOrByBed(Bed, Partner) && pawn.PositionHeld == Partner.PositionHeld)
                {
                    ReadyForNextToil();
                }
            };
            waitInBed.defaultCompleteMode = ToilCompleteMode.Delay;
            yield return(waitInBed);

            Toil StartPartnerJob = new Toil();

            StartPartnerJob.defaultCompleteMode = ToilCompleteMode.Instant;
            StartPartnerJob.socialMode          = RandomSocialMode.Off;
            StartPartnerJob.initAction          = delegate
            {
                //Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() - StartPartnerJob");
                var gettin_loved = JobMaker.MakeJob(xxx.gettin_loved, pawn, Bed);
                Partner.jobs.StartJob(gettin_loved, JobCondition.InterruptForced);
            };
            yield return(StartPartnerJob);

            Toil loveToil = new Toil();

            loveToil.AddFailCondition(() => Partner.Dead || Partner.CurJobDef != xxx.gettin_loved);
            loveToil.defaultCompleteMode = ToilCompleteMode.Never;
            loveToil.socialMode          = RandomSocialMode.Off;
            loveToil.handlingFacing      = true;
            loveToil.initAction          = delegate
            {
                //Log.Message("[RJW]JobDriver_WhoreIsServingVisitors::MakeNewToils() - loveToil");
                // TODO: replace this quick n dirty way
                CondomUtility.GetCondomFromRoom(pawn);

                // Try to use w***e's condom first, then client's
                usedCondom = CondomUtility.TryUseCondom(pawn) || CondomUtility.TryUseCondom(Partner);

                Start();

                if (xxx.HasNonPolyPartnerOnCurrentMap(Partner))
                {
                    Pawn lover = LovePartnerRelationUtility.ExistingLovePartner(Partner);
                    // We have to do a few other checks because the pawn might have multiple lovers and ExistingLovePartner() might return the wrong one
                    if (lover != null && pawn != lover && !lover.Dead && (lover.Map == Partner.Map || Rand.Value < 0.25))
                    {
                        lover.needs.mood.thoughts.memories.TryGainMemory(ThoughtDefOf.CheatedOnMe, Partner);
                    }
                }
            };
            loveToil.AddPreTickAction(delegate
            {
                --ticks_left;
                if (pawn.IsHashIntervalTick(ticks_between_hearts))
                {
                    if (xxx.is_nympho(pawn))
                    {
                        ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Mote_Heart);
                    }
                    else
                    {
                        ThrowMetaIcon(pawn.Position, pawn.Map, xxx.mote_noheart);
                    }
                }
                SexUtility.reduce_rest(Partner, 1);
                SexUtility.reduce_rest(pawn, 2);
                if (ticks_left <= 0)
                {
                    ReadyForNextToil();
                }
            });
            loveToil.AddFinishAction(delegate
            {
                End();
            });
            yield return(loveToil);

            Toil afterSex = new Toil
            {
                initAction = delegate
                {
                    // Adding interactions, social logs, etc
                    SexUtility.ProcessSex(pawn, Partner, usedCondom: usedCondom, whoring: isWhoring, sextype: sexType);

                    if (!(Partner.IsColonist && (pawn.IsPrisonerOfColony || pawn.IsColonist)))
                    {
                        int price = WhoringHelper.PriceOfWhore(pawn);
                        //--Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - Partner should pay the price now in afterSex.initAction");
                        int remainPrice = WhoringHelper.PayPriceToWhore(Partner, price, pawn);

                        /*if (remainPrice <= 0)
                         * {
                         *      --Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - Paying price is success");
                         * }
                         * else
                         * {
                         *      --Log.Message("JobDriver_WhoreIsServingVisitors::MakeNewToils() - Paying price failed");
                         * }*/
                        xxx.UpdateRecords(pawn, price - remainPrice);
                    }
                    var thought = (pawn.IsPrisoner || xxx.is_slave(pawn)) ? thought_captive : thought_free;
                    pawn.needs.mood.thoughts.memories.TryGainMemory(thought);
                    if (SexUtility.ConsiderCleaning(pawn))
                    {
                        LocalTargetInfo cum = pawn.PositionHeld.GetFirstThing <Filth>(pawn.Map);

                        Job clean = JobMaker.MakeJob(JobDefOf.Clean);
                        clean.AddQueuedTarget(TargetIndex.A, cum);

                        pawn.jobs.jobQueue.EnqueueFirst(clean);
                    }
                },
                defaultCompleteMode = ToilCompleteMode.Instant
            };

            yield return(afterSex);
        }