RimWorld:基因XML文件标签含义及部分相关内容

前言

边缘世界在1.4版本生物科技DLC中引入了基因,让殖民者的DNA可以被玩家肆意操纵。创意工坊中也涌现出了大量基因模组,大大扩展了殖民地的基因多样性。不过或许还不够,或许你想要亲手往小人的DNA里刻点东西,现在让我们看看如果亲自创造一个新的基因。

如果您喜欢这篇文章,麻烦大家帮我点个赞,谢谢大家的支持!

<GeneDef>

首先,一个基因的定义是包裹在<GeneDef>标签中,因此若无其他说明,以下所有标签均位于<GeneDef>之下。

<GeneDef>
	其他标签
</GeneDef>

各种xml标签定义及示例

<defName>:字符串,基因的定义名,类似ID,必须是唯一的,不能与任何原版或模组中的基因冲突。允许使用英文、数字和下换线,不可以使用中文;
建议命名格式:模组名_基因名 或 作者名_模组名_基因名。

<defName>AG_NearBlindness</defName>

<label>:string,基因的名称,游戏中向玩家展示的名称。可使用中文;

<label>测试基因</label>

<description>:string,基因的描述,可以使用中文;

<description>这是一个新基因,有一些功能。</description>

<customEffectDescriptions>:List<string>,基因效果的自定义描述,可以使用中文;

   <customEffectDescriptions>
     <li>基因效果1</li>
     <li>基因效果2</li>
   </customEffectDescriptions>

<iconPath>:string,基因UI图片的路径;

   <iconPath>UI/Icons/Genes/Gene_FireResistant</iconPath>

<geneClass>:Type,基因对应的C#类,部分需要C#支持的标签需要配合特定的geneClass使用;

<descriptionHyperlinks>:List<DefHyperlink>,描述超链接。定义了详细信息页面展示的超链接;

<biostatCpx>:int,基因复杂度;

<biostatMet>:int,代谢率;

<biostatArc>:int,超凡胶囊数;

<displayCategory>:GeneCategoryDef,基因在编辑器中展示时的所属类型;
示例:

   <displayCategory>Violence</displayCategory>

表示该基因处于“暴力”类型分组下,即:
在这里插入图片描述

<displayOrderInCategory>:float,基因在类型中的展示顺序。

<abilities>:List<AbilityDef>,特殊能力;
如:

   <abilities>
     <li>FireSpew</li>
   </abilities>

将会使基因携带者拥有“火焰吐息”能力。

<forcedTraits>:List<GeneticTraitData>,强制特性;
如:

   <forcedTraits>
     <li>
       <def>Kind</def>
     </li>
   </forcedTraits>

将会强制基因携带者拥有“善良”特性

<suppressedTraits>:List<GeneticTraitData>,抑制特性;
如:

   <suppressedTraits>
     <li>
       <def>Pyromaniac</def>
     </li>
   </suppressedTraits>

将会抑制基因携带者的“纵火狂”特性。特性会变为灰色,不再起作用。

<disablesNeeds>:List<NeedDef>,禁用需求;
如:

   <disablesNeeds>
     <li>Rest</li>
   </disablesNeeds>

将会禁用基因携带者的“睡眠”需求。

<causesNeed>:NeedDef,创造需求;
如:

   <causesNeed>KillThirst</causesNeed>

将会创造需求“杀欲”,即:
在这里插入图片描述

<disabledWorkTags>:WorkTags,禁用工作类型;
如:

   <disabledWorkTags>
     <li>Violent</li>
   </disabledWorkTags>

将会禁用基因携带者的“暴力”工作。
<ignoreDarkness>:bool,是否可以无视黑暗。为true时可以使基因携带者不受黑暗减益,但仍会有心情惩罚。原版夜视基因使用;

<dislikesSunlight>:bool,是否讨厌阳光。需配合<conditionalStatAffecters>发挥效果。原版日光敏感基因使用;

<neverGrayHair>:bool,是否永不白发。为true时,基因携带者发色不会因为年龄增加而改变;

<minAgeActive>:float,基因最小表现年龄。低于该年龄,基因不表现;

<lovinMTBFactor>:float,滚床单系数。默认为1,越高滚床单概率越大,反之亦然;

<immuneToToxGasExposure>:bool,是否对有毒气体免疫。为ture时完全免疫毒素相关,包括环境和武器;

