【戦闘開始時に敵の名前と数を表示】


【目標】
 敵が全て表示された直後に、敵の種類ごとに数を調べメッセージ表示する
 参考:戦闘中にイベント発生
 >> 例 <<
 ○○○ が 3体 あらわれた!
 △△△ が 2体 あらわれた!


【見本】
 

【1】
 コモンイベント一覧から
 203:○[変更可]戦闘開始時処理 を選択します。


【2】
 203:○[変更可]戦闘開始時処理 が
 呼び出された段階で、表示された敵は全て
 可変DB_10:×┏ 戦闘一時ステータス[基] に
 データが格納されているので
 そのDBから必要な値を読み込みます。


【3】
 まずは敵のキャラクタ番号を
 DBから読み込みますが。
 同じ敵かどうか1個ずつチェックするのは面倒です。
 そこでループ処理で楽をしてしまいましょう。
 
 ループの準備をします。
 
 1、イベントコマンド一覧 から 変数操作 を選択
 2、少し上にあるSelf を選択し、このコモンセルフ10 を選択
 3、=(代入) を選択
 4、9 + 0 を入力します
   【2】の画像の敵1ステータスの1個少ない数にしましょう
   ループ内の一番最初に +1 され 10になるので問題はありません
 5、入力左クリック し追加しましょう
 


【4】
 次にループ処理を入れます
 ループ回数は敵の最大数である7を入力します。
 
 1、イベントコマンド一覧 から イベント制御を選択
 2、回数付きループ にチェックをし、 を入力
 3、さきほど入力した CSelf10 = 9 + 0 の1個下の行に追加
 
 [ 3 ] を参考に変数操作を行い
    CSelf10 += 1 + 0 を ループ内 に追加。
    CSelf10は可変DB_10:×┏ 戦闘一時ステータス[基]の
    データ位置を保存しておく役割です
 
 これでループの準備は終了です。


【5】
 DBから必要な値を読み込み
 コモンセルフ変数にコピーします。
 
 1、イベントコマンド入力 から DB操作 を選択
 2、可変DB 名前 を選択し、×┏ 戦闘一時ステータス[基] を選択
 3、変数 を選択し、CSelf10 を選択
   ※ループする度にCSelf10の中身は +1 され
   10→11→...16と変化するようにしてある。
 4、名前 を選択し、キャラクタ番号[1万以上は敵] を選択
   キャラがいない場合は-1が格納されており
   敵キャラの場合はUDB敵固体データのデータ位置+10000が
   味方の場合はCDB主人公ステータスのデータ位置が入っています。
 5、変数に代入→ を選択
 6、数値または代入先 =(代入) を選択
 7、変数/文字列 を選択し、CSelf11 を選択
   今回読み込むの敵キャラクタ番号は数値なので
   文字列変数には代入できません。
   文字列変数以外の変数に代入します。
 8、入力をクリックし、先ほどのCSelf10 += 1 + 0 の次の行に追加


【6】
 読み込んだ値を元に条件分岐させます。
 
 ×┏ 戦闘一時ステータス[基]キャラクタ番号[1万以上は敵] は
 初期値が -1、味方キャラクタの場合は 0〜9999
 敵の場合は 10000〜19999 となります。
 なので分岐の条件は 10000 以上 かつ 19999 以下とします。
 
 1、イベントコマンド一覧 から 条件(変数) を選択
 2、先ほど読み込んだ 敵キャラクタ番号の入っている変数 を選択
 3、10000 を入力
 4、以上 を選択
 5、入力をクリックし追加する
 
 今度も同じように、今作った分岐内に 19999 以下 の分岐を作りましょう。
 これでキャラクタ番号が
 10000 以上 かつ 19999 以下の場合だけ
 処理を行うようにできました。


【7】
 次は 可変DB を使用し、同じように ループ処理 をさせながら
 同じキャラクタ番号 が存在するかどうかを調べます。
 
 まずは使用する可変DBを決めましょう。
 今回は戦闘中にはおそらく使われることのなく
 使用前に全データの初期化が行われている可変DBである
 16:× お店一時処理用 を使用します。
 もちろん19:万能ウィンドウ一時DB や
 新しく可変DBの20以降に、専用のDBを作成しても大丈夫です。
 作成したDBの項目は、敵キャラクタ番号と出現数の2項目でOKです。
 敵キャラクタ番号の項目値は -1 に、出現数は 0 に設定しましょう。
 ※ データ位置には負の値(-1以下)は指定できないので
 ※ -1 を設定しておくと、誤作動を起こさないで済む。
 
 使用するDBを決めたら、一番最初のループの1個上の行に
 そのDBの全データを初期化するコマンドを追加しましょう。
 追加する位置はよく考えないと
 せっかくの処理が水の泡になってしまうかもしれません。


