rimworld吧 关注:259,303贴子:4,743,646

回复:Rimworld Mod xml教程 这可能是你见过的最细的MOD教程了

只看楼主收藏回复

基础篇 第七讲:翻译包文件
翻译包存放在Language文件夹内,并使用预设好的名字来区分语言。
以下是一些常用的语言的文件夹名:
ChineseSimplified 简体中文
ChineseTraditional 繁体中文
English 英语
Japanese 日语
Russian 俄语
一个翻译包分为两部分:对def内文本的翻译放入DefInjected文件夹,对dll内的翻译放入Keyed文件夹。对dll的翻译被称为Key,基本格式为:
<key>文本</key>
在整个游戏所有已启用的mod中不允许出现重复的key,否则排序靠后的将覆盖排序靠前的。
若游戏使用的语言所对应的翻译包中缺少对应的key,或者干脆没有对应的翻译包,那么会从English包中查找并使用。
由于我们目前不对程序,dll方面展开教学,Key的内容就到此为止,对于def的翻译是本章的主要部分。
与defs不同:
Defs区分一个def的类型是看它在数据库中出现时最外层的参数名,例如现在defs中有这样一个文件:
<?xml version="1.0" encoding="utf-8" ?>
<Defs>
<ThingDef ParentName=”XFMLI_ThingParentA”>
<defName>XFMLI_Flower</defName>
<label>flower</label>
<description>A beautiful flower</description>
</ThingDef>
</Defs>
第一行为识别码,所有xml文件的必需,在作为例子的这个thingdef中,我使用了父对象来省略其他必要的数据填写,这样一来我们就更能将注意力集中在这三项研究对象上。
我们注意到,defs中总是用一个参数名放在最外层来区分类型,显而易见的,此处的例子中的def类型为thingdef
而翻译包并不采用这种形式,在这里我们通过文件夹的命名来区分其中的翻译文件所对应的def类型。对于上文的例子,我们如果要制作翻译,那么应当将文件置于下图的文件夹中:
<?xml version="1.0" encoding="utf-8" ?>
<languages>
<XFMLI_Flower.label>花</XFMLI_Flower.label>
<XFMLI_Flower.description>一朵美丽的花</XFMLI_Flower.description>
</languages>
基本格式为:
<defName.数据路径>翻译文本</defName.数据路径>
其中defname为你要翻译的def的defname。
数据路径指的是从整个数据体最外层向里依次拆分复合数据直到到达翻译对象。一个文本的基本数据每级的参数名之间用小数点连接,再举一例:
<数据体>
<defName>X</defName>
<复合A>
<复合B>
<基本C>this.</基本C>
</复合B>
</复合A>
</数据体>
其对应翻译为:
<x.复合A.复合B.基本C>这个。</x.复合A.复合B.基本C>
特别的在于list型复合数据,因为它拆分后是多个元素。也就是li。我们当然不能在路径中使用li,而应当使用索引器:用一个从0开始依次增加1的整数来依次指代元素。注意其从0开始数意味着第一个元素为0,第二个为1,依此类推。
如:
<list>
<li>A</li>
</list>
即为<list.0>A</list.0>
而除此之外,其实还有其他对list的元素的索引方式,如

翻译文件直接用label来索引,注意索引到的是元素本身,所以依然需要一个label来指向其名字文本数据。

在comps中,也常直接用Class名来指代,当然也可以用comps.0来指代。

值得注意的是,对于父对象的翻译不会作用于子对象上,也就是说,即使子对象在继承后拥有与父对象完全相同的一个文本数据,你仍然要对它们分别翻译,而一个abstract=”true”的数据体其中的任何数据都是不允许被翻译的——当然,在正常情况下这种数据体也不存在defname。
除此之外,原文本中若出现形如 {n}(n为整数)或 “TargetX”(X为大写字母)等,则需要保留他们在翻译文本中。
<stringA>Use this by TargetA.</stringA>
<stringB>The number is {0}.</stringB>
对应的翻译为
<stringA>让 TargetA使用这个。</stringA>
<stringB>数字是{0}。</stringB>
你可以自行安排它们在文本中的位置,在该文本实际出现在游戏中时,它们会自动被程序替换为其他东西。
如果一个def没有找到对应的翻译,将直接使用def中的文本,而不是English翻译包。因此我鼓励大家在制作时以英文书写def中的文本,再用中文翻译来完成中文文本。


IP属地:福建77楼2025-05-14 13:08
回复
    插眼


    IP属地:浙江来自iPhone客户端78楼2025-05-14 17:14
    回复
      2025-08-11 13:43:14
      广告
      不感兴趣
      开通SVIP免广告


      IP属地:河南来自Android客户端79楼2025-05-16 08:38
      回复
        基础篇 第八讲:以原版def为参照制作一个新的ThingDef
        这里你们需要用到编辑器一步一步跟我操作:
        在实际制作时,我们其实难以从零开始构思一个def所应有的所有数据,而有时原版提供的父对象也难以满足我们的全部需求。这时,我们会尝试在原版中找到与我们想制作的内容相近的成品,并将其复制加以修改以变成我们的作品。
        我们将以原版中长剑为模板,制作一把伤害更高,攻速更慢的近战武器。
        ①首先,我们在游戏中找到该参考对象,值得注意的是,能用不同制成的武器在名称中会出现材料名为前缀,应当自行排除这些前缀【如钢铁长剑,实际名称为“长剑”】。
        接下来,我们在编辑器中打开查找功能,并选择“在文件中查找”(不同编辑器的表述可能不同),路径选择为简体中文翻译包(若没有,则前往RimWorld\Data\Core\Languages找到对应压缩包并解压),查找内容为“长剑”。
        在此之后,应当会跳出所有提及长剑的文本,我们重点在thingdef的文件夹的查找结果中找到长剑,可能有以下结果:
        <MeleeWeapon_LongSword.label>长剑</MeleeWeapon_LongSword.label>
        根据第七章的内容,原版中长剑的defname即为MeleeWeapon_LongSword。
        下一步,在RimWorld\Data\Core\Defs中搜索<defName>MeleeWeapon_LongSword</defName>,查询结果即为长剑的thingdef。
        搜索使用的“文件夹内搜索”

        <ThingDef ParentName="BaseMeleeWeapon_Sharp_Quality">
        <defName>MeleeWeapon_LongSword</defName>
        <label>longsword</label>
        <description>The ancient weapon of kings, the longsword can be used for slashing or stabbing.</description>
        <graphicData>
        <texPath>Things/Item/Equipment/WeaponMelee/LongSword</texPath>
        <graphicClass>Graphic_Single</graphicClass>
        </graphicData>
        <techLevel>Medieval</techLevel>
        <weaponTags>
        <li>MedievalMeleeAdvanced</li>
        <li>LongSword</li>
        </weaponTags>
        <costStuffCount>100</costStuffCount>
        <thingSetMakerTags><li>RewardStandardQualitySuper</li></thingSetMakerTags>
        <statBases>
        <WorkToMake>18000</WorkToMake>
        <Mass>2</Mass>
        </statBases>
        <relicChance>2</relicChance>
        <equippedAngleOffset>-65</equippedAngleOffset>
        <stuffCategories>
        <li>Metallic</li>
        <li>Woody</li>
        </stuffCategories>
        <tools>
        <li>
        <label>handle</label>
        <capacities>
        <li>Blunt</li>
        </capacities>
        <power>9</power>
        <cooldownTime>2</cooldownTime>
        </li>
        <li>
        <label>point</label>
        <capacities>
        <li>Stab</li>
        </capacities>
        <power>23</power>
        <cooldownTime>2.6</cooldownTime>
        </li>
        <li>
        <label>edge</label>
        <capacities>
        <li>Cut</li>
        </capacities>
        <power>23</power>
        <cooldownTime>2.6</cooldownTime>
        </li>
        </tools>
        <recipeMaker>
        <researchPrerequisite>LongBlades</researchPrerequisite>
        <skillRequirements>
        <Crafting>5</Crafting>
        </skillRequirements>
        </recipeMaker>
        </ThingDef>
        ②在我们自己的Defs里新建一个xml,并将识别码<?xml version="1.0" encoding="utf-8" ?>与我们搜索到的长剑的整个ThingDef扔进去;根据第六章的内容,为了不覆盖原版武器,defname必须要被修改,label和description也最好进行修改以进行区分。为了演示方便,这里不考虑制作翻译包,可以直接写入中文(实际操作中并不建议这样做)
        ③修改数据
        初学者们此时可以通过翻译软件翻译每一个数据名,并加以更改和测试来猜测。我们会在后面的章节逐一分析。对比游戏内数据和Defs内数据,并判断数据的对应关系也是一项很重要的技能。本章以“伤害更高,攻速更慢的近战武器。”为课堂例子,所以先给出一些数据名对应的数据内容:
        <tools>
        <li>
        <label>handle</label>
        <capacities>
        <li>Blunt</li>
        </capacities>
        <power>9</power>
        <cooldownTime>2</cooldownTime>
        </li>
        <li>
        <label>point</label>
        <capacities>
        <li>Stab</li>
        </capacities>
        <power>23</power>
        <cooldownTime>2.6</cooldownTime>
        </li>
        <li>
        <label>edge</label>
        <capacities>
        <li>Cut</li>
        </capacities>
        <power>23</power>
        <cooldownTime>2.6</cooldownTime>
        </li>
        </tools>
        看到这里,根据第四章内容tools是一个List。里面的每一个元素都是一种攻击方式,图中从上到下分别是“剑柄”、“剑头”、“剑刃”。每一个元素内的power对应的该攻击方式的伤害,为整数;cooldownTime为冷却时间,即后摇,单位是秒,可以写小数。
        我们可以把整个柄删去,实际上柄是拿来降低DPS,并提供钝器伤害的方式,但我们的巨剑不需要;然后将剑头和剑刃的伤害提高,冷却调高

        然后进游戏测试一下吧!
        千万要注意,修改的是我们复制出来的ThingDef,而不是原版Core的Defs里的数据,否则我们就是直接修改原版数据了!


        IP属地:福建80楼2025-05-17 23:20
        回复


          IP属地:广东来自iPhone客户端81楼2025-05-19 18:26
          回复
            基础篇 第九讲:Defs种类
            该讲是22年3月写的 现在几乎用不了了 就不发了 需要的去三楼找吧


            IP属地:福建82楼2025-05-23 13:49
            回复
              感谢大佬教程


              IP属地:福建83楼2025-05-23 14:20
              回复
                如果想只做些高清贴图替换别的mod,更改一下名称呢


                IP属地:四川来自iPhone客户端84楼2025-05-25 13:07
                回复
                  2025-08-11 13:37:14
                  广告
                  不感兴趣
                  开通SVIP免广告
                  顶顶顶


                  IP属地:广东来自Android客户端85楼2025-05-28 15:56
                  回复
                    唉,我要是写群星mod的时候有这么全的东西就好了


                    IP属地:福建86楼2025-05-30 17:02
                    回复


                      IP属地:福建87楼2025-06-02 11:57
                      回复
                        到时候出完了有没有考虑做个总结文件放网盘里面?


                        IP属地:中国香港来自Android客户端88楼2025-06-04 22:16
                        收起回复
                          学习大满足 +10


                          IP属地:河南89楼2025-06-05 02:24
                          回复
                            求问一下有没有属性表?就装备下面额外添加属性的,比如魅力,近战冷却,或者全局工作速度的英文词条,我一直没找到,也没有类似表格,都是找其他模组扒下来的,太累了也找不到我想要的,比如交易价格改善这个词条。


                            IP属地:广东来自Android客户端90楼2025-06-08 15:40
                            收起回复
                              2025-08-11 13:31:14
                              广告
                              不感兴趣
                              开通SVIP免广告
                              太有用了


                              IP属地:江苏来自Android客户端92楼2025-06-13 09:38
                              回复