<statOffsets>:List<StatModifier>,状态偏移。该列表中的状态会被以加法进行修正;
如:

   <statOffsets>
     <PsychicSensitivity>0.4</PsychicSensitivity>
     <MeditationFocusGain>0.2</MeditationFocusGain>
     <PsychicEntropyRecoveryRate>0.2</PsychicEntropyRecoveryRate>
   </statOffsets>

将会使基因携带者的:

  • 心灵敏感度+40%;
  • 冥想效力+20%/天;
  • 心灵熵消散速率+0.20;

<statFactors>:List<StatModifier>,状态系数。该列表中的状态会被以乘法进行修正;
如:

   <statFactors>
     <MeleeDamageFactor>0.5</MeleeDamageFactor>
     <RestFallRateFactor>0.4</RestFallRateFactor>
   </statFactors>

将会使基因携带者的

  • 近战伤害×50%;
  • 疲劳率×40%;

关于各种Stat的含义,可以参看我的另一篇文章:Rimworld:各种Stat含义一览

<conditionalStatAffecters>:List<ConditionalStatAffecter>,有条件的状态修正,需要C#支持;

<painFactor>:float,疼痛,默认为1,越低疼痛越低,反之亦然;

<foodPoisoningChanceFactor>:float,食物中毒概率,默认为1,越低食物中毒概率越低,反之亦然;

<damageFactors>:List<DamageFactor>,类型承伤系数;
如:

   <damageFactors>
     <Flame>0.25</Flame>
   </damageFactors>

使基因携带者的所收到的“烧伤伤害”×25%。

<biologicalAgeTickFactorFromAgeCurve>:SimpleCurve,衰老系数,原版不老基因使用;
如:

   <biologicalAgeTickFactorFromAgeCurve>
     <points>
       <li>(13, 1)</li>
       <li>(18.5, 0)</li>
     </points>
   </biologicalAgeTickFactorFromAgeCurve>

将会使基因携带者的衰老系数在13岁开始从100%下降,直到18岁降为0。

<makeImmuneTo>:List<HediffDef>,免疫疾病;
如:

   <makeImmuneTo>
     <li>Flu</li>
     <li>Malaria</li>
     <li>SleepingSickness</li>
   </makeImmuneTo>

将会使基因携带者免疫:

  • 流感
  • 疟疾
  • 昏睡病

<hediffGiversCannotGive>:List<HediffDef>,不可给予的健康状态;
如:

   <hediffGiversCannotGive>
     <li>Carcinoma</li>
     <li>HeartAttack</li>
     <li>BadBack</li>
   </hediffGiversCannotGive>

基因携带者将永远不会获得:

  • 癌症肿瘤
  • 心胀病发作
  • 背痛

<capMods>:List<PawnCapacityModifier>,影响人物能力;
如:

   <capMods>
     <li>
       <capacity>Manipulation</capacity>
       <postFactor>0.85</postFactor>
     </li>
   </capMods>

将会使基因携带者的“操作能力”×50%。

<preventPermanentWounds>:bool,防止永久伤口,为true时受伤不会留下永久伤口;

<dontMindRawFood>:bool,不在意生食。为true时可以使基因携带者不受生食减益,但仍会有心情惩罚。原版快速消化基因使用;

<hairColorOverride>:Color,发色覆盖;
如:

   <hairColorOverride>(250, 250, 250)</hairColorOverride>

将原发色覆盖为RGB:(250, 250, 250),即雪发的发色。

<skinColorBase>:Color,肤色底色;

<skinColorOverride>:Color,肤色覆盖;

<hairTagFilter>:TagFilter,发型标签过滤器;

<beardTagFilter>TagFilter,发型标签过滤器;

<bodyType>:GeneticBodyType,体型;
如:

   <bodyType>Thin</bodyType>

强制基因携带者的体型为Thin。

<forcedHeadTypes>:List<HeadTypeDef>,强制头型;
如:

   <forcedHeadTypes>
     <li>Male_HeavyJawNormal</li>
     <li>Female_HeavyJawNormal</li>
     <li>Furskin_Heavy1</li>
     <li>Furskin_Heavy2</li>
     <li>Furskin_Heavy3</li>
   </forcedHeadTypes>

将会使基因携带者的头型固定为5个标签中的一种,具体情况根据性别和其他基因决定。

<forcedHair>:HairDef,强制发型;

<womenCanHaveBeards>:bool,女性是否可有胡须;为true时。女性可带有胡须;

<socialFightChanceFactor>:float,打架概率,默认为1,越低则被激怒后打架概率越低。为0则永远不会打架。不影响战斗;

<aggroMentalBreakSelectionChanceFactor>:float,精神崩溃后进行暴力行为的概率,默认为1,越低则精神崩溃后进行暴力行为的概率越低。为0则精神崩溃后永远不会进行暴力行为;

