Files
WulaFallenEmpireRW/Source/WulaFallenEmpire/Pawn/WULA_Maintenance/Need_Maintenance.cs
Tourswen 9905782298 1
2025-11-04 00:45:25 +08:00

232 lines
7.6 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.
// Need_Maintenance.cs
using RimWorld;
using Verse;
using System.Linq;
using System;
namespace WulaFallenEmpire
{
public class Need_Maintenance : Need
{
private MaintenanceNeedExtension Extension => def.GetModExtension<MaintenanceNeedExtension>();
// 上次维护的天数
private float daysSinceLastMaintenance = 0f;
// 当前维护状态
public MaintenanceStatus Status
{
get
{
if (CurLevel <= Extension?.criticalFailureThreshold) return MaintenanceStatus.CriticalFailure;
if (CurLevel <= Extension?.majorBreakdownThreshold) return MaintenanceStatus.MajorBreakdown;
if (CurLevel <= Extension?.minorBreakdownThreshold) return MaintenanceStatus.MinorBreakdown;
return MaintenanceStatus.Operational;
}
}
public float DaysSinceLastMaintenance => daysSinceLastMaintenance;
public Need_Maintenance(Pawn pawn) : base(pawn)
{
}
public override void SetInitialLevel()
{
CurLevel = 1.0f;
daysSinceLastMaintenance = 0f;
}
public override void NeedInterval()
{
if (pawn.Dead || !pawn.Spawned)
return;
// 每150 ticks 更新一次Need 的标准间隔)
if (IsFrozen)
return;
// 增加天数计数
daysSinceLastMaintenance += 150f / 60000f; // 150 ticks 占一天的比例
// 计算退化速率
float degradationRate = CalculateDegradationRate();
// 应用退化
CurLevel -= degradationRate * (150f / 60000f); // 转换为每天的比例
// 确保数值在有效范围内
CurLevel = ClampNeedLevel(CurLevel);
// 检查状态变化
CheckStatusChanges();
}
private float CalculateDegradationRate()
{
if (Extension == null)
return 0f;
if (daysSinceLastMaintenance < Extension.thresholdDays)
{
return Extension.severityPerDayBeforeThreshold;
}
else
{
return Extension.severityPerDayAfterThreshold;
}
}
private void CheckStatusChanges()
{
if (Extension == null)
return;
// 检查是否需要应用故障效果
var currentStatus = Status;
// 移除旧的维护相关 Hediff
RemoveMaintenanceHediffs();
// 根据状态添加相应的 Hediff
switch (currentStatus)
{
case MaintenanceStatus.MinorBreakdown:
if (Extension.minorBreakdownHediff != null)
pawn.health.AddHediff(Extension.minorBreakdownHediff);
break;
case MaintenanceStatus.MajorBreakdown:
if (Extension.majorBreakdownHediff != null)
pawn.health.AddHediff(Extension.majorBreakdownHediff);
break;
case MaintenanceStatus.CriticalFailure:
if (Extension.criticalFailureHediff != null)
pawn.health.AddHediff(Extension.criticalFailureHediff);
break;
}
}
private void RemoveMaintenanceHediffs()
{
if (Extension == null)
return;
// 移除所有维护相关的 Hediff
var hediffsToRemove = pawn.health.hediffSet.hediffs.FindAll(h =>
h.def == Extension.minorBreakdownHediff ||
h.def == Extension.majorBreakdownHediff ||
h.def == Extension.criticalFailureHediff);
foreach (var hediff in hediffsToRemove)
{
pawn.health.RemoveHediff(hediff);
}
}
// 执行维护操作
public void PerformMaintenance(float maintenanceAmount = 1.0f)
{
CurLevel += maintenanceAmount;
CurLevel = ClampNeedLevel(CurLevel);
daysSinceLastMaintenance = 0f;
// 移除所有维护相关的负面效果
RemoveMaintenanceHediffs();
// 触发维护完成的效果
OnMaintenancePerformed(maintenanceAmount);
}
// 应用伤害惩罚 - 简单的线性减少
public void ApplyDamagePenalty(float damageAmount)
{
if (Extension == null) return;
// 直接线性减少维护度
float reduction = damageAmount * Extension.damageToMaintenanceFactor;
CurLevel = Math.Max(0f, CurLevel - reduction);
// 立即检查状态变化
CheckStatusChanges();
}
private void OnMaintenancePerformed(float amount)
{
// 这里可以添加维护完成时的特殊效果
if (pawn.IsColonistPlayerControlled)
{
Messages.Message("WULA_MaintenanceCompleted".Translate(pawn.LabelShort), pawn, MessageTypeDefOf.PositiveEvent);
}
}
private float ClampNeedLevel(float level)
{
return level < 0f ? 0f : (level > 1f ? 1f : level);
}
public override string GetTipString()
{
string baseTip = base.GetTipString();
string statusText = "WULA_MaintenanceStatus".Translate(Status.GetLabel(), daysSinceLastMaintenance.ToString("F1"));
string degradationText = "WULA_DegradationRate".Translate(CalculateDegradationRate().ToString("F3"));
return $"{baseTip}\n\n{statusText}\n{degradationText}";
}
public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look(ref daysSinceLastMaintenance, "daysSinceLastMaintenance", 0f);
}
}
// 维护状态枚举
public enum MaintenanceStatus
{
Operational,
MinorBreakdown,
MajorBreakdown,
CriticalFailure
}
public static class MaintenanceStatusExtensions
{
public static string GetLabel(this MaintenanceStatus status)
{
switch (status)
{
case MaintenanceStatus.Operational:
return "WULA_Operational".Translate();
case MaintenanceStatus.MinorBreakdown:
return "WULA_MinorBreakdown".Translate();
case MaintenanceStatus.MajorBreakdown:
return "WULA_MajorBreakdown".Translate();
case MaintenanceStatus.CriticalFailure:
return "WULA_CriticalFailure".Translate();
default:
return "Unknown";
}
}
public static string GetDescription(this MaintenanceStatus status)
{
switch (status)
{
case MaintenanceStatus.Operational:
return "WULA_OperationalDesc".Translate();
case MaintenanceStatus.MinorBreakdown:
return "WULA_MinorBreakdownDesc".Translate();
case MaintenanceStatus.MajorBreakdown:
return "WULA_MajorBreakdownDesc".Translate();
case MaintenanceStatus.CriticalFailure:
return "WULA_CriticalFailureDesc".Translate();
default:
return "Unknown";
}
}
}
}