#============================================================================== # ■ RGSS3 自動トリガーのマップイベントへの追加トリガー Ver1.00 by 星潟 #------------------------------------------------------------------------------ # トリガー:自動のマップイベントは # そのページの出現条件を満たした状態でそのマップにいる限り # 自動的に繰り返し無限に繰り返されますが # このスクリプトの機能を使用する事で指定した条件を満たさない限り # トリガー:自動であってもイベントが実行されなくなります。 # # このスクリプトを使用するには # 『条件IDに応じた条件の設定』(このスクリプト内)と # 『スイッチIDに応じた条件IDの設定』(このスクリプト内)と # 『イベントのページ出現条件でのスイッチの設定』(各イベントページ)という # 3段階の設定が必要になります。 #============================================================================== module AutoTriggerCondition #空のハッシュを用意。 C = {} S = {} #============================================================================== #条件IDに応じた条件を設定。 #:targetの設定 #何に対して条件に合致するかを参照するかを指定。 #1以上の場合はマップ内の該当するイベントIDのイベント、 #0の場合はそのイベントそのもの、 #-1の場合はプレイヤー、 #-2の場合は乗り物インデックス0(小型船) #-3の場合は乗り物インデックス1(大型船) #-4の場合は乗り物インデックス2(飛行船) #:typeの設定 #条件として設定する物の種類をここで指定。 #:region_idの場合、対象がいる位置のリージョンIDが #指定したリージョンIDの何れかか。 #:terrain_tagの場合、対象がいる位置の地形IDが #指定した地形IDの何れかかか。 #:range_inの場合、対象がこのイベントに対し #X・Y軸方向合計で一定範囲以下の内側にいるか。 #:range_outの場合、対象がこのイベントに対し #X・Y軸方向合計で一定範囲以上の外側にいるか。 #:square_inの場合、対象がこのイベントに対し #X・Y軸方向どちらかで一定範囲以下の内側にいるか。 #:square_outの場合、対象がこのイベントに対し #X・Y軸方向どちらかで一定範囲以上の外側にいるか。 #:event_idの場合、対象がいる位置に #指定した何れかのイベントが存在するか。 #:map_posの場合、対象がいる位置が #指定した何れかのX・Y座標と一致するか。 #:valueの設定 #:type(条件)として設定する種類に応じた数値部分をここで指定。 #:typeが:region_idの場合 #1つ、もしくは複数の数字を格納した配列で指定。(例.[1]や[1,2]等) #:typeが:terrain_tagの場合 #1つ、もしくは複数の数字を格納した配列で指定。(例.[1]や[1,2]等) #:typeが:range_inの場合、数字で指定。(1や2等) #:typeが:range_outの場合、数字で指定。(1や2等) #:typeが:square_inの場合、数字で指定。(1や2等) #:typeが:square_outの場合、数字で指定。(1や2等) #:typeが:event_idの場合 #1つ、もしくは複数の数字を格納した配列で指定。(例.[1]や[1,2]等) #:typeが:map_posの場合 #『2つの数字を格納した配列』を1つ、もしくは複数格納した配列で指定。 #(例.[[1,2]]や[[1,2],[2,3]]等) #例1. #C[0] = { #:target => -1, #:type => :region_id, #:value => [1]} #この場合、プレイヤーがいる座標のリージョンIDが1なら条件を満たす。 #例2. #C[1] = { #:target => 0, #:type => :terrain_tag, #:value => [2]} #この場合、このイベントがいる座標に #地形タグID2のマップチップがあるなら条件を満たす。 #例3. #C[2] = { #:target => 1, #:type => :range_in, #:value => 5} #この場合、イベントID1がいる座標がこのイベントのいる座標から #X軸・Y軸方向合計で5タイル分以下の座標であるなら条件を満たす。 #例4. #C[3] = { #:target => -2, #:type => :range_out, #:value => 3} #この場合、乗り物インデックス0(小型船)がいる座標がこのイベントのいる座標から #X軸・Y軸方向合計で3タイル分以上の座標であるなら条件を満たす。 #例5. #C[4] = { #:target => -3, #:type => :square_in, #:value => 6} #この場合、乗り物インデックス1(大型船)がいる座標がこのイベントのいる座標から #X軸・Y軸方向どちらかで6タイル分以下の座標であるなら条件を満たす。 #例6. #C[5] = { #:target => -4, #:type => :square_out, #:value => 3} #この場合、乗り物インデックス2(飛行船)がいる座標がこのイベントのいる座標から #X軸・Y軸方向どちらかで3タイル分以上の座標であるなら条件を満たす。 #例7. #C[6] = { #:target => -1, #:type => :event_id, #:value => [4,5,6]} #この場合、プレイヤーがいる座標とイベントID4、5、6の何れかがいる座標が #同一の座標であれば条件を満たす。 #例8. #C[7] = { #:target => 2, #:type => :map_pos, #:value => [[17,3],[18,2]]} #この場合、イベントID2がいる座標が #X座標17 Y座標3、もしくはX座標18 Y座標2の位置であれば条件を満たす。 C[0] = { :target => -1, :type => :region_id, :value => [1]} C[1] = { :target => -1, :type => :terrain_tag, :value => [1]} C[2] = { :target => -1, :type => :range_in, :value => 5} C[3] = { :target => -1, :type => :range_out, :value => 5} C[4] = { :target => -1, :type => :square_in, :value => 5} C[5] = { :target => -1, :type => :square_out, :value => 5} C[6] = { :target => -1, :type => :event_id, :value => [4]} C[7] = { :target => -1, :type => :map_pos, :value => [[17,3],[18,2]]} #============================================================================== #スイッチに応じた条件IDと自律移動ロックフラグを指定。 #例1.S[50] = {:condition => [0],:lock => false} #この場合、イベントページの出現条件でスイッチID50を指定すると #そのイベントページのトリガーが自動に設定されている場合に限り #ページ出現条件としてのスイッチID50の設定は無視されますが #C[0]で指定した条件を満たさない限りはイベントが自動実行されません。 #また、このイベントの自律移動はイベント起動中もロックされません。 #例1.S[51] = {:condition => [0,1,2],:lock => true} #この場合、イベントページの出現条件でスイッチID51を指定すると #そのイベントページのトリガーが自動に設定されている場合に限り #ページ出現条件としてのスイッチID51の設定は無視されますが #C[0]、C[1]、C[2]で指定した条件を満たさない限りはイベントが自動実行されません。 #また、このイベントの自律移動はイベント起動中ロックされます。 S[40] = {:condition => [0],:lock => false} S[41] = {:condition => [1],:lock => false} S[42] = {:condition => [2],:lock => true} S[43] = {:condition => [3],:lock => true} S[44] = {:condition => [4],:lock => true} S[45] = {:condition => [5],:lock => true} S[46] = {:condition => [6],:lock => false} S[47] = {:condition => [7],:lock => false} #-------------------------------------------------------------------------- # ハッシュのキーをキャッシュ化して用意 #-------------------------------------------------------------------------- def self.keys @keys ||= S.keys end end class RPG::Event::Page attr_accessor :auto_trigger_lock #-------------------------------------------------------------------------- # スイッチを一時スイッチに読み替え #-------------------------------------------------------------------------- def auto_trigger_condition @auto_trigger_condition ||= create_auto_trigger_condition end #-------------------------------------------------------------------------- # 自動イベント起動条件の作成 #-------------------------------------------------------------------------- def create_auto_trigger_condition a = [] if trigger == 3 if condition.switch1_valid sid = condition.switch1_id if AutoTriggerCondition.keys.include?(sid) a.push(sid) @auto_trigger_lock = true if AutoTriggerCondition::S[sid][:lock] condition.switch1_valid = false condition.switch1_id = 1 end end if condition.switch2_valid sid = condition.switch2_id if AutoTriggerCondition.keys.include?(sid) a.push(sid) @auto_trigger_lock = true if AutoTriggerCondition::S[sid][:lock] condition.switch2_valid = false condition.switch2_id = 1 end end end a end end class Game_Event < Game_Character #-------------------------------------------------------------------------- # 初期化 #-------------------------------------------------------------------------- alias initialize_auto_trigger_condition initialize def initialize(map_id, event) event.pages.each {|page| page.auto_trigger_condition} initialize_auto_trigger_condition(map_id, event) end #-------------------------------------------------------------------------- # 自動イベントの起動判定 #-------------------------------------------------------------------------- alias check_event_trigger_auto_auto_trigger_condition check_event_trigger_auto def check_event_trigger_auto return unless check_auto_trigger_condition if @page && @page.trigger == 3 check_event_trigger_auto_auto_trigger_condition end #-------------------------------------------------------------------------- # イベント起動 #-------------------------------------------------------------------------- alias start_auto_trigger_condition start def start start_auto_trigger_condition lock if @starting && @page && @page.trigger == 3 && @page.auto_trigger_lock end #-------------------------------------------------------------------------- # 自動イベントの起動判定条件 #-------------------------------------------------------------------------- def check_auto_trigger_condition pd = nil dxf = nil dyf = nil @page.auto_trigger_condition.each {|sid| AutoTriggerCondition::S[sid][:condition].each {|i| h = AutoTriggerCondition::C[i] next unless h k = h[:type] v = h[:value] ht = h[:target] if ht > 0 t = $game_map.events[ht] else case ht.abs when 0;t = self when 1;t = $game_player else ;t = $game_map.vehicles[ht - 2] end end return false unless t case k when :region_id return false unless v.include?(t.region_id) when :terrain_tag return false unless v.include?(t.terrain_tag) when :range_in dxf ||= distance_x_from(t.x).abs dyf ||= distance_y_from(t.y).abs pd ||= dxf + dyf return false if pd > v when :range_out dxf ||= distance_x_from(t.x).abs dyf ||= distance_y_from(t.y).abs pd ||= dxf + dyf return false if pd < v when :square_in dxf ||= distance_x_from(t.x).abs dyf ||= distance_y_from(t.y).abs squ ||= dxf > dyf ? dxf : dyf return false if squ > v when :square_out dxf ||= distance_x_from(t.x).abs dyf ||= distance_y_from(t.y).abs squ ||= dxf > dyf ? dxf : dyf return false if squ < v when :event_id return false unless $game_map.events_xy(t.x,t.y).any? {|e| v.include?(e.id)} when :map_pos return false unless v.any? {|va| (va[0] == t.x && va[1] == t.y)} end}} true end #-------------------------------------------------------------------------- # イベントの開始フラグ解除 #-------------------------------------------------------------------------- def starting_cancel_by_auto_trigger_condition if @starting && @page && @page.trigger == 3 && !check_auto_trigger_condition @starting = false unlock if @locked end end end class Game_Map #-------------------------------------------------------------------------- # 起動中のマップイベントを検出/セットアップ #-------------------------------------------------------------------------- alias setup_starting_map_event_auto_trigger_condition setup_starting_map_event def setup_starting_map_event @events.values.find {|event| event.starting_cancel_by_auto_trigger_condition} setup_starting_map_event_auto_trigger_condition end end