RimWorld:基因XML文件标签含义及部分相关内容
Rimword-基因Mod制作
前言
边缘世界在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>
实际效果:
更多推荐



所有评论(0)