This commit is contained in:
2025-12-01 17:02:32 +08:00
parent bbc13b0b1d
commit 97775fd7ab
7 changed files with 167 additions and 46 deletions

View File

@@ -3,7 +3,7 @@
<QuestScriptDef> <QuestScriptDef>
<defName>WULA_Intro_NewColony</defName> <defName>WULA_Intro_NewColony</defName>
<rootSelectionWeight>0</rootSelectionWeight> <rootSelectionWeight>0</rootSelectionWeight>
<autoAccept>true</autoAccept> <autoAccept>false</autoAccept>
<sendAvailableLetter>false</sendAvailableLetter> <sendAvailableLetter>false</sendAvailableLetter>
<defaultChallengeRating>1</defaultChallengeRating> <!-- 挑战等级(星级) --> <defaultChallengeRating>1</defaultChallengeRating> <!-- 挑战等级(星级) -->
<isRootSpecial>true</isRootSpecial> <!-- 特殊任务 --> <isRootSpecial>true</isRootSpecial> <!-- 特殊任务 -->

View File

@@ -2362,6 +2362,7 @@
<label>由于原版实在是太难太难了而其他各个受欢迎的MOD也太难太难了您在苦苦支撑的过程中已经付出了无可指摘的努力您的游戏理解完全正确只是您的游戏遭遇太不公了。所以您不应该去寻求他人的指导或者做出任何改进而是理应用一种合理的、不是作弊的、无可置疑正统的方式轻松地享受成为边缘世界霸主的感觉。</label> <label>由于原版实在是太难太难了而其他各个受欢迎的MOD也太难太难了您在苦苦支撑的过程中已经付出了无可指摘的努力您的游戏理解完全正确只是您的游戏遭遇太不公了。所以您不应该去寻求他人的指导或者做出任何改进而是理应用一种合理的、不是作弊的、无可置疑正统的方式轻松地享受成为边缘世界霸主的感觉。</label>
<description>可以删除除了块堆和地板外所有东西的武器拿去和其他超正义mod对打吧——你或许知道这玩意不属于正常流程中应使用的东西。</description> <description>可以删除除了块堆和地板外所有东西的武器拿去和其他超正义mod对打吧——你或许知道这玩意不属于正常流程中应使用的东西。</description>
<smeltable>false</smeltable> <smeltable>false</smeltable>
<generateAllowChance>0</generateAllowChance>
<graphicData> <graphicData>
<texPath>Wula/Weapon/WULA_MW_Scepter_Of_CLoak</texPath> <texPath>Wula/Weapon/WULA_MW_Scepter_Of_CLoak</texPath>
<graphicClass>Graphic_Single</graphicClass> <graphicClass>Graphic_Single</graphicClass>

View File

@@ -4,6 +4,6 @@
<li>questName->新殖民地</li> <li>questName->新殖民地</li>
</WULA_Intro_NewColony.questNameRules.rulesStrings> </WULA_Intro_NewColony.questNameRules.rulesStrings>
<WULA_Intro_NewColony.questDescriptionRules.rulesStrings> <WULA_Intro_NewColony.questDescriptionRules.rulesStrings>
<li>questDescription->乌拉帝国的先遣队已经抵达地表,舰队给她们发来了第一条通讯。</li> <li>questDescription->(因为不看提示问我乌拉族科技怎么升的全部砍死)\n\n乌拉帝国的先遣队已经抵达地表,舰队给她们发来了第一条通讯。</li>
</WULA_Intro_NewColony.questDescriptionRules.rulesStrings> </WULA_Intro_NewColony.questDescriptionRules.rulesStrings>
</LanguageData> </LanguageData>

View File

