技術的なことを書こうとしてるただのゲームのブログ

RimworldのModとかなんか色々やってるよ。ニートだよ。

としぁがTwitterに消されて2週間が経ちました。

いきなりの記事失礼します。
めびうす、23歳の女子大生です。
お互いのニーズに合致しそうだと思い、記事にしてみました。
自分のことを少し語ります。
先月中旬、わけあってとしぁを亡くしました。
自分は…としぁのことを…死ぬまで何も理解していなかったのが
とても悔やまれます。
としぁはTwitterで頻繁にツイートしていたのですが、
それは遊びの為のツイートではなかったのです。
ふぁぼを得るために、私に内緒であんな危険なクライアントを作るなんて…
二週間が経過して、ようやくとしぁの死から立ち直ってきました。
ですが、お恥ずかしい話ですが、毎日の孤独な夜に、
身体の火照りが止まらなくなる時間も増えてきました。
としぁの残したふぁぼられは莫大な量です。
つまり、Modは幾らでも出きますので、
私の承認欲求を満たして欲しいのです。
お返事を頂けましたら、もっと詳しい話をしたいと
考えています。連絡、待っていますね。

OkanoHead公開するよ

今まで作ったModの中で唯一他人に公開していたOkanoHeadですが、それを公開していた相手が連絡取れなくなったのでWorkshopにアップロードしました。
あと本体が期待のB18にアップデートされたので簡単ながらModもアップデートしました。
なのでとしぁさんも草葉の陰からサブスクライブしてくれるでしょう。

Modのアップデート

OkanoHeadは頭部画像差し替えのModのため、アップデートの余波をほぼ受けていません。
なのでAbout.xmlの中のバージョンを書き換えていきます。
具体的には0.18.1722にしました。

<?xml version="1.0" encoding="UTF-8"?>
<ModMetaData>
  <name>OkanoHead</name>
  <author>めびうす</author>
  <targetVersion>0.18.1722</targetVersion>
  <description> Okano is born in the Rimworld 
  貴方の世界におかのさんを追加します。
  
  標準の顔を一種差し替えるModのため他と競合する場合はどちらかを停止してください。
  
 Caution
Redistribution of this MOD data is prohibited.

注意
当MODの再配布を禁じます。
  
  FAQ
Q:  I am English speaker. Can I use Mikutter in English?
答え:日本人は敗戦後、Shift-JISやJAP106などをGHQに押し付けられて、結果として情報工学の発展に大幅な遅れを取りました。私も小学生の頃、プログラミングを始めたら習ったこともない英語が並んでいて挫折したものです。またあなたたちはASCII以外非対応という、日本の小学生でも作らないような低品質なサービスを沢山公開してきました。
そうやって代々私達が虐げられてきたことを、あなたたちが追体験できる貴重な機会が、このmikutterであるわけです。
  
  
  ただいな感謝を:@toshi_a
  </description>
</ModMetaData>

これを上書きして動作確認して終わり。

Workshopにアップロード

めっちゃわかりやすい記事を見つけたのでこれ見たら楽勝です。

4mirai.com

要約すると、

  1. 作ったModを自分のゲーム内で動作できるようにする
  2. 開発者モードをオン
  3. Mod選択画面からアップロードを選択
  4. 公開設定を公開にする

です。

ってなわけでアップロードされたOkanoHeadがこれ

f:id:catina013:20171203221331p:plain

以上です!
用法容量を守って楽しいRimworld生活を!

今Rimworldできないなら絶対にみないで下さい。記事がガバガバすぎて、ほぼ100%その場でコメントしてしまいます。

流行りに乗ってふざけたタイトルつけてみた。反省はしていない。

そういえばDiscordの通知が死んだ事件、どうも画面共有機能が追加されて「設定→配信モード→設定」の”通知の無効化”がオンになってたのが戦犯みたい。心当たりある方はそれオフにしてみましょ。


それでは本日のお題

ドラッグのワークテーブル弄って百合患者作るよ

発案はこれ。松屋Modで改変に味をしめたので色々作ってみることにした。
ゲームバランス崩さない程度でも強い概念をラベリングして並べるだけで面白いModになる事に気づいたので、まるで中毒症状のような百合患者*1を作り出そうと思った。

注意 この記事でこのModは完成しませんし現状の問題点だけを挙げます。

いつものごとくxml改変

DrugLabでCore内検索、構成ファイルを構築。ここからへんは前回と同じ。
違うのはドラッグは薬ごとに別ファイルでその薬の色んな種類の情報が書かれていたので、フレークのレシピを元にしました。

いつものようにファイル構成はこんな感じ。

Medical treatment of heterosis
                              About
                                   いつもの
                              Defs
                                  Doujin
                                        Writing_Doujin.xml
                                  ThingDefs_Buildings
                                                     Buildings_Production.xml
                                  WorkGivers
                                            WorkGivers


