前言
边缘世界在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>
实际效果: