Rimworld Mod制作教程2 创建数据定义
文章目錄
- 廢話
- 核心內容
- 1 創建數據定義
- 1.1 定義一個新的抽象物品 手辦基類
- 1.2 源源不斷的手辦(Garage Kid)
- 1.3 新材料(Stuff)
- 1.4 添加配方(Recipe)
- 1.5 未完成物品
- 1.6 測試
- 1.7 本地化
廢話
本次嘗試制作一個比較簡單的mod,我們添加一些手辦來代替原版丑陋的藝術雕刻品。然后添加一種新材料樹脂(用樹脂做手辦聽起來比較合理),讓游戲看起來更萌一點。這個mod只需要添加xml數據就可以完成。
核心內容
1 創建數據定義
1.1 定義一個新的抽象物品 手辦基類
原版的藝術雕刻圖案隨機,并且可以使用不同的材料,還帶有一些奇怪的藝術描述,我們打算制作像鋼琴一樣可以拆卸的物品,但是作用只有增加美觀度。于是我搜索這兩個物品xml,這兩個物品都繼承了BuildingBase的xml數據,所以鋼琴在原游戲中也是個建筑類別的存在,和一般的建筑屬性做對比可以發現它的一些特殊的屬性,比如可搬運(拆卸),我們也先建立一個抽象的xml讓之后的手辦都繼承這些屬性,我刪除了鋼琴的娛樂效果組件和雕刻的藝術組件,我們可以在C#寫一個對應的新效果,但我沒什么靈感。
<ThingDef Name="GarageKidBase" ParentName="BuildingBase" Abstract="True"><!-- 是否允許穿過 --><passability>PassThroughOnly</passability><!-- 從上面路過的走的速度程度 --><pathCost>60</pathCost><!-- 袖珍物品 可拆卸搬運 --><minifiedDef>MinifiedThing</minifiedDef><!-- 圖像在哪一層 --><altitudeLayer>Building</altitudeLayer><!-- 是否可以旋轉 --><rotatable>false</rotatable><!-- <thingClass>Building_MusicalInstrument</thingClass> --><!-- ticker的執行頻率 --><tickerType>Normal</tickerType><socialPropernessMatters>true</socialPropernessMatters><hasInteractionCell>true</hasInteractionCell><!-- 物品類別 --><thingCategories><li>BuildingsArt</li></thingCategories><!-- 交易標簽 --><tradeTags><li>Art</li></tradeTags><statBases><!-- 質量 --><Mass>1</Mass></statBases><!-- 配方 --><recipeMaker><!-- 某種工作加成,有cook和drug,不太清楚填通用就好了 --><workSpeedStat>GeneralLaborSpeed</workSpeedStat><!-- 制作時有加成的技能 --><workSkill>Artistic</workSkill><!-- 工作特效 --><effectWorking>Sculpt</effectWorking><!-- 工作音效 --><soundWorking>Recipe_Sculpt</soundWorking><!-- 未完成的物品對應哪個def --><unfinishedThingDef>UnfinishedGarageKid</unfinishedThingDef></recipeMaker><!-- 地形支持需求 可選 Light Medium Heavy Bridgeable Diggable --><terrainAffordanceNeeded>Light</terrainAffordanceNeeded><comps><li><!-- 這個組件有品質效果,美觀度等屬性會變化 --><compClass>CompQuality</compClass></li></comps></ThingDef>這里的recipeMaker標簽可以設定一些獲取這個物品的要求,比如需要什么樣的前置研究,在哪里制作,需要什么技能,與之配套的是costList標簽,控制消耗多少材料,第一次遇到沒見過的標簽,記得善用搜索+翻譯,這樣大概就知道他的作用了。
1.2 源源不斷的手辦(Garage Kid)
通過我們之前完成的基類,我們只需要再添加一些必要的數據,就可以制造各種各樣的手辦了,反正它們最主要的區別只有紋理不一樣。這里的tex我隨便找的,還沒有合適的素材,需要一個懂美術的朋友
<ThingDef ParentName="GarageKidBase"><defName>GarageKid_Chicken</defName><label>手辦(雞)</label><description>一個關于雞的手辦,真是太美了</description><graphicData><texPath>Things/Building/SR_GarageKid/GarageKid_Chicken</texPath><graphicClass>Graphic_Single</graphicClass><!-- <drawSize>(2.6,2.6)</drawSize><shadowData><volume>(1.93,1,1.69)</volume><offset>(-0.03,0,-0.1)</offset></shadowData> --></graphicData><!-- 是否妨礙視線 --><blockWind>false</blockWind><fillPercent>1.0</fillPercent><rotatable>false</rotatable><statBases><!-- 耐久 --><MaxHitPoints>300</MaxHitPoints><!-- 制作工作量 --><WorkToMake>30000</WorkToMake><!-- 可燃性 --><Flammability>1.0</Flammability><!-- 出售加成 --><SellPriceFactor>1.5</SellPriceFactor><Beauty>400</Beauty></statBases><canOverlapZones>false</canOverlapZones><size>(1,1)</size><!-- 品質獎勵的標準 --><thingSetMakerTags><li>RewardStandardQualitySuper</li></thingSetMakerTags><recipeMaker><!-- 需要的技能6級制造6級藝術 可以復合 --><skillRequirements><Crafting>6</Crafting><Artistic>6</Artistic></skillRequirements><!-- 需要的前置研究 --><!-- <researchPrerequisite>Piano</researchPrerequisite> --><!-- 在什么地方制造 --><recipeUsers><li>TableSculpting</li></recipeUsers></recipeMaker><costList><Resin>100</Resin></costList></ThingDef>1.3 新材料(Stuff)
這里的Resin是我定義的新材料樹脂,這里還沒有創建這個材料,我們就順便定義一下新資源,同樣,我們參考了Core中Steel的數據,但與之不同的是我們不會用它制作防具和武器,所以它影響制作的物品鋒利度防護度相關的部分被我刪掉了,然后還需要把它設置為一種制造材料,同樣是原版沒有的。我們只要仿造添加一個就好。
新材料的代碼
<?xml version="1.0" encoding="utf-8" ?> <Defs><ThingDef ParentName="ResourceBase"><defName>Resin</defName><label>樹脂</label><description>樹脂是一種粘性物質,由一些樹木提取,用于制作手辦</description><tickerType>Normal</tickerType><graphicData><texPath>Things/Item/Resource/Chemfuel</texPath><graphicClass>Graphic_Single</graphicClass><drawSize>0.85</drawSize></graphicData><stackLimit>150</stackLimit><healthAffectsPrice>false</healthAffectsPrice><statBases><MaxHitPoints>50</MaxHitPoints><MarketValue>2.3</MarketValue><Mass>0.01</Mass><Flammability>1.2</Flammability><DeteriorationRate>1.0</DeteriorationRate></statBases><stuffProps><categories><li>Resin</li></categories><commonality>0.15</commonality><color>(245,245,245)</color><statFactors><Flammability>1.2</Flammability><MaxHitPoints>1.3</MaxHitPoints></statFactors></stuffProps><thingCategories><li>Manufactured</li></thingCategories></ThingDef> </Defs>設置為制造材料
<?xml version="1.0" encoding="utf-8" ?> <Defs><StuffCategoryDef><defName>Resin</defName><label>樹脂</label></StuffCategoryDef> </Defs>stuffProps標簽里的categories控制了它屬于哪種制造材料,如果不填寫的話會報錯,但并不會崩潰,游戲會把它設置為默認的木頭材質。此外它還影響了未完成品的名稱,我們后面會說到。
1.4 添加配方(Recipe)
其實我們已經在新的手辦物品中設置了配方了,通過recipeMaker標簽和costList標簽。但還有另一種更常用的標簽,在Core中,Recipe相關的都是制造配方,通過Recipe可以做到復雜的合成,比如可以設置所有種類的皮革中除了某幾種以外都可以算為一種材料。
我們也嘗試使用Recipe設置一個用木頭在燃料加工臺制作樹脂的配方
<?xml version="1.0" encoding="utf-8" ?> <Defs><RecipeDef><defName>Make_Resin</defName><label>制作樹脂</label><description>從樹木中提取樹脂</description><jobString>正在制作樹脂</jobString><workSpeedStat>GeneralLaborSpeed</workSpeedStat><effectWorking>Cremate</effectWorking><soundWorking>Recipe_Cremate</soundWorking><workAmount>1800</workAmount><allowMixingIngredients>true</allowMixingIngredients><targetCountAdjustment>50</targetCountAdjustment><recipeUsers><li>BiofuelRefinery</li></recipeUsers><ingredients><li><filter><thingDefs><li>WoodLog</li></thingDefs></filter><count>50</count></li></ingredients><fixedIngredientFilter><thingDefs><li>WoodLog</li></thingDefs></fixedIngredientFilter><products><Resin>10</Resin></products><workSkill>Crafting</workSkill></RecipeDef> </Defs>1.5 未完成物品
差點忘了這個東西,你一定注意到了
<!-- 未完成的物品對應哪個def --><unfinishedThingDef>UnfinishedGarageKid</unfinishedThingDef>它對應這個物品未完成的樣子和描述,不過它有個bug,它的名稱和描述是沒辦法顯示在游戲中的,總是以 未完成的+材質+制作品名字這種格式命名,描述也會被替換為制作品的描述,但這個def并不是不起作用的,游戲中會讀取它的紋理。我還沒有素材,用原版某個藝術品未完成的圖片代替了。
<ThingDef ParentName="UnfinishedBase"><defName>UnfinishedGarageKid</defName><label>未完成的手辦</label><description>一個未完成的手辦</description><!-- 什么類型的材料 享受對應的屬性 --><stuffCategories><li>Resin</li></stuffCategories><graphicData><texPath>Things/Item/Unfinished/UnfinishedMusicalInstrument</texPath><graphicClass>Graphic_Single</graphicClass></graphicData></ThingDef>1.6 測試
簡單測試了樹脂的制作,手辦的制作,需求的條件,以及拆卸之類的操作,質量太輕是有bug的,游戲改成英文方便我們了解目標物品在core的名字是什么。
源碼鏈接
1.7 本地化
追加一下xml本地化的內容。
上一篇里介紹了C#代碼中的本地化,今天介紹一下如何本地化xml中的參數。以英文為例,在Languages下建立English文件夾,然后在English/下建立DefInjected目錄,它的原理也是利用patch的方式覆蓋原有的數據。
在DefInjected下建立一些對應的Def路徑,創建對應原xml文件的名字,修改內部的參數,格式參照
原xml文件
<?xml version="1.0" encoding="utf-8" ?> <Defs><RecipeDef><defName>Make_Resin</defName><label>制作樹脂</label><description>從樹木中提取樹脂</description><jobString>正在制作樹脂</jobString><workSpeedStat>GeneralLaborSpeed</workSpeedStat><effectWorking>Cremate</effectWorking><soundWorking>Recipe_Cremate</soundWorking><workAmount>1800</workAmount><allowMixingIngredients>true</allowMixingIngredients><targetCountAdjustment>50</targetCountAdjustment><recipeUsers><li>BiofuelRefinery</li></recipeUsers><ingredients><li><filter><thingDefs><li>WoodLog</li></thingDefs></filter><count>50</count></li></ingredients><fixedIngredientFilter><thingDefs><li>WoodLog</li></thingDefs></fixedIngredientFilter><products><Resin>10</Resin></products><workSkill>Crafting</workSkill></RecipeDef> </Defs>對應的補丁文件
<?xml version="1.0" encoding="utf-8"?> <LanguageData><Make_Resin.label>make resins</Make_Resin.label><Make_Resin.description>Make resins from woods</Make_Resin.description><Make_Resin.jobString>Making resins</Make_Resin.jobString> </LanguageData>這里有一點需要特別注意
你的翻譯xml文件必須與mod中的xml數據文件同名,并且放在一個與原版Def路徑有關聯的路徑中,才會生效!
這個關聯的形式并不是與原路徑名字一樣,這一點坑了我半天。代碼報錯查不到,去論壇找了半天信息才了解到。
一般的核心路徑如RecipeDefs與之對應的路徑為RecipeDef,去掉復數“s”
而ThingDefs_Buildings,ThingDefs_Items之類的路徑會被歸并為ThingDef路徑,只有這樣命名,目錄下的翻譯文件才會生效!
這個不怎么起眼的信息在RimWorld\Data\Core\Languages\English\About.txt文件里有說明到
我描述的可能不太清楚,具體應該看下我源碼中路徑的名字,你很快就可以搞清楚。
最后我想說的是,這個翻譯方式是以最原始的原理翻譯游戲中調用到的文件,實際翻譯的話是有大佬寫好翻譯工具的,可能會更簡便一下。由于我沒做過漢化工作,如何使用工具以及去哪下載都不清楚。對翻譯感興趣的人推薦詢問漢化組成員。
如果這篇文章對你有幫助,點贊收藏支持一下唄!
總結
以上是生活随笔為你收集整理的Rimworld Mod制作教程2 创建数据定义的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Envoy架构理解--理解xDS/Lis
- 下一篇: 利用freemarker模板引擎进行wo