#============================================================================== # ■ RGSS3 自動戦闘プチ拡張・修正 Ver1.10 by 星潟 #------------------------------------------------------------------------------ # プリセットスクリプトの自動戦闘を拡張します。 #------------------------------------------------------------------------------ # Ver1.00 # # ・VXAceVer1.01アップデートに伴い、精度調整属性と自動戦闘方式の選択を廃止。 # ・スクリプト名称を変更。 # # Ver1.10 # # ・一部処理を効率化。 # ・行動の評価時に分散度の計算に手を加える設定を追加。 # ・行動の評価時に余分な乱数を評価値に加えない設定を追加。 #------------------------------------------------------------------------------ # 当方の自動戦闘時のスキル封印やスキル整理スクリプトを使用されている場合 # このスクリプトの仕様上、必ずそれらよりも上に配置して下さい。 #============================================================================== module VX_AUTO #自動戦闘を行う際、スキルタイプによる追加済み判定も #行うように変更するか否かを選択します。 #なお、ここでの使用可否とは「スキルタイプの封印」による判定ではなく #「スキルタイプの追加」が行われているかどうかです。 #trueの場合……該当スキルのスキルタイプが追加されていなければ使用できない。 #falseの場合……スキルタイプが追加されていなくても使用できる。 STYPE_S = true #有効な行動がない場合の、行動の優先順位を設定します。 #以下の5パターンの何れかを設定。 #0、1、2、3、その他のどれかで、なおかつ攻撃が禁止されている場合や #防御が禁止されている場合は、次に優先度の高い行動を行います。 #0の場合……攻撃>防御>何もしない #1の場合……防御>攻撃>何もしない #2の場合……攻撃=防御>何もしない #3の場合……何もしない #それ以外の場合(4など)……一切変更しない EX_ACT = 1 #行動の評価時に分散度を0として計算を行うか? #trueの場合……行動の評価時は分散度の計算を変更する。 #falseの場合……行動の評価時も分散度の計算を変更しない。 RANDB1 = true #行動の評価時にランダム性を抑えるか? #trueの場合……ランダム性を抑える。 #falseの場合……ランダム性を抑えない。 RANDB2 = true end class Game_Battler < Game_BattlerBase attr_accessor :action_test_flag #-------------------------------------------------------------------------- # 分散度の適用 #-------------------------------------------------------------------------- alias apply_variance_randbreak apply_variance def apply_variance(damage, variance) #行動テストのフラグが有効の場合は分散度を0にする。 apply_variance_randbreak(damage, @action_test_flag ? 0 : variance) end end class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # 自動戦闘時の戦闘行動を作成 #-------------------------------------------------------------------------- alias make_auto_battle_actions_randbreak make_auto_battle_actions def make_auto_battle_actions #本来の処理を行う。 make_auto_battle_actions_randbreak #行動内容がこの時点で空であるか #行動タイプ設定が3よりも大きい場合は処理しない。 return if @actions.empty? or VX_AUTO::EX_ACT > 3 #行動数の数だけ処理を行う。 @actions.size.times do |i| #行動の値が0以下の場合は次へ。 next if @actions[i].value > 0 #行動タイプ設定が2の場合は行動タイプ0か1をランダムで設定する。 #そうでない場合は、行動タイプ設定に準じる。 randdata = VX_AUTO::EX_ACT == 2 ? rand(2) : VX_AUTO::EX_ACT #行動タイプ設定に応じて優先順位に基づき、行動を再設定する。 case randdata when 0 #攻撃優先の場合 if attack_usable? #攻撃が可能な場合 @actions[i].set_attack elsif guard_usable? #防御が可能な場合 @actions[i].set_guard else #それ以外の場合 @actions[i] = nil end when 1 #防御優先の場合 if guard_usable? #防御が可能な場合 @actions[i].set_guard elsif attack_usable? #攻撃が可能な場合 @actions[i].set_attack else #それ以外の場合 @actions[i] = nil end when 3 #何もさせない場合 @actions[i] = nil end end #行動をnilにした物があれば、削除する。 @actions.delete(nil) end end class Game_Action #-------------------------------------------------------------------------- # 行動の価値評価(自動戦闘用) #-------------------------------------------------------------------------- alias evaluate_randbreak evaluate def evaluate #行動の評価時のランダム性を抑える場合。 if VX_AUTO::RANDB2 @value = 0 evaluate_item if valid? self else #通常の処理を行う。 evaluate_randbreak end end #-------------------------------------------------------------------------- # スキル/アイテムの評価(ターゲット指定) #-------------------------------------------------------------------------- alias evaluate_item_with_target_randbreak evaluate_item_with_target def evaluate_item_with_target(target) #テストフラグを立てる。 target.action_test_flag = true if VX_AUTO::RANDB1 #本来の処理を実行し、データを保管。 data = evaluate_item_with_target_randbreak(target) #テストフラグを消去する。 target.action_test_flag = nil if VX_AUTO::RANDB1 #データを返す。 data end #-------------------------------------------------------------------------- # 行動が有効か否かの判定 #-------------------------------------------------------------------------- alias valid_high? valid? def valid? #行動が有効か否かを取得。 data = valid_high? #無効ならfalseを返す。 return false if !data #スキルタイプが有効か否かを取得。 data = st_usable?(item) if VX_AUTO::STYPE_S #可否を返す。 return data end #-------------------------------------------------------------------------- # スキルタイプ利用可否による使用可否判定 #-------------------------------------------------------------------------- def st_usable?(item) #エネミーならスキルタイプ利用可否を取得しない。 return true if subject.enemy? #スキルでなおかつスキルタイプが0でなく #街頭のスキルタイプが追加されていない場合はfalseを返す。 if item.is_a?(RPG::Skill) && item.stype_id > 0 return false unless subject.added_skill_types.include?(item.stype_id) end return true end end