#=========================================================================== # ◆ A1 Scripts ◆ # 通行設定「□」拡張段差(RGSS3) # # バージョン : 3.20 (2012/01/05) # 作者 : A1 # URL     : http://a1tktk.web.fc2.com/ #--------------------------------------------------------------------------- # 機能: # ・RPGツクール2000にあった 通行設定「□」を再現します #--------------------------------------------------------------------------- # 更新履歴   :2011/12/31 Ver1.00 リリース # 2012/01/02 Ver2.00 拡張段差機能追加 # 2012/01/02 Ver2.01 同じマップに二回目に訪れた時の不具合を修正 # 2012/01/04 Ver3.00 飛空船対応 # 2012/01/04 Ver3.00 リージョン設定仕様変更 # 2012/01/04 Ver3.10 拡張飛空船対応 # 2012/01/05 Ver3.20 ジャンプ対応 # 2012/01/06 Ver3.30 拡張飛空船Ver2.00対応 #--------------------------------------------------------------------------- # 設置場所 #  A1共通スクリプトより下 # # 必要スクリプト # A1共通スクリプトVer3.10以上 #--------------------------------------------------------------------------- # 使い方 # タイルセットの設定 # #  下層チップ(タイルA)で、通行設定「□」にしたいチップの # 「茂み」を適用して、地形タグを ■ 設定項目のSQUARE_PASSAGE_TAGに # 設定した値にします # # リージョンの設定 # # 通行設定「□」にした屋根タイル(タイルA4)に乗る場合 # 登る道(階段など)にリージョン設定をします # 設定の仕方は「拡張段差の仕様」を参照ください # # 拡張プライオリティの設定 # # イベント名に [P(no)PT value] と記述します # # 例:イベント名[P1PT 4] ※イベントページ1のプライオリティが4になります # 例:イベント名[P0PT 7] ※全てのイベントページのプライオリティが7になります # # マップ設定のメモに <飛空船高度 altitude> と記述 # # 設定した飛空船高度以上のリージョンを持つ座標は通行不可になります # また、設定した飛空船高度が高ければ高いほど、高く上昇します # # マップ設定のメモに <マップチップサーチ> と記述 #--------------------------------------------------------------------------- # 拡張段差の仕様 # ・「現在のプライオリティのリージョン」→「現在のプライオリティ+3のリージョン」 #  の順にリージョンを踏むとイベントのプライオリティが +3 され #  通行設定「□」にした屋根タイルに乗れます # # ・「現在のプライオリティのリージョン」→「現在のプライオリティ-3のリージョン」 #  の順にリージョンを踏むとイベントのプライオリティが -3 され #  イベントのプライオリティが 2未満になると #  通行設定「□」にした屋根タイルの裏に隠れます # # ・通行設定「□」にしたタイルの上に上層タイル(タイルB〜E)を置いても表示されません #  通行判定は上層タイルが優先されます # # ・■ 設定項目の DESABLE_REGION に設定した以上の番号を持つ # リージョンを置いた座標は通行設定「□」にしたタイルが適用されず # 上層タイル(タイルB〜E)に通行設定「☆」が適用されます # # また、飛空船通行判定や影の高さにおいては # DESABLE_REGION に設定した値を引いた値で判定されます # # ・イベントのプライオリティが3以上の場合 #  通行設定「☆」のタイルの「☆」効果が適用されず # 通常の通行判定となります # # ・同じプライオリティのイベントと衝突し #  プライオリティの違うイベントとは衝突しません #  また、プライオリティの差が ±2 以上の場合、イベントの起動はしません # # プライオリティ「通常キャラと同じ」は、プライオリティ1ですので # プライオリティ4に設定すると1段目で # プライオリティ7に設定すると2段目で「通常キャラ」と衝突し、イベント起動します # # また、飛空船でもプライオリティが同じなら衝突してイベント起動します # # ・飛空船プライオリティは、着陸する座標のリージョン -1 になります # リージョンが 0 ならプライオリティ 0 になります # # ・飛空船高度は、通過したい段差のプライオリティ +1 がおすすめです # 平地なら 2 1段目なら 5 2段目なら 8 #--------------------------------------------------------------------------- # 注意事項 # 当機能を実現するにあたり、マップ読み込み時にマップの全座標・全レイヤーを調べます # マップが広いほど処理に時間がかかるので注意です # # また、当機能が必要ないマップを考慮して # マップ設定のメモに <マップチップサーチ> と記述しないと # 当機能は効果を発揮しない仕様となっています #============================================================================== $imported ||= {} $imported["A1_SquarePassage"] = true if $imported["A1_Common_Script"] #============================================================================== # ■ 設定項目 #============================================================================== module A1_System::SquarePassageConfig #-------------------------------------------------------------------------- # ○ 通行設定「□」の地形タグ #-------------------------------------------------------------------------- SQUARE_PASSAGE_TAG = 1 #-------------------------------------------------------------------------- # ○ 上層チップに通行設定「☆」を適用するリージョン # 設定値以上のリージョンに適用されます #-------------------------------------------------------------------------- DESABLE_REGION = 30 end #============================================================================== # ■ RPG::Map #============================================================================== class RPG::Map #-------------------------------------------------------------------------- # ○ 飛空船高度 #-------------------------------------------------------------------------- def airship_altitude(name) @airship_altitude ||= {} @airship_altitude[name] ||= $a1_common.note_data_one(self.note, "#{name}高度", 2).to_i return @airship_altitude[name] end end #============================================================================== # ■ RPG::Event #============================================================================== class RPG::Event #-------------------------------------------------------------------------- # ○ プライオリティタイプの設定 #-------------------------------------------------------------------------- def setup_pages_priority @name.scan(/\[P(\d+)PT[ ](\d+)\]/).each {|info| page_no = info[0].to_i return change_all_priority_type(info[1].to_i) if page_no == 0 change_priority_type(@pages[page_no - 1], info[1].to_i) } end #-------------------------------------------------------------------------- # ○ 全てのプライオリティタイプの設定を変更 #-------------------------------------------------------------------------- def change_all_priority_type(value) @pages.each {|page| change_priority_type(page, value) } end #-------------------------------------------------------------------------- # ○ プライオリティタイプを変更 #-------------------------------------------------------------------------- def change_priority_type(page, value) return if page == nil page.priority_type = value end end #============================================================================== # ■ Game_Event #------------------------------------------------------------------------------ #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理 # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。 #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ☆ オブジェクト初期化 # event : RPG::Event #-------------------------------------------------------------------------- alias a1_passages_square_ge_initialize initialize def initialize(map_id, event) event.setup_pages_priority a1_passages_square_ge_initialize(map_id, event) end end #============================================================================== # ■ Game_Map #------------------------------------------------------------------------------ #  マップを扱うクラスです。スクロールや通行可能判定などの機能を持っています。 # このクラスのインスタンスは $game_map で参照されます。 #============================================================================== class Game_Map #-------------------------------------------------------------------------- # ○ 定数 #-------------------------------------------------------------------------- SQUARE_PASSAGE_TAG = A1_System::SquarePassageConfig::SQUARE_PASSAGE_TAG DESABLE_REGION = A1_System::SquarePassageConfig::DESABLE_REGION #-------------------------------------------------------------------------- # ☆ 全マップチップを調べる #-------------------------------------------------------------------------- alias a1_passages_square_map_chip_search map_chip_search def map_chip_search @change_tile = [] a1_passages_square_map_chip_search @change_tile.each {|id| tileset.flags[id] -= 0x40 } end #-------------------------------------------------------------------------- # ☆ 座標に対して処理を行う #-------------------------------------------------------------------------- alias a1_passages_square_map_pos_proc map_pos_proc def map_pos_proc(x, y) a1_passages_square_map_pos_proc(x, y) flag_0 = tileset.flags[tile_id(x, y, 0)] flag_1 = tileset.flags[tile_id(x, y, 1)] change_passages(x, y, 2) return change_passages(x, y, 1) if chg_psg?(flag_1) change_passages(x, y, 0) if chg_psg?(flag_0) end #-------------------------------------------------------------------------- # ○ 通行設定を変える? #-------------------------------------------------------------------------- def chg_psg?(flag) return flag & 0x40 == 0x40 && flag >> 12 == SQUARE_PASSAGE_TAG end #-------------------------------------------------------------------------- # ○ 通行設定「□」判定 #-------------------------------------------------------------------------- def passages_square?(x, y) return tileset.ex_flags[tile_id(x, y, 2)] == 0x0001 end #-------------------------------------------------------------------------- # ○ 上段通常キャラの通行可能判定 # d : 方向(2,4,6,8) # 指定された座標のタイルが指定方向に通行可能かを判定する。 #-------------------------------------------------------------------------- def passable_ex?(x, y, d) bit = (1 << (d / 2 - 1)) & 0x0f return true if check_passage_ex(x, y, bit) return false end #-------------------------------------------------------------------------- # ○ 上段用通行チェック # bit : 調べる通行禁止ビット #-------------------------------------------------------------------------- def check_passage_ex(x, y, bit) tile_events_xy(x, y).collect {|ev| ev.tile_id }.each {|tile_id| flag = tileset.flags[tile_id] return false if flag & bit == bit # [×] : 通行不可 } return false if tileset.flags[@map.data[x, y, 2]] & bit == bit return false if tileset.flags[@map.data[x, y, 0]] & bit == bit return true # 通行可 end #-------------------------------------------------------------------------- # ☆ 通行チェック # bit : 調べる通行禁止ビット #-------------------------------------------------------------------------- alias a1_passages_square_gm_check_passage check_passage def check_passage(x, y, bit) ret = check_passage_square(x, y, bit) return a1_passages_square_gm_check_passage(x, y, bit) if ret == nil return ret end #-------------------------------------------------------------------------- # ○ 通行設定「□」の通行チェック #-------------------------------------------------------------------------- def check_passage_square(x, y, bit) return nil unless passages_square?(x, y) && !passages_square?(x, y - 1) return true if a1_passages_square_gm_check_passage(x, y, bit) return false if tileset.flags[@map.data[x, y, 1]] & bit == bit return true if @map.data[x, y, 1] > 0 && tileset.flags[@map.data[x, y, 1]] & bit == 0 return a1_passages_square_gm_check_passage(x, y - 1, bit) end #-------------------------------------------------------------------------- # ☆ 飛行船の着陸可能判定 #-------------------------------------------------------------------------- alias a1_passages_square_gm_airship_land_ok? airship_land_ok? def airship_land_ok?(x, y) return true if a1_passages_square_gm_airship_land_ok?(x, y) return passages_square?(x, y) end #-------------------------------------------------------------------------- # ○ 通行設定に☆を付与 #-------------------------------------------------------------------------- def change_passages(x, y, z) id = tile_id(x, y, 2) region = region_id(x, y) return change_upper_passages(id) if region > DESABLE_REGION return if z == 2 tmp = @map.data[x, y, 2] @map.data[x, y, 2] = @map.data[x, y, z] if z == 1 @map.data[x, y, 0] = @map.data[x, y, z] @map.data[x, y, z] = tmp else @map.data[x, y, 1] = tmp end id = tile_id(x, y, 2) return if tileset.ex_flags[id] == 0x0001 tileset.flags[id] += 0x10 tileset.ex_flags[id] = 0x0001 @change_tile.push(id) end #-------------------------------------------------------------------------- # ○ 通行設定に☆を付与(上層チップ) #-------------------------------------------------------------------------- def change_upper_passages(id) return if tileset.ex_flags[id] == 0x0002 tileset.ex_flags[id] = 0x0002 tileset.flags[id] += 0x10 end #-------------------------------------------------------------------------- # ○ 通行設定「□」にしないリージョンを取得 #-------------------------------------------------------------------------- def map_z_region(x, y) region = region_id(x, y) region -= DESABLE_REGION if region > DESABLE_REGION return region end #-------------------------------------------------------------------------- # ○ 飛空船の通行可能判定 #-------------------------------------------------------------------------- def airship_passable?(x, y) region = map_z_region(x, y) region < $game_player.airship_priority_type end #-------------------------------------------------------------------------- # ○ 飛空船高度 #-------------------------------------------------------------------------- def airship_altitude(name) @map.airship_altitude(name) end end #============================================================================== # ■ Game_CharacterBase #------------------------------------------------------------------------------ #  キャラクターを扱う基本のクラスです。全てのキャラクターに共通する、座標やグ # ラフィックなどの基本的な情報を保持します。 #============================================================================== class Game_CharacterBase #-------------------------------------------------------------------------- # ☆ 非公開メンバ変数の初期化 #-------------------------------------------------------------------------- alias a1_passages_square_gcb_init_private_members init_private_members def init_private_members a1_passages_square_gcb_init_private_members @screen_z_ex = nil @first_region = 0 end #-------------------------------------------------------------------------- # ☆ 画面 Z 座標の取得 #-------------------------------------------------------------------------- alias a1_passages_square_gcb_screen_z screen_z def screen_z return a1_passages_square_gcb_screen_z unless @screen_z_ex return @screen_z_ex end #-------------------------------------------------------------------------- # ☆ まっすぐに移動 # d : 方向(2,4,6,8) # turn_ok : その場での向き変更を許可 #-------------------------------------------------------------------------- alias a1_passages_square_gcb_move_straight move_straight def move_straight(d, turn_ok = true) a1_passages_square_gcb_move_straight(d, turn_ok) if @move_succeed region = $game_map.map_z_region(@x, @y) @first_region = region if first_region == 0 && region > 0 @next_region = region if first_region > 0 && region > 0 reset_region if region == 0 priority = @priority_type @priority_type += 3 if priority_up? @priority_type -= 3 if priority_down? @first_region = @next_region end end #-------------------------------------------------------------------------- # ○ プライオリティ上げる? #-------------------------------------------------------------------------- def priority_up? @first_region == @priority_type && @next_region == @priority_type + 3 end #-------------------------------------------------------------------------- # ○ プライオリティ下げる? #-------------------------------------------------------------------------- def priority_down? @first_region == @priority_type && @next_region == @priority_type - 3 end #-------------------------------------------------------------------------- # ○ 踏んだリージョンリセット #-------------------------------------------------------------------------- def reset_region @first_region = 0 @next_region = 0 end #-------------------------------------------------------------------------- # ○ 最初に踏んだリージョン #-------------------------------------------------------------------------- def first_region @first_region ||= 0 return @first_region end #-------------------------------------------------------------------------- # ○ 次に踏んだリージョン #-------------------------------------------------------------------------- def next_region @next_region ||= 0 return @next_region end #-------------------------------------------------------------------------- # ☆ マップ通行可能判定 # d : 方向(2,4,6,8) #-------------------------------------------------------------------------- alias a1_passages_square_gcb_map_passable? map_passable? def map_passable?(x, y, d) return a1_passages_square_gcb_map_passable?(x, y, d) if @priority_type < 2 return $game_map.passable_ex?(x, y, d) end #-------------------------------------------------------------------------- # ★ イベントとの衝突判定 #-------------------------------------------------------------------------- def collide_with_events?(x, y) $game_map.events_xy_nt(x, y).any? do |event| chk_collide_priority(event, x, y) || self.is_a?(Game_Event) end end #-------------------------------------------------------------------------- # ○ イベントとのプライオリティ差における衝突判定 #-------------------------------------------------------------------------- def chk_collide_priority(event, x, y) return true if @priority_type == event.priority_type my_region = $game_map.map_z_region(@x, @y) ev_region = $game_map.map_z_region(x, y) return true if (my_region - ev_region).abs == 3 && (@priority_type - event.priority_type).abs == 3 return false end #-------------------------------------------------------------------------- # ○ プライオリティタイプの設定 #-------------------------------------------------------------------------- def set_priority_type region = $game_map.map_z_region(@x, @y) priority = region priority = 1 if priority == 0 return priority end #-------------------------------------------------------------------------- # ☆ ジャンプ時の更新 #-------------------------------------------------------------------------- alias a1_passages_square_gcb_update_jump update_jump def update_jump a1_passages_square_gcb_update_jump @priority_type = set_priority_type if @jump_count == 0 end end #============================================================================== # ■ Game_Player #------------------------------------------------------------------------------ #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。 #============================================================================== class Game_Player < Game_Character #-------------------------------------------------------------------------- # ★ マップイベントの起動 # triggers : トリガーの配列 # normal : プライオリティ[通常キャラと同じ]かそれ以外か #-------------------------------------------------------------------------- def start_map_event(x, y, triggers, normal) $game_map.events_xy(x, y).each do |event| next unless chk_event_priority(event, normal) event.start if event.trigger_in?(triggers) end end #-------------------------------------------------------------------------- # ○ マップイベントの起動のプライオリティチェック #-------------------------------------------------------------------------- def chk_event_priority(event, normal) return true if normal && chk_collide_priority(event, event.x, event.y) return false if (@priority_type - event.priority_type).abs > 1 return true end #-------------------------------------------------------------------------- # ☆ マップ通行可能判定 # d : 方向(2,4,6,8) #-------------------------------------------------------------------------- alias a1_ex_priority_gp_map_passable? map_passable? def map_passable?(x, y, d) return a1_ex_priority_gp_map_passable?(x, y, d) unless @vehicle_type == :airship return $game_map.airship_passable?(x, y) end #-------------------------------------------------------------------------- # ☆ 乗り物に乗る # 現在乗り物に乗っていないことが前提。 #-------------------------------------------------------------------------- alias a1_ex_priority_gp_get_on_vehicle get_on_vehicle def get_on_vehicle a1_ex_priority_gp_get_on_vehicle return cancel_airship unless get_on_airship? if @vehicle_type == :airship @priority_type = airship_priority_type if @vehicle_type == :airship end #-------------------------------------------------------------------------- # ○ 飛空船に乗るのをキャンセル #-------------------------------------------------------------------------- def cancel_airship @vehicle_type = :walk @vehicle_getting_on = false @followers.gathering = false end #-------------------------------------------------------------------------- # ○ 飛空船に乗れる? #-------------------------------------------------------------------------- def get_on_airship? (@priority_type - $game_map.airship.priority_type).abs < 2 end #-------------------------------------------------------------------------- # ☆ 乗り物から降りる # 現在乗り物に乗っていることが前提。 #-------------------------------------------------------------------------- alias a1_ex_priority_gp_get_off_vehicle get_off_vehicle def get_off_vehicle @priority_type = set_priority_type if @vehicle_type == :airship && vehicle.land_ok?(@x, @y, @direction) a1_ex_priority_gp_get_off_vehicle end #-------------------------------------------------------------------------- # ○ 飛空船のプライオリティタイプの取得 #-------------------------------------------------------------------------- def airship_priority_type vehicle.airship_priority_type end #-------------------------------------------------------------------------- # ○ 飛空船のプライオリティタイプの設定 #-------------------------------------------------------------------------- def airship_priority_type=(priority_type) vehicle.airship_priority_type = priority_type end #-------------------------------------------------------------------------- # ☆ 乗り物に乗る動作の更新 #-------------------------------------------------------------------------- alias a1_ex_priority_gp_update_vehicle_get_on update_vehicle_get_on def update_vehicle_get_on a1_ex_priority_gp_update_vehicle_get_on @through = false if in_airship? end end #============================================================================== # ■ Game_Vehicle #------------------------------------------------------------------------------ #  乗り物を扱うクラスです。このクラスは Game_Map クラスの内部で使用されます。 # 現在のマップに乗り物がないときは、マップ座標 (-1,-1) に設定されます。 #============================================================================== class Game_Vehicle < Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :airship_priority_type #-------------------------------------------------------------------------- # ☆ オブジェクト初期化 # type : 乗り物タイプ(:boat, :ship, :airship) #-------------------------------------------------------------------------- alias a1_ex_priority_gv_initialize initialize def initialize(type) @get_off_now = false @airship_priority_type = 2 a1_ex_priority_gv_initialize(type) end #-------------------------------------------------------------------------- # ☆ リフレッシュ #-------------------------------------------------------------------------- alias a1_ex_priority_gv_refresh refresh def refresh @ex_key = "飛空船" if @type == :airship && !@ex_key @airship_priority_type = $game_map.airship_altitude(@ex_key) a1_ex_priority_gv_refresh @priority_type = @driving ? @airship_priority_type : set_priority_type if @type == :airship end #-------------------------------------------------------------------------- # ○ 乗り物のプライオリティタイプ設定 #-------------------------------------------------------------------------- def set_priority_type priority = $game_map.map_z_region(@x, @y) priority -= 1 if @type == :airship priority = 0 if priority < 0 @get_off_now = false return priority end #-------------------------------------------------------------------------- # ★ 飛行船が飛ぶ高さを取得 #-------------------------------------------------------------------------- def max_altitude 16 * @airship_priority_type end #-------------------------------------------------------------------------- # ☆ 乗り物から降りる #-------------------------------------------------------------------------- alias a1_ex_priority_gv_get_off get_off def get_off a1_ex_priority_gv_get_off @get_off_now = true if @type == :airship end #-------------------------------------------------------------------------- # ☆ 飛行船の高度を更新 #-------------------------------------------------------------------------- alias a1_ex_priority_gv_update_airship_altitude update_airship_altitude def update_airship_altitude a1_ex_priority_gv_update_airship_altitude @priority_type = @airship_priority_type if @altitude > 0 @priority_type = set_priority_type if @altitude == 0 && @get_off_now end #-------------------------------------------------------------------------- # ☆ 接岸/着陸可能判定 # d : 方向(2,4,6,8) #-------------------------------------------------------------------------- alias a1_ex_priority_gv_land_ok? land_ok? def land_ok?(x, y, d) ret = a1_ex_priority_gv_land_ok?(x, y, d) return ret unless @type == :airship return true if ret region = $game_map.map_z_region(x, y) events = $game_map.events_xy(x, y) events.each {|event| return true unless check_region_priority(region, event) } return ret end #-------------------------------------------------------------------------- # ○ リージョンプライオリティのチェック #-------------------------------------------------------------------------- def check_region_priority(priority, event) priority += 1 if priority == 0 (priority - event.priority_type).abs < 2 end end #============================================================================== # ■ Spriteset_Map #------------------------------------------------------------------------------ #  マップ画面のスプライトやタイルマップなどをまとめたクラスです。このクラスは # Scene_Map クラスの内部で使用されます。 #============================================================================== class Spriteset_Map #-------------------------------------------------------------------------- # ☆ 飛行船の影スプライトの作成 #-------------------------------------------------------------------------- alias a1_ex_priority_spm_create_shadow create_shadow def create_shadow a1_ex_priority_spm_create_shadow airship = $game_map.airship @shadow_sprite.z = airship.airship_priority_type * 100 - 20 end #-------------------------------------------------------------------------- # ☆ 飛行船の影スプライトの更新 #-------------------------------------------------------------------------- alias a1_ex_priority_spm_update_shadow update_shadow def update_shadow a1_ex_priority_spm_update_shadow airship = $game_map.airship region = $game_map.map_z_region(airship.x, airship.y) return if region < 1 map_height = (region / 3 + 1) * 8 @shadow_sprite.y = airship.screen_y + (airship.altitude - map_height) end end #============================================================================== # ■ Game_Followers #------------------------------------------------------------------------------ #  フォロワーの配列のラッパーです。このクラスは Game_Player クラスの内部で使 # 用されます。 #============================================================================== class Game_Followers #-------------------------------------------------------------------------- # ○ 集合中フラグの設定 #-------------------------------------------------------------------------- def gathering=(flag) @gathering = flag end end end