<mentalBreakMtbDays>:float,精神崩溃持续时间;

<mentalBreakDef>: MentalBreakDef ,精神崩溃类型;

备注:触发精神崩溃需要C#。

<missingGeneRomanceChanceFactor>:float,针对无该基因个体的浪漫概率;
如:

<GeneDef>
   <defName>Furskin</defName>
   <label>全身毛发</label>
   ......
   <missingGeneRomanceChanceFactor>0.2</missingGeneRomanceChanceFactor>
   ......
<\GeneDef>

那么携带“全身毛发”基因的人对不携带“全身毛发”的人进行浪漫行为的概率会×20%。

<prisonBreakMTBFactor>:float,越狱概率,默认为1,越低则越狱概率的概率越低。为0则永远不会越狱;

<exclusionTags>: List<string>。冲突tag,含有相同冲突tag的基因不能同时选择;

<prerequisite>:GeneDef,前置基因;

<selectionWeight>:float,选择权重,影响GeneSet的创建;

<canGenerateInGeneSet>:bool,是否可以参与GeneSet的创建。所有包含基因的物品(如基因库,基因组,异种胚芽等),其基因信息都储存在GeneSet中。<canGenerateInGeneSet>为false时,该基因将不会自然创建GeneSet时被添加;
商人以基因组的形式售卖基因,因此<canGenerateInGeneSet>为false时商人将不会售卖该基因。

<marketValueFactor>:float,市场价值系数。影响携带该基因的基因组售价,默认为1,越高携带该基因的基因组市场价值越高,反之亦然。

<RandomChosen>:bool,是否可随机生成。生成人物时是否可以随机选择该基因。一般用于发色和肤色时为true。原版对任何超凡基因,基因复杂度和代谢率不为0的基因均设为false;

<soundCall>:SoundDef,叫声音效;

<soundDeath>:SoundDef,死亡音效;

<soundWounded>:SoundDef,受伤音效;

Gizmo是游戏提供的和绘图相关的一个类,下图中的按钮和状态栏都与Gizmo相关
在这里插入图片描述

<showGizmoOnWorldView>:bool,世界地图中是否绘制。主要影响远行队中的殖民者;

<showGizmoWhenDrafted>:bool,征召时是否绘制;

<showGizmoOnMultiSelect>:bool,多选时是否绘制;

下面的resource,是基因创造的特殊资源,原版 血原化 及相关基因使用。 血原化 的resource就是 血原质

<resourceLabel>:string,resource的名称,游戏中向玩家展示的名称。可使用中文;

<resourceDescription>:string,resource的描述。可使用中文;

<resourceLossPerDay>:float,resource的每日流失率;

<resourceGizmoType>:Type,绘图相关;

<resourceGizmoThresholds>:List<float>,绘图相关;

技能调整和成瘾品相关

本文涉及游戏世界虚构的成瘾品,与现实毒品并无对应关系。毒品危害身心健康,危害社会。中国社会和法律对毒品零容忍。
本文涉及的内容和游戏机制可能与现实法律、思想、道德或普世价值观冲突,切勿将游戏内容代入现实。

你或许在翻看游戏的XML文化时会发现与技能和成瘾品相关的基因的XML文件与其他基因的XML文件不同。原版技能和成瘾品相关的基因在XML中并不直接使用<GeneDef>,而是使用<GeneTemplateDef>。你可以将<GeneTemplateDef>看做一种模板,游戏在加载时根据这种模板自动生成对应的<GeneDef>

使用<GeneTemplateDef>自动生成对应的<GeneDef>需要C#的参与,暂且不做讨论。我们可以直接定义相关的<GeneDef>

技能

<aptitudes>:List<Aptitude>,技能的天资,也就是基因所带来的技能等级;
如:

<aptitudes>
	<Shooting>8</Shooting>
	<Melee>-4</Melee>
</aptitudes>

将调整基因携带者的射击等级+8,格斗等级-4。

<passionMod>:PassionMod,调整技能的兴趣等级;
如:

<passionMod>
	<skill>Shooting</skill>
	<modType>AddOneLevel</modType>
</passionMod>

将调整基因携带者的射击技能兴趣加一。
<modType>原版只有None(不变), AddOneLevel(加一)和 DropAll(归零) 三种选择。

备注:一个基因可以调整多种技能的等级,但却只能调整一种技能的兴趣。

成瘾品