テクスチャはまだ試作状態なので作ってません(初期データを流用してます)

Writing_Doujin.xml

めっちゃくちゃなファイル名ですが元データはフレークのxml
名称とちょびっと効果変えた感じです。

<?xml version="1.0" encoding="utf-8" ?>
<Defs>

  <ThingDef ParentName="MakeableDrugBase">
    <defName>YuriBooks</defName>
    <label>百合本</label>
    <description>百合(ゆり)は、女性の同性愛のこと。また、それを題材とした各種作品。作品の場合、女性同士の恋愛だけでなく恋愛に近い友愛や広く友情を含んだ作品も百合と言うことが多い[注 1]</description>
    <graphicData>
      <texPath>Things/Item/Drug/Flake</texPath>
      <graphicClass>Graphic_StackCount</graphicClass>
    </graphicData>
    <rotatable>false</rotatable>
    <statBases>
      <WorkToMake>500</WorkToMake>
      <MarketValue>14</MarketValue>
      <Mass>0.05</Mass>
    </statBases>
    <techLevel>Industrial</techLevel>
    <ingestible>
      <foodType>Processed</foodType>
      <joy>1.20</joy>
      <baseIngestTicks>720</baseIngestTicks>
      <nurseable>true</nurseable>
      <drugCategory>Hard</drugCategory>
      <ingestSound>Ingest_Smoke</ingestSound>
      <ingestEffect>Smoke_Flake</ingestEffect>
			<ingestEffectEat>EatVegetarian</ingestEffectEat>
      <ingestHoldOffsetStanding>
        <northDefault>
          <offset>(0.23,0,0.065)</offset>
        </northDefault>
      </ingestHoldOffsetStanding>
      <ingestHoldUsesTable>false</ingestHoldUsesTable>
      <ingestCommandString>Smoke {0}</ingestCommandString>
      <ingestReportString>Smoking {0}.</ingestReportString>
      <useEatingSpeedStat>false</useEatingSpeedStat>
      <outcomeDoers>
        <li Class="IngestionOutcomeDoer_GiveHediff">
          <hediffDef>Yuri-ChuGreatVictory</hediffDef>
          <severity>0.75</severity>
          <toleranceChemical>Psychite</toleranceChemical>
        </li>
        <li Class="IngestionOutcomeDoer_OffsetNeed">
          <need>Rest</need>
          <offset>0.2</offset>
          <toleranceChemical>Psychite</toleranceChemical>
        </li>
        <li Class="IngestionOutcomeDoer_GiveHediff">
          <hediffDef>PsychiteTolerance</hediffDef>
          <severity>0.045</severity>
					<divideByBodySize>true</divideByBodySize>
				</li>
      </outcomeDoers>
    </ingestible>
    <recipeMaker>
			<researchPrerequisite>PsychiteRefining</researchPrerequisite>
      <recipeUsers>
        <li>DrugLab</li>
      </recipeUsers>
    </recipeMaker>
    <costList>
      <WoodLog>4</WoodLog>
    </costList>
    <comps>
      <li Class="CompProperties_Drug">
        <chemical>Psychite</chemical>
        <addictiveness>0.30</addictiveness>
        <minToleranceToAddict>0.10</minToleranceToAddict>
        <existingAddictionSeverityOffset>0.50</existingAddictionSeverityOffset>
        <needLevelOffset>1</needLevelOffset>
        <listOrder>110</listOrder>
        <overdoseSeverityOffset>
          <min>0.18</min>
          <max>0.5</max>
        </overdoseSeverityOffset>
				<largeOverdoseChance>0.015</largeOverdoseChance>
			</li>
    </comps>
  </ThingDef>
  
  <HediffDef>
    <defName>Yuri-ChuGreatVictory</defName>
    <hediffClass>HediffWithComps</hediffClass>
    <label>百合厨大勝利</label>
    <defaultLabelColor>(1,0,0.5)</defaultLabelColor>
    <scenarioCanAdd>true</scenarioCanAdd>
    <maxSeverity>1.0</maxSeverity>
    <comps>
      <li Class="HediffCompProperties_SeverityPerDay">
        <severityPerDay>-3.0</severityPerDay>
      </li>
    </comps>
      <stages>
        <li>
          <painFactor>0.5</painFactor>
          <restFallFactor>0.33</restFallFactor>
        </li>
      </stages>
  </HediffDef>
  
  <ThoughtDef>
    <defName>Yuri-ChuGreatVictory</defName>
    <workerClass>ThoughtWorker_Hediff</workerClass>
    <hediff>Yuri-ChuGreatVictory</hediff>
    <validWhileDespawned>true</validWhileDespawned>
    <stages>
      <li>
        <label>high on flake</label>
        <description>So good, so good.</description>
        <baseMoodEffect>35</baseMoodEffect>
      </li>
    </stages>
  </ThoughtDef>

