CatSystem2 Tips!

 このページでは、マニュアルでは詳しく解説されていない(将来的には解説されるかもしれない)情報や、知っているとスクリプトを組む際に役に立つような内容を公開していきたいと思います。
 ただし、このページで公開される内容は、多くがかなりテクニカルな内容になっていますので、全ての人へ向けたものではありません。理解できない内容に関しては、普通に CatSystem を使用する場合は知らなくても問題ないものが多いですから、心配する必要はありません。
 ただし、「タイトル毎のセーブフォルダ」の項目のみは知っていないと困る部分になりますので、これだけはしっかり理解しておきましょう。

スクリプトコンパイル

◆シーンファイルの読み込みタイミング

 現状、CatSystem2 ではスクリプトファイル(.txt)をコンパイルする必要があります。スクリプトファイルがコンパイルされるタイミングは当然コンパイルしたときですが、ではコンパイルされたシーンファイル(.cst)を CatSystem2 が読み込むタイミングはいつでしょうか。
 シーンファイルが読み込まれるタイミング、それはシーンが切り替わる時です。シーンリストダイアログでシーンを選択したり、next コマンドや選択肢で次のシーンに飛んだときです。「それは当たり前だろう!」という声をあげたくなるかもしれませんが、この認識が曖昧だと組んだスクリプトの動作確認をする際に無駄な手間が発生する可能性がありますからはっきりとしておく必要があります。少なくとも、いちいちシーンリストを更新したり、CatSystem2 を再起動したりする必要はありません。
 スクリプトファイルをコンパイルしたら、即座にシーンリストダイアログで該当するシーンをダブルクリック。すべての基本です。

◆テキストエディタでコンパイル

 実践スクリプトのページでは、バッチファイルを使用したコンパイルを勧めていますが、もっと楽ちんな方法があります。それはスクリプトを組んでいるテキストエディタから、今編集しているテキストファイルを直接コンパイルしてしまうことです。
 全てのテキストエディタで出来るかと言われると、そういった機能を持ち合わせていないエディタもあるかとは思いますが、最近のテキストエディタは独自のマクロ機能を持っているものが多いです。そこで、ここでは広く使われているであろう「秀丸エディタ」を例に挙げて、マクロファイルのサンプルを用意してみたいと思います。

compile.mac
filetype_compile:
	
	#starthandle = hidemaruhandle (0);
	
	$filename = basename2;
	$current_dir = directory2;
	if( "\\" != rightstr($current_dir, 1) ){
		$current_dir = $current_dir + "\\";
	}
	
	// コンパイル前にセーブされていることを保証する
	save;
	
	if ( filetype == ".txt" ) {
		// mc.exe が scene フォルダに入っていること!
		runsync $current_dir + "mc.exe " + $filename;
	}
	
	endmacro;

 上記が、"compile.mac" というファイルの内容です。これを秀丸エディタのマクロフォルダに入れて、「メニュー>マクロ>マクロ登録」した後に「メニュー>その他>キー割り当て」で、登録したマクロを任意のキーに割り当てます。例えば、F12 などのキーに割り当てておくと、スクリプトファイルを編集した後に、そのままエディタ上で F12 キーを押すと勝手にファイルが保存されコンパイルが実行されます。(ただし、エラーメッセージは表示されないので注意)
 あとは、即座にシーンリストダイアログで該当シーンを実行。面倒なコンパイル作業が楽ちんになりました。

 (もっとも将来的に、シーンリストダイアログに機能が追加され、シーンを選択した瞬間に自動的にアップデートコンパイルがかけられるようになる予定が立っていますので、そうなればこんなマクロも必要なくなるかもしれませんが)

