diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 161b7e5..52a97d9 100644 Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ diff --git a/1.6/1.6/Defs/DamageDefs/ARA_Damage_Freeze.xml b/1.6/1.6/Defs/DamageDefs/ARA_Damage_Freeze.xml index 075e020..f43af93 100644 --- a/1.6/1.6/Defs/DamageDefs/ARA_Damage_Freeze.xml +++ b/1.6/1.6/Defs/DamageDefs/ARA_Damage_Freeze.xml @@ -31,7 +31,7 @@ ARA_CryoShock - 目标正处于急冻状态,这种状态。 + 目标正处于急冻状态。这种状态将导致目标身体结构极度脆弱。当此效果加深时,足以摧毁其身体部位的“冷冻”伤害阈值将会显著降低。。 (1, 1, 0.8) ArachnaeSwarm.HediffCurseFlame @@ -66,10 +66,6 @@ -0.10 - - 2 - 2 -
  • @@ -83,10 +79,6 @@ -0.20
  • - - 3.5 - 3.5 -
  • @@ -100,10 +92,6 @@ -0.20
  • - - 4.5 - 4.5 -
  • @@ -117,10 +105,6 @@ -0.30
  • - - 6 - 6 -
  • @@ -134,10 +118,6 @@ -0.30
  • - - 8 - 8 -
    @@ -146,7 +126,7 @@ ARA_Damage_Freeze - DamageWorker_Frostbite + ArachnaeSwarm.DamageWorker_InstaKill true {0}的身体在极寒中化为了冰雕,随后碎裂四散。 Frostbite @@ -154,7 +134,7 @@ Heat 0 3 - 2 + 1 0 0 -15 @@ -163,9 +143,25 @@ (0.52, 1, 0.95,0.5) --> ARA_Fleck_Icez_Cloud Explosion_Stun + +
  • + ARA_CryoShock + + +
  • (0.2, 0.8)
  • +
  • (0.35, 0.65)
  • +
  • (0.5, 0.5)
  • +
  • (0.65, 0.35)
  • +
  • (0.85, 0.15)
  • + + + 1.0 + +
    ARA_Damage_Freeze_ex + ArachnaeSwarm.DamageWorker_InstaKill
  • ARA_CryoShock diff --git a/1.6/1.6/Defs/Thing_Misc/Weapons/ARA_Weapon.xml b/1.6/1.6/Defs/Thing_Misc/Weapons/ARA_Weapon.xml index 313d07d..4808ec4 100644 --- a/1.6/1.6/Defs/Thing_Misc/Weapons/ARA_Weapon.xml +++ b/1.6/1.6/Defs/Thing_Misc/Weapons/ARA_Weapon.xml @@ -2136,12 +2136,12 @@ true - 5 + 3 45 - 25 - 1 + 3 + 30 ARA_Damage_Freeze_ex - 2 + 25 1000 @@ -2182,13 +2182,13 @@ - false - - - + 15 + Explosion_Stun + 0
  • 0 @@ -2198,7 +2198,7 @@
  • ARA_Huge_Weapon
  • -
  • ARA_Weapon_ChainReload
  • +
  • ARA_Weapon_Damage_FrostExplode
  • 2 diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj index f045025..110b72d 100644 --- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj +++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj @@ -278,6 +278,7 @@ + diff --git a/Source/ArachnaeSwarm/Verbs/DamageWorker_InstaKill.cs b/Source/ArachnaeSwarm/Verbs/DamageWorker_InstaKill.cs new file mode 100644 index 0000000..d91bf57 --- /dev/null +++ b/Source/ArachnaeSwarm/Verbs/DamageWorker_InstaKill.cs @@ -0,0 +1,61 @@ +using RimWorld; +using Verse; + +namespace ArachnaeSwarm +{ + public class InstaKillExtension : DefModExtension + { + public HediffDef hediff; + // 根据Hediff严重性 (x) 决定触发所需的伤害百分比阈值 (y) + public SimpleCurve requiredDamagePercentageCurve; + public float destroyChance = 1.0f; + } + + public class DamageWorker_InstaKill : DamageWorker_Frostbite + { + protected override void ApplySpecialEffectsToPart(Pawn pawn, float totalDamage, DamageInfo dinfo, DamageResult result) + { + var extension = def.GetModExtension(); + // 检查配置是否完整 + if (extension == null || extension.hediff == null || extension.requiredDamagePercentageCurve == null || dinfo.HitPart == null) + { + base.ApplySpecialEffectsToPart(pawn, totalDamage, dinfo, result); + return; + } + + // 获取受害者身上的Hediff + Hediff hediff = pawn.health.hediffSet.GetFirstHediffOfDef(extension.hediff); + if (hediff == null) + { + // 如果受害者没有指定的Hediff,则效果不生效 + base.ApplySpecialEffectsToPart(pawn, totalDamage, dinfo, result); + return; + } + + // --- 日志输出 --- + Log.Message($"[DamageWorker_InstaKill] Executed on {pawn.LabelShort}. Target Part: {dinfo.HitPart.Label}. Damage: {totalDamage}."); + + // 根据Hediff严重性从曲线计算所需的伤害百分比阈值 + float requiredPercentage = extension.requiredDamagePercentageCurve.Evaluate(hediff.Severity); + float destroyChance = extension.destroyChance; + + // 计算本次伤害占目标部件最大生命值的实际百分比 + float actualDamagePercentage = totalDamage / dinfo.HitPart.def.GetMaxHealth(pawn); + + Log.Message($"[DamageWorker_InstaKill] Hediff: {hediff.Label}, Severity: {hediff.Severity:F2}. RequiredDmg%: {requiredPercentage:P2}, ActualDmg%: {actualDamagePercentage:P2}."); + + // 如果造成的实际伤害百分比 *大于或等于* 所需的百分比阈值,并且随机判定成功 + if (actualDamagePercentage >= requiredPercentage && Rand.Chance(destroyChance)) + { + Log.Message($"[DamageWorker_InstaKill] Insta-Kill triggered! Applying massive damage to destroy part."); + // 直接施加一个足以摧毁该部位的伤害 + base.ApplySpecialEffectsToPart(pawn, dinfo.HitPart.def.GetMaxHealth(pawn) + 1, dinfo, result); + } + else + { + // 否则,走标准伤害流程 + base.ApplySpecialEffectsToPart(pawn, totalDamage, dinfo, result); + } + } + } +} \ No newline at end of file