簡単RPG講座12-3。お店と宝箱。その3

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 14年前
住所: 東海地方
連絡を取る:

簡単RPG講座12-3。お店と宝箱。その3

投稿記事 by softya(ソフト屋) » 14年前

いよいよ、お店と宝箱の最終段階です。
シナリオ処理の機能を追加して、お店と宝箱を組み込みましょう。
あとシナリオを変更します。

[eventScn.h]
イベントヘッダは、関数などを追加します。
●ヘッダの追加
パーティ処理のヘッダを追加します。

CODE:

#include "party.h"
●シナリオ命令表
シナリオ命令表は実は誤字修正だけです。

CODE:

//----------------------------------------------------------------------
//	シナリオ命令表
//----------------------------------------------------------------------
//┌───────┬────────┬──────────┬────────┬───────────────────────┐
//│コマンド名    │パラメータ文字列│パラメータ数値1     │パラメータ数値2 │機能                                          │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_MES       │メッセージ      │一文字づつの出力有無│使用する        │メッセージの出力。                            │
//│              │                │                    │ウィンドウ      │                                              │
//│              │                │                    │のタイプ        │                                              │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_PLY_POS   │NULL            │x                   │y               │自キャラの位置を変えます。                    │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_PLY_EPOS  │NULL            │イベント番号        │                │自キャラの位置をイベント番号の位置にします。  │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_PLY_MUKI  │NULL            │方向                │                │自キャラの方向を変えます。                    │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│SCN_MAP_CHG   │マップ名        │                    │                │マップを変更します。                          │
//│              │                │                    │                │マップチェンジに遷移。                        │
//├───────┼────────┼──────────┼────────┼───────────────────────┤
//│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            │アイテム番号        │                │アイテムを袋に入れます。                      │
//│              │                │                    │                │もし袋に入ったら次の命令をスキップします。    │
//└───────┴────────┴──────────┴────────┴───────────────────────┘
●定数
シナリオ命令も誤字の修正。
MES_SPEEDは定数化しました。

CODE:

//	シナリオ命令
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,	//	イベント(シナリオ)命令の個数
};

#define MES_SPEED	5			//	メッセージ速度
●関数の宣言
お店のイベント関係の拡張です。

CODE:

//	シナリオで設定されたSHOP番号を得る。
extern int event_GetShopNo();

//	イベントを実行する。
extern int event_Main(int frame,MapMoveInfo_t *mapMoveInfo,PlayerParam_t *playerParam);
以上がヘッダです。
[eventScn.cpp]
イベント処理のプログラム本体にお店と宝箱の処理を追加します。
●内部関数(シナリオ命令)
今回追加されるシナリオ命令の関数です。

CODE:

static int scn_CharMuki(ScnData_t *scnData);
static int scn_Shop(ScnData_t *scnData);
static int scn_IfTBox(ScnData_t *scnData);
static int scn_SetTBox(ScnData_t *scnData);
static int scn_GetItem(ScnData_t *scnData);
●定数
上と同様にシナリオ関数を追加します。

CODE:

//	シナリオ命令を実行する関数ポインタ。シナリオ命令のenum並びと同一にすること。
const CmdFunc_t s_scnCmdFunc[SCN_CMD_MAX] = {
	scn_Exit,			//SCN_END		シナリオの終端を示すコマンドで必須です。SCN_GOTOのストッパでもあります。
	
	scn_Message,		//SCN_MES		メッセージの出力
	scn_PlayerPos,		//SCN_PLY_POS	自キャラの位置を変えます。
	scn_PlayerEvtPos,	//SCN_PLY_EPOS	自キャラの位置をイベント番号の位置にします。
	scn_PlayerMuki,		//SCN_PLY_MUKI	自キャラの方向を変えます。
	scn_MapChange,		//SCN_MAP_CHG	マップを変更します。 
	scn_CharMuki,		//SCN_CHR_MUKI	マップ固有キャラの方向を変えます。
	NULL,				//SCN_CHR_ANM	マップ固有キャラのアニメ有無を設定します。
	scn_Shop,			//SCN_SHOP,    	お店に入るor宿に泊まります(セーブします)。
	NULL,				//SCN_BOSS_BTL	ボスとのバトル。
	NULL,				//SCN_ENDING	エンディングに入ります。
	scn_Exit,			//SCN_EXIT		イベントを抜けます。
	scn_Label,			//SCN_LABEL		ラベル名を定義します。
	scn_Goto,			//SCN_GOTO		ラベルにジャンプします。
	scn_IfSkip,			//SCN_IF_SKIP	変数と一致する文字列なら次のシナリオ命令をスキップします。
	NULL,				//SCN_SET_VAR	変数に文字列を設定します。
	NULL,				//SCN_ADD_VAR	変数の文字列を数値変換して加算します。
	scn_IfTBox,			//SCN_IF_TBOX	宝箱が開いていなかったら次の命令をスキップします。
	scn_SetTBox,		//SCN_SET_TBOX	宝箱を開けたことを覚えます。
	scn_GetItem,		//SCN_GET_ITEM	アイテムを袋に入れます。もし袋に入ったら次の命令をスキップします。
};
●構造体
プレーヤー情報(playerParam)とショップ番号(shopNo)を保持するようになりました。