本文涉及游戏世界虚构的成瘾品,与现实毒品并无对应关系。毒品危害身心健康,危害社会。中国社会和法律对毒品零容忍。
本文涉及的内容和游戏机制可能与现实法律、思想、道德或普世价值观冲突,切勿将游戏内容代入现实。

<chemical>:ChemicalDef,对应成瘾品的defName;

<addictionChanceFactor>:float,成瘾概率,越低成瘾概率越低,小于等于0则不会成瘾;

<overdoseChanceFactor>:float,过量几率系数,越低过量概率越低,小于等于0则不会过量;

<toleranceBuildupFactor>:float,抗药性增长系数,越低抗药性增长率越低,小于等于0则抗药性不会增长;

将基因的<geneClass>标签赋值ChemicalDependency,基因携带者将对<chemical>标签的成瘾品产生依赖;

备注:一个基因只能对应一种成瘾品。

仍会有心情惩罚?

原版夜视等基因明明可以无视一些心情惩罚,为什么基因中没有这些功能?

答案是无视心情的代码在心情,更准确的说是在“想法”的Def中。

夜视基因无视黑暗的环境为例:

  <ThoughtDef>
    <defName>EnvironmentDark</defName>
    <workerClass>ThoughtWorker_Dark</workerClass>
    <nullifyingTraits>
      <li>NightOwl</li>
      <li>Undergrounder</li>
    </nullifyingTraits>
    <nullifyingGenes>
      <li MayRequire="Ludeon.RimWorld.Biotech">DarkVision</li>
    </nullifyingGenes>
    <stages>
      <li>
        <label>darkness</label>
        <description>I've been in the dark for a while. I don't like it.</description>
        <baseMoodEffect>-5</baseMoodEffect>
      </li>
    </stages>
  </ThoughtDef>

其中的:

 <nullifyingGenes>
	 <li MayRequire="Ludeon.RimWorld.Biotech">DarkVision</li>
 </nullifyingGenes>

代表如果殖民者拥有“DarkVision(夜视)”基因,那么该想法会被无视。

如何让自定义的基因无视想法

假设我们的自定义基因的 <defName>为“Test_DarkRunerGene”。

当然可以直接改写想法的Def,但非常不推荐怎么做,鬼知道会发生什么bug和模组冲突。

我们需要使用补丁操作(PatchOperations),注意这不是<GeneDef>中的内容。

关于补丁操作(PatchOperations),可以参看本人所翻译的边缘世界Wiki - PatchOperations的站内译文:RimWorld:补丁操作(PatchOperations)

<?xml version="1.0" encoding="utf-8" ?>
<!-- 基因禁用想法 -->
<Patch>
	<Operation Class=" ">
		其他标签
	</Operation>
</Patch>

首先我建议首先查阅想法的Def(ThoughtDef),了解目标Thought在原版游戏中是否有<nullifyingGenes>标签。

如果有<nullifyingGenes>标签,推荐:
以想法黑暗的环境为例:

 <Operation Class="PatchOperationAdd">	<!--向路径添加内容-->
	 <!-- 对应标签的xml路径 -->
	 <xpath>Defs/ThoughtDef[defName = "EnvironmentDark"]/nullifyingGenes</xpath>
	 <!-- xpath详细解释在上文提到的RimWorld:补丁操作(PatchOperations)这篇文章中 -->	

	 <value> <!-- 所添加的值 -->
		 <li>Test_DarkRunerGene</li> <!-- 添加基因列表 -->
	 </value>
 </Operation>

也就是将黑暗的环境EnvironmentDark的<ThoughtDef>,由

  <ThoughtDef>
    <defName>EnvironmentDark</defName>
    ......
    <nullifyingGenes>
      <li MayRequire="Ludeon.RimWorld.Biotech">DarkVision</li>
    </nullifyingGenes>
    ......
  </ThoughtDef>

变为:

  <ThoughtDef>
    <defName>EnvironmentDark</defName>
    ......
    <nullifyingGenes>
      <li MayRequire="Ludeon.RimWorld.Biotech">DarkVision</li>
      <li>Test_DarkRunerGene</li>
    </nullifyingGenes>
    ......
  </ThoughtDef>

