变量写入

This commit is contained in:
2025-12-12 16:03:05 +08:00
parent 4417a26650
commit 5cd4eaaeb7
5 changed files with 873 additions and 3 deletions

View File

@@ -112,6 +112,14 @@
<value2>1</value2>
<storeAs>taxAmount</storeAs>
</li>
<li Class="WulaFallenEmpire.QuestNode_WriteToEventVariablesWithAdd">
<targetVariableName>WULA_Total_Tax_Amount</targetVariableName>
<sourceVariableName>taxAmount</sourceVariableName>
<value>0</value>
<writeMode>Set</writeMode>
<overwrite>true</overwrite>
</li>
<li Class="WulaFallenEmpire.QuestNode_CheckGlobalResource">
<resourceDef>Silver</resourceDef>
<requiredCount>$taxAmount</requiredCount>

View File

@@ -1882,7 +1882,6 @@
<tradeability>None</tradeability>
<highlightColor>(0.56, 0.62, 0.9)</highlightColor>
<uiIconPath>Wula/Building/WULA_Combat_Excavator_Icon</uiIconPath>
<designationCategory>WULA_Buildings</designationCategory>
<rotatable>false</rotatable>
<graphicData>
<texPath>Wula/Building/WULA_Combat_Excavator</texPath>
@@ -2332,7 +2331,6 @@
<tradeability>None</tradeability>
<highlightColor>(0.56, 0.62, 0.9)</highlightColor>
<uiIconPath>Wula/Building/WULA_Combat_Excavator_Icon</uiIconPath>
<designationCategory>WULA_Buildings</designationCategory>
<rotatable>false</rotatable>
<graphicData>
<texPath>Wula/Building/WULA_Combat_Excavator</texPath>

View File

