Files
WulaFallenEmpireRW/Source/WulaFallenEmpire/Flyover/WULA_AircraftHangar/WorldComponent_AircraftManager.cs
ProjectKoi-Kalo\Kalo 98a0400c78 WulaFallenEmpireSettings.cs - 添加了 public bool enableDebugLogs = false; 字段和保存配置
 WulaLog.cs - 修改了DebugEnabled属性,仅检查enableDebugLogs设置(不检查DevMode)
 WulaFallenEmpireMod.cs - 在DoSettingsWindowContents中添加了UI复选框,显示"Enable Debug Logs"选项
 替换了所有848个Log.Message/Error/Warning调用为WulaLog.Debug()
2025-12-15 13:05:50 +08:00

225 lines
8.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.
using RimWorld;
using Verse;
using System.Collections.Generic;
using RimWorld.Planet;
using System.Linq;
namespace WulaFallenEmpire
{
public class WorldComponent_AircraftManager : WorldComponent
{
// 使用列表而不是嵌套字典,更容易序列化
private List<FactionAircraftData> allFactionAircraftData = new List<FactionAircraftData>();
private List<AircraftCooldownEvent> cooldownEvents = new List<AircraftCooldownEvent>();
public WorldComponent_AircraftManager(World world) : base(world) { }
// 派系战机数据
private class FactionAircraftData : IExposable
{
public Faction faction;
public ThingDef aircraftDef;
public int totalCount;
public int availableCount;
public void ExposeData()
{
Scribe_References.Look(ref faction, "faction");
Scribe_Defs.Look(ref aircraftDef, "aircraftDef");
Scribe_Values.Look(ref totalCount, "totalCount", 0);
Scribe_Values.Look(ref availableCount, "availableCount", 0);
}
}
// 冷却事件
private class AircraftCooldownEvent : IExposable
{
public Faction faction;
public ThingDef aircraftDef;
public int endTick;
public int aircraftCount;
public void ExposeData()
{
Scribe_References.Look(ref faction, "faction");
Scribe_Defs.Look(ref aircraftDef, "aircraftDef");
Scribe_Values.Look(ref endTick, "endTick", 0);
Scribe_Values.Look(ref aircraftCount, "aircraftCount", 0);
}
}
public override void ExposeData()
{
base.ExposeData();
// 使用简单的列表序列化
Scribe_Collections.Look(ref allFactionAircraftData, "allFactionAircraftData", LookMode.Deep);
Scribe_Collections.Look(ref cooldownEvents, "cooldownEvents", LookMode.Deep);
// 确保列表不为null
if (allFactionAircraftData == null)
allFactionAircraftData = new List<FactionAircraftData>();
if (cooldownEvents == null)
cooldownEvents = new List<AircraftCooldownEvent>();
// 调试日志
if (Scribe.mode == LoadSaveMode.Saving)
{
WulaLog.Debug($"Saving aircraft data: {allFactionAircraftData.Count} faction entries, {cooldownEvents.Count} cooldown events");
}
else if (Scribe.mode == LoadSaveMode.PostLoadInit)
{
WulaLog.Debug($"Loaded aircraft data: {allFactionAircraftData.Count} faction entries, {cooldownEvents.Count} cooldown events");
}
}
public override void WorldComponentTick()
{
base.WorldComponentTick();
// 处理冷却事件
int currentTick = Find.TickManager.TicksAbs;
for (int i = cooldownEvents.Count - 1; i >= 0; i--)
{
AircraftCooldownEvent cooldownEvent = cooldownEvents[i];
if (currentTick >= cooldownEvent.endTick)
{
RestoreAircraftAfterCooldown(cooldownEvent);
cooldownEvents.RemoveAt(i);
}
}
}
// 获取或创建派系战机数据
private FactionAircraftData GetOrCreateFactionAircraftData(Faction faction, ThingDef aircraftDef)
{
var data = allFactionAircraftData.FirstOrDefault(x => x.faction == faction && x.aircraftDef == aircraftDef);
if (data == null)
{
data = new FactionAircraftData
{
faction = faction,
aircraftDef = aircraftDef,
totalCount = 0,
availableCount = 0
};
allFactionAircraftData.Add(data);
}
return data;
}
// 获取派系战机数据可能为null
private FactionAircraftData GetFactionAircraftData(Faction faction, ThingDef aircraftDef)
{
return allFactionAircraftData.FirstOrDefault(x => x.faction == faction && x.aircraftDef == aircraftDef);
}
// 添加战机到派系
public void AddAircraft(ThingDef aircraftDef, int count, Faction faction)
{
if (faction == null)
{
WulaLog.Debug("AddAircraftNullFaction".Translate());
return;
}
var data = GetOrCreateFactionAircraftData(faction, aircraftDef);
data.totalCount += count;
data.availableCount += count;
WulaLog.Debug($"Added {count} {aircraftDef.LabelCap} to {faction.Name}. Total: {data.totalCount}, Available: {data.availableCount}");
}
// 尝试使用战机
public bool TryUseAircraft(ThingDef aircraftDef, int count, Faction faction, int cooldownTicks)
{
if (!HasAvailableAircraft(aircraftDef, count, faction))
return false;
var data = GetFactionAircraftData(faction, aircraftDef);
data.availableCount -= count;
AircraftCooldownEvent cooldownEvent = new AircraftCooldownEvent
{
faction = faction,
aircraftDef = aircraftDef,
endTick = Find.TickManager.TicksAbs + cooldownTicks,
aircraftCount = count
};
cooldownEvents.Add(cooldownEvent);
WulaLog.Debug($"Used {count} {aircraftDef.LabelCap} from {faction.Name}. Available now: {data.availableCount}, Cooldown until: {cooldownEvent.endTick}");
return true;
}
// 检查是否有可用战机
public bool HasAvailableAircraft(ThingDef aircraftDef, int count, Faction faction)
{
var data = GetFactionAircraftData(faction, aircraftDef);
return data != null && data.availableCount >= count;
}
// 获取可用战机数量
public int GetAvailableAircraftCount(ThingDef aircraftDef, Faction faction)
{
var data = GetFactionAircraftData(faction, aircraftDef);
return data?.availableCount ?? 0;
}
// 获取总战机数量
public int GetTotalAircraftCount(ThingDef aircraftDef, Faction faction)
{
var data = GetFactionAircraftData(faction, aircraftDef);
return data?.totalCount ?? 0;
}
// 冷却结束后恢复战机
private void RestoreAircraftAfterCooldown(AircraftCooldownEvent cooldownEvent)
{
var data = GetFactionAircraftData(cooldownEvent.faction, cooldownEvent.aircraftDef);
if (data != null)
{
data.availableCount += cooldownEvent.aircraftCount;
if (cooldownEvent.aircraftDef != null)
{
Messages.Message("AircraftCooldownEnded".Translate(cooldownEvent.aircraftDef.LabelCap), MessageTypeDefOf.PositiveEvent);
WulaLog.Debug($"Cooldown ended for {cooldownEvent.aircraftCount} {cooldownEvent.aircraftDef.LabelCap}. Available now: {data.availableCount}");
}
}
}
// 获取冷却中的战机数量
public int GetCooldownAircraftCount(ThingDef aircraftDef, Faction faction)
{
return cooldownEvents
.Where(e => e.faction == faction && e.aircraftDef == aircraftDef)
.Sum(e => e.aircraftCount);
}
// 调试方法:显示当前状态
public void DebugLogStatus()
{
WulaLog.Debug("=== Aircraft Manager Status ===");
WulaLog.Debug($"Total faction entries: {allFactionAircraftData.Count}");
var factions = allFactionAircraftData.Select(x => x.faction).Distinct();
foreach (var faction in factions)
{
WulaLog.Debug($"Faction: {faction?.Name ?? "Unknown"}");
var factionData = allFactionAircraftData.Where(x => x.faction == faction);
foreach (var data in factionData)
{
WulaLog.Debug($" {data.aircraftDef.LabelCap}: {data.availableCount}/{data.totalCount} available");
}
}
WulaLog.Debug($"Active cooldown events: {cooldownEvents.Count}");
WulaLog.Debug("===============================");
}
}
}