■StageInfo と CreateStage

 という名前の関数を外部から見えるようにしといてください。既存ステージのDLLソース参照。
 StageInfo は goluah本体起動時のステージ検索のときに呼び出されます。STAGEINFO構造体のポインタが引数です。そこにバージョンをコピーして終了です。TRUEを返しておいてください。
 CreateStageはゲーム中でそのステージが選択され、ロードされるときに呼ばれる関数です。STAGEINFO2構造体のポインタpdatが渡されますので、そのポインタをどっかに保存しとくといいです。(しなくてもいいけど) ここでやるべきことは、STAGEINFO2のメンバの関数ポインタに適切なポインタをセットすることです。ぜんぶ引数なし、戻り値voidの関数で、それぞれの役割は以下のとおり。

pfinit:
 描画に必要なデータなんかを読み込んどいてください。CreateStageとは呼び出されるタイミングが少し違って、この関数はキャラクターのロードが終わったあとに呼ばれます。

pfaction:
 1フレームに1回呼ばれます。動く背景をやってるときは、ここで物を動かす処理とかをやってください。

pfdraw:
 毎回描画時に呼ばれます。STAGEINFO2構造体の中にあるPFST_PACK構造体(のポインタ)の中にある関数ポインタを使って背景の描画を行ってください。注意点としては、 Z < 0.3 よりも前に描画しないこと、View , Projection 行列を変更しないこと、むやみやたらにRenderStateを変更しないこと(変更したらなるべく元に戻しといてください)などです。
 IDirect3DDevice8 のポインタがゲットできるので、かなり滅茶苦茶できると思います。
 視点は (x,y,z)=( -1〜1 , 0 , -1 ) の位置から (-1〜1 , 1-tan(40) , 0) の点を見ています。(xはキャラクターの位置により変化)大体 z=0 付近にキャラクターやエフェクト、飛び道具などがあり、背景がそれを不意に隠さないためには z > 0.3 になるよう描画してください。

pfdelete:
 対戦が終了し、DLLが開放される前に呼ばれます。pfinitで確保したメモリ等を後片付けしてください。


■STAGEINFO2構造体のその他のメンバ

・color
 システム側から要求される背景の色合いです。各頂点のディフューズ色をコレにしてください。今は「暗くする」のにしか使われていませんが、そのうちいろんな色が指定されるかもしれない。

・info1->texf
 テクスチャに使用しているフォーマットです。config.exeでユーザーが指定したヤツがここに入ります。無視しても構いませんが一応参考までに。

・info1->devtype
 デバイスのタイプ(HAL/REF/SW)です。これもconfig.exeで指定されたやつです。

・info1->name1
 Player1の名前です。CreateStageの時点ではこの値は無効なので注意です。

・info1->name2
 Player2の名前。同上。

・info1->com1
 Player1がコンピュータかどうか。同上。

・info1->com2
 Player2がコンピュータかどうか。同上。

・info2->player_x[2]
 プレイヤーのx座標。0が1Pで1が2Pです。この値はピクセル単位です。ステージ中心が0、左右画面端は±640です。描画する際にこの値を使うときには注意してください。

・info2->player_y[2]
 プレイヤーのy座標。同上。足元が0、画面上端は-400ぐらい。

・info2->player_hp[2]
 プレイヤーの体力値。同上。

・info2->center_x
 (Z=0平面での)注視位置X。これはピクセル単位の値です。変換するときは320(だと思う)で割ってください。

・info2->center_y
 (Z=0平面での)注視位置Y。同上。多分240で割るといい。

 基本的にINFOFORSTAGE(info1)には対戦中変化のないデータ、INFOFORSTAGE2(info2)は毎フレーム変化するデータ が入っています。

■DirectX8を直接使わない場合

 d3d8.h (d3dx8.h) を#includeしない場合は定義されてない型の変数がdefine_data.hに宣言されているためエラーになります。その場合は適当な変数(LPVOIDとか)に定義してエラーを回避してください(既存DLLソース参照)

■PFST_PACK各関数の説明

pf_getd3d(PFST_GETD3D):IDirect3D8* の取得
 戻り値:IDirect3D8のポインタ
