#============================================================================== # ■ RGSS3 イベント起動に通行判定追加 Ver1.03 by 星潟 #------------------------------------------------------------------------------ # 段差が違う場所等、通行できない場所から # イベントに触れる/触れられる現象を制御します。 # # なお、どちらか一つの設定で条件を満たした場合 # もう片方の設定の条件を満たしていなくても段差は認識します。 #------------------------------------------------------------------------------ # Ver1.01 # イベント側のタイルが全方向移動可能だった場合、設定を無視する不具合を修正。 # Ver1.02 # カウンター属性の場合の処理を修正。 # Ver1.03 # プライオリティ関係の不具合を修正しました。 #============================================================================== module C_E_T_EXJUDGE #処理形式設定1 #0 …… 通常時は段差を認識しない。 # イベントの名前に特定キーワードが入っている時、段差を認識する。 #1 …… 通常時は段差を認識する。 # イベントの名前に特定キーワードが入っている時、段差を認識しない。 #2 …… この処理を無効とする。 TYPE1 = 1 #処理形式設定2 #0 …… 通常時は段差を認識しない。 # キャラクターの名前に特定キーワードが入っている時、段差を認識する。 #1 …… 通常時は段差を認識する。 # キャラクターの名前に特定キーワードが入っている時、段差を認識しない。 #2 …… この処理を無効とする。 TYPE2 = 0 #イベントの名前用のキーワード設定 WORD = "" #キャラクターの名前用のキーワード設定 C_NAME = ["Actor","Animal","Behavior","Damage","Evil","Insane", "Monster","Riding","People","Spiritual","Vehicle"] end class Game_Event < Game_Character attr_reader :event attr_reader :c_e_t_judge #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- alias refresh_judge_plus refresh def refresh #元の処理を実行する refresh_judge_plus case C_E_T_EXJUDGE::TYPE1 when 0 #判定変化キーワードを含む場合は段差を認識する。 @c_e_t_judge = true if @event.name.include?(C_E_T_EXJUDGE::WORD) when 1 #判定変化キーワードを含む場合は段差を認識しない。 @c_e_t_judge = true unless @event.name.include?(C_E_T_EXJUDGE::WORD) end case C_E_T_EXJUDGE::TYPE2 when 0 #特定のキャラクター画像の場合のみ段差を認識する。 @c_e_t_judge = true if c_e_t_exjudge when 1 #特定のキャラクター画像の場合のみ段差を認識しない。 @c_e_t_judge = true unless c_e_t_exjudge end #認識フラグが指定されていない時、falseにする。 @c_e_t_judge = false if @c_e_t_judge == nil end #-------------------------------------------------------------------------- # ● 接触イベントの起動判定1 #-------------------------------------------------------------------------- alias check_event_trigger_touch_judge_plus check_event_trigger_touch def check_event_trigger_touch(x, y) if @c_e_t_judge #段差有効シンボルの場合 #座標が指定方向から移動できるかどうかチェックし #移動できない場合はイベントを起動させない。 return false if !map_passable?(@x, @y, @direction) #方向による処理座標を決定する。 #まずは元々の座標をセットする。 subx = @x suby = @y #方向別に±1する。 case @direction #下方向 when 2 suby += 1 #左方向 when 4 subx -= 1 #右方向 when 6 subx += 1 #上方向 when 8 suby -= 1 end #調整後の座標で再度移動可否をチェックする。 #不可の場合はイベントを起動させない。 return false if !$game_player.map_passable?(subx, suby, reverse_dir(@direction)) end #本来の起動処理を行う。 return check_event_trigger_touch_judge_plus(x, y) end #-------------------------------------------------------------------------- # ● 接触イベントの起動判定2 #-------------------------------------------------------------------------- def c_e_t_exjudge #段差有効シンボルか否かをキャラクター名でチェックする for i in C_E_T_EXJUDGE::C_NAME return true if @character_name.include?(i) end return false end #-------------------------------------------------------------------------- # ● 指定されたトリガーのいずれかか否かを判定 # triggers : トリガーの配列 #-------------------------------------------------------------------------- alias trigger_in_judge_plus? trigger_in? def trigger_in?(triggers) #段差有効シンボルかつプライオリティが通常の場合 #特殊な通行可能判定で先に一度判定する。 if @c_e_t_judge && @priority_type == 1 return false if !$game_player.passable2?($game_player.x, $game_player.y, $game_player.direction) end trigger_in_judge_plus?(triggers) end end #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ● 通行可能判定2 # d : 方向(2,4,6,8) #-------------------------------------------------------------------------- def passable2?(x, y, d) #有効な座標かを判定する。 return false unless $game_map.valid?(x, y) #向きに応じて1タイル分座標をずらす x2 = $game_map.round_x_with_direction(x, d) y2 = $game_map.round_y_with_direction(y, d) #該当座標がカウンター属性の場合はtrueを返す return true if $game_map.counter?(x2, y2) #該当座標が有効でない場合はfalseを返す return false unless $game_map.valid?(x2, y2) #すり抜け状態もしくはデバッグモードの場合はtrueを返す return true if @through || debug_through? #移動できない場合はfalseを返す return false unless map_passable?(x, y, d) return false unless map_passable?(x2, y2, reverse_dir(d)) return true end end