RPG製作は人によって方法が違うので、これは一例と捉えてください。
RPGとアドベンチャーの大きな違いは、主人公が中心か否かです。
アドベンチャーは主人公が中心のため、好感度やフラグ等、何でも主人公が所持していればそれで十分です。
しかしRPGの場合は、NPCごとに値を所持している必要があります。
(この結果として、計算的な戦闘等があるのかもしれません)
まずは「ステータスの定義」
- キャラごとのステータスは構造体として定義します。
- 構造体のメンバーにはそのキャラが、主人公の行動に左右されず、どういう行動をとるのか、関数オブジェクトで呼び出すための関数型(ここではTALKという名前)があります。その関数型も定義します。
- それだけで作るのは不便なので、この構造体オブジェクトを入れる配列を作ります。
- また、キャラを作るにあたり、構造体ひとつひとつの変数へ = でつなげるのは面倒なので、引数から値を入れるような関数を用意します。
次に「キャラクターの格納」
- キャククターをつくり、配列に入れる関数を作ります。
- また、そのキャラのデータがほしいとき、配列の要素数から呼び出すのは、いちいち値と名前を見比べなくてはなりませんから面倒です。
キャラ名から要素を呼び出すような関数も作ってみます。
キャラクターの行動用の関数を作ろう
- 勇者、少女、山賊がそれぞれ洞窟内で、どういう行動をとるのかの関数を作ります。
メイン実行
すべて作り終えたら、それぞれのキャラを読み込み、行動させ、「誰が冒険を終了させたか」を返すことで複数のエンディングを迎えるような結果を生むgame_mainを作りましょう。
エリアを作成してみよう
- ダンジョンというからには、マップが欲しいところです。
また、キャラデータを取り扱う時、そのダンジョンにいないキャラは無視したい。
そのためのエリア構造体型をまず作り、構造体オブジェクトを宣言します。
※ついでに上でSTATUSという名で定義していた構造体はobjectという名に変更しました。
STATUSだと何故か打ち込みにくいので……。また、TALKもsActionに変更しました。
エリアにキャラクターを入れよう
- さて、全体的なキャラ情報であるanCharから、ダンジョン的なキャラ情報であるERIAにキャラを移します。
- そしてキャラの行動のフラグを、anCharからではなく、ERIAから読み出すようにします。
※少女ですが、初期位置で死ぬ死なないが決まるのは寂しいので移動させるようにしました。
キャラ情報用
| 勇者(+少女の移動用) | |
| 少女 | |
| 山賊 |
メイン実行
すべて作り終えたら、読み込んでみましょう。
object構造体変えました
それに合わせて色々変わったんですが、それ全部載せるのは難しいのでまだ省略。
あまり使わないthisですが、これはメソッドを使用している構造体の参照を返すものです。