Rimworldで松屋Mod作成したよ
きっかけ
なんで作ろうと思ったかわかんないけど、機運?
仕様
松屋Modは牛めしだけ追加して松屋Modって名乗っていいのかって思ったら、専用コンロも作ったほうがいい気がしてきた
— めびうす (@catina013) 2017年10月8日
ただ飯画像と名前置換するだけじゃ芸がないので専用のワークテーブルを作ってそこでのみ作らせるようにしてみた。
基本的には手の込んだ料理や贅沢な料理を改変するのだけど 素材効率や満腹値(?)を良くする代わりに、ワークテーブルの作成コストと維持コストを上げてみた。
必要な要素の抜き出し
電気コンロと手の込んだ料理、贅沢な料理その他関連するxmlを引っこ抜きます。
何が必要かは作ろうとしてるものに近いModをワークショップで落してきて分析するのもいいと思います。
Coreから探してくる
検索欄をファイル内も探すように設定して”food”で検索。
するとCoreファイル直下からファイル名、もしくはファイル内に”food”とついたファイルが全てピックアップされます。
そんなかからいるモノ要らないものを精査して、要るモノのフォルダ階層をこれから作るModのフォルダに作っていきます(本当は作らなくてもいいけど後から見やすいので作ってる)
必要ファイル
既存のModやCore内のファイルを調べた結果、今回の仕様で必要なファイル構成は以下の様になりました。
MatsuyaFood About いつもの Defs RecipeDefs Recipes_Meals.xml ThingDefs_Buildings Buildings_Production.xml ThingDefs_Items Items_Food.xml WorkGiver WorkGivers.xml Textures 割愛
中身乗っけながら簡単に解説してきます。
Recipes_Meals.xml
後述するBuildings_Production.xmlのなかのMatsuyaKitchenで作れるレシピの参照先になります。
ここでは牛めしとPremiamu牛めしのレシピを記述します。
<?xml version="1.0" encoding="utf-8" ?> <RecipeDefs> <RecipeDef ParentName="CookMealBase"> <defName>gyumeshi</defName> <label>牛めし</label> <description>松屋の定番!ぜひ一度お試しください!</description> <jobString>Cooking fine meal.</jobString> <workSpeedStat>CookSpeed</workSpeedStat> <effectWorking>Cook</effectWorking> <soundWorking>Recipe_CookMeal</soundWorking> <allowMixingIngredients>true</allowMixingIngredients> <ingredientValueGetterClass>IngredientValueGetter_Nutrition</ingredientValueGetterClass> <ingredients> <li> <filter> <categories> <li>MeatRaw</li> <li>AnimalProductRaw</li> </categories> </filter> <count>0.2</count> </li> <li> <filter> <categories> <li>PlantFoodRaw</li> </categories> </filter> <count>0.2</count> </li> </ingredients> <products> <MealFine>2</MealFine> </products> <skillRequirements> <li> <skill>Cooking</skill> <minLevel>4</minLevel> </li> </skillRequirements> </RecipeDef> <RecipeDef ParentName="CookMealBase"> <defName>premiamugyumeshi</defName> <label>premiamu牛めし</label> <description>これまでの旨さから、別次元の旨さへ</description> <jobString>Cooking lavish meal.</jobString> <workSpeedStat>CookSpeed</workSpeedStat> <effectWorking>Cook</effectWorking> <soundWorking>Recipe_CookMeal</soundWorking> <allowMixingIngredients>true</allowMixingIngredients> <ingredientValueGetterClass>IngredientValueGetter_Nutrition</ingredientValueGetterClass> <ingredients> <li> <filter> <categories> <li>MeatRaw</li> <li>AnimalProductRaw</li> </categories> </filter> <count>0.5</count> </li> <li> <filter> <categories> <li>PlantFoodRaw</li> </categories> </filter> <count>0.5</count> </li> </ingredients> <products> <MealLavish>2</MealLavish> </products> <skillRequirements> <li> <skill>Cooking</skill> <minLevel>8</minLevel> </li> </skillRequirements> </RecipeDef> </RecipeDefs>
単語を和訳するだけでも大体どのタグが何を指してるかわかると思います。
レシピ時に必要スキルレベルとか原材料等を指定します。フィルターもあるので肉や野菜の細かな指定から肉ならなんでもみたいな大雑把な指定まで出来るみたいです。たぶん。
Buildings_Production.xml
MatsuyaKitchenの作り方とそのキッチンの性能、作れるレシピを指定するファイルです。
<?xml version="1.0" encoding="utf-8" ?> <ThingDefs> <ThingDef ParentName="BenchBase"> <defName>MatsuyaKitchen</defName> <label>松屋キッチン</label> <ThingClass>Building_WorkTable_HeatPush</ThingClass> <Description>充実したラインナップでお客様の軒高と豊かな食生活を応援します。</Description> <graphicData> <texPath>Things/Building/Production/MatsuyaKitchen</texPath> <graphicClass>Graphic_Multi</graphicClass> <drawSize>(3.5,1.5)</drawSize> <damageData> <cornerTL>Damage/Corner</cornerTL> <cornerTR>Damage/Corner</cornerTR> <cornerBL>Damage/Corner</cornerBL> <cornerBR>Damage/Corner</cornerBR> </damageData> </graphicData> <constructEffect>ConstructMetal</constructEffect> <CostList> <Steel>200</Steel> <Component>20</Component> </CostList> <AltitudeLayer>Building</AltitudeLayer> <fillPercent>0.5</fillPercent> <useHitPoints>True</useHitPoints> <statBases> <WorkToBuild>3000</WorkToBuild> <MaxHitPoints>180</MaxHitPoints> <Flammability>1.0</Flammability> </statBases> <Size>(3,1)</Size> <DesignationCategory>Production</DesignationCategory> <Passability>PassThroughOnly</Passability> <pathCost>70</pathCost> <hasInteractionCell>True</hasInteractionCell> <interactionCellOffset>(0,0,-1)</interactionCellOffset> <surfaceType>Item</surfaceType> <recipes> <li>gyumeshi</li> <li>premiamugyumeshi</li> </recipes> <inspectorTabs> <li>ITab_Bills</li> </inspectorTabs> <comps> <li Class="CompProperties_Power"> <compClass>CompPowerTrader</compClass> <startElectricalFires>true</startElectricalFires> <basePowerConsumption>500</basePowerConsumption> </li> <li Class="CompProperties_Flickable"/> <li Class="CompProperties_Breakdownable"/> </comps> <building> <isMealSource>true</isMealSource> <spawnedConceptLearnOpportunity>BillsTab</spawnedConceptLearnOpportunity> <heatPerTickWhileWorking>0.10</heatPerTickWhileWorking> </building> <designationHotKey>Misc8</designationHotKey> <researchPrerequisites> <li>Electricity</li> </researchPrerequisites> </ThingDef> </ThingDefs>
作成コストから作れるレシピ、消費電力なんかを指定します。
ここの作成コストで間違ったレシピを指定した場合、ゲーム内でこのテーブル作成すると進行不可なバグ出るので注意
Items_Food.xml
牛めしの基本情報が設定されるファイルです。牛めしが出来る前はレシピ、出来た後はこれを参照されます。
<?xml version="1.0" encoding="utf-8" ?> <ThingDefs> <ThingDef ParentName="MealRottable"> <defName>gyumeshi</defName> <label>牛めし</label> <description>松屋の定番!ぜひ一度お試しください!</description> <graphicData> <texPath>Things/Item/Meal/gyumeshi</texPath> <graphicClass>Graphic_Single</graphicClass> </graphicData> <statBases> <MarketValue>24</MarketValue> <WorkToMake>200</WorkToMake> </statBases> <ingestible> <preferability>MealFine</preferability> <tasteThought>AteFineMeal</tasteThought> <nutrition>0.90</nutrition> <ingestEffect>EatVegetarian</ingestEffect> <ingestSound>Meal_Eat</ingestSound> </ingestible> </ThingDef> <ThingDef ParentName="MealRottable"> <defName>premiamugyumeshi</defName> <label>premiamu 牛めし</label> <description>これまでの旨さから、別次元の旨さへ</description> <graphicData> <texPath>Things/Item/Meal/gyumeshi</texPath> <graphicClass>Graphic_Single</graphicClass> </graphicData> <statBases> <MarketValue>30</MarketValue> <WorkToMake>300</WorkToMake> </statBases> <ingestible> <preferability>MealLavish</preferability> <tasteThought>AteLavishMeal</tasteThought> <nutrition>1.00</nutrition> <ingestEffect>EatVegetarian</ingestEffect> <ingestSound>Meal_Eat</ingestSound> </ingestible> </ThingDef> </ThingDefs>
Premiamu牛めしも同じテクスチャ使ってるのはご愛敬
WorkGivers.xml
今回で一番のひっかけ問題がここ。
作ったワークテーブルで料理作ってもらうためにはここに記入したほうがよいみたい。(正確なこのファイルの挙動がわかってない)
<?xml version="1.0" encoding="utf-8" ?> <WorkGivers> <WorkGiverDef> <defName>DoBillsCookMatsuyaKitchen</defName> <label>みんなの食卓でありたい。松屋</label> <giverClass>WorkGiver_DoBill</giverClass> <workType>Cooking</workType> <priorityInType>80</priorityInType> <fixedBillGiverDefs> <li>MatsuyaKitchen</li> </fixedBillGiverDefs> <verb>cook</verb> <gerund>cooking at</gerund> <requiredCapacities> <li>Manipulation</li> </requiredCapacities> <prioritizeSustains>true</prioritizeSustains> </WorkGiverDef> </WorkGivers>
MatsuyaKitchenでどのタイプのジョブをさせるかとかたぶんそういうものが記述されているはず。
テクスチャの追加
— 氏子クロニクル (@toshi_a) 2017年10月13日
わざわざ撮ってくれたとしぁさんに感謝。
これを適当にチョチョって64*64の透過pngに変換して完成。
あと適当に松屋っぽさを感じさせるワークテーブルの画像を挿入したら出来上がり。
Rimworldで服Mod作成した記事
きっかけ
新しいトライナリー4コマできたよー pic.twitter.com/dEx0UVWUNi
— 手作りお菓子100円 (@toshi_a) 2017年10月5日
百合患者が一週回ってこんなツイートしていたので、Rimworld内で着られたら楽しいだろうなと思って作成してみた。
超身内ネタなのでたぶん配布はしないけども、服(服装、衣服、衣装)Modの作り方ってあまりちゃんとなかったような気がしたので文章に残してみることにした。
はじめに
製作 - RimWorld私的wiki
Modding - RimWorld Wiki*
ここら辺を読んでサックリわかった人はもう読まなくていいと思う。
というか、上記リンクで爆速理解出来る人はここから先の記述はツッコミどころ多数なので温かい目で見守ってください。お願いします。
わかんなくてもなんとなしに先に一読してもらえると、読んでて痒かった所に手が届くかもしれない。
基本的にCoreフォルダ内にあるファイルをコピペして改変するような簡単なMod作成です。
もぢんぐ開始
必要なモノ
一にも二にもバックアップは大切に。メモリが飛んだらおしまいだ。
Rimworldのフォルダ毎コピーして別のフォルダに移しておきましょう。最悪の事態になったときにコピペで元通りになるようにしておきます。
テキストエディタは何でもいいのですがWindowsなんかについてるノートパッドだとよくないかもなんで、さくらエディタでもダウンロードして使いましょう。
サクラエディタ Download
お絵かきソフトですが、このゲームのキャラクターはパーツごとに画像を何枚も重ねて表示しています。なので自分より下の画像が表示されるよう余計なところは透過処理してあるPNGファイルが必要です。
信心が必要ですが、フリーソフトならGIMPとかで良いと思います。
GIMP - GNU Image Manipulation Program
ちなみに自分はSAIでやりました。
Modの構造(というかゲームの構造)
ここから自分の理解を書くので何言ってるのかわけわかめって人は流してください。
このゲームは起動すると、Rimworld直下の”Rimworld○○”ってアプリケーションが立ち上がり必要なデータを様々なフォルダから読み出します。
そして動物の設定やバイオームの仕様、AIの種類等 様々なものを読み出しゲームの中で使えるようにセットアップします。
その読み出す定型文を理解して自分の作りたいものをゲーム内に読みだしてもらう様作るのが、Mod作成です(たぶん)
ですから、読み出すのに必要な要素とこの文は何を読み出しているのかを理解すれば作れるはずです(今のところは)
Mod作成に必要な要素
Modとしてゲームに読み込んでもらうには以下のフォルダ構成とファイルが必要です。
例:LoveLoveTshiut MOD
RimWorld Mods Core LoveLove …① About …② About.xml …③ Preview.png …④ Defs …② ThingDefs_Misc …⑤ Apparel_Various.xml …⑥ Textures …⑦ Things …⑤ Pawn …⑤ Humanlike …⑤ Apparel …⑤ LoveLoveTshirt …⑧ LLT.png …⑨ (以下、画像ファイルが沢山)
黒字はインストール時にあるモノ(一部割愛)
赤字が種類を問わず絶対必要なモノ
青字が作りたいModによって適宜変えるモノ
上から順に解説していきたいと思います。
① Modの名前
今はインストールフォルダのModフォルダから直に作ろうとしているので名称衝突はしないでしょうが、ユニークな名前の方がパッとみで判別つきやすいのでお勧めです。
ちなみにSteamのワークショップだとここのフォルダ名が各Modに割り当てられた番号になっています。
② 構成フォルダ
Aboutフォルダは読みだしたとき、Modの切り替え画面で表示される情報を入れるフォルダになっています。
DefsフォルダはこのModがどういうモノでどういう動きをするかを指示するファイルが入るフォルダになります。
この二つはModの根幹なので初めに作ってしまいましょう。
③ About.xml
上記の通りゲーム内のMod切り替え画面でこのModがどのバージョンに対応しているのか、何をするのか等の情報を記入するところです。
中身はこの通り
(加筆解説あり)
<?xml version="1.0" encoding="utf-8"?> ←おまじないの種類 <ModMetaData> ←この情報読み出してよーっておまじない <name>ラブラブTシャツ</name> ←Modの名前 <author>めびうす</author> ←Modの作成者 <url>https://twitter.com/catina013</url> ←リンク先(普通はワークショップのURLとかGithubのが入ってるらしい) <targetVersion>0.17.1557</targetVersion> ←適応されるバージョン(更新されてないModでもここだけ更新したら動くことがあるらしい)(自己責任で!!!) <description> 着たら猛者になれるラブラブTシャツを追加するModです。 </description> ←中身の具体的な内容を書く所。たぶんがんばったらhtmlで楽しい事出来る筈 </ModMetaData> ←ここまで読み出して!っておまじない
⑤ 任意の階層
良くネタである「何故動くかわからないけどとりあえず入ってるコード」的な所。
恐らく無くても良いのだけど、このModはCore内に入っているデフォルトのTシャツを元に作成してるためそこに似せたフォルダ階層にして動きますよーにって祈りを籠めている様(実際これで動いてるし良いよね)
たぶん短い方が後述するPassを通すときに楽なんだろうけどまぁ動いてるので正義。
⑥ Apparel_Various.xml
Mod作成をしたとき一番詰まったというか難しかったところ。
ここでどのフォルダのどのファイルを参照にしてコピペするかは、アメリカ語力と忍耐力と少しのカンが問われます。
このModはTシャツModを改変したので
\RimWorld\Mods\Core\Defs\
内の
Apparel_Various.xml
を参照した。
作りたいModの任意のデータがどこにあるかは頑張って探してください。
抜き出して書き上げた
中身はこの通り
<?xml version="1.0" encoding="utf-8" ?> <ThingDefs> <ThingDef ParentName="ApparelMakeableBase"> <defName>LoveLoveTshirt</defName> <label>ラブラブTシャツ</label> <description>ラブラブTシャツです。</description> <graphicData> <texPath>Things/Pawn/Humanlike/Apparel/LoveLoveTshirt/LLT</texPath> <graphicClass>Graphic_Single</graphicClass> </graphicData> <costStuffCount>50</costStuffCount> <stuffCategories> <li>Fabric</li> <li>Leathery</li> </stuffCategories> <thingCategories> <li>Apparel</li> </thingCategories> <statBases> <MaxHitPoints>100</MaxHitPoints> <WorkToMake>5000</WorkToMake> <Mass>0.25</Mass> <ArmorRating_Blunt>0.03</ArmorRating_Blunt> <ArmorRating_Sharp>0.03</ArmorRating_Sharp> <Insulation_Cold>-3</Insulation_Cold> </statBases> <apparel> <bodyPartGroups> <li>Torso</li> <li>Shoulders</li> </bodyPartGroups> <worngraphicPath>Things/Pawn/Humanlike/Apparel/LoveLoveTshirt/LLT</worngraphicPath> <layers> <li>OnSkin</li> </layers> <tags> <li>Outlander</li> <li>Spacer</li> </tags> <defaultOutfitTags> <li>Worker</li> <li>Soldier</li> </defaultOutfitTags> </apparel> <colorGenerator Class="ColorGenerator_StandardApparel" /> </ThingDef> </ThingDefs>
正直に言おう
なんで動いてるかわからん
わからなすぎて(核爆)とかつけそうになった。
そもそもPath通す位置がなぜそれでいいかわからん。
とりあえずわかる位置から解説したのを再掲
<?xml version="1.0" encoding="utf-8" ?> <ThingDefs> ←おまじないここから唱えるぞって宣言 <ThingDef ParentName="ApparelMakeableBase"> <defName>LoveLoveTshirt</defName> ←ゲームの内部で呼ばれる名前 <label>ラブラブTシャツ</label> ←プレイヤーに見せる名前 <description>ラブラブTシャツです。</description> ←解説文 <graphicData> <texPath>Things/Pawn/Humanlike/Apparel/LoveLoveTshirt/LLT</texPath> …A <graphicClass>Graphic_Single</graphicClass> </graphicData> <costStuffCount>50</costStuffCount> ←ここから下はこのアイテムの設定 <stuffCategories> <li>Fabric</li> <li>Leathery</li> </stuffCategories> <thingCategories> <li>Apparel</li> </thingCategories> <statBases> <MaxHitPoints>100</MaxHitPoints> <WorkToMake>5000</WorkToMake> <Mass>0.25</Mass> <ArmorRating_Blunt>0.03</ArmorRating_Blunt> <ArmorRating_Sharp>0.03</ArmorRating_Sharp> <Insulation_Cold>-3</Insulation_Cold> </statBases> <apparel> <bodyPartGroups> <li>Torso</li> <li>Shoulders</li> </bodyPartGroups> <worngraphicPath>Things/Pawn/Humanlike/Apparel/LoveLoveTshirt/LLT</worngraphicPath> …B <layers> <li>OnSkin</li> </layers> <tags> <li>Outlander</li> <li>Spacer</li> </tags> <defaultOutfitTags> <li>Worker</li> <li>Soldier</li> </defaultOutfitTags> </apparel> <colorGenerator Class="ColorGenerator_StandardApparel" /> </ThingDef> </ThingDefs> ここまでのおまじないでたのむって宣言(これ重要)
たぶんここらへんはアメリカ語Wiki見たほうがもっと細かい設定いじれると思うけどそんな体力ないので割愛。
ABの所には⑨のパスを拡張子抜きで通せばよいはず。
問題は、微妙に階層足りてないけど参照出来てるのが謎。
たぶん足りて無いようで足りてるから動いてイラストついてるんだろうな。
びしっと変えたいけど触らぬコードに祟りなしって言いますし。
⑦ 任意に必要なフォルダ
今回のModは画像だけで良かったのでTexturesフォルダだけで良かったですが、音声とかその他なんかある場合は分けて作ると美しく見えます。
⑧ Texturesフォルダ名
これも名称衝突しないようにユニークなものつけましょう。その方が安全。
⑨ LLT.png
服装画像を作る場合、一番の親になるファイルがこの地面に置かれた状態のテクスチャになります。
この画像の他に、5つの体形と前・後ろ・横の3種類の各画像を用意しましょう。
完成
動いたらこんな感じ
twitter.com
めっちゃ好きすぎてモジング童貞捨てた pic.twitter.com/t15dp2c9Ta
— めびうす (@catina013) 2017年10月6日
終わりに
長文(長くない)書いたので最後疲れたのがまるわかりですね。
この文章みて書いて、もしクラッシュしたとかセーブデータ消えたとか言われても責任は取れないのでそこの所何卒何卒