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 }); }