【解決済み】自動戦闘で意図した行動をさせる

ブラインド
記事: 2
登録日時: 2019年3月04日(月) 15:55

【解決済み】自動戦闘で意図した行動をさせる

投稿記事by ブラインド » 2019年3月06日(水) 09:41

自動戦闘じゃ防御を使ってくれないので、Game_Actionの行動の価値評価に
MPが最大MPの25%以下かつTPが20以上で防御、TPが足りなれば攻撃
というコードを書いてみたんですが
ここからステートも条件に加えようと思いました。

やりたいのはMPが25%以下でステート:○○なら○○させる、というもので
TPのほうは無視したいのですが、ifからifさせるような書き方がわからず
消すにも正しく動作しなくなる為、残しています。if subject.state?(7)というのはその名残です。

なので正しい分岐のさせ方をご教授いただけたらと思います。

しかし、Game_Actionに書くと行動を無理やり変化させてるようで
競合しやすいような気がしますがその辺は大丈夫なんでしょうか?あまりスクリプトの知識がないので・・・



コード: 全て選択

  def evaluate
    @value = 0
    stamina = subject.mmp / 4
    kiai = subject.tp
        if subject.mp <= stamina
          if subject.state?(7)
          else if kiai <= 20
          set_attack
          else
          set_skill(subject.guard_skill_id)
        end
        end
    end
    evaluate_item if valid?
    @value += rand if @value > 0
    self
  end
最後に編集したユーザー ブラインド on 2019年3月09日(土) 09:49 [ 編集 1 回目 ]

ecf5DTTzl6h6lJj02
記事: 2
登録日時: 2018年12月23日(日) 13:55

Re: 自動戦闘で意図した行動をさせる

投稿記事by ecf5DTTzl6h6lJj02 » 2019年3月09日(土) 03:17

こんにちは。

まず、根本的な間違いを指摘しなければなりません。

Game_Action 内に記述されているメソッド evaluate は
アクターが行える行動(使用できるスキル)を評価し、点数を返すもので、
ここで、アクターの行動を決定しているわけではありません。
ここに、行動を決定するスクリプトを書いても、うまく動作しない可能性がありますし、書かないほうが良いと思います。

ある条件化において自動戦闘での行動を制御したい場合には、
make_auto_battle_actions というメソッドを変更したほうがいいでしょう。
このメソッドは VXAce_SP1 の中で記述されています。

質問の内容に関して、どう書けばいいかですが、
まず、 make_auto_battle_actions の中身を解説しておきます。

コード: 全て選択

def make_auto_battle_actions
  @actions.size.times do |i|
    @actions[i] = make_action_list.max_by {|action| action.value }
  end
end

この関数では、攻撃、及び、現在アクターが使用できるスキルに対して点数をつけ、点数の一番高いものを、アクターの行動として選択するというスクリプトが書かれています。
点数は ダメージの割合(敵の残りHPの何割を削れるか)、もしくは、回復の割合で決定されていて、ダメージ(回復量)の無いスキルに関しては、一律で0点となっています。
(Game_Action 内の evaluate_item_with_target というメソッドの中身を見るとなんとなくわかります)
なので、状態異状回復スキルや強化・弱体スキルが使われることはありませんし、防御スキルにいたっては最初から、評価対象に含まれていなかったりします。

では、質問の内容を実現させるためには、どのように記述すればよいかですが、
下記の記述で、実現できると思います。(一応確認したはずなんですが、エラーとか出たらすみません)

コード: 全て選択

#元のスクリプトの保持のため、
#▼素材 の一番最後に項目を追加してペーストしてください

class Game_Actor
   #--------------------------------------------------------------------------
   # ● 自動戦闘時の戦闘行動を作成
   #--------------------------------------------------------------------------
   #エイリアス ・・・する意味あまり無いけど
   alias make_auto_battle_actions_origin make_auto_battle_actions
   def make_auto_battle_actions
      @actions.size.times do |i|      #アクターの行動回数分繰り返し
         #MPが25%以下かつ(検査したい番号の)ステートが付与されているか
         if self.mp_rate <= 0.25 && self.state?(検査したいステートの番号)
            #ここにさせたい行動を記述今回は防御させるものとして記述----------
            
            #@actionはGame_Actionの配列なので、
            #Game_Actionオブジェクトを作成して、set_guardメソッドを実行して
            #防御を行動として登録する
            @actions[i] = Game_Action.new(self).set_guard   
            
            #----------------------------------------------------------------
         else
               #条件に当てはまらなかったときは通常通り行動を決定
               @actions[i] = make_action_list.max {|action| action.value }
         end
      end
   end
end

A かつ B という条件は A && B という式で記述できます。また、
AまたはBという条件は A || B という式で記述できます。
組み合わせれば、 A または B かつ C というような条件の式も記述できます。
詳しくは、ヘルプのRGSSリファレンスで確認してください(Rubyの文法-演算子式の項目に記述されています)
ブラインド
記事: 2
登録日時: 2019年3月04日(月) 15:55

Re: 自動戦闘で意図した行動をさせる

投稿記事by ブラインド » 2019年3月09日(土) 09:48

返信ありがとうございます。
自分のスクリプト、何かおかしいと思っていましたが、
まさか記述がVXAce_SP1にあるとは。

ともあれ、頂いたスクリプトは無事動作しているようで、
改変も楽にできそうで助かります。ありがとうございました。

“VX / Ace:質問” へ戻る