using System.Collections.Generic; using RimWorld; using rjw; using Verse; using Verse.AI; namespace RJWSexperience.Ideology { public class LewdTrainBase : JobDriver_SexBaseInitiator { public override bool TryMakePreToilReservations(bool errorOnFailed) { return pawn.Reserve(Target, job, 1, 0, null, errorOnFailed); } protected override IEnumerable MakeNewToils() { setup_ticks(); var PartnerJob = RsiDefOf.Job.TrainLewd_Reciever; this.FailOnDespawnedOrNull(iTarget); this.FailOn(() => !pawn.CanReserveAndReach(Partner, PathEndMode.OnCell, Danger.Deadly)); this.FailOn(() => pawn.Drafted); this.FailOn(() => Partner.IsFighting()); yield return Toils_Reserve.Reserve(iTarget, 1, 0); yield return Toils_Goto.GotoThing(iTarget, PathEndMode.OnCell); var StartPartnerJob = new Toil(); StartPartnerJob.defaultCompleteMode = ToilCompleteMode.Instant; StartPartnerJob.socialMode = RandomSocialMode.Off; StartPartnerJob.initAction = delegate { Partner.jobs.StartJob( JobMaker.MakeJob(PartnerJob, pawn), JobCondition.InterruptForced ); }; yield return StartPartnerJob; var sexToil = new Toil(); sexToil.defaultCompleteMode = ToilCompleteMode.Never; sexToil.defaultDuration = duration; sexToil.handlingFacing = true; sexToil.initAction = delegate { Partner.pather.StopDead(); Partner.jobs.curDriver.asleep = false; Start(); }; sexToil.tickAction = delegate { if (pawn.IsHashIntervalTick(ticks_between_hearts)) ThrowMetaIconF(pawn.Position, pawn.Map, FleckDefOf.Heart); SexTick(pawn, Partner); if (!Partner.Dead) SexUtility.reduce_rest(Partner, 1); SexUtility.reduce_rest(pawn, 2); if (ticks_left <= 0) ReadyForNextToil(); }; sexToil.FailOn(() => Partner.CurJob?.def != PartnerJob); sexToil.AddFinishAction(End); yield return sexToil; yield return new Toil { initAction = () => SexUtility.ProcessSex(Sexprops), defaultCompleteMode = ToilCompleteMode.Instant }; } } }