diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll
index 9473f9b..8df7244 100644
Binary files a/1.6/1.6/Assemblies/ArachnaeSwarm.dll and b/1.6/1.6/Assemblies/ArachnaeSwarm.dll differ
diff --git a/1.6/1.6/Defs/AbilityDefs/ARA_Possession_Defs.xml b/1.6/1.6/Defs/AbilityDefs/ARA_Possession_Defs.xml
index fbc0ddc..b7d9d0e 100644
--- a/1.6/1.6/Defs/AbilityDefs/ARA_Possession_Defs.xml
+++ b/1.6/1.6/Defs/AbilityDefs/ARA_Possession_Defs.xml
@@ -9,6 +9,7 @@
UI/Abilities/Longjump
800
false
+ Misc1
ArachnaeSwarm.Verb_JumpAndCastOnLanding
@@ -28,7 +29,7 @@
- 0.6~1.0
+ 0.1
0.01
diff --git a/Source/ArachnaeSwarm/ARA_HuggingFace/CompAbilityEffect_Possess.cs b/Source/ArachnaeSwarm/ARA_HuggingFace/CompAbilityEffect_Possess.cs
index 1b03b21..8712fac 100644
--- a/Source/ArachnaeSwarm/ARA_HuggingFace/CompAbilityEffect_Possess.cs
+++ b/Source/ArachnaeSwarm/ARA_HuggingFace/CompAbilityEffect_Possess.cs
@@ -3,6 +3,7 @@ using RimWorld.Planet;
using Verse;
using UnityEngine;
using System.Linq;
+using System.Collections.Generic;
namespace ArachnaeSwarm
{
@@ -45,14 +46,55 @@ namespace ArachnaeSwarm
private void DoPossession(Pawn caster, Pawn targetPawn)
{
if (targetPawn == null || caster == null) return;
-
+
Log.Message($"[夺舍] 开始执行。施法者: {caster.LabelShort}, 目标: {targetPawn.LabelShort}");
- Hediff_Possession hediff = (Hediff_Possession)HediffMaker.MakeHediff(HediffDef.Named("ARA_Possession"), targetPawn);
- if (hediff.GetDirectlyHeldThings().TryAdd(caster.SplitOff(1), true))
+ // 为了保留原始宿主的技能数据,在灵魂转移前先复制一份
+ var originalTargetSkills = new Dictionary();
+ if (targetPawn.skills != null)
{
- Log.Message($"[夺舍] 成功将 {caster.LabelShort} 的副本存入Hediff。");
+ foreach (var skill in targetPawn.skills.skills)
+ {
+ originalTargetSkills[skill.def] = (skill.levelInt, skill.passion);
+ }
+ }
+
+ // 储存原始抱脸虫
+ Pawn originalCaster = caster.SplitOff(1) as Pawn;
+
+ Hediff_Possession hediff = (Hediff_Possession)HediffMaker.MakeHediff(HediffDef.Named("ARA_Possession"), targetPawn);
+ if (hediff.GetDirectlyHeldThings().TryAdd(originalCaster, true))
+ {
+ Log.Message($"[夺舍] 成功将 {caster.LabelShort} 的原始副本存入Hediff。");
+
+ // 灵魂转移,此时 targetPawn 的技能被 caster 的技能覆盖
PawnDataUtility.TransferSoul(caster, targetPawn);
+
+ // --- 技能合并 ---
+ // 在灵魂转移后,直接在最终的身体 (targetPawn) 上进行合并
+ if (targetPawn.skills != null)
+ {
+ Log.Message("[夺舍] 开始合并技能...");
+ foreach (var skillRecord in targetPawn.skills.skills)
+ {
+ if (originalTargetSkills.TryGetValue(skillRecord.def, out var originalSkill))
+ {
+ // 比较等级
+ if (originalSkill.Item1 > skillRecord.levelInt)
+ {
+ skillRecord.levelInt = originalSkill.Item1;
+ }
+ // 比较热情
+ if (originalSkill.Item2 > skillRecord.passion)
+ {
+ skillRecord.passion = originalSkill.Item2;
+ }
+ }
+ }
+ Log.Message("[夺舍] 技能合并完成。");
+ }
+
+
targetPawn.health.AddHediff(hediff);
if (Props.hediffToApplyOnSuccess != null)
diff --git a/Source/ArachnaeSwarm/ARA_HuggingFace/Hediff_Possession.cs b/Source/ArachnaeSwarm/ARA_HuggingFace/Hediff_Possession.cs
index 0d8903b..f7a0c96 100644
--- a/Source/ArachnaeSwarm/ARA_HuggingFace/Hediff_Possession.cs
+++ b/Source/ArachnaeSwarm/ARA_HuggingFace/Hediff_Possession.cs
@@ -44,7 +44,7 @@ namespace ArachnaeSwarm
}
Log.Message($"Host {deadBody.LabelShort} died. Transferring experience back to {storedCaster.LabelShort} and ejecting.");
- PawnDataUtility.TransferSoul(deadBody, storedCaster);
+ // PawnDataUtility.TransferSoul(deadBody, storedCaster); // 注释掉这一行,因为我们不希望宿主的技能在死亡时传回给抱脸虫。
this.EjectContents();
}
diff --git a/Source/ArachnaeSwarm/ARA_HuggingFace/PawnDataUtility.cs b/Source/ArachnaeSwarm/ARA_HuggingFace/PawnDataUtility.cs
index 62cb26a..5af51f0 100644
--- a/Source/ArachnaeSwarm/ARA_HuggingFace/PawnDataUtility.cs
+++ b/Source/ArachnaeSwarm/ARA_HuggingFace/PawnDataUtility.cs
@@ -16,6 +16,9 @@ namespace ArachnaeSwarm
}
Log.Message($"Beginning soul transfer from {soulSource.LabelShort} to {bodyTarget.LabelShort}.");
+
+ bool isPossessing = soulSource.def.defName == "ARA_HuggingFace";
+ Log.Message(isPossessing ? "[夺舍] 模式:抱脸虫 -> 宿主" : "[回归] 模式:宿主 -> 抱脸虫");
// --- 1. Core Identity ---
bodyTarget.Name = soulSource.Name;
@@ -37,6 +40,7 @@ namespace ArachnaeSwarm
}
// --- 2. Growth & Experience ---
+ // 技能合并逻辑已移出,这里只做纯粹的数据覆盖
if (bodyTarget.skills != null) bodyTarget.skills.skills.Clear();
if (soulSource.skills != null)
{
@@ -52,6 +56,7 @@ namespace ArachnaeSwarm
}
}
+
if (bodyTarget.records != null && soulSource.records != null)
{
foreach (RecordDef recordDef in DefDatabase.AllDefs)