◆メッセージリスト

 これはマニュアルにはしっかりと書かれていますが、意外に見落としがちだったりするため、あえてここでピックアップしておきたいと思います。
 任意のシーンに飛ぶにはシーンリストダイアログで好きなシーンを選択すれば良いので簡単です。そしてスクリプトの動作を確認するために、確認したいところになるまでひたすらメッセージを飛ばして……と思いきや、そうしなくても済む方法があります。
 ういんどみる社内でも、スクリプトの動作チェックのために Ctrl キーを押して該当箇所の手前まで飛ばしたり、事前に直前の場所でクイックセーブしておいて修正後にクイックロードで該当箇所まで飛ぶことはままあります。ですがそれ以外に即座に任意の箇所へ飛ぶことも出来ます。それがメッセージリストダイアログです。
 シーンを選んだ後、ウインドウメニューから「デバッグ>メッセージリスト」を選択すると、メッセージリストダイアログが表示されます。その状態で、メッセージリストダイアログ内の任意のメッセージをダブルクリックすると、そのメッセージの箇所へ一瞬で飛ぶことが出来ます。ご活用ください。

 ただし、残念ながらこの機能は現状では完全ではありません。飛ぶことはできますが、飛んだ箇所によっては一時的に画面の更新が正常に行われていないことがあります。その場合はクリックして次のメッセージへ進めば正常に表示されたりしますので、場合によっては少し前の箇所に飛ぶなどして確認するのが良いかと思います。
 また、メッセージのない箇所(具体的にはシーンの終わり)で、直前のメッセージが表示されているなど、若干のバグが残っていたり、シーンが変わるとダイアログが消えてしまうなど、まだ改善の余地が残っていますので今後の修正をしばらくお待ちいただければと思います。

startup.xmlの設定

◆セーブフォルダ

 CatSystem2 では、セーブデータや環境ファイルなどは CatSystem2 自体が置かれているフォルダの階層下に置かれることはありません。最近の Windows の仕様に則り、Windows のユーザー毎のデータフォルダ内に保存されるようになっています。ただし、これはデフォルトでの動作であり、変更することも可能です。
 データが保存されるフォルダを変更するには、startup.xml の [FOLDER]-[save] の項目を修正します。初期設定は、%USERPROFILE%¥%brand%¥%title% となっています。%で括られている部分は、各種設定の値を使用する変数です。ここに使用できる変数は以下の通りです。

%USERPROFILE%
ウィンドウズで設定されているアプリケーションデータフォルダ(ローカル)

%ProgramData%
ウィンドウズで設定されているアプリケーションデータフォルダ(全ユーザ)

%ALLUSERSPROFILE%
同上

%brand%
Startup.xml の [APP]-[brand] の値

%title%
Startup.xml の [APP]-[title] の値

 ただし、ここで方法については解説していますが実際には [FOLDER]-[save] の項目を変更することはなるべくしないほうが良いと思います。

◆タイトル毎のセーブフォルダ

 上の項目で解説したとおり、セーブデータや環境ファイルなどは、ユーザー毎のデータフォルダに置かれ CatSystem2 自体から見ると、その場所は固定されています。ただし、CatSystem2 によって作られたタイトルがひとつだけなら良いのですが、もし複数のタイトルが同一マシンの中に存在していた場合、セーブデータや環境ファイルが他のタイトルによって上書きされてしまいます。
 そのため、オリジナルでゲームを作成する際には、セーブデータ(フォルダ)がかぶらないようにする必要があります。そのための項目が、startup.xml の [APP]-[brand] および [APP]-[title] です。
 これらの項目は名前の通りそれぞれ、「ブランド名」と「ゲームタイトル」です。この項目が他のゲームと偶然一致してしまわないように、十分に注意してください。
 

◆ゲームの解像度

 昨今の液晶モニタの画面比率は4:3から16:10などのワイドに移行しつつあります。それに合わせてゲームの解像度も変更したいということがあるかと思います。その場合は、startup.xml の [SCREEN] の項目を変更することで対応できます。それぞれの項目の詳細内容は以下の通りです。

%width%
ゲームウィンドウの幅

%height%
ゲームウィンドウの高さ

%v_width%
システム環境設定内の項目『ウィンドウサイズの幅』のデフォルト値