あんまり使い道ないかも。

pf_getd3dd(PFST_GETD3DD):IDirect3DDevice8* の取得
 戻り値:IDirect3DDevice8のポインタ
自分で直接描画する人は必須。


pf_loadcelldat(PFST_LOADCELLDAT):セルデータ読み込み関数
 引数1:ファイル名
 引数2:CHARDAT_CELL2構造体の配列先頭のポインタ
 引数3:CHARDAT_RECT構造体の配列先頭のポインタ
キャラクター同様、Editer01/02で作成したgcdファイルを読み込みます。ただし、ビットマップは読み込んでくれないのでimage1-12.bmpにあたる部分は自分で読み込んでください。あと、2つの配列のメモリ確保・開放は自前で行ってください。関数はそれぞれ最大1024個の配列要素があるものと仮定して処理をします。


pf_loadbmp(PFST_LOADBMP):ビットマップ読み込み関数
 引数1:ビットマップのファイル名
 引数2:パレットのファイル名
 戻り値:MYSURFACEのポインタ
この関数で読み込んだビットマップは pf_ckblt 関数または pf_blt3d 関数を利用して描画することができます。第2引数にNULLを指定すると、第1引数で指定したビットマップのパレットを使用します。

pf_unloadbmp(PFST_UNLOADBMP):ビットマップ後始末関数
 引数1:MYSURFACEのポインタ
pf_loadbmp関数で読み込んだビットマップは、この関数で後始末します。


pf_celldraw(PFST_CELLDRAW):セル描画関数
 引数1:描画X座標
 引数2:描画Y座標
 引数3:セル番号
 引数4:MYSURFACEのポインタの配列の先頭のポインタ
 引数5:CHARDAT_CELL2構造体の配列先頭のポインタ
 引数6:CHARDAT_RECT構造体の配列先頭のポインタ
 引数7:X方向ミラー
 引数8:Y方向ミラー
 引数9:転送先Z座標
 引数10:転送カラー
引数4、5、6は pf_loadbmp とか pf_loadcelldat とかを利用して読み込みます。描画先の座標X,Yはキャラクターと同様で、X方向は0がステージ中心、±640が画面端です。Z座標は奥行きで、あんまし後ろのほうにすると絵がちっちゃくなっちゃいます。カラーはSTAGEINFO2のcolor (pdat->color)で指定されたものを使用することをお勧めします。アルファ値ぐらいはいじってもいいかも。


pf_ckblt(PFST_CKBLT):ビットマップの描画
 引数1:MYSURFACEのポインタ
 引数2:転送先X座標
 引数3:転送先Y座標
 引数4:ビットマップ内の転送元矩形
 引数5:拡大率X
 引数6:拡大率Y
 引数7:X方向反転
 引数8:Y方向反転
 引数9:転送Z座標
 引数10:転送カラー
pf_loadbmp 関数で読み込んだビットマップを描画します。説明を書くのに疲れてきました。いろいろ試して使ってみてください。

pf_blt3d(PFST_BLT3D):ビットマップの描画2
 引数1:MYSURFACEのポインタ
 引数2:ビットマップ内の転送元矩形
 引数3:転送先矩形
 引数4:転送カラー
pf_loadbmp 関数で読み込んだビットマップを描画します。注意点として、「転送先矩形」の単位はピクセルではありません。X方向に関してはステージ中心が0、±2x(640/480)が画面端、です。Y方向は足元が0です。


pf_getdirectory(PFST_GETDIRECTORY):ディレクトリ取得
 引数:「2」固定
この関数はキャラクターのほうにも同じのを提供しているので引数がありますが、ステージで使う場合は常に2を指定してください。pf_loadbmp とか pf_loadcelldat は、コレで得たディレクトリ名 + \ + ファイル名 でファイルを指定しないと失敗しますので注意。 なんかGetCurrentDirectoryとかやっても、DLLがある場所ではなく、本体の実行ファイルがある場所が得られてしまうのでやむなくこんな関数を実装しました。が、もしかしてこんなことしなくてもDLLの場所を知る方法ってあるのかなぁ。だれか知ってたら教えてください。