@@ -85,8 +85,6 @@ namespace WulaFallenEmpire
// 记录hediff的ID用于保存/恢复 // 记录hediff的ID用于保存/恢复
activeHediffId = GetHediffId(activeHediff); activeHediffId = GetHediffId(activeHediff);
Log.Message($"[SwitchableHediff] Applied {hediffDef.defName} to {Pawn.LabelShort}, ID: {activeHediffId}");
} }
} }
} }
@@ -109,7 +107,6 @@ namespace WulaFallenEmpire
if (GetHediffId(hediff) == activeHediffId) if (GetHediffId(hediff) == activeHediffId)
{ {
activeHediff = hediff; activeHediff = hediff;
Log.Message($"[SwitchableHediff] Restored active hediff: {hediff.def.defName}, ID: {activeHediffId}");
return true; return true;
} }
} }
@@ -124,7 +121,6 @@ namespace WulaFallenEmpire
{ {
activeHediff = hediff; activeHediff = hediff;
activeHediffId = GetHediffId(hediff); activeHediffId = GetHediffId(hediff);
Log.Message($"[SwitchableHediff] Found matching hediff by def: {hediff.def.defName}");
return true; return true;
} }
} }
@@ -329,7 +325,6 @@ namespace WulaFallenEmpire
// 加载后恢复状态 // 加载后恢复状态
if (Scribe.mode == LoadSaveMode.PostLoadInit) if (Scribe.mode == LoadSaveMode.PostLoadInit)
{ {
Log.Message($"[SwitchableHediff] PostLoadInit - currentHediffIndex: {currentHediffIndex}, activeHediffId: {activeHediffId}");
if (currentHediffIndex == -1 && Props.availableHediffs.Count > 0) if (currentHediffIndex == -1 && Props.availableHediffs.Count > 0)
{ {
@@ -342,14 +337,8 @@ namespace WulaFallenEmpire
// 尝试恢复已保存的hediff引用 // 尝试恢复已保存的hediff引用
if (!TryRestoreActiveHediff()) if (!TryRestoreActiveHediff())
{ {
// 如果恢复失败重新应用当前选择的hediff
Log.Message($"[SwitchableHediff] Failed to restore active hediff, reapplying...");
ApplySelectedHediff(); ApplySelectedHediff();
} }
else
{
Log.Message($"[SwitchableHediff] Successfully restored active hediff");
}
// 验证状态一致性 // 验证状态一致性
ValidateStateConsistency(); ValidateStateConsistency();
@@ -364,7 +353,6 @@ namespace WulaFallenEmpire
// 检查currentHediffIndex是否有效 // 检查currentHediffIndex是否有效
if (currentHediffIndex < 0 || currentHediffIndex >= Props.availableHediffs.Count) if (currentHediffIndex < 0 || currentHediffIndex >= Props.availableHediffs.Count)
{ {
Log.Warning($"[SwitchableHediff] Invalid currentHediffIndex: {currentHediffIndex}");
hasConsistency = false; hasConsistency = false;
} }
@@ -374,14 +362,12 @@ namespace WulaFallenEmpire
var expectedDef = Props.availableHediffs[currentHediffIndex]; var expectedDef = Props.availableHediffs[currentHediffIndex];
if (activeHediff.def != expectedDef) if (activeHediff.def != expectedDef)
{ {
Log.Warning($"[SwitchableHediff] Inconsistent state: activeHediff.def ({activeHediff.def.defName}) != expectedDef ({expectedDef.defName})");
hasConsistency = false; hasConsistency = false;
} }
} }
if (!hasConsistency) if (!hasConsistency)
{ {
Log.Message($"[SwitchableHediff] State inconsistency detected, attempting to repair...");
RepairState(); RepairState();
} }
} }
@@ -397,14 +383,11 @@ namespace WulaFallenEmpire
if (Props.availableHediffs[i] == activeHediff.def) if (Props.availableHediffs[i] == activeHediff.def)
{ {
currentHediffIndex = i; currentHediffIndex = i;
Log.Message($"[SwitchableHediff] Repaired: set currentHediffIndex to {i} based on active hediff");
return; return;
} }
} }
} }
// 如果无法修复重新应用当前选择的hediff
Log.Message($"[SwitchableHediff] Could not repair state, reapplying current selection");
ApplySelectedHediff(); ApplySelectedHediff();
} }

View File

