RPGツクールMV　アイコンを分解・再結合する

今回はRPGツクールMVで使われているアイコンをImageMagickを使って分解・再結合します。
なぜそんなことをするのか、そんなことを気にしているのは自分だけかもと思ったので、少々詳しくツクールのアイコンの仕様から説明していきます。

**! 注意 !**
**画像の上書きなどが行われるますので、編集前のものを退避しておくことをお勧めします。**

# アイコンの仕様
これはMV以前から（おそらく）変わっていない仕様ですが、RPGツクールで使うアイコンはタイル状に並べられて１枚の画像に収められています。
MVの場合はプロジェクト内のimg/system/IconSet.pngがその画像です。
今回は32x32のアイコンが横16縦20の320個のアイコン（空白含む）が並んだものがデフォルトで使われています。
便宜上この記事ではこの画像をアトラスと呼びます。(一般的な意味とは異なるかもしれませんが)

アイコンは左上から順に0始まりで番号が振られており、例えば横6縦12の位置にある薬草のアイコンは11行*16個+6個=182個目であり、０始まりなので番号は181になります。
ツクールのデータ内ではこの番号を使ってアイコンを参照しており、アイテムのアイコンに181が設定されている場合薬草アイコンになるわけです。

# アイコンアトラスの置き換え
このアイコンアトラスですが画像編集ツールで書き換えれば簡単に置き換え可能です。
Web上を探せばデザインし直したアイコン画像を配布している製作者様も見つかるかと思います。

さらにこの画像縦に長くするとその分使えるアイコンの枠を増やせます。
どういう事かというとデフォルトのアトラスは前述の通り320個のアイコンを含むのですが、画像を編集して縦幅を32*20=640pxから32*21=672pxにすると、一行増えて336個のアイコンを扱えるようになります。
どうやら32x32のアイコンが横に16個並んでいるというルールだけで縦の数は決まっていないようです。
ちゃんとツクールからも設定できるのでとても便利です。

ちなみに横を伸ばしてもアイコン指定できない範囲になります。(指定できたとしても番号がずれて困りますが)
コメントを書いておく領域として利用することはできるかも？

未確認ですがあまり大きくしすぎると処理負荷が上がるかと思うのでほどほどにしておきましょう。

# 置き換え時の問題
ここからが問題なのですが、
特定のアイコンを追加・編集したり、配布されているアイコンの一部だけを使うためにアトラスを編集していると、アイコンが隣の範囲にはみ出したりして見た目がおかしくなることが多々あります・・・
ただ単に私が画像編集ツールの使い方を理解できていないだけかもしれませんが、装備アイコン一つ差し替えるだけで無駄な確認＆やり直し作業が発生します。

# 解決策
非常に前置きが長くなりましたが、以上の問題の解決策がアトラスを分解・再結合することです。
アイコンの編集時にアトラス全体が必要になることはあまりなく、個々のアイコン画像が編集単位だと思われるので、編集時はバラバラにしておいて、編集が終わったらアトラスとして再結合するという考えです。

# ImageMagick
ImageMagickは画像編集用のソフトウェアです。
導入方法や詳しい説明は先人たちのとても分かりやすいものがいくらでも見つかるかと思うので割愛します。
http://www.imagemagick.org/script/binary-releases.php

公式が英語でしかもコンソールからコマンドを叩くいわゆるCUIなので敷居が高く感じますが、割と簡単かつ極めれば大体何でもできるので、ツクールを問わず画像を編集することがある方は触れておいて損はないかと思います。
コマンドを覚えてなくても調べれば似たようなことをやっている記事が見つかることが多いです。

# 分解
早速ですが分解します。
コンソール上でIconSet.pngが置いてある[プロジェクトディレクトリ]/img/system/に移動して以下のコマンドを実行します。
このようにバラバラになったアイコン画像が出力されます。
<img width="394" alt="スクリーンショット 2016-08-27 9.22.44.png" src="https://qiita-image-store.s3.amazonaws.com/0/138391/a1783659-fee2-3f88-dd6e-59a48b6010e2.png">

```
# 注意！ Macでの例になります。Windowsでは一部コマンドが異なります

# 出力先のディレクトリを作る
mkdir IconSet
# 分解する　
convert IconSet.png -crop 32x32 IconSet/%08d.png
```
まずバラバラにしたアイコンを入れるためのディレクトリを作成します。
そしてconvert -cropというコマンドを使ってIconSet.pngを32x32の画像に分解します。
IconSet/%08d.pngは出力画像のファイル名を決めているのですが、%08dという表記によって0埋めで連番を振っています。
この後の再連結時の自動ソートで使われる都合上ただの連番ではなく０埋めにしています。

# 編集
ディレクトリに出力されたアイコンを編集するのですが以下のようなルールを守る必要があります。
* サイズは一律32x32
* ファイル名は８個の0埋めの数値。そのままツクール上での番号になる
* 追加する時は欠番がないようにする

上記を守れば編集したり、置き換えたり、追加したりし放題です。

# 再結合
編集が終わったら以下のコマンドを実行すると、ディレクトリ内のバラバラのアイコンが結合されたIconSet.pngが生成されます。

```
# 注意！ Macでの例になります。Windowsでは一部コマンドが異なります

# 結合する。IconSet.pngは上書きされますのでご注意ください
montage IconSet/*.png -background none -tile 16x -geometry +0+0 IconSet.png
```

montageは指定した複数の画像を連結するコマンドです。
IconSet/*.pngでIconSetディレクトリに含まれるすべてのpng画像を連結対象にしています。
(ワイルドカードを使っているので順番は勝手に決められるのですが、ファイル名を０埋めにしていないと間違った順番で連結されます。
-background noneは背景を透明にしています。
-tile 16xで横16並べることを決めています。縦を指定しないことでファイル数から自動で判断してくれます。
-geometry +0+0でアイコン間に隙間を作らないようにしています。

# まとめ
ということで長くなりましたが、アイコンの分解・再結合についての記事でした。

本当はデフォルトのアトラスはそのままにして、個別のアイコン画像を別で持ち、プラグインで上書きしようとしていました。
しかし、それだとツクール上で確認できないし、デフォルトより大きい番号を指定できないことに気づいたため、旧ツクールで使用していたスクリプトをMV用に書き直してみたという経緯でした。

結構頑張って書きましたが、外部ツールを使っていたりしてあまり納得いっていないため、
もっとスマートな代替案がございましたら教えていただけると嬉しいです。