Files
ArachnaeSwarm/Source/ArachnaeSwarm/WorkGivers/WorkGiver_ExtractHoney.cs
Tourswen 3f73c7024f 11
2025-12-18 00:44:50 +08:00

118 lines
3.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using RimWorld;
using System.Collections.Generic;
using Verse;
using Verse.AI;
namespace ArachnaeSwarm
{
public class WorkGiver_ExtractHoney : WorkGiver_Scanner
{
public override PathEndMode PathEndMode => PathEndMode.Touch;
public override Danger MaxPathDanger(Pawn pawn)
{
return Danger.None;
}
// 扫描所有虫族成员,检查是否需要挤出蜂蜜
public override IEnumerable<Thing> PotentialWorkThingsGlobal(Pawn pawn)
{
// 返回所有有蜂蜜需求的虫族Pawn
IReadOnlyList<Pawn> allPawns = pawn.Map.mapPawns.AllPawnsSpawned;
List<Thing> workThings = new List<Thing>();
foreach (Pawn potentialPawn in allPawns)
{
// 只检查玩家阵营的虫族成员
if (potentialPawn.Faction == Faction.OfPlayer &&
HasHoneyNeed(potentialPawn))
{
workThings.Add(potentialPawn);
}
}
return workThings;
}
public override bool ShouldSkip(Pawn pawn, bool forced = false)
{
// 检查Pawn是否属于玩家阵营
if (pawn.Faction != Faction.OfPlayer)
return true;
// 检查Pawn是否是虫族成员
if (!IsSwarmMember(pawn))
return true;
// 检查Pawn是否能够工作
if (pawn.Dead || pawn.Downed || pawn.InMentalState)
return true;
// 检查Pawn是否正在执行其他挤出工作
if (pawn.CurJobDef == ARA_JobDefOf.ARA_ExtractHoney)
return true;
return false;
}
public override bool HasJobOnThing(Pawn pawn, Thing t, bool forced = false)
{
// 如果目标不是Pawn返回false
if (t == null || !(t is Pawn targetPawn))
return false;
// 检查是否是挤出自己的蜂蜜
if (targetPawn != pawn)
return false; // 只能挤出自己的蜂蜜
// 检查目标Pawn是否有蜂蜜需求
Need_HoneyProduction honeyNeed = targetPawn.needs?.TryGetNeed<Need_HoneyProduction>();
if (honeyNeed == null)
return false;
// 检查是否可以挤出
return CanExtractNow(honeyNeed);
}
public override Job JobOnThing(Pawn pawn, Thing t, bool forced = false)
{
if (t == null || !(t is Pawn targetPawn) || targetPawn != pawn)
return null;
// 创建挤出工作使用Pawn自身作为目标
Job job = JobMaker.MakeJob(ARA_JobDefOf.ARA_ExtractHoney, pawn);
job.count = 1;
return job;
}
// 检查是否有蜂蜜需求
private bool HasHoneyNeed(Pawn pawn)
{
return pawn.needs?.TryGetNeed<Need_HoneyProduction>() != null;
}
// 检查是否可以立即挤出
private bool CanExtractNow(Need_HoneyProduction honeyNeed)
{
// 如果MaxLevel大于1.5需要超过80%储量才考虑挤蜜
if (honeyNeed.MaxLevel > 1.5f)
{
return honeyNeed.CurLevelPercentage > 0.8f;
}
// 否则在大于1时挤蜜
else
{
return honeyNeed.CurLevel >= 1.0f;
}
}
// 检查是否是虫族成员
private bool IsSwarmMember(Pawn pawn)
{
return pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindMaster) ||
pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindDrone) ||
pawn.health.hediffSet.HasHediff(ARA_HediffDefOf.ARA_HiveMindWorker);
}
}
}