@@ -3,6 +3,7 @@ using RimWorld;
using Verse; using Verse;
using System.Linq; using System.Linq;
using System; using System;
using System.Collections.Generic;
namespace WulaFallenEmpire namespace WulaFallenEmpire
{ {
@@ -17,6 +18,10 @@ namespace WulaFallenEmpire
private MaintenanceStatus currentAppliedStatus = MaintenanceStatus.Operational; private MaintenanceStatus currentAppliedStatus = MaintenanceStatus.Operational;
private Hediff currentAppliedHediff = null; private Hediff currentAppliedHediff = null;
// 新增:验证计数器
private int validationTickCounter = 0;
private const int VALIDATION_INTERVAL_TICKS = 250; // 每250 ticks验证一次
// 当前维护状态 // 当前维护状态
public MaintenanceStatus Status public MaintenanceStatus Status
{ {
@@ -60,6 +65,7 @@ namespace WulaFallenEmpire
daysSinceLastMaintenance = 0f; daysSinceLastMaintenance = 0f;
currentAppliedStatus = MaintenanceStatus.Operational; currentAppliedStatus = MaintenanceStatus.Operational;
currentAppliedHediff = null; currentAppliedHediff = null;
validationTickCounter = 0;
} }
public override void NeedInterval() public override void NeedInterval()
@@ -85,6 +91,136 @@ namespace WulaFallenEmpire
// 检查状态变化 // 检查状态变化
CheckStatusChanges(); CheckStatusChanges();
// 新增:周期性验证 Hediff 状态
PerformHediffValidation();
}
// 新增:周期性 Hediff 验证
private void PerformHediffValidation()
{
validationTickCounter += 150; // NeedInterval 每次调用间隔150 ticks
if (validationTickCounter >= VALIDATION_INTERVAL_TICKS)
{
validationTickCounter = 0;
ValidateHediffConsistency();
}
}
// 新增:验证 Hediff 一致性
private void ValidateHediffConsistency()
{
if (pawn.Dead || !pawn.Spawned)
return;
var expectedStatus = Status;
var actualHediffs = GetCurrentMaintenanceHediffs();
// 情况1没有 Hediff但应该有
if (expectedStatus != MaintenanceStatus.Operational && actualHediffs.Count == 0)
{
Log.Warning($"[Maintenance] Validation: {pawn.Label} should have {expectedStatus} hediff but has none. Reapplying.");
UpdateHediffForStatus(expectedStatus);
return;
}
// 情况2有 Hediff但不应该有
if (expectedStatus == MaintenanceStatus.Operational && actualHediffs.Count > 0)
{
Log.Warning($"[Maintenance] Validation: {pawn.Label} is operational but has maintenance hediffs. Removing all.");
RemoveAllMaintenanceHediffs();
currentAppliedStatus = MaintenanceStatus.Operational;
currentAppliedHediff = null;
return;
}
// 情况3有多个 Hediff
if (actualHediffs.Count > 1)
{
Log.Warning($"[Maintenance] Validation: {pawn.Label} has multiple maintenance hediffs ({actualHediffs.Count}). Cleaning up.");
CleanupMultipleHediffs(expectedStatus);
return;
}
// 情况4Hediff 类型不正确
if (actualHediffs.Count == 1 && expectedStatus != MaintenanceStatus.Operational)
{
var currentHediff = actualHediffs[0];
var expectedHediffDef = GetHediffDefForStatus(expectedStatus);
if (currentHediff.def != expectedHediffDef)
{
Log.Warning($"[Maintenance] Validation: {pawn.Label} has wrong hediff type. Expected {expectedHediffDef?.defName}, got {currentHediff.def.defName}. Correcting.");
UpdateHediffForStatus(expectedStatus);
return;
}
// 更新当前应用的 Hediff 引用
if (currentAppliedHediff != currentHediff)
{
currentAppliedHediff = currentHediff;
Log.Message($"[Maintenance] Validation: Updated currentAppliedHediff reference for {pawn.Label}");
}
}
// 情况5状态记录不一致
if (currentAppliedStatus != expectedStatus)
{
Log.Warning($"[Maintenance] Validation: {pawn.Label} status mismatch. Recorded: {currentAppliedStatus}, Actual: {expectedStatus}. Synchronizing.");
currentAppliedStatus = expectedStatus;
}
}
// 新增:获取当前所有的维护 Hediff
private List<Hediff> GetCurrentMaintenanceHediffs()
{
var maintenanceHediffs = new List<Hediff>();
if (Extension == null)
return maintenanceHediffs;
var allMaintenanceHediffDefs = new List<HediffDef>
{
Extension.minorBreakdownHediff,
Extension.majorBreakdownHediff,
Extension.criticalFailureHediff
}.Where(def => def != null).ToList();
foreach (var hediff in pawn.health.hediffSet.hediffs)
{
if (allMaintenanceHediffDefs.Contains(hediff.def))
{
maintenanceHediffs.Add(hediff);
}
}
return maintenanceHediffs;
}
// 新增:移除所有维护 Hediff
private void RemoveAllMaintenanceHediffs()
{
var maintenanceHediffs = GetCurrentMaintenanceHediffs();
foreach (var hediff in maintenanceHediffs)
{
pawn.health.RemoveHediff(hediff);
}
}
// 新增:清理多个 Hediff
private void CleanupMultipleHediffs(MaintenanceStatus expectedStatus)
{
// 移除所有维护 Hediff
RemoveAllMaintenanceHediffs();
// 重新应用正确的 Hediff
if (expectedStatus != MaintenanceStatus.Operational)
{
UpdateHediffForStatus(expectedStatus);
}
currentAppliedStatus = expectedStatus;
} }
// 修改 CalculateDegradationRate 方法以使用 StatDef // 修改 CalculateDegradationRate 方法以使用 StatDef
@@ -110,27 +246,22 @@ namespace WulaFallenEmpire
// 只有当状态发生变化时才更新 Hediff // 只有当状态发生变化时才更新 Hediff
if (newStatus != currentAppliedStatus) if (newStatus != currentAppliedStatus)
{ {
if (Prefs.DevMode)
{
Log.Message($"[Maintenance] Status changed for {pawn.Label}: {currentAppliedStatus} -> {newStatus}");
}
UpdateHediffForStatus(newStatus); UpdateHediffForStatus(newStatus);
currentAppliedStatus = newStatus; currentAppliedStatus = newStatus;
} }
// 额外检查:确保当前 Hediff 仍然存在(可能被其他系统移除)
if (currentAppliedHediff != null && !pawn.health.hediffSet.hediffs.Contains(currentAppliedHediff))
{
// Hediff 被意外移除,重新应用
UpdateHediffForStatus(currentAppliedStatus);
}
} }
// 新增:智能更新 Hediff // 修改:智能更新 Hediff
private void UpdateHediffForStatus(MaintenanceStatus status) private void UpdateHediffForStatus(MaintenanceStatus status)
{ {
// 首先移除当前应用的 Hediff // 首先移除所有维护相关的 Hediff
if (currentAppliedHediff != null) RemoveAllMaintenanceHediffs();
{ currentAppliedHediff = null;
pawn.health.RemoveHediff(currentAppliedHediff);
currentAppliedHediff = null;
}
// 根据新状态添加相应的 Hediff // 根据新状态添加相应的 Hediff
HediffDef hediffDefToAdd = GetHediffDefForStatus(status); HediffDef hediffDefToAdd = GetHediffDefForStatus(status);
@@ -142,7 +273,7 @@ namespace WulaFallenEmpire
// 调试日志 // 调试日志
if (Prefs.DevMode) if (Prefs.DevMode)
{ {
Log.Message($"Maintenance: Applied {hediffDefToAdd.defName} for status {status} to {pawn.Label}"); Log.Message($"[Maintenance] Applied {hediffDefToAdd.defName} for status {status} to {pawn.Label}");
} }
} }
else if (status == MaintenanceStatus.Operational) else if (status == MaintenanceStatus.Operational)
@@ -150,7 +281,7 @@ namespace WulaFallenEmpire
// 操作状态,不需要 Hediff // 操作状态,不需要 Hediff
if (Prefs.DevMode) if (Prefs.DevMode)
{ {
Log.Message($"Maintenance: {pawn.Label} is operational, no hediff needed"); Log.Message($"[Maintenance] {pawn.Label} is operational, no hediff needed");
} }
} }
} }
@@ -181,13 +312,16 @@ namespace WulaFallenEmpire
CurLevel = ClampNeedLevel(CurLevel); CurLevel = ClampNeedLevel(CurLevel);
daysSinceLastMaintenance = 0f; daysSinceLastMaintenance = 0f;
// 更新状态(会自动移除旧的 Hediff 并应用新的) // 强制验证以确保状态正确
var newStatus = Status; var newStatus = Status;
UpdateHediffForStatus(newStatus); UpdateHediffForStatus(newStatus);
currentAppliedStatus = newStatus; currentAppliedStatus = newStatus;
// 触发维护完成的效果 // 触发维护完成的效果
OnMaintenancePerformed(maintenanceAmount); OnMaintenancePerformed(maintenanceAmount);
// 立即执行一次验证
ValidateHediffConsistency();
} }
// 修改 ApplyDamagePenalty 方法以使用 StatDef // 修改 ApplyDamagePenalty 方法以使用 StatDef
@@ -208,6 +342,9 @@ namespace WulaFallenEmpire
UpdateHediffForStatus(newStatus); UpdateHediffForStatus(newStatus);
currentAppliedStatus = newStatus; currentAppliedStatus = newStatus;
} }
// 立即执行一次验证
ValidateHediffConsistency();
} }
private void OnMaintenancePerformed(float amount) private void OnMaintenancePerformed(float amount)
@@ -240,21 +377,18 @@ namespace WulaFallenEmpire
Scribe_Values.Look(ref daysSinceLastMaintenance, "daysSinceLastMaintenance", 0f); Scribe_Values.Look(ref daysSinceLastMaintenance, "daysSinceLastMaintenance", 0f);
Scribe_Values.Look(ref currentAppliedStatus, "currentAppliedStatus", MaintenanceStatus.Operational); Scribe_Values.Look(ref currentAppliedStatus, "currentAppliedStatus", MaintenanceStatus.Operational);
Scribe_References.Look(ref currentAppliedHediff, "currentAppliedHediff"); Scribe_References.Look(ref currentAppliedHediff, "currentAppliedHediff");
Scribe_Values.Look(ref validationTickCounter, "validationTickCounter", 0);
// 修复:加载后验证状态一致性 // 修复:加载后验证状态一致性
if (Scribe.mode == LoadSaveMode.PostLoadInit) if (Scribe.mode == LoadSaveMode.PostLoadInit)
{ {
// 确保当前状态与实际 Hediff 一致 // 延迟执行验证,确保所有组件都已加载
if (currentAppliedHediff != null && !pawn.health.hediffSet.hediffs.Contains(currentAppliedHediff)) LongEventHandler.ExecuteWhenFinished(() =>
{ {
// Hediff 丢失,重新应用 // 使用简单的延迟调用而不是 AddOnceOffAction
UpdateHediffForStatus(currentAppliedStatus); Find.TickManager.DebugSetTicksGame(Find.TickManager.TicksGame); // 强制触发一次更新
} ValidateHediffConsistency();
else if (currentAppliedHediff == null && currentAppliedStatus != MaintenanceStatus.Operational) });
{
// 应该有 Hediff 但没有,重新应用
UpdateHediffForStatus(currentAppliedStatus);
}
} }
} }
} }

