From 514b7ff0f9eed44b8ff5eb17224719c75e5d1b8c Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Sat, 6 Sep 2025 15:08:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/1.6/Assemblies/ArachnaeSwarm.dll | Bin 81408 -> 87040 bytes .../CompAbilityEffect_Possess.cs | 35 ++-- .../ARA_HuggingFace/Hediff_Possession.cs | 37 ++-- .../ARA_HuggingFace/OriginalPawnData.cs | 180 ++++++++++++++++++ Source/ArachnaeSwarm/ArachnaeSwarm.csproj | 1 + 5 files changed, 226 insertions(+), 27 deletions(-) create mode 100644 Source/ArachnaeSwarm/ARA_HuggingFace/OriginalPawnData.cs diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 8df7244e98170febe415bc9cd748eb9d6c35d1ab..664bd3f1cd9c0ffef60a129d9f077a0c6bf83ed5 100644 GIT binary patch delta 30213 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 delta 24820 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 CeLrsi diff --git a/Source/ArachnaeSwarm/ARA_HuggingFace/CompAbilityEffect_Possess.cs b/Source/ArachnaeSwarm/ARA_HuggingFace/CompAbilityEffect_Possess.cs index 8712fac..8a0ced4 100644 --- a/Source/ArachnaeSwarm/ARA_HuggingFace/CompAbilityEffect_Possess.cs +++ b/Source/ArachnaeSwarm/ARA_HuggingFace/CompAbilityEffect_Possess.cs @@ -46,11 +46,16 @@ namespace ArachnaeSwarm private void DoPossession(Pawn caster, Pawn targetPawn) { if (targetPawn == null || caster == null) return; - + Log.Message($"[夺舍] 开始执行。施法者: {caster.LabelShort}, 目标: {targetPawn.LabelShort}"); - // 为了保留原始宿主的技能数据,在灵魂转移前先复制一份 - var originalTargetSkills = new Dictionary(); + // 1. 捕获原宿主的完整数据,用于死亡后恢复尸体 + OriginalPawnData originalHostData = new OriginalPawnData(); + originalHostData.CaptureData(targetPawn); + Log.Message($"[夺舍] 已捕获原始宿主 {targetPawn.LabelShort} 的完整数据。"); + + // 2. 备份原宿主的技能,用于后续合并 + var originalTargetSkills = new Dictionary(); if (targetPawn.skills != null) { foreach (var skill in targetPawn.skills.skills) @@ -59,19 +64,20 @@ namespace ArachnaeSwarm } } - // 储存原始抱脸虫 + // 3. 准备抱脸虫和Hediff 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)) + hediff.originalHostData = originalHostData; // 将宿主数据存入Hediff + + // 4. 将抱脸虫存入Hediff + if (hediff.casterContainer.TryAdd(originalCaster, true)) { Log.Message($"[夺舍] 成功将 {caster.LabelShort} 的原始副本存入Hediff。"); - // 灵魂转移,此时 targetPawn 的技能被 caster 的技能覆盖 + // 5. 灵魂转移,此时 targetPawn 的技能被 caster 的技能覆盖 PawnDataUtility.TransferSoul(caster, targetPawn); - // --- 技能合并 --- - // 在灵魂转移后,直接在最终的身体 (targetPawn) 上进行合并 + // 6. 技能合并:在灵魂转移后,直接在最终的身体 (targetPawn) 上进行合并 if (targetPawn.skills != null) { Log.Message("[夺舍] 开始合并技能..."); @@ -80,21 +86,21 @@ namespace ArachnaeSwarm if (originalTargetSkills.TryGetValue(skillRecord.def, out var originalSkill)) { // 比较等级 - if (originalSkill.Item1 > skillRecord.levelInt) + if (originalSkill.level > skillRecord.levelInt) { - skillRecord.levelInt = originalSkill.Item1; + skillRecord.levelInt = originalSkill.level; } // 比较热情 - if (originalSkill.Item2 > skillRecord.passion) + if (originalSkill.passion > skillRecord.passion) { - skillRecord.passion = originalSkill.Item2; + skillRecord.passion = originalSkill.passion; } } } Log.Message("[夺舍] 技能合并完成。"); } - + // 7. 将Hediff添加到最终身体上 targetPawn.health.AddHediff(hediff); if (Props.hediffToApplyOnSuccess != null) @@ -107,6 +113,7 @@ namespace ArachnaeSwarm else { Log.Error($"[夺舍] 无法将 {caster.LabelShort} 的副本存入Hediff。中止操作。"); + if(originalCaster != null && !originalCaster.Destroyed) originalCaster.Destroy(); } } diff --git a/Source/ArachnaeSwarm/ARA_HuggingFace/Hediff_Possession.cs b/Source/ArachnaeSwarm/ARA_HuggingFace/Hediff_Possession.cs index f7a0c96..1c58127 100644 --- a/Source/ArachnaeSwarm/ARA_HuggingFace/Hediff_Possession.cs +++ b/Source/ArachnaeSwarm/ARA_HuggingFace/Hediff_Possession.cs @@ -6,14 +6,15 @@ namespace ArachnaeSwarm { public class Hediff_Possession : HediffWithComps, IThingHolder { - private ThingOwner innerContainer; + public ThingOwner casterContainer; + public OriginalPawnData originalHostData; public Hediff_Possession() { - this.innerContainer = new ThingOwner(this, false, LookMode.Deep); + this.casterContainer = new ThingOwner(this, false, LookMode.Deep); } - public Pawn StoredCasterPawn => innerContainer.Count > 0 ? innerContainer[0] as Pawn : null; + public Pawn StoredCasterPawn => casterContainer.Count > 0 ? casterContainer[0] as Pawn : null; public IThingHolder ParentHolder => this.pawn; @@ -24,7 +25,7 @@ namespace ArachnaeSwarm public ThingOwner GetDirectlyHeldThings() { - return innerContainer; + return casterContainer; } // PostAdd现在只在游戏加载时起作用,我们不需要在这里做任何特殊操作。 @@ -37,19 +38,28 @@ namespace ArachnaeSwarm Pawn deadBody = this.pawn; Pawn storedCaster = this.StoredCasterPawn; - if (storedCaster == null) + if (originalHostData != null) + { + Log.Message($"[夺舍结束] 正在将 {deadBody.LabelShort}'s 的灵魂恢复为原始宿主数据。"); + originalHostData.RestoreData(deadBody); + } + else + { + Log.Error("Possessed pawn died, but no original host data was found to restore."); + } + + if (storedCaster != null) + { + EjectCaster(); + } + else { Log.Error("Possessed pawn died, but no caster soul was found inside."); - return; } - - Log.Message($"Host {deadBody.LabelShort} died. Transferring experience back to {storedCaster.LabelShort} and ejecting."); - // PawnDataUtility.TransferSoul(deadBody, storedCaster); // 注释掉这一行,因为我们不希望宿主的技能在死亡时传回给抱脸虫。 - this.EjectContents(); } - public void EjectContents() + public void EjectCaster() { if (StoredCasterPawn == null) return; @@ -68,13 +78,14 @@ namespace ArachnaeSwarm } Log.Message($"[夺舍] 准备在地图 {map.ToString()} 的位置 {cell.ToString()} 处重生 {StoredCasterPawn.LabelShort}。"); - this.innerContainer.TryDropAll(cell, map, ThingPlaceMode.Near); + this.casterContainer.TryDropAll(cell, map, ThingPlaceMode.Near); } public override void ExposeData() { base.ExposeData(); - Scribe_Deep.Look(ref innerContainer, "innerContainer", this); + Scribe_Deep.Look(ref casterContainer, "casterContainer", this); + Scribe_Deep.Look(ref originalHostData, "originalHostData"); } } } \ No newline at end of file diff --git a/Source/ArachnaeSwarm/ARA_HuggingFace/OriginalPawnData.cs b/Source/ArachnaeSwarm/ARA_HuggingFace/OriginalPawnData.cs new file mode 100644 index 0000000..295e436 --- /dev/null +++ b/Source/ArachnaeSwarm/ARA_HuggingFace/OriginalPawnData.cs @@ -0,0 +1,180 @@ +using RimWorld; +using Verse; +using System.Collections.Generic; +using System.Linq; +using RimWorld.Planet; + +namespace ArachnaeSwarm +{ + // A container for all essential data of a pawn that needs to be restored. + public class OriginalPawnData : IExposable + { + // Core Identity + public Name name; + public BackstoryDef childhood; + public BackstoryDef adulthood; + public List traits = new List(); + public Faction faction; + + // Growth & Experience + public List skills = new List(); + + // Mind & Settings + public List memories = new List(); + public Dictionary workSettings = new Dictionary(); + public List timetable; + public HostilityResponseMode hostilityResponse; + public MedicalCareCategory medCare; + public bool selfTend; + public ApparelPolicy apparelPolicy; + public DrugPolicy drugPolicy; + public FoodPolicy foodPolicy; + + // DLC & Social + public Ideo ideo; + public List royalTitles = new List(); + + public void ExposeData() + { + Scribe_Deep.Look(ref name, "name"); + Scribe_Defs.Look(ref childhood, "childhood"); + Scribe_Defs.Look(ref adulthood, "adulthood"); + Scribe_Collections.Look(ref traits, "traits", LookMode.Deep); + Scribe_References.Look(ref faction, "faction"); + Scribe_Collections.Look(ref skills, "skills", LookMode.Deep); + Scribe_Collections.Look(ref memories, "memories", LookMode.Deep); + Scribe_Collections.Look(ref workSettings, "workSettings", LookMode.Def, LookMode.Value); + Scribe_Collections.Look(ref timetable, "timetable", LookMode.Def); + Scribe_Values.Look(ref hostilityResponse, "hostilityResponse"); + Scribe_Values.Look(ref medCare, "medCare"); + Scribe_Values.Look(ref selfTend, "selfTend"); + Scribe_References.Look(ref apparelPolicy, "apparelPolicy"); + Scribe_References.Look(ref drugPolicy, "drugPolicy"); + Scribe_References.Look(ref foodPolicy, "foodPolicy"); + + if (ModsConfig.IdeologyActive) Scribe_References.Look(ref ideo, "ideo"); + if (ModsConfig.RoyaltyActive) + { + Scribe_Collections.Look(ref royalTitles, "royalTitles", LookMode.Deep); + } + } + + // Populates this object with data from a living pawn. + public void CaptureData(Pawn pawn) + { + this.name = pawn.Name; + this.childhood = pawn.story.Childhood; + this.adulthood = pawn.story.Adulthood; + this.traits = new List(pawn.story.traits.allTraits); + this.faction = pawn.Faction; + + this.skills = pawn.skills.skills.Select(s => new SkillRecordData + { + def = s.def, + level = s.levelInt, + xpSinceLastLevel = s.xpSinceLastLevel, + passion = s.passion + }).ToList(); + + if (pawn.needs?.mood?.thoughts?.memories != null) this.memories = new List(pawn.needs.mood.thoughts.memories.Memories); + if (pawn.workSettings != null) this.workSettings = DefDatabase.AllDefs.ToDictionary(def => def, def => pawn.workSettings.GetPriority(def)); + if (pawn.timetable != null) this.timetable = new List(pawn.timetable.times); + if (pawn.playerSettings != null) + { + this.hostilityResponse = pawn.playerSettings.hostilityResponse; + this.medCare = pawn.playerSettings.medCare; + this.selfTend = pawn.playerSettings.selfTend; + } + if (pawn.outfits != null) this.apparelPolicy = pawn.outfits.CurrentApparelPolicy; + if (pawn.drugs != null) this.drugPolicy = pawn.drugs.CurrentPolicy; + if (pawn.foodRestriction != null) this.foodPolicy = pawn.foodRestriction.CurrentFoodPolicy; + + if (ModsConfig.IdeologyActive && pawn.ideo != null) this.ideo = pawn.ideo.Ideo; + if (ModsConfig.RoyaltyActive && pawn.royalty != null) + { + this.royalTitles = pawn.royalty.AllTitlesForReading.Select(t => new RoyalTitleData { defName = t.def.defName, faction = t.faction }).ToList(); + } + } + + // Applies the stored data back to a living pawn. + public void RestoreData(Pawn pawn) + { + pawn.Name = this.name; + pawn.story.Childhood = this.childhood; + pawn.story.Adulthood = this.adulthood; + pawn.story.traits.allTraits.Clear(); + this.traits.ForEach(t => pawn.story.traits.GainTrait(t)); + if (pawn.Faction != this.faction) pawn.SetFaction(this.faction); + + pawn.skills.skills.Clear(); + this.skills.ForEach(s => pawn.skills.skills.Add(new SkillRecord(pawn, s.def) { levelInt = s.level, xpSinceLastLevel = s.xpSinceLastLevel, passion = s.passion })); + + if (pawn.needs?.mood?.thoughts?.memories != null) + { + pawn.needs.mood.thoughts.memories.Memories.Clear(); + this.memories.ForEach(m => pawn.needs.mood.thoughts.memories.TryGainMemory(m)); + } + if (pawn.workSettings != null) + { + pawn.workSettings.EnableAndInitialize(); + foreach(var ws in this.workSettings) pawn.workSettings.SetPriority(ws.Key, ws.Value); + } + if (pawn.timetable != null) pawn.timetable.times = new List(this.timetable); + if (pawn.playerSettings != null) + { + pawn.playerSettings.hostilityResponse = this.hostilityResponse; + pawn.playerSettings.medCare = this.medCare; + pawn.playerSettings.selfTend = this.selfTend; + } + if (pawn.outfits != null) pawn.outfits.CurrentApparelPolicy = this.apparelPolicy; + if (pawn.drugs != null) pawn.drugs.CurrentPolicy = this.drugPolicy; + if (pawn.foodRestriction != null) pawn.foodRestriction.CurrentFoodPolicy = this.foodPolicy; + + if (ModsConfig.IdeologyActive && pawn.ideo != null && this.ideo != null) pawn.ideo.SetIdeo(this.ideo); + if (ModsConfig.RoyaltyActive && pawn.royalty != null) + { + pawn.royalty.AllTitlesForReading.Clear(); + pawn.royalty.AllFactionPermits.Clear(); // Clear existing permits on the body + this.royalTitles.ForEach(t => { + RoyalTitleDef titleDef = DefDatabase.GetNamed(t.defName, false); + if (titleDef != null) + { + pawn.royalty.SetTitle(t.faction, titleDef, true, false, false); + } + }); + pawn.royalty.UpdateAvailableAbilities(); + } + + pawn.Drawer.renderer.SetAllGraphicsDirty(); + } + } + + public class SkillRecordData : IExposable + { + public SkillDef def; + public int level; + public float xpSinceLastLevel; + public Passion passion; + + public void ExposeData() + { + Scribe_Defs.Look(ref def, "def"); + Scribe_Values.Look(ref level, "level"); + Scribe_Values.Look(ref xpSinceLastLevel, "xpSinceLastLevel"); + Scribe_Values.Look(ref passion, "passion"); + } + } + + public class RoyalTitleData : IExposable + { + public Faction faction; + public string defName; + + public void ExposeData() + { + Scribe_References.Look(ref faction, "faction"); + Scribe_Values.Look(ref defName, "defName"); + } + } + +} \ No newline at end of file diff --git a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj index 2929c0b..3e58564 100644 --- a/Source/ArachnaeSwarm/ArachnaeSwarm.csproj +++ b/Source/ArachnaeSwarm/ArachnaeSwarm.csproj @@ -121,6 +121,7 @@ +