diff --git a/1.6/Assemblies/WulaFallenEmpire.dll b/1.6/Assemblies/WulaFallenEmpire.dll index 7b2e5af3..a014f489 100644 Binary files a/1.6/Assemblies/WulaFallenEmpire.dll and b/1.6/Assemblies/WulaFallenEmpire.dll differ diff --git a/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Spiritualist_Weapon.xml b/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Spiritualist_Weapon.xml index 0c82c6b5..f8f98d6a 100644 --- a/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Spiritualist_Weapon.xml +++ b/1.6/Defs/ThingDefs_Misc/Weapons/WULA_FE_Spiritualist_Weapon.xml @@ -55,6 +55,23 @@ Mote_HellsphereCannon_Charge + + +
  • + + 1 + + 1 +
  • +
    None diff --git a/Source/WulaFallenEmpire/CompPsychicScaling.cs b/Source/WulaFallenEmpire/CompPsychicScaling.cs new file mode 100644 index 00000000..e4d2a045 --- /dev/null +++ b/Source/WulaFallenEmpire/CompPsychicScaling.cs @@ -0,0 +1,31 @@ +using RimWorld; +using Verse; + +namespace WulaFallenEmpire +{ + /// + /// 这个组件的XML属性定义。允许在XML中配置加成系数。 + /// + public class CompProperties_PsychicScaling : CompProperties + { + // 每点心灵敏感度(超出100%的部分)提供的伤害【增伤】乘数。 + public float damageMultiplierPerSensitivityPoint = 0.25f; + + // 每点心灵敏感度(低于100%的部分)提供的伤害【减伤】乘数。 + // 例如,系数为1时,50%敏感度将造成 1 - (1 - 0.5) * 1 = 0.5倍伤害。 + public float damageReductionMultiplierPerSensitivityPoint = 1f; + + public CompProperties_PsychicScaling() + { + compClass = typeof(CompPsychicScaling); + } + } + + /// + /// 附加到武器上的实际组件。它本身只是一个标记,真正的逻辑在Harmony Patch中。 + /// + public class CompPsychicScaling : ThingComp + { + public CompProperties_PsychicScaling Props => (CompProperties_PsychicScaling)props; + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/HarmonyPatches/HealthTracker_PreApplyDamage_Patch.cs b/Source/WulaFallenEmpire/HarmonyPatches/HealthTracker_PreApplyDamage_Patch.cs new file mode 100644 index 00000000..47229321 --- /dev/null +++ b/Source/WulaFallenEmpire/HarmonyPatches/HealthTracker_PreApplyDamage_Patch.cs @@ -0,0 +1,69 @@ +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); + } + } +} \ No newline at end of file diff --git a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj index 1a6de663..8dea8b0f 100644 --- a/Source/WulaFallenEmpire/WulaFallenEmpire.csproj +++ b/Source/WulaFallenEmpire/WulaFallenEmpire.csproj @@ -119,6 +119,8 @@ + +