rjw-sexperience-ideology/Source/IdeologyAddon/SexTame/JobDriver_LewdTrainBase.cs
2025-01-27 21:36:30 +05:00

75 lines
2 KiB
C#

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