diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll
index 5cc44fa7..76101c87 100644
Binary files a/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/Assemblies/WulaFallenEmpire.dll differ
diff --git a/1.6/Defs/HediffDefs/Hediffs_WULA_Emergency.xml b/1.6/Defs/HediffDefs/Hediffs_WULA_Emergency.xml
index e8da5c8d..dfe9031e 100644
--- a/1.6/Defs/HediffDefs/Hediffs_WULA_Emergency.xml
+++ b/1.6/Defs/HediffDefs/Hediffs_WULA_Emergency.xml
@@ -23,13 +23,9 @@
Consciousness
1.0
-
- Moving
- 1.0
-
-
\ No newline at end of file
+
diff --git a/1.6/Defs/JobDefs/WULA_Jobs_Emergency.xml b/1.6/Defs/JobDefs/WULA_Jobs_Emergency.xml
new file mode 100644
index 00000000..619ddd3d
--- /dev/null
+++ b/1.6/Defs/JobDefs/WULA_Jobs_Emergency.xml
@@ -0,0 +1,12 @@
+
+
+
+
+ WULA_CastEmergencyEnergyRestore
+ WulaFallenEmpire.JobDriver_CastEmergencyEnergyRestore
+ activating emergency energy restore.
+ false
+ true
+
+
+
diff --git a/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml b/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml
index 2c2d26b7..b7ca98e0 100644
--- a/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml
+++ b/1.6/Defs/ThinkTreeDefs/WULA_ThinkTrees.xml
@@ -6,7 +6,7 @@
- 0.3
+ 0.5
0.1
5.0
9.5
diff --git a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo
index 9017a721..695c7b1c 100644
Binary files a/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo and b/Source/WulaFallenEmpire/.vs/WulaFallenEmpire/v17/.suo differ
diff --git a/Source/WulaFallenEmpire/CompWulaShieldBelt.cs b/Source/WulaFallenEmpire/CompWulaShieldBelt.cs
index 46ff596c..7339e8f7 100644
--- a/Source/WulaFallenEmpire/CompWulaShieldBelt.cs
+++ b/Source/WulaFallenEmpire/CompWulaShieldBelt.cs
@@ -14,7 +14,6 @@ namespace WulaFallenEmpire
private int lastKeepDisplayTick = -9999;
private Vector3 impactAngleVect;
private int lastAbsorbDamageTick = -9999;
- private bool shieldEnabled = false;
private Sustainer sustainer;
// 静态构造函数加载材质
private static readonly Material BubbleMat = MaterialPool.MatFrom("Other/ShieldBubble", ShaderDatabase.Transparent, Color.white);
@@ -23,7 +22,6 @@ namespace WulaFallenEmpire
public float ShieldHitPoints => shieldHitPoints;
public float ShieldMaxHitPoints => Props.maxShieldHitPoints;
- public bool ShieldEnabled => shieldEnabled;
private bool ShouldDisplay
{
@@ -39,7 +37,6 @@ namespace WulaFallenEmpire
base.PostExposeData();
Scribe_Values.Look(ref shieldHitPoints, "shieldHitPoints", 0f);
Scribe_Values.Look(ref ticksToReset, "ticksToReset", -1);
- Scribe_Values.Look(ref shieldEnabled, "shieldEnabled", Props.startEnabled);
}
public override void PostSpawnSetup(bool respawningAfterLoad)
@@ -48,7 +45,6 @@ namespace WulaFallenEmpire
if (!respawningAfterLoad)
{
shieldHitPoints = Props.maxShieldHitPoints;
- shieldEnabled = Props.startEnabled;
}
}
@@ -59,19 +55,11 @@ namespace WulaFallenEmpire
Pawn wearer = GetWearer();
if (wearer == null) return;
- if (shieldEnabled)
+ if (sustainer == null && Props.activeSound != null)
{
- if (sustainer == null && Props.activeSound != null)
- {
- sustainer = Props.activeSound.TrySpawnSustainer(SoundInfo.InMap(wearer, MaintenanceType.PerTick));
- }
- sustainer?.Maintain();
- }
- else
- {
- sustainer?.End();
- sustainer = null;
+ sustainer = Props.activeSound.TrySpawnSustainer(SoundInfo.InMap(wearer, MaintenanceType.PerTick));
}
+ sustainer?.Maintain();
if (ticksToReset > 0)
{
@@ -81,7 +69,7 @@ namespace WulaFallenEmpire
Reset();
}
}
- else if (shieldEnabled && Props.useHitPointsMode && shieldHitPoints < Props.maxShieldHitPoints)
+ else if (Props.useHitPointsMode && shieldHitPoints < Props.maxShieldHitPoints)
{
shieldHitPoints += Props.rechargeRate / 60f; // 每秒恢复
if (shieldHitPoints > Props.maxShieldHitPoints)
@@ -94,7 +82,7 @@ namespace WulaFallenEmpire
public override void PostDraw()
{
base.PostDraw();
- if (shieldEnabled && ShouldDisplay)
+ if (ShouldDisplay)
{
float num = Mathf.Lerp(1.2f, 1.55f, shieldHitPoints / Props.maxShieldHitPoints);
Vector3 drawPos = GetWearer().Drawer.DrawPos;
@@ -143,9 +131,6 @@ namespace WulaFallenEmpire
public bool CheckIntercept(Projectile projectile, Vector3 lastExactPos, Vector3 newExactPos)
{
- if (!shieldEnabled)
- return false;
-
// 如果使用生命值模式且护盾已破坏,则不拦截
if (Props.useHitPointsMode && shieldHitPoints <= 0f)
return false;
@@ -200,7 +185,7 @@ namespace WulaFallenEmpire
public bool CheckMeleeIntercept(DamageInfo dinfo, Pawn attacker)
{
- if (!shieldEnabled || !Props.interceptMeleeAttacks || shieldHitPoints <= 0f)
+ if (!Props.interceptMeleeAttacks || shieldHitPoints <= 0f)
return false;
Pawn wearer = GetWearer();
@@ -291,23 +276,6 @@ namespace WulaFallenEmpire
shieldHitPoints = Props.maxShieldHitPoints;
}
- public void ToggleShield()
- {
- shieldEnabled = !shieldEnabled;
-
- Pawn wearer = GetWearer();
- if (wearer != null)
- {
- string message = shieldEnabled ? $"{wearer.LabelShort}激活了护盾" : $"{wearer.LabelShort}关闭了护盾";
- Messages.Message(message, MessageTypeDefOf.NeutralEvent, false);
- }
-
- if (!shieldEnabled)
- {
- sustainer?.End();
- sustainer = null;
- }
- }
private Pawn GetWearer()
{
@@ -323,43 +291,18 @@ namespace WulaFallenEmpire
{
base.Initialize(props);
shieldHitPoints = ((CompProperties_WulaShieldBelt)props).maxShieldHitPoints;
- shieldEnabled = ((CompProperties_WulaShieldBelt)props).startEnabled;
- }
-
- public override IEnumerable CompGetWornGizmosExtra()
- {
- // 确保穿戴者存在
- Pawn wearer = GetWearer();
- if (wearer == null) yield break;
-
- // 不限制只有选中时才显示
- yield return new Command_Toggle
- {
- defaultLabel = "护盾开关",
- defaultDesc = shieldEnabled ? "关闭护盾" : "激活护盾",
- icon = ContentFinder.Get("UI/Commands/DesirePower"),
- isActive = () => shieldEnabled,
- toggleAction = ToggleShield
- };
}
public override string CompInspectStringExtra()
{
- if (shieldEnabled)
+ if (Props.useHitPointsMode)
{
- if (Props.useHitPointsMode)
- {
- return $"护盾: {shieldHitPoints:F0} / {Props.maxShieldHitPoints} (生命值模式)";
- }
- else
- {
- return "护盾: 激活 (偏转模式)";
- }
+ return $"护盾: {shieldHitPoints:F0} / {Props.maxShieldHitPoints} (生命值模式)";
}
else
{
- return "护盾: 已关闭";
+ return "护盾: 激活 (偏转模式)";
}
}
}
-}
\ No newline at end of file
+}
diff --git a/Source/WulaFallenEmpire/EmergencyAbilityPatches.cs b/Source/WulaFallenEmpire/EmergencyAbilityPatches.cs
index c18f4e08..e0dbfefe 100644
--- a/Source/WulaFallenEmpire/EmergencyAbilityPatches.cs
+++ b/Source/WulaFallenEmpire/EmergencyAbilityPatches.cs
@@ -18,15 +18,16 @@ namespace WulaFallenEmpire
{
if (__instance.def.defName == "WULA_EmergencyEnergyRestore")
{
- Log.Message($"[EmergencyAbilityPatches] CanCast_Postfix for {__instance.pawn?.LabelShort}, initial result: {__result.Accepted}, reason: {__result.Reason}");
- if (!__result.Accepted)
+ var comp = __instance.CompOfType();
+ if (comp != null && comp.Props.requireDowned)
{
- // 检查是否是因为pawn失去知觉而无法使用能力
- if (__instance.pawn.Downed)
+ if (!__instance.pawn.Downed)
+ {
+ __result = new AcceptanceReport("只能在倒地时使用");
+ }
+ else
{
- // 对于紧急能量恢复能力,我们允许在倒地时使用
__result = true;
- Log.Message($"[EmergencyAbilityPatches] CanCast_Postfix: Pawn is downed, overriding to true. New result: {__result.Accepted}");
}
}
}
@@ -58,7 +59,6 @@ namespace WulaFallenEmpire
{
if (__instance.def.defName == "WULA_EmergencyEnergyRestore")
{
- Log.Message($"[EmergencyAbilityPatches] GizmoDisabled_Postfix for {__instance.pawn?.LabelShort}, initial result: {__result}, reason: {reason}");
if (__result)
{
// 检查是否是因为倒地而被禁用
@@ -68,7 +68,6 @@ namespace WulaFallenEmpire
// 对于紧急能量恢复能力,我们允许在倒地时使用
__result = false;
reason = null;
- Log.Message($"[EmergencyAbilityPatches] GizmoDisabled_Postfix: Pawn is downed, overriding to false. New result: {__result}");
}
}
}
@@ -82,12 +81,10 @@ namespace WulaFallenEmpire
var ability = (Ability)typeof(Command_Ability).GetField("ability", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(__instance);
if (ability.def.defName == "WULA_EmergencyEnergyRestore")
{
- Log.Message($"[EmergencyAbilityPatches] Command_Ability_GizmoDisabled_Postfix for {ability.pawn?.LabelShort}, initial result: {__result}");
if (__result && ability.pawn.Downed)
{
// 对于紧急能量恢复能力,我们允许在倒地时使用
__result = false;
- Log.Message($"[EmergencyAbilityPatches] Command_Ability_GizmoDisabled_Postfix: Pawn is downed, overriding to false. New result: {__result}");
}
}
}
@@ -97,10 +94,8 @@ namespace WulaFallenEmpire
[HarmonyPostfix]
public static void ApparelPreventsShooting_Postfix(Verb __instance, ref bool __result)
{
- Log.Message($"[EmergencyAbilityPatches] ApparelPreventsShooting_Postfix called. Verb type: {__instance.GetType().Name}, Caster: {__instance.CasterPawn?.LabelShort}, initial result: {__result}");
if (__instance is Verb_CastAbility castAbilityVerb && castAbilityVerb.ability?.def.defName == "WULA_EmergencyEnergyRestore")
{
- Log.Message($"[EmergencyAbilityPatches] ApparelPreventsShooting_Postfix for EmergencyEnergyRestore. Pawn: {__instance.CasterPawn?.LabelShort}, result: {__result}");
}
}
@@ -109,10 +104,8 @@ namespace WulaFallenEmpire
[HarmonyPrefix]
public static void TryStartCastOn_DiagnosticPrefix(Verb __instance, LocalTargetInfo castTarg, LocalTargetInfo destTarg, ref bool __result)
{
- Log.Message($"[EmergencyAbilityPatches] TryStartCastOn_DiagnosticPrefix called for Verb type: {__instance.GetType().Name}. Caster: {__instance.CasterPawn?.LabelShort}. CastTarg: {castTarg}, DestTarg: {destTarg}");
if (__instance is Verb_CastAbility castAbilityVerb && castAbilityVerb.ability?.def.defName == "WULA_EmergencyEnergyRestore")
{
- Log.Message($"[EmergencyAbilityPatches] TryStartCastOn_DiagnosticPrefix: This is EmergencyEnergyRestore ability. Caster: {__instance.CasterPawn?.LabelShort}");
}
}
@@ -123,7 +116,6 @@ namespace WulaFallenEmpire
{
if (__instance.ability?.def.defName == "WULA_EmergencyEnergyRestore")
{
- Log.Message($"[EmergencyAbilityPatches] TryCastShot_DiagnosticPrefix called for EmergencyEnergyRestore. Pawn: {__instance.CasterPawn?.LabelShort}");
}
}
}
diff --git a/Source/WulaFallenEmpire/IngestPatch.cs b/Source/WulaFallenEmpire/IngestPatch.cs
index af814034..cd1813c5 100644
--- a/Source/WulaFallenEmpire/IngestPatch.cs
+++ b/Source/WulaFallenEmpire/IngestPatch.cs
@@ -12,17 +12,23 @@ namespace WulaFallenEmpire
[HarmonyPrefix]
public static bool Prefix(Pawn p, ThingDef food, ref bool __result)
{
- // 检查是否是乌拉族
- if (p.def.defName == "WulaSpecies")
+ // 检查食物是否是能量核心
+ ThingDefExtension_EnergySource ext = food.GetModExtension();
+ if (ext != null)
{
- // 检查食物是否是能量核心
- ThingDefExtension_EnergySource ext = food.GetModExtension();
- if (ext != null)
+ // 如果是能量核心
+ if (p.def.defName == "WulaSpecies")
{
- // 如果是乌拉族且是能量核心,则认为愿意吃
+ // 如果是乌拉族,则认为愿意吃
__result = true;
return false; // 跳过原版方法
}
+ else
+ {
+ // 如果不是乌拉族,则不允许吃能量核心
+ __result = false;
+ return false; // 跳过原版方法
+ }
}
return true; // 继续执行原版方法
}
@@ -35,17 +41,23 @@ namespace WulaFallenEmpire
[HarmonyPrefix]
public static bool Prefix(Pawn p, Thing food, ref bool __result)
{
- // 检查是否是乌拉族
- if (p.def.defName == "WulaSpecies")
+ // 检查食物是否是能量核心
+ ThingDefExtension_EnergySource ext = food.def.GetModExtension();
+ if (ext != null)
{
- // 检查食物是否是能量核心
- ThingDefExtension_EnergySource ext = food.def.GetModExtension();
- if (ext != null)
+ // 如果是能量核心
+ if (p.def.defName == "WulaSpecies")
{
- // 如果是乌拉族且是能量核心,则认为愿意吃
+ // 如果是乌拉族,则认为愿意吃
__result = true;
return false; // 跳过原版方法
}
+ else
+ {
+ // 如果不是乌拉族,则不允许吃能量核心
+ __result = false;
+ return false; // 跳过原版方法
+ }
}
return true; // 继续执行原版方法
}
@@ -58,17 +70,23 @@ namespace WulaFallenEmpire
[HarmonyPrefix]
public static bool Prefix(Pawn p, ThingDef food, ref bool __result)
{
- // 检查是否是乌拉族
- if (p.def.defName == "WulaSpecies")
+ // 检查食物是否是能量核心
+ ThingDefExtension_EnergySource ext = food.GetModExtension();
+ if (ext != null)
{
- // 检查食物是否是能量核心
- ThingDefExtension_EnergySource ext = food.GetModExtension();
- if (ext != null)
+ // 如果是能量核心
+ if (p.def.defName == "WulaSpecies")
{
- // 如果是乌拉族且是能量核心,则认为食物是合适的
+ // 如果是乌拉族,则认为食物是合适的
__result = true;
return false; // 跳过原版方法
}
+ else
+ {
+ // 如果不是乌拉族,则认为食物不合适
+ __result = false;
+ return false; // 跳过原版方法
+ }
}
return true; // 继续执行原版方法
}
diff --git a/Source/WulaFallenEmpire/JobDriver_CastEmergencyEnergyRestore.cs b/Source/WulaFallenEmpire/JobDriver_CastEmergencyEnergyRestore.cs
new file mode 100644
index 00000000..4f9bcf4b
--- /dev/null
+++ b/Source/WulaFallenEmpire/JobDriver_CastEmergencyEnergyRestore.cs
@@ -0,0 +1,32 @@
+using System.Collections.Generic;
+using Verse;
+using Verse.AI;
+using RimWorld; // Added for AbilityDef
+
+namespace WulaFallenEmpire
+{
+ public class JobDriver_CastEmergencyEnergyRestore : JobDriver
+ {
+ public override bool TryMakePreToilReservations(bool errorOnFailed)
+ {
+ return true;
+ }
+
+ protected override IEnumerable MakeNewToils()
+ {
+ this.FailOnDespawnedOrNull(TargetIndex.A);
+ yield return new Toil
+ {
+ initAction = delegate
+ {
+ var ability = pawn.abilities.GetAbility(DefDatabase.GetNamed("WULA_EmergencyEnergyRestore"));
+ if (ability != null)
+ {
+ ability.Activate(pawn.Position, pawn);
+ }
+ },
+ defaultCompleteMode = ToilCompleteMode.Instant
+ };
+ }
+ }
+}
diff --git a/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs b/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs
index e2c0e1e9..c75c56b4 100644
--- a/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs
+++ b/Source/WulaFallenEmpire/JobGiver_WulaGetEnergy.cs
@@ -48,6 +48,10 @@ namespace WulaFallenEmpire
protected override Job TryGiveJob(Pawn pawn)
{
+ if (pawn.Downed)
+ {
+ return null;
+ }
Need_WulaEnergy energyNeed = pawn.needs.TryGetNeed();
if (energyNeed == null || energyNeed.CurLevelPercentage > minEnergyLevelPercentage)
{
diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
index 847349bc..4bb48509 100644
--- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
+++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj
@@ -88,6 +88,7 @@
+