This commit is contained in:
Tourswen
2025-10-19 12:51:06 +08:00
parent 0c45c14570
commit 9dc9d7d6e3
40 changed files with 1837 additions and 423 deletions

View File

@@ -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
}
}
}
}
}