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 @@ +