This commit is contained in:
Tourswen
2025-11-25 01:09:14 +08:00
parent 557902027d
commit 5cfbdb9f09
29 changed files with 1080 additions and 416 deletions

View File

@@ -12,12 +12,17 @@ namespace WulaFallenEmpire
private Dictionary<string, string> stringVars = new Dictionary<string, string>();
private Dictionary<string, Pawn> pawnVars = new Dictionary<string, Pawn>();
private Dictionary<string, List<Pawn>> pawnListVars = new Dictionary<string, List<Pawn>>();
// 新增有时限的flag字典
private Dictionary<string, int> timedFlags = new Dictionary<string, int>();
// 用于Scribe的辅助列表
private List<string> pawnVarKeys;
private List<Pawn> pawnVarValues;
private List<string> pawnListVarKeys;
private List<List<Pawn>> pawnListVarValues;
private List<string> timedFlagKeys;
private List<int> timedFlagValues;
// Required for WorldComponent
public EventVariableManager(World world) : base(world)
@@ -32,6 +37,7 @@ namespace WulaFallenEmpire
Scribe_Collections.Look(ref stringVars, "stringVars", LookMode.Value, LookMode.Value);
Scribe_Collections.Look(ref pawnVars, "pawnVars", LookMode.Value, LookMode.Reference, ref pawnVarKeys, ref pawnVarValues);
Scribe_Collections.Look(ref pawnListVars, "pawnListVars", LookMode.Value, LookMode.Reference, ref pawnListVarKeys, ref pawnListVarValues);
Scribe_Collections.Look(ref timedFlags, "timedFlags", LookMode.Value, LookMode.Value, ref timedFlagKeys, ref timedFlagValues);
// Ensure dictionaries are not null after loading
if (Scribe.mode == LoadSaveMode.PostLoadInit)
@@ -41,6 +47,43 @@ namespace WulaFallenEmpire
stringVars ??= new Dictionary<string, string>();
pawnVars ??= new Dictionary<string, Pawn>();
pawnListVars ??= new Dictionary<string, List<Pawn>>();
timedFlags ??= new Dictionary<string, int>();
}
}
public override void WorldComponentTick()
{
base.WorldComponentTick();
// 每60 tick检查一次过期flag
if (Find.TickManager.TicksGame % 60 == 0)
{
CheckExpiredFlags();
}
}
/// <summary>
/// 检查并清理过期的flag
/// </summary>
private void CheckExpiredFlags()
{
List<string> flagsToRemove = new List<string>();
int currentTick = Find.TickManager.TicksGame;
foreach (var kvp in timedFlags)
{
// 如果flag的过期时间不为负数且小于当前tick则标记为需要移除
if (kvp.Value >= 0 && currentTick >= kvp.Value)
{
flagsToRemove.Add(kvp.Key);
Log.Message($"[EventSystem] Flag '{kvp.Key}' expired and will be removed.");
}
}
// 移除过期的flag
foreach (string flagName in flagsToRemove)
{
timedFlags.Remove(flagName);
}
}
@@ -81,6 +124,80 @@ namespace WulaFallenEmpire
}
}
/// <summary>
/// 设置有时限的flag
/// </summary>
/// <param name="flagName">flag名称</param>
/// <param name="durationTicks">持续时间tick负数表示永久</param>
public void SetTimedFlag(string flagName, int durationTicks)
{
if (string.IsNullOrEmpty(flagName)) return;
int expiryTick;
if (durationTicks < 0)
{
// 负数表示永久flag
expiryTick = -1;
Log.Message($"[EventSystem] Setting permanent flag '{flagName}'.");
}
else
{
// 正数表示有时间限制的flag
expiryTick = Find.TickManager.TicksGame + durationTicks;
Log.Message($"[EventSystem] Setting timed flag '{flagName}' with duration {durationTicks} ticks (expires at tick {expiryTick}).");
}
timedFlags[flagName] = expiryTick;
}
/// <summary>
/// 检查flag是否存在且未过期
/// </summary>
public bool HasFlag(string flagName)
{
if (string.IsNullOrEmpty(flagName)) return false;
if (timedFlags.TryGetValue(flagName, out int expiryTick))
{
if (expiryTick < 0)
{
// 永久flag
return true;
}
else
{
// 检查是否过期
bool isActive = Find.TickManager.TicksGame < expiryTick;
if (!isActive)
{
// 如果过期了,移除它
timedFlags.Remove(flagName);
Log.Message($"[EventSystem] Flag '{flagName}' has expired and was removed.");
}
return isActive;
}
}
return false;
}
/// <summary>
/// 获取flag的剩余时间tick
/// </summary>
public int GetFlagRemainingTicks(string flagName)
{
if (string.IsNullOrEmpty(flagName) || !timedFlags.TryGetValue(flagName, out int expiryTick))
return 0;
if (expiryTick < 0)
{
// 永久flag
return -1;
}
int remaining = expiryTick - Find.TickManager.TicksGame;
return remaining > 0 ? remaining : 0;
}
public T GetVariable<T>(string name, T defaultValue = default)
{
if (string.IsNullOrEmpty(name)) return defaultValue;
@@ -138,7 +255,8 @@ namespace WulaFallenEmpire
floatVars.ContainsKey(name) ||
stringVars.ContainsKey(name) ||
pawnVars.ContainsKey(name) ||
pawnListVars.ContainsKey(name);
pawnListVars.ContainsKey(name) ||
timedFlags.ContainsKey(name);
}
public void ClearVariable(string name)
@@ -152,6 +270,7 @@ namespace WulaFallenEmpire
stringVars.Remove(name);
pawnVars.Remove(name);
pawnListVars.Remove(name);
timedFlags.Remove(name);
}
public void ClearAll()
@@ -161,6 +280,7 @@ namespace WulaFallenEmpire
stringVars.Clear();
pawnVars.Clear();
pawnListVars.Clear();
timedFlags.Clear();
}
public Dictionary<string, object> GetAllVariables()
@@ -171,7 +291,8 @@ namespace WulaFallenEmpire
foreach (var kvp in stringVars) allVars[kvp.Key] = kvp.Value;
foreach (var kvp in pawnVars) allVars[kvp.Key] = kvp.Value;
foreach (var kvp in pawnListVars) allVars[kvp.Key] = kvp.Value;
foreach (var kvp in timedFlags) allVars[kvp.Key] = $"Flag (expires: {kvp.Value})";
return allVars;
}
}
}
}