%v_height%
システム環境設定内の項目『ウィンドウサイズの高さ』のデフォルト値

 上記の v_width 及び v_height は、基本的には width 及び height と同じ値にしてください。例として、解像度を 1280×768 にしたい場合は以下のように設定します。

  <SCREEN>
    <width>1280</width>
    <height>768</height>
    <v_width>1280</v_width>
    <v_height>768</v_height>
    <fps>60<fps>
    <no_skip>0</no_skip>
  </SCREEN>

 ただし、現バージョンではワイド解像度の設定は出来るものの、cs2conf.exe のほうではワイド解像度が含まれていないため、こちらは次回バージョンアップで改善される予定です。

◆VRAMの使用領域

 CatSystem2 が使用するVRAM領域は、startup.xml の [TEXTURE] の項目で定義されています。この内容を変更することによって、スクリプト内で使用できるVRAMの領域を増減させることが出来るようになります。
 増やした場合にはビデオカードのVRAM容量を余計に消費することになりますし、減らす場合はプレーンとして使用できる領域が少なくなりますので動作がおかしくならないように細心の注意をする必要があります。
 [TEXTURE] 項目内の詳細は以下の通りです。

	vt
		x	横方向テクスチャ使用ブロック数
		y	縦方向テクスチャ使用ブロック数
	
	area??	(??には数値が入ります)
		sx	有効テクスチャブロックの開始X位置
		sy	有効テクスチャブロックの開始Y位置
		dx	有効テクスチャブロックの横方向ブロック数
		dy	有効テクスチャブロックの縦方向ブロック数
	
	bpp32y		32bitテクスチャブロックの開始Y位置
	bpp16y		16bitテクスチャブロックの開始Y位置
	

 上記のうち、vt は 256×256 のテクスチャを1ブロックとしたとき、縦横にそれぞれ最大何ブロック並べるかを設定します。ただし、この項目の設定のみでは実際にテクスチャは確保されません。  実際にテクスチャ領域を確保するためには、area?? の項目で設定する必要があります。公開されている startup.xml では、area00 から area03 まで確保されており、その内容は以下のようになっています。

  <TEXTURE>
    <size>
      <x>256</x>
      <y>256</y>
    </size>
    <vt>
      <x>7</x>
      <y>11</y>
    </vt>
    <area00>
      <sx>0</sx>
      <sy>0</sy>
      <dx>7</dx>
      <dy>3</dy>
    </area00>
    <area01>
      <sx>0</sx>
      <sy>3</sy>
      <dx>4</dx>
      <dy>2</dy>
    </area01>
    <area02>
      <sx>0</sx>
      <sy>5</sy>
      <dx>4</dx>
      <dy>3</dy>
    </area02>
    <area03>
      <sx>0</sx>
      <sy>8</sy>
      <dx>4</dx>
      <dy>3</dy>
    </area03>
    <bpp32y>0</bpp32y>
    <bpp16y>8</bpp16y>
    <bpp>32</bpp>
    <filter_min>1</filter_min>
    <filter_mag>1</filter_mag>
    <dither>1</dither>
  </TEXTURE>

 この設定では、area00~area03 はそれぞれ、開始位置が (0,0) (0,3) (0,5) (0,8) となっており、領域のサイズが (7×3) (4×2) (4×3) (4×3) となっていますので、図で表すと、VRAMは下のように確保されていることを意味します。

    

 VRAMの使用領域についての定義方法が理解いただけましたでしょうか。(上図のひとつのマスが 256×256 のテクスチャ領域ひとつ分を表しています)
 上記の領域のうち、area00 と area01 についてはプレーンの領域として使用され、area02 はシステム領域、area03 はフォント領域として使用されています。ただし、これもあくまでデフォルト状態のもので、必ずしも area02 がシステム領域になるとは限りません。どの領域が何の用途に使われるかは、また別の場所で定義されていますのでご注意ください。
 ここで理解して欲しい内容は、[TEXTURE] の定義項目はあくまでもテクスチャ領域を確保するだけだということです。それぞれの領域を何の用途で使用するかの設定方法は、また別の項で解説します。

 とは言うものの、ここで理解することがもう一つだけあります。それは上の図で赤い枠線で囲われた部分ですが、ここはテクスチャが 32bit(フルカラー)ではなく 16bit(ハイカラー) となっています。 16bit テクスチャ領域はフォント用に使用されます。16bit 領域の指定は上記に詳細をのせたうちの bpp16y の項目で設定します。これは 16bitテクスチャ領域の開始Y位置を指定することになっていますが、上の設定では 8 が指定されています。なので、Y位置が 8以上の赤い枠の部分が 16bit テクスチャ領域であることを意味するようになっています。

