こんにちは。
まず、根本的な間違いを指摘しなければなりません。
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の文法-演算子式の項目に記述されています)