【8】
 それでは、用意したDBを使用し
 出現した敵の情報を保存していきましょう。
 
 1、19999 以下 の分岐内に CSelf12 = -1 + 0 を追加
   CSelf12は、用意したDBのデータ位置保存用の変数。
 2、回数7回回数付きループを追加
   敵の最大出現可能数である7回を設定する。
 3、2、ループ内に移動しCSelf12 += 1 + 0 を追加
   データ位置をループの度に+1させていくため。
 4、DB操作で
   × お店一時処理用CSelf12価格CSelf13 にコピー 
   ※ 今回使った× お店一時処理用は、データの初期化した場合
   ※ 全データの価格の項目の値は全て 初期値の 0 になるので
   ※ その値とキャラクタ番号を条件に次の行で分岐をさせる。
 5、CSelf130 と同じ 場合と
   CSelf13CSelf11 と同じ 場合で条件分岐
   初期値が-1なら-1と同じに、-5なら-5と同じに設定する。
   ※ 今回は敵だけの調査なので
   ※ -1か10000〜19999の値しか出ないので
   ※ 初期値が 0 でも問題がない。
   ※ これが味方キャラも捜査する場合だと
   ※ 必ず初期値を-1以下にしなければならない
   ※ 0だと主人公ステータス 0 のキャラと一致する可能性があるので。
 6、CSelf130 と同じ 場合の分岐内でDB操作
   × お店一時処理用CSelf12価格 = CSelf11
   ついでに 所持数も += 1 する
   ※ 0(初期値)の場合はまっさらな状態なので
   ※ 敵キャラクタ番号を登録し、出現数にあたる項目も +1 する
   ※ 出現数は初期値0なので、これで登録と同時に1体となる。
 7、CSelf13CSelf11 と同じ 場合の分岐内でDB操作
   × お店一時処理用CSelf12所持数 += 1
   ※ こちらは単純にDBに登録されていた敵キャラクタ番号と
   ※ 今回読み込んだ位置の敵キャラクタ番号が一致したので
   ※ 出現数を +1 するだけでいい。
   ※ どちらにも一致しなかった場合は次のループへ


【9】
 両方の分岐内の最後の行に
 ループ中断 のコマンドを追加しましょう。
 これを忘れるときちんと処理されなくなります。
 ※ 敵キャラクタ番号が他のデータ位置と重複したりします。
 ※ 例 敵グループがオオカミ2体、スライム1体として
 ※ オオカミ が 2体 あらわれた!
 ※ オオカミ が 2体 あらわれた!
 ※ 以下7行目まで同文
 
 
>>> ここまでの処理の流れ <<<
 7箇所全部敵キャラクタ番号1個ずつ取得 し  その値が 10000 以上 かつ 19999 以下の場合  用意しておいた可変DBを使い、敵キャラクタ番号 を保存  種族別出現数 もカウントして保存する



【10】
 いよいよ出現した敵の名前を表示します。
 一番最初のループを抜けた次の行から追加していきます。


【11】
 まずは使用する文字列変数と
 敵の種類数をカウントする変数
 DBのデータ読み込み位置用変数 の値を設定します。
 CSelf5に何も文字を入力していない空欄を入れてみましょう
 1、イベントコマンド一覧 から 文字列操作 を選択
 2、文字列を選択し、コモンセルフ5 を指定
 3、=(代入) を選択
 4、空欄です、改行してもいけませんし空白を入れてもいけません
   ここで何か文字を入れると、1行目の表示が変化してしまうから。
 最後に入力を押せばOKです
 同じようにCSelf6も空欄の文字列を入れてみましょう。
 
 変数の用途ですが文字列変数の CSelf5CSelf6 は
 出現した敵の種類名と数と、出現したときの文を表示させる用です。
 用意したDBのデータ読み込み位置用として CSelf10
 敵の種類数をカウントする用として CSelf11 を使用
 CSelf10 = -1 + 0
 CSelf11 = 0 + 0 をいれておきましょう


【12】
 CSelf11 = 0 + 0 の次の行に追加していきます。
 1、敵の最大出現可能数である 7  をループ回数に設定して追加
 2、ループ内へ移動し、データ位置カウント用CSelf10に 1 を加算
   データ読み込み位置を0→1→2...6とループ毎に増やすため。
 3、敵キャラクタ番号 を保存してあるDBから、CSelf12 へ値を代入(=)する
   ※ ×┏ 戦闘一時ステータス[基]ではなく
   ※ こちらで用意したDBから値を読み込む。
 4、CSelf12 に代入した 敵キャラクタ番号 が 0 以外の時と 0 の時とで分岐
   0(用意したDBの項目の初期値)以外の時は
   敵キャラクタ番号(敵固体データ番号+10000)が入っている
   初期値と同じ場合それ以降も初期値なので
   ループ中断で抜けるための分岐。


