・∀・のBMSコンテンツ制作日記

LR2向け自作スキン"spaaaarking!!"をはじめとする自作コンテンツの制作日記を公開しています。

【技術情報】スキンのサイド変更を(ほぼ)自動でやろう! その1

今回は開発者向けの記事を 偉そうに 少し書いてみようと思います。

スキン制作者ならご存知の通り、スキン制作にはcsvを使用します。
各定義の詳しい説明は.RED様が既に丁寧にまとめてくれています
ので、こちら( LR2SkinHELP 第八版 )を参考にしてもらうとして、
この記事(シリーズ)ではほぼ全自動でのスキンサイドの変更を自分なりに
行ってみようと思います。
話すと結構長くなるので、今回は座標の自動的な移動を実装してみます。

前提条件として、実装にExcelの関数機能を使用します。
よって、スキンの編集などもExcelにて行います。

テンプレートの制作

はじめに、好きな方のサイドの制作を行います。
ただし、プレイサイドによる画像の変更が生じる画像は、以下の
図のようにその画像と同じサイズの空白を右側or下側に開けておく
ようにします。この理由は後程説明します。(赤がそのサイドで使用
する画像、青が他のサイドで使用する画像となります)
また、リソース定義と描画定義は別ファイルとすることをお勧めします。
リソース画像の配置方法

次に、Excelに通常のスキンのデータをコピー(もちろんExcel上で
作ってもOK)し、ここにさらに追加情報を加えていきます。最終的な
追加後の状況を以下に示します。
初期定義オプション1

では、図のV列から順に意味と記述内容を説明していきます。

V列について:

V列では、その行がどの定義を実装しているか確認するため、
A列の内容をコメントとする形でコピーします。この行は関数を
実装して使用し、例えば10行目なら以下のような記述となります。

=IF(LEFT(A10,2)="//", "", "//") & A10
W列について:

W列では、変換時にその行で使用されるパラメータの表示を行います。
パラメータはY列、およびZ列で定義します。この行は関数を
実装して使用し、例えば10行目なら以下のような記述となります。

=IF(LEFT(V10,7)="//#SRC_", Y10, IF(LEFT(V10,7)="//#DST_", Z10, ""))
X列について:

X列では、DST_NUMBER定義の変換時に移動量を調節するために
定義した数値の表示桁数がコピーされます。この行は関数を実装して
使用し、例えば10行目なら以下のような記述となります。

= IF(LEFT(V10, 7)="//#SRC_", IF(N10<1, 1, IF(AND(MOD($H10*$I10, 24)=0, MOD($H10*$I10, 10)<>0), 1+N10, N10)), X9)
Y列について:

Y列では、画像の切り出しを行う際にプレイサイドによる画像変更の
有無を指定します。これが先ほどプレイサイド別の画像を並べて
配置する目的で、以下の数値を手動で入力することで切り出し画像を
自動的に変更することが可能になります。
 0: 同一の画像を使用する
 1: その画像の右側のものを使用する(xがwだけ移動する)
 2: その画像の下側のものを使用する(yがhだけ移動する)

Z列について:

Z列では、画像の配置位置の調整を手動で行います。
 数値: その数値だけ画像が右側に配置される(xに加算される)
 F: 位置、画像幅に応じて左右対称位置に自動的に画像を配置する

注意点:

ここまで記述した追加情報は、オートフィルなどでデータのある行
すべてにコピーをしてください。
また皿の定義など描画定義がV列まで割り込む場合は、以下のものを含め
すべての定義を実装したのちに行を挿入すると手動でコードを
変えずに対応を行うことが可能です。

他のスキンサイドの実装

上記の準備ができたら、いよいよ自動でサイド変更するための
変更側の作成に取り掛かります。新しいスキンサイドの実装は
Excelで新規シートを作成し、このシート上で行います。

ベースとなる関数:

以下の説明では、変更元のデータのあるシート名が「LMain」で
あるとして話を進めます。他のサイドは基本的に関数で実装します。
まず、元データのコピーを行います。新規作成したシートの
元データのあるセルに関数を入力することで行います。
例えば10行目H列なら以下の記述となります。

=IF(LMain!H10="", "", LMain!H10)
A列について:

A列では、必要に応じて1P用の定義を2P側に書き換える必要があります。
例えば10行目なら以下のような記述で対応します。

=IF(LMain!A10="","",SUBSTITUTE(LMain!A10,"1P","2P"))
D列について:

D列では、x方向の画像の切り出し位置や配置位置の移動を行います。
例えば10行目なら以下のような記述で対応します。
長いので改行しながら、どこがどの部分が分かりやすく記述してみます。

=IF(LMain!D10="", "", IF(LEFT(LMain!$A10,5)="#SRC_", IF(LMain!$W10=1, LMain!D10+LMain!$F10, LMain!D10), IF(LEFT(LMain!$A10,5)="#DST_", IF(LMain!$W10="F", LMain!$F$3-LMain!D10-LMain!$F10*LMain!$X10, LMain!D10+LMain!$W10), LMain!D10)))
=IF(LMain!D10="",
	"",                               // D10が空の場合
	IF(LEFT(LMain!$A10,5)="#SRC_",
		IF(LMain!$W10=1, LMain!D10+LMain!$F10, LMain!D10),   // D10が切り出し位置x方向移動の場合
		IF(LEFT(LMain!$A10,5)="#DST_", 
			IF(LMain!$W10="F",               // D10がDST定義の場合
				640-LMain!D10-LMain!$F10*LMain!$X10,  // フリップ時
				LMain!D10+LMain!$W10          // 平行移動時
			), 
		LMain!D10)                       // D10がSRC/DST定義でない場合
	)
)
E列について:

E列では、y方向の画像の切り出し位置の移動を行います。
例えば10行目なら以下のような記述で対応します。
長いので改行しながら、どこがどの部分が分かりやすく記述してみます。

=IF(LMain!E10="", "", IF(LEFT(LMain!$A10,5)="#SRC_", IF(LMain!$W10=2, LMain!E10+LMain!$G10, LMain!E10), LMain!E10))
=IF(LMain!E10="", 
	"",                   // E10が空の場合
	IF(LEFT(LMain!$A10,5)="#SRC_", 
		IF(LMain!$W10=2, 
			LMain!E10+LMain!$G10,  // E10が切り出し位置y方向移動の場合
			LMain!E10        // E10がSRC定義だがそうでない場合
		), 
		LMain!E10            // E10がSRC定義でない場合
	)
)

以上の操作を行う事で座標の自動移動が可能になります。
こうするといいところは実装後の修正も楽になること、新規機能
実装時に行の挿入をしてから再度オートフィルをかけるだけで
その機能が各プレイサイドにすぐ実装できることなどが挙げられます。

今回はここまでとなります。
次回は他サイドで簡単に、しかも分かりやすくdst_optionの書き換えを
行う方法について、今回のデータをベースに説明しようと思います。