This commit is contained in:
2025-10-20 01:01:15 +08:00
parent 02fc22f961
commit 995a046c7a
5 changed files with 92 additions and 34 deletions

Binary file not shown.

View File

@@ -31,7 +31,7 @@
<HediffDef>
<defName>ARA_CryoShock</defName>
<label>急速冷却</label>
<description>目标正处于急冻状态这种状态。</description>
<description>目标正处于急冻状态这种状态将导致目标身体结构极度脆弱。当此效果加深时,足以摧毁其身体部位的“冷冻”伤害阈值将会显著降低。</description>
<defaultLabelColor>(1, 1, 0.8)</defaultLabelColor>
<hediffClass>ArachnaeSwarm.HediffCurseFlame</hediffClass>
<comps>
@@ -66,10 +66,6 @@
<offset>-0.10</offset>
</li>
</capMods>
<damageFactors>
<ARA_Damage_Freeze>2</ARA_Damage_Freeze>
<ARA_Damage_Freeze_ex>2</ARA_Damage_Freeze_ex>
</damageFactors>
</li>
<li>
<label>中等</label>
@@ -83,10 +79,6 @@
<offset>-0.20</offset>
</li>
</capMods>
<damageFactors>
<ARA_Damage_Freeze>3.5</ARA_Damage_Freeze>
<ARA_Damage_Freeze_ex>3.5</ARA_Damage_Freeze_ex>
</damageFactors>
</li>
<li>
<label>严重</label>
@@ -100,10 +92,6 @@
<offset>-0.20</offset>
</li>
</capMods>
<damageFactors>
<ARA_Damage_Freeze>4.5</ARA_Damage_Freeze>
<ARA_Damage_Freeze_ex>4.5</ARA_Damage_Freeze_ex>
</damageFactors>
</li>
<li>
<label>极度</label>
@@ -117,10 +105,6 @@
<offset>-0.30</offset>
</li>
</capMods>
<damageFactors>
<ARA_Damage_Freeze>6</ARA_Damage_Freeze>
<ARA_Damage_Freeze_ex>6</ARA_Damage_Freeze_ex>
</damageFactors>
</li>
<li>
<label>完全</label>
@@ -134,10 +118,6 @@
<offset>-0.30</offset>
</li>
</capMods>
<damageFactors>
<ARA_Damage_Freeze>8</ARA_Damage_Freeze>
<ARA_Damage_Freeze_ex>8</ARA_Damage_Freeze_ex>
</damageFactors>
</li>
</stages>
</HediffDef>
@@ -146,7 +126,7 @@
<DamageDef Name="ARA_Damage_Freeze">
<defName>ARA_Damage_Freeze</defName>
<label>冷冻</label>
<workerClass>DamageWorker_Frostbite</workerClass> <!-- 使用原版的伤害工人 -->
<workerClass>ArachnaeSwarm.DamageWorker_InstaKill</workerClass>
<externalViolence>true</externalViolence>
<deathMessage>{0}的身体在极寒中化为了冰雕,随后碎裂四散。</deathMessage>
<hediff>Frostbite</hediff> <!-- 核心将伤害转化为这个Hediff的严重性 -->
@@ -154,7 +134,7 @@
<armorCategory>Heat</armorCategory> <!-- 可以被抗热/冷的护甲减免 -->
<overkillPctToDestroyPart>0</overkillPctToDestroyPart> <!-- 伤害足够时直接摧毁我们的C#代码会处理这个) -->
<defaultDamage>3</defaultDamage>
<defaultArmorPenetration>2</defaultArmorPenetration>
<defaultArmorPenetration>1</defaultArmorPenetration>
<buildingDamageFactorImpassable>0</buildingDamageFactorImpassable>
<buildingDamageFactorPassable>0</buildingDamageFactorPassable>
<explosionHeatEnergyPerCell>-15</explosionHeatEnergyPerCell>
@@ -163,9 +143,25 @@
<explosionColorEdge>(0.52, 1, 0.95,0.5)</explosionColorEdge> -->
<explosionInteriorFleck>ARA_Fleck_Icez_Cloud</explosionInteriorFleck>
<soundExplosion>Explosion_Stun</soundExplosion>
<modExtensions>
<li Class="ArachnaeSwarm.InstaKillExtension">
<hediff>ARA_CryoShock</hediff>
<requiredDamagePercentageCurve>
<points>
<li>(0.2, 0.8)</li> <!-- 低严重性(0.2)时, 需要造成80%的伤害 -->
<li>(0.35, 0.65)</li>
<li>(0.5, 0.5)</li>
<li>(0.65, 0.35)</li>
<li>(0.85, 0.15)</li> <!-- 高严重性(0.85)时, 只需要造成15%的伤害 -->
</points>
</requiredDamagePercentageCurve>
<destroyChance>1.0</destroyChance>
</li>
</modExtensions>
</DamageDef>
<DamageDef ParentName="ARA_Damage_Freeze">
<defName>ARA_Damage_Freeze_ex</defName>
<workerClass>ArachnaeSwarm.DamageWorker_InstaKill</workerClass>
<additionalHediffs>
<li>
<hediff>ARA_CryoShock</hediff>

