class Game_Map attr_reader :submap_events # サブマップイベント attr_reader :submaps #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias takott3mapinitialize initialize def initialize takott3mapinitialize @submap_events = {} end #-------------------------------------------------------------------------- # ● セットアップ #-------------------------------------------------------------------------- def setup(map_id) set_submap(map_id) @map_id = map_id @map = load_data(sprintf("Data/Map%03d.rvdata2", @map_id)) @tileset_id = @map.tileset_id @display_x = 0 @display_y = 0 referesh_vehicles setup_events setup_scroll setup_parallax setup_battleback @need_refresh = false end def set_submap(map_id) @submaps = [] return unless $data_submaps[map_id] $data_submaps[map_id].each_with_index do |v,i| mid = v[0] @submaps[i] = {} @submaps[i][:map] = load_data(sprintf("Data/Map%03d.rvdata2", mid)) @submaps[i][:mid] = mid @submaps[i][:id] = i @submaps[i][:height] = v[1] end end def set_submap_events(submap) submap[:map].events.each do |i, event| submap_event = Game_Event.new(submap[:mid], event) submap_event.map_height = submap[:height] submap_event.submap_id = submap[:id] key = 1000 * submap[:mid] + submap[:height] + 1000000 * i @submap_events[key] = submap_event end end #-------------------------------------------------------------------------- # ● イベントの更新 #-------------------------------------------------------------------------- def update_events @events.each_value {|event| event.update } @common_events.each {|event| event.update } @submap_events.each_value {|event| event.update } end #-------------------------------------------------------------------------- # ● イベントのセットアップ #-------------------------------------------------------------------------- def setup_events @submap_events = {} @submaps.each{|submap| set_submap_events(submap) } @events = {} @map.events.each do |i, event| @events[i] = Game_Event.new(@map_id, event) end @common_events = parallel_common_events.collect do |common_event| Game_CommonEvent.new(common_event.id) end refresh_tile_events end #-------------------------------------------------------------------------- # ● タイルセットの取得 #-------------------------------------------------------------------------- def subtileset(index) $data_tilesets[@submaps[index][:map].tileset_id] end #-------------------------------------------------------------------------- # ● マップデータの取得 #-------------------------------------------------------------------------- def subdata(id) @submap[id].data end #-------------------------------------------------------------------------- # ● タイル扱いイベントの配列をリフレッシュ #-------------------------------------------------------------------------- def refresh_tile_events @tile_events = @events.values.select {|event| event.tile? } @submap_tile_events = @submap_events.values.select {|event| event.tile? } end #-------------------------------------------------------------------------- # ● 指定座標に存在するイベントの配列取得 #-------------------------------------------------------------------------- def submap_events_xy(id,x, y) @submap_events.values.select {|event| event.pos?(x, y) && event.submap_id == id} end #-------------------------------------------------------------------------- # ● 指定座標に存在するイベント(すり抜け以外)の配列取得 #-------------------------------------------------------------------------- def submap_events_xy_nt(id,x, y) @submap_events.values.select {|event| event.pos_nt?(x, y) && event.submap_id == id} end #-------------------------------------------------------------------------- # ● 指定座標に存在するタイル扱いイベント(すり抜け以外)の配列取得 #-------------------------------------------------------------------------- def submap_tile_events_xy(id,x, y) @submap_tile_events.select {|event| event.pos_nt?(x, y) && event.submap_id == id} end #-------------------------------------------------------------------------- # ● 通行チェック # bit : 調べる通行禁止ビット #-------------------------------------------------------------------------- def check_submap_passage(id,x, y, bit) all_submap_tiles(id,x, y).each do |tile_id| flag = tileset.flags[tile_id] next if flag & 0x10 != 0 # [☆] : 通行に影響しない return true if flag & bit == 0 # [○] : 通行可 return false if flag & bit == bit # [×] : 通行不可 end return false # 通行不可 end #-------------------------------------------------------------------------- # ● 指定座標にある全てのタイル(イベント含む)を配列で取得 #-------------------------------------------------------------------------- def all_submap_tiles(id,x, y) submap_tile_events_xy(id,x, y).collect {|ev| ev.tile_id } + layered_submap_tiles(id,x, y) end def submap_passable?(id, x, y, d) check_submap_passage(id,x, y, (1 << (d / 2 - 1)) & 0x0f) end #-------------------------------------------------------------------------- # ● 指定座標にあるタイル ID の取得 #-------------------------------------------------------------------------- def submap_tile_id(id,x, y, z) @submaps[id][:map].data[x, y, z] || 0 end #-------------------------------------------------------------------------- # ● 指定座標にある全レイヤーのタイル(上から順)を配列で取得 #-------------------------------------------------------------------------- def layered_submap_tiles(id,x, y) [2, 1, 0].collect {|z| submap_tile_id(id,x, y, z) } end end