根据向量相似度分析,与 'PsychicRitualToil_GatherOfferings' 最相关的代码定义如下: --- **文件路径 (精确匹配):** `C:\Steam\steamapps\common\RimWorld\Data\dll1.6\Verse.AI.Group\PsychicRitualToil_GatherOfferings.txt` ```csharp public class PsychicRitualToil_GatherOfferings : PsychicRitualToil { protected PsychicRitualRoleDef gathererRole; protected bool offeringsGathered; protected IngredientCount requiredOffering; protected PsychicRitualToil_GatherOfferings() { } public PsychicRitualToil_GatherOfferings(PsychicRitualRoleDef offeringGatherer, IngredientCount requiredOffering) { gathererRole = offeringGatherer; this.requiredOffering = requiredOffering; } public override void UpdateAllDuties(PsychicRitual psychicRitual, PsychicRitualGraph parent) { DutyDef def; if (offeringsGathered || PawnsHaveOfferings(psychicRitual)) { offeringsGathered = true; def = DutyDefOf.Idle; } else { def = DutyDefOf.GatherOfferingsForPsychicRitual; } foreach (Pawn item in psychicRitual.assignments.AssignedPawns(gathererRole)) { SetPawnDuty(item, psychicRitual, parent, def); } } public override bool Tick(PsychicRitual psychicRitual, PsychicRitualGraph parent) { return offeringsGathered; } public override void ExposeData() { base.ExposeData(); Scribe_Defs.Look(ref gathererRole, "gathererRole"); Scribe_Values.Look(ref offeringsGathered, "offeringsGathered", defaultValue: false); Scribe_Deep.Look(ref requiredOffering, "requiredOffering"); } public static float PawnsOfferingCount(IEnumerable pawns, IngredientCount offering) { float num = 0f; foreach (Pawn pawn in pawns) { foreach (Thing item in (IEnumerable)pawn.inventory.GetDirectlyHeldThings()) { if (offering.filter.Allows(item)) { num += (float)item.stackCount; if (num >= offering.GetBaseCount()) { return offering.GetBaseCount(); } } } } return num; } private bool PawnsHaveOfferings(PsychicRitual psychicRitual) { float baseCount = requiredOffering.GetBaseCount(); return PawnsOfferingCount(psychicRitual.assignments.AssignedPawns(gathererRole), requiredOffering) >= baseCount; } public override void Notify_PawnJobDone(PsychicRitual psychicRitual, PsychicRitualGraph parent, Pawn pawn, Job job, JobCondition condition) { base.Notify_PawnJobDone(psychicRitual, parent, pawn, job, condition); if (psychicRitual.assignments.RoleForPawn(pawn) == gathererRole && (offeringsGathered || PawnsHaveOfferings(psychicRitual))) { offeringsGathered = true; SetPawnDuty(pawn, psychicRitual, parent, DutyDefOf.Idle); } } public override ThinkResult Notify_DutyResult(PsychicRitual psychicRitual, PsychicRitualGraph parent, ThinkResult result, Pawn pawn, JobIssueParams issueParams) { result = base.Notify_DutyResult(psychicRitual, parent, result, pawn, issueParams); if (result.Job != null) { return result; } if (psychicRitual.assignments.RoleForPawn(pawn) != gathererRole) { return result; } if (offeringsGathered || PawnsHaveOfferings(psychicRitual)) { offeringsGathered = true; SetPawnDuty(pawn, psychicRitual, parent, DutyDefOf.Idle); return new ThinkResult(JobMaker.MakeJob(JobDefOf.Wait, 1), null); } TaggedString reason = "PsychicRitualToil_GatherOfferings_OfferingUnavailable".Translate(pawn.Named("PAWN"), requiredOffering.filter.Summary); psychicRitual.LeaveOrCancelPsychicRitual(gathererRole, pawn, reason); return result; } public override string GetJobReport(PsychicRitual psychicRitual, PsychicRitualGraph parent, Pawn pawn) { if (psychicRitual.assignments.RoleForPawn(pawn) == gathererRole) { return "PsychicRitualToil_GatherOfferings_JobReport".Translate(); } return base.GetJobReport(psychicRitual, parent, pawn); } } ``` --- **文件路径:** `C:\Steam\steamapps\common\RimWorld\Data\dll1.6\RimWorld\JobGiver_GatherOfferingsForPsychicRitual.txt` **相似度:** 0.8171 ```csharp public class JobGiver_GatherOfferingsForPsychicRitual : ThinkNode_JobGiver { protected override Job TryGiveJob(Pawn pawn) { Lord lord = pawn.GetLord(); if (lord == null) { return null; } if (!(lord.CurLordToil is LordToil_PsychicRitual lordToil_PsychicRitual)) { return null; } PsychicRitualDef def = lordToil_PsychicRitual.RitualData.psychicRitual.def; PsychicRitualDef_InvocationCircle ritualDef = def as PsychicRitualDef_InvocationCircle; if (ritualDef == null) { return null; } if (ritualDef.RequiredOffering == null) { return null; } PsychicRitual psychicRitual = lordToil_PsychicRitual.RitualData.psychicRitual; PsychicRitualRoleDef psychicRitualRoleDef = psychicRitual.assignments.RoleForPawn(pawn); if (psychicRitualRoleDef == null) { return null; } float num = PsychicRitualToil_GatherOfferings.PawnsOfferingCount(psychicRitual.assignments.AssignedPawns(psychicRitualRoleDef), ritualDef.RequiredOffering); int needed = Mathf.CeilToInt(ritualDef.RequiredOffering.GetBaseCount() - num); if (needed == 0) { return null; } Thing thing2 = GenClosest.ClosestThingReachable(pawn.PositionHeld, pawn.MapHeld, ThingRequest.ForGroup(ThingRequestGroup.HaulableAlways), PathEndMode.Touch, TraverseParms.For(pawn), 9999f, delegate(Thing thing) { if (!ritualDef.RequiredOffering.filter.Allows(thing)) { return false; } if (thing.IsForbidden(pawn)) { return false; } int stackCount = Mathf.Min(needed, thing.stackCount); return pawn.CanReserve(thing, 10, stackCount) ? true : false; }); if (thing2 == null) { return null; } Job job = JobMaker.MakeJob(JobDefOf.TakeCountToInventory, thing2); job.count = Mathf.Min(needed, thing2.stackCount); return job; } } ``` --- **文件路径:** `C:\Steam\steamapps\common\RimWorld\Data\dll1.6\Verse.AI.Group\PsychicRitualToil_GatherForInvocation.txt` **相似度:** 0.7774 ```csharp public class PsychicRitualToil_GatherForInvocation : PsychicRitualToil_Multiplex { protected PsychicRitualToil_Goto fallbackToil; protected PsychicRitualGraph invokerToil; protected PsychicRitualToil_Goto invokerFinalToil; private static List blockingPawns = new List(16); protected PsychicRitualToil_GatherForInvocation() { } protected PsychicRitualToil_GatherForInvocation(PsychicRitualDef_InvocationCircle def, PsychicRitualToil_Goto fallbackToil, PsychicRitualGraph invokerToil) : base(new Dictionary { { def.InvokerRole, invokerToil } }, fallbackToil) { this.fallbackToil = fallbackToil; this.invokerToil = invokerToil; invokerFinalToil = (PsychicRitualToil_Goto)invokerToil.GetToil(invokerToil.ToilCount - 1); } public PsychicRitualToil_GatherForInvocation(PsychicRitual psychicRitual, PsychicRitualDef_InvocationCircle def, IReadOnlyDictionary> rolePositions) : this(def, FallbackToil(psychicRitual, def, rolePositions), InvokerToil(def, rolePositions)) { } public override void ExposeData() { base.ExposeData(); Scribe_References.Look(ref fallbackToil, "fallbackToil"); Scribe_References.Look(ref invokerToil, "invokerToil"); Scribe_References.Look(ref invokerFinalToil, "invokerFinalToil"); } public override string GetReport(PsychicRitual psychicRitual, PsychicRitualGraph parent) { blockingPawns.Clear(); blockingPawns.AddRange(fallbackToil.BlockingPawns); if (invokerToil.CurrentToil == invokerFinalToil) { blockingPawns.AddRange(invokerFinalToil.BlockingPawns); } else { blockingPawns.AddRange(invokerFinalToil.ControlledPawns(psychicRitual)); } string text = "PsychicRitualToil_GatherForInvocation_Report".Translate(); string text2 = blockingPawns.Select((Pawn pawn) => pawn.LabelShortCap).ToCommaList(); return text + ": " + text2; } public static PsychicRitualToil_Goto FallbackToil(PsychicRitual psychicRitual, PsychicRitualDef_InvocationCircle def, IReadOnlyDictionary> rolePositions) { return new PsychicRitualToil_Goto(rolePositions.Slice(rolePositions.Keys.Except(def.InvokerRole))); } public static PsychicRitualGraph InvokerToil(PsychicRitualDef_InvocationCircle def, IReadOnlyDictionary> rolePositions) { return new PsychicRitualGraph(InvokerGatherPhaseToils(def, rolePositions)) { willAdvancePastLastToil = false }; } public static IEnumerable InvokerGatherPhaseToils(PsychicRitualDef_InvocationCircle def, IReadOnlyDictionary> rolePositions) { if (def.RequiredOffering != null) { yield return new PsychicRitualToil_GatherOfferings(def.InvokerRole, def.RequiredOffering); } if (def.TargetRole != null) { yield return new PsychicRitualToil_CarryAndGoto(def.InvokerRole, def.TargetRole, rolePositions); } yield return new PsychicRitualToil_Goto(rolePositions.Slice(def.InvokerRole)); } } ```