#============================================================================== # ■ RGSS3 イベント存在判定拡張 Ver1.01 by 星潟 #------------------------------------------------------------------------------ # イベントに対してグラフィック依存で # 本来存在している座標を基準に特定の座標へも存在判定が働くようにします。 # また、イベント名から特殊な存在判定の追加もできます。 # なお、あくまで存在判定であって、そのイベントの移動には影響を及ぼしません。 # よって、そのイベントが1タイル分の通路を歩けなくなるということはありません。 # (プレイヤーや他のイベントは影響を受けます) #============================================================================== # イベントの名前欄に指定 # 設定内を「,」で区切る事により、複数の設定を同時に行える。 #============================================================================== # 単独の例 #------------------------------------------------------------------------------ # # # 上方向に1タイル分存在判定を発生させる #------------------------------------------------------------------------------ # # # 下方向に2タイル分存在判定を発生させる #------------------------------------------------------------------------------ # # # 左方向に3タイル分存在判定を発生させる #------------------------------------------------------------------------------ # # # 右方向に4タイル分存在判定を発生させる #------------------------------------------------------------------------------ # # # 該当イベントとX軸・Y軸の両方が1タイル分以内なら存在判定を発生させる。 #------------------------------------------------------------------------------ # # # 該当イベントとX軸・Y軸の両方の差の合計が # 2タイル分以内なら存在判定を発生させる。 #============================================================================== # 複数の例 #------------------------------------------------------------------------------ # # # 上方向に4タイル、下方向に3タイル、左方向に2タイル、右方向に1タイル分の # 存在判定をそれぞれ発生させる。 #============================================================================== module GetCharacterExtraPos #空のハッシュを用意(変更不要) S = {} #追加範囲設定用のキーワードを指定 Word = "Range" #設定を行う #例1. #S["$BigMonster1"] = [[1,0],[-1,0]] #キャラクター画像が$BigMonster1の場合 #「X座標+1 Y座標+0」の座標と「X座標-1 Y座標+0」の座標も #自身が存在している判定となる。 #例2. #S["$BigMonster2"] = [[1,0],[-1,0],[1,-1],[0,-1],[-1,-1]] #キャラクター画像が$BigMonster2の場合 #「X座標+1 Y座標+0」の座標と「X座標-1 Y座標+0」の座標と #「X座標+1 Y座標-1」の座標と「X座標+1 Y座標-1」の座標と #「X座標-1 Y座標-1」の座標も自身が存在している判定となる。 S["$BigMonster1"] = [[1,0],[-1,0]] S["$BigMonster2"] = [[1,0],[-1,0],[1,-1],[0,-1],[-1,-1]] end class Game_CharacterBase #-------------------------------------------------------------------------- # 座標一致判定 #-------------------------------------------------------------------------- alias pos_multi_xy? pos? def pos?(x, y) r = pos_multi_xy?(x, y) return r if @in_collide_with_events_for_multi_xy unless r a1 = check_multi_xy if a1 && !a1.empty? a1.each {|a2| return true if pos_multi_xy?( $game_map.round_x(x - a2[0]), $game_map.round_y(y - a2[1]))} end h = check_add_range if h h.each {|k,v| case k when :U v.times {|i| return true if pos_multi_xy?(x, $game_map.round_y(y + (i + 1)))} when :D v.times {|i| return true if pos_multi_xy?(x, $game_map.round_y(y - (i + 1)))} when :R v.times {|i| return true if pos_multi_xy?($game_map.round_x(x - (i + 1)), y)} when :L v.times {|i| return true if pos_multi_xy?($game_map.round_x(x + (i + 1)), y)} when :S1 return true if distance_x_from(x).abs <= v && distance_y_from(y).abs <= v when :S2 return true if (distance_x_from(x).abs + distance_y_from(y).abs) <= v end } end end r end #-------------------------------------------------------------------------- # イベントとの衝突判定 #-------------------------------------------------------------------------- alias collide_with_events_multi_xy? collide_with_events? def collide_with_events?(x, y) @in_collide_with_events_for_multi_xy = true r = collide_with_events_multi_xy?(x, y) @in_collide_with_events_for_multi_xy = nil r end #-------------------------------------------------------------------------- # 追加存在判定の取得1 #-------------------------------------------------------------------------- def check_multi_xy nil end #-------------------------------------------------------------------------- # 追加存在判定の取得2 #-------------------------------------------------------------------------- def check_add_range nil end end class Game_Event < Game_Character #-------------------------------------------------------------------------- # 追加存在判定の取得1 #-------------------------------------------------------------------------- def check_multi_xy @last_check_multi_xy_name ||= {} if @last_check_multi_xy_name != character_name @last_check_multi_xy_name = character_name @check_multi_xy = nil end unless @check_multi_xy a = GetCharacterExtraPos::S[@last_check_multi_xy_name] @check_multi_xy = a ? a : [] end @check_multi_xy end #-------------------------------------------------------------------------- # 追加存在判定の取得2 #-------------------------------------------------------------------------- def check_add_range @event.add_range end end class RPG::Event #-------------------------------------------------------------------------- # 追加存在判定の取得2 #-------------------------------------------------------------------------- def add_range @add_range ||= create_add_range end #-------------------------------------------------------------------------- # 追加存在判定の取得2のデータ作成 #-------------------------------------------------------------------------- def create_add_range h = {} if /<#{GetCharacterExtraPos::Word}[::](\S+)>/ =~ name $1.split(/\s*,\s*/).each {|t1| a = t1.split(/\s*-\s*/) if a.size == 2 k = nil case a[0] when "U" ;k = :U when "D" ;k = :D when "R" ;k = :R when "L" ;k = :L when "S1";k = :S1 when "S2";k = :S2 end h[k] = a[1].to_i if k end} end h end end