◆VRAMの領域定義

 startup.xml で定義したVRAMを、システム内でどのように使用するかは kcs/vram.xml にて設定します。

  <imagelist>
    <width>1792</width>
    <height>1280</height>
  </imagelist>

 上の設定は、プレーンで使用する領域(スクリプト実行中に P ボタンを押すと一括表示される領域)のサイズをピクセル単位で指定するものです。

  <vram>
    <all>
      <x>0</x>
      <y>0</y>
      <width>1792</width>
      <height>2816</height>
    </all>
    <game>
      <x>0</x>
      <y>0</y>
      <width>1792</width>
      <height>1280</height>
    </game>
    <system>
      <x>0</x>
      <y>1280</y>
      <width>1024</width>
      <height>768</height>
    </system>
    <font>
      <x>0</x>
      <y>2064</y>
      <width>1024</width>
      <height>768</height>
    </font>
  </vram>

 上の設定は、プレーン領域・システム領域・フォント領域のVRAM内での位置とサイズをピクセル単位で指定するものです。
 all の領域サイズは、startup.xml の [TEXTURE]内の vt の値 x と y にそれぞれテクスチャサイズ 256 をかけた値を指定します。デフォルトでは、それぞれ 7 と 11 が入っていますので、それぞれに 256 をかけて、1792 と 2816 が設定されています。
 game 領域は、プレーンで使用する領域となります。デフォルトでは、[TEXTURE]内の area00 と area01 を含んだ領域が設定されています。なお、ここで領域を設定しても、startup.xml の [TEXTURE] 内でテクスチャが確保されていない領域は使用できませんのでご注意ください。(使用しても正しく表示が行われません)
 system 領域は、メッセージウインドウや履歴ウインドウなど、システム側で使用する画像データが置かれる領域になります。このサイズは、最低1画面分の面積を確保する必要があります。なお、開始座標を game領域のすぐ下にするなどして、game領域と重ならないように注意してください。
 font領域は、文字を描画するための領域です。通常、[TEXTURE]の設定で 16bit テクスチャとして確保した領域を使用するようにします。これも、他の領域と重ならないように注意してください。

