feat: 扩展事件系统,改进变量处理和调试功能
本次提交对事件系统进行了多项增强和修复,主要包括: - 为`Effect_SetVariable`添加了类型支持(Int, Float, String, Bool),允许更精确地设置变量类型 [在`EventDef_Wula.xml`, `EventDef_WULA_FE_Spiritualist.xml`, `Effect.cs`中]。 - 改进了`Condition`类,增加了类型检查和错误处理,避免了类型不匹配导致的错误 [在`Condition.cs`中]。 - 修复了`Effect_ModifyVariable`中的错误,允许使用变量名作为修改值,并支持int和float类型的操作 [在`Effect.cs`中]。 - 添加了`Effect_StoreFactionGoodwill`,用于存储派系好感度到变量中 [在`Effect.cs`中]。 - 增加了`Dialog_ManageEventVariables`,用于调试和管理事件变量 [在`DebugActions.cs`, `Dialog_ManageEventVariables.cs`中]。 - 改进了`EventVariableManager`,增加了类型转换的错误处理和日志记录,并添加了获取所有变量的函数 [在`EventVariableManager.cs`中]。 这些改动提高了事件系统的稳定性和可扩展性,并为调试提供了更多工具。
This commit is contained in:
@@ -47,7 +47,10 @@ namespace WulaFallenEmpire
|
||||
public void SetVariable(string name, object value)
|
||||
{
|
||||
if (string.IsNullOrEmpty(name)) return;
|
||||
|
||||
|
||||
// Log the variable change
|
||||
Log.Message($"[EventSystem] Setting variable '{name}' to value '{value}' of type {value?.GetType().Name ?? "null"}.");
|
||||
|
||||
// Clear any existing variable with the same name to prevent type confusion
|
||||
ClearVariable(name);
|
||||
|
||||
@@ -83,48 +86,45 @@ namespace WulaFallenEmpire
|
||||
if (string.IsNullOrEmpty(name)) return defaultValue;
|
||||
|
||||
object value = null;
|
||||
bool found = false;
|
||||
|
||||
if (typeof(T) == typeof(List<Pawn>) && pawnListVars.TryGetValue(name, out var pawnListVal))
|
||||
if (pawnListVars.TryGetValue(name, out var pawnListVal))
|
||||
{
|
||||
value = pawnListVal;
|
||||
found = true;
|
||||
}
|
||||
else if (typeof(T) == typeof(Pawn) && pawnVars.TryGetValue(name, out var pawnVal))
|
||||
else if (pawnVars.TryGetValue(name, out var pawnVal))
|
||||
{
|
||||
value = pawnVal;
|
||||
found = true;
|
||||
}
|
||||
else if (typeof(T) == typeof(float) && floatVars.TryGetValue(name, out var floatVal))
|
||||
else if (floatVars.TryGetValue(name, out var floatVal))
|
||||
{
|
||||
value = floatVal;
|
||||
found = true;
|
||||
}
|
||||
else if (typeof(T) == typeof(int) && intVars.TryGetValue(name, out var intVal))
|
||||
else if (intVars.TryGetValue(name, out var intVal))
|
||||
{
|
||||
value = intVal;
|
||||
found = true;
|
||||
}
|
||||
else if (stringVars.TryGetValue(name, out var stringVal))
|
||||
{
|
||||
value = stringVal;
|
||||
found = true;
|
||||
}
|
||||
|
||||
if (found)
|
||||
if (value != null)
|
||||
{
|
||||
if (value is T typedValue)
|
||||
{
|
||||
return typedValue;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Handle cases where T is object but the stored value is, e.g., an int
|
||||
if (typeof(T) == typeof(object))
|
||||
{
|
||||
return (T)value;
|
||||
}
|
||||
return (T)System.Convert.ChangeType(value, typeof(T));
|
||||
}
|
||||
catch (System.Exception)
|
||||
catch (System.Exception e)
|
||||
{
|
||||
Log.Warning($"[WulaFallenEmpire] EventVariableManager: Variable '{name}' of type {value.GetType()} could not be converted to {typeof(T)}.");
|
||||
Log.Warning($"[WulaFallenEmpire] EventVariableManager: Variable '{name}' of type {value.GetType()} could not be converted to {typeof(T)}. Error: {e.Message}");
|
||||
return defaultValue;
|
||||
}
|
||||
}
|
||||
@@ -143,6 +143,10 @@ namespace WulaFallenEmpire
|
||||
|
||||
public void ClearVariable(string name)
|
||||
{
|
||||
if (HasVariable(name))
|
||||
{
|
||||
Log.Message($"[EventSystem] Clearing variable '{name}'.");
|
||||
}
|
||||
intVars.Remove(name);
|
||||
floatVars.Remove(name);
|
||||
stringVars.Remove(name);
|
||||
@@ -158,5 +162,16 @@ namespace WulaFallenEmpire
|
||||
pawnVars.Clear();
|
||||
pawnListVars.Clear();
|
||||
}
|
||||
|
||||
public Dictionary<string, object> GetAllVariables()
|
||||
{
|
||||
var allVars = new Dictionary<string, object>();
|
||||
foreach (var kvp in intVars) allVars[kvp.Key] = kvp.Value;
|
||||
foreach (var kvp in floatVars) allVars[kvp.Key] = kvp.Value;
|
||||
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;
|
||||
return allVars;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user