This commit is contained in:
2025-09-30 17:32:20 +08:00
parent 80cbaff5fa
commit bda7419168
13 changed files with 520 additions and 167 deletions

View File

@@ -0,0 +1,172 @@
using RimWorld;
using Verse;
using System.Linq;
namespace ArachnaeSwarm
{
// ARA_IncubationCost 的 StatWorker
public class StatWorker_IncubationCost : StatWorker
{
public override bool ShouldShowFor(StatRequest req)
{
try
{
// 只在拥有 CompProperties_ExtraIncubationInfo 的 ThingDef 上显示
if (!base.ShouldShowFor(req))
return false;
return HasIncubationComp(req);
}
catch (System.Exception ex)
{
Log.Warning($"Error in StatWorker_IncubationCost.ShouldShowFor for {req.Def?.defName}: {ex.Message}");
return false;
}
}
public override float GetValueUnfinalized(StatRequest req, bool applyPostProcess = true)
{
try
{
// 从 ThingDef 的 statBases 中获取值
if (req.Def is ThingDef thingDef)
{
var statModifier = thingDef.statBases?.FirstOrDefault(s => s.stat == this.stat);
if (statModifier != null)
{
return statModifier.value;
}
}
return base.GetValueUnfinalized(req, applyPostProcess);
}
catch (System.Exception ex)
{
Log.Warning($"Error in StatWorker_IncubationCost.GetValueUnfinalized for {req.Def?.defName}: {ex.Message}");
return 0f;
}
}
public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense)
{
try
{
if (!HasIncubationComp(req))
return string.Empty;
float value = GetValueUnfinalized(req);
return "IncubationCostDesc".Translate(value);
}
catch (System.Exception ex)
{
Log.Warning($"Error in StatWorker_IncubationCost.GetExplanationUnfinalized for {req.Def?.defName}: {ex.Message}");
return string.Empty;
}
}
private bool HasIncubationComp(StatRequest req)
{
try
{
ThingDef thingDef = req.Def as ThingDef ?? req.Thing?.def;
return thingDef?.comps?.Any(c => c is CompProperties_ExtraIncubationInfo) == true;
}
catch (System.Exception ex)
{
Log.Warning($"Error in StatWorker_IncubationCost.HasIncubationComp for {req.Def?.defName}: {ex.Message}");
return false;
}
}
}
// ARA_IncubationTime 的 StatWorker
public class StatWorker_IncubationTime : StatWorker
{
public override bool ShouldShowFor(StatRequest req)
{
try
{
// 只在拥有 CompProperties_ExtraIncubationInfo 的 ThingDef 上显示
if (!base.ShouldShowFor(req))
return false;
return HasIncubationComp(req);
}
catch (System.Exception ex)
{
Log.Warning($"Error in StatWorker_IncubationTime.ShouldShowFor for {req.Def?.defName}: {ex.Message}");
return false;
}
}
public override float GetValueUnfinalized(StatRequest req, bool applyPostProcess = true)
{
try
{
// 从 ThingDef 的 statBases 中获取值
if (req.Def is ThingDef thingDef)
{
var statModifier = thingDef.statBases?.FirstOrDefault(s => s.stat == this.stat);
if (statModifier != null)
{
return statModifier.value;
}
}
return base.GetValueUnfinalized(req, applyPostProcess);
}
catch (System.Exception ex)
{
Log.Warning($"Error in StatWorker_IncubationTime.GetValueUnfinalized for {req.Def?.defName}: {ex.Message}");
return 0f;
}
}
public override string GetExplanationUnfinalized(StatRequest req, ToStringNumberSense numberSense)
{
try
{
if (!HasIncubationComp(req))
return string.Empty;
float value = GetValueUnfinalized(req);
return "IncubationTimeDesc".Translate(value);
}
catch (System.Exception ex)
{
Log.Warning($"Error in StatWorker_IncubationTime.GetExplanationUnfinalized for {req.Def?.defName}: {ex.Message}");
return string.Empty;
}
}
public override string GetStatDrawEntryLabel(StatDef stat, float value, ToStringNumberSense numberSense, StatRequest req, bool finalized = true)
{
try
{
if (!HasIncubationComp(req))
return base.GetStatDrawEntryLabel(stat, value, numberSense, req, finalized);
return value + " days";
}
catch (System.Exception ex)
{
Log.Warning($"Error in StatWorker_IncubationTime.GetStatDrawEntryLabel for {req.Def?.defName}: {ex.Message}");
return value.ToString();
}
}
private bool HasIncubationComp(StatRequest req)
{
try
{
ThingDef thingDef = req.Def as ThingDef ?? req.Thing?.def;
return thingDef?.comps?.Any(c => c is CompProperties_ExtraIncubationInfo) == true;
}
catch (System.Exception ex)
{
Log.Warning($"Error in StatWorker_IncubationTime.HasIncubationComp for {req.Def?.defName}: {ex.Message}");
return false;
}
}
}
}