protected override IEnumerable <Toil> MakeNewToils() { rotateToFace = Facing; AddEndCondition(delegate { if (ExecutionerPawn == null) { return(JobCondition.Incompletable); } if (ExecutionerPawn.CurJob == null) { return(JobCondition.Incompletable); } if (ExecutionerPawn.CurJob.def == CultsDefOf.Cults_ReflectOnResult) { return(JobCondition.Succeeded); } if (ExecutionerPawn.CurJob.def != CultsDefOf.Cults_HoldSacrifice) { return(JobCondition.Incompletable); } return(JobCondition.Ongoing); }); this.EndOnDespawnedOrNull(Spot); this.EndOnDespawnedOrNull(Build); yield return(Toils_Reserve.Reserve(Spot)); //Toil 1: Go to the locations Toil gotoExecutioner; if (TargetC.HasThing) { gotoExecutioner = Toils_Goto.GotoThing(Spot, PathEndMode.OnCell); } else { gotoExecutioner = Toils_Goto.GotoCell(Spot, PathEndMode.OnCell); } yield return(gotoExecutioner); //Toil 2: 'Attend' var altarToil = new Toil { defaultCompleteMode = ToilCompleteMode.Delay, defaultDuration = CultUtility.ritualDuration }; altarToil.AddPreTickAction(() => { pawn.GainComfortFromCellIfPossible(); pawn.rotationTracker.FaceCell(TargetB.Cell); if (report == "") { report = "Cults_AttendingSacrifice".Translate(); } if (ExecutionerPawn != null) { if (ExecutionerPawn.CurJob != null) { if (ExecutionerPawn.CurJob.def != CultsDefOf.Cults_HoldSacrifice) { ReadyForNextToil(); } } } }); altarToil.JumpIf(() => ExecutionerPawn.CurJob.def == CultsDefOf.Cults_HoldSacrifice, altarToil); yield return(altarToil); //ToDo -- Add random Ia! Ia! yield return(new Toil { initAction = delegate { //Do something? Ia ia! }, defaultCompleteMode = ToilCompleteMode.Instant }); //Toil 3 Reflect on worship var reflectingTime = new Toil { defaultCompleteMode = ToilCompleteMode.Delay, defaultDuration = CultUtility.reflectDuration }; reflectingTime.AddPreTickAction(() => report = "Cults_ReflectingOnSacrifice".Translate()); yield return(reflectingTime); //Toil 3 Reset the altar and clear variables. yield return(new Toil { initAction = delegate { if (Altar != null) { if (Altar.currentSacrificeState != Building_SacrificialAltar.SacrificeState.finished) { Altar.ChangeState(Building_SacrificialAltar.State.sacrificing, Building_SacrificialAltar.SacrificeState.finished); } } }, defaultCompleteMode = ToilCompleteMode.Instant }); AddFinishAction(() => { //When the ritual is finished -- then let's give the thoughts /* * if (Altar.currentSacrificeState == Building_SacrificialAltar.SacrificeState.finished) * { * if (this.pawn == null) return; * if (Altar.sacrifice != null) * { * CultUtility.AttendSacrificeTickCheckEnd(this.pawn, Altar.sacrifice); * } * else * { * CultUtility.AttendSacrificeTickCheckEnd(this.pawn, null); * } * } */ if (TargetC.Cell.GetEdifice(pawn.Map) != null) { if (pawn.Map.reservationManager.ReservedBy(TargetC.Cell.GetEdifice(pawn.Map), pawn)) { pawn.ClearAllReservations(); // this.pawn.Map.reservationManager.Release(this.TargetC.Cell.GetEdifice(this.pawn.Map), pawn); } } else { if (pawn.Map.reservationManager.ReservedBy(TargetC.Cell.GetEdifice(pawn.Map), pawn)) { pawn.ClearAllReservations(); //this.pawn.Map.reservationManager.Release(this.job.targetC.Cell, this.pawn); } } }); }