@@ -0,0 +1,536 @@
using System;
using RimWorld.QuestGen;
using Verse;
using System.Collections.Generic;
using System.Linq;
namespace WulaFallenEmpire
{
public class QuestNode_WriteToEventVariablesWithAdd : QuestNode
{
// 要写入的变量名在EventVariableManager中的名字
[NoTranslate]
public SlateRef<string> targetVariableName;
// 要从Quest中读取的变量名Slate中的变量
[NoTranslate]
public SlateRef<string> sourceVariableName;
// 如果sourceVariableName为空使用这个值
public SlateRef<object> value;
// 写入模式
public WriteMode writeMode = WriteMode.Set;
// 是否检查变量已存在
public SlateRef<bool> checkExisting = true;
// 如果变量已存在是否覆盖仅用于Set模式
public SlateRef<bool> overwrite = false;
// 操作符用于Add和Multiply模式
public MathOperator mathOperator = MathOperator.Add;
// 是否强制转换类型(当类型不匹配时)
public SlateRef<bool> forceTypeConversion = false;
// 当类型不匹配且无法转换时的行为
public TypeMismatchBehavior onTypeMismatch = TypeMismatchBehavior.ConvertToString;
// 写入后是否从Slate中删除源变量
public SlateRef<bool> removeFromSlate = false;
// 是否记录调试信息
public SlateRef<bool> logDebug = false;
// 允许操作的数值类型
public List<Type> allowedNumericTypes = new List<Type>
{
typeof(int),
typeof(float),
typeof(double),
typeof(long),
typeof(short),
typeof(decimal)
};
public enum WriteMode
{
Set, // 直接设置值(覆盖)
Add, // 相加(仅对数值类型)
Multiply, // 相乘(仅对数值类型)
Append, // 追加(字符串、列表等)
Min, // 取最小值(仅对数值类型)
Max, // 取最大值(仅对数值类型)
Increment // 自增1仅对数值类型忽略源值
}
public enum MathOperator
{
Add, // 加法
Subtract, // 减法
Multiply, // 乘法
Divide // 除法
}
public enum TypeMismatchBehavior
{
ThrowError, // 抛出错误
Skip, // 跳过操作
ConvertToString,// 转换为字符串
UseDefault // 使用默认值
}
protected override bool TestRunInt(Slate slate)
{
return RunInternal(slate, isTestRun: true);
}
protected override void RunInt()
{
RunInternal(QuestGen.slate, isTestRun: false);
}
private bool RunInternal(Slate slate, bool isTestRun)
{
// 获取目标变量名
string targetName = targetVariableName.GetValue(slate);
if (string.IsNullOrEmpty(targetName))
{
Log.Error("[QuestNode_WriteToEventVariablesWithAdd] targetVariableName is null or empty!");
return false;
}
// 获取要操作的值
object sourceValue = GetSourceValue(slate);
if (sourceValue == null && writeMode != WriteMode.Increment)
{
if (logDebug.GetValue(slate))
{
Log.Warning($"[QuestNode_WriteToEventVariablesWithAdd] No value to operate for variable '{targetName}'.");
}
return false;
}
// 在测试运行时不需要实际写入
if (isTestRun)
{
return true;
}
// 获取EventVariableManager
var eventVarManager = Find.World.GetComponent<EventVariableManager>();
if (eventVarManager == null)
{
Log.Error("[QuestNode_WriteToEventVariablesWithAdd] EventVariableManager not found!");
return false;
}
bool variableExists = eventVarManager.HasVariable(targetName);
object currentValue = variableExists ? eventVarManager.GetVariable<object>(targetName) : null;
// 记录操作前的状态
if (logDebug.GetValue(slate))
{
Log.Message($"[QuestNode_WriteToEventVariablesWithAdd] Operation for variable '{targetName}':");
Log.Message($" - Mode: {writeMode}");
Log.Message($" - Current value: {currentValue ?? "[null]"} (Type: {currentValue?.GetType().Name ?? "null"})");
Log.Message($" - Source value: {sourceValue ?? "[null]"} (Type: {sourceValue?.GetType().Name ?? "null"})");
}
// 根据写入模式计算新值
object newValue = CalculateNewValue(currentValue, sourceValue, slate);
// 如果新值为null可能是由于类型不匹配被跳过了
if (newValue == null)
{
if (logDebug.GetValue(slate))
{
Log.Message($" - Operation skipped (new value is null)");
}
return false;
}
// 写入变量
eventVarManager.SetVariable(targetName, newValue);
// 写入后从Slate中删除源变量
if (removeFromSlate.GetValue(slate) && !string.IsNullOrEmpty(sourceVariableName.GetValue(slate)))
{
slate.Remove(sourceVariableName.GetValue(slate));
if (logDebug.GetValue(slate))
{
Log.Message($" - Removed source variable '{sourceVariableName.GetValue(slate)}' from Slate");
}
}
// 验证写入
if (logDebug.GetValue(slate))
{
object readBackValue = eventVarManager.GetVariable<object>(targetName);
bool writeVerified = (readBackValue == null && newValue == null) ||
(readBackValue != null && readBackValue.Equals(newValue));
Log.Message($" - New value written: {newValue} (Type: {newValue.GetType().Name})");
Log.Message($" - Write verified: {writeVerified}");
if (!writeVerified)
{
Log.Warning($" - Verification failed! Expected: {newValue}, Got: {readBackValue}");
}
}
return true;
}
private object GetSourceValue(Slate slate)
{
string sourceName = sourceVariableName.GetValue(slate);
if (!string.IsNullOrEmpty(sourceName))
{
if (slate.TryGet<object>(sourceName, out var slateValue))
{
return slateValue;
}
}
return value.GetValue(slate);
}
private object CalculateNewValue(object currentValue, object sourceValue, Slate slate)
{
switch (writeMode)
{
case WriteMode.Set:
return HandleSetMode(currentValue, sourceValue, slate);
case WriteMode.Add:
case WriteMode.Multiply:
return HandleMathOperation(currentValue, sourceValue, writeMode == WriteMode.Add, slate);
case WriteMode.Append:
return HandleAppendMode(currentValue, sourceValue, slate);
case WriteMode.Min:
return HandleMinMaxMode(currentValue, sourceValue, isMin: true, slate);
case WriteMode.Max:
return HandleMinMaxMode(currentValue, sourceValue, isMin: false, slate);
case WriteMode.Increment:
return HandleIncrementMode(currentValue, slate);
default:
return sourceValue;
}
}
private object HandleSetMode(object currentValue, object sourceValue, Slate slate)
{
bool variableExists = currentValue != null;
if (checkExisting.GetValue(slate) && variableExists)
{
if (!overwrite.GetValue(slate))
{
if (logDebug.GetValue(slate))
{
Log.Message($" - Variable exists and overwrite is false, keeping current value");
}
return currentValue; // 不覆盖,返回原值
}
}
return sourceValue;
}
private object HandleMathOperation(object currentValue, object sourceValue, bool isAddition, Slate slate)
{
// 如果当前值不存在,直接使用源值
if (currentValue == null)
{
return sourceValue;
}
// 尝试进行数学运算
try
{
// 检查类型是否支持数学运算
if (!IsNumericType(currentValue.GetType()) || !IsNumericType(sourceValue.GetType()))
{
return HandleTypeMismatch(currentValue, sourceValue, "non-numeric", slate);
}
// 转换为动态类型以进行数学运算
dynamic current = ConvertToBestNumericType(currentValue);
dynamic source = ConvertToBestNumericType(sourceValue);
dynamic result;
switch (mathOperator)
{
case MathOperator.Add:
result = current + source;
break;
case MathOperator.Subtract:
result = current - source;
break;
case MathOperator.Multiply:
result = current * source;
break;
case MathOperator.Divide:
if (source == 0)
{
Log.Error($"[QuestNode_WriteToEventVariablesWithAdd] Division by zero for variable operation");
return currentValue;
}
result = current / source;
break;
default:
result = current + source;
break;
}
// 根据配置决定返回类型
if (forceTypeConversion.GetValue(slate))
{
// 转换为与当前值相同的类型
return Convert.ChangeType(result, currentValue.GetType());
}
else
{
// 返回最佳类型通常是double或decimal
return result;
}
}
catch (Exception ex)
{
if (logDebug.GetValue(slate))
{
Log.Error($"[QuestNode_WriteToEventVariablesWithAdd] Math operation failed: {ex.Message}");
}
return currentValue;
}
}
private object HandleAppendMode(object currentValue, object sourceValue, Slate slate)
{
// 如果当前值不存在,直接使用源值
if (currentValue == null)
{
return sourceValue;
}
// 处理字符串追加
if (currentValue is string currentStr && sourceValue is string sourceStr)
{
return currentStr + sourceStr;
}
// 处理列表追加
if (currentValue is System.Collections.IEnumerable currentEnumerable &&
sourceValue is System.Collections.IEnumerable sourceEnumerable)
{
try
{
// 尝试创建新列表并添加所有元素
var resultList = new List<object>();
foreach (var item in currentEnumerable)
resultList.Add(item);
foreach (var item in sourceEnumerable)
resultList.Add(item);
return resultList;
}
catch
{
// 如果列表操作失败,回退到字符串追加
return currentValue.ToString() + sourceValue.ToString();
}
}
// 其他类型:转换为字符串并追加
return currentValue.ToString() + sourceValue.ToString();
}
private object HandleMinMaxMode(object currentValue, object sourceValue, bool isMin, Slate slate)
{
// 如果当前值不存在,直接使用源值
if (currentValue == null)
{
return sourceValue;
}
// 检查类型是否支持比较
if (!(currentValue is IComparable currentComparable) || !(sourceValue is IComparable sourceComparable))
{
return HandleTypeMismatch(currentValue, sourceValue, "non-comparable", slate);
}
try
{
int comparison = currentComparable.CompareTo(sourceComparable);
if (isMin)
{
// 取最小值
return comparison <= 0 ? currentValue : sourceValue;
}
else
{
// 取最大值
return comparison >= 0 ? currentValue : sourceValue;
}
}
catch (ArgumentException)
{
// 类型不匹配,无法比较
return HandleTypeMismatch(currentValue, sourceValue, "type mismatch for comparison", slate);
}
}
private object HandleIncrementMode(object currentValue, Slate slate)
{
// 如果当前值不存在从1开始
if (currentValue == null)
{
return 1;
}
// 检查是否是数值类型
if (!IsNumericType(currentValue.GetType()))
{
if (logDebug.GetValue(slate))
{
Log.Warning($"[QuestNode_WriteToEventVariablesWithAdd] Cannot increment non-numeric type: {currentValue.GetType().Name}");
}
return currentValue;
}
try
{
dynamic current = ConvertToBestNumericType(currentValue);
dynamic result = current + 1;
if (forceTypeConversion.GetValue(slate))
{
return Convert.ChangeType(result, currentValue.GetType());
}
else
{
return result;
}
}
catch (Exception ex)
{
if (logDebug.GetValue(slate))
{
Log.Error($"[QuestNode_WriteToEventVariablesWithAdd] Increment operation failed: {ex.Message}");
}
return currentValue;
}
}
private object HandleTypeMismatch(object currentValue, object sourceValue, string mismatchReason, Slate slate)
{
if (logDebug.GetValue(slate))
{
Log.Warning($"[QuestNode_WriteToEventVariablesWithAdd] Type mismatch for operation: {mismatchReason}");
}
switch (onTypeMismatch)
{
case TypeMismatchBehavior.ThrowError:
throw new InvalidOperationException($"Type mismatch for operation: {mismatchReason}");
case TypeMismatchBehavior.Skip:
if (logDebug.GetValue(slate))
{
Log.Message($" - Skipping operation due to type mismatch");
}
return currentValue; // 保持原值
case TypeMismatchBehavior.ConvertToString:
// 都转换为字符串
return currentValue.ToString() + " | " + sourceValue.ToString();
case TypeMismatchBehavior.UseDefault:
// 使用源值作为默认
return sourceValue;
default:
return currentValue;
}
}
private bool IsNumericType(Type type)
{
if (type == null) return false;
TypeCode typeCode = Type.GetTypeCode(type);
switch (typeCode)
{
case TypeCode.Byte:
case TypeCode.SByte:
case TypeCode.UInt16:
case TypeCode.UInt32:
case TypeCode.UInt64:
case TypeCode.Int16:
case TypeCode.Int32:
case TypeCode.Int64:
case TypeCode.Decimal:
case TypeCode.Double:
case TypeCode.Single:
return true;
default:
return false;
}
}
private dynamic ConvertToBestNumericType(object value)
{
if (value == null) return 0;
Type type = value.GetType();
TypeCode typeCode = Type.GetTypeCode(type);
switch (typeCode)
{
case TypeCode.Decimal:
return (decimal)value;
case TypeCode.Double:
return (double)value;
case TypeCode.Single:
return (float)value;
case TypeCode.Int64:
return (long)value;
case TypeCode.Int32:
return (int)value;
case TypeCode.Int16:
return (short)value;
case TypeCode.UInt64:
return (ulong)value;
case TypeCode.UInt32:
return (uint)value;
case TypeCode.UInt16:
return (ushort)value;
case TypeCode.Byte:
return (byte)value;
case TypeCode.SByte:
return (sbyte)value;
default:
// 尝试转换
try
{
return Convert.ToDouble(value);
}
catch
{
return 0;
}
}
}
}
}