CODE:

//	イベント(シナリオ)制御構造体
typedef struct {
	//	制御に必要なデータ
	struct tag_EventData *EventDataTable;	//	今有効なイベント情報ポインタ
	MapMoveInfo_t *mapMoveInfo;		//	マップ移動に関連したデータ
	PlayerParam_t *playerParam;		//	プレイヤー情報
	//	「ロードする」あるいは「ロード済み」のマップ名。
	char mapName[512];
	//	イベント初期化時に利用される。
	int eventType;			//	発生イベントの種別
	int eventNo;			//	発生イベントの番号
	//	ショップ番号
	int shopNo;				//	SHOP遷移時の参照用
	//	実行中のシナリオの情報
	ScnData_t *cur_Scn;		//	実行中のシナリオ・ポインタ
	int scnPoint;			//	今現在のシナリオ位置
	int bNextPoint;			//	次の命令に進むフラグ
	int scnCmdFrame;		//	シナリオ命令毎のフレーム
	//	実行中シナリオの保持情報
	int winno[SCN_WND_MAX];	//	シナリオで管理するウィンドウの情報
} EventControl_t;
●event_GetShopNo
シナリオで設定されたSHOP番号を返す関数です。

CODE:

//----------------------------------------------------------------------
//	シナリオで設定されたSHOP番号を得る。
//----------------------------------------------------------------------
int event_GetShopNo()
{
	return EventControlData.shopNo;
}
●event_Main
playerParamを引数で受け取って保存するようになりました。
シナリオで使用します。

CODE:

//----------------------------------------------------------------------
//	イベントを実行する。
//----------------------------------------------------------------------
int event_Main(int frame,MapMoveInfo_t *mapMoveInfo,PlayerParam_t *playerParam)
{
	int rtnCode = EVENT_RTN_MAPMOVE;//仮にマップ移動と仮定する。
	
	//	マップ移動のデータのポインタを保存
	EventControlData.mapMoveInfo = mapMoveInfo;
	EventControlData.playerParam = playerParam;
	
	//	最初のフレームにシナリオを初期化
	if( frame == 0 ) {
		event_InitScn();
	}
	
	//	シナリオループ
	int bNextCmd = TRUE;	//シナリオループの継続
	while( bNextCmd ) {
		//	今のシナリオ得る。
		ScnData_t *scnData = event_GetNowScnCmd();
		
		//	今のフレームをウィンドウ管理に設定。
		winmng_SetFrame(frame);
		
		//	シナリオが有効なら
		if( scnData != NULL ) {
			//	各シナリオの処理を関数ポインタで呼び出す。
			CmdFunc_t scnCmdFunc = s_scnCmdFunc[scnData->scnCmd];
			if( scnCmdFunc!=NULL ) {
				rtnCode = (scnCmdFunc)(scnData);
			} else {
				printfDx( "未定義命令(%d)", scnData->scnCmd );
			}
		}
		//	 シナリオ命令位置更新かフレームのカウント。シナリオ命令位置更新ならTRUEが返る。
		bNextCmd = event_UpdateScnPointOrFrame();
		
		//	シナリオ命令の戻り値がイベントを継続でなければ
		if( rtnCode != EVENT_RTN_CONTINE ) {
			//	もし、SHOP以外なら
			if( rtnCode != EVENT_RTN_SHOP ) {
				//	全ウィンドウを破棄
				event_DelAllWnd(FALSE);
			}
			//	直ちにイベント処理を抜ける。
			break;
		}
	};
	
	//	遷移状態を持ち帰る。
	return rtnCode;
	/*
		return EVENT_RTN_SHOP;		//SHOPへ遷移。
		return EVENT_RTN_ENDING;	//エンディングへ遷移。  
		return EVENT_RTN_MAPCHANGE;	//マップチェンジに遷移。 
		return EVENT_RTN_BATTLE;	//バトルに遷移。
	*/
}
●scn_CharMuki

