#============================================================================== # ■ Scrool Selectable #------------------------------------------------------------------------------ # 製作:春日屋/春日 # URL :http://www.katch.ne.jp/kasugaya/ # Ver :1.00 # 更新:2007/09/27 # #  選択肢ウィンドウで、スクロールして4つ以上の選択肢を表示します。 # また、それに合わせ選択結果を指定した変数に格納します。 # #============================================================================== #============================================================================== # ■ Game_Temp #------------------------------------------------------------------------------ #  選択肢用一時データの追加です。 #============================================================================== class Game_Temp #-------------------------------------------------------------------------- # ● 公開インスタンス変数 #-------------------------------------------------------------------------- attr_accessor :choice_cache attr_accessor :choice_cancel attr_accessor :choice_variable attr_accessor :choice_mode_frag #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias init2 initialize def initialize # 設定項目--------------------------------------------------- @choice_cancel = -1 # キャンセル時の戻り値指定 @choice_variable = 0 # 戻り値に使用される変数番号 # 設定項目ここまで------------------------------------------- @choice_cache = Array.new @choice_mode_frag = false init2 end end #============================================================================== # ■ Window_Message #------------------------------------------------------------------------------ #  文章表示に使うメッセージウィンドウです。 #============================================================================== class Window_Message < Window_Selectable #-------------------------------------------------------------------------- # ● リフレッシュ #-------------------------------------------------------------------------- alias refresh2 refresh def refresh if $game_temp.choice_max != 0 # 行数取得 line_num = $game_temp.choice_max + $game_temp.choice_start h = [line_num * 32, 128].max self.contents.dispose self.contents = Bitmap.new(self.width - 32, h) end refresh2 end #-------------------------------------------------------------------------- # ● カーソルの矩形更新 #-------------------------------------------------------------------------- def update_cursor_rect if @index >= 0 n = [$game_temp.choice_start + @index, 3].min self.cursor_rect.set(8, n * 32, @cursor_width, 32) self.oy = [$game_temp.choice_start+@index-3, 0].max*32 else self.cursor_rect.empty self.oy = 0 end end end #============================================================================== # ■ Interpreter #------------------------------------------------------------------------------ #  Window_Messageとの接点 #============================================================================== class Interpreter #-------------------------------------------------------------------------- # ● オブジェクト初期化 #-------------------------------------------------------------------------- alias init2 initialize def initialize(depth = 0, main = false) @push_select = false init2(depth, main) end #-------------------------------------------------------------------------- # ● 選択肢のセットアップ #-------------------------------------------------------------------------- def setup_choices(parameters) # choice_max に選択肢の項目数を設定 $game_temp.choice_max = [parameters[0].size, $game_temp.choice_cache.size].max # message_text に選択肢を設定 i = 0 while parameters[0][i] != nil || $game_temp.choice_cache[i] != nil if $game_temp.choice_mode_frag && $game_temp.choice_cache[i] != nil $game_temp.message_text += $game_temp.choice_cache[i] + "\n" else $game_temp.message_text += parameters[0][i] + "\n" end i += 1 end # キャンセルの場合の処理を設定 if $game_temp.choice_mode_frag $game_temp.choice_cancel_type = $game_temp.choice_cancel + 1 else $game_temp.choice_cancel_type = parameters[1] end # コールバックを設定 current_indent = @list[@index].indent $game_temp.choice_proc = Proc.new { |n| if $game_temp.choice_mode_frag $game_variables[$game_temp.choice_variable] = n #@branch[current_indent] = 0 else @branch[current_indent] = n end $game_temp.choice_mode_frag = false } # 選択肢キャッシュクリア $game_temp.choice_cache.clear end #-------------------------------------------------------------------------- # ● 文章の表示 #-------------------------------------------------------------------------- def command_101 # ほかの文章が message_text に設定済みの場合 if $game_temp.message_text != nil # 終了 return false end # メッセージ終了待機中フラグおよびコールバックを設定 @message_waiting = true $game_temp.message_proc = Proc.new { @message_waiting = false } # message_text に 1 行目を設定 unless scan_tag(@list[@index].parameters[0]) $game_temp.message_text = @list[@index].parameters[0] + "\n" line_count = 1 else $game_temp.message_text = "" line_count = 0 end # ループ loop do # 次のイベントコマンドが文章 2 行目以降の場合 if @list[@index+1].code == 401 # message_text に 2 行目以降を追加 unless scan_tag(@list[@index+1].parameters[0]) $game_temp.message_text += @list[@index+1].parameters[0] + "\n" line_count += 1 end # イベントコマンドが文章 2 行目以降ではない場合 else # 行数が 0 の場合表示を取り消し if line_count == 0 $game_temp.message_text = nil @message_waiting = false $game_temp.message_proc = nil command_skip end # 次のイベントコマンドが選択肢の表示の場合 if @list[@index+1].code == 102 # 選択肢が画面に収まる場合 if @list[@index+1].parameters[0].size <= 4 - line_count # インデックスを進める @index += 1 # 選択肢のセットアップ $game_temp.choice_start = line_count setup_choices(@list[@index].parameters) end # 次のイベントコマンドが数値入力の処理の場合 elsif @list[@index+1].code == 103 # 数値入力ウィンドウが画面に収まる場合 if line_count < 4 # インデックスを進める @index += 1 # 数値入力のセットアップ $game_temp.num_input_start = line_count $game_temp.num_input_variable_id = @list[@index].parameters[0] $game_temp.num_input_digits_max = @list[@index].parameters[1] end end # 継続 return true end # インデックスを進める @index += 1 end end #-------------------------------------------------------------------------- # ● 特殊タグの解析 #-------------------------------------------------------------------------- def scan_tag(str) if str =~ // # 選択肢開始タグ str = str.split(/ +/) str.each{|m| if m =~ /variable/ $game_temp.choice_variable = m.split(/"/)[1].to_i elsif m =~ /cancel/ $game_temp.choice_cancel = m.split(/"/)[1].to_i end } @push_select = true $game_temp.choice_cache.clear elsif str =~ /<\/SELECTABLE>/ # 選択肢終了タグ $game_temp.choice_mode_frag = true @push_select = false elsif @push_select # 選択肢設定 $game_temp.choice_cache << str else # 特殊タグでなければ偽を返す return false end # 特殊タグだった場合真を返す return true end end