From 0982682cc96993ffdfc7edad3202b8030ecc6abb Mon Sep 17 00:00:00 2001 From: "ProjectKoi-Kalo\\Kalo" Date: Thu, 4 Sep 2025 21:01:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9A=82=E5=AD=982?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.6/1.6/Assemblies/ArachnaeSwarm.dll | Bin 68608 -> 70656 bytes .../Defs/AbilityDefs/ARA_Possession_Defs.xml | 27 +++ .../Defs/BackstoryDefs/ARA_BackstoryDef.xml | 16 ++ .../HediffDefs/ARA_Hediffs_Possession.xml | 2 +- 1.6/1.6/Defs/Misc/ARA_Possession_Defs.xml | 166 ------------------ .../ARA_Race_HuggingFaceSwarm.xml | 115 ++++++++++++ .../Possession/CompAbilityEffect_Possess.cs | 2 +- .../CompProperties_AbilityPossess.cs | 2 +- .../Possession/Hediff_Possession.cs | 2 +- .../Possession/PawnDataUtility.cs | 129 +++++++++----- .../Possession_Implementation_Guide.md | 49 ++++++ 11 files changed, 300 insertions(+), 210 deletions(-) create mode 100644 1.6/1.6/Defs/AbilityDefs/ARA_Possession_Defs.xml delete mode 100644 1.6/1.6/Defs/Misc/ARA_Possession_Defs.xml create mode 100644 1.6/1.6/Defs/ThingDef_Races/ARA_Race_HuggingFaceSwarm.xml diff --git a/1.6/1.6/Assemblies/ArachnaeSwarm.dll b/1.6/1.6/Assemblies/ArachnaeSwarm.dll index 5157529b235c0f00a15906fb4eaa74818da7ae79..3f48b6b6ae03ebd462c58731654ce6402cc0bef1 100644 GIT binary patch delta 19019 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 delta 17182 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 + + + + + ARA_Ability_Possess + + 将你的意识注入另一个生物的身体,完全占据它。 + UI/Abilities/Possess + 600 + + Verb_CastAbility + 1.5 + 5.9 + + true + false + false + false + + + +
  • + + + + \ No newline at end of file diff --git a/1.6/1.6/Defs/BackstoryDefs/ARA_BackstoryDef.xml b/1.6/1.6/Defs/BackstoryDefs/ARA_BackstoryDef.xml index ad5604f..596747c 100644 --- a/1.6/1.6/Defs/BackstoryDefs/ARA_BackstoryDef.xml +++ b/1.6/1.6/Defs/BackstoryDefs/ARA_BackstoryDef.xml @@ -97,4 +97,20 @@
  • ArachnaeNode_spawnCategories_WeaponSmith
  • + + + Arachnae_Node_BS_Adult_Facehugger + 阿拉克涅原虫种 + 原虫种 + [PAWN_nameDef]是一只阿拉克涅原虫种督虫。[PAWN_nameDef]通过独特的神经链接管伸入受害者身体来接管受害者的身体。不同于普通阿拉克涅虫族,阿拉克涅原虫种拥有自我意识,不需要女皇种的监管。 + Adulthood + Cooking + + + + + +
  • ArachnaeNode_spawnCategories_Facehugger
  • +
    +
    \ No newline at end of file diff --git a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_Possession.xml b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_Possession.xml index 095afb3..6dfe6f3 100644 --- a/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_Possession.xml +++ b/1.6/1.6/Defs/HediffDefs/ARA_Hediffs_Possession.xml @@ -5,7 +5,7 @@ ARA_Possession 这个生物的身体正被另一个实体所控制。 - ArachnaeSwarm.Possession.Hediff_Possession + ArachnaeSwarm.Hediff_Possession false false 1.0 diff --git a/1.6/1.6/Defs/Misc/ARA_Possession_Defs.xml b/1.6/1.6/Defs/Misc/ARA_Possession_Defs.xml deleted file mode 100644 index 40efc0a..0000000 --- a/1.6/1.6/Defs/Misc/ARA_Possession_Defs.xml +++ /dev/null @@ -1,166 +0,0 @@ - - - - - - - ARA_Ability_Possess - - 将你的意识注入另一个生物的身体,完全占据它。 - UI/Abilities/Possess - 600 - - Verb_CastAbility - 1.5 - 5.9 - - true - false - false - false - - - -
  • - - - - - ARA_Facehugger - Humanlike_PostMentalState - 100 - - - - -
  • - Possess - -
  • - - - - - - - - ARA_Facehugger - - ARA_FacehuggerRace - 25 - -
  • - - Things/Pawn/Animal/ARA_Facehugger - 0.8 - - - Things/Pawn/Animal/Dessicated/CritterDessicated - 0.8 - -
  • -
    - ARA_Facehugger - -
  • ARA_Ability_Possess
  • -
    -
    - - - - - ARA_FacehuggerRace - - 一种小型的、脆弱的寄生生物,其唯一的生存目的就是寻找并占据一个更强大的宿主。它通过将自己的意识注入目标来完成这一过程。 - - 4.0 - 50 - -10 - 50 - - -
  • - - -
  • Scratch
  • - - 2 - 1.5 - -
    - - Animal - ARA_FacehuggerBody - 0.2 - 0.3 - 0.1 - -
  • - AnimalAdult - 0 -
  • -
    -
    -
    - - - ARA_FacehuggerBody - - - Body - 20 - 20 - -
  • - Head - 0.3 - -
  • - Skull - 0.2 - Inside - -
  • - Brain - 0.1 - Inside -
  • -
    - -
  • - Eye - left eye - 0.07 -
  • -
  • - Eye - right eye - 0.07 -
  • - - -
  • - Leg - front left leg - 0.1 -
  • -
  • - Leg - front right leg - 0.1 -
  • -
  • - Leg - rear left leg - 0.1 -
  • -
  • - Leg - rear right leg - 0.1 -
  • - -
    -
    - -
    \ No newline at end of file diff --git a/1.6/1.6/Defs/ThingDef_Races/ARA_Race_HuggingFaceSwarm.xml b/1.6/1.6/Defs/ThingDef_Races/ARA_Race_HuggingFaceSwarm.xml new file mode 100644 index 0000000..220a030 --- /dev/null +++ b/1.6/1.6/Defs/ThingDef_Races/ARA_Race_HuggingFaceSwarm.xml @@ -0,0 +1,115 @@ + + + + + + ArachnaeNode_Race_Facehugger + + ArachnaeNode_Race_Facehugger + PlayerColony + 0 + +
  • + +
  • ArachnaeNode_spawnCategoriesA
  • +
  • ArachnaeNode_spawnCategories_Facehugger
  • + + +
    + +
  • ARA_Facehugger
  • +
    + + + 0 +
    + + + + ArachnaeNode_Race_Facehugger + + 阿拉克涅原虫,通过独特的神经链接管伸入受害者身体来接管受害者的身体。不同于普通阿拉克涅虫族,阿拉克涅原虫种拥有自我意识,不需要女皇种的监管。 + + + + + + +
  • + ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Myrmecocystus_Addons_Stomach + false + +
  • +
    +
    +
    + + + + + +
  • ARA_InsectJelly
  • +
    + false +
    +
    + +
  • + ARA_InsectJelly + 3 + 4 +
  • +
    + + + + + 2 + + + + 5 + 1 + + 100 + 70 + 10 + + 0.5 + + + + + + + + + 0.18 + 0.27 + 0.2 + + + + OmnivoreHuman,CarnivoreAnimal,OvivoreAnimal,VegetarianRoughAnimal + + ArachnaeMyrmecocystus_Body + + 2.5 + + 3 + + 1.5 + +
  • + ArachnaeNode_Myrmecocystus_Adult + 0 +
  • +
    +
    +
    + +
    \ No newline at end of file diff --git a/Source/ArachnaeSwarm/Possession/CompAbilityEffect_Possess.cs b/Source/ArachnaeSwarm/Possession/CompAbilityEffect_Possess.cs index f0e2b8b..f9f7f4e 100644 --- a/Source/ArachnaeSwarm/Possession/CompAbilityEffect_Possess.cs +++ b/Source/ArachnaeSwarm/Possession/CompAbilityEffect_Possess.cs @@ -1,7 +1,7 @@ using RimWorld; using Verse; -namespace ArachnaeSwarm.Possession +namespace ArachnaeSwarm { public class CompAbilityEffect_Possess : CompAbilityEffect { diff --git a/Source/ArachnaeSwarm/Possession/CompProperties_AbilityPossess.cs b/Source/ArachnaeSwarm/Possession/CompProperties_AbilityPossess.cs index 7cea6a7..b4402d0 100644 --- a/Source/ArachnaeSwarm/Possession/CompProperties_AbilityPossess.cs +++ b/Source/ArachnaeSwarm/Possession/CompProperties_AbilityPossess.cs @@ -1,6 +1,6 @@ using RimWorld; -namespace ArachnaeSwarm.Possession +namespace ArachnaeSwarm { public class CompProperties_AbilityPossess : CompProperties_AbilityEffect { diff --git a/Source/ArachnaeSwarm/Possession/Hediff_Possession.cs b/Source/ArachnaeSwarm/Possession/Hediff_Possession.cs index 7054207..34c6e0f 100644 --- a/Source/ArachnaeSwarm/Possession/Hediff_Possession.cs +++ b/Source/ArachnaeSwarm/Possession/Hediff_Possession.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using RimWorld; using Verse; -namespace ArachnaeSwarm.Possession +namespace ArachnaeSwarm { public class Hediff_Possession : HediffWithComps, IThingHolder { diff --git a/Source/ArachnaeSwarm/Possession/PawnDataUtility.cs b/Source/ArachnaeSwarm/Possession/PawnDataUtility.cs index 6b78f42..39f2318 100644 --- a/Source/ArachnaeSwarm/Possession/PawnDataUtility.cs +++ b/Source/ArachnaeSwarm/Possession/PawnDataUtility.cs @@ -1,8 +1,9 @@ using System.Collections.Generic; +using System.Linq; using RimWorld; using Verse; -namespace ArachnaeSwarm.Possession +namespace ArachnaeSwarm { public static class PawnDataUtility { @@ -16,43 +17,59 @@ namespace ArachnaeSwarm.Possession Log.Message($"Beginning soul transfer from {soulSource.LabelShort} to {bodyTarget.LabelShort}."); - // Name + // --- 1. Core Identity --- bodyTarget.Name = soulSource.Name; - - // Story (Backstory and Traits) bodyTarget.story.Childhood = soulSource.story.Childhood; bodyTarget.story.Adulthood = soulSource.story.Adulthood; - bodyTarget.story.traits.allTraits.Clear(); - foreach (Trait trait in soulSource.story.traits.allTraits) + + if (bodyTarget.story.traits != null) bodyTarget.story.traits.allTraits.Clear(); + if (soulSource.story.traits != null) { - bodyTarget.story.traits.GainTrait(trait); + foreach (Trait trait in soulSource.story.traits.allTraits) + { + bodyTarget.story.traits.GainTrait(trait); + } } - // Skills - bodyTarget.skills.skills.Clear(); - foreach (SkillRecord skill in soulSource.skills.skills) - { - SkillRecord newSkill = new SkillRecord(bodyTarget, skill.def) - { - levelInt = skill.levelInt, - xpSinceLastLevel = skill.xpSinceLastLevel, - passion = skill.passion - }; - bodyTarget.skills.skills.Add(newSkill); - } - - // Faction if (bodyTarget.Faction != soulSource.Faction) { bodyTarget.SetFaction(soulSource.Faction, soulSource); } - // Thoughts and Memories - if (bodyTarget.needs.mood?.thoughts?.memories != null) + // --- 2. Growth & Experience --- + if (bodyTarget.skills != null) bodyTarget.skills.skills.Clear(); + if (soulSource.skills != null) + { + foreach (SkillRecord skill in soulSource.skills.skills) + { + SkillRecord newSkill = new SkillRecord(bodyTarget, skill.def) + { + levelInt = skill.levelInt, + xpSinceLastLevel = skill.xpSinceLastLevel, + passion = skill.passion + }; + bodyTarget.skills.skills.Add(newSkill); + } + } + + if (bodyTarget.records != null && soulSource.records != null) + { + foreach (RecordDef recordDef in DefDatabase.AllDefs) + { + // Correct way: Get value from source and add the difference to target. + // This effectively sets the value. + float sourceValue = soulSource.records.GetValue(recordDef); + float targetValue = bodyTarget.records.GetValue(recordDef); + bodyTarget.records.AddTo(recordDef, sourceValue - targetValue); + } + } + + // --- 3. Mind & Settings --- + if (bodyTarget.needs?.mood?.thoughts?.memories != null) { bodyTarget.needs.mood.thoughts.memories.Memories.Clear(); } - if (soulSource.needs.mood?.thoughts?.memories != null) + if (soulSource.needs?.mood?.thoughts?.memories != null) { foreach (Thought_Memory memory in soulSource.needs.mood.thoughts.memories.Memories) { @@ -60,7 +77,6 @@ namespace ArachnaeSwarm.Possession } } - // Work Settings if (soulSource.workSettings != null && bodyTarget.workSettings != null) { bodyTarget.workSettings.EnableAndInitialize(); @@ -70,34 +86,67 @@ namespace ArachnaeSwarm.Possession } } - // Timetable if (soulSource.timetable != null && bodyTarget.timetable != null) { bodyTarget.timetable.times = new List(soulSource.timetable.times); } - // Social Relations + if (soulSource.playerSettings != null && bodyTarget.playerSettings != null) + { + bodyTarget.playerSettings.hostilityResponse = soulSource.playerSettings.hostilityResponse; + bodyTarget.playerSettings.medCare = soulSource.playerSettings.medCare; + bodyTarget.playerSettings.selfTend = soulSource.playerSettings.selfTend; + } + + if (soulSource.outfits != null && bodyTarget.outfits != null) bodyTarget.outfits.CurrentApparelPolicy = soulSource.outfits.CurrentApparelPolicy; + if (soulSource.drugs != null && bodyTarget.drugs != null) bodyTarget.drugs.CurrentPolicy = soulSource.drugs.CurrentPolicy; + if (soulSource.foodRestriction != null && bodyTarget.foodRestriction != null) bodyTarget.foodRestriction.CurrentFoodPolicy = soulSource.foodRestriction.CurrentFoodPolicy; + // Ownership is claimed on the Building, not the pawn. We can't directly transfer this. + // if (soulSource.ownership != null && bodyTarget.ownership != null) + // { + // // This requires finding the bed and calling bed.SetOwner(pawn) + // } + + + // --- 4. DLC & Social --- + if (ModsConfig.IdeologyActive && soulSource.ideo != null && bodyTarget.ideo != null) + { + bodyTarget.ideo.SetIdeo(soulSource.ideo.Ideo); + // Can't set certainty directly, but setting the ideo resets it. + } + + if (ModsConfig.RoyaltyActive && soulSource.royalty != null && bodyTarget.royalty != null) + { + // Clear existing royalty status from the target body + bodyTarget.royalty.AllTitlesForReading.Clear(); + + // Transfer titles + foreach(var title in soulSource.royalty.AllTitlesForReading) + { + bodyTarget.royalty.SetTitle(title.faction, title.def, true, false, false); + } + // Transfer permits + if(soulSource.royalty.AllFactionPermits != null) + { + foreach (var permit in soulSource.royalty.AllFactionPermits) + { + bodyTarget.royalty.AddPermit(permit.Permit, permit.Faction); + } + } + // Abilities are handled by the titles and should update automatically. + bodyTarget.royalty.UpdateAvailableAbilities(); + } + if (soulSource.relations != null && bodyTarget.relations != null) { bodyTarget.relations.ClearAllRelations(); - foreach (DirectPawnRelation relation in soulSource.relations.DirectRelations) + foreach (DirectPawnRelation relation in soulSource.relations.DirectRelations.Where(r => !r.def.familyByBloodRelation).ToList()) { bodyTarget.relations.AddDirectRelation(relation.def, relation.otherPawn); } } - // Guest status - if (soulSource.guest != null && bodyTarget.guest != null) - { - bodyTarget.guest.SetGuestStatus(soulSource.guest.HostFaction, soulSource.guest.GuestStatus); - if (soulSource.guest.IsPrisoner) - { - bodyTarget.guest.SetExclusiveInteraction(soulSource.guest.ExclusiveInteractionMode); - } - bodyTarget.guest.joinStatus = soulSource.guest.joinStatus; - } - - // Refresh the UI and game state to reflect the changes. + // --- 5. Finalization --- bodyTarget.Drawer.renderer.SetAllGraphicsDirty(); Log.Message("Soul transfer complete."); diff --git a/Source/Documents/Possession_Implementation_Guide.md b/Source/Documents/Possession_Implementation_Guide.md index d10dcdc..e69425b 100644 --- a/Source/Documents/Possession_Implementation_Guide.md +++ b/Source/Documents/Possession_Implementation_Guide.md @@ -37,6 +37,55 @@ graph TD ### 3.1 `CompAbilityEffect_Possess.cs` - 技能效果的起点 这是技能被使用时第一个被调用的C#文件。它的职责是创建`Hediff_Possession`并将其附加到目标身上,从而启动整个夺舍流程。 +## 3. 最终数据迁移规范 (Final Data Transfer Specification) + +通过对真实存档文件 (`Human.xml`) 的深度分析,我们最终确定了“灵魂”与“肉体”的数据边界。`PawnDataUtility.TransferSoul` 方法将严格遵循以下规范进行数据迁移: + +### 3.1 必须复制的“灵魂”数据 + +这些数据定义了Pawn的身份、经历、思想和核心能力,将**完全从抱脸虫(源)复制到宿主(目标)**。 + +- **核心身份 (`Name`, `Story`, `Faction`)**: + - `Name`: 姓名与昵称。 + - `Story`: 童年和成年背景 (`Childhood`, `Adulthood`)。 + - `Traits`: 所有特性。 + - `Faction`: 所属阵营。 +- **成长与经历 (`Skills`, `Records`)**: + - `Skills`: 所有技能的等级、经验和热情。 + - `Records`: 全部生平记录 (如击杀数、建造数等)。 +- **思想与设定 (`Needs`, `WorkSettings`, etc.)**: + - `Needs`: 主要是指`thoughts.memories` (思想和记忆)。 + - `WorkSettings`: 工作优先级。 + - `Timetable`: 时间表。 + - `PlayerSettings`: 玩家设定 (如医疗策略)。 + - `Ownership`: 对床、王座等的所有权。 + - `Outfits` & `Drugs`: 穿着和药物策略。 + - `FoodRestriction`: 食物策略。 +- **DLC核心数据 (`Ideo`, `Royalty`)**: + - `Ideo`: 完整的信仰体系。 + - `Royalty`: 完整的贵族系统,包括头衔、恩惠、许可、灵能和相关技能 (`abilities`)。 +- **社交 (`Relations`)**: + - 将采用**简化处理**:清空目标的旧关系,然后只复制源的**非亲属**直接关系 (如朋友、对手、爱人)。这可以避免破坏家族树。 + +### 3.2 必须保留的“肉体”数据 + +这些数据属于物理身体的范畴,在夺舍过程中将**完全保留宿主原有的数据**,不进行任何复制。 + +- **健康与生理 (`Health`, `Age`)**: + - `Health`: 所有伤口、疤痕、疾病和植入物。 + - `Age`: 生物年龄和时间年龄。 +- **外观与基因 (`Style`, `Genes`, `BodyType`)**: + - `Style`: 发型、胡须、纹身。 + - `Genes`: 所有内生和异种基因。 + - `BodyType`, `HeadType`, `HairColor`: 身体类型、头型和发色。 +- **装备与物品 (`Apparel`, `Equipment`, `Inventory`)**: + - `Apparel`: 身上穿着的衣物。 + - `Equipment`: 手中持有的装备。 + - `Inventory`: 物品栏中的物品。 +- **物理状态 (`Position`, `Stances`, `Pather`)**: + - Pawn在世界中的位置、姿态和寻路信息。 + +--- ```csharp // 路径: Source/ArachnaeSwarm/Possession/CompAbilityEffect_Possess.cs