View File

@@ -2136,12 +2136,12 @@
<!-- 基础射线参数 -->
<hasStandardCommand>true</hasStandardCommand>
<warmupTime>5</warmupTime>
<warmupTime>3</warmupTime>
<range>45</range>
<burstShotCount>25</burstShotCount>
<ticksBetweenBurstShots>1</ticksBetweenBurstShots>
<burstShotCount>3</burstShotCount>
<ticksBetweenBurstShots>30</ticksBetweenBurstShots>
<beamDamageDef>ARA_Damage_Freeze_ex</beamDamageDef>
<beamTotalDamage>2</beamTotalDamage>
<beamTotalDamage>25</beamTotalDamage>
<!-- 消除射线偏移的参数 -->
<beamFullWidthRange>1000</beamFullWidthRange>
@@ -2182,13 +2182,13 @@
</targetParams>
<!-- 每发都爆炸 -->
<enableExplosion>false</enableExplosion>
<!-- <explosionShotInterval>1</explosionShotInterval>
<explosionRadius>2.5</explosionRadius>
<enableExplosion>true</enableExplosion>
<explosionShotInterval>1</explosionShotInterval>
<explosionRadius>1.5</explosionRadius>
<explosionDamageDef>ARA_Damage_Freeze</explosionDamageDef>
<explosionDamage>1</explosionDamage> -->
<!-- <explosionSound>Explosion_Stun</explosionSound> -->
<!-- <chanceToStartFire>0</chanceToStartFire> -->
<explosionDamage>15</explosionDamage>
<explosionSound>Explosion_Stun</explosionSound>
<chanceToStartFire>0</chanceToStartFire>
</li>
</verbs>
<generateCommonality>0</generateCommonality>
@@ -2198,7 +2198,7 @@
<li Class="ArachnaeSwarm.CompProperties_CustomUniqueWeapon" MayRequire="Ludeon.RimWorld.Odyssey">
<forcedTraits>
<li>ARA_Huge_Weapon</li>
<li>ARA_Weapon_ChainReload</li>
<li>ARA_Weapon_Damage_FrostExplode</li>
</forcedTraits>
<numTraitsRange>
<min>2</min>

View File

@@ -278,6 +278,7 @@
<Compile Include="Verbs\Verb_ShootSprayMulti.cs" />
<Compile Include="Verbs\WeaponStealBeam\Verb_ShootWeaponStealBeam.cs" />
<Compile Include="Verbs\WeaponStealBeam\VerbProperties_WeaponStealBeam.cs" />
<Compile Include="Verbs\DamageWorker_InstaKill.cs" />
<Compile Include="Buildings\Building_ARANutrientDispenser\Building_ARANutrientDispenser.cs" />
<Compile Include="Buildings\Building_ARANutrientDispenser\ARAFoodDispenserProperties.cs" />
<Compile Include="Buildings\Building_ARANutrientDispenser\Patch_DispenserFoodSearch.cs" />

View File

@@ -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<InstaKillExtension>();
// 检查配置是否完整
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);
}
}
}
}