#============================================================================== # ■ RGSS3 拡張混乱 Ver1.00 by 星潟 #------------------------------------------------------------------------------ # 通常、混乱時は通常攻撃を自動で繰り返すのみですが # このスクリプトを使用する事でスキルやアイテムを含めた # 多様な混乱行動を行うようになります。 # 「行動制約:味方を攻撃する」のステートがかかっている事と # 拡張混乱フラグが有効な特徴を有する項目が存在する事と # 優先度と重みが設定された拡張混乱設定が1つ以上存在している事が # 拡張混乱発生の前提となります。 # つまり、必ずしも「行動制約:味方を攻撃する」のステートそのものに # 拡張混乱の設定が付与されている必要はありません。 # アクターに設定することで、アクターによって混乱の内容を変える事も出来ます。 # # 動作としては特徴を有する項目が持つ拡張混乱設定の中から有効な物を # その設定が持つ優先度と重みに応じて1つ選び # 更にその設定の中から設定内容と優先度と重みに応じてアイテム・スキルリストを作り # その中から有効な物を行動内容として決定。 # 更に設定に応じてターゲットの逆転を行い、実行するという形です。 #============================================================================== # 特徴を有する項目(アクター・エネミー・職業・装備品・ステート等)のメモ欄に指定 # 共通して優先度と重み計算の部分はアクターを対象とするスクリプト式が可能です。 #------------------------------------------------------------------------------ # <拡張混乱フラグ> # # 拡張混乱フラグを立てます。 #------------------------------------------------------------------------------ # <拡張混乱設定> # # 拡張混乱に関する設定をこの次の行から行っていきます。 # また、再びこれを記述する事で設定を終了します。 # 以下9つは2つの<拡張混乱設定>が存在する行の間に記述して下さい。 # このうち、「拡張混乱優先度設定」は必須となります。 #------------------------------------------------------------------------------ # <拡張混乱優先度設定:50,100> # # この拡張混乱設定の優先度と重みを設定します。 # この場合、優先度50、重み100となります。 # 「優先度が最も高い拡張混乱設定のもののみが行動対象候補」となり # その中で重みが大きい拡張混乱の設定ほど選ばれやすくなります。 # これは拡張混乱行動スキルID指定等の優先度や重みではなく # 「拡張混乱設定の優先度と重み」である事を理解して下さい。 #------------------------------------------------------------------------------ # <拡張混乱ターゲット逆転率:75> # # この拡張混乱設定でのターゲット逆転率を設定します。 # この場合、味方を対象とするアイテム・スキルは敵に。 # 敵を対象とするアイテム・スキルは味方に。 # 自分自身を対象とするアイテム・スキルは自分が対象となります。 #------------------------------------------------------------------------------ # <拡張混乱行動スキルID指定:25,10,30> # # この拡張混乱設定でスキルID25を覚えていて使用も出来る場合 # スキルID25を優先度10、重み30の設定で候補に追加します。 # 優先度が高い行動候補が他にある場合は候補に追加されません。 #------------------------------------------------------------------------------ # <拡張混乱行動特殊スキルID指定:25,10,30> # # この拡張混乱設定でスキルID25のコストに問題が無い場合 # 優先度10、重み30の設定で候補に追加します。 # こちらは覚えている必要は必要もありません。 # 優先度が高い行動候補が他にある場合は候補に追加されません。 #------------------------------------------------------------------------------ # <拡張混乱行動アイテムID指定:25,10,30> # # この拡張混乱設定でアイテムID25を所持していて使用も出来る場合 # アイテムID25を優先度10、重み30の設定で候補に追加します。 # 優先度が高い行動候補が他にある場合は候補に追加されません。 #------------------------------------------------------------------------------ # <拡張混乱行動時攻撃使用:10,100> # # この拡張混乱設定で通常攻撃が可能な場合 # 通常攻撃スキルIDに対応したスキルを優先度10、重み100の設定で候補に追加します。 #------------------------------------------------------------------------------ # <拡張混乱行動時防御使用:10,100> # # この拡張混乱設定で防御が可能な場合 # 防御スキルIDに対応したスキルを優先度10、重み100の設定で候補に追加します。 #------------------------------------------------------------------------------ # <拡張混乱行動時スキル自由使用:10,5> # # この拡張混乱設定において付与されている者が使用可能な全てのスキルを # 優先度10、重み30の設定で候補に追加します。 #------------------------------------------------------------------------------ # <拡張混乱行動時アイテム自由使用:10,30> # # この拡張混乱設定において付与されている者が使用可能な全てのアイテムを # 優先度10、重み30の設定で候補に追加します。 #============================================================================== # アイテム・スキルのメモ欄に指定 #------------------------------------------------------------------------------ # <拡張混乱ターゲット逆転禁止> # # このアイテム・スキルは拡張混乱ターゲット逆転率の影響を受けません。 #------------------------------------------------------------------------------ # <拡張混乱時自由使用禁止> # # このアイテム・スキルは拡張混乱行動時スキル自由使用や # 拡張混乱行動時アイテム自由使用の設定による行動可能候補になりません。 #------------------------------------------------------------------------------ # <拡張混乱自由使用時重み指定:200> # # このアイテム・スキルは拡張混乱行動時スキル自由使用や # 拡張混乱行動時アイテム自由使用の設定によって # どのスキルが選ばれるかを決定する際に重みを計算される時 # このアイテム・スキルについては重みは200として計算されます。 # (設定しない場合、重みは100として扱われます) # スクリプト式による指定も可能です。 #============================================================================== module EnhancedConfuseAction #拡張混乱フラグの設定用キーワードを指定。 Word0 = "拡張混乱フラグ" #拡張混乱設定の設定用キーワードを指定。 Word1 = "拡張混乱設定" #拡張混乱優先度設定の設定用キーワードを指定。 Word2 = "拡張混乱優先度設定" #拡張混乱ターゲット逆転率の設定用キーワードを指定。 Word3 = "拡張混乱ターゲット逆転率" #拡張混乱行動スキルID指定の設定用キーワードを指定。 Word4 = "拡張混乱行動スキルID指定" #拡張混乱行動特殊スキルID指定の設定用キーワードを指定。 Word5 = "拡張混乱行動特殊スキルID指定" #拡張混乱行動アイテムID指定の設定用キーワードを指定。 Word6 = "拡張混乱行動アイテムID指定" #拡張混乱行動時攻撃使用の設定用キーワードを指定。 Word7 = "拡張混乱行動時攻撃使用" #拡張混乱行動時防御使用の設定用キーワードを指定。 Word8 = "拡張混乱行動時防御使用" #拡張混乱行動時スキル自由使用の設定用キーワードを指定。 Word9 = "拡張混乱行動時スキル自由使用" #拡張混乱行動時アイテム自由使用の設定用キーワードを指定。 Word10 = "拡張混乱行動時アイテム自由使用" #拡張混乱ターゲット逆転禁止の設定用キーワードを指定。 Word11 = "拡張混乱ターゲット逆転禁止" #拡張混乱時自由使用禁止の設定用キーワードを指定。 Word12 = "拡張混乱時自由使用禁止" #拡張混乱自由使用時補正の設定用キーワードを指定。 Word13 = "拡張混乱自由使用時重み指定" end class Game_Action attr_accessor :enhanced_confuse_action #-------------------------------------------------------------------------- # クリア #-------------------------------------------------------------------------- alias clear_enhanced_confuse_action clear def clear clear_enhanced_confuse_action @enhanced_confuse_setting = nil end #-------------------------------------------------------------------------- # 行動準備 #-------------------------------------------------------------------------- alias prepare_enhanced_confuse_action prepare def prepare if @enhanced_confuse_setting if item && subject.usable?(item) @forcing = true else clear end end prepare_enhanced_confuse_action end #-------------------------------------------------------------------------- # 混乱行動を設定 #-------------------------------------------------------------------------- alias set_confusion_enhanced_confuse_action set_confusion def set_confusion if !@enhanced_confuse_setting eca = @subject.enhanced_confuse_action if !eca.empty? && @subject.confusion_level == 3 priority = -1 weight_total = 1 r = [] rs = {} eca.each {|h| next if h.empty? if h[:priority] > priority r.clear priority = h[:priority] weight_total = 1 elsif h[:priority] < priority next end r.push(h) weight_total += h[:weight] } rt = rand(weight_total) r.shuffle! r.each {|h| rt -= h[:weight] if rt <= 0 rs = h break end} @enhanced_confuse_setting = rs unless rs.empty? end end set_confusion_enhanced_confuse_action end #-------------------------------------------------------------------------- # 通常攻撃を設定 #-------------------------------------------------------------------------- alias set_attack_enhanced_confuse_action set_attack def set_attack if @enhanced_confuse_setting set_enhanced_confuse_action else set_attack_enhanced_confuse_action end end #-------------------------------------------------------------------------- # 混乱行動のスキル/アイテムを決定 #-------------------------------------------------------------------------- def set_enhanced_confuse_action r = [] ri = 1 weight_total = 1 priority = -1 @subject.enhanced_confuse_skills(@enhanced_confuse_setting).each {|h| set_skill(h[:item_id]) next unless valid? if priority < h[:priority] r.clear priority = h[:priority] weight_total = 0 elsif priority > h[:priority] next end r.push(h) weight_total += h[:weight] } @subject.enhanced_confuse_items(@enhanced_confuse_setting).each {|h| set_item(-h[:item_id]) next unless valid? if priority < h[:priority] r.clear priority = h[:priority] weight_total = 0 elsif priority > h[:priority] next end r.push(h) weight_total += h[:weight] } rt = rand(weight_total) r.shuffle! r.each {|h| rt -= h[:weight] if rt < 0 ri = h[:item_id] break end } ri < 0 ? set_item(-ri) : set_skill(ri) @forcing = true end #-------------------------------------------------------------------------- # 味方ユニットを取得 #-------------------------------------------------------------------------- alias friends_unit_enhanced_confuse_action friends_unit def friends_unit if @enhanced_confuse_setting && item && !item.anti_enhanced_confuse_target_reverse && !@unit_replace && eval(@enhanced_confuse_setting[:reverse]) > rand(100) @unit_replace = true r = opponents_unit @unit_replace = nil r else friends_unit_enhanced_confuse_action end end #-------------------------------------------------------------------------- # 敵ユニットを取得 #-------------------------------------------------------------------------- alias opponents_unit_enhanced_confuse_action opponents_unit def opponents_unit if @enhanced_confuse_setting && item && !item.anti_enhanced_confuse_target_reverse && !@unit_replace && eval(@enhanced_confuse_setting[:reverse]) > rand(100) @unit_replace = true r = friends_unit @unit_replace = nil r else opponents_unit_enhanced_confuse_action end end #-------------------------------------------------------------------------- # ターゲットの配列作成 #-------------------------------------------------------------------------- alias make_targets_enhanced_confuse_action make_targets def make_targets last_forcing = @forcing @forcing = @enhanced_confuse_setting ? true : false r = make_targets_enhanced_confuse_action @forcing = last_forcing r end end class Game_Battler #-------------------------------------------------------------------------- # 拡張混乱行動取得 #-------------------------------------------------------------------------- def enhanced_confuse_action fs = feature_objects return [] unless fs.any? {|f| f.enhanced_confuse_flag} fs.collect {|f| h = f.enhanced_confuse_setting.clone if h.empty? {} else h[:priority] = eval(h[:priority]) h[:weight] = eval(h[:weight]) h end} end #-------------------------------------------------------------------------- # 拡張混乱行動スキル取得 #-------------------------------------------------------------------------- def enhanced_confuse_skills(setting) r = [] ss = enhanced_confuse_usable_skills setting[:skills].each {|hash| item = $data_skills[hash[:item_id]] next unless item next unless ss.include?(item) h = { :item_id => hash[:item_id], :priority => eval(hash[:priority]), :weight => eval(hash[:weight])} r.push(h)} if setting[:skills] setting[:special_skills].each {|hash| item = $data_skills[hash[:item_id]] next unless item h = { :item_id => hash[:item_id], :priority => eval(hash[:priority]), :weight => eval(hash[:weight])} r.push(h)} if setting[:special_skills] sh = setting[:attack] if sh && attack_usable? h = { :item_id => attack_skill_id, :priority => eval(sh[:priority]), :weight => eval(sh[:weight])} r.push(h) if h[:weight] > 0 end sh = setting[:guard] if sh && guard_usable? h = { :item_id => guard_skill_id, :priority => eval(sh[:priority]), :weight => eval(sh[:weight])} r.push(h) if h[:weight] > 0 end sh = setting[:usable_skills] if sh tr = [] tr_weight_total = 0 ss.each {|item| next unless item.enhanced_confuse_usable t = item.enhanced_confuse_weight iecw = t.empty? ? 100 : eval(t) a = [item.id,iecw] if a[1] > 0 tr_weight_total += a[1] tr.push(a) end} unless tr.empty? tr.shuffle! trw = rand(tr_weight_total) tr.each {|a| trw -= a[1] if trw < 0 r.push( {:item_id => a[0], :priority => eval(sh[:priority]), :weight => eval(sh[:weight])}) break end} end end r end #-------------------------------------------------------------------------- # 拡張混乱行動使用可能アイテム習得 #-------------------------------------------------------------------------- def enhanced_confuse_items(setting) [] end end class Game_Actor < Game_Battler #-------------------------------------------------------------------------- # 拡張混乱行動使用可能スキル取得 #-------------------------------------------------------------------------- def enhanced_confuse_usable_skills usable_skills end #-------------------------------------------------------------------------- # 拡張混乱行動使用可能アイテム習得 #-------------------------------------------------------------------------- def enhanced_confuse_items(setting) r = [] setting[:items].each {|hash| item = $data_items[hash[:item_id]] next unless item next unless item h = { :item_id => -hash[:item_id], :priority => eval(hash[:priority]), :weight => eval(hash[:weight])} r.push(h) if h[:weight] > 0} if setting[:items] sh = setting[:usable_items] if sh tr = [] tr_weight_total = 0 $game_party.items.each {|item| next unless item.enhanced_confuse_usable t = item.enhanced_confuse_weight iecw = t.empty? ? 100 : eval(t) a = [item.id,iecw] if a[1] > 0 tr_weight_total += a[1] tr.push(a) end} unless tr.empty? tr.shuffle! trw = rand(tr_weight_total) tr.each {|a| trw -= a[1] if trw < 0 r.push( {:item_id => -a[0], :priority => eval(sh[:priority]), :weight => eval(sh[:weight])}) break end} end end r end end class Game_Enemy < Game_Battler #-------------------------------------------------------------------------- # 拡張混乱行動使用可能スキル取得 #-------------------------------------------------------------------------- def enhanced_confuse_usable_skills ((enemy.actions.select {|a1| action_valid?(a1)} ).collect {|a2| $data_skills[a2.skill_id]}).uniq end end class RPG::BaseItem #-------------------------------------------------------------------------- # 混乱時拡張混乱フラグ #-------------------------------------------------------------------------- def enhanced_confuse_flag (@enhanced_confuse_flag ||= /<#{EnhancedConfuseAction::Word0}>/ =~ note ? 1 : 0) == 1 end #-------------------------------------------------------------------------- # 拡張混乱設定 #-------------------------------------------------------------------------- def enhanced_confuse_setting @enhanced_confuse_setting ||= create_enhanced_confuse_setting end #-------------------------------------------------------------------------- # 拡張混乱設定 #-------------------------------------------------------------------------- def create_enhanced_confuse_setting h = {} flag = false note.each_line {|l| f = /<#{EnhancedConfuseAction::Word1}>/ =~ l if f if flag break else flag = true end end if flag if !h[:priority] && /<#{EnhancedConfuseAction::Word2}[::](\S+),(\S+)>/ =~ l h[:priority] = $1.to_s h[:weight] = $2.to_s next end if !h[:reverse] && /<#{EnhancedConfuseAction::Word3}[::](\S+)>/ =~ l h[:reverse] = $1.to_s next end if /<#{EnhancedConfuseAction::Word4}[::](\d+),(\S+),(\S+)>/ =~ l h[:skills] ||= [] h[:skills].push({:item_id => $1.to_i,:priority => $2.to_s,:weight => $3.to_s}) next end if /<#{EnhancedConfuseAction::Word5}[::](\d+),(\S+),(\S+)>/ =~ l h[:special_skills] ||= [] h[:special_skills].push({:item_id => $1.to_i,:priority => $2.to_s,:weight => $3.to_s}) next end if /<#{EnhancedConfuseAction::Word6}[::](\d+),(\S+),(\S+)>/ =~ l h[:items] ||= [] h[:items].push({:item_id => $1.to_i,:priority => $2.to_s,:weight => $3.to_s}) next end if /<#{EnhancedConfuseAction::Word7}[::](\S+),(\S+)>/ =~ l h[:attack] = {:priority => $1.to_s,:weight => $2.to_s} next end if /<#{EnhancedConfuseAction::Word8}[::](\S+),(\S+)>/ =~ l h[:guard] = {:priority => $1.to_s,:weight => $2.to_s} next end if /<#{EnhancedConfuseAction::Word9}[::](\S+),(\S+)>/ =~ l h[:usable_skills] = {:priority => $1.to_s,:weight => $2.to_s} next end if /<#{EnhancedConfuseAction::Word10}[::](\S+),(\S+)>/ =~ l h[:usable_items] = {:priority => $1.to_s,:weight => $2.to_s} next end end} return {} unless h[:priority] h[:reverse] ||= "0" h end end class RPG::UsableItem < RPG::BaseItem #-------------------------------------------------------------------------- # 拡張混乱ターゲット逆転禁止 #-------------------------------------------------------------------------- def anti_enhanced_confuse_target_reverse (@anti_enhanced_confuse_target_reverse ||= /<#{EnhancedConfuseAction::Word11}>/ =~ note ? 1 : 0) == 1 end #-------------------------------------------------------------------------- # 拡張混乱時使用可否 #-------------------------------------------------------------------------- def enhanced_confuse_usable (@enhanced_confuse_usable ||= /<#{EnhancedConfuseAction::Word12}>/ =~ note ? 0 : 1) == 1 end #-------------------------------------------------------------------------- # 拡張混乱自由使用時重み指定 #-------------------------------------------------------------------------- def enhanced_confuse_weight @enhanced_confuse_weight ||= /<#{EnhancedConfuseAction::Word13}[::](\S+)>/ =~ note ? $1.to_s : "" end end