暂存2
This commit is contained in:
Binary file not shown.
27
1.6/1.6/Defs/AbilityDefs/ARA_Possession_Defs.xml
Normal file
27
1.6/1.6/Defs/AbilityDefs/ARA_Possession_Defs.xml
Normal file
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<Defs>
|
||||
|
||||
<!-- ==================== Ability Def ==================== -->
|
||||
<AbilityDef>
|
||||
<defName>ARA_Ability_Possess</defName>
|
||||
<label>阿拉克涅寄生</label>
|
||||
<description>将你的意识注入另一个生物的身体,完全占据它。</description>
|
||||
<iconPath>UI/Abilities/Possess</iconPath>
|
||||
<cooldownTicks>600</cooldownTicks>
|
||||
<verbProperties>
|
||||
<verbClass>Verb_CastAbility</verbClass>
|
||||
<warmupTime>1.5</warmupTime>
|
||||
<range>5.9</range>
|
||||
<targetParams>
|
||||
<canTargetPawns>true</canTargetPawns>
|
||||
<canTargetBuildings>false</canTargetBuildings>
|
||||
<canTargetSelf>false</canTargetSelf>
|
||||
<canTargetLocations>false</canTargetLocations>
|
||||
</targetParams>
|
||||
</verbProperties>
|
||||
<comps>
|
||||
<li Class="ArachnaeSwarm.CompProperties_AbilityPossess"/>
|
||||
</comps>
|
||||
</AbilityDef>
|
||||
|
||||
</Defs>
|
||||
@@ -97,4 +97,20 @@
|
||||
<li>ArachnaeNode_spawnCategories_WeaponSmith</li>
|
||||
</spawnCategories>
|
||||
</AlienRace.AlienBackstoryDef>
|
||||
|
||||
<AlienRace.AlienBackstoryDef ParentName="ARA_BaseBackStory">
|
||||
<defName>Arachnae_Node_BS_Adult_Facehugger</defName>
|
||||
<title>阿拉克涅原虫种</title>
|
||||
<titleShort>原虫种</titleShort>
|
||||
<description>[PAWN_nameDef]是一只阿拉克涅原虫种督虫。[PAWN_nameDef]通过独特的神经链接管伸入受害者身体来接管受害者的身体。不同于普通阿拉克涅虫族,阿拉克涅原虫种拥有自我意识,不需要女皇种的监管。</description>
|
||||
<slot>Adulthood</slot>
|
||||
<requiredWorkTags>Cooking</requiredWorkTags>
|
||||
|
||||
<forcedHediffs Insert="false">
|
||||
</forcedHediffs>
|
||||
|
||||
<spawnCategories>
|
||||
<li>ArachnaeNode_spawnCategories_Facehugger</li>
|
||||
</spawnCategories>
|
||||
</AlienRace.AlienBackstoryDef>
|
||||
</Defs>
|
||||
@@ -5,7 +5,7 @@
|
||||
<defName>ARA_Possession</defName>
|
||||
<label>阿拉克涅原虫寄生</label>
|
||||
<description>这个生物的身体正被另一个实体所控制。</description>
|
||||
<hediffClass>ArachnaeSwarm.Possession.Hediff_Possession</hediffClass>
|
||||
<hediffClass>ArachnaeSwarm.Hediff_Possession</hediffClass>
|
||||
<isBad>false</isBad>
|
||||
<scenarioCanAdd>false</scenarioCanAdd>
|
||||
<maxSeverity>1.0</maxSeverity>
|
||||
|
||||
@@ -1,166 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<Defs>
|
||||
|
||||
<!-- ==================== Ability Def ==================== -->
|
||||
|
||||
<AbilityDef>
|
||||
<defName>ARA_Ability_Possess</defName>
|
||||
<label>阿拉克涅寄生</label>
|
||||
<description>将你的意识注入另一个生物的身体,完全占据它。</description>
|
||||
<iconPath>UI/Abilities/Possess</iconPath>
|
||||
<cooldownTicks>600</cooldownTicks>
|
||||
<verbProperties>
|
||||
<verbClass>Verb_CastAbility</verbClass>
|
||||
<warmupTime>1.5</warmupTime>
|
||||
<range>5.9</range>
|
||||
<targetParams>
|
||||
<canTargetPawns>true</canTargetPawns>
|
||||
<canTargetBuildings>false</canTargetBuildings>
|
||||
<canTargetSelf>false</canTargetSelf>
|
||||
<canTargetLocations>false</canTargetLocations>
|
||||
</targetParams>
|
||||
</verbProperties>
|
||||
<comps>
|
||||
<li Class="ArachnaeSwarm.Abilities.CompProperties_AbilityPossess"/>
|
||||
</comps>
|
||||
</AbilityDef>
|
||||
|
||||
<ThinkTreeDef>
|
||||
<defName>ARA_Facehugger</defName>
|
||||
<insertTag>Humanlike_PostMentalState</insertTag>
|
||||
<insertPriority>100</insertPriority>
|
||||
<thinkRoot Class="ThinkNode_Priority">
|
||||
<subNodes>
|
||||
<!-- TODO: Add custom AI logic for the facehugger if needed -->
|
||||
<!-- e.g., seek out hosts when idle -->
|
||||
<li Class="ThinkNode_ConditionalHasDuty">
|
||||
<duty>Possess</duty>
|
||||
<subNode Class="JobGiver_AIFightEnemy" />
|
||||
</li>
|
||||
</subNodes>
|
||||
</thinkRoot>
|
||||
</ThinkTreeDef>
|
||||
|
||||
<!-- ==================== Pawn Kind Def ==================== -->
|
||||
|
||||
<PawnKindDef>
|
||||
<defName>ARA_Facehugger</defName>
|
||||
<label>阿拉克涅原虫</label>
|
||||
<race>ARA_FacehuggerRace</race> <!-- We will need to define this race -->
|
||||
<combatPower>25</combatPower>
|
||||
<lifeStages>
|
||||
<li>
|
||||
<bodyGraphicData>
|
||||
<texPath>Things/Pawn/Animal/ARA_Facehugger</texPath>
|
||||
<drawSize>0.8</drawSize>
|
||||
</bodyGraphicData>
|
||||
<dessicatedBodyGraphicData>
|
||||
<texPath>Things/Pawn/Animal/Dessicated/CritterDessicated</texPath>
|
||||
<drawSize>0.8</drawSize>
|
||||
</dessicatedBodyGraphicData>
|
||||
</li>
|
||||
</lifeStages>
|
||||
<aiThinkTree>ARA_Facehugger</aiThinkTree>
|
||||
<abilities>
|
||||
<li>ARA_Ability_Possess</li>
|
||||
</abilities>
|
||||
</PawnKindDef>
|
||||
|
||||
<!-- ==================== Race Def ==================== -->
|
||||
|
||||
<ThingDef ParentName="AnimalThingBase">
|
||||
<defName>ARA_FacehuggerRace</defName>
|
||||
<label>阿拉克涅原虫</label>
|
||||
<description>一种小型的、脆弱的寄生生物,其唯一的生存目的就是寻找并占据一个更强大的宿主。它通过将自己的意识注入目标来完成这一过程。</description>
|
||||
<statBases>
|
||||
<MoveSpeed>4.0</MoveSpeed>
|
||||
<MarketValue>50</MarketValue>
|
||||
<ComfyTemperatureMin>-10</ComfyTemperatureMin>
|
||||
<ComfyTemperatureMax>50</ComfyTemperatureMax>
|
||||
</statBases>
|
||||
<tools>
|
||||
<li>
|
||||
<label>tiny claws</label>
|
||||
<capacities>
|
||||
<li>Scratch</li>
|
||||
</capacities>
|
||||
<power>2</power>
|
||||
<cooldownTime>1.5</cooldownTime>
|
||||
</li>
|
||||
</tools>
|
||||
<race>
|
||||
<thinkTreeMain>Animal</thinkTreeMain>
|
||||
<body>ARA_FacehuggerBody</body> <!-- We will need to define this body -->
|
||||
<baseBodySize>0.2</baseBodySize>
|
||||
<baseHealthScale>0.3</baseHealthScale>
|
||||
<baseHungerRate>0.1</baseHungerRate>
|
||||
<lifeStageAges>
|
||||
<li>
|
||||
<def>AnimalAdult</def>
|
||||
<minAge>0</minAge>
|
||||
</li>
|
||||
</lifeStageAges>
|
||||
</race>
|
||||
</ThingDef>
|
||||
|
||||
<BodyDef>
|
||||
<defName>ARA_FacehuggerBody</defName>
|
||||
<label>facehugger</label>
|
||||
<corePart>
|
||||
<def>Body</def>
|
||||
<height>20</height>
|
||||
<depth>20</depth>
|
||||
<parts>
|
||||
<li>
|
||||
<def>Head</def>
|
||||
<coverage>0.3</coverage>
|
||||
<parts>
|
||||
<li>
|
||||
<def>Skull</def>
|
||||
<coverage>0.2</coverage>
|
||||
<depth>Inside</depth>
|
||||
<parts>
|
||||
<li>
|
||||
<def>Brain</def>
|
||||
<coverage>0.1</coverage>
|
||||
<depth>Inside</depth>
|
||||
</li>
|
||||
</parts>
|
||||
</li>
|
||||
<li>
|
||||
<def>Eye</def>
|
||||
<customLabel>left eye</customLabel>
|
||||
<coverage>0.07</coverage>
|
||||
</li>
|
||||
<li>
|
||||
<def>Eye</def>
|
||||
<customLabel>right eye</customLabel>
|
||||
<coverage>0.07</coverage>
|
||||
</li>
|
||||
</parts>
|
||||
</li>
|
||||
<li>
|
||||
<def>Leg</def>
|
||||
<customLabel>front left leg</customLabel>
|
||||
<coverage>0.1</coverage>
|
||||
</li>
|
||||
<li>
|
||||
<def>Leg</def>
|
||||
<customLabel>front right leg</customLabel>
|
||||
<coverage>0.1</coverage>
|
||||
</li>
|
||||
<li>
|
||||
<def>Leg</def>
|
||||
<customLabel>rear left leg</customLabel>
|
||||
<coverage>0.1</coverage>
|
||||
</li>
|
||||
<li>
|
||||
<def>Leg</def>
|
||||
<customLabel>rear right leg</customLabel>
|
||||
<coverage>0.1</coverage>
|
||||
</li>
|
||||
</parts>
|
||||
</corePart>
|
||||
</BodyDef>
|
||||
|
||||
</Defs>
|
||||
115
1.6/1.6/Defs/ThingDef_Races/ARA_Race_HuggingFaceSwarm.xml
Normal file
115
1.6/1.6/Defs/ThingDef_Races/ARA_Race_HuggingFaceSwarm.xml
Normal file
@@ -0,0 +1,115 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<Defs>
|
||||
|
||||
<!-- ==================== Pawn Kind Def ==================== -->
|
||||
<PawnKindDef ParentName="ArachnaeNodeABasePawnKind">
|
||||
<defName>ArachnaeNode_Race_Facehugger</defName>
|
||||
<label>阿拉克涅原虫种</label>
|
||||
<race>ArachnaeNode_Race_Facehugger</race>
|
||||
<defaultFactionType>PlayerColony</defaultFactionType>
|
||||
<invNutrition>0</invNutrition>
|
||||
<backstoryFiltersOverride>
|
||||
<li>
|
||||
<categories>
|
||||
<li>ArachnaeNode_spawnCategoriesA</li>
|
||||
<li>ArachnaeNode_spawnCategories_Facehugger</li>
|
||||
</categories>
|
||||
</li>
|
||||
</backstoryFiltersOverride>
|
||||
<abilities>
|
||||
<li>ARA_Facehugger</li>
|
||||
</abilities>
|
||||
<apparelTags>
|
||||
</apparelTags>
|
||||
<apparelMoney>0</apparelMoney>
|
||||
</PawnKindDef>
|
||||
|
||||
<!-- 定义阿拉克涅节点虫种族 -->
|
||||
<AlienRace.ThingDef_AlienRace ParentName="ARA_NodeBase">
|
||||
<defName>ArachnaeNode_Race_Facehugger</defName>
|
||||
<label>阿拉克涅原虫种</label>
|
||||
<description>阿拉克涅原虫,通过独特的神经链接管伸入受害者身体来接管受害者的身体。不同于普通阿拉克涅虫族,阿拉克涅原虫种拥有自我意识,不需要女皇种的监管。</description>
|
||||
<alienRace>
|
||||
<generalSettings>
|
||||
<!-- 各种零件定义 -->
|
||||
<alienPartGenerator>
|
||||
<!-- 额外身体部件 -->
|
||||
<bodyAddons>
|
||||
<li>
|
||||
<path>ArachnaeSwarm/Things/ARA_HiveNode/Addons/ArachnaeNode_Race_Myrmecocystus_Addons_Stomach</path>
|
||||
<inFrontOfBody>false</inFrontOfBody>
|
||||
<!-- <conditions>
|
||||
<BodyPart>
|
||||
<bodyPart>WULA_Addons_Antenna_Bodypart</bodyPart>
|
||||
</BodyPart>
|
||||
</conditions> -->
|
||||
</li>
|
||||
</bodyAddons>
|
||||
</alienPartGenerator>
|
||||
</generalSettings>
|
||||
<!-- 种族的允许和禁止特化设置 -->
|
||||
<raceRestriction>
|
||||
<!-- 食物列表 -->
|
||||
<whiteFoodList Inherit="False"/>
|
||||
<blackFoodList>
|
||||
<li>ARA_InsectJelly</li>
|
||||
</blackFoodList>
|
||||
<onlyEatRaceRestrictedFood>false</onlyEatRaceRestrictedFood>
|
||||
</raceRestriction>
|
||||
</alienRace>
|
||||
<comps>
|
||||
<li Class="ArachnaeSwarm.CompProperties_MilkableArachnae">
|
||||
<milkDef>ARA_InsectJelly</milkDef>
|
||||
<milkIntervalDays>3</milkIntervalDays>
|
||||
<milkAmount>4</milkAmount>
|
||||
</li>
|
||||
</comps>
|
||||
|
||||
<!-- 基础属性设置 -->
|
||||
<statBases>
|
||||
<!-- 移动速度 -->
|
||||
<MoveSpeed>2</MoveSpeed>
|
||||
|
||||
<!-- <RestRateMultiplier>1</RestRateMultiplier> -->
|
||||
<!-- <HungerRateMultiplier>1</HungerRateMultiplier> -->
|
||||
<EatingSpeed>5</EatingSpeed>
|
||||
<MaxNutrition>1</MaxNutrition>
|
||||
|
||||
<CarryingCapacity>100</CarryingCapacity>
|
||||
<MeatAmount>70</MeatAmount>
|
||||
<LeatherAmount>10</LeatherAmount>
|
||||
|
||||
<MeleeDodgeChance>0.5</MeleeDodgeChance>
|
||||
<!-- <MeleeHitChance>1</MeleeHitChance> -->
|
||||
|
||||
<!-- <NegotiationAbility>1</NegotiationAbility> -->
|
||||
<!-- <SellPriceFactor>1</SellPriceFactor> -->
|
||||
<!-- <SocialImpact>1</SocialImpact> -->
|
||||
<!-- <TradePriceImprovement>0.5</TradePriceImprovement> -->
|
||||
|
||||
<!-- 自带的甲壳可以防御外部攻击 -->
|
||||
<ArmorRating_Blunt>0.18</ArmorRating_Blunt>
|
||||
<ArmorRating_Sharp>0.27</ArmorRating_Sharp>
|
||||
<ArmorRating_Heat>0.2</ArmorRating_Heat>
|
||||
</statBases>
|
||||
|
||||
<race>
|
||||
<foodType>OmnivoreHuman,CarnivoreAnimal,OvivoreAnimal,VegetarianRoughAnimal</foodType>
|
||||
<!-- 身体类型 -->
|
||||
<body>ArachnaeMyrmecocystus_Body</body>
|
||||
<!-- 身形大小 -->
|
||||
<baseBodySize>2.5</baseBodySize>
|
||||
<!-- 血量上限 -->
|
||||
<baseHealthScale>3</baseHealthScale>
|
||||
<!-- 蜜罐虫的寿命很低 -->
|
||||
<lifeExpectancy>1.5</lifeExpectancy>
|
||||
<lifeStageAges Inherit="False">
|
||||
<li>
|
||||
<def>ArachnaeNode_Myrmecocystus_Adult</def>
|
||||
<minAge>0</minAge>
|
||||
</li>
|
||||
</lifeStageAges>
|
||||
</race>
|
||||
</AlienRace.ThingDef_AlienRace>
|
||||
|
||||
</Defs>
|
||||
@@ -1,7 +1,7 @@
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
|
||||
namespace ArachnaeSwarm.Possession
|
||||
namespace ArachnaeSwarm
|
||||
{
|
||||
public class CompAbilityEffect_Possess : CompAbilityEffect
|
||||
{
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
using RimWorld;
|
||||
|
||||
namespace ArachnaeSwarm.Possession
|
||||
namespace ArachnaeSwarm
|
||||
{
|
||||
public class CompProperties_AbilityPossess : CompProperties_AbilityEffect
|
||||
{
|
||||
|
||||
@@ -2,7 +2,7 @@ using System.Collections.Generic;
|
||||
using RimWorld;
|
||||
using Verse;
|
||||
|
||||
namespace ArachnaeSwarm.Possession
|
||||
namespace ArachnaeSwarm
|
||||
{
|
||||
public class Hediff_Possession : HediffWithComps, IThingHolder
|
||||
{
|
||||
|
||||
@@ -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<RecordDef>.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<TimeAssignmentDef>(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.");
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user