「講座:INT8あれば出来る!MODの作り方」の編集履歴(バックアップ)一覧はこちら
追加された行は緑色になります。
削除された行は赤色になります。
*0.はじめに
&b(){0.C開発版での解説です。容赦なく変更されるので慣れましょう。}
&b(){MOD製作はゲームの盛大なネタバレが避けられません。覚悟して進みましょう。}
既存のjsonをコピーして改変。これがMOD製作への第一歩です。
しかし、お手本のjsonを見つめているだけでは、出来ることが限られてしまいます。
このページでは、もう一歩踏み込んでMODを作る上で知っておきたいことを解説します。
少し話が高度になりますが大丈夫。プログラミングなんて知らなくても問題ありません。
コピー・改変・トライアンドエラー!です。困ったら本スレ、質問スレがあるのですから。
*1.ツールを用意しよう
本格的にMODを作ろうと思うなら、それなりのツールを用意する必要があります。
-テキストエディタ
jsonを編集する専用のもの…は不要です。文字コードUTF-8に対応出来るエディタを用意しましょう。
エディタはシンプルで軽いものが結局は最強です。
-grep検索ソフト
ファイル内を検索できるなんらかのソフトが必要です。エクスプローラーではちょっと…。
いわゆるgrep検索ができないと、情報を集めるのが大変です。
-表計算ソフト
多数のアイテムを編集しようとするとテキストエディタでは管理がおっつかなくなります。
表計算ソフトでデータを管理しておき、ここから機械的にjsonを編集するようにしておけば設定ミスが減らせるでしょう。
このページを書いている人はサクラエディタを使っています。付属のgrep検索が非常に強力なため、MOD製作に向いています。
jsonを整形する上で、短形選択やマクロも大きな助けになってくれます。
*2.日本語を扱う際の注意点
Cataclysm:DDAの多言語対応は、実行時に翻訳ファイルから訳文を探すことで行われています。
翻訳ファイルはMODオリジナルで配布することは出来ず、MOD内でも原文と翻訳文を両方定義することは出来ないため、英語で書くか、日本語で書くかの二択になります。
気になるなら、言語ごとにMODを別にして配布するしかありません。(公式MODに掲載してもらい翻訳してもらう方法も)
各MODのファイルにはマルチバイト文字を含めることが出来るので、普通に日本語のテキストを書けます。
ただし、ファイルを保存する際は文字コードをUTF-8にする必要があります。
また、改行コードは原則としてLFであるべきです。メモ帳では出来ないので、対応しているエディタが必要になります。
*3.Readmeを見よう
開発者、MOD製作者向けにReadmeがゲームのフォルダに入っていますので、チラ見しておきましょう。
docフォルダの中がそれです。
中にはReadmeレベルのことが書かれている.mdと、サンプルMODの入ったフォルダがあります。
.mdはマークダウンファイルなのでatomなどで読めるのですが、わざわざそんなものを入れる必要はありません。
中身は英語な上、開発者向けに書かれているのでチンプンですが、MOD製作を行う上で欠かせない情報が入っています。
その内の1つを見てみましょう。
JSON_FLAGS.md
#region
----
### Categories
- ```CC_WEAPON```
- ```CC_AMMO```
- ```CC_FOOD```
- ```CC_DRINK```
- ```CC_CHEM```
- ```CC_ELECTRONIC```
- ```CC_ARMOR```
- ```CC_MISC```
----
#endregion
そうです。json中に頻繁に出てくるキーワードがまとめて書いてあるのです。(開発が進行して情報が古くなってることも稀によくある)
このCategoriesはアイテムの定義に指定する分類の一覧で、製作メニューの大分類を指しています。
こうした情報が分かっていると、ゲーム本体とMODのjsonの中から、サンプルにするjsonや記述を探すのが楽になります。
これをキーワードに、ゲーム内のフォルダツリーをgrep検索すればいいのです。
またdocフォルダにはサンプルMODも入っています。(すでに古くなって動かない、間違ってるのも…)
サンプル数は少ないものの、ゲーム中のjsonでは実現していない変わった方法が紹介されています。
*4.ソースコードをダウンロードする
ソースコードの情報が必要になることがあります。
GitHubから最新のソースコードをダウンロードしておくと役に立つでしょう。
*5.MOD製作例
ではMODの製作例を通して、少し踏み込んだ内容を見ていきましょう。
今回は「モンスターを召喚するアイテム」です。
**(1)modinfo.jsonを書く
まずは適当なMODからmodinfo.jsonをコピーしてMODの情報を書きます。
----
{
"type": "MOD_INFO"
,"mod-type": "SUPPLEMENTAL"
,"ident": "summon_test"
,"name": "追加 - モンスター召喚アイテム"
,"author": ""
,"description": "モンスター召喚アイテムのテストです。"
,"category": "items"
,"dependencies": ""
,"path": ""
}
----
MODの情報は世界生成の際にプレイヤーに表示されるのでわかりやすく書きましょう。
メニューの幅はせまいので文字数はかなり限られます。
categoryですが、これは何を指定すればいいのでしょう?MODリスト上の分類なのは想像が付きます。
公式MODのmodinfo.jsonを漁って良さ気なのを採用してもいいですが、指定できるものの一覧が見たいと思いませんか?
そこでソースも含めて検索していくと…
#region
#highlight(linenumber,c){{
const std::vector<std::pair<std::string, std::string> > &get_mod_list_categories() {
static const std::vector<std::pair<std::string, std::string> > mod_list_categories = {
{"items", _("ITEM ADDITION MODS")},
{"creatures", _("CREATURE MODS")},
{"misc_additions", _("MISC ADDITIONS")},
{"buildings", _("BUILDINGS MODS")},
{"vehicles", _("VEHICLE MODS")},
{"rebalance", _("REBALANCING MODS")},
{"magical", _("MAGICAL MODS")},
{"item_exclude", _("ITEM EXCLUSION MODS")},
{"monster_exclude", _("MONSTER EXCLUSION MODS")},
{"", _("NO CATEGORY")}
};
return mod_list_categories;
}
}}
#endregion
ソースに直で書いてありました。(誰だよReadme見ろとか言った奴は)
スッキリしたところで、今回はアイテムの追加なので"items"を採用です。
つづく
*0.はじめに
&b(){0.C開発版での解説です。容赦なく変更されるので慣れましょう。}
&b(){MOD製作はゲームの盛大なネタバレが避けられません。覚悟して進みましょう。}
既存のjsonをコピーして改変。これがMOD製作への第一歩です。
しかし、お手本のjsonを見つめているだけでは、出来ることが限られてしまいます。
このページでは、もう一歩踏み込んでMODを作る上で知っておきたいことを解説します。
少し話が高度になりますが大丈夫。プログラミングなんて知らなくても問題ありません。
コピー・改変・トライアンドエラー!です。困ったら本スレ、質問スレがあるのですから。
*1.ツールを用意しよう
本格的にMODを作ろうと思うなら、それなりのツールを用意する必要があります。
-テキストエディタ
jsonを編集する専用のもの…は不要です。文字コードUTF-8に対応出来るエディタを用意しましょう。
エディタはシンプルで軽いものが結局は最強です。
-grep検索ソフト
ファイル内を検索できるなんらかのソフトが必要です。エクスプローラーではちょっと…。
いわゆるgrep検索ができないと、情報を集めるのが大変です。
-表計算ソフト
多数のアイテムを編集しようとするとテキストエディタでは管理がおっつかなくなります。
表計算ソフトでデータを管理しておき、ここから機械的にjsonを編集するようにしておけば設定ミスが減らせるでしょう。
このページを書いている人はサクラエディタを使っています。付属のgrep検索が非常に強力なため、MOD製作に向いています。
jsonを整形する上で、短形選択やマクロも大きな助けになってくれます。
*2.日本語を扱う際の注意点
Cataclysm:DDAの多言語対応は、実行時に翻訳ファイルから訳文を探すことで行われています。
翻訳ファイルはMODオリジナルで配布することは出来ず、MOD内でも原文と翻訳文を両方定義することは出来ないため、英語で書くか、日本語で書くかの二択になります。
気になるなら、言語ごとにMODを別にして配布するしかありません。(公式MODに掲載してもらい翻訳してもらう方法も)
各MODのファイルにはマルチバイト文字を含めることが出来るので、普通に日本語のテキストを書けます。
ただし、ファイルを保存する際は文字コードをUTF-8にする必要があります。
また、改行コードは原則としてLFであるべきです。メモ帳では出来ないので、対応しているエディタが必要になります。
*3.Readmeを見よう
開発者、MOD製作者向けにReadmeがゲームのフォルダに入っていますので、チラ見しておきましょう。
docフォルダの中がそれです。
中にはReadmeレベルのことが書かれている.mdと、サンプルMODの入ったフォルダがあります。
.mdはマークダウンファイルなのでatomなどで読めるのですが、わざわざそんなものを入れる必要はありません。
中身は英語な上、開発者向けに書かれているのでチンプンですが、MOD製作を行う上で欠かせない情報が入っています。
その内の1つを見てみましょう。
JSON_FLAGS.md
#region
----
### Categories
- ```CC_WEAPON```
- ```CC_AMMO```
- ```CC_FOOD```
- ```CC_DRINK```
- ```CC_CHEM```
- ```CC_ELECTRONIC```
- ```CC_ARMOR```
- ```CC_MISC```
----
#endregion
そうです。json中に頻繁に出てくるキーワードがまとめて書いてあるのです。(開発が進行して情報が古くなってることも稀によくある)
このCategoriesはアイテムの定義に指定する分類の一覧で、製作メニューの大分類を指しています。
こうした情報が分かっていると、ゲーム本体とMODのjsonの中から、サンプルにするjsonや記述を探すのが楽になります。
これをキーワードに、ゲーム内のフォルダツリーをgrep検索すればいいのです。
またdocフォルダにはサンプルMODも入っています。(すでに古くなって動かない、間違ってるのも…)
サンプル数は少ないものの、ゲーム中のjsonでは実現していない変わった方法が紹介されています。
*4.ソースコードをダウンロードする
ソースコードの情報が必要になることがあります。
GitHubから最新のソースコードをダウンロードしておくと役に立つでしょう。
*5.MOD製作例
ではMODの製作例を通して、少し踏み込んだ内容を見ていきましょう。
今回は「モンスターを召喚するアイテム」です。
**(1)modinfo.jsonを書く
まずは適当なMODからmodinfo.jsonをコピーしてMODの情報を書きます。
#highlight(javascript){{
{
"type": "MOD_INFO"
,"mod-type": "SUPPLEMENTAL"
,"ident": "summon_test"
,"name": "追加 - モンスター召喚アイテム"
,"author": ""
,"description": "モンスター召喚アイテムのテストです。"
,"category": "items"
,"dependencies": ""
,"path": ""
}
}}
MODの情報は世界生成の際にプレイヤーに表示されるのでわかりやすく書きましょう。
メニューの幅はせまいので文字数はかなり限られます。
categoryですが、これは何を指定すればいいのでしょう?MODリスト上の分類なのは想像が付きます。
公式MODのmodinfo.jsonを漁って良さ気なのを採用してもいいですが、指定できるものの一覧が見たいと思いませんか?
そこでソースも含めて検索していくと…
#region
#highlight(c){{
const std::vector<std::pair<std::string, std::string> > &get_mod_list_categories() {
static const std::vector<std::pair<std::string, std::string> > mod_list_categories = {
{"items", _("ITEM ADDITION MODS")},
{"creatures", _("CREATURE MODS")},
{"misc_additions", _("MISC ADDITIONS")},
{"buildings", _("BUILDINGS MODS")},
{"vehicles", _("VEHICLE MODS")},
{"rebalance", _("REBALANCING MODS")},
{"magical", _("MAGICAL MODS")},
{"item_exclude", _("ITEM EXCLUSION MODS")},
{"monster_exclude", _("MONSTER EXCLUSION MODS")},
{"", _("NO CATEGORY")}
};
return mod_list_categories;
}
}}
#endregion
直で書いてありました…。(誰だよReadme見ろとか言った奴は)
スッキリしたところで、今回はアイテムの追加なので"items"を採用です。
このように、ソースを見なければ詳細が分からないケースもたまにあります。
**(2)アイテムを追加する
次に召喚に使うアイテムを追加します。
ベースになるアイテムはマッチにします。マッチをするとモンスタ-が召喚されるわけですね。
まずはマッチの定義を探します。jsonをgrep検索して調べるわけですが、今回は"マッチ"ですので流石にmatchで検索したらヒットしますが、英語名が咄嗟に思い出せないアイテムもあると思います。
そんなときは、ゲームのデバッグメニューを使うと話が早いです。
さっそく、このMODだけを入れた捨てワールド・捨てキャラを作りましょう。
そして、デバッグメニューの「アイテムを手に入れる」を選択します。
アイテムを選ぶ画面には検索機能が付いていますので、日本語名で検索できます。
検索したアイテムの説明を見てください。右上にidが表示されます。
これはアイテムを固有に識別するidですので、これでjsonを検索すればいいわけです。
マッチを探し出せたら、jsonの内容をコピー。
新規にMODのフォルダにjsonファイルを追加して、中身をいじります。
summon_test_tools.json
#highlight(javascript){{
[
{
"id": "summon_test_matchbook",
"type": "TOOL",
"symbol": ",",
"color": "blue",
"name": "マッチ(モンスター召喚)",
"description": "マッチをスるとモンスターが出てきます!",
"price": 10,
"material": "paper",
"weight": 10,
"volume": 0,
"max_charges": 20,
"initial_charges": 20,
"charges_per_use": 1,
"use_action": {
"type": "firestarter",
"moves_cost": 15
}
}
]
}}
これでidと名前、説明書きは書けましたが、このままではモンスターは召喚できません。ただ火が付くだけです。
モンスターを召喚する方法がないか、調べなくてはいけません。
マッチには火を付ける機能があります。このjsonで言うと、use_action...の部分がその設定のようです。
use_actionは、まんま"使った時のアクション"ですから、ここに指定できるバリエーションの中に使えるものがあるかも知れません。
**(3)指定できるキーワードと、その効果を調べる
この手の「キーワード」が分からない場合は、まずReadmeを見る、です。
マッチで使われている"firestarter"のキーワードでReadme群をgrep検索してみると...
JSON_INFO.md
#highlight(javascript){{
"use_action": {
"type": "firestarter", // Start a fire, like with a lighter.
"moves_cost": 15 // Number of moves it takes to start the fire.
},
}}
ありました。そして、コメントが書かれており、ライターのように火を付けられ、火を付けるのにかかる行動コストが指定できる、と分かります。
更にJSON_INFO.md内を見ていくと、
#highlight(javascript){{
"use_action": {
"type": "place_monster", // place a turret / manhack / whatever monster on the map
"monster_id": "mon_manhack", // monster id, see monsters.json
"difficulty": 4, // difficulty for programming it (manhacks have 4, turrets 6, ...)
"hostile_msg": "It's hostile!", // (optional) message when programming the monster failed and it's hostile.
"friendly_msg": "Good!", // (optional) message when the monster is programmed properly and it's friendly.
"place_randomly": true, // if true: places the monster randomly around the player, if false: let the player decide where to put it (default: false)
"skill1": "throw", // Id of a skill, higher skill level means more likely to place a friendly monster.
"skill2": "unarmed", // Another id, just like the skill1. Both entries are optional.
"moves": 60 // how many move points the action takes.
},
}}
モンスターを配置できそうな指定がありました。これを使えばよさそうです。
このようにキーワードから追っていくことで未知の効果が実装されていることを見つけることができます。
もちろん、ゲーム内で同じことを実現できているアイテムを知っているのであれば、それを元にするのが早いです。
今回はこのJSON_INFO.mdの記述をコピーして、先ほどのマッチ(モンスター召喚)のuse_actionに指定します。
#region
#highlight(javascript){{
{
"id": "summon_test_matchbook",
"type": "TOOL",
"symbol": ",",
"color": "blue",
"name": "マッチ(モンスター召喚)",
"description": "マッチをスるとモンスターが出てきます!",
"price": 10,
"material": "paper",
"weight": 10,
"volume": 0,
"max_charges": 20,
"initial_charges": 20,
"charges_per_use": 1,
"use_action": {
"type": "place_monster",
"monster_id": "mon_zombie",
"difficulty": 1,
"hostile_msg": "失敗した!",
"friendly_msg": "召喚できた!",
"place_randomly": false,
"moves": 60
}
}
}}
#endregion