Add project files.

This commit is contained in:
c0ffeeeeeeee 2020-11-05 14:09:05 -08:00
parent d2dbc71d94
commit 39924e2af5
17 changed files with 487 additions and 0 deletions

View file

@ -0,0 +1,77 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Verse;
using RimWorld;
using rjw;
using Verse.AI;
namespace RJW_ToysAndMasturbation {
class JobDriver_MasturbateWithToy : JobDriver_SexBaseInitiator {
public IntVec3 cell => (IntVec3)job.GetTarget(iCell);
public override bool TryMakePreToilReservations(bool errorOnFailed) {
return ReservationUtility.Reserve(pawn, job.targetA, job, stackCount: 1, errorOnFailed: false);
}
public new void setup_ticks() {
base.setup_ticks();
duration = (int)(xxx.is_frustrated(base.pawn) ? (2500f * Rand.Range(0.2f, 0.7f)) : (2500f * Rand.Range(0.2f, 0.4f)));
}
protected override IEnumerable<Toil> MakeNewToils() {
setup_ticks();
ToilFailConditions.FailOn(this, () => pawn.Downed);
ToilFailConditions.FailOn(this, () => pawn.IsBurning());
ToilFailConditions.FailOn(this, () => pawn.IsFighting());
ToilFailConditions.FailOn(this, () => pawn.Drafted);
yield return Toils_Goto.GotoThing(TargetIndex.A, PathEndMode.ClosestTouch).FailOnDespawnedNullOrForbidden(TargetIndex.A);
yield return Toils_Haul.StartCarryThing(TargetIndex.A);
if (!SexToyUtility.isRJWAnimationsLoaded || true /*True for now, anims come later; disable once created animations*/) {
//place down if anims isn't loaded
yield return Toils_Haul.CarryHauledThingToCell(TargetIndex.C);
yield return Toils_Haul.PlaceHauledThingInCell(TargetIndex.C, Toils_Goto.GotoCell(TargetIndex.C, PathEndMode.OnCell), storageMode: false);
}
yield return Toils_Goto.GotoCell(TargetIndex.C, PathEndMode.OnCell);
Toil masturbationToil = Toils_General.Wait(duration);
masturbationToil.handlingFacing = true;
masturbationToil.defaultCompleteMode = ToilCompleteMode.Never;
masturbationToil.initAction = delegate { Start(); };
masturbationToil.tickAction = delegate {
duration--;
if (Gen.IsHashIntervalTick(pawn, ticks_between_hearts)) {
ThrowMetaIcon(pawn.Position, pawn.Map, ThingDefOf.Mote_Heart);
}
SexTick(pawn, null);
SexUtility.reduce_rest(pawn);
if (duration <= 0) ReadyForNextToil();
};
masturbationToil.AddFinishAction(delegate { End(); });
yield return masturbationToil;
Toil AfterToil = new Toil();
AfterToil.initAction = delegate {
SexUtility.Aftersex(pawn);
if(SexUtility.ConsiderCleaning(pawn)) {
LocalTargetInfo filth = GridsUtility.GetFirstThing<Filth>(pawn.PositionHeld, pawn.Map);
Job cleanup = JobMaker.MakeJob(JobDefOf.Clean);
cleanup.AddQueuedTarget(TargetIndex.A, filth);
pawn.jobs.jobQueue.EnqueueFirst(cleanup);
}
};
yield return AfterToil;
}
}
}