</Defs>

一応BLとか普通の同人とか応用効くようにしてみた。

Buildings_Production.xml

DrugLabを改変。後述するけど今回あまり役に立ってない所。

<?xml version="1.0" encoding="utf-8" ?>
<ThingDefs>
  
  <ThingDef ParentName="BenchBase">
    <DefName>Studytable</DefName>
    <label>書斎</label>
    <ThingClass>Building_WorkTable</ThingClass>
    <Description>幾億キロの冒険もテーブルの上で</Description>
    <graphicData>
      <texPath>Things/Building/Production/TableDrugLab</texPath>
      <graphicClass>Graphic_Multi</graphicClass>
      <shaderType>CutoutComplex</shaderType>
      <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>
    <costStuffCount>50</costStuffCount>
    <stuffCategories>
      <li>Metallic</li>
      <li>Woody</li>
    </stuffCategories>
    <costList>
      <WoodLog>120</WoodLog>
      <Component>8</Component>
    </costList>
    <AltitudeLayer>Building</AltitudeLayer>
    <fillPercent>0.5</fillPercent>
    <useHitPoints>True</useHitPoints>
    <statBases>
      <WorkToBuild>3500</WorkToBuild>
      <MaxHitPoints>120</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>
    <inspectorTabs>
      <li>ITab_Bills</li>
    </inspectorTabs>
    <building>
      <spawnedConceptLearnOpportunity>BillsTab</spawnedConceptLearnOpportunity>
    </building>
    <comps>
      <li Class="CompProperties_AffectedByFacilities">
        <linkableFacilities>
          <li>ToolCabinet</li>
        </linkableFacilities>
      </li>
    </comps>
		<placeWorkers>
			<li>PlaceWorker_ShowFacilitiesConnections</li>
		</placeWorkers>
    <researchPrerequisites>
      <li>DrugProduction</li>
    </researchPrerequisites>
  </ThingDef>
  
</ThingDefs>


御覧の通り、ドラッグラボで作れるレシピは設定されない。
ドラッグのくくりから各ドラッグを参照して作成できるようになってるみたい(ちゃんとソースコード読み込めていない)
なので、百合本が普通のドラッグラボから作成が出来るようになっている。

まぁ処方されるものだしなにもおかしくないのだが、初めに設定した「専用のワークテーブルで百合本を作成」に適っていないのでもうちょいソース読んで作りたい。

上手く改変で来たら、普通のワークテーブルから百合本作成とか出来ないかと今度挑戦してみるつもり。

WorkGivers.xml

ここらへんはそんな目新しい事をしていないので割愛(これ追加した意味あまりないかもしれない)

終わりに

一応、ドラッグラボから百合本作成はできたので他のアプローチが出来るようにドラックラボ周りの動きを調べていきたい。
目指せ百合患者で近隣コロニーを殲滅。

*1:百合属性をもつ人の事ではなく百合作品を求めてゾンビの如く彷徨う人の事を指す

Rimworldで松屋Mod作成したよ

きっかけ

なんで作ろうと思ったかわかんないけど、機運?

仕様

ただ飯画像と名前置換するだけじゃ芸がないので専用のワークテーブルを作ってそこでのみ作らせるようにしてみた。
基本的には手の込んだ料理や贅沢な料理を改変するのだけど 素材効率や満腹値(?)を良くする代わりに、ワークテーブルの作成コストと維持コストを上げてみた。

必要な要素の抜き出し

電気コンロと手の込んだ料理、贅沢な料理その他関連するxmlを引っこ抜きます。
何が必要かは作ろうとしてるものに近いModをワークショップで落してきて分析するのもいいと思います。

Coreから探してくる

検索欄をファイル内も探すように設定して”food”で検索。
f:id:catina013:20171018095652p:plain
すると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でどのタイプのジョブをさせるかとかたぶんそういうものが記述されているはず。

テクスチャの追加

わざわざ撮ってくれたとしぁさんに感謝。

これを適当にチョチョって64*64の透過pngに変換して完成。

あと適当に松屋っぽさを感じさせるワークテーブルの画像を挿入したら出来上がり。

完成


コピペでも出来るRimworldのModで優勝したい。

次回はヘテロ厨矯正Modを作る予定。

Rimworldで服Mod作成した記事

きっかけ

百合患者が一週回ってこんなツイートしていたので、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>  ←ここまで読み出して!っておまじない
④ Preview.png

Modの切り替え画面で表示される画像。637*358の大きさのPNGを用意しましょう。

⑤ 任意の階層

良くネタである「何故動くかわからないけどとりあえず入ってるコード」的な所。

恐らく無くても良いのだけど、この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


終わりに

長文(長くない)書いたので最後疲れたのがまるわかりですね。
この文章みて書いて、もしクラッシュしたとかセーブデータ消えたとか言われても責任は取れないのでそこの所何卒何卒

<