【13】
 敵キャラクタ番号が設定されていた場合の分岐に移動する
   CSelf12 が 0(項目の初期値) 以外 の場合の分岐へ
 
 1、CSelf11 に 1 を加算(+=)
   CSelf11は、敵の種類の総数を保存しておく変数
   犬、猫、猿、猫、猿の敵グループなら
   犬、猫、猿なので、種類の総数は 3 となる
 2、CSelf1210000割り、余った値を得る
   敵キャラクタ番号10000〜19999なので
   0〜9999の値を得るための処理
 3、出現数 を保存してあるDBから、CSelf13 へ値を代入(=)
   ※ ×┏ 戦闘一時ステータス[基]ではなく
   ※ こちらで用意したDBから値を読み込む。
 4、UDB9:敵キャラ固体データ から CSelf7 へキャラ名を代入(=)
   CSelf12 には敵キャラ固体データの、データ位置が入っている
   キャラ名は文字列なので 文字列変数にしか使えない
 5、CSelf114 以下7 以下 の場合で分岐させる
   基本的にフォントサイズを弄らない場合は
   メッセージの表示だと4行までしか表示できないため。
   4 以下だと CSelf5 を使い
   5〜7 の場合は CSelf6 を使うようにする。
 6、ここで表示する 敵キャラ名、出現数文章を作成する
   文字列変数に組み合わせた文字列を加算(+=)していく。
   ※ \cself[7]にはキャラ名、\cself[13]には出現数が
   ※ \nは改行の特種文字、これを入れ忘れると
   ※ 犬が 1体 あらわれた!猫が 1体 あらわれた!猿が...
   ※ と横に繋がってしまう


【14】
 【11】〜【13】までの処理の解説
 敵の出現最大数の7回ループを行い
 そのループ中に、DBに登録した敵キャラクタ番号を取得。
 キャラクタ番号が0(項目の初期値)以外なら登録されているので
 分岐でキャラクタ番号が初期値の場合はループを抜けるようにしている
 
 0以外だった場合はCSelf11(敵の種類数のカウント用変数)を+1し
 出現数をCSelf13に読み込んでいる
 
 キャラクタ番号のキャラクタ名をUDBの敵固体データから読み込み。
 敵の種類数が4以下の場合と7以下の場合で分岐
   ※ 実際は1〜4、5〜7の分岐となる
 4以下の場合はCSelf5へ、敵キャラクタ名と出現数を加算(+=)し
 7以下の場合はCSelf6へ加算している
 
 後に文章の表示によって、敵の名前等をメッセージ表示させるが
 そのとき基本サイズのフォントの大きさだと
 4行までしか表示できないので
 5種類目以降はCSelf6になり、2回文章の表示を行う。

【15】
 1、ループの終わりの次の行 に
   CSelf11(敵の種類数) を条件にした分岐を追加する。
   ※ 5 以上の分岐を先に置き
   ※ 次の条件に 1 以上とすれば
   ※ 1〜4 と 5以上 の分岐に分けられる
 2、分岐内文章の表示を追加する。
   敵の種類数が 5種類 以上なら
   CSelf5を表示した後に CSelf6も表示させる。
   4行ずつに分けて別々の文字列変数に分けているため
   それぞれの文字列変数を表示しなければいけない。
   


【16】
 それでは戦闘を行ってどうなったか確認してみましょう
 
 ◆バトルを発生させたいを参考にして
 てきとうな相手との戦闘を発生させてみてください。
 
 敵が全て表示されたあとに
 敵のキャラ名と出現数を文字列で表示されましたか?
 
 されていれば成功です。
 
 >>> うまくいかない場合の可能性 <<<
 1、DBのデータ読み込み位置が間違っている
 2、ループ回数が間違っている
 3、項目の初期値と条件分岐に使う初期値の値が違う
 4、指定するコモンセルフ変数の間違い
 5、キャラクタ番号を%=10000し忘れている
 6、文字列変数の最後に\n(改行文字)を入れ忘れている
 


【17】
 文字列に特種文字の
 【文字の性質変化】や【文字表示の制御】などを使うと、演出の幅が広がりますね。
 
 また文字表示の分岐の終わりにウェイトをいくらかいれると
 戦う、逃げるの選択肢が出るまでの間を調整できます。
 
 無事処理が上手く動いた人もダメだった人もお疲れ様でした。


<執筆者:きじこ> 


【←にフレームが表示されていない方はここをクリック】