暂存
This commit is contained in:
Binary file not shown.
@@ -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>
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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" />
|
||||
|
||||
61
Source/ArachnaeSwarm/Verbs/DamageWorker_InstaKill.cs
Normal file
61
Source/ArachnaeSwarm/Verbs/DamageWorker_InstaKill.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user