View File

@@ -70,7 +70,335 @@
<HintPath>..\..\..\..\..\..\common\RimWorld\RimWorldWin64_Data\Managed\UnityEngine.TextRenderingModule.dll</HintPath>
<Private>False</Private>
</Reference>
<Compile Include="**\*.cs" Exclude="bin\**;obj\**" />
<Compile Include="Ability\CompAbilityEffect_LaunchMultiProjectile.cs" />
<Compile Include="Ability\CompAbilityEffect_RequiresNonHostility.cs" />
<Compile Include="Ability\CompAbilityEffect_ResearchPrereq.cs" />
<Compile Include="Ability\LightningBombardment.cs" />
<Compile Include="Ability\WULA_AbilityAreaDestruction\CompAbilityEffect_AreaDestruction.cs" />
<Compile Include="Ability\WULA_AbilityAreaDestruction\CompProperties_AbilityAreaDestruction.cs" />
<Compile Include="Ability\WULA_AbilityBombardment\CompAbilityEffect_Bombardment.cs" />
<Compile Include="Ability\WULA_AbilityBombardment\CompProperties_AbilityBombardment.cs" />
<Compile Include="Ability\WULA_AbilityCallSkyfaller\CompAbilityEffect_CallSkyfaller.cs" />
<Compile Include="Ability\WULA_AbilityCallSkyfaller\CompProperties_AbilityCallSkyfaller.cs" />
<Compile Include="Ability\WULA_AbilityCallSkyfaller\MapComponent_SkyfallerDelayed.cs" />
<Compile Include="Ability\WULA_AbilityCircularBombardment\CompAbilityEffect_CircularBombardment.cs" />
<Compile Include="Ability\WULA_AbilityCircularBombardment\CompProperties_AbilityCircularBombardment.cs" />
<Compile Include="Ability\WULA_AbilityDeleteTarget\CompAbilityEffect_DeleteTarget.cs" />
<Compile Include="Ability\WULA_AbilityDeleteTarget\CompProperties_AbilityDeleteTarget.cs" />
<Compile Include="Ability\WULA_AbilityEnergyLance\AbilityWeaponDefExtension.cs" />
<Compile Include="Ability\WULA_AbilityEnergyLance\CompAbilityEffect_EnergyLance.cs" />
<Compile Include="Ability\WULA_AbilityEnergyLance\CompProperties_AbilityEnergyLance.cs" />
<Compile Include="Ability\WULA_AbilityEnergyLance\EnergyLance.cs" />
<Compile Include="Ability\WULA_AbilityEnergyLance\EnergyLanceExtension.cs" />
<Compile Include="Ability\WULA_AbilitySpawnAligned\CompAbilityEffect_SpawnAligned.cs" />
<Compile Include="Ability\WULA_AbilitySpawnAligned\CompProperties_AbilitySpawnAligned.cs" />
<Compile Include="Ability\WULA_AbilityStunKnockback\CompAbilityEffect_StunKnockback.cs" />
<Compile Include="Ability\WULA_AbilityStunKnockback\CompProperties_StunKnockback.cs" />
<Compile Include="Ability\WULA_AbilityTeleportSelf\CompAbilityEffect_TeleportSelf.cs" />
<Compile Include="Ability\WULA_AbilityTeleportSelf\CompProperties_AbilityTeleportSelf.cs" />
<Compile Include="Ability\WULA_EquippableAbilities\CompEquippableAbilities.cs" />
<Compile Include="Ability\WULA_EquippableAbilities\CompProperties_EquippableAbilities.cs" />
<Compile Include="Ability\WULA_PullTarget\CompAbilityEffect_PullTarget.cs" />
<Compile Include="Ability\WULA_PullTarget\CompProperties_AbilityPullTarget.cs" />
<Compile Include="BuildingComp\Building_ExtraGraphics.cs" />
<Compile Include="BuildingComp\Building_MapObserver.cs" />
<Compile Include="BuildingComp\Building_TurretGunHasSpeed.cs" />
<Compile Include="BuildingComp\CompPathCostUpdater.cs" />
<Compile Include="BuildingComp\WULA_BuildingBombardment\CompBuildingBombardment.cs" />
<Compile Include="BuildingComp\WULA_BuildingBombardment\CompProperties_BuildingBombardment.cs" />
<Compile Include="BuildingComp\WULA_BuildingSpawner\CompBuildingSpawner.cs" />
<Compile Include="BuildingComp\WULA_BuildingSpawner\CompProperties_BuildingSpawner.cs" />
<Compile Include="BuildingComp\WULA_EnergyLanceTurret\CompEnergyLanceTurret.cs" />
<Compile Include="BuildingComp\WULA_EnergyLanceTurret\CompProperties_EnergyLanceTurret.cs" />
<Compile Include="BuildingComp\WULA_InitialFaction\CompProperties_InitialFaction.cs" />
<Compile Include="BuildingComp\WULA_MechanoidRecycler\Building_MechanoidRecycler.cs" />
<Compile Include="BuildingComp\WULA_MechanoidRecycler\CompProperties_MechanoidRecycler.cs" />
<Compile Include="BuildingComp\WULA_MechanoidRecycler\JobDriver_RecycleMechanoid.cs" />
<Compile Include="BuildingComp\WULA_PhaseCombatTower\CompPhaseCombatTower.cs" />
<Compile Include="BuildingComp\WULA_PhaseCombatTower\CompProperties_PhaseCombatTower.cs" />
<Compile Include="BuildingComp\WULA_Shuttle\ArmedShuttleIncoming.cs" />
<Compile Include="BuildingComp\WULA_Shuttle\Building_ArmedShuttle.cs" />
<Compile Include="BuildingComp\WULA_Shuttle\Building_ArmedShuttleWithPocket.cs" />
<Compile Include="BuildingComp\WULA_Shuttle\Building_PocketMapExit.cs" />
<Compile Include="BuildingComp\WULA_Shuttle\Dialog_ArmedShuttleTransfer.cs" />
<Compile Include="BuildingComp\WULA_Shuttle\GenStep_WulaPocketSpaceSmall.cs" />
<Compile Include="BuildingComp\WULA_Shuttle\PocketSpaceThingHolder.cs" />
<Compile Include="BuildingComp\WULA_SkyfallerCaller\CompPrefabSkyfallerCaller.cs" />
<Compile Include="BuildingComp\WULA_SkyfallerCaller\CompProperties_PrefabSkyfallerCaller.cs" />
<Compile Include="BuildingComp\WULA_SkyfallerCaller\CompProperties_SkyfallerCaller.cs" />
<Compile Include="BuildingComp\WULA_SkyfallerCaller\CompSkyfallerCaller.cs" />
<Compile Include="BuildingComp\WULA_SkyfallerCaller\DebugActions_PrefabSkyfallerCaller.cs" />
<Compile Include="BuildingComp\WULA_SkyfallerCaller\Skyfaller_PrefabSpawner.cs" />
<Compile Include="BuildingComp\WULA_SkyfallerCaller\WulaSkyfallerWorldComponent.cs" />
<Compile Include="BuildingComp\WULA_SkyfallerCaller\WULA_SkyfallerFactioncs\CompProperties_SkyfallerFaction.cs" />
<Compile Include="BuildingComp\WULA_SkyfallerCaller\WULA_SkyfallerFactioncs\CompSkyfallerFaction.cs" />
<Compile Include="BuildingComp\WULA_StorageTurret\CompProperties_StorageTurret.cs" />
<Compile Include="BuildingComp\WULA_StorageTurret\CompStorageTurret.cs" />
<Compile Include="BuildingComp\WULA_Teleporter\CompMapTeleporter.cs" />
<Compile Include="BuildingComp\WULA_Teleporter\CompProperties_MapTeleporter.cs" />
<Compile Include="BuildingComp\WULA_Teleporter\WULA_TeleportLandingMarker.cs" />
<Compile Include="BuildingComp\WULA_TransformAtFullCapacity\CompProperties_TransformAtFullCapacity.cs" />
<Compile Include="BuildingComp\WULA_TransformAtFullCapacity\CompProperties_TransformIntoBuilding.cs" />
<Compile Include="BuildingComp\WULA_TransformAtFullCapacity\CompTransformAtFullCapacity.cs" />
<Compile Include="BuildingComp\WULA_TransformAtFullCapacity\CompTransformIntoBuilding.cs" />
<Compile Include="BuildingComp\WULA_TransformAtFullCapacity\TransformValidationUtility.cs" />
<Compile Include="BuildingComp\WULA_TrapLauncher\CompProperties_TrapLauncher.cs" />
<Compile Include="BuildingComp\WULA_TrapLauncher\CompTrapLauncher.cs" />
<Compile Include="Damage\DamageDefExtension_TerrainCover.cs" />
<Compile Include="Damage\DamageDef_ExtraDamageExtension.cs" />
<Compile Include="Damage\DamageWorker_ExplosionWithTerrain.cs" />
<Compile Include="Damage\DamageWorker_ExtraDamage.cs" />
<Compile Include="Designator\Designator_CallSkyfallerInArea.cs" />
<Compile Include="Designator\Designator_TeleportArrival.cs" />
<Compile Include="EventSystem\CompOpenCustomUI.cs" />
<Compile Include="EventSystem\Condition\ConditionBase.cs" />
<Compile Include="EventSystem\Condition\Condition_FlagExists.cs" />
<Compile Include="EventSystem\DebugActions.cs" />
<Compile Include="EventSystem\DelayedActionManager.cs" />
<Compile Include="EventSystem\Dialog_CustomDisplay.cs" />
<Compile Include="EventSystem\Dialog_ManageEventVariables.cs" />
<Compile Include="EventSystem\Effect\EffectBase.cs" />
<Compile Include="EventSystem\Effect\Effect_CallSkyfaller.cs" />
<Compile Include="EventSystem\Effect\Effect_SetTimedFlag.cs" />
<Compile Include="EventSystem\EventDef.cs" />
<Compile Include="EventSystem\EventUIButtonConfigDef.cs" />
<Compile Include="EventSystem\EventUIConfigDef.cs" />
<Compile Include="EventSystem\EventVariableManager.cs" />
<Compile Include="EventSystem\QuestNode\QuestNode_EventLetter.cs" />
<Compile Include="EventSystem\QuestNode\QuestNode_Root_EventLetter.cs" />
<Compile Include="EventSystem\QuestNode\QuestNode_WriteToEventVariablesWithAdd.cs" />
<Compile Include="Flyover\ThingclassFlyOver.cs" />
<Compile Include="Flyover\WULA_AircraftHangar\CompAbilityEffect_AircraftStrike.cs" />
<Compile Include="Flyover\WULA_AircraftHangar\CompAircraftHangar.cs" />
<Compile Include="Flyover\WULA_AircraftHangar\WorldComponent_AircraftManager.cs" />
<Compile Include="Flyover\WULA_BlockedByFlyOverFacility\CompAbilityEffect_BlockedByFlyOverFacility.cs" />
<Compile Include="Flyover\WULA_DestroyFlyOverByFacilities\CompProperties_DestroyFlyOverByFacilities.cs" />
<Compile Include="Flyover\WULA_FlyOverDropPod\CompProperties_FlyOverDropPod.cs" />
<Compile Include="Flyover\WULA_FlyOverEscort\CompFlyOverEscort.cs" />
<Compile Include="Flyover\WULA_FlyOverEscort\CompProperties_FlyOverEscort.cs" />
<Compile Include="Flyover\WULA_FlyOverFacilities\CompAbilityEffect_RequireFlyOverFacility.cs" />
<Compile Include="Flyover\WULA_FlyOverFacilities\CompFlyOverFacilities.cs" />
<Compile Include="Flyover\WULA_GlobalFlyOverCooldown\CompAbilityEffect_GlobalFlyOverCooldown.cs" />
<Compile Include="Flyover\WULA_GlobalFlyOverCooldown\CompFlyOverCooldown.cs" />
<Compile Include="Flyover\WULA_GroundStrafing\CompGroundStrafing.cs" />
<Compile Include="Flyover\WULA_SectorSurveillance\CompSectorSurveillance.cs" />
<Compile Include="Flyover\WULA_SendLetterAfterTicks\CompProperties_SendLetterAfterTicks.cs" />
<Compile Include="Flyover\WULA_SendLetterAfterTicks\CompSendLetterAfterTicks.cs" />
<Compile Include="Flyover\WULA_ShipArtillery\CompProperties_ShipArtillery.cs" />
<Compile Include="Flyover\WULA_ShipArtillery\CompShipArtillery.cs" />
<Compile Include="Flyover\WULA_SpawnFlyOver\CompAbilityEffect_SpawnFlyOver.cs" />
<Compile Include="Flyover\WULA_SpawnFlyOver\CompProperties_AbilitySpawnFlyOver.cs" />
<Compile Include="GlobalWorkTable\Building_GlobalWorkTable.cs" />
<Compile Include="GlobalWorkTable\CompProperties_ProductionCategory.cs" />
<Compile Include="GlobalWorkTable\GlobalProductionOrder.cs" />
<Compile Include="GlobalWorkTable\GlobalProductionOrderStack.cs" />
<Compile Include="GlobalWorkTable\GlobalStorageWorldComponent.cs" />
<Compile Include="GlobalWorkTable\GlobalWorkTableAirdropExtension.cs" />
<Compile Include="GlobalWorkTable\ITab_GlobalBills.cs" />
<Compile Include="GlobalWorkTable\JobDriver_GlobalWorkTable.cs" />
<Compile Include="GlobalWorkTable\WorkGiver_GlobalWorkTable.cs" />
<Compile Include="GlobalWorkTable\WULA_Launchable_ToGlobalStorage\CompLaunchable_ToGlobalStorage.cs" />
<Compile Include="GlobalWorkTable\WULA_Launchable_ToGlobalStorage\CompProperties_GarbageShield.cs" />
<Compile Include="GlobalWorkTable\WULA_Launchable_ToGlobalStorage\CompProperties_Launchable_ToGlobalStorage.cs" />
<Compile Include="GlobalWorkTable\WULA_ValueConverter\CompProperties_ValueConverter.cs" />
<Compile Include="GlobalWorkTable\WULA_ValueConverter\CompValueConverter.cs" />
<Compile Include="HarmonyPatches\Caravan_NeedsTracker_TrySatisfyPawnNeeds_Patch.cs" />
<Compile Include="HarmonyPatches\DamageInfo_Constructor_Patch.cs" />
<Compile Include="HarmonyPatches\Faction_ShouldHaveLeader_Patch.cs" />
<Compile Include="HarmonyPatches\FloatMenuOptionProvider_Ingest_Patch.cs" />
<Compile Include="HarmonyPatches\Hediff_Mechlink_PostAdd_Patch.cs" />
<Compile Include="HarmonyPatches\IngestPatch.cs" />
<Compile Include="HarmonyPatches\MapParent_ShouldRemoveMapNow_Patch.cs" />
<Compile Include="HarmonyPatches\MechanitorPatch.cs" />
<Compile Include="HarmonyPatches\MechanitorUtility_InMechanitorCommandRange_Patch.cs" />
<Compile Include="HarmonyPatches\MechWeapon\CompMechWeapon.cs" />
<Compile Include="HarmonyPatches\MechWeapon\FloatMenuProvider_Mech.cs" />
<Compile Include="HarmonyPatches\MechWeapon\Patch_MissingWeapon.cs" />
<Compile Include="HarmonyPatches\MechWeapon\Patch_WeaponDrop.cs" />
<Compile Include="HarmonyPatches\NoBloodForWulaPatch.cs" />
<Compile Include="HarmonyPatches\Patch_CaravanInventoryUtility_FindShuttle.cs" />
<Compile Include="HarmonyPatches\Patch_CaravanUIUtility_AddPawnsSections_Postfix.cs" />
<Compile Include="HarmonyPatches\Patch_DropCellFinder_SkyfallerCanLandAt.cs" />
<Compile Include="HarmonyPatches\Patch_JobGiver_GatherOfferingsForPsychicRitual.cs" />
<Compile Include="HarmonyPatches\Patch_Pawn_JobTracker_StartJob.cs" />
<Compile Include="HarmonyPatches\Patch_Pawn_PreApplyDamage.cs" />
<Compile Include="HarmonyPatches\Patch_ThingDefGenerator_Techprints_ImpliedTechprintDefs.cs" />
<Compile Include="HarmonyPatches\Projectile_Launch_Patch.cs" />
<Compile Include="HarmonyPatches\ScenPart_PlayerPawnsArriveMethod_Patch.cs" />
<Compile Include="HarmonyPatches\WulaSpeciesCorpsePatch.cs" />
<Compile Include="HarmonyPatches\WULA_AutonomousMech\Patch_Alert_MechLacksOverseer.cs" />
<Compile Include="HarmonyPatches\WULA_AutonomousMech\Patch_CaravanFormingUtility_AllSendablePawns.cs" />
<Compile Include="HarmonyPatches\WULA_AutonomousMech\Patch_FloatMenuOptionProvider_SelectedPawnValid.cs" />
<Compile Include="HarmonyPatches\WULA_AutonomousMech\Patch_IsColonyMechPlayerControlled.cs" />
<Compile Include="HarmonyPatches\WULA_AutonomousMech\Patch_MainTabWindow_Mechs_Pawns.cs" />
<Compile Include="HarmonyPatches\WULA_AutonomousMech\Patch_MechanitorUtility_CanDraftMech.cs" />
<Compile Include="HarmonyPatches\WULA_AutonomousMech\Patch_MechanitorUtility_EverControllable.cs" />
<Compile Include="HarmonyPatches\WULA_AutonomousMech\Patch_Pawn_ThreatDisabled.cs" />
<Compile Include="HarmonyPatches\WULA_AutonomousMech\Patch_UncontrolledMechDrawPulse.cs" />
<Compile Include="HarmonyPatches\WULA_TurretForceTargetable\CompForceTargetable.cs" />
<Compile Include="HarmonyPatches\WULA_TurretForceTargetable\Patch_ForceTargetable.cs" />
<Compile Include="HediffComp\HediffCompProperties_DisappearWithEffect.cs" />
<Compile Include="HediffComp\HediffCompProperties_GiveHediffsInRangeToRace.cs" />
<Compile Include="HediffComp\HediffCompProperties_NanoRepair.cs" />
<Compile Include="HediffComp\HediffCompProperties_SwitchableHediff.cs" />
<Compile Include="HediffComp\HediffComp_DamageResponse.cs" />
<Compile Include="HediffComp\HediffComp_GiveHediffsInRangeToRace.cs" />
<Compile Include="HediffComp\HediffComp_RegenerateBackstory.cs" />
<Compile Include="HediffComp\HediffComp_TimedExplosion.cs" />
<Compile Include="HediffComp\WULA_HediffComp_TopTurret\HediffComp_TopTurret.cs" />
<Compile Include="HediffComp\WULA_HediffDamgeShield\DRMDamageShield.cs" />
<Compile Include="HediffComp\WULA_HediffDamgeShield\Hediff_DamageShield.cs" />
<Compile Include="HediffComp\WULA_HediffSpawner\HediffCompProperties_Spawner.cs" />
<Compile Include="HediffComp\WULA_HediffSpawner\HediffComp_Spawner.cs" />
<Compile Include="HediffComp\WULA_HediffSpawner\Tools.cs" />
<Compile Include="Job\JobDriver_InspectBuilding.cs" />
<Compile Include="Job\JobGiver_InspectBuilding.cs" />
<Compile Include="PawnsArrivalMode\PawnsArrivalModeWorker_EdgeTeleport.cs" />
<Compile Include="Pawn\Comp_MultiTurretGun.cs" />
<Compile Include="Pawn\Comp_PawnRenderExtra.cs" />
<Compile Include="Pawn\WULA_AutoMechCarrier\CompAutoMechCarrier.cs" />
<Compile Include="Pawn\WULA_AutoMechCarrier\CompProperties_AutoMechCarrier.cs" />
<Compile Include="Pawn\WULA_AutoMechCarrier\PawnProductionEntry.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\CompAutonomousMech.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\DroneGizmo.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\JobGiver_DroneSelfShutdown.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\PawnColumnWorker_DroneEnergy.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\PawnColumnWorker_DroneWorkMode.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\ThinkNode_ConditionalAutonomousWorkMode.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\ThinkNode_ConditionalLowEnergy_Drone.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\ThinkNode_ConditionalNeedRecharge.cs" />
<Compile Include="Pawn\WULA_AutonomousMech\ThinkNode_ConditionalWorkMode_Drone.cs" />
<Compile Include="Pawn\WULA_BrokenPersonality\MentalBreakWorker_BrokenPersonality.cs" />
<Compile Include="Pawn\WULA_BrokenPersonality\MentalStateDefExtension_BrokenPersonality.cs" />
<Compile Include="Pawn\WULA_BrokenPersonality\MentalState_BrokenPersonality.cs" />
<Compile Include="Pawn\WULA_Cat_Invisible\CompFighterInvisible.cs" />
<Compile Include="Pawn\WULA_Cat_Invisible\CompProperties_FighterInvisible.cs" />
<Compile Include="Pawn\WULA_CompHediffGiver\CompHediffGiver.cs" />
<Compile Include="Pawn\WULA_CompHediffGiver\CompProperties_HediffGiver.cs" />
<Compile Include="Pawn\WULA_Energy\CompChargingBed.cs" />
<Compile Include="Pawn\WULA_Energy\HediffComp_WulaCharging.cs" />
<Compile Include="Pawn\WULA_Energy\JobDriver_FeedWulaPatient.cs" />
<Compile Include="Pawn\WULA_Energy\JobDriver_IngestWulaEnergy.cs" />
<Compile Include="Pawn\WULA_Energy\JobGiverDefExtension_WulaPackEnergy.cs" />
<Compile Include="Pawn\WULA_Energy\JobGiver_WulaGetEnergy.cs" />
<Compile Include="Pawn\WULA_Energy\JobGiver_WulaPackEnergy.cs" />
<Compile Include="Pawn\WULA_Energy\NeedDefExtension_Energy.cs" />
<Compile Include="Pawn\WULA_Energy\Need_WulaEnergy.cs" />
<Compile Include="Pawn\WULA_Energy\ThingDefExtension_EnergySource.cs" />
<Compile Include="Pawn\WULA_Energy\WorkGiverDefExtension_FeedWula.cs" />
<Compile Include="Pawn\WULA_Energy\WorkGiver_FeedWulaPatient.cs" />
<Compile Include="Pawn\WULA_Energy\WorkGiver_Warden_DeliverEnergy.cs" />
<Compile Include="Pawn\WULA_Energy\WorkGiver_Warden_FeedWula.cs" />
<Compile Include="Pawn\WULA_Energy\WulaCaravanEnergyDef.cs" />
<Compile Include="Pawn\WULA_Flight\CompPawnFlight.cs" />
<Compile Include="Pawn\WULA_Flight\CompProperties_PawnFlight.cs" />
<Compile Include="Pawn\WULA_Flight\PawnRenderNodeWorker_AttachmentBody_NoFlight.cs" />
<Compile Include="Pawn\WULA_Flight\Pawn_FlightTrackerPatches.cs" />
<Compile Include="Pawn\WULA_Maintenance\Building_MaintenancePod.cs" />
<Compile Include="Pawn\WULA_Maintenance\CompMaintenancePod.cs" />
<Compile Include="Pawn\WULA_Maintenance\HediffCompProperties_MaintenanceDamage.cs" />
<Compile Include="Pawn\WULA_Maintenance\JobDriver_EnterMaintenancePod.cs" />
<Compile Include="Pawn\WULA_Maintenance\JobDriver_HaulToMaintenancePod.cs" />
<Compile Include="Pawn\WULA_Maintenance\MaintenanceNeedExtension.cs" />
<Compile Include="Pawn\WULA_Maintenance\Need_Maintenance.cs" />
<Compile Include="Pawn\WULA_Maintenance\WorkGiver_DoMaintenance.cs" />
<Compile Include="Placeworker\CompProperties_CustomRadius.cs" />
<Compile Include="Projectiles\BulletWithTrail.cs" />
<Compile Include="Projectiles\ExplosiveTrackingBulletDef.cs" />
<Compile Include="Projectiles\NorthArcModExtension.cs" />
<Compile Include="Projectiles\Projectile_ConfigurableHellsphereCannon.cs" />
<Compile Include="Projectiles\Projectile_CruiseMissile.cs" />
<Compile Include="Projectiles\Projectile_ExplosiveTrackingBullet.cs" />
<Compile Include="Projectiles\Projectile_ExplosiveWithTrail.cs" />
<Compile Include="Projectiles\Projectile_NorthArcTrail.cs" />
<Compile Include="Projectiles\Projectile_TrackingBullet.cs" />
<Compile Include="Projectiles\Projectile_WulaPenetratingBeam.cs" />
<Compile Include="Projectiles\Projectile_WulaPenetratingBullet.cs" />
<Compile Include="Projectiles\TrackingBulletDef.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<Compile Include="QuestNodes\QuestNode_AddInspectionJob.cs" />
<Compile Include="QuestNodes\QuestNode_CheckGlobalResource.cs" />
<Compile Include="QuestNodes\QuestNode_GeneratePawnWithCustomization.cs" />
<Compile Include="QuestNodes\QuestNode_Hyperlinks.cs" />
<Compile Include="QuestNodes\QuestNode_SpawnPrefabSkyfallerCaller.cs" />
<Compile Include="QuestNodes\QuestPart_GlobalResourceCheck.cs" />
<Compile Include="SectionLayer_WulaHull.cs" />
<Compile Include="Stat\StatWorker_Energy.cs" />
<Compile Include="Stat\StatWorker_Maintenance.cs" />
<Compile Include="Stat\StatWorker_NanoRepair.cs" />
<Compile Include="Storyteller\WULA_ImportantQuestWithFactionFilter\StorytellerCompProperties_ImportantQuestWithFactionFilter.cs" />
<Compile Include="Storyteller\WULA_ImportantQuestWithFactionFilter\StorytellerComp_ImportantQuestWithFactionFilter.cs" />
<Compile Include="Storyteller\WULA_SimpleTechnologyTrigger\StorytellerCompProperties_SimpleTechnologyTrigger.cs" />
<Compile Include="Storyteller\WULA_SimpleTechnologyTrigger\StorytellerComp_SimpleTechnologyTrigger.cs" />
<Compile Include="ThingComp\CompAndPatch_GiveHediffOnShot.cs" />
<Compile Include="ThingComp\CompApparelInterceptor.cs" />
<Compile Include="ThingComp\CompProperties_DelayedDamageIfNotPlayer.cs" />
<Compile Include="ThingComp\CompPsychicScaling.cs" />
<Compile Include="ThingComp\CompUseEffect_AddDamageShieldCharges.cs" />
<Compile Include="ThingComp\CompUseEffect_OpenCustomUI.cs" />
<Compile Include="ThingComp\CompUseEffect_PassionTrainer.cs" />
<Compile Include="ThingComp\CompUseEffect_WulaSkillTrainer.cs" />
<Compile Include="ThingComp\Comp_WeaponRenderDynamic.cs" />
<Compile Include="ThingComp\WULA_AreaDamage\CompAreaDamage.cs" />
<Compile Include="ThingComp\WULA_AreaDamage\CompProperties_AreaDamage.cs" />
<Compile Include="ThingComp\WULA_AreaShield\AreaShieldManager.cs" />
<Compile Include="ThingComp\WULA_AreaShield\CompProperties_AreaShield.cs" />
<Compile Include="ThingComp\WULA_AreaShield\Gizmo_AreaShieldStatus.cs" />
<Compile Include="ThingComp\WULA_AreaShield\Harmony_AreaShieldInterceptor.cs" />
<Compile Include="ThingComp\WULA_AreaShield\ThingComp_AreaShield.cs" />
<Compile Include="ThingComp\WULA_AreaTeleporter\CompProperties_AreaTeleporter.cs" />
<Compile Include="ThingComp\WULA_AreaTeleporter\ThingComp_AreaTeleporter.cs" />
<Compile Include="ThingComp\WULA_CustomUniqueWeapon\CompCustomUniqueWeapon.cs" />
<Compile Include="ThingComp\WULA_CustomUniqueWeapon\CompProperties_CustomUniqueWeapon.cs" />
<Compile Include="ThingComp\WULA_DamageTransaction\CompDamageInterceptor.cs" />
<Compile Include="ThingComp\WULA_DamageTransaction\CompDamageRelay.cs" />
<Compile Include="ThingComp\WULA_DamageTransaction\CompProperties_DamageInterceptor.cs" />
<Compile Include="ThingComp\WULA_DamageTransaction\CompProperties_DamageRelay.cs" />
<Compile Include="ThingComp\WULA_GiveHediffsInRange\CompGiveHediffsInRange.cs" />
<Compile Include="ThingComp\WULA_GiveHediffsInRange\CompProperties_GiveHediffsInRange.cs" />
<Compile Include="ThingComp\WULA_MechRepairKit\CompUseEffect_FixAllHealthConditions.cs" />
<Compile Include="ThingComp\WULA_MechRepairKit\Recipe_AdministerWulaMechRepairKit.cs" />
<Compile Include="ThingComp\WULA_PeriodicGameCondition\CompPeriodicGameCondition.cs" />
<Compile Include="ThingComp\WULA_PeriodicGameCondition\CompProperties_PeriodicGameCondition.cs" />
<Compile Include="ThingComp\WULA_PersonaCore\CompExperienceCore.cs" />
<Compile Include="ThingComp\WULA_PersonaCore\CompExperienceDataPack.cs" />
<Compile Include="ThingComp\WULA_PersonaCore\CompProperties_ExperienceCore.cs" />
<Compile Include="ThingComp\WULA_PlaySoundOnSpawn\CompPlaySoundOnSpawn.cs" />
<Compile Include="ThingComp\WULA_PlaySoundOnSpawn\CompProperties_PlaySoundOnSpawn.cs" />
<Compile Include="ThingComp\WULA_PsychicRitual\CompWulaRitualSpot.cs" />
<Compile Include="ThingComp\WULA_PsychicRitual\PsychicRitualDef_AddHediff.cs" />
<Compile Include="ThingComp\WULA_PsychicRitual\PsychicRitualDef_Wula.cs" />
<Compile Include="ThingComp\WULA_PsychicRitual\PsychicRitualDef_WulaBase.cs" />
<Compile Include="ThingComp\WULA_PsychicRitual\PsychicRitualToil_AddHediff.cs" />
<Compile Include="ThingComp\WULA_PsychicRitual\PsychicRitualToil_GatherForInvocation_Wula.cs" />
<Compile Include="ThingComp\WULA_PsychicRitual\PsychicRitual_TechOffering.cs" />
<Compile Include="ThingComp\WULA_PsychicRitual\RitualTagExtension.cs" />
<Compile Include="ThingComp\WULA_SkyfallerPawnSpawner\CompProperties_SkyfallerPawnSpawner.cs" />
<Compile Include="ThingComp\WULA_SkyfallerPawnSpawner\Skyfaller_PawnSpawner.cs" />
<Compile Include="ThingComp\WULA_WeaponSwitch\CompAbilityEffect_GiveSwitchHediff.cs" />
<Compile Include="ThingComp\WULA_WeaponSwitch\CompAbilityEffect_RemoveSwitchHediff.cs" />
<Compile Include="ThingComp\WULA_WeaponSwitch\WeaponSwitch.cs" />
<Compile Include="Utils\BezierUtil.cs" />
<Compile Include="Verb\MeleeAttack_Cleave\CompCleave.cs" />
<Compile Include="Verb\MeleeAttack_Cleave\Verb_MeleeAttack_Cleave.cs" />
<Compile Include="Verb\MeleeAttack_MultiStrike\CompMultiStrike.cs" />
<Compile Include="Verb\MeleeAttack_MultiStrike\Verb_MeleeAttack_MultiStrike.cs" />
<Compile Include="Verb\Verb_Excalibur\Thing_ExcaliburBeam.cs" />
<Compile Include="Verb\Verb_Excalibur\VerbProperties_Excalibur.cs" />
<Compile Include="Verb\Verb_Excalibur\Verb_Excalibur.cs" />
<Compile Include="Verb\Verb_ShootArc.cs" />
<Compile Include="Verb\Verb_ShootBeamExplosive\VerbPropertiesExplosiveBeam.cs" />
<Compile Include="Verb\Verb_ShootBeamExplosive\Verb_ShootBeamExplosive.cs" />
<Compile Include="Verb\Verb_ShootBeamSplitAndChain.cs" />
<Compile Include="Verb\Verb_ShootMeltBeam.cs" />
<Compile Include="Verb\Verb_ShootShotgun.cs" />
<Compile Include="Verb\Verb_ShootShotgunWithOffset.cs" />
<Compile Include="Verb\Verb_ShootWeaponStealBeam\VerbProperties_WeaponStealBeam.cs" />
<Compile Include="Verb\Verb_ShootWeaponStealBeam\Verb_ShootWeaponStealBeam.cs" />
<Compile Include="Verb\Verb_ShootWithOffset.cs" />
<Compile Include="WorkGiver\WorkGiver_DeepDrill_WulaConstructor.cs" />
<Compile Include="WulaDefOf.cs" />
<Compile Include="WulaFallenEmpireMod.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- 自定义清理任务删除obj文件夹中的临时文件 -->