#============================================================================== # ■ RGSS3 アイテム/スキルターゲット拡張 Ver1.03 by 星潟 #------------------------------------------------------------------------------ # 対象を敵・味方両方にしたり # 使用者をターゲットから除外したり、逆に使用者をターゲットに一定回数含めたり # 本来のスキルの対象選択処理を無効化したり、戦闘不能を無視して対象に含めたり # 敵、味方、あるいは無差別に、ランダムに対象を追加したり # 戦闘不能の対象だけを追加したり、全体を追加する事が出来ます。 # また、「ターゲットが存在しなかった」という場合のみ # 敵、味方、あるいは無差別に、ランダムに対象を追加したり # 戦闘不能の対象だけを追加したり、全体を追加するという機能も備えています。 #============================================================================== # 以下使用例。アイテム/スキルのメモ欄に指定。 # メモ欄に記述順に処理が行われ、ターゲットが増減します。 # (<戦闘不能無視>のみ例外で順番に関係なく適用されます) # また、Nは判定回数、Rは判定確率、Sは判定用スクリプトを指します。 # 全て数字でもスクリプト文でも記述する事が可能です。 # キーワードの後が:R,S>もしくは:N,R,S>で締めくくられているものは # ,Sを省略可能です。 # 例.<敵RT追加:N,R> # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 基本ターゲットをそのままターゲットとして追加します。 #------------------------------------------------------------------------------ # <戦闘不能無視> # # 非戦闘不能者、もしくは戦闘不能者を対象とするスキルであっても # この記述があればどちらも関係なく対象となります。 # 例.敵全体の場合、通常の敵全体+戦闘不能の敵全体の扱いになる。 #------------------------------------------------------------------------------ # <基本ターゲット消去:R,S> # # このアイテム/スキルの本来の対象をR%の確率で消去します。 # 使用者がSの条件を満たさない場合は消去されません。 #------------------------------------------------------------------------------ # <拡張ターゲット消去:R,S> # # このアイテム/スキルのこのスクリプトによる拡張ターゲットによって # 追加された対象をR%の確率で消去します。 # 使用者がSの条件を満たさない場合は消去されません。 #------------------------------------------------------------------------------ # <使用者ターゲット除外:R,S> # # 現在までのターゲットから使用者を除外します。 # 使用者がSの条件を満たさない場合は除外されません。 #------------------------------------------------------------------------------ # <基本ターゲット除外:R,S> # # 拡張ターゲットから基本ターゲットに含まれる対象を除外します。 # 使用者がSの条件を満たさない場合は除外されません。 #------------------------------------------------------------------------------ # <使用者ターゲット追加:N,R> # # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 使用者をターゲットとして追加します。 #------------------------------------------------------------------------------ # <基本ターゲット追加:N,R> # # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 基本ターゲットをそのままターゲットとして追加します。 #------------------------------------------------------------------------------ # <敵RT追加:N,R,S> # # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 敵をランダムターゲットで1体選んで追加します。 # Sのスクリプト条件式を満たさない対象はターゲット候補に上がりません。 #------------------------------------------------------------------------------ # <味方RT追加:N,R,S> # # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 味方をランダムターゲットで1体選んで追加します。 # Sのスクリプト条件式を満たさない対象はターゲット候補に上がりません。 #------------------------------------------------------------------------------ # <無差別RT追加:N,R,S> # # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 敵味方無差別にランダムターゲットで1体選んで追加します。 # Sのスクリプト条件式を満たさない対象はターゲット候補に上がりません。 #------------------------------------------------------------------------------ # <敵DT追加:N,R,S> # # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 戦闘不能の敵を全て追加します。 # Sのスクリプト条件式を満たさない対象はターゲット候補に上がりません。 #------------------------------------------------------------------------------ # <味方DT追加:N,R,S> # # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 戦闘不能の味方を全て追加します。 # Sのスクリプト条件式を満たさない対象はターゲット候補に上がりません。 #------------------------------------------------------------------------------ # <無差別DT追加:N,R,S> # # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 敵味方無差別に戦闘不能者を全て追加します。 # Sのスクリプト条件式を満たさない対象はターゲット候補に上がりません。 #------------------------------------------------------------------------------ # <敵AT追加:N,R,S> # # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 生存する敵全てをそのままターゲットとして追加します。 # Sのスクリプト条件式を満たさない対象はターゲット候補に上がりません。 #------------------------------------------------------------------------------ # <味方AT追加:N,R,S> # # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 生存する味方全てをそのままターゲットとして追加します。 # Sのスクリプト条件式を満たさない対象はターゲット候補に上がりません。 #------------------------------------------------------------------------------ # <無差別AT追加:N,R,S> # # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 生存する敵味方全てをそのままターゲットとして追加します。 # Sのスクリプト条件式を満たさない対象はターゲット候補に上がりません。 #============================================================================== # 上の敵RT追加〜無差別AT追加の9つは、キーワード部分の先頭にNT時とつける事で # ターゲットがまだ一体もいない時限定でターゲットの追加が行われます。 # 例. # # ターゲットが存在しない場合のみ # 拡張ターゲットにN回分、それぞれR%の確率の確率で # 敵をランダムターゲットで1体選んで追加します。 #============================================================================== # Sの部分で使える式の例 #------------------------------------------------------------------------------ # b.state?(10) # # ステートID10が付与されている対象のみターゲットとして有効 #------------------------------------------------------------------------------ # !b.state?(20) # # ステートID20が付与されていない対象のみターゲットとして有効 #------------------------------------------------------------------------------ # b.buff?(0) # # 最大HP強化が付与されていない対象のみターゲットとして有効 #------------------------------------------------------------------------------ # b.debuff?(0) # # 最大HP弱体が付与されていない対象のみターゲットとして有効 #------------------------------------------------------------------------------ # $game_temp.current_base_target.include?(b) # # 基本ターゲットに含まれている対象のみターゲットとして有効 #------------------------------------------------------------------------------ # $game_temp.current_enhance_target.include?(b) # # 追加ターゲットに含まれている対象のみターゲットとして有効 #------------------------------------------------------------------------------ # $game_temp.current_base_target.include?(b)||$game_temp.current_enhance_target.include?(b) # # 基本ターゲットか追加ターゲットに含まれている対象のみターゲットとして有効 #------------------------------------------------------------------------------ # !$game_temp.current_base_target.include?(b) # # 基本ターゲットに含まれていない対象のみターゲットとして有効 #------------------------------------------------------------------------------ # !$game_temp.current_enhance_target.include?(b) # # 追加ターゲットに含まれていない対象のみターゲットとして有効 #------------------------------------------------------------------------------ # !$game_temp.current_base_target.include?(b)&&!$game_temp.current_enhance_target.include?(b) # # 基本ターゲットにも追加ターゲットにも # 含まれていない対象のみターゲットとして有効 #============================================================================== module TargetEnhancer #非戦闘不能者・戦闘不能者用スキルを区別せずに #スキルを適用させる場合の設定用キーワード。 Word1 = "戦闘不能無視" #基本ターゲットを初期化する為の設定用キーワード。 Word2 = "基本ターゲット消去" #拡張ターゲットを初期化する為の設定用キーワード。 Word3 = "拡張ターゲット消去" #ここまででターゲットに使用者を含んでいる場合は #使用者だけを除外するスキルの設定用キーワード。 Word4 = "使用者ターゲット除外" #ここまででターゲットに基本ターゲットを含んでいる場合は #基本ターゲットだけを除外するスキルの設定用キーワード。 Word5 = "基本ターゲット除外" #使用者をターゲットに加える場合の設定用キーワード。 Word6 = "使用者ターゲット追加" #基本ターゲットをターゲットに加える場合の設定用キーワード。 Word7 = "基本ターゲット追加" #以下変更不要。 #ターゲット設定用文字列1 Word8 = ["敵","味方","無差別"] #ターゲット設定用文字列2 Word9 = ["%s%sRT追加","%s%sDT追加","%s%sAT追加"] #ターゲット設定用文字列3 Word10 = ["", "NT時"] #キーワード配列を用意。 Words = [Word2,Word3,Word4,Word5,Word6,Word7] #キーワード配列に文字列1〜3の文字を組み合わせた物を追加しておく。 Word10.each {|w1| Word9.each {|w2| Word8.each {|w3| Words.push(sprintf(w2,w1,w3))}}} end class Game_Temp attr_accessor :target_over_lap attr_accessor :target_over_lap_break attr_accessor :target_script_text attr_accessor :force_all_alive attr_accessor :force_all_alive_item attr_accessor :current_base_target attr_accessor :current_enhance_target end class Game_Battler < Game_BattlerBase #-------------------------------------------------------------------------- # 生存判定 #-------------------------------------------------------------------------- alias alive_force_all_alive? alive? def alive? $game_temp.force_all_alive ? true : alive_force_all_alive? end #-------------------------------------------------------------------------- # ターゲット除外判定 #-------------------------------------------------------------------------- def enhance_target_array1(a) eval(a[0]) > rand(100) if a[1] ? eval(a[1]) : true end #-------------------------------------------------------------------------- # 回数を確率込みで判定 #-------------------------------------------------------------------------- def enhance_target_array2(a) r = 0 eval(a[0]).times {|i1| r += 1 if eval(a[1]) > rand(100)} r end #-------------------------------------------------------------------------- # スキル/アイテムの適用テスト #-------------------------------------------------------------------------- alias item_test_force_all_alive item_test def item_test(user, item) f = item.force_all_alive_item $game_temp.force_all_alive_item = dead? if f r = item_test_force_all_alive(user,item) $game_temp.force_all_alive_item = nil r end #-------------------------------------------------------------------------- # スクリプトによる対象制限の発生を確認 #-------------------------------------------------------------------------- def target_script_text_ok? a = $game_temp.target_script_text[0] b = self v = $game_variables eval($game_temp.target_script_text[1]) end end class Game_Unit #-------------------------------------------------------------------------- # 生存しているメンバーの配列取得 #-------------------------------------------------------------------------- alias alive_members_force_all_alive alive_members def alive_members $game_temp.force_all_alive ? members : alive_members_force_all_alive end #-------------------------------------------------------------------------- # 戦闘不能のメンバーの配列取得 #-------------------------------------------------------------------------- alias dead_members_force_all_alive dead_members def dead_members $game_temp.force_all_alive ? members : dead_members_force_all_alive end end class Game_Party < Game_Unit #-------------------------------------------------------------------------- # メンバーの取得 #-------------------------------------------------------------------------- alias members_enhanced_target members def members a = members_enhanced_target.clone if $game_temp.target_over_lap && !$game_temp.target_over_lap_break $game_temp.target_over_lap_break = true a = a + $game_troop.members $game_temp.target_over_lap_break = nil a end a = a.select {|m| m.target_script_text_ok?} if $game_temp.target_script_text a end end class Game_Troop < Game_Unit #-------------------------------------------------------------------------- # メンバーの取得 #-------------------------------------------------------------------------- alias members_enhanced_target members def members a = members_enhanced_target.clone if $game_temp.target_over_lap && !$game_temp.target_over_lap_break $game_temp.target_over_lap_break = true a = a + $game_party.members $game_temp.target_over_lap_break = nil a end a = a.select {|m| m.target_script_text_ok?} if $game_temp.target_script_text a end end class Game_Action #-------------------------------------------------------------------------- # 敵に対するターゲット #-------------------------------------------------------------------------- alias targets_for_opponents_enhanced_target targets_for_opponents def targets_for_opponents $game_temp.force_all_alive = item.force_all_alive_item r = create_enhance_target(targets_for_opponents_enhanced_target) $game_temp.force_all_alive = nil r end #-------------------------------------------------------------------------- # 味方に対するターゲット #-------------------------------------------------------------------------- alias targets_for_friends_enhanced_target targets_for_friends def targets_for_friends $game_temp.force_all_alive = item.force_all_alive_item r = create_enhance_target(targets_for_friends_enhanced_target) $game_temp.force_all_alive = nil r end #-------------------------------------------------------------------------- # 追加ターゲットを含めた新たなターゲットデータを作成 #-------------------------------------------------------------------------- def create_enhance_target(r) r1 = r.clone r2 = [] num = 1 + (attack? ? subject.atk_times_add.to_i : 0) h = item.enhanced_target_hash h.values.each {|v| k = v[:k];a = v[:a] next if k > 14 && (r1 + r2).size > 0 $game_temp.target_script_text = (a.size > 2 && k >= 6) ? [subject,a[2]] : nil $game_temp.current_base_target = r1 $game_temp.current_enhance_target = r2 case k when 0;r1 = [] if subject.enhance_target_array1(a) when 1;r2 = [] if subject.enhance_target_array1(a) when 2 if subject.enhance_target_array1(a) r1.delete(subject) r2.delete(subject) end when 3;r.each {|m| r2.delete(m)} if subject.enhance_target_array1(a) when 4;subject.enhance_target_array2(a).times {r2 += [subject] * num} when 5;subject.enhance_target_array2(a).times {r2 += r} when 6..23;subject.enhance_target_array2(a).times {r2 += (enhance_target_type((k - 6) % 9)) * num} end} $game_temp.current_base_target = nil $game_temp.current_enhance_target = nil $game_temp.target_script_text = nil (r1 + r2).compact end #-------------------------------------------------------------------------- # ターゲットタイプ別の追加ターゲットを取得。 #-------------------------------------------------------------------------- def enhance_target_type(type) case type % 9 when 0;[opponents_unit.random_target] when 1;[friends_unit.random_target] when 2 $game_temp.target_over_lap = true r = [opponents_unit.random_target] $game_temp.target_over_lap = nil r when 3;opponents_unit.dead_members when 4;friends_unit.dead_members when 5 $game_temp.target_over_lap = true r = opponents_unit.dead_members $game_temp.target_over_lap = nil r when 6;opponents_unit.alive_members when 7;friends_unit.alive_members when 8 $game_temp.target_over_lap = true r = opponents_unit.alive_members $game_temp.target_over_lap = nil r end end end class RPG::UsableItem < RPG::BaseItem #-------------------------------------------------------------------------- # 拡張ターゲット情報を取得 #-------------------------------------------------------------------------- def enhanced_target_hash @enhanced_target_hash ||= create_enhanced_target_hash end #-------------------------------------------------------------------------- # 拡張ターゲット情報各種を作成 #-------------------------------------------------------------------------- def create_enhanced_target_hash h = {} note.each_line {|l| 24.times {|num| w = TargetEnhancer::Words[num] t = /<#{w}[::](\S+)>/ =~ l ? $1.to_s : "" next if t.empty? t = t.split(/\s*,\s*/).inject([]) {|r,i| r += [i.to_s]} t = {:k => num,:a => t} h[h.size] = t}} h end #-------------------------------------------------------------------------- # 戦闘不能無視 #-------------------------------------------------------------------------- def force_all_alive_item (@force_all_alive_item ||= /<#{TargetEnhancer::Word1}>/ =~ note ? 1 : 0) == 1 end #-------------------------------------------------------------------------- # 味方の戦闘不能者用か否かを取得 #-------------------------------------------------------------------------- unless method_defined?(:for_dead_friend_force_all_alive?) alias for_dead_friend_force_all_alive? for_dead_friend? def for_dead_friend? return $game_temp.force_all_alive_item if $game_temp.force_all_alive_item != nil for_dead_friend_force_all_alive? end end end