【ウディタSRPG】バグ修正②
前回の続きですが、今回は軽めに済ませる...予定!
敵ユニットが撃破済みユニットをターゲットにする
銀日記さんのSRPGシステムで書いた通り、撃破されたユニット(マップEv)は座標(0,0)に移動され、透明にする事でマップ上から消えたように見せています。なので、原則的にこの座標(0,0)に存在するユニット(マップEv)は無視した処理設計にしなければならないのですが、どうやら敵ユニットの動きはそうなってなさそう。
この通り、味方ユニットが撃破された途端に敵ユニットは座標(0,0)を目指してしまいます。
※生存している相手=味方ユニットが座標(0,0)よりも近くにいれば正常に動作する
修正は簡単。
コモンEv46[■評価値計算]の射程、範囲それぞれで探索する以下2か所で、座標(0,0)は探索しないようにすれば良いだけです。
※コメントが探索とか探査とかなってるけど気にしない
上(射程)と下(範囲)で修正方法が違うのですがどっちのやり方でも大丈夫なはず。
元々ショートカットが設置されていたので下(範囲)の修正ではそのままそれを利用してますが、僕は極力ショートカットは使いたくない派なので上(射程)の修正ではいわゆるcontinue文みたいな処理を書いてます。
ショートカットはgo to文みたいで嫌なんですよね...。
敵ユニットが座標の小さいユニットを優先してターゲットにする
例えばこんな状態の時、ゴブリン弟さんはどのニワトリをターゲットにすると思いますか?直感的には、右下のニワトリをターゲットにすると思いますよね。一番近いので。
ですがこれ、左上のニワトリに向かってしまうんですよね…。
どうしてこうなってしまうのでしょう?
原因はこれ。
赤いマスはゴブリン弟さんにとって、
ターゲットのユニットまで1マス
攻撃すればターゲット1機に命中
という条件を等しく満たしていて、つまりどの赤いマスも評価値が同じなんです。
で、評価値は左上のマスから計算しているので、最初に評価値が最高点になったマスが有効と判断されていたわけです。
※今回の場合、赤いマスだけ見ると上記の順番で評価点を計算している
修正方法はこんな感じでどうでしょ。
コモンEv46[■評価値計算]で、座標と自分との距離が短いほど評価値が高くなるという処理にしました。
適宜変数には名前を付けていくのでヨロシク
これだけだとまた前回の何もしないほうが評価値が高いという結果になってしまうので、もう一工夫必要です。
このままだと
「自分との距離が短ければいい?せや!動かなければええやん!」
となってしまうので、前回修正した箇所をちょっとだけ加筆します。
敵ユニットのステータスで行動回数が正常に反映されない
可変DB[キャラデータ]では各ユニットのステータスが管理されていて、味方ユニットはこの項目行動可能最大数(と残行動回数)を2に変えれば、1ターン中に2回行動できるようになります。ですが敵ユニットはこの項目の数値を変えても正常に動作しない場合がありました。
調べてみると、コモンEv23[┗相手ターン]に原因がありました。
ここでは、CSelf24[使用スキルID]がー1なら何もせず、そうでないならパネルを表示したりスキルを使用したりしていますね。
そんで104行目のコモンEv43[■まだ行動可能か?]では行動回数をー1する処理が行われています。
しかしその後、128行目でも同じく行動回数をー1する処理が行われているんです。
これが原因で、敵ユニットは攻撃する時だけ行動回数がー2されるという現象が生じていたようです。
これも修正は簡単。まずは二回目に行動回数をー1してしまっていた処理を削除します。
このままだとCSelf24[使用スキルID]がー1、つまり敵ユニットが攻撃しない場合は行動回数がー1されないという事になってしまうので、以下の個所に行動回数をー1する処理を追加しましょう。
行動回数をー1する処理の位置を移動しただけですね。
敵ユニットがスキル使用時、パネルが正常に消去されない
これはスキル「自爆」の場合が一番わかりやすいので、まずはこれを見てください。味方ユニットの場合
敵ユニットの場合
敵ユニットの時だけ、スキル使用時に攻撃範囲パネルが普通に残ってて邪魔なんです。
この敵ユニットの攻撃時に攻撃範囲パネルを薄くしている処理はコモンEv23[┗相手ターン]の103行目。
銀日記さんのSRPGシステムでも書いた通り、攻撃範囲パネルはコモンEv30[☆範囲表示]にて並列実行してます。
このコモンEvの起動条件は変数V1-3[攻撃範囲表示]が1の時なので、コモンEv23[┗相手ターン]の100行目で0をセットしていているので別に問題なさそうに見えますね...。
結局原因は何だったのかというと、恐らくコモンEv23[┗相手ターン]の103行目時点では並列実行が停止していなくて、それで103行目の攻撃範囲パネルを薄くする処理が無意味になっているのではないかなと。
実際、100行目で変数V1-3[攻撃範囲表示]に0をセットした直後に1フレームのウェイトを入れるだけでこのバグは解消されます。
※変数V1[戦闘ステート(1/2/3/4/5・・・]も同じ処理になってるみたいなので、並列処理が即終了しないのはそういうウディタの仕様なんですかね?
なんだか力業で問題解決してしまった感じがしてモヤモヤ。
まあ並列処理を別スレッドと考えればスレッド待ちする必要があると思うんですけd
詳しい人いたら教えてw
※2022/6/6 追記
ウディタ公式サイトのヘルプページにそれっぽい仕様解説が載ってました。
※並列実行のイベントは、条件が満たされなくなった段階で、たとえイベントの途中であっても処理が中断されてしまいます(ただし、処理高速化の副作用で、変数操作などの「絶対にウェイトが入らないコマンド」は続けて処理されてしまいます)。
また、イベントの途中でマップ移動した時も処理が中断され、条件を満たす場合は初めから再開されます。
攻撃先の探索に座標(0,0)を含んでいる
ユニットが1機以上撃破されている状態で、座標(0,0)に攻撃してみると、何もいないはずの空間に攻撃アニメーションが表示されます。これは撃破され、透明になって座標(0,0)に移動されたユニット(コモンEv)に反応してしまっているようですね。
そもそも座標(0,0)を攻撃対象に選択できるのがな...と思ったので、パネルが表示されない+選択できないように修正してみました!
選択はできるけど攻撃は実行されない、とかでもおk。
お疲れ様でした。
これで一通りバグ修正は完了です。