创建了 ArachnaeSwarmSettings.cs - 包含 enableDebugLogs 字段

 创建了 ArachnaeLog.cs - 中央化日志类,仅检查mod设置(不检查DevMode)
 创建了 ArachnaeSwarmMod.cs - Mod主类,提供UI设置选项
 修改了 MainHarmony.cs - 移除重复的Harmony初始化(现在由ArachnaeSwarmMod处理)
 修改了 .csproj - 添加了3个新文件到编译列表
 替换了所有582个 Log.Message/Error/Warning 调用为 ArachnaeLog.Debug()
This commit is contained in:
2025-12-15 13:11:45 +08:00
parent 8e5cbb1b15
commit 675ac8b298
77 changed files with 731 additions and 673 deletions

View File

@@ -1,4 +1,4 @@
using RimWorld;
using RimWorld;
using RimWorld.Planet;
using Verse;
using UnityEngine;
@@ -44,12 +44,12 @@ namespace ArachnaeSwarm
// 新增:检查目标是否无法行动(倒地)
if (target.Pawn != null && IsTargetImmobilized(target.Pawn))
{
Log.Message($"[夺舍] 目标 {target.Pawn.LabelShort} 无法行动,直接执行夺舍");
ArachnaeLog.Debug($"[夺舍] 目标 {target.Pawn.LabelShort} 无法行动,直接执行夺舍");
DoPossession(this.parent.pawn, target.Pawn);
}
else
{
Log.Message($"[夺舍] 目标可以行动,执行标准夺舍流程");
ArachnaeLog.Debug($"[夺舍] 目标可以行动,执行标准夺舍流程");
DoPossession(this.parent.pawn, target.Pawn);
}
}
@@ -62,14 +62,14 @@ namespace ArachnaeSwarm
// 检查是否倒地
if (target.Downed)
{
Log.Message($"[夺舍] 目标 {target.LabelShort} 处于倒地状态");
ArachnaeLog.Debug($"[夺舍] 目标 {target.LabelShort} 处于倒地状态");
return true;
}
// 检查是否无法移动
if (!target.health.capacities.CapableOf(PawnCapacityDefOf.Moving))
{
Log.Message($"[夺舍] 目标 {target.LabelShort} 无法移动");
ArachnaeLog.Debug($"[夺舍] 目标 {target.LabelShort} 无法移动");
return true;
}
@@ -78,14 +78,14 @@ namespace ArachnaeSwarm
target.health.hediffSet.HasHediff(HediffDefOf.CryptosleepSickness) ||
target.health.hediffSet.HasHediff(HediffDefOf.FoodPoisoning))
{
Log.Message($"[夺舍] 目标 {target.LabelShort} 有严重的移动障碍");
ArachnaeLog.Debug($"[夺舍] 目标 {target.LabelShort} 有严重的移动障碍");
return true;
}
// 检查是否被束缚或囚禁
if (target.IsPrisoner || target.HostFaction != null)
{
Log.Message($"[夺舍] 目标 {target.LabelShort} 被囚禁或束缚");
ArachnaeLog.Debug($"[夺舍] 目标 {target.LabelShort} 被囚禁或束缚");
return true;
}
@@ -98,7 +98,7 @@ namespace ArachnaeSwarm
// 如果目标无法行动100%成功率
if (IsTargetImmobilized(targetPawn))
{
Log.Message($"[夺舍] 目标 {targetPawn.LabelShort} 无法行动,寄生成功率: 100%");
ArachnaeLog.Debug($"[夺舍] 目标 {targetPawn.LabelShort} 无法行动,寄生成功率: 100%");
return 1f;
}
@@ -107,7 +107,7 @@ namespace ArachnaeSwarm
float bonusFromDamage = damageDealt * Props.successChanceBonusPerDamage;
float finalChance = Mathf.Clamp01(baseChance + bonusFromDamage);
Log.Message($"[夺舍] 目标 {targetPawn.LabelShort} 可以行动,寄生成功率: {finalChance:P0} (基础: {baseChance:P0}, 伤害加成: {bonusFromDamage:P0})");
ArachnaeLog.Debug($"[夺舍] 目标 {targetPawn.LabelShort} 可以行动,寄生成功率: {finalChance:P0} (基础: {baseChance:P0}, 伤害加成: {bonusFromDamage:P0})");
return finalChance;
}
@@ -115,12 +115,12 @@ namespace ArachnaeSwarm
{
if (targetPawn == null || caster == null) return;
Log.Message($"[夺舍] 开始执行。施法者: {caster.LabelShort}, 目标: {targetPawn.LabelShort}");
ArachnaeLog.Debug($"[夺舍] 开始执行。施法者: {caster.LabelShort}, 目标: {targetPawn.LabelShort}");
// 1. 捕获原宿主的完整数据,用于死亡后恢复尸体
OriginalPawnData originalHostData = new OriginalPawnData();
originalHostData.CaptureData(targetPawn);
Log.Message($"[夺舍] 已捕获原始宿主 {targetPawn.LabelShort} 的完整数据。");
ArachnaeLog.Debug($"[夺舍] 已捕获原始宿主 {targetPawn.LabelShort} 的完整数据。");
// 2. 备份原宿主的技能,用于后续合并
var originalTargetSkills = new Dictionary<SkillDef, (int level, Passion passion)>();
@@ -141,7 +141,7 @@ namespace ArachnaeSwarm
// 4. 将抱脸虫存入Hediff
if (hediff.casterContainer.TryAdd(originalCaster, true))
{
Log.Message($"[夺舍] 成功将 {caster.LabelShort} 的原始副本存入Hediff。");
ArachnaeLog.Debug($"[夺舍] 成功将 {caster.LabelShort} 的原始副本存入Hediff。");
// 5. 灵魂转移,此时 targetPawn 的技能被 caster 的技能覆盖
PawnDataUtility.TransferSoul(caster, targetPawn);
@@ -155,7 +155,7 @@ namespace ArachnaeSwarm
// 6. 技能合并:在灵魂转移后,直接在最终的身体 (targetPawn) 上进行合并
if (targetPawn.skills != null)
{
Log.Message("[夺舍] 开始合并技能...");
ArachnaeLog.Debug("[夺舍] 开始合并技能...");
foreach (var skillRecord in targetPawn.skills.skills)
{
if (originalTargetSkills.TryGetValue(skillRecord.def, out var originalSkill))
@@ -172,7 +172,7 @@ namespace ArachnaeSwarm
}
}
}
Log.Message("[夺舍] 技能合并完成。");
ArachnaeLog.Debug("[夺舍] 技能合并完成。");
}
// 7. 将Hediff添加到最终身体上
@@ -181,13 +181,13 @@ namespace ArachnaeSwarm
if (Props.hediffToApplyOnSuccess != null)
{
targetPawn.health.AddHediff(Props.hediffToApplyOnSuccess, null, null);
Log.Message($"[夺舍] 成功为 {targetPawn.LabelShort} 添加额外Hediff: {Props.hediffToApplyOnSuccess.defName}");
ArachnaeLog.Debug($"[夺舍] 成功为 {targetPawn.LabelShort} 添加额外Hediff: {Props.hediffToApplyOnSuccess.defName}");
}
Log.Message($"[夺舍] {targetPawn.LabelShort} (原 {caster.LabelShort}) 夺舍完成。");
ArachnaeLog.Debug($"[夺舍] {targetPawn.LabelShort} (原 {caster.LabelShort}) 夺舍完成。");
}
else
{
Log.Error($"[夺舍] 无法将 {caster.LabelShort} 的副本存入Hediff。中止操作。");
ArachnaeLog.Debug($"[夺舍] 无法将 {caster.LabelShort} 的副本存入Hediff。中止操作。");
if(originalCaster != null && !originalCaster.Destroyed) originalCaster.Destroy();
}
}
@@ -200,7 +200,7 @@ namespace ArachnaeSwarm
Verb bestMeleeVerb = caster.meleeVerbs.TryGetMeleeVerb(targetPawn);
if (bestMeleeVerb == null)
{
Log.Warning($"[Possess] Caster {caster.LabelShort} has no melee verb.");
ArachnaeLog.Debug($"[Possess] Caster {caster.LabelShort} has no melee verb.");
return;
}
@@ -210,23 +210,23 @@ namespace ArachnaeSwarm
var dinfo = new DamageInfo(damageDef, damageAmount, armorPenetration, -1, caster);
DamageWorker.DamageResult damageResult = targetPawn.TakeDamage(dinfo);
Log.Message($"[Possess] Dealt {damageResult.totalDamageDealt} damage to {targetPawn.LabelShort} using {damageDef.defName}.");
ArachnaeLog.Debug($"[Possess] Dealt {damageResult.totalDamageDealt} damage to {targetPawn.LabelShort} using {damageDef.defName}.");
if (damageResult.totalDamageDealt > 0)
{
// 修改:使用新的成功率计算方法
float finalChance = CalculateSuccessChance(targetPawn, damageResult.totalDamageDealt);
Log.Message($"[Possess] Final chance: {finalChance:P0}");
ArachnaeLog.Debug($"[Possess] Final chance: {finalChance:P0}");
if (Rand.Chance(finalChance))
{
Log.Message($"[Possess] Success! Applying possession effect.");
ArachnaeLog.Debug($"[Possess] Success! Applying possession effect.");
DoPossession(caster, targetPawn);
}
else
{
Log.Message($"[Possess] Failed possession check.");
ArachnaeLog.Debug($"[Possess] Failed possession check.");
}
}
}