RGSS2備忘録その7 臨機応変に行動できる自動戦闘のアクター

バグが見つかったので、こちらをご覧ください。

こんばんわ(´・ω・`)
そろそろQuest Maniaのクエストを作り始めようとしているすっぽんです。
今日は臨機応変に行動できる自動戦闘のアクターって言うのをやります。

こんな場面はあまりないと思いますが、パーティ全員が自動戦闘で、誰か一人だけが
戦闘不能の状態で、全員蘇生可能なスキルをもっているとします。
この状態で、戦闘を開始すると行動可能なアクターは、全員戦闘不能のアクターを
蘇生しようとします。本来なら、一人だけ蘇生させるスキルを使って、他のアクターは
攻撃に回ればいいのですが、自動戦闘だとこのようなことも起こり得ます。

そこで、今日はこのような自動戦闘アクターの無駄な行動を避けるスクリプトを
紹介したいと思います。
自動戦闘のアクターの行動は、ターンごとの戦闘開始前に決定されます。しかし、
この場合、それぞれのアクターは、他のアクターがどのような行動をするのかという
ことをぜんぜん考えてません。なので、戦闘中、行動できる順番が回ってきたら、
再度、行動内容の評価を行い、臨機応変に行動させるようにすれば、前述した
問題を回避することができます。

やりかたは以下のとおりです。
class Battle_Sceneのprocess_actionメソッドを次のように変えてください。
  #--------------------------------------------------------------------------
  # ● 戦闘行動の処理
  #--------------------------------------------------------------------------
  def process_action
    return if judge_win_loss
    return if $game_temp.next_scene != nil
    set_next_active_battler
    if @active_battler == nil
      turn_end
      return
    end
    return if @active_battler.dead?
    @message_window.clear
    wait(5)
    @active_battler.white_flash = true
    unless @active_battler.action.forcing
      @active_battler.action.prepare
    end
    if @active_battler.actor? #★
      @active_battler.make_action if @active_battler.auto_battle
    end #★
    if @active_battler.action.valid?
      execute_action
    end
    unless @active_battler.action.forcing
      @message_window.clear
      remove_states_auto
      display_current_state
    end
    @active_battler.white_flash = false
    @message_window.clear
  end

これで、自動戦闘のアクターは臨機応変に行動できるようになったと思います。
ていうか、こうするとプレイヤーが行動を決めるよりも有利に戦闘が展開します。( ^ω^)

今日はこのへんで
でわ(^▽^)ノシ
スポンサーサイト

テーマ : RPGツクール
ジャンル : ゲーム

コメントの投稿

管理者にだけ表示を許可する

こちらの自動戦闘の強化、すごく良い感じです。

自分の作ってるゲームではプレイヤーが戦闘中に任意で自動戦闘モードに変更できるので、PT全員が自動戦闘になる場合が非常に高いのです。

このようにスクリプトを書き換えた所、行動選択が強化されて無駄が減りました。


それで、自動戦闘のデバッグをしていたところ気になった事が出てきたのです。
元々の自動戦闘時の行動選択の優先度の問題なのでしょうが、弱い敵と遭遇した場合にPT内に戦闘不能キャラが1人居て他のメンバーが全員蘇生スキルを持っている状態で自動戦闘すると蘇生スキルを使わずに3人とも攻撃して敵を殲滅してしまいます。

こういった状況になった場合に敵の強さがどうあれ優先的に蘇生スキルを使うように変更するといった事は可能なのでしょうか?

Re:コメント

ご覧いただきありがとうございます。

質問していただいた内容についてですが、
次のようなやり方ではどうでしょうか?
あまりスマートなやりかたではないかもしれませんが。

まず、Game_BattleActionクラスのinitialize(battler)
の定義で、@revision = 0 (補正の意)というインスタンス変数を
準備しておく。

同クラスのevaluate_skillの定義で、
elsif skill.for_dead_friend?となってる行のすぐ下に
@revision = 1000000 と付け加えておく。

evaluate_skill_with_target(target)の定義の中の
return recovery.to_f / target.maxhp を
return (recovery.to_f / target.maxhp) + @revision に
置き換えて完了です。

ただし、パーティ内に一回の行動で合計1000000以上のダメージを
与えることのできるアクターがいる場合は、優先順位が逆転する可能性。
そういう場合は、@revision = 1000000の部分をもっと大きな値にしてください。

説明が長くなってしまって、
わかりにくくなったかもしれません。

もしわからなかったら、言って下さい。
ブログの記事にスクリプトを載せますので。

問題なく動作しました!
ありがとうございます。

どういたしまして(^^)
プロフィール

Suppon

Author:Suppon
すっぽんでーす。(^▽^)
カルドラ鋭意制作中( ・`ω・´)
Twitter => suppon01
メールはこちらへ
suppon2008@gmail.com

Twitter...

Twitter Reload

最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
ブログ内検索
RSSフィード
リンク
ブロとも申請フォーム

この人とブロともになる