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)