# ★ イベント起動判定拡張 ★ # # ・イベントの発生位置を広げることが出来るようになります。 # # # # Ver.0.1.1 by LLLuna ( http://llluna.s1.hayasoft.com/ ) # # ◎ 使用方法 # 発生位置を広げたいイベントの名前の末尾に以下の文字列を記述します。 # 【】部分は各々合わせてください。 # # _rect(【左端(0〜)】,【上端(0〜)】,【右端(0〜)】,【下端(0〜)】) # 矩形に広げます。それぞれイベントの位置を0として何マス分広げるかを # 整数で記述してください。負数は指定できません。 # # _border(【左端(0〜)】,【上端(0〜)】,【右端(0〜)】,【下端(0〜)】) # 矩形の枠上に広げます。指定する値は_rectと同様です。 # # _dir(【距離(0〜)】) # イベントが向いている方向に広げます。イベント位置を0として何マス分 # 広げるかを整数で記述してください。負数は指定できません。 # # _xy # イベントを中心として十字に広げます。線の太さは1マス、長さは無限です。 # # _x # イベントを中心として左右に広げます。線の太さは1マス、長さは無限です。 # # _y # イベントを中心として上下に広げます。線の太さは1マス、長さは無限です。 # # _size(【横幅】,【縦幅】) # イベントの大きさを指定して広げます。通常は通行判定拡張と共に使用します。 # それぞれイベントの大きさが何マス分かを整数で記述してください。 # 負数は指定できません。また、横幅は必ず奇数マス分になります。 #============================================================================== # ■ Game_Character #------------------------------------------------------------------------------ #  キャラクターを扱うクラスです。このクラスは Game_Player クラスと Game_Event # クラスのスーパークラスとして使用されます。 #============================================================================== class Game_Character def equalPosition(event, targetX, targetY, playerX, playerY) if event.name.scan(/_rect\(([0-9]+),([0-9]+),([0-9]+),([0-9]+)\)(_|$)/).length > 0 return (((targetX-$1.to_i)..(targetX+$3.to_i)) === playerX and ((targetY-$2.to_i)..(targetY+$4.to_i)) === playerY) elsif event.name.scan(/_border\(([0-9]+),([0-9]+),([0-9]+),([0-9]+)\)(_|$)/).length > 0 return (((targetX-$1.to_i == playerX or targetX+$3.to_i == playerX) and (((targetY-$2.to_i)..(targetY+$4.to_i)) === playerY)) or ((targetY-$2.to_i == playerY or targetY+$4.to_i == playerY) and (((targetX-$1.to_i)..(targetX+$3.to_i)) === playerX))) elsif event.name.scan(/_dir\(([0-9]+)\)(_|$)/).length > 0 return (((targetX-(event.direction==4 ? $1.to_i : 0))..(targetX+(event.direction==6 ? $1.to_i : 0))) === playerX and ((targetY-(event.direction==8 ? $1.to_i : 0))..(targetY+(event.direction==2 ? $1.to_i : 0))) === playerY) elsif event.name.scan(/_xy(_|$)/).length > 0 return (targetX == playerX or targetY == playerY) elsif event.name.scan(/_x(_|$)/).length > 0 return targetY == playerY elsif event.name.scan(/_y(_|$)/).length > 0 return targetX == playerX elsif event.name.scan(/_size\(([0-9]+),([0-9]+)\)(_|$)/).length > 0 width = $1.to_i + (1 - $1.to_i%2) return (((targetX-((width-1)/2).ceil)..(targetX+((width-1)/2).ceil)) === playerX and ((targetY-$2.to_i+1)..targetY) === playerY) else return (targetX == playerX and targetY == playerY) end end end #============================================================================== # ■ Game_Event #------------------------------------------------------------------------------ #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理 # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。 #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ● イベント名の取得 #-------------------------------------------------------------------------- def name return @event.name end #-------------------------------------------------------------------------- # ● 接触イベントの起動判定 #-------------------------------------------------------------------------- def check_event_trigger_touch(x, y) # イベント実行中の場合 return if $game_system.map_interpreter.running? unless jumping?# or over_trigger? start if @trigger == 2 and equalPosition(@event, x, y, $game_player.x, $game_player.y) end end #-------------------------------------------------------------------------- # ● 自動イベントの起動判定 #-------------------------------------------------------------------------- def check_event_trigger_auto # トリガーが [イベントから接触] かつプレイヤーの座標と一致した場合 #if @trigger == 2 and @x == $game_player.x and @y == $game_player.y # # ジャンプ中以外で、起動判定が同位置のイベントなら # if not jumping? and over_trigger? # start # end #end # トリガーが [自動実行] の場合 start if @trigger == 3 end end #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ● 同位置のイベント起動判定 #-------------------------------------------------------------------------- def check_event_trigger_here(triggers) result = false return result if $game_system.map_interpreter.running? # 全イベントのループ for event in $game_map.events.values next if event.jumping? or !event.over_trigger? or !triggers.include?(event.trigger) if equalPosition(event, event.x, event.y, @x, @y) event.start result = true end end return result end #-------------------------------------------------------------------------- # ● 正面のイベント起動判定 #-------------------------------------------------------------------------- def check_event_trigger_there(triggers) result = false return result if $game_system.map_interpreter.running? # 正面の座標を計算 new_x = @x + (@direction == 6 ? 1 : @direction == 4 ? -1 : 0) new_y = @y + (@direction == 2 ? 1 : @direction == 8 ? -1 : 0) # 全イベントのループ for event in $game_map.events.values next if event.jumping? or event.over_trigger? or !triggers.include?(event.trigger) if equalPosition(event, event.x, event.y, new_x, new_y) event.start result = true end end if !result and $game_map.counter?(new_x, new_y) new_x += (@direction == 6 ? 1 : @direction == 4 ? -1 : 0) new_y += (@direction == 2 ? 1 : @direction == 8 ? -1 : 0) for event in $game_map.events.values next if event.jumping? or event.over_trigger? or !triggers.include?(event.trigger) if equalPosition(event, event.x, event.y, new_x, new_y) event.start result = true end end end return result end #-------------------------------------------------------------------------- # ● 接触イベントの起動判定 #-------------------------------------------------------------------------- def check_event_trigger_touch(x, y) result = false return result if $game_system.map_interpreter.running? # 全イベントのループ for event in $game_map.events.values next if event.jumping? or event.over_trigger? or ![1,2].include?(event.trigger) if equalPosition(event, event.x, event.y, x, y) event.start result = true end end return result end end