今回は、バトルを制御するバトルデータです。
[battlePSCData.cpp]
バトルPSCのデータです。つまり、バトル処理そのものですね。
このファイルは新規作成です。
なお、このファイルはインクルードするのでコンパイル対象に加えないでください。
●バトル制御の定数
バトル制御の定数です。
//----------------------------------------------------------------------
// バトル制御の定数
//----------------------------------------------------------------------
// 主人公の攻撃の戻り値
enum {
PLAYER_ATTACK_RTN_CONT, //攻撃継続。
PLAYER_ATTACK_RTN_ESCAPE, //逃げ出した。
};
バトル開始エフェクトからメインループまでです。
シナリオと同じ構造体のデータとして命令を記述していきます。
ポイントは、PSC_LabelとPSC_JumpやPSC_SelectJumpでwhileループを構成していたり、if文を構成したりしているところです。
まず、バトル開始。
バトル開始エフェクト後に、出現モンスターのメッセージを自動表示。
とここまでがバトル開始です。
メインループは、PSC_CmdSelectやPSC_MagicSelectやPSC_ItemSelectで行動を選択。選択されたら直ちに戦闘を開始します。
攻撃処理では、ランダムに敵と主人公のどちらかが攻撃を開始。
PSC_Callで敵と主人公の攻撃処理を呼び出しています。
結果に応じて、"jp_メイン逃亡"や"jp_メインダメージチェック"にジャンプします。
"jp_メインダメージチェック"では、攻撃結果の判定を行います。
主人公が死んだら"jp_メイン負け"へ。
敵が死んだら"jp_メイン勝利"へ。
それ以外はメインループに戻ります。
"jp_メイン逃亡"では、逃亡メッセージを出力してPSC_RTN_ENDでバトルを抜けます。
"jp_メイン勝利"では、倒したメッセージをと入手経験値やお金を表示してレベルアップ処理に入ります。
レベルアップ処理では、レベルアップが終わるまでレバルアップ処理→レベルアップメッセージを繰り返います。
終了したら、バトルを抜けます。
"jp_メイン負け"では、死んでしまったメッセージを表示してPSC_RTN_GAMEVOERでゲームオーバーになります。
//----------------------------------------------------------------------
// バトル制御データ
//----------------------------------------------------------------------
// バトル制御データ
static PSCData_t s_PscData[] = {
//---------------------
// バトル開始
//---------------------
{ PSC_BattleIn }, //バトル開始エフェクト
{ PSC_AutoMsg,"%sがあらわれた! \n",PSCDATA_STR(PDS_MONSTER_NAME) }, //モンスター名が現れた。文字のあとの空白は間の調整
//==========================================================
// メインループ
//==========================================================
{ PSC_Label,"jp_メインループ" },//ラベル
//{
//---------------------
// 行動の選択処理
//---------------------
// 主人公パラメータの表示はシステム自動
{ PSC_CmdSelect},//動作の種類を選択「こうげき」「まほう」「アイテム」「にげる」
{ PSC_SelectJump,"jp_魔法の選択",PSC_VAR_CMD,PSC_CMD_SEL_MAGIC },//まほうの場合
{ PSC_SelectJump,"jp_アイテムの選択",PSC_VAR_CMD,PSC_CMD_SEL_ITEM },//アイテムの場合
{ PSC_Jump,"jp_攻撃開始"}, //ジャンプ。
//switch() {
// まほうの選択
{ PSC_Label,"jp_魔法の選択" },//ラベル
{ PSC_MagicSelect},//まほう選択処理
{ PSC_SelectJump,"jp_メインループ",PSC_VAR_MAGIC,-1 },//抜けた場合はメインループに戻る。
{ PSC_Jump,"jp_攻撃開始"}, //ジャンプ。
// アイテムの選択
{ PSC_Label,"jp_アイテムの選択" },//ラベル
{ PSC_ItemSelect},//アイテム選択処理
{ PSC_SelectJump,"jp_メインループ",PSC_VAR_ITEM,-1 },//抜けた場合はメインループに戻る。
{ PSC_Jump,"jp_攻撃開始"}, //ジャンプ。
//}
//---------------------
// 攻撃処理
//---------------------
{ PSC_Label,"jp_攻撃開始" },//ラベル
{ PSC_ClearMsg },//メッセージをクリア
// 素早さパラメータが無いので、どちらが先に攻撃するかは50%の確率でランダムに決めます。
{ PSC_RandJump,"jp_敵→主人公の順",2 },//ランダムジャンプ
//switch() {
// 攻撃処理(主人公が先攻)
{ PSC_Label,"jp_主人公→敵の順" },//ラベル
{ PSC_Call,"cl_主人公の攻撃" }, //主人公の攻撃
{ PSC_SelectJump,"jp_メイン逃亡",PSC_VAR_RTN,PLAYER_ATTACK_RTN_ESCAPE }, //逃亡に成功
{ PSC_Call,"cl_敵の攻撃" }, //敵の攻撃
{ PSC_Jump,"jp_メインダメージチェック" }, //ジャンプ。攻撃結果の判定
// 攻撃処理(敵が先攻)
{ PSC_Label,"jp_敵→主人公の順" },//ラベル
{ PSC_Call,"cl_敵の攻撃" }, //敵の攻撃
{ PSC_Call,"cl_主人公の攻撃" }, //主人公の攻撃
{ PSC_SelectJump,"jp_メイン逃亡",PSC_VAR_RTN,PLAYER_ATTACK_RTN_ESCAPE }, //逃亡に成功
{ PSC_Jump,"jp_メインダメージチェック" }, //ジャンプ。攻撃結果の判定
//}
//---------------------
// 攻撃結果の判定
//---------------------
{ PSC_Label,"jp_メインダメージチェック" },//ラベル
{ PSC_PlayerDeathJump,"jp_メイン負け" }, //主人公が死んた
{ PSC_EnemyDeathJump,"jp_メイン勝利" }, //敵が死んだ
{ PSC_ClearMsg },//メッセージをクリア
{ PSC_Jump,"jp_メインループ" },//継続。メインループに戻る。
// 逃亡成功!
{ PSC_Label,"jp_メイン逃亡" },//ラベル
{ PSC_KeyWaitMsg,"にげだした。\n" }, //メッセージ
{ PSC_Exit,NULL,PSC_RTN_END }, //バトルを抜ける。
// 勝利!
{ PSC_Label,"jp_メイン勝利" },//ラベル
{ PSC_KeyWaitMsg,"%sをたおした! \n",PSCDATA_STR(PDS_MONSTER_NAME) }, //モンスター名が現れた。文字のあとの空白は間の調整
// 経験値やお金の入手
{ PSC_ClearMsg },//メッセージをクリア
{ PSC_KeyWaitMsg,"%dの経験値をえた!\n", PSCDATA_INT(PDI_EXP)}, //メッセージ
{ PSC_KeyWaitMsg,"ゼニー%dを手に入れた!\n", PSCDATA_INT(PDI_MONEY)}, //メッセージ
{ PSC_Label,"jp_レベルアップループ" },//ラベル
{ PSC_Levelup },//レベルアップ処理
{ PSC_SelectJump,"jp_レベルアップ終了",PSC_VAR_LEVELUP,PSC_LEVELUP_RTN_NO }, //レベルアップなし
{ PSC_ClearMsg },//メッセージをクリア
{ PSC_KeyWaitMsg,"%s\n", PSCDATA_STR(PDS_STR0)},//レベルが上がったメッセージ
{ PSC_KeyWaitMsg,"%s\n", PSCDATA_STR(PDS_STR1)},//アップ値メッセージ
{ PSC_SelectJump,"jp_レベルアップループ",PSC_VAR_LEVELUP,PSC_LEVELUP_RTN_YES }, //レベルアップだけ
{ PSC_KeyWaitMsg,"%s\n", PSCDATA_STR(PDS_STR2)},//魔法を覚えたメッセージ
{ PSC_Jump,"jp_レベルアップループ"},//レベルアップの継続
{ PSC_Label,"jp_レベルアップ終了" },//ラベル
{ PSC_Exit,NULL,PSC_RTN_END }, //バトルを抜ける。
// 負けた・・・
{ PSC_Label,"jp_メイン負け" },//ラベル
{ PSC_KeyWaitMsg,"あなたは しんでしまった!\n" }, //メッセージ
{ PSC_Exit,NULL,PSC_RTN_GAMEVOER }, //バトルを抜ける。負け。
//}
主人公の攻撃処理です。
主人公か敵が死んでいたら何もしないで戻り値PLAYER_ATTACK_RTN_CONTでPSC_Returnします。
主人公の行動選択で次のように分岐します。
PSC_CMD_SEL_ATTACKなら、"jp_主人公の打撃"
PSC_CMD_SEL_ESCAPEなら、"jp_主人公の逃亡",
PSC_CMD_SEL_MAGICなら、"jp_主人公の魔法"
PSC_CMD_SEL_ITEMなら、"jp_主人公のアイテム"
"jp_主人公の打撃"では、主人公の攻撃力でダメージを計算して"cl_主人公からのダメージ",でダメージ処理を行い戻り値PLAYER_ATTACK_RTN_CONTでPSC_Returnします。
"jp_主人公の逃亡"では、逃亡判定を行い逃げられなかったら"にげられなかった!"と表示して戻り値PLAYER_ATTACK_RTN_CONTでPSC_Returnします。逃げられたら、戻り値PLAYER_ATTACK_RTN_ESCAPEでPSC_Returnします。
"jp_主人公の魔法"では、 "cl_主人公の魔法処理"を呼び出して魔法処理を行い戻り値PLAYER_ATTACK_RTN_CONTでPSC_Returnします。
"jp_主人公のアイテム"では、"cl_主人公のアイテム処理"を呼び出して魔法処理を行い戻り値PLAYER_ATTACK_RTN_CONTでPSC_Returnします。
//==========================================================
// 主人公の攻撃
//==========================================================
{ PSC_Label,"cl_主人公の攻撃" },//ラベル
//{
// 処理前のチェック
{ PSC_PlayerDeathJump,"jp_主人公の攻撃_継続" }, //主人公が死んた
{ PSC_EnemyDeathJump,"jp_主人公の攻撃_継続" }, //敵が死んだ
// 種類別に分岐
{ PSC_ClearMsg },//メッセージをクリア
{ PSC_SelectJump,"jp_主人公の打撃",PSC_VAR_CMD,PSC_CMD_SEL_ATTACK },//こうげきの場合
{ PSC_SelectJump,"jp_主人公の逃亡",PSC_VAR_CMD,PSC_CMD_SEL_ESCAPE },//にげる場合
{ PSC_SelectJump,"jp_主人公の魔法",PSC_VAR_CMD,PSC_CMD_SEL_MAGIC },//まほうの場合
{ PSC_SelectJump,"jp_主人公のアイテム",PSC_VAR_CMD,PSC_CMD_SEL_ITEM },//アイテムの場合
{ PSC_Jump,"jp_主人公の攻撃_継続" },//ジャンプ。継続で抜ける。
//switch() {
// こうげき
{ PSC_Label,"jp_主人公の打撃" },//ラベル
// ダメージ計算(敵の防御力、主人公の攻撃力)
{ PSC_DamageCalc,NULL,PSCDATA_INT(PDI_ENEMY_DEF),1,PSCDATA_INT(PDI_PLAYER_ATK) },//ダメージ計算
{ PSC_Call,"cl_主人公からのダメージ", GetColor(255,255,255),0,0, "あなたの" },//敵のダメージ処理。
{ PSC_Jump,"jp_主人公の攻撃_継続" },//ジャンプ。継続で抜ける。
// にげる
{ PSC_Label,"jp_主人公の逃亡" },//ラベル
// 逃げる確率は50%
{ PSC_AutoMsg," ・ ・ ・ \n"}, //逃げる前の溜め
{ PSC_RandJump,"jp_主人公の攻撃_逃亡",2 },//ランダムジャンプ
{ PSC_AutoMsg,"にげられなかった!\n"}, //逃げられなかったメッセージ
{ PSC_Jump,"jp_主人公の攻撃_継続" },//ジャンプ。継続で抜ける。
// まほう
{ PSC_Label,"jp_主人公の魔法" },//ラベル
// まほうの処理
{ PSC_Call,"cl_主人公の魔法処理" },
{ PSC_Jump,"jp_主人公の攻撃_継続" },//ジャンプ。継続で抜ける。
// アイテム
{ PSC_Label,"jp_主人公のアイテム" },//ラベル
//アイテムの処理
{ PSC_Call,"cl_主人公のアイテム処理" },
{ PSC_Jump,"jp_主人公の攻撃_継続" },//ジャンプ。継続で抜ける。
//}
// 継続で抜ける。
{ PSC_Label,"jp_主人公の攻撃_継続" },//ラベル
{ PSC_Return,NULL,PLAYER_ATTACK_RTN_CONT }, //呼び出し元に戻る。継続
// 逃亡で抜ける。
{ PSC_Label,"jp_主人公の攻撃_逃亡" },//ラベル
{ PSC_Return,NULL,PLAYER_ATTACK_RTN_ESCAPE },//呼び出し元に戻る。逃亡
//}
PSC_MagicActionを行い戻り値がPSC_MAGIC_ACT_FIREなら、PSC_DamageCalcでほのお魔法のダメージ計算を行って"cl_主人公からのダメージ",を呼び出してダメージを負わせます。
それ以外はPSC_MagicActionのメッセージを表示して戻ります。
//==========================================================
// 主人公のまほうの処理
//==========================================================
{ PSC_Label,"cl_主人公の魔法処理" },//ラベル
//{
{ PSC_MagicAction },//魔法の実際の処理。
{ PSC_SelectJump,"jp_主人公の魔法ほのお",PSC_VAR_MAGIC_ACT,PSC_MAGIC_ACT_FIRE },//ほのおの魔法
{ PSC_AutoMsg,"%s\n", PSCDATA_STR(PDS_STR0)},//メッセージ0
{ PSC_AutoMsg,"%s\n", PSCDATA_STR(PDS_STR1)},//メッセージ1
{ PSC_Return }, //呼び出し元に戻る。
{ PSC_Label,"jp_主人公の魔法ほのお" },//ラベル
// ダメージ処理。まほうは防御力をほとんど無視してダメージ
{ PSC_DamageCalc,NULL,PSCDATA_INT(PDI_ENEMY_DEF),4,PSCDATA_INT(PDI_MAGIC_ATK) },//ダメージ計算
{ PSC_Call,"cl_主人公からのダメージ", GetColor(255,0,0),0,0, "あなたは ほのおのまほう で" },//敵のダメージ処理。
{ PSC_Return }, //呼び出し元に戻る。
//}
PSC_ItemActionを行いそのメッセージを出力して戻ります。
//==========================================================
// 主人公のアイテムの処理
//==========================================================
{ PSC_Label,"cl_主人公のアイテム処理" },//ラベル
//{
{ PSC_ItemAction },//アイテムの実際の処理。
{ PSC_AutoMsg,"%s\n", PSCDATA_STR(PDS_STR0)},//メッセージ0
{ PSC_AutoMsg,"%s\n", PSCDATA_STR(PDS_STR1)},//メッセージ1
{ PSC_Return }, //呼び出し元に戻る。
//}
攻撃メッセージをPSC_Callのパラメータから組み立てて、攻撃エフェクトを行いPSC_EnemyDamageで敵のダメージ処理を行います。
最後にダメージ値を表示するメッセージ出力して呼び出し元に戻ります。
//==========================================================
// 主人公から敵へのダメージ処理
//==========================================================
{ PSC_Label,"cl_主人公からのダメージ" },//ラベル
//{
// 攻撃メッセージ(敵の名前、敵の攻撃名)
{ PSC_AutoMsg,"%sこうげき!\n", PSCDATA_STR(PDS_CALL_STR_P1) }, //メッセージ
// 攻撃エフェクト
{ PSC_AttackEffect,NULL,PSCDATA_INT(PDI_CALL_P1) },
// プレイヤーがダメージを受ける。
{ PSC_EnemyDamage },//敵にダメージ
// ダメージの表示
{ PSC_AutoMsg,"あなたは %sに %dのダメージをあたえた!\n", PSCDATA_STR(PDS_MONSTER_NAME),PSCDATA_INT(PDI_DAMAGE) }, //メッセージ
{ PSC_Return }, //呼び出し元に戻る。
//}
敵の攻撃処理で、PSC_EnemyAIで行動を決めます。
ENEMY_ATK_TYPE_NORMALなら、"jp_敵の攻撃_NORMAL"
ENEMY_ATK_TYPE_ROLLなら、"jp_敵の攻撃_ROLL"
ENEMY_ATK_TYPE_FIREMAGICなら、"jp_敵の攻撃_FIREMAGIC"
ENEMY_ATK_TYPE_BOSSなら、"jp_敵の攻撃_BOSS
"jp_敵の攻撃_NORMAL"では、PSC_DamageCalcで敵の攻撃力でダメージを計算して"cl_敵からのダメージ",で主人公のダメージ処理を行います。
"jp_敵の攻撃_ROLL"では、PSC_DamageCalcで攻撃力15と補正値2でダメージを計算して"cl_敵からのダメージ",で主人公のダメージ処理を行います。
"jp_敵の攻撃_FIREMAGIC"では、PSC_DamageCalcで攻撃力27と補正値2でダメージを計算して"cl_敵からのダメージ",で主人公のダメージ処理を行います。
"jp_敵の攻撃_BOSS"では、PSC_DamageCalcで攻撃力36と補正値2でダメージを計算して"cl_敵からのダメージ",で主人公のダメージ処理を行います。
それぞれの攻撃では、GetColor()でエフェクト色も変えています。
処理が終われば呼び出し元に戻ります。
//==========================================================
// 敵の攻撃
//==========================================================
{ PSC_Label,"cl_敵の攻撃" },//ラベル
//{
// 処理前のチェック
{ PSC_PlayerDeathJump,"jp_敵の攻撃_RETURN" }, //主人公が死んた
{ PSC_EnemyDeathJump,"jp_敵の攻撃_RETURN" }, //敵が死んだ
// 敵の攻撃処理
{ PSC_ClearMsg },//メッセージをクリア
{ PSC_EnemyAI }, //敵の攻撃を決定
{ PSC_SelectJump,"jp_敵の攻撃_NORMAL",PSC_VAR_ENEMYATK,ENEMY_ATK_TYPE_NORMAL }, //攻撃は打撃
{ PSC_SelectJump,"jp_敵の攻撃_ROLL",PSC_VAR_ENEMYATK,ENEMY_ATK_TYPE_ROLL }, //「なぎたおし」
{ PSC_SelectJump,"jp_敵の攻撃_FIREMAGIC",PSC_VAR_ENEMYATK,ENEMY_ATK_TYPE_FIREMAGIC }, //「ほのおのまほう」
{ PSC_SelectJump,"jp_敵の攻撃_BOSS",PSC_VAR_ENEMYATK,ENEMY_ATK_TYPE_BOSS }, //ボスの特殊攻撃
{ PSC_Jump,"jp_敵の攻撃_RETURN" },//ジャンプ。抜ける。
//switch() {
// 攻撃は打撃
{ PSC_Label,"jp_敵の攻撃_NORMAL" },//ラベル
// ダメージ計算(主人公の防御力、敵の攻撃力)
{ PSC_DamageCalc,NULL,PSCDATA_INT(PDI_PLAYER_DEF),1,PSCDATA_INT(PDI_ENEMY_ATK) },//ダメージ計算
{ PSC_Call,"cl_敵からのダメージ", GetColor(255,255,255),0,0, "" },//主人公のダメージ処理。
{ PSC_Jump,"jp_敵の攻撃_RETURN" },//ジャンプ。抜ける。
// 「なぎたおし」
{ PSC_Label,"jp_敵の攻撃_ROLL" },//ラベル
{ PSC_DamageCalc,NULL,PSCDATA_INT(PDI_PLAYER_DEF),2,FIXED_INT(15) },//ダメージ計算
{ PSC_Call,"cl_敵からのダメージ", GetColor(255,255,255),0,0, " なぎたおし " },//主人公のダメージ処理。
{ PSC_Jump,"jp_敵の攻撃_RETURN" },//ジャンプ。抜ける。
// 「ほのおのまほう」
{ PSC_Label,"jp_敵の攻撃_FIREMAGIC" },//ラベル
{ PSC_DamageCalc,NULL,PSCDATA_INT(PDI_PLAYER_DEF),2,FIXED_INT(27) },//ダメージ計算
{ PSC_Call,"cl_敵からのダメージ", GetColor(255,0,0),0,0, " ほのおのまほう " },//主人公のダメージ処理。
{ PSC_Jump,"jp_敵の攻撃_RETURN" },//ジャンプ。抜ける。
// ボスの特殊攻撃
{ PSC_Label,"jp_敵の攻撃_BOSS" },//ラベル
{ PSC_DamageCalc,NULL,PSCDATA_INT(PDI_PLAYER_DEF),2,FIXED_INT(36) },//ダメージ計算
{ PSC_Call,"cl_敵からのダメージ", GetColor(255,0,0),0,0, " やきつくす火炎 " },//主人公のダメージ処理。
{ PSC_Jump,"jp_敵の攻撃_RETURN" },//ジャンプ。抜ける。
//}
// 抜ける。
{ PSC_Label,"jp_敵の攻撃_RETURN" },//ラベル
{ PSC_Return }, //呼び出し元に戻る。
//}
攻撃メッセージを組み立てて表示します。PDS_CALL_STR_P1は、PSC_Callのパラメータです。
PSC_AttackEffectでパラメータに従ったカラーでエフェクトを行います。
PSC_PlayerDamageで敵からのダメージを受けます。
ダメージメッセージを組み立てて表示します。
呼び出し元に戻ります。
//==========================================================
// 敵からの主人公へのダメージ処理
// 引数 strP1:技名の文字列
//==========================================================
{ PSC_Label,"cl_敵からのダメージ" },//ラベル
//{
// 攻撃メッセージ(敵の名前、敵の攻撃名)
{ PSC_AutoMsg,"%sの %s こうげき!\n", PSCDATA_STR(PDS_MONSTER_NAME),PSCDATA_STR(PDS_CALL_STR_P1) }, //メッセージ
// 攻撃エフェクト
{ PSC_AttackEffect,NULL,PSCDATA_INT(PDI_CALL_P1) },
// プレイヤーがダメージを受ける。
{ PSC_PlayerDamage },//主人公にダメージ
// ダメージの表示
{ PSC_AutoMsg,"あなたは %dのダメージをうけた!\n", PSCDATA_INT(PDI_DAMAGE) }, //メッセージ
{ PSC_Return }, //呼び出し元に戻る。
//}
//==========================================================
{ NULL }, //ストッパ。実行されるとエラー。
};
約半年の長いお付き合い、ありがとうございました。
今回にて第一部の完結です。
今回のプロジェクト全てです。
サンプルで配ったものとは、大幅にマップデータをリメイクしています。 マップのデータ(ppj)です。 動くだけのサンプルです。 次回については未定で何時になるかはお約束できません。
しばらく先で時間の余裕が出来た時になります。
たぶん、音楽・効果音の追加やシナリオのスクリプト化、セーブ機能、FF的戦闘システム?などになるでしょう。
今までの分を自分のホームページにリファインして移すことも検討しております。
続きは、もちろん此処に書きますけどね。
感想・質問などお待ちしております。
長くなりそうな質問は、「C言語何でも質問掲示板」でお願いします。
お疲れさまでした。