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

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

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

前回はスキンサイドの自動変更について書きましたが、今回はDSTオプションです。
プレイサイドで参照するオプションを変更したいことはよくあると思います。
ex) リザルトスキンでのランクなど

今回はそんなオプション参照値の一括変換をやりたいと思います。
ちなみにこれは、状況によっては数値定義などの表示データIDの一発変換にも使える
非常に優れた機能となります!!

前回の記事はこちら:

概要

今回の変換システムの概要は以下のような形になります。

  1. 変換先Excelシートの定義横の空き欄に変換テーブルを作成する
  2. 関数を用いて指定のラインに目的のテーブルを適用する

変換テーブル作成

オプション変換テーブル

上図に示す、AC列以降が変換テーブルとなっています。
意味としては、対象のデータの数値がsrcからdstに切り替わるものとなります。
詳しく見るために、この変換テーブルに線を引くと以下のようになります。

変換テーブル拡大

表上部のキャプションはなくてもいいですが、つけておくと管理が楽です。
左から意味は次のようになります。

  • number定義の参照数値変更テーブル ; L列に適用
  • DST定義のオプション変更テーブル ; S列~U列に適用
  • IF分岐のオプション変換テーブル ; B列, C列に適用

このテーブルを、前回の操作が終わった後、右側の余白に定義すればOKです。
なお、変換対応数の上限はなく、対応をいくつでも定義することができます。
変換テーブルを下にだらだらと伸ばしていくように追加しましょう。

テーブルの適用

ここからは、作成したテーブルを列単位で実際に定義していきます。

使用関数と基本理論

今回の機能の実装には、Excelに実装されている VLOOKUP 関数を使用します。
この関数とIF文による条件分岐を組み合わせることにより、置換を行います。

この関数は、ある列に縦に並んだデータから検索対象のデータを探し出し、
発見した場合にその列の横のデータ or そのデータを返す関数となります。
一番最後に「検索の型」というパラメータで対象データに最も近いデータを
返すオプションがありますが、今回はこれをオフにし、完全一致検索とします。
このとき、この関数は一致するデータがないと #N/A エラーを返します。
これを ISNA 関数で取得することで、置換を行わないデータのコピーを行います。

Excel 2013以降のバージョンを使用している場合、IFNA 関数も使用可能です。

目的の列へのテーブルの適用

変換する目的の列を、関数を使用して書き換えます。
例えば、op1を定義しているS列であれば、以下のように記述します。

=IF(LMain!S5="","",IF(LEFT(LMain!S4, 2)="op", IF(ISNA(VLOOKUP(LMain!S5,$AE$4:$AF$21, 2, FALSE)), LMain!S5, VLOOKUP(LMain!S5,$AE$4:$AF$21, 2, FALSE)), LMain!S5))
=IF(LMain!S5="","",                        // 空白チェック・空白なら空セルに
	IF(LEFT(LMain!S4, 2)="op",                 // 現在のセルは置換判定を行うセルか?
		IF(ISNA(VLOOKUP(LMain!S5,$AE$4:$AF$21, 2, FALSE)), //  行う場合: テーブルに一致するデータはあるか?
			LMain!S5,                 //   ない場合: コピー元のデータを使用
			VLOOKUP(LMain!S5,$AE$4:$AF$21, 2, FALSE)  //   ある場合: テーブルによる置換データを代入
		),
		LMain!S5                      //  行わない: コピー元のデータを使用
	)
)

ここで、「置換判定を行うセルか」の条件には例えば以下のものがあります:

  • 対象データの1つ上(コメントによる定義名称)がop1か?
     → この方法はopのみならずnumberやtypeにも使用可能
     ※LEFT関数で最初の数文字を取って複数一致させることも可能
  • 対象データの行のA列データがIF文に属する定義を宣言しているか
     →RIGHT関数で後ろ2文字を取得し、それが"IF"か確認すればよい
      検知対象: #IF, #ELSEIF

おわりに

今回、2回に分けてスキン制作でサイド変更を楽に行うためのテクニックを
紹介してきました。僕個人的には、スキンの作成時はもちろんのこと、
修正や追加機能を実装する際にも非常に早く実装が行えるようになったと
考えています。しかし、「条件に引っかかるが変更しない部分がある」といった
特殊な条件は、まだ手動で計算式に1を加えるなどの課題はあります。

今回紹介した機能は、制作したスキンのResultに完全なものが実装されています。
(Playにも実装していますがその1の一部機能のみの暫定実装となってます)
Excelファイルもパッケージに含めてたりしますので、詳細な情報を
ぜひ、そちらでも確認いただければと思います。

また、新たな実装が楽になる方法を思いついたら、このように記事に
しようと思います。また、お気づきの点があればコメントなどで教えて
頂けると非常にうれしいです!

この記事は以上となります。長文にお付き合いいただきありがとうございました。