using HarmonyLib;
using RimWorld;
using Verse;
namespace WulaFallenEmpire.HarmonyPatches
{
[HarmonyPatch(typeof(Pawn_HealthTracker), "PreApplyDamage")]
public static class HealthTracker_PreApplyDamage_Patch
{
///
/// 在伤害应用到Pawn之前执行的补丁。
///
/// 伤害信息,可以被修改。
/// 输出参数,如果伤害被完全吸收则为true。
public static void Prefix(ref DamageInfo dinfo, out bool absorbed)
{
// 必须为out参数赋默认值
absorbed = false;
// 检查伤害来源是否是一个Pawn
Pawn instigatorPawn = dinfo.Instigator as Pawn;
if (instigatorPawn == null)
{
return;
}
// 检查这个Pawn是否装备了武器
if (instigatorPawn.equipment?.Primary == null)
{
return;
}
// 检查武器上是否有我们的心灵增幅组件
var psychicComp = instigatorPawn.equipment.Primary.GetComp();
if (psychicComp == null)
{
return;
}
// 获取心灵敏感度属性值
float psychicSensitivity = instigatorPawn.GetStatValue(StatDefOf.PsychicSensitivity);
// 根据心灵敏感度是否大于100%,使用不同的计算逻辑
float damageMultiplier;
if (psychicSensitivity > 1f)
{
// 增伤:伤害会根据XML中的增伤系数获得额外加成
damageMultiplier = 1 + ((psychicSensitivity - 1) * psychicComp.Props.damageMultiplierPerSensitivityPoint);
}
else if (psychicSensitivity < 1f)
{
// 减伤:伤害会根据XML中的减伤系数降低
damageMultiplier = 1 - ((1 - psychicSensitivity) * psychicComp.Props.damageReductionMultiplierPerSensitivityPoint);
}
else
{
// 敏感度正好为100%,伤害不变
damageMultiplier = 1f;
}
// 获取当前伤害值并应用乘数
float originalAmount = dinfo.Amount;
float newAmount = originalAmount * damageMultiplier;
// 更新伤害信息中的伤害值
dinfo.SetAmount(newAmount);
}
}
}