#============================================================================== # ■ VXAce-RGSS3-47 フィールドマップ [scene] by Claimh #============================================================================== #============================================================================== # ■ Scene_Map #============================================================================== class Scene_Map < Scene_Base #-------------------------------------------------------------------------- # ● 初期化設定 #-------------------------------------------------------------------------- def from_fieldmap(info, follower) $game_map.autoplay $game_player.moveto(info.x, info.y) $game_player.set_direction(info.dir) $game_player.followers.visible = follower $game_player.refresh $game_temp.from_fieldmap = true end #-------------------------------------------------------------------------- # ● 開始後処理 #-------------------------------------------------------------------------- def post_start super if $game_temp.from_fieldmap $game_temp.from_fieldmap = false @map_name_window.open unless SceneManager.scene_is?(Scene_FieldMap) end end end #============================================================================== # ■ Scene_FieldMap #------------------------------------------------------------------------------ #  フィールドマップ画面の処理を行うクラスです。 #============================================================================== class Scene_FieldMap < Scene_Map #DIR = [2,4,6,8,1,3,7,9] DIR = [2,4,6,8] #-------------------------------------------------------------------------- # ● 初期化設定 #-------------------------------------------------------------------------- def prepare(start_map_id, map_id, ev_id, back, dir, fade) @route = FieldMap::FieldRoute.new(start_map_id, map_id, ev_id, back, dir, fade) $game_map.autoplay @route.move_to_start @enable_cancel = false end #-------------------------------------------------------------------------- # ● 開始処理 [override] #-------------------------------------------------------------------------- def start @route.create_route @route.create_current_route super set_curret_map(@route.current_ev_id) end #-------------------------------------------------------------------------- # ● 開始後処理 [override] #-------------------------------------------------------------------------- def post_start perform_transition show_new_route Input.update @enable_cancel = true end #-------------------------------------------------------------------------- # ● 新規移動地点表示処理 #-------------------------------------------------------------------------- def show_new_route hide_all trs = [] new_routes = @route.new_route_rids new_routes.each do |r| rt = @route.route(r) tr = FieldMap.tr_include?($game_map.map_id, rt.to_ev_id) if tr trs.push(r) next end # 新規ルートの移動先へスクロール @route.scroll_target(rt.to_ev_id) update_back while scrolling? 12.times {|t| update_back} # イベント表示ON @route.create_new_route(r) $game_map.refresh 12.times {|t| update_back} Audio.me_stop;Audio.se_stop FieldMap::NEW_SE.play unless FieldMap::NEW_SE.nil? new_place_massage(@route.target_map(rt.to_ev_id)) end # 中継地点へのルートを追加 trs.each do |r| @route.create_new_route(r) end new_routes.each do |r| @spriteset.hide_new_place(@route.route(r), @route.place_info) @spriteset.show_new_route(r) end # 現在地へ戻る @route.reset_scroll update_back while scrolling? # 行き先追加されているかもしれないので更新 @route.create_current_route @target_sprite.each {|d| d.set_maps(@route.target_dir_maps(d.dir))} show_window end #-------------------------------------------------------------------------- # ● 新規移動先のメッセージ生成 #-------------------------------------------------------------------------- def new_place_massage(map_id) map = load_data(sprintf("Data/Map%03d.rvdata2", map_id)) $game_message.background = 1 $game_message.position = 2 $game_message.add("#{map.display_name}への道が開通した!") while $game_message.busy? or $game_message.visible Input.update @message_window.update update_back end end #-------------------------------------------------------------------------- # ● メッセージウィンドウの作成 #-------------------------------------------------------------------------- def create_message_window @message_window = Window_FieldMessage.new end #-------------------------------------------------------------------------- # ● スプライトセットの作成 #-------------------------------------------------------------------------- def create_spriteset @spriteset = Spriteset_FieldMap.new(@route) end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update super update_direction end #-------------------------------------------------------------------------- # ● シーン遷移に関連する更新 #-------------------------------------------------------------------------- def update_scene #~ check_gameover #~ update_transfer_player unless scene_changing? #~ update_encounter unless scene_changing? #~ update_call_menu unless scene_changing? update_call_debug unless scene_changing? end #-------------------------------------------------------------------------- # ● フレーム更新 : 行き先 #-------------------------------------------------------------------------- def update_direction return if !$game_player.movable? return if $game_map.interpreter.running? return if update_route return if update_move_cancel update_into_map end #-------------------------------------------------------------------------- # ● フレーム更新 : ルート移動 #-------------------------------------------------------------------------- def update_route return false unless Input.press?(:UP) or Input.press?(:DOWN) or Input.press?(:RIGHT) or Input.press?(:LEFT) target = @route.target[Input.dir8] return false if target.nil? hide_all last_target = @route.move_to_target(target) update_back while interpreter_runnning? if @route.place(last_target).force @enable_cancel = false @route.set_current_ev_id(last_target) pos = @route.into_map update_back update_back while interpreter_runnning? @route.goto_map(@route.current_map_id ,pos) else set_curret_map(last_target) end return true end #-------------------------------------------------------------------------- # ● フレーム更新 : マップ移動 #-------------------------------------------------------------------------- def update_into_map return unless Input.trigger?(:C) return Sound.play_buzzer unless @route.into_map? Sound.play_ok @enable_cancel = false hide_all pos = @route.into_map update_back update_back while interpreter_runnning? @route.goto_map(@route.current_map_id ,pos) end #-------------------------------------------------------------------------- # ● フレーム更新 : 行き先キャンセル #-------------------------------------------------------------------------- def update_move_cancel return false unless @enable_cancel return false unless Input.trigger?(:B) if @route.start_map? Sound.play_cancel @route.move_to_start set_curret_map(@route.start_ev_id) elsif @route.place(@route.start_ev_id).enable? Sound.play_cancel hide_all @route.cancel_map else # 移動禁止 Sound.play_buzzer end return true end #-------------------------------------------------------------------------- # ● バックのフレーム更新 #-------------------------------------------------------------------------- def update_back Graphics.update update_map_windows $game_map.update(true) $game_player.update $game_timer.update @spriteset.update end #-------------------------------------------------------------------------- # ● スクロール中? #-------------------------------------------------------------------------- def scrolling? $game_map.scrolling? end #-------------------------------------------------------------------------- # ● イベント実行中? #-------------------------------------------------------------------------- def interpreter_runnning? $game_map.interpreter.running? end #-------------------------------------------------------------------------- # ● 移動時のウィンドウ全消去 #-------------------------------------------------------------------------- def hide_all @map_name_window.hide @map_text_plane.hide @dir_sprite.each {|d| d.hide} @target_sprite.each {|d| d.hide} @help_window.hide end #-------------------------------------------------------------------------- # ● 現在位置の更新 #-------------------------------------------------------------------------- def set_curret_map(target) @route.set_current_ev_id(target) @help_window.refresh(@route.current_is_tr? ? true : !@route.place(target).enable?) map_id = @route.current_map_id @map_name_window.set_map(map_id) @map_text_plane.set_map(map_id) @target_sprite.each {|d| d.set_maps(@route.target_dir_maps(d.dir))} show_window end #-------------------------------------------------------------------------- # ● 移動後のウィンドウ表示 #-------------------------------------------------------------------------- def show_window @map_name_window.show @map_text_plane.show update_dir_visible @help_window.show end #-------------------------------------------------------------------------- # ● アロー位置・表示更新 #-------------------------------------------------------------------------- def update_dir_visible DIR.each do |d| i = DIR.index(d) if @route.target[d].nil? @dir_sprite[i].hide @target_sprite[i].hide else @dir_sprite[i].show @target_sprite[i].show end end end #-------------------------------------------------------------------------- # ● 全ウィンドウの作成 #-------------------------------------------------------------------------- def create_all_windows super create_help_window create_dir_sprite end #-------------------------------------------------------------------------- # ● マップ名ウィンドウの作成 #-------------------------------------------------------------------------- def create_location_window @map_name_window = Sprite_FieldMapName.new @map_text_plane = Plane_FieldMapText.new(@map_name_window.text_rect) end #-------------------------------------------------------------------------- # ● ヘルプウィンドウの作成 #-------------------------------------------------------------------------- def create_help_window @help_window = Sprite_FieldMapHelp.new end #-------------------------------------------------------------------------- # ● 方向spriteの作成 #-------------------------------------------------------------------------- def create_dir_sprite @dir_sprite = [] @target_sprite = [] DIR.each do |i| @dir_sprite.push(Arrow_FieldDir.new(i)) @target_sprite.push(Sprite_FieldTargetMapName.new(i)) end update_dir_visible end #-------------------------------------------------------------------------- # ● 全ウィンドウの更新 #-------------------------------------------------------------------------- def update_all_windows super update_map_windows end def update_map_windows @map_text_plane.update @dir_sprite.each {|sprite| sprite.update} end #-------------------------------------------------------------------------- # ● 全ウィンドウの解放 #-------------------------------------------------------------------------- def dispose_all_windows @help_window.dispose @map_name_window.dispose @map_text_plane.dispose @dir_sprite.each {|sprite| sprite.dispose} @target_sprite.each {|sprite| sprite.dispose} super end end