|
选择框的选项里写if()表示条件满足时出现选项,en()表示条件不满足时为半透明不可选
v[x]表示变量,s[x]表示开关
该脚本自带多选项和选择框显示位置 選択肢位置(x, y[, row]) 在选择前面添加注释即可,
多选项直接插入多个选择支,中间不要有间隔- =begin
-
- ▼ 選択肢拡張 ver. 2.3
-
- RPGツクールVXAce用スクリプト
-
- 制作 : 木星ペンギン
- URL : [url]http://woodpenguin.blog.fc2.com/[/url]
-
- ------------------------------------------------------------------------------
- 概要
-
- □ 選択肢を連続して設定した場合、つなげて一つの選択肢にする機能の追加。
- □ 条件を設定することで、その項目を表示しない機能の追加。
- □ 選択肢内容が前回と同じだった場合、
- カーソルの初期位置を前回選んだ項目にする機能の追加。
- □ 選択肢ウィンドウの位置を一時的に変更する機能の追加。
- □ 条件を設定することで、その項目を半透明にして選択不可にする機能の追加。
- □ 選択肢毎にヘルプメッセージを表示できる機能の追加。
-
- ------------------------------------------------------------------------------
- 使い方
-
- □ 選択肢の表示を続けて配置すると、一つの選択肢にまとめられます。
- ・「キャンセルの場合」の処理は、無効以外を設定したものが適用され、
- 複数ある場合は後に設定された選択肢のものが適用されます。
-
- □ 選択肢の文章中に if(条件) と入れ、その条件が偽になると項目が表示されなくなります。
- ・s でスイッチ、v で変数を参照できます。
- ・「キャンセルの場合」の項目が表示されない場合、無効と同じ処理をします。
-
- □ 注釈に以下の文字列を入れることで、選択肢ウィンドウの表示位置を
- 一時的に変更することが出来ます。
-
- 選択肢位置(x, y[, row])
-
- x : ウィンドウを表示する X 座標。
- y : ウィンドウを表示する Y 座標。
- row : 選択肢を表示する最大行数。
- 指定しない場合は、通常の最大行数を無視して
- すべての選択肢が表示されます。
-
- □ 選択肢の文章中に en(条件) と入れ、その条件が偽になると項目が半透明で表示されます。
-
- □ 各項目の下に、注釈で以下の文字列を入れると、続きの文章を
- 項目のヘルプメッセージとしてカーソルを合わせたときに標示することができます。
-
- 選択肢ヘルプ
-
- □ 詳細は下記のサイトを参照してください。
-
- [url]http://woodpenguin.web.fc2.com/rgss3/choice_ex.html[/url]
-
- =end
- module WdTk
- module ChoiceEX
- #//////////////////////////////////////////////////////////////////////////////
- #
- # 設定項目
- #
- #//////////////////////////////////////////////////////////////////////////////
- #--------------------------------------------------------------------------
- # ● 選択肢の最大行数
- # 選択肢を表示するウィンドウの行数の最大数です。
- # 選択肢がこの数より小さければ、選択肢の数に合わせます。
- #--------------------------------------------------------------------------
- RowMax = 4
-
- #--------------------------------------------------------------------------
- # ● 選択肢の位置記憶
- # 前回表示した選択肢と全く同じ内容の選択肢を表示する場合、
- # カーソルの初期位置を前回選んだ項目にする機能です。
- # false で無効化できます。
- #--------------------------------------------------------------------------
- Store = true
-
- #--------------------------------------------------------------------------
- # ● 選択肢ヘルプを読み取る文字列
- #--------------------------------------------------------------------------
- Help = "選択肢ヘルプ"
-
- end
-
- #//////////////////////////////////////////////////////////////////////////////
- #
- # 以降、変更する必要なし
- #
- #//////////////////////////////////////////////////////////////////////////////
-
- @material ||= []
- @material << :ChoiceEX
- def self.include?(sym)
- @material.include?(sym)
- end
-
- end
-
- #==============================================================================
- # ■ Game_Message
- #------------------------------------------------------------------------------
- # 文章や選択肢などを表示するメッセージウィンドウの状態を扱うクラスです。この
- # クラスのインスタンスは $game_message で参照されます。
- #==============================================================================
-
- class Game_Message
- #--------------------------------------------------------------------------
- # ● 公開インスタンス変数
- #--------------------------------------------------------------------------
- attr_accessor :choice_x # 選択肢ウィンドウの表示 X 座標
- attr_accessor :choice_y # 選択肢ウィンドウの表示 Y 座標
- attr_accessor :choice_row_max # 選択肢ウィンドウの表示行数
- attr_accessor :choice_enables # 選択肢の有効状態
- attr_accessor :choice_help # 選択肢のヘルプ
- #--------------------------------------------------------------------------
- # ○ クリア
- #--------------------------------------------------------------------------
- alias _wdtk_choice_clear clear
- def clear
- _wdtk_choice_clear
- @choice_x = @choice_y = nil
- @choice_row_max = WdTk::ChoiceEX::RowMax
- @choice_enables = []
- @choice_help = {}
- end
- end
-
- #==============================================================================
- # ■ Game_Interpreter
- #==============================================================================
- class Game_Interpreter
- #--------------------------------------------------------------------------
- # ☆ 選択肢のセットアップ
- #--------------------------------------------------------------------------
- def setup_choices(params)
- result = []
- add_choices(params, @index, result)
- $game_message.choice_enables = $game_message.choices.collect do |c|
- !c.slice!(/\s*en\(([^\)]+)\)/i) || choice_eval($1)
- end
- unless $game_message.choices.empty?
- m = result.index($game_message.choice_cancel_type - 1)
- $game_message.choice_enables << (!m || $game_message.choice_enables[m])
- result << $game_message.choice_cancel_type - 1
- $game_message.choice_proc = Proc.new {|n| @branch[@indent] = result[n] }
- else
- @branch[@indent] = -1
- end
- end
- #--------------------------------------------------------------------------
- # ● 選択肢の追加
- #--------------------------------------------------------------------------
- def add_choices(params, i, result, d = 0)
- params[0].each_with_index do |s, n|
- choice = s.dup
- next if choice.slice!(/\s*if\(([^\)]+)\)/i) && !choice_eval($1)
- $game_message.choices << choice
- result << n + d
- end
- if params[1] == 5 || (params[1] > 0 && result.include?(params[1] + d - 1))
- $game_message.choice_cancel_type = params[1] + d
- end
- indent = @list[i].indent
- loop do
- i += 1
- if @list[i].indent == indent
- case @list[i].code
- when 402 # [**] の場合
- m = result.index(@list[i].parameters[0] + d)
- get_help_texts(m, i + 1) if m
- when 404 # 分岐終了
- break
- end
- end
- end
- i += 1
- add_choices(@list[i].parameters, i, result, d + 5) if @list[i].code == 102
- end
- #--------------------------------------------------------------------------
- # ● 分岐用
- #--------------------------------------------------------------------------
- def choice_eval(formula)
- s, v = $game_switches, $game_variables
- begin
- Kernel.eval(formula)
- rescue
- msgbox "以下の条件判定でエラーが出ました。\n\n", formula
- true
- end
- end
- #--------------------------------------------------------------------------
- # ● ヘルプ用テキストの取得
- #--------------------------------------------------------------------------
- def get_help_texts(b, i)
- if @list[i].code == 108 && @list[i].parameters[0] == WdTk::ChoiceEX::Help
- $game_message.choice_help[b] = []
- loop do
- i += 1
- break if @list[i].code != 408
- $game_message.choice_help[b] << @list[i].parameters[0]
- end
- end
- end
- #--------------------------------------------------------------------------
- # ◯ 注釈
- #--------------------------------------------------------------------------
- alias _wdtk_choice_command_108 command_108
- def command_108
- _wdtk_choice_command_108
- @comments.each do |comment|
- if comment =~ /選択肢位置\((\d+),\s*(\d+),?\s*(\d*)\)/
- $game_message.choice_x = $1.to_i
- $game_message.choice_y = $2.to_i
- $game_message.choice_row_max = ($3.empty? ? 99 : $3.to_i)
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 分岐終了の場合
- #--------------------------------------------------------------------------
- def command_404
- if next_event_code == 102
- @branch[@indent] -= 5 if @branch.include?(@indent)
- @index += 1
- command_skip
- #~ else
- #~ @branch.delete(@indent)
- end
- end
- end
-
- #==============================================================================
- # ■ Window_ChoiceList
- #==============================================================================
- class Window_ChoiceList
- #--------------------------------------------------------------------------
- # ☆ 入力処理の開始
- #--------------------------------------------------------------------------
- def start
- return unless close?
- last_choices = @list.collect {|c| c[:name] }
- update_placement
- refresh
- unless WdTk::ChoiceEX::Store && last_choices == $game_message.choices
- select(0)
- end
- open
- activate
- end
- #--------------------------------------------------------------------------
- # ○ ウィンドウ位置の更新
- #--------------------------------------------------------------------------
- alias _wdtk_choice_update_placement update_placement
- def update_placement
- _wdtk_choice_update_placement
- self.height = [height, fitting_height($game_message.choice_row_max)].min
- if @message_window.y >= Graphics.height / 2
- self.y = @message_window.y - height
- else
- self.y = @message_window.y + @message_window.height
- end
- self.x = $game_message.choice_x if $game_message.choice_x
- self.y = $game_message.choice_y if $game_message.choice_y
- end
- #--------------------------------------------------------------------------
- # ☆ コマンドリストの作成
- #--------------------------------------------------------------------------
- def make_command_list
- $game_message.choices.each_with_index do |choice, i|
- add_command(choice, :choice, $game_message.choice_enables[i])
- end
- end
- #--------------------------------------------------------------------------
- # ○ 項目の描画
- #--------------------------------------------------------------------------
- alias _wdtk_choice_draw_item draw_item
- def draw_item(index)
- @choice_enabled = command_enabled?(index)
- _wdtk_choice_draw_item(index)
- end
- #--------------------------------------------------------------------------
- # ● テキスト描画色の変更
- #--------------------------------------------------------------------------
- def change_color(color, enabled = true)
- super(color, enabled && @choice_enabled)
- end
- #--------------------------------------------------------------------------
- # ● キャンセルボタンが押されたときの処理
- #--------------------------------------------------------------------------
- def process_cancel
- if $game_message.choice_enables[item_max]
- super
- else
- Sound.play_buzzer
- end
- end
- #--------------------------------------------------------------------------
- # ☆ キャンセルハンドラの呼び出し
- #--------------------------------------------------------------------------
- def call_cancel_handler
- $game_message.choice_proc.call(item_max)
- close
- end
- #--------------------------------------------------------------------------
- # ● ウィンドウを閉じる
- #--------------------------------------------------------------------------
- def close
- @message_window.on_show_fast unless $game_message.choice_help.empty?
- super
- end
- #--------------------------------------------------------------------------
- # ● ヘルプウィンドウ更新メソッドの呼び出し
- #--------------------------------------------------------------------------
- def call_update_help
- update_help if active && !$game_message.choice_help.empty?
- end
- #--------------------------------------------------------------------------
- # ● ヘルプウィンドウの更新
- #--------------------------------------------------------------------------
- def update_help
- @message_window.force_clear
- if $game_message.choice_help.include?(index)
- $game_message.texts.replace($game_message.choice_help[index])
- else
- $game_message.texts.clear
- end
- end
- end
-
- #==============================================================================
- # ■ Window_Message
- #==============================================================================
- class Window_Message
- #--------------------------------------------------------------------------
- # ● 文章の標示を強制クリア
- #--------------------------------------------------------------------------
- def force_clear
- @gold_window.close
- @fiber = nil
- close
- if WdTk.include?(:MesEff)
- @character_sprites.each do |sprite, params|
- next if params.empty?
- sprite.bitmap.clear
- sprite.visible = false
- params.clear
- end
- end
- end
- #--------------------------------------------------------------------------
- # ● 文章を最後まで表示する
- #--------------------------------------------------------------------------
- def on_show_fast
- @show_fast = true
- end
- end
复制代码 |
评分
-
查看全部评分
|