protected override IEnumerable <Toil> MakeNewToils()
        {
            //this.FailOn(() => PawnUtility.PlayerForcedJobNowOrSoon(pawn));
            this.FailOn(() => pawn.health.Downed);
            this.FailOn(() => pawn.IsBurning());
            this.FailOn(() => pawn.IsFighting());
            this.FailOn(() => pawn.Drafted);

            //Rand.PopState();
            //Rand.PushState(RJW_Multiplayer.PredictableSeed());
            // Faster fapping when frustrated.
            ticks_left = (int)(xxx.need_some_sex(pawn) > 2f ? 2500.0f * Rand.Range(0.2f, 0.7f) : 2500.0f * Rand.Range(0.2f, 0.4f));

            Toil findfapspot = new Toil
            {
                initAction = delegate
                {
                    pawn.pather.StartPath(cell, PathEndMode.OnCell);
                },
                defaultCompleteMode = ToilCompleteMode.PatherArrival
            };

            yield return(findfapspot);

            //Log.Message("[RJW] Making new toil for QuickFap.");

            Toil fap = Toils_General.Wait(ticks_left);

            fap.tickAction = delegate
            {
                --ticks_left;
                xxx.reduce_rest(pawn, 1);
                if (ticks_left <= 0)
                {
                    ReadyForNextToil();
                }
                else if (pawn.IsHashIntervalTick(ticks_between_hearts))
                {
                    MoteMaker.ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Mote_Heart);
                }
            };
            fap.AddFinishAction(delegate
            {
                SexUtility.Aftersex(pawn, xxx.rjwSextype.Masturbation);
                if (!SexUtility.ConsiderCleaning(pawn))
                {
                    return;
                }

                LocalTargetInfo own_cum = pawn.PositionHeld.GetFirstThing <Filth>(pawn.Map);

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

                pawn.jobs.jobQueue.EnqueueFirst(clean);
            });
            yield return(fap);
        }
        protected override IEnumerable <Toil> MakeNewToils()
        {
            // Faster fapping when frustrated.
            //Rand.PopState();
            //Rand.PushState(RJW_Multiplayer.PredictableSeed());
            ticks_left = (int)(xxx.need_some_sex(pawn) > 2f ? 2500.0f * Rand.Range(0.2f, 0.7f) : 2500.0f * Rand.Range(0.2f, 0.4f));

            this.FailOnDespawnedOrNull(ibed);
            this.FailOn(() => pawn.Drafted);
            this.KeepLyingDown(ibed);
            yield return(Toils_Bed.ClaimBedIfNonMedical(ibed));

            yield return(Toils_Bed.GotoBed(ibed));

            Toil do_fappin = Toils_LayDown.LayDown(ibed, true, false, false, false);

            do_fappin.AddPreTickAction(delegate
            {
                --ticks_left;
                xxx.reduce_rest(pawn, 1);
                if (ticks_left <= 0)
                {
                    ReadyForNextToil();
                }
                else if (pawn.IsHashIntervalTick(ticks_between_hearts))
                {
                    MoteMaker.ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Mote_Heart);
                }
            });
            do_fappin.AddFinishAction(delegate
            {
                //Moved satisfy and tick increase to aftersex, since it works with solo acts now.
                SexUtility.Aftersex(pawn, xxx.rjwSextype.Masturbation);
                if (SexUtility.ConsiderCleaning(pawn))
                {
                    LocalTargetInfo own_cum = pawn.PositionHeld.GetFirstThing <Filth>(pawn.Map);

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

                    pawn.jobs.jobQueue.EnqueueFirst(clean);
                }
            });
            do_fappin.socialMode = RandomSocialMode.Off;
            yield return(do_fappin);
        }
        protected override IEnumerable <Toil> MakeNewToils()
        {
            setup_ticks();

            //this.FailOn(() => PawnUtility.PlayerForcedJobNowOrSoon(pawn));
            this.FailOn(() => pawn.health.Downed);
            this.FailOn(() => pawn.IsBurning());
            this.FailOn(() => pawn.IsFighting());
            this.FailOn(() => pawn.Drafted);

            Toil findfapspot = new Toil
            {
                initAction = delegate
                {
                    pawn.pather.StartPath(cell, PathEndMode.OnCell);
                },
                defaultCompleteMode = ToilCompleteMode.PatherArrival
            };

            yield return(findfapspot);

            //Log.Message("[RJW] Making new toil for QuickFap.");

            Toil fap = Toils_General.Wait(duration);

            fap.handlingFacing = true;
            fap.initAction     = delegate
            {
                Start();
            };
            fap.tickAction = delegate
            {
                --duration;
                if (pawn.IsHashIntervalTick(ticks_between_hearts))
                {
                    ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Mote_Heart);
                }
                SexTick(pawn, null);
                SexUtility.reduce_rest(pawn, 1);
                if (duration <= 0)
                {
                    ReadyForNextToil();
                }
            };
            fap.AddFinishAction(delegate
            {
                End();
            });
            yield return(fap);

            yield return(new Toil
            {
                initAction = delegate
                {
                    SexUtility.Aftersex(pawn, xxx.rjwSextype.Masturbation);
                    if (!SexUtility.ConsiderCleaning(pawn))
                    {
                        return;
                    }

                    LocalTargetInfo own_cum = pawn.PositionHeld.GetFirstThing <Filth>(pawn.Map);

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

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