270 lines
8.8 KiB
Plaintext
270 lines
8.8 KiB
Plaintext
根据向量相似度分析,与 '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<Pawn> pawns, IngredientCount offering)
|
|
{
|
|
float num = 0f;
|
|
foreach (Pawn pawn in pawns)
|
|
{
|
|
foreach (Thing item in (IEnumerable<Thing>)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<Pawn> blockingPawns = new List<Pawn>(16);
|
|
|
|
protected PsychicRitualToil_GatherForInvocation()
|
|
{
|
|
}
|
|
|
|
protected PsychicRitualToil_GatherForInvocation(PsychicRitualDef_InvocationCircle def, PsychicRitualToil_Goto fallbackToil, PsychicRitualGraph invokerToil)
|
|
: base(new Dictionary<PsychicRitualRoleDef, PsychicRitualToil> { { 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<PsychicRitualRoleDef, List<IntVec3>> 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<PsychicRitualRoleDef, List<IntVec3>> rolePositions)
|
|
{
|
|
return new PsychicRitualToil_Goto(rolePositions.Slice(rolePositions.Keys.Except(def.InvokerRole)));
|
|
}
|
|
|
|
public static PsychicRitualGraph InvokerToil(PsychicRitualDef_InvocationCircle def, IReadOnlyDictionary<PsychicRitualRoleDef, List<IntVec3>> rolePositions)
|
|
{
|
|
return new PsychicRitualGraph(InvokerGatherPhaseToils(def, rolePositions))
|
|
{
|
|
willAdvancePastLastToil = false
|
|
};
|
|
}
|
|
|
|
public static IEnumerable<PsychicRitualToil> InvokerGatherPhaseToils(PsychicRitualDef_InvocationCircle def, IReadOnlyDictionary<PsychicRitualRoleDef, List<IntVec3>> 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));
|
|
}
|
|
}
|
|
``` |