CODE:

//######################################################################
//	(シナリオ命令)SCN_CHR_MUKI	マップ固有キャラの方向を変えます。  
//	パラメータ:p1[キャラ番号]、p2[方向]
//######################################################################
static int scn_CharMuki(ScnData_t *scnData)
{
	//	向きを変更する。
	map_CharSetMuki(scnData->p1,scnData->p2);
	
	//	シナリオを次に進める。
	event_NextScn();

	//	イベントを継続する。
	return EVENT_RTN_CONTINE;
}
●scn_Shop
ショップのシナリオ命令です。
呼び出すショップ番号(shopNo)を保存して、一時的にイベントを抜けてSHOPに遷移します。
ちなみに、SHOPはイベントに遷移して戻ってくるので自動的に次のシナリオが継続する様になっています。
※ 戻ってきた場合はイベント・シナリオが初期化されない仕組みを作ってあります。

CODE:

//######################################################################
//	(シナリオ命令)SCN_SHOP	お店に入ります。
//	パラメータ:p1[SHOP番号]
//######################################################################
static int scn_Shop(ScnData_t *scnData)
{
	//	SHOP番号を保存する。
	EventControlData.shopNo = scnData->p1;
	
	//	シナリオを次に進める。
	event_NextScn();
	
	//	SHOPに遷移する。
	return EVENT_RTN_SHOP;	//SHOPへ遷移。
}
●scn_IfTBox
宝箱が開いているか調べるシナリオ命令です。
g_tboxStateで宝箱番号の宝を取ったか調べます。
未開封ならシナリオ命令を1つ余分に進めて命令スキップします。

CODE:

