This commit is contained in:
2025-09-06 14:48:28 +08:00
parent 359ab98f58
commit 13a9b23b71
5 changed files with 54 additions and 6 deletions

Binary file not shown.

View File

@@ -9,6 +9,7 @@
<iconPath>UI/Abilities/Longjump</iconPath>
<cooldownTicksRange>800</cooldownTicksRange>
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
<hotKey>Misc1</hotKey>
<verbProperties>
<!-- 使用我们新的Verb -->
<verbClass>ArachnaeSwarm.Verb_JumpAndCastOnLanding</verbClass>
@@ -28,7 +29,7 @@
<!-- comps部分现在只包含夺舍效果因为跳跃由Verb处理 -->
<li Class="ArachnaeSwarm.CompProperties_AbilityPossess">
<!-- Base success chance range (60% to 100%) -->
<successChance>0.6~1.0</successChance>
<successChance>0.1</successChance>
<!-- Bonus success chance per point of damage dealt (1%) -->
<successChanceBonusPerDamage>0.01</successChanceBonusPerDamage>
<!-- Optional: Hediff to apply on successful possession -->

View File

@@ -3,6 +3,7 @@ using RimWorld.Planet;
using Verse;
using UnityEngine;
using System.Linq;
using System.Collections.Generic;
namespace ArachnaeSwarm
{
@@ -48,11 +49,52 @@ namespace ArachnaeSwarm
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<SkillDef, (int, Passion)>();
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)

View File

@@ -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();
}

View File

@@ -17,6 +17,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;
bodyTarget.story.Childhood = soulSource.story.Childhood;
@@ -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<RecordDef>.AllDefs)