#============================================================================== # ■ RGSS3 エネミー最適化行動スキル Ver1.00 by 星潟 #------------------------------------------------------------------------------ # 敵の行動に味方と同じような最適行動をとらせるスキルIDを設定できます。 # そのスキルIDのスキルが敵の行動として選択された際 # そのスキルを使用せず、アクター側の自動行動と同じように # そのエネミーに設定された使用可能なスキルの中から # 最適な物(行動評価値が高いスキル)を自動選択して使用します。 # この際、エネミーに設定した行動条件や優先度は完全に無視されます。 # # 最適化行動をとり、なおかつ使用スキルの対象がランダムでない場合 # 狙われ率を無視して対象を選択して来ます。 # また、あくまで自動行動で最適と判断されたスキルの為 # 本当の意味で最適化されている物とは言えません。 # (複数のエネミーが最適行動を取る場合、回復が単体に偏る等) # # 行動評価値の計算の基本部分はアクターと同じ為 # その部分の修正スクリプトがある場合、こちらにも影響があります。 #============================================================================== # スキルのメモ欄に設定。 #============================================================================== # <敵行動評価変動値:10> # # このスキルの評価として、本来の評価に加え、対象のHPを10%削れるのと # 同等の価値があると見做されます。 #============================================================================== # <最適行動時禁止> # # このスキルは最適化行動の際に使用するスキルに含まれません。 #============================================================================== # 敵のメモ欄に設定。 #============================================================================== # <最適行動時禁止:10> # # この敵は最適行動時にスキルID10を選択しません。 #============================================================================== # <最適行動時禁止:10,11,12> # # この敵は最適行動時にスキルID10、11、12を選択しません。 #============================================================================== module OptimisationEA #最適行動化スキルIDを指定。 SID = 25 #最適行動用評価値変動値設定用キーワードを指定。 Word1 = "敵行動評価変動値" #最適行動時に除外するスキル設定用キーワードを指定。 Word2 = "最適行動時禁止" end class Game_Action #-------------------------------------------------------------------------- # 敵キャラの戦闘行動を設定 #-------------------------------------------------------------------------- alias set_enemy_action_optimisation_ea set_enemy_action def set_enemy_action(action) return optimisation_action_set if action && action.skill_id == OptimisationEA::SID set_enemy_action_optimisation_ea(action) end #-------------------------------------------------------------------------- # 最適行動をセット #-------------------------------------------------------------------------- def optimisation_action_set a = @subject.optimisation_best_action set_skill(a[0]) @target_index = a[1] end end class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # 最適行動関連配列を取得 #-------------------------------------------------------------------------- def optimisation_best_action h = {} sa = enemy.optimisation_use_seal enemy.actions.each {|act| d = act.skill_id next if !d or d < 0 next if d == OptimisationEA::SID next if h[d] next if sa.include?(d) s = $data_skills[d] next unless s next if s.optimisation_use_seal ga = Game_Action.new(self) ga.set_skill(d) ga.evaluate e = ga.value + eval(s.optimisation_evaluate).to_f / 100 h[d] = [e,ga.target_index] e} tk = h.keys.max_by {|k| h[k][0]} [tk,h[tk][1]] end end class RPG::Skill < RPG::UsableItem #-------------------------------------------------------------------------- # 敵行動評価変動値 #-------------------------------------------------------------------------- def optimisation_evaluate @optimisation_evaluate ||= /<#{OptimisationEA::Word1}[::](\S+)>/ =~ note ? $1.to_s : "0" end #-------------------------------------------------------------------------- # 最適行動時禁止 #-------------------------------------------------------------------------- def optimisation_use_seal (@optimisation_use_seal ||= /<#{OptimisationEA::Word2}>/ =~ note ? 1 : 0) == 1 end end class RPG::Enemy < RPG::BaseItem #-------------------------------------------------------------------------- # 最適行動時禁止 #-------------------------------------------------------------------------- def optimisation_use_seal @optimisation_use_seal ||= create_optimisation_use_skill end #-------------------------------------------------------------------------- # 最適行動時禁止データ作成 #-------------------------------------------------------------------------- def create_optimisation_use_skill t = /<#{OptimisationEA::Word2}[::](\S+)>/ =~ note ? $1.to_s : "" (t.split(/\s*,\s*/).inject([]) {|r,i| r += [i.to_i]}).uniq end end