View File

@@ -256,6 +256,9 @@
<Compile Include="Pawn\WULA_Maintenance\Need_Maintenance.cs" /> <Compile Include="Pawn\WULA_Maintenance\Need_Maintenance.cs" />
<Compile Include="Pawn\WULA_Maintenance\WorkGiver_DoMaintenance.cs" /> <Compile Include="Pawn\WULA_Maintenance\WorkGiver_DoMaintenance.cs" />
<Compile Include="Placeworker\CompProperties_CustomRadius.cs" /> <Compile Include="Placeworker\CompProperties_CustomRadius.cs" />
<Compile Include="Projectiles\WULA_BouncingMine\BouncingMineFlying.cs" />
<Compile Include="Projectiles\WULA_BouncingMine\CompBouncingMine.cs" />
<Compile Include="Projectiles\WULA_BouncingMine\CompFlyingObject.cs" />
<Compile Include="QuestNodes\QuestNode_AddInspectionJob.cs" /> <Compile Include="QuestNodes\QuestNode_AddInspectionJob.cs" />
<Compile Include="QuestNodes\QuestNode_CheckGlobalResource.cs" /> <Compile Include="QuestNodes\QuestNode_CheckGlobalResource.cs" />
<Compile Include="QuestNodes\QuestNode_GeneratePawnWithCustomization.cs" /> <Compile Include="QuestNodes\QuestNode_GeneratePawnWithCustomization.cs" />