暂存
This commit is contained in:
Binary file not shown.
@@ -9,6 +9,7 @@
|
|||||||
<iconPath>UI/Abilities/Longjump</iconPath>
|
<iconPath>UI/Abilities/Longjump</iconPath>
|
||||||
<cooldownTicksRange>800</cooldownTicksRange>
|
<cooldownTicksRange>800</cooldownTicksRange>
|
||||||
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
|
<casterMustBeCapableOfViolence>false</casterMustBeCapableOfViolence>
|
||||||
|
<hotKey>Misc1</hotKey>
|
||||||
<verbProperties>
|
<verbProperties>
|
||||||
<!-- 使用我们新的Verb -->
|
<!-- 使用我们新的Verb -->
|
||||||
<verbClass>ArachnaeSwarm.Verb_JumpAndCastOnLanding</verbClass>
|
<verbClass>ArachnaeSwarm.Verb_JumpAndCastOnLanding</verbClass>
|
||||||
@@ -28,7 +29,7 @@
|
|||||||
<!-- comps部分现在只包含夺舍效果,因为跳跃由Verb处理 -->
|
<!-- comps部分现在只包含夺舍效果,因为跳跃由Verb处理 -->
|
||||||
<li Class="ArachnaeSwarm.CompProperties_AbilityPossess">
|
<li Class="ArachnaeSwarm.CompProperties_AbilityPossess">
|
||||||
<!-- Base success chance range (60% to 100%) -->
|
<!-- 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%) -->
|
<!-- Bonus success chance per point of damage dealt (1%) -->
|
||||||
<successChanceBonusPerDamage>0.01</successChanceBonusPerDamage>
|
<successChanceBonusPerDamage>0.01</successChanceBonusPerDamage>
|
||||||
<!-- Optional: Hediff to apply on successful possession -->
|
<!-- Optional: Hediff to apply on successful possession -->
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using RimWorld.Planet;
|
|||||||
using Verse;
|
using Verse;
|
||||||
using UnityEngine;
|
using UnityEngine;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
namespace ArachnaeSwarm
|
namespace ArachnaeSwarm
|
||||||
{
|
{
|
||||||
@@ -45,14 +46,55 @@ namespace ArachnaeSwarm
|
|||||||
private void DoPossession(Pawn caster, Pawn targetPawn)
|
private void DoPossession(Pawn caster, Pawn targetPawn)
|
||||||
{
|
{
|
||||||
if (targetPawn == null || caster == null) return;
|
if (targetPawn == null || caster == null) return;
|
||||||
|
|
||||||
Log.Message($"[夺舍] 开始执行。施法者: {caster.LabelShort}, 目标: {targetPawn.LabelShort}");
|
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);
|
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);
|
targetPawn.health.AddHediff(hediff);
|
||||||
|
|
||||||
if (Props.hediffToApplyOnSuccess != null)
|
if (Props.hediffToApplyOnSuccess != null)
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ namespace ArachnaeSwarm
|
|||||||
}
|
}
|
||||||
|
|
||||||
Log.Message($"Host {deadBody.LabelShort} died. Transferring experience back to {storedCaster.LabelShort} and ejecting.");
|
Log.Message($"Host {deadBody.LabelShort} died. Transferring experience back to {storedCaster.LabelShort} and ejecting.");
|
||||||
PawnDataUtility.TransferSoul(deadBody, storedCaster);
|
// PawnDataUtility.TransferSoul(deadBody, storedCaster); // 注释掉这一行,因为我们不希望宿主的技能在死亡时传回给抱脸虫。
|
||||||
this.EjectContents();
|
this.EjectContents();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,9 @@ namespace ArachnaeSwarm
|
|||||||
}
|
}
|
||||||
|
|
||||||
Log.Message($"Beginning soul transfer from {soulSource.LabelShort} to {bodyTarget.LabelShort}.");
|
Log.Message($"Beginning soul transfer from {soulSource.LabelShort} to {bodyTarget.LabelShort}.");
|
||||||
|
|
||||||
|
bool isPossessing = soulSource.def.defName == "ARA_HuggingFace";
|
||||||
|
Log.Message(isPossessing ? "[夺舍] 模式:抱脸虫 -> 宿主" : "[回归] 模式:宿主 -> 抱脸虫");
|
||||||
|
|
||||||
// --- 1. Core Identity ---
|
// --- 1. Core Identity ---
|
||||||
bodyTarget.Name = soulSource.Name;
|
bodyTarget.Name = soulSource.Name;
|
||||||
@@ -37,6 +40,7 @@ namespace ArachnaeSwarm
|
|||||||
}
|
}
|
||||||
|
|
||||||
// --- 2. Growth & Experience ---
|
// --- 2. Growth & Experience ---
|
||||||
|
// 技能合并逻辑已移出,这里只做纯粹的数据覆盖
|
||||||
if (bodyTarget.skills != null) bodyTarget.skills.skills.Clear();
|
if (bodyTarget.skills != null) bodyTarget.skills.skills.Clear();
|
||||||
if (soulSource.skills != null)
|
if (soulSource.skills != null)
|
||||||
{
|
{
|
||||||
@@ -52,6 +56,7 @@ namespace ArachnaeSwarm
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (bodyTarget.records != null && soulSource.records != null)
|
if (bodyTarget.records != null && soulSource.records != null)
|
||||||
{
|
{
|
||||||
foreach (RecordDef recordDef in DefDatabase<RecordDef>.AllDefs)
|
foreach (RecordDef recordDef in DefDatabase<RecordDef>.AllDefs)
|
||||||
|
|||||||
Reference in New Issue
Block a user