# # セルフスイッチのリアルタイム操作(RGSS3) #  (C)2011 TYPE74RX-T # #============================================================================== # ■ Game_Event #------------------------------------------------------------------------------ #  イベントを扱うクラスです。条件判定によるイベントページ切り替えや、並列処理 # イベント実行などの機能を持っており、Game_Map クラスの内部で使用されます。 #============================================================================== class Game_Event < Game_Character #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_reader :event end #============================================================================== # ★ Window_RX_T_SelectMapID #------------------------------------------------------------------------------ #  マップ ID とマップ名を表示するウィンドウです。 #============================================================================== class Window_RX_T_SelectMapID < Window_Selectable attr_accessor :sel_index # セルフスイッチウインドウ選択状況 attr_accessor :search_id # 検索するマップ ID #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize super(0, 0, Graphics.width, fitting_height(1)) @sel_index = 0 @search_id = Marshal.load(Marshal.dump($game_map.map_id)) refresh activate end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update return if @sel_index == -1 super update_control end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh contents.clear text = sprintf("Map ID:%03d", @search_id) draw_text(0, 0, 128, line_height, text) text = sprintf("名前:%s", $data_mapinfos[@search_id].name) draw_text(112, 0, 500, line_height, text) end #-------------------------------------------------------------------------- # ● キー操作の更新 #-------------------------------------------------------------------------- def update_control @search_id += 1 if Input.repeat?(:RIGHT) @search_id -= 1 if Input.repeat?(:LEFT) @search_id = 1 if @search_id < 1 @search_id = $data_mapinfos.size if @search_id > $data_mapinfos.size force if Input.repeat?(:RIGHT) or Input.repeat?(:LEFT) end #-------------------------------------------------------------------------- # ● セルフスイッチを指定するウィンドウの更新 #-------------------------------------------------------------------------- def force refresh @cfg_ssw_window.search_id = @search_id @cfg_ssw_window.reset @cfg_ssw_window.force_ok = true @cfg_ssw_window.update @cfg_ssw_window.force_ok = false @cfg_ssw_window.unselect end #-------------------------------------------------------------------------- # ● 右ウィンドウの設定 #-------------------------------------------------------------------------- def cfg_ssw_window=(cfg_ssw_window) @cfg_ssw_window = cfg_ssw_window update end end #============================================================================== # ★ RX_T_CTRL_SelfSeitch #------------------------------------------------------------------------------ #  デバッグ画面で、セルフスイッチを指定するウィンドウです。 #============================================================================== class Window_RX_T_CTRL_SelfSeitch < Window_Selectable #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :sw_id # 選択するセルフスイッチ種 attr_accessor :search_id # 検索するマップ ID attr_accessor :force_ok # 強制更新フラグ #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- def initialize(x, y) super(x, y, Graphics.width, Graphics.height-48) @sw_id = 0 @sw = ["A", "B", "C", "D"] @search_id = Marshal.load(Marshal.dump($game_map.map_id)) refresh self.top_row = 0#@@last_top_row select(0) @reset_flg = false @force_ok = false end #-------------------------------------------------------------------------- # ● マップ情報とインデックスをリセット #-------------------------------------------------------------------------- def reset @reset_flg = true $game_map.setup(Marshal.load(Marshal.dump(@search_id))) $game_map.refresh self.index = 0 end #-------------------------------------------------------------------------- # ● 項目数の取得 #-------------------------------------------------------------------------- def item_max # 真のイベント数を取得 @event_size = 0 (0..$game_map.events.size).each do |idx| ($game_map.events[@event_size + 1] ? @event_size += 1 : @event_size += 2) end @item_max = @event_size end #-------------------------------------------------------------------------- # ● フレーム更新 #-------------------------------------------------------------------------- def update license = (self.index > -1) license = true if @force_ok return unless license#if self.index < 0 super update_control end #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- def refresh @switch_max = ($data_system.switches.size - 1 + 9) / 10 @variable_max = ($data_system.variables.size - 1 + 9) / 10 @item_max = @switch_max + @variable_max create_contents draw_all_items activate end #-------------------------------------------------------------------------- # ● 全項目の描画 #-------------------------------------------------------------------------- def draw_all_items (0..@event_size).each {|idx|($game_map.events[idx + 1] ? draw_item(idx) : idx += 1) } end #-------------------------------------------------------------------------- # ● 項目の描画 #-------------------------------------------------------------------------- def draw_item(index) keys = [] statuses = [] sw = ["A", "B", "C", "D"] sw2 = ["A:", "B:", "C:", "D:"] (0...4).each do |i| keys[i] = [@search_id, index + 1, sw[i]] statuses[i] = $game_self_switches[keys[i]] ? "[ON]" : "[OFF]" end rect = item_rect_for_text(index) rect.width = 500 text = sprintf("No.%03d", index+1) draw_text(rect, text) rect.x = 76 rect.width = 110 text = sprintf("%s", $game_map.events[index+1].event.name) draw_text(rect, text) rect.width = 500 rect.x = 202 (0...4).each do |i| text = sprintf(sw2[i] + "%5s",statuses[i]) change_color((@sw_id == i && self.index == index &&! @force_ok ? system_color : normal_color)) draw_text(rect, text) rect.x += 80 end change_color(normal_color) end #-------------------------------------------------------------------------- # ● キャンセルボタンが押されたときの処理 #-------------------------------------------------------------------------- def process_cancel @last_index = Marshal.load(Marshal.dump(self.index)) self.unselect super self.deactivate end #-------------------------------------------------------------------------- # ● キー操作の更新 #-------------------------------------------------------------------------- def update_control c_update = false sw_id = Marshal.load(Marshal.dump(@sw_id)) # deep copy @sw_id += 1 if Input.repeat?(:RIGHT) && @sw_id < 3 &&! @force_ok @sw_id -= 1 if Input.repeat?(:LEFT) && @sw_id > 0 &&! @force_ok if Input.repeat?(:C) &&! @force_ok keys = [@search_id, self.index+1, @sw[@sw_id]] $game_self_switches[keys] = ($game_self_switches[keys] ? false : true) c_update = true end refresh if @sw_id != sw_id or c_update or Input.repeat?(:UP) or Input.repeat?(:DOWN) or @reset_flg @reset_flg = false end end #============================================================================== # ■ Scene_Map #------------------------------------------------------------------------------ #  マップ画面の処理を行うクラスです。 #============================================================================== class Scene_Map < Scene_Base #-------------------------------------------------------------------------- # ● F9 キーによるデバッグ呼び出し判定 #-------------------------------------------------------------------------- alias rx3_111219_update_call_debug update_call_debug def update_call_debug # ★ セルフスイッチデバッグ呼び出し if $TEST && Input.press?(:F9) && Input.press?(:SHIFT) SceneManager.call(Scene_RX_T_Config_SelfSwitch) return end rx3_111219_update_call_debug # メソッド呼び戻し end end #============================================================================== # ★ Scene_RX_T_Config_SelfSwitch #------------------------------------------------------------------------------ #  デバッグ画面の処理を行うクラスです。 #============================================================================== class Scene_RX_T_Config_SelfSwitch < Scene_MenuBase #-------------------------------------------------------------------------- # ● 開始処理 #-------------------------------------------------------------------------- def start super create_map_info_window create_cfg_self_switch_window end #-------------------------------------------------------------------------- # ● 終了処理 #-------------------------------------------------------------------------- def terminate $game_map.setup(Marshal.load(Marshal.dump(@save_map_id))) $game_map.refresh $game_player.moveto($game_player.x, $game_player.y) $game_player.refresh super end #-------------------------------------------------------------------------- # ● マップ ID とマップ名を表示するウィンドウの作成 #-------------------------------------------------------------------------- def create_map_info_window @save_map_id = Marshal.load(Marshal.dump($game_map.map_id)) @map_info_window = Window_RX_T_CTRL_SelfSeitch.new(0, 48) @map_info_window.set_handler(:cancel, method(:on_map_ok))#(:return_scene)) @map_info_window.deactivate @map_info_window.unselect end #-------------------------------------------------------------------------- # ● セルフスイッチを指定するウィンドウの作成 #-------------------------------------------------------------------------- def create_cfg_self_switch_window @cfg_ssw_window = Window_RX_T_SelectMapID.new @cfg_ssw_window.set_handler(:ok, method(:on_set_self_sw_esc)) @cfg_ssw_window.set_handler(:cancel, method(:return_scene)) @cfg_ssw_window.activate @cfg_ssw_window.cfg_ssw_window = @map_info_window end #-------------------------------------------------------------------------- # ● マップ選択[決定] #-------------------------------------------------------------------------- def on_map_ok @map_info_window.unselect @map_info_window.deactivate @cfg_ssw_window.show @cfg_ssw_window.activate @cfg_ssw_window.sel_index = 0 end #-------------------------------------------------------------------------- # ● セルフスイッチ設定終了[キャンセル] #-------------------------------------------------------------------------- def on_set_self_sw_esc @map_info_window.search_id = @cfg_ssw_window.search_id @cfg_ssw_window.sel_index = -1 @cfg_ssw_window.unselect @cfg_ssw_window.deactivate @map_info_window.show @map_info_window.activate @map_info_window.reset end end