如果没有<nullifyingGenes>标签,推荐:
以想法在地上吃饭为例:

 <Operation Class="PatchOperationConditional"> <!--根据条件操作xpath内容-->		
	 <!-- 对应标签的xml路径 -->
	 <xpath>/Defs/ThoughtDef[defName = "AteWithoutTable"]/nullifyingGenes</xpath>
		
	 <!-- 如果没有xpath中的标签,进行nomatch操作 -->
	 <nomatch Class="PatchOperationAdd">
		 <xpath>/Defs/ThoughtDef[defName = "AteWithoutTable"]</xpath> <!--向xpath添加内容-->
		 <!-- 注意因为没有xpath中的标签,也就是没有<nullifyingGenes>标签,我们需要在<nullifyingGenes>标签的上一层进行添加 -->
		 <value>
			 <nullifyingGenes> <!-- 添加<nullifyingGenes>标签 -->
				 <li>Test_DarkRunerGene</li> <!-- 添加基因列表 -->
			</nullifyingGenes>
		</value>
	</nomatch>

		<!-- 如果有xpath中的标签,进行match操作 -->
	 <match Class="PatchOperationAdd">
		 <xpath>/Defs/ThoughtDef[defName = "AteWithoutTable"]/nullifyingGenes</xpath>
		  <!-- 有<nullifyingGenes>标签,我们直接在<nullifyingGenes>标签下进行添加 -->
		 <value>
			 <li>Test_DarkRunerGene</li>
		 </value>
	 </match>
 </Operation>

为什么原版想法在地上吃饭没有<nullifyingGenes>标签还要定义<match>操作呢,直接用之前的方法插入<nullifyingGenes>标签不行吗?

可以但不好

因为由于模组加载顺序,可能在本模组加载之前,其他模组就进行了类似操作,给想法在地上吃饭添加了<nullifyingGenes>标签。

这样操作后,在地上吃饭AteWithoutTable的<ThoughtDef>,由

  <ThoughtDef>
    <defName>AteWithoutTable</defName>
	......
  </ThoughtDef>

变为

  <ThoughtDef>
    <defName>AteWithoutTable</defName>
	......
	<nullifyingGenes>
		<li>Test_DarkRunerGene</li>
	</nullifyingGenes>
	......
  </ThoughtDef>

这种情况下其它模组已经添加了<nullifyingGenes>标签,而如果你直接添加了一次<nullifyingGenes>标签,那么将导致XML错误。

记住补丁操作的一个原则:你或许不是第一个这么做的。

一个示例

这是一个简单的基因示例,创造了一个名为夜跑者的基因。
预期效果:

  • 基因复杂度:2,代谢率:-2;
  • 移动速度+0.30;
  • 免疫速度110%;
  • 无视黑暗的工作速度减益;
  • 移除想法:黑暗的环境、在地上吃饭;
  • 免疫流感;

<GeneDef>

<?xml version="1.0" encoding="utf-8" ?>
<Defs>

  <GeneDef>
    <defName>Test_DarkRunerGene</defName>
    <label>夜跑者</label>
    <description>这是夜跑者基因</description>
    <iconPath>UI/Icons/Genes/Gene_LongJumpLegs</iconPath> <!-- 用了“长跃下肢”的图标 -->
    <displayCategory>Ability</displayCategory> <!-- 展示在“特有能力”类型分组下 -->
    <biostatCpx>2</biostatCpx>
    <biostatMet>-2</biostatMet>
    <statOffsets>
      <MoveSpeed>0.3</MoveSpeed>
    </statOffsets>
    <statFactors>
      <ImmunityGainSpeed>1.1</ImmunityGainSpeed>
    </statFactors>
    <ignoreDarkness>true</ignoreDarkness>
    <makeImmuneTo>
      <li>Flu</li>
    </makeImmuneTo>
  </GeneDef>

</Defs>

补丁操作:

<?xml version="1.0" encoding="utf-8" ?>

<Patch>

	<Operation Class="PatchOperationAdd">
		<xpath>Defs/ThoughtDef[defName = "EnvironmentDark"]/nullifyingGenes</xpath>
		<value>
			<li>Test_DarkRunerGene</li>
		</value>
	</Operation>

	<Operation Class="PatchOperationConditional">
		<success>Always</success>
		<xpath>/Defs/ThoughtDef[defName = "AteWithoutTable"]/nullifyingGenes</xpath>
		<nomatch Class="PatchOperationAdd">
			<xpath>/Defs/ThoughtDef[defName = "AteWithoutTable"]</xpath>
			<value>
				<nullifyingGenes>
					<li>Test_DarkRunerGene</li>
				</nullifyingGenes>
			</value>
		</nomatch>
		<match Class="PatchOperationAdd">
			<xpath>/Defs/ThoughtDef[defName = "AteWithoutTable"]/nullifyingGenes</xpath>
			<value>
				<li>Test_DarkRunerGene</li>
			</value>
		</match>
	</Operation>

</Patch>

实际效果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值