//######################################################################
//	(シナリオ命令)SCN_IF_TBOX	宝箱が開いていなかったら次の命令をスキップします。
//	パラメータ:p1[宝箱の番号]
//######################################################################
static int scn_IfTBox(ScnData_t *scnData)
{
	int TboxNo = scnData->p1;
	//	ガード
	MACRO_ASSERT(TboxNop1;
	//	ガード
	MACRO_ASSERT(TboxNop1;
	MACRO_ASSERT( item_no 

#include "main.h"
#include "eventScn.h"
●マップチェンジ時シナリオ
マップチェンジ時のシナリオは、自分の出現位置を調整します。
その後、宝箱(キャラクタ)を閉じます。
宝箱の絵は右なら閉じた状態、左なら開いた状態です。
あとは宝箱を1つづ調べて開封済みなら、宝箱を開けておきます。

CODE:

//----------------------------------------------------------------------
//	システム・シナリオ
//----------------------------------------------------------------------

//	マップチェンジ時シナリオ
static ScnData_t MapChangeScn[] = {
	//	シナリオ命令,文字列,数値パラメータ1,数値パラメータ2,
	
	//	島からのマップチェンジ
	//	自キャラの調整
	{ SCN_PLY_EPOS, NULL, 0 },	//自キャラの位置をイベント番号の位置にします。 
	{ SCN_PLY_POS, NULL, 0, -1 },	//自キャラの位置を変えます。
	{ SCN_PLY_MUKI, NULL, CHAR_MUKI_UP, 0 },	//自キャラの方向を変えます。
	
	//	宝箱をまず全部閉じる
	{ SCN_CHR_MUKI, NULL, 1, CHAR_MUKI_RIGHT },	//宝箱の閉じた状態
	{ SCN_CHR_MUKI, NULL, 2, CHAR_MUKI_RIGHT },	//宝箱の閉じた状態
	{ SCN_CHR_MUKI, NULL, 3, CHAR_MUKI_RIGHT },	//宝箱の閉じた状態
	{ SCN_CHR_MUKI, NULL, 4, CHAR_MUKI_RIGHT },	//宝箱の閉じた状態
	{ SCN_CHR_MUKI, NULL, 5, CHAR_MUKI_RIGHT },	//宝箱の閉じた状態
	
	//	開いている宝箱を開ける。
	{ SCN_IF_TBOX, NULL , 1 },	//宝箱が未開封ならスキップ
	{ SCN_CHR_MUKI, NULL, 1, CHAR_MUKI_LEFT },	//宝箱の開いた状態
	{ SCN_IF_TBOX, NULL , 2 },	//宝箱が未開封ならスキップ
	{ SCN_CHR_MUKI, NULL, 2, CHAR_MUKI_LEFT },	//宝箱の開いた状態
	{ SCN_IF_TBOX, NULL , 3 },	//宝箱が未開封ならスキップ
	{ SCN_CHR_MUKI, NULL, 3, CHAR_MUKI_LEFT },	//宝箱の開いた状態
	{ SCN_IF_TBOX, NULL , 4 },	//宝箱が未開封ならスキップ
	{ SCN_CHR_MUKI, NULL, 4, CHAR_MUKI_LEFT },	//宝箱の開いた状態
	{ SCN_IF_TBOX, NULL , 5 },	//宝箱が未開封ならスキップ
	{ SCN_CHR_MUKI, NULL, 5, CHAR_MUKI_LEFT },	//宝箱の開いた状態

	{ SCN_EXIT },	//イベントを抜けます。

	{ SCN_END },	//ストッパとしてシナリオ終端に必須です。
};
●宝箱シナリオ
宝箱1~5のシナリオ処理です。宝箱の番号とキャラクタ番号とアイテム以外は処理は全く同じです。
なんか、シナリオ書いたらで長くなったのでシステム化すればよかったと後悔しております。
※ まぁ、これもシナリオで出来ることの見本ということでご了承下さい。
ご自分で作るときはシステム化してください。あるいは、シナリオ関数を作っても良いかも知れません。

宝箱が空いていたら、「空っぽだ」と表示します。
宝を開けたら、アイテムを袋に放りこんでみて袋が一杯なら「袋がいっぱいなので諦めた」と表示します。
うまく袋に入ったら、宝箱を開けたことを記録してアイテム名を表示します。

CODE:

//----------------------------------------------------------------------
//	宝箱シナリオ
//----------------------------------------------------------------------

//	宝箱1
static ScnData_t takara1[] = {
	{ SCN_IF_TBOX, NULL , 1 },	//宝箱が未開封ならスキップ
	{ SCN_GOTO, "opened" },		//開いていた処理へ。
	
	//---------------------------
	//	開ける処理。
	//---------------------------
	{ SCN_CHR_MUKI, NULL, 1, CHAR_MUKI_LEFT },	//宝箱の開いた状態
	{ SCN_MES, "*「宝箱を開けた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_GET_ITEM, NULL, ITEM_MG_HERB },	//アイテムを手に入れる。うまく行ったらスキップ
	{ SCN_GOTO, "full" },	//袋がいっぱいだ。
	{ SCN_SET_TBOX, NULL, 1 },	//宝箱を開けたことを記録
	{ SCN_MES, "*「魔法薬草を手に入れた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。
	
	//---------------------------
	//	開いていた。
	//---------------------------
	{ SCN_LABEL, "opened" },
	{ SCN_MES, "*「空っぽだ」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。
	
	//---------------------------
	//	袋がいっぱいだ。
	//---------------------------
	{ SCN_LABEL, "full" },
	{ SCN_CHR_MUKI, NULL, 1, CHAR_MUKI_RIGHT },	//宝箱の閉じた状態
	{ SCN_MES, "*「袋がいっぱいなので諦めた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。

	{ SCN_END },	//ストッパとしてシナリオ終端に必須です。
};

//	宝箱2
static ScnData_t takara2[] = {
	{ SCN_IF_TBOX, NULL , 2 },	//宝箱が未開封ならスキップ
	{ SCN_GOTO, "opened" },		//開いていた処理へ。
	
	//---------------------------
	//	開ける処理。
	//---------------------------
	{ SCN_CHR_MUKI, NULL, 2, CHAR_MUKI_LEFT },	//宝箱の開いた状態
	{ SCN_MES, "*「宝箱を開けた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_GET_ITEM, NULL, ITEM_HERB },	//アイテムを手に入れる。うまく行ったらスキップ
	{ SCN_GOTO, "full" },	//袋がいっぱいだ。
	{ SCN_SET_TBOX, NULL, 2 },	//宝箱を開けたことを記録
	{ SCN_MES, "*「薬草を手に入れた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。
	
	//---------------------------
	//	開いていた。
	//---------------------------
	{ SCN_LABEL, "opened" },
	{ SCN_MES, "*「空っぽだ」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。
	
	//---------------------------
	//	袋がいっぱいだ。
	//---------------------------
	{ SCN_LABEL, "full" },
	{ SCN_CHR_MUKI, NULL, 2, CHAR_MUKI_RIGHT },	//宝箱の閉じた状態
	{ SCN_MES, "*「袋がいっぱいなので諦めた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。

	{ SCN_END },	//ストッパとしてシナリオ終端に必須です。
};

//	宝箱3
static ScnData_t takara3[] = {
	{ SCN_IF_TBOX, NULL , 3 },	//宝箱が未開封ならスキップ
	{ SCN_GOTO, "opened" },		//開いていた処理へ。
	
	//---------------------------
	//	開ける処理。
	//---------------------------
	{ SCN_CHR_MUKI, NULL, 3, CHAR_MUKI_LEFT },	//宝箱の開いた状態
	{ SCN_MES, "*「宝箱を開けた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_GET_ITEM, NULL, ITEM_MG_HERB },	//アイテムを手に入れる。うまく行ったらスキップ
	{ SCN_GOTO, "full" },	//袋がいっぱいだ。
	{ SCN_SET_TBOX, NULL, 3 },	//宝箱を開けたことを記録
	{ SCN_MES, "*「魔法薬草を手に入れた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。
	
	//---------------------------
	//	開いていた。
	//---------------------------
	{ SCN_LABEL, "opened" },
	{ SCN_MES, "*「空っぽだ」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。
	
	//---------------------------
	//	袋がいっぱいだ。
	//---------------------------
	{ SCN_LABEL, "full" },
	{ SCN_CHR_MUKI, NULL, 3, CHAR_MUKI_RIGHT },	//宝箱の閉じた状態
	{ SCN_MES, "*「袋がいっぱいなので諦めた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。
	
	{ SCN_END },	//ストッパとしてシナリオ終端に必須です。
};
//	宝箱4
static ScnData_t takara4[] = {
	{ SCN_IF_TBOX, NULL , 4 },	//宝箱が未開封ならスキップ
	{ SCN_GOTO, "opened" },		//開いていた処理へ。
	
	//---------------------------
	//	開ける処理。
	//---------------------------
	{ SCN_CHR_MUKI, NULL, 4, CHAR_MUKI_LEFT },	//宝箱の開いた状態
	{ SCN_MES, "*「宝箱を開けた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_GET_ITEM, NULL, ITEM_HERB },	//アイテムを手に入れる。うまく行ったらスキップ
	{ SCN_GOTO, "full" },	//袋がいっぱいだ。
	{ SCN_SET_TBOX, NULL, 4 },	//宝箱を開けたことを記録
	{ SCN_MES, "*「薬草を手に入れた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。
	
	//---------------------------
	//	開いていた。
	//---------------------------
	{ SCN_LABEL, "opened" },
	{ SCN_MES, "*「空っぽだ」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。
	
	//---------------------------
	//	袋がいっぱいだ。
	//---------------------------
	{ SCN_LABEL, "full" },
	{ SCN_CHR_MUKI, NULL, 4, CHAR_MUKI_RIGHT },	//宝箱の閉じた状態
	{ SCN_MES, "*「袋がいっぱいなので諦めた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。

	{ SCN_END },	//ストッパとしてシナリオ終端に必須です。
};

//	宝箱5
static ScnData_t takara5[] = {
	{ SCN_IF_TBOX, NULL , 5 },	//宝箱が未開封ならスキップ
	{ SCN_GOTO, "opened" },		//開いていた処理へ。
	
	//---------------------------
	//	開ける処理。
	//---------------------------
	{ SCN_CHR_MUKI, NULL, 5, CHAR_MUKI_LEFT },	//宝箱の開いた状態
	{ SCN_MES, "*「宝箱を開けた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_GET_ITEM, NULL, ITEM_HERB },	//アイテムを手に入れる。うまく行ったらスキップ
	{ SCN_GOTO, "full" },	//袋がいっぱいだ。
	{ SCN_SET_TBOX, NULL, 5 },	//宝箱を開けたことを記録
	{ SCN_MES, "*「薬草を手に入れた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。
	
	//---------------------------
	//	開いていた。
	//---------------------------
	{ SCN_LABEL, "opened" },
	{ SCN_MES, "*「空っぽだ」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。
	
	//---------------------------
	//	袋がいっぱいだ。
	//---------------------------
	{ SCN_LABEL, "full" },
	{ SCN_CHR_MUKI, NULL, 5, CHAR_MUKI_RIGHT },	//宝箱の閉じた状態
	{ SCN_MES, "*「袋がいっぱいなので諦めた」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_EXIT },	//イベントを抜けます。

	{ SCN_END },	//ストッパとしてシナリオ終端に必須です。
};
●マップイベントのシナリオ
出口イベントは、フィールドに出るためのイベントです。
ボス遭遇イベントは、ボスと戦闘に入るイベントです。
戦闘システムが未完成なので、今回はセリフだけです。

CODE:

//----------------------------------------------------------------------
//	マップイベントのシナリオ
//----------------------------------------------------------------------

//	出口イベント
static ScnData_t dungeonOut[] = {
	//	シナリオ命令,文字列,数値パラメータ1,数値パラメータ2,
	{ SCN_MAP_CHG, "島", 1 },//マップをチェンジします
	{ SCN_EXIT },	//イベントを抜けます。

	{ SCN_END },	//ストッパとしてシナリオ終端に必須です。
};

//	ボス遭遇イベント
static ScnData_t bossScn[] = {
	//	シナリオ命令,文字列,数値パラメータ1,数値パラメータ2,
	{ SCN_MES, "ボス「よく来たな小僧!」", TRUE, SCN_WND_MSGD },//セリフ
	{ SCN_MES, "ボス「我が力!思い知るがいい!」", TRUE, SCN_WND_MSGD },//セリフ
	//	戦闘開始
	{ SCN_EXIT },	//イベントを抜けます。

	{ SCN_END },	//ストッパとしてシナリオ終端に必須です。
};
●イベントデータ
ダンジョンのイベントデータです。
初期スタートイベントに書いてあるMapChangeScnはデバッグ用です。
各イベントとシナリオの接続を定義します。

CODE:

//----------------------------------------------------------------------
//	イベントデータ
//----------------------------------------------------------------------

//----------------------------------------
//	ダンジョンのイベントデータ
//----------------------------------------
struct tag_EventData g_DungeonEventData = {
	{	//システムイベント
		MapChangeScn,	//	初期スタート時イベント
		NULL,			//	ゲームロード時イベント
		MapChangeScn,	//	マップチェンジ受けイベント
	},
	{	//地形イベント
		dungeonOut,	//	ダンジョンに入る。
		bossScn,	//	ボスイベント
	},
	{	//キャラクタイベント
		NULL,		//ボスたが接触できないので定義しない。
		takara1,	//宝箱1
		takara2,	//宝箱2
		takara3,	//宝箱3
		takara4,	//宝箱4
		takara5,	//宝箱5
	},
};
以上お店と宝箱の全容でした。

最後に、今回のプロジェクトです。

[拡張子 zip は無効化されているため、表示できません]

次回からは、いよいよバトルに入ります。ご期待くださいね。
たぶん、3~4回で終わると思いますが断言は出来ませんよ。
1.バトルバランス試作編
2.エンカウント・戦闘突入エフェクト・戦闘画面・敵表示編
3.メニュー処理とレベルアップ編とバトル処理とゲームオーバー編
って感じでしょうか。
これで簡単RPGの初級編は終わる予定です。
その先は未定ですが、しばらく先で時間の余裕が出来た時になります。
たぶん、音楽・効果音の追加やシナリオのスクリプト化、セーブ機能、FF的戦闘システム?などになるでしょう。
今までの分を自分のホームページにリファインして移すことも検討しております。
続きは、もちろん此処に書きますけどね。
添付ファイル
宝箱.png
宝箱.png (43.18 KiB) 閲覧数: 1957 回
ダンジョン.png
ダンジョン.png (46.02 KiB) 閲覧数: 1926 回

きょーちゃん
記事: 11
登録日時: 14年前

Re: 簡単RPG講座12-3。お店と宝箱。その3

投稿記事 by きょーちゃん » 14年前

こんばんは。いつも楽しく読ませていただいてます。
今更ですが、ウィンドウシステムの解説の後にあった練習問題(1だけですが・・・)を解いてみました。
コメントのところに書かせていただきました。もしよろしければ採点お願いします。

まだまだ最新記事には追いつけそうにないです^^;