◆ワイド画面設定方法の実際

 上記の項目で説明した内容を駆使すれば、CatSystem2 をワイド画面仕様で動作させることも可能になります。ただし、若干説明が足りない項目もあるので、実際のワイド画面化の例を公開します。
 ここではとりあえず、1280×768 の解像度で動作させる手順を示します。

  <SCREEN>
    <width>1280</width>
    <height>768</height>
    <v_width>1280</v_width>
    <v_height>768</v_height>
    <fps>60</fps>
    <no_skip>0</no_skip>
  </SCREEN>

 まずは上記のように、画面解像度の設定を行います。

  <TEXTURE>
    <size>
      <x>256</x>
      <y>256</y>
    </size>
    <vt>
      <x>10</x>
      <y>12</y>
    </vt>
    <area00>
      <sx>0</sx>
      <sy>0</sy>
      <dx>10</dx>
      <dy>3</dy>
    </area00>
    <area01>
      <sx>0</sx>
      <sy>3</sy>
      <dx>5</dx>
      <dy>3</dy>
    </area01>
    <area02>
      <sx>0</sx>
      <sy>6</sy>
      <dx>5</dx>
      <dy>3</dy>
    </area02>
    <area03>
      <sx>0</sx>
      <sy>9</sy>
      <dx>5</dx>
      <dy>3</dy>
    </area03>
    <bpp32y>0</bpp32y>
    <bpp16y>9</bpp16y>
    <bpp>32</bpp>
    <filter_min>1</filter_min>
    <filter_mag>1</filter_mag>
    <dither>1</dither>
  </TEXTURE>

 次はテクスチャ領域を確保します。1画面が 1280×768 だとすると、ひとつのテクスチャを 256×256 として、1画面に 5×3 の合計15枚のテクスチャが必要となります。
 上記では、area00 と area01 で、プレーン用の領域として3画面分を確保しています。そしてシステム用とフォント用で、それぞれ1画面分ずつ確保しています。

  <imagelist>
    <width>2560</width>
    <height>1536</height>
  </imagelist>

 プレーン領域として、10×6 のテクスチャを確保したので、[imagelist] はそれぞれにテクスチャサイズの 256 をかけて、2560×1536 となります。

  <vram>
    <all>
      <x>0</x>
      <y>0</y>
      <width>2560</width>
      <height>3072</height>
    </all>
    <game>
      <x>0</x>
      <y>0</y>
      <width>2560</width>
      <height>1536</height>
    </game>
    <system>
      <x>0</x>
      <y>1536</y>
      <width>1280</width>
      <height>768</height>
    </system>
    <font>
      <x>0</x>
      <y>2304</y>
      <width>1280</width>
      <height>768</height>
    </font>
  </vram>

 そして、それぞれのVRAM領域を何の用途に使用するのかを定義します。
 all は全ての領域なので、[TEXTURE]内の vt の値 10×12 にそれぞれ 256 をかけて、2560×3072 となります。
 game領域は先ほどの [imagelist] と同様、システム領域は game領域の下に1画面分、フォント領域はさらにその下に1画面分で定義しています。
 これでVRAMの確保は出来ました。

  <plane>
    <pl00>
      <x>0</x>
      <y>0</y>
      <width>1280</width>
      <height>768</height>
      <disp>1</disp>
      <shift_x>0</shift_x>
      <shift_y>0</shift_y>
    </pl00>
    <pl01>
      <x>1280</x>
      <y>0</y>
      <width>1280</width>
      <height>768</height>
      <disp>1</disp>
      <shift_x>0</shift_x>
      <shift_y>0</shift_y>
    </pl01>
    <pl02>
      <x>0</x>
      <y>768</y>
      <width>1280</width>
      <height>768</height>
      <disp>1</disp>
      <shift_x>0</shift_x>
      <shift_y>0</shift_y>
    </pl02>
    <pl03>
      <x>0</x>
      <y>0</y>
      <width>2560</width>
      <height>768</height>
      <disp>0</disp>
      <shift_x>0</shift_x>
      <shift_y>0</shift_y>
    </pl03>
    <pl04>
      <x>0</x>
      <y>0</y>
      <width>1280</width>
      <height>1536</height>
      <disp>0</disp>
      <shift_x>0</shift_x>
      <shift_y>0</shift_y>
    </pl04>
  </plane>

 VRAM領域は確保できても、プレーンの初期状態を設定しておかないと不便になります。上記の設定は pl コマンドで全プレーン初期化したときの状態を定義する部分になります。ここでは、プレーン 0~2 でそれぞれ1画面分ずつ、横2画面のプレーンと縦2画面のプレーンをそれぞれ 3 と 4 に非表示状態で設定するようにしています。

  <VRAM>
    <wnd_x>0</wnd_x>
    <wnd_y>1536</wnd_y>
    <str_x>0</str_x>
    <str_y>2304</str_y>
    <name_x>1024</name_x>
    <name_y>2304</name_y>
    <wait_x>1280</wait_x>
    <wait_y>1536</wait_y>
  </VRAM>

 最後にもう少しだけ設定が残っています。メッセージウインドウ画像を実際に置くVRAM座標をここで定義しておく必要があります。wnd_x と wnd_y の座標をシステム領域と同じ座標に割り当てます。同様に、str_x と str_y の座標をフォント領域と同じ座標に割り当てます。さらにキャラクター名を置く領域を、とりあえずフォント領域の右端のほうに設定します。

 以上で基本の設定は完了です。cs2_open.exe を起動してみてください、ちゃんとワイド画面で表示されたでしょうか? タイトル画面の右下の領域が黒いままなのは後でなんとかするとして、とりあえずスクリプトを実行してみましょう。ここでは実践スクリプトで公開している 0213_02c を実行してみることにします。

 実行すると、上のような画面になるかと思います。やはり右下がスカスカなのが寂しいですね。
 画像データがそのままなので当然といえば当然なので仕方のないところですが、せめてメッセージウインドウだけでも正しい大きさに変えてみたいと思います。元となる画像データがCS2フルセットの中に、"画像素材/画面関係/@メッセージウインドウ.psd" というファイル名で収録されていますので、これを Photoshop で開いてみましょう。(レイヤーセットが使用されているため、Photoshop7 以降のバージョンである必要があります)
 PSDファイルを開いたら、何も考えずにメニューから「イメージ→画像解像度」を選択し、画像を無理矢理拡大させてみます。ワイド仕様にするため、1280×768 の大きさに拡大してください。
 拡大できたら、とりあえず別名で保存しておきます。ファイル名は"@ワイドメッセージウインドウ.psd" とか何でもかまいません。

 次はデータの変換です。CS2ツールの中の、WGC.exe を使用し画像をコンバートします。
 WGC.exe を起動し、先ほど保存したファイルをドラッグ&ドロップで放り込んだら、WGC の設定メニューを開き、下のように設定してください。

 設定できたら、OKを押してコンバートを実行します。コンバートを確実に行うために、ここでは「全てコンバート!」を実行してください。
 実行すると、"meswnd.hg3" というファイルが作成されますので、これを CatSystem2 の image フォルダに上書きコピーしてください。そして再度 CatSystem2 を起動し直して、先ほどのスクリプトを実行してみましょう。

 どうでしょうか、上のような画面になれば成功です。これでワイド画面のゲームらしくなりました。
 あとは、背景CGや立ちキャラCGなども同様に加工を行い、改めてスクリプトを組んでいけばまさにワイド画面のゲームっぽくなりますね。

 ところで、ここで何か不思議なことに気づかないでしょうか。メッセージウインドウの画像は拡大したけれど、プログラムは何も修正していません。でもこの状態でメッセージウインドウ上のボタンにカーソルを合わせてみると、判定座標や表示座標がくずれることなく、きちんと正常に動作しています。
 普通であれば、判定座標や表示座標が狂って表示がおかしくなってしまうはずなのですが、そんなことはありません。実は CatSystem2 では PSDデータの情報を元に、プログラムの修正をかけなくても、画面のレイアウトを自由に変えられる仕様になっているのです。なので画面のデザインやレイアウトを変えても、そのまま画像データをコンバートすればすぐにゲームに反映できてしまう、デザイナーさんに優しい(そしてプログラマーは楽ちんな)お手軽仕様なのです。
 とりあえず詳しい説明はまた別の機会にすることにしますので、興味のある方はPSDデータの中身を覗いてみてください。レイヤー名がやや複雑になっていますが、サンプルを元にレイヤー名を変更しないよう中の画像データだけ修正すれば良いのでさほど難しいこともないかと思います。

 さて、本題に戻って完全ワイド対応、といきたいところなのですが、実は現状の公開バージョンではワイド化への対応が若干不十分となっているようです。次期公開バージョンではその辺りも修正されるかと思いますので、今しばらくお待ちください。
 やや中途半端ですが、現状ではここまでとしておきたいと思います。