11
This commit is contained in:
@@ -40,9 +40,77 @@ namespace ArachnaeSwarm
|
||||
public override void Apply(LocalTargetInfo target, LocalTargetInfo dest)
|
||||
{
|
||||
base.Apply(target, dest);
|
||||
DoPossession(this.parent.pawn, target.Pawn);
|
||||
|
||||
// 新增:检查目标是否无法行动(倒地)
|
||||
if (target.Pawn != null && IsTargetImmobilized(target.Pawn))
|
||||
{
|
||||
Log.Message($"[夺舍] 目标 {target.Pawn.LabelShort} 无法行动,直接执行夺舍");
|
||||
DoPossession(this.parent.pawn, target.Pawn);
|
||||
}
|
||||
else
|
||||
{
|
||||
Log.Message($"[夺舍] 目标可以行动,执行标准夺舍流程");
|
||||
DoPossession(this.parent.pawn, target.Pawn);
|
||||
}
|
||||
}
|
||||
|
||||
// 新增:检查目标是否无法行动
|
||||
private bool IsTargetImmobilized(Pawn target)
|
||||
{
|
||||
if (target == null) return false;
|
||||
|
||||
// 检查是否倒地
|
||||
if (target.Downed)
|
||||
{
|
||||
Log.Message($"[夺舍] 目标 {target.LabelShort} 处于倒地状态");
|
||||
return true;
|
||||
}
|
||||
|
||||
// 检查是否无法移动
|
||||
if (!target.health.capacities.CapableOf(PawnCapacityDefOf.Moving))
|
||||
{
|
||||
Log.Message($"[夺舍] 目标 {target.LabelShort} 无法移动");
|
||||
return true;
|
||||
}
|
||||
|
||||
// 检查是否有严重的移动障碍
|
||||
if (target.health.hediffSet.HasHediff(HediffDefOf.Anesthetic) ||
|
||||
target.health.hediffSet.HasHediff(HediffDefOf.CryptosleepSickness) ||
|
||||
target.health.hediffSet.HasHediff(HediffDefOf.FoodPoisoning))
|
||||
{
|
||||
Log.Message($"[夺舍] 目标 {target.LabelShort} 有严重的移动障碍");
|
||||
return true;
|
||||
}
|
||||
|
||||
// 检查是否被束缚或囚禁
|
||||
if (target.IsPrisoner || target.HostFaction != null)
|
||||
{
|
||||
Log.Message($"[夺舍] 目标 {target.LabelShort} 被囚禁或束缚");
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
// 新增:计算寄生成功率
|
||||
private float CalculateSuccessChance(Pawn targetPawn, float damageDealt = 0f)
|
||||
{
|
||||
// 如果目标无法行动,100%成功率
|
||||
if (IsTargetImmobilized(targetPawn))
|
||||
{
|
||||
Log.Message($"[夺舍] 目标 {targetPawn.LabelShort} 无法行动,寄生成功率: 100%");
|
||||
return 1f;
|
||||
}
|
||||
|
||||
// 正常计算成功率
|
||||
float baseChance = Props.successChance.RandomInRange;
|
||||
float bonusFromDamage = damageDealt * Props.successChanceBonusPerDamage;
|
||||
float finalChance = Mathf.Clamp01(baseChance + bonusFromDamage);
|
||||
|
||||
Log.Message($"[夺舍] 目标 {targetPawn.LabelShort} 可以行动,寄生成功率: {finalChance:P0} (基础: {baseChance:P0}, 伤害加成: {bonusFromDamage:P0})");
|
||||
return finalChance;
|
||||
}
|
||||
|
||||
private void DoPossession(Pawn caster, Pawn targetPawn)
|
||||
{
|
||||
if (targetPawn == null || caster == null) return;
|
||||
@@ -146,10 +214,10 @@ namespace ArachnaeSwarm
|
||||
|
||||
if (damageResult.totalDamageDealt > 0)
|
||||
{
|
||||
float baseChance = Props.successChance.RandomInRange;
|
||||
float bonusFromDamage = damageResult.totalDamageDealt * Props.successChanceBonusPerDamage;
|
||||
float finalChance = Mathf.Clamp01(baseChance + bonusFromDamage);
|
||||
Log.Message($"[Possess] Base chance: {baseChance}, Bonus: {bonusFromDamage}, Final chance: {finalChance}");
|
||||
// 修改:使用新的成功率计算方法
|
||||
float finalChance = CalculateSuccessChance(targetPawn, damageResult.totalDamageDealt);
|
||||
|
||||
Log.Message($"[Possess] Final chance: {finalChance:P0}");
|
||||
|
||||
if (Rand.Chance(finalChance))
|
||||
{
|
||||
@@ -163,4 +231,4 @@ namespace ArachnaeSwarm
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user