存一下

This commit is contained in:
2025-07-21 13:45:52 +08:00
parent b8f3fc5bcd
commit 2c8166b832
18 changed files with 510 additions and 1065 deletions

View File

@@ -0,0 +1,64 @@
using RimWorld;
using Verse;
namespace WulaFallenEmpire
{
public class CompAbilityEffect_EmergencyEnergyRestore : CompAbilityEffect
{
public new CompProperties_AbilityEmergencyEnergyRestore Props => (CompProperties_AbilityEmergencyEnergyRestore)props;
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
{
base.Apply(target, dest);
Pawn caster = parent.pawn;
if (caster == null) return;
// 检查是否是乌拉族
if (!IsWulaRace(caster))
{
Messages.Message("只有乌拉族才能使用紧急能量恢复", MessageTypeDefOf.RejectInput, false);
return;
}
// 检查是否倒地(如果需要的话)
if (Props.requireDowned && !caster.Downed)
{
Messages.Message("只能在倒地时使用紧急能量恢复", MessageTypeDefOf.RejectInput, false);
return;
}
// 添加Hediff
if (Props.hediffDef != null)
{
var hediff = HediffMaker.MakeHediff(Props.hediffDef, caster);
caster.health.AddHediff(hediff);
Messages.Message($"{caster.LabelShort}激活了紧急能量恢复协议", MessageTypeDefOf.PositiveEvent, false);
if (Prefs.DevMode)
{
Log.Message($"[EmergencyEnergyRestore] Applied to {caster.LabelShort}");
}
}
}
public override bool CanApplyOn(LocalTargetInfo target, LocalTargetInfo dest)
{
bool canApply = base.CanApplyOn(target, dest) && IsWulaRace(parent.pawn);
if (Props.requireDowned)
{
canApply = canApply && parent.pawn.Downed;
}
return canApply;
}
private bool IsWulaRace(Pawn pawn)
{
if (pawn?.def == null) return false;
return pawn.def.defName == "WulaSpecies";
}
}
}

View File

@@ -0,0 +1,17 @@
using RimWorld;
using Verse;
namespace WulaFallenEmpire
{
public class CompProperties_AbilityEmergencyEnergyRestore : CompProperties_AbilityEffect
{
public int durationTicks = 600; // 默认10秒
public HediffDef hediffDef;
public bool requireDowned = true; // 是否需要倒地才能使用
public CompProperties_AbilityEmergencyEnergyRestore()
{
compClass = typeof(CompAbilityEffect_EmergencyEnergyRestore);
}
}
}

View File

@@ -0,0 +1,71 @@
using RimWorld;
using Verse;
namespace WulaFallenEmpire
{
public class Hediff_EmergencyEnergyRestore : HediffWithComps
{
private float originalEnergyLevel = 0f;
private bool hasStoredOriginalLevel = false;
public override void PostAdd(DamageInfo? dinfo)
{
base.PostAdd(dinfo);
// 存储原始能量水平
var energyNeed = pawn.needs?.TryGetNeed<Need_WulaEnergy>();
if (energyNeed != null)
{
originalEnergyLevel = energyNeed.CurLevel;
hasStoredOriginalLevel = true;
// 立即将能量设置为100%
energyNeed.CurLevel = 1.0f;
if (Prefs.DevMode)
{
Log.Message($"[EmergencyEnergyRestore] Stored original energy: {originalEnergyLevel:F2}, set to 1.0");
}
}
}
public override void PostRemoved()
{
base.PostRemoved();
// 恢复原始能量水平
if (hasStoredOriginalLevel)
{
var energyNeed = pawn.needs?.TryGetNeed<Need_WulaEnergy>();
if (energyNeed != null)
{
energyNeed.CurLevel = originalEnergyLevel;
if (Prefs.DevMode)
{
Log.Message($"[EmergencyEnergyRestore] Restored energy to: {originalEnergyLevel:F2}");
}
}
}
}
public override void Tick()
{
base.Tick();
// 确保能量保持在100%
var energyNeed = pawn.needs?.TryGetNeed<Need_WulaEnergy>();
if (energyNeed != null && energyNeed.CurLevel < 1.0f)
{
energyNeed.CurLevel = 1.0f;
}
}
public override void ExposeData()
{
base.ExposeData();
Scribe_Values.Look(ref originalEnergyLevel, "originalEnergyLevel", 0f);
Scribe_Values.Look(ref hasStoredOriginalLevel, "hasStoredOriginalLevel", false);
}
}
}

View File

@@ -77,6 +77,9 @@
<Compile Include="CompUseEffect_WulaSkillTrainer.cs" />
<Compile Include="Verb_ShootBeamExplosive.cs" />
<Compile Include="VerbPropertiesExplosiveBeam.cs" />
<Compile Include="Hediff_EmergencyEnergyRestore.cs" />
<Compile Include="CompProperties_AbilityEmergencyEnergyRestore.cs" />
<Compile Include="CompAbilityEffect_EmergencyEnergyRestore.cs" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>