(3)eventScn.cpp/h イベント(シナリオ)システム本体。
と中核システムの登場です。
まず、ヘッダから行ってみましょう!
[eventScn.h]
●ヘッダ先頭部分
ヘッダ先頭には、今後のメンテのためシナリオ命令一覧をコメントして書き残しておきます。
#ifndef INCLUDE_EVENT_SCN_H
#define INCLUDE_EVENT_SCN_H
#include "mapMove.h"
//----------------------------------------------------------------------
// シナリオ命令表
//----------------------------------------------------------------------
//┌───────┬────────┬──────────┬────────┬───────────────────────┐
//│コマンド名 │パラメータ文字列│パラメータ数値1 │パラメータ数値2 │機能 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_MES │メッセージ │一文字づつの出力有無│使用する │メッセージの出力。 │
//│ │ │ │ウィンドウ │ │
//│ │ │ │のタイプ │ │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_PLY_POS │NULL │x │y │自キャラの位置を変えます。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_PLY_EPOS │NULL │イベント番号 │ │自キャラの位置をイベント番号の位置にします。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_PLY_MUKI │NULL │方向 │ │自キャラの方向を変えます。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_MAP_CHG │マップ名 │EVENT番号 │ │マップを変更します。 │
//│ │ │ │ │EVENT番号は出現ポイントのイベント番号。 │
//│ │ │ │ │マップチェンジに遷移。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_CHR_MUKI │NULL │キャラ番号 │方向 │マップ固有キャラの方向を変えます。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_CHR_ANM │NULL │キャラ番号 │アニメ有無 │マップ固有キャラのアニメ有無を設定します。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_SHOP │NULL │SHOP番号 │ │お店に入る │
//│ │ │ │ │ or │
//│ │ │ │ │宿に泊まります(セーブします)。 │
//│ │ │ │ │SHOPへ遷移。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_BOSS_BTL │NULL │敵番号 │ │ボスとのバトル。 │
//│ │ │ │ │バトルに遷移。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_ENDING │NULL │ │ │エンディングに入ります。 │
//│ │ │ │ │エンディングへ遷移。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_EXIT │NULL │ │ │イベントを抜けます。 │
//│ │ │ │ │マップ移動へ遷移。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_LABEL │ラベル名 │ │ │ラベル名を定義します。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_GOTO │ラベル名 │ │ │ラベル名にジャンプします。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_IF_SKIP │文字列 │シナリオ変数番号 │IFの条件 │変数と条件一致する文字列なら │
//│ │ │ │==,!=などの │次のイベント命令をスキップします。 │
//│ │ │ │条件フラグ │ │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_SET_VAR │文字列 │シナリオ変数番号 │ │変数に文字列を設定します。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│EVENT_ADD_VAR │NULL │シナリオ変数番号 │加算値 │変数の文字列を数値変換して加算します。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_IF_TBOX │NULL │宝箱の番号 │ │宝箱が空いていなかったら │
//│ │ │ │ │次の命令をスキップします。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_SET_TBOX │NULL │宝箱の番号 │ │宝箱を開けたことを覚えます。 │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_GET_ITEM │NULL │アイテム番号 │ │アイテムを袋に入れます。 │
//│ │ │ │ │もし袋がいっぱいなら次の命令をスキップします。│
//└───────┴────────┴──────────┴────────┴───────────────────────┘
続いて定数ですが、結構色々あります。
まずイベントの種別です。
設計編で書いた内容と被りますが、システムイベントが3種類。
初期スタート、ゲームロード、マップチェンジの受けの3種類で、EVENT_SYSTEM_MAXはその個数で配列を宣言するときに使います。
システムイベントは必ず、EVENT_SYSTEM_MAXの前に追加する必要があります。
順番を変えると定義で問題が起こるで順番は変えないで追加する様にしてください。
EVENT_TYPE_MAPは、地形で発生するイベント。EVENT_TYPE_CHARは町人や宝箱で発生するイベントです。
シナリオ命令は、命令の名前と番号を定義します。
一覧とは違い、SCN_ENDが先頭(0番)に追加されていますが変なバグを避けるためでもあります(これだけで防げるわけではありませんが)。
必須ですのでシナリオを書くときは注意してください。
// イベントの種別
enum {
EVENT_TYPE_NEW_START, // 初期スタート時イベント
EVENT_TYPE_GAME_LOAD, // ゲームロード時イベント
EVENT_TYPE_MAP_CHANGE, // マップチェンジ受けイベント
//←ここ移行に付け足していくこと。
EVENT_SYSTEM_MAX, // ↑ここまでがシステム・イベント ↓ここからは複数あるマップ関連イベント
EVENT_TYPE_MAP, // 地形のイベント
EVENT_TYPE_CHAR, // キャラクタのイベント
};
// シナリオ命令
enum {
SCN_END, // シナリオの終端を示すコマンドで必須です。SCN_GOTOのストッパでもあります。
SCN_MES, // メッセージの出力
SCN_PLY_POS, // 自キャラの位置を変えます。
SCN_PLY_EPOS, // 自キャラの位置をイベント番号の位置にします。
SCN_PLY_MUKI, // 自キャラの方向を変えます。
SCN_MAP_CHG, // マップを変更します。
SCN_CHR_MUKI, // マップ固有キャラの方向を変えます。
SCN_CHR_ANM, // マップ固有キャラのアニメ有無を設定します。
SCN_SHOP, // お店に入るor宿に泊まります(セーブします)。
SCN_BOSS_BTL, // ボスとのバトル。
SCN_ENDING, // エンディングに入ります。
SCN_EXIT, // イベントを抜けます。
SCN_LABEL, // ラベル名を定義します。
SCN_GOTO, // ラベルにジャンプします。
SCN_IF_SKIP, // 変数と一致する文字列なら次のイベント命令をスキップします。
SCN_SET_VAR, // 変数に文字列を設定します。
SCN_ADD_VAR, // 変数の文字列を数値変換して加算します。
SCN_IF_TBOX, // 宝箱が空いていなかったら次の命令をスキップします。
SCN_SET_TBOX, // 宝箱を開けたことを覚えます。
SCN_GET_ITEM, // アイテムを袋に入れます。もし袋がいっぱいなら次の命令をスキップします。
SCN_CMD_MAX, // イベント(シナリオ)命令の個数
};
●シナリオ用のウィンドウのタイプ
シナリオで使うウィンドウのタイプです。増やす場合は、ここに追加してください。
後で出てきますが、内部テーブルのs_scnWndDataと連動しています。
●各イベントの個数
マップ地形のイベント数のキャラクタのイベント数です。
それぞれ固定で、今回は0x40(16進)=64個(10進)としました。
これはイベント・レイヤーの使い方の問題ですのでイベント・レイヤーの使い方に合わせて変更する事が出来ます。
覚えておいてください。
●シナリオ変数番号
シナリオ変数の定義です。
とりあえず使いそうなのを2個定義してありますが、必要に応じて追加します。
// シナリオ用のウィンドウのタイプ
enum {
SCN_WND_MSGU, // セリフ用ウィンドウ上段
SCN_WND_MSGD, // セリフ用ウィンドウ下段
SCN_WND_MAX, // ウィンドウの個数
};
// 各イベントの個数
#define MAP_EVENT_NUMS (0x40) // マップ地形のイベント数
#define CHAR_EVENT_NUMS (0x40) // キャラクタのイベント数
// シナリオ変数番号
enum {
// システム・シナリオ変数
SCNVAR_BEFORE_MAP_NAME, // マップチェンジ前のマップの名前
SCNVAR_BEFORE_MAP_EVENTNO, // マップチェンジ前のマップのイベント番号
// シナリオの進行に応じて必要なシナリオ変数
SCNVAR_MAX, // シナリオ変数の個数
};
●各種定数
SCNVAR_LENGTH_MAXはシナリオ変数に格納できる文字の最大長+1のサイズです。
TBOX_MAXは、宝箱の開けた開けないの管理個数ですが小さなRPGですので32個までしか管理しません。
DQ1並に管理しようと思ったら、ちゃんと調べてませんが100~200個ぐらいは必要だと思います。
●event_Mainの戻り値
event_Mainから状態遷移のための戻り値です。
// 各種定数
#define SCNVAR_LENGTH_MAX 32 //シナリオ変数の文字列最大バイト数
#define TBOX_MAX 32 //宝箱の最大個数
// event_Mainの戻り値
enum {
EVENT_RTN_CONTINE, //イベント継続
EVENT_RTN_MAPMOVE, //マップ移動へ遷移。
EVENT_RTN_MAPCHANGE,//マップチェンジに遷移。
EVENT_RTN_SHOP, //SHOPへ遷移。
EVENT_RTN_BATTLE, //バトルに遷移。
EVENT_RTN_ENDING, //エンディングへ遷移。
};
●シナリオ定義構造体
シナリオ命令とパラメータを定義するための構造体です。
設計編で書いた通り、命令とパラメータとして文字列と2つの数値パラメータがあります。
●イベント構造体
イベントをシナリオを接続するための構造体です。
イベント番号でシナリオ定義配列のポインタを得ることが出来ます。
EVENT_SYSTEM_MAXで自動的に拡張されますが、enum順番には注意してください。
// シナリオ定義構造体
typedef struct {
int scnCmd; //シナリオ命令
char *str; //文字列
int p1; //数値パラメータ1
int p2; //数値パラメータ2
} ScnData_t;
// イベント構造体
struct tag_EventData {
ScnData_t *eventSystemScn[EVENT_SYSTEM_MAX];//システムイベントのシナリオ・ポインタ
ScnData_t *mapScn[MAP_EVENT_NUMS]; //地形イベントのシナリオ・ポインタ。
ScnData_t *charScn[CHAR_EVENT_NUMS]; //キャラクタイベントのシナリオ・ポインタ。
};
シナリオ変数の配列と宝箱状態の配列です。
セーブされるデータです。
// シナリオ変数(文字列)
extern char g_scnVar[SCNVAR_MAX][SCNVAR_LENGTH_MAX];
// 宝箱状態変数。FALSE:開けていない宝箱。TRUE:開けた宝箱
extern char g_tboxState[TBOX_MAX];
●関数の宣言
event_Init()。イベントシステムの変数などを初期化します。スタート時のマップ名をここで指定してください。
event_SetEventDataTable()。アップロード毎にイベント情報ポインタを設定してください。
event_GetLoadMapName()。シナリオや初期化で設定された今から読み込む予定のマップの名前を返します。
event_SetEvent()。今から発生させるイベントの情報を設定します。
event_Main()。イベントを実行して、次の遷移状態を返します。
event_Draw()。イベントに関連するウィンドウなどを表示します。
// イベントシステムの初期化。
extern void event_Init(char *startMapName);
// 読み込んだマップのイベント情報ポインタを設定する。
extern void event_SetEventDataTable(struct tag_EventData *EventDataTable);
// 読み込み設定されたマップの名前
extern char* event_GetLoadMapName();
// 起動するイベントの情報を設定する。
extern void event_SetEvent(int eventType,int eventNo);
// イベントを実行する。
extern int event_Main(int frame,MapMoveInfo_t *mapMoveInfo);
// イベントを描画する。
extern void event_Draw(int frame);
次は、eventScn.cppです。