Project1

标题: 合并两款對話腳本 [打印本页]

作者: PCNinja    时间: 2011-8-10 22:19
标题: 合并两款對話腳本
本帖最后由 「旅」 于 2011-8-10 22:29 编辑

有沒有人能幫我把櫻雅在士的對話腳本和齒車之城的對話腳本合並了?
  1. # ▼▲▼ XRXS 9. メッセージ表示フルグレードアップ ver..11 ▼▲▼
  2. # by 桜雅 在土, 和希, RaTTiE

  3. #==============================================================================
  4. # ■ Window_Message
  5. #==============================================================================
  6. class Window_Message < Window_Selectable
  7.   # 一文字ずつ描写
  8.   DEFAULT_TYPING_ENABLE = true                # falseにすると瞬間表示
  9.   #--------------------------------------------------------------------------
  10.   # ● オブジェクト初期化
  11.   #--------------------------------------------------------------------------
  12.   alias xrxs9_initialize initialize
  13.   def initialize
  14.     xrxs9_initialize
  15.     # 再生サウンド名がない場合は""とする
  16.     if $soundname_on_speak == nil then
  17.       $soundname_on_speak = ""
  18.     end
  19.     # 外字ファイルパス設定
  20.     $gaiji_file = "./Graphics/Gaiji/sample.png"
  21.     # 外字データ読み込み
  22.     if FileTest.exist?($gaiji_file)
  23.       @gaiji_cache = Bitmap.new($gaiji_file)
  24.     else
  25.       @gaigi_cache = nil
  26.     end
  27.     # 文字透過転送用バッファ
  28.     @opacity_text_buf = Bitmap.new(32, 32)
  29.   end
  30.   #--------------------------------------------------------------------------
  31.   # ● メッセージ終了処理
  32.   #--------------------------------------------------------------------------
  33.   alias xrxs9_terminate_message terminate_message
  34.   def terminate_message
  35.     if @name_window_frame != nil
  36.       @name_window_frame.dispose
  37.       @name_window_frame = nil
  38.     end
  39.     if @name_window_text  != nil
  40.       @name_window_text.dispose
  41.       @name_window_text  = nil
  42.     end
  43.     xrxs9_terminate_message
  44.   end
  45.   #--------------------------------------------------------------------------
  46.   # ● リフレッシュ
  47.   #--------------------------------------------------------------------------
  48.   def refresh
  49.     # 初期化
  50.     self.contents.clear
  51.     self.contents.font.color = normal_color
  52.     self.contents.font.size  = Font.default_size
  53.     @x = @y = @max_x = @max_y = @indent = @lines = 0
  54.     @face_indent = 0
  55.     @opacity = 255
  56.     @cursor_width = 0
  57.     @write_speed = 0
  58.     @write_wait = 0
  59.     @mid_stop = false
  60.     @face_file = nil
  61.     # @popchar が -2 の場合、標準位置。-1の場合、文字センター。
  62.     # 0以上の場合 キャラポップ。0は主人公、1以降はイベント。
  63.     @popchar = -2
  64.     # 選択肢なら字下げを行う
  65.     if $game_temp.choice_start == 0
  66.       @x = 8
  67.     end
  68.     # 表示待ちのメッセージがある場合
  69.     if $game_temp.message_text != nil
  70.       @now_text = $game_temp.message_text
  71.       # 顔表示指定\Fがあるか?
  72.       if (/\A\\[Ff]\[(.+?)\]/.match(@now_text))!=nil then
  73.         # ファイルチェック
  74.         if FileTest.exist?("Graphics/Pictures/" + $1 + ".png")
  75.           # 顔グラを描画
  76.           @face_file = $1 + ".png"
  77.           self.contents.blt(16, 16, RPG::Cache.picture(@face_file), Rect.new(0, 0, 96, 96))
  78.           # 全行 128ピクセルのインデントを入れる。
  79.           @x = @face_indent = 128
  80.         end
  81.         @now_text.gsub!(/\\[Ff]\[(.*?)\]/) { "" }
  82.       end
  83.       # \nameがあるか?
  84.       name_window_set = false
  85.       if (/\\[Nn]ame\[(.+?)\]/.match(@now_text)) != nil
  86.         # 値を設定
  87.         name_window_set = true
  88.         name_text = $1
  89.         # \name[]部分を削除
  90.         @now_text.sub!(/\\[Nn]ame\[(.*?)\]/) { "" }
  91.       end
  92.       # ウィンドウ位置判定
  93.       if (/\\[Pp]\[([-1,0-9]+)\]/.match(@now_text))!=nil then
  94.         @popchar = $1.to_i
  95.         if @popchar == -1
  96.           @x = @indent = 48
  97.           @y = 4
  98.         end
  99.         @now_text.gsub!(/\\[Pp]\[([-1,0-9]+)\]/) { "" }
  100.       end
  101.       # 制御文字処理
  102.       begin
  103.       last_text = @now_text.clone
  104.       # \Vを独自ルーチンに変更(追加部分)
  105.       @now_text.gsub!(/\\[Vv]\[([IiWwAaSs]?)([0-9]+)\]/) { convart_value($1, $2.to_i) }
  106.       end until @now_text == last_text
  107.       @now_text.gsub!(/\\[Nn]\[([0-9]+)\]/) do
  108.         $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  109.       end
  110.       # 便宜上、"\\\\" を "\000" に変換
  111.       @now_text.gsub!(/\\\\/) { "\000" }
  112.       # "\\C" を "\001" に、"\\G" を "\002" に、
  113.       # "\\S" を "\003" に、"\\A" を "\004" に変換
  114.       @now_text.gsub!(/\\[Cc]\[([0-9]+)\]/) { "\001[#{$1}]" }
  115.       @now_text.gsub!(/\\[Gg]/) { "\002" }
  116.       @now_text.gsub!(/\\[Ss]\[([0-9]+)\]/) { "\003[#{$1}]" }
  117.       @now_text.gsub!(/\\[Aa]\[(.*?)\]/) { "\004[#{$1}]" }
  118.       @now_text.gsub!(/\\[.]/) { "\005" }
  119.       @now_text.gsub!(/\\[|]/) { "\006" }
  120.       # 競合すると何かと気まずいので、\016以降を使用する
  121.       @now_text.gsub!(/\\[>]/) { "\016" }
  122.       @now_text.gsub!(/\\[<]/) { "\017" }
  123.       @now_text.gsub!(/\\[!]/) { "\020" }
  124.       @now_text.gsub!(/\\[~]/) { "\021" }
  125.       @now_text.gsub!(/\\[Ee]\[([0-9]+)\]/) { "\022[#{$1}]" }
  126.       # インデント設定(追加部分)
  127.       @now_text.gsub!(/\\[Ii]/) { "\023" }
  128.       # テキスト透過率指定(追加部分)
  129.       @now_text.gsub!(/\\[Oo]\[([0-9]+)\]/) { "\024[#{$1}]" }
  130.       # テキストサイズ指定(追加部分)
  131.       @now_text.gsub!(/\\[Hh]\[([0-9]+)\]/) { "\025[#{$1}]" }
  132.       # 空白挿入(追加部分)
  133.       @now_text.gsub!(/\\[Bb]\[([0-9]+)\]/) { "\026[#{$1}]" }
  134.       # ルビ表示(追加部分)
  135.       @now_text.gsub!(/\\[Rr]\[(.*?)\]/) { "\027[#{$1}]" }
  136.       if @popchar >= 0
  137.         @text_save = @now_text.clone
  138.         @max_x = 0
  139.         @max_y = 4
  140.         for i in 0..3
  141.           line = @now_text.split(/\n/)[3-i]
  142.           @max_y -= 1 if line == nil and @max_y <= 4-i
  143.           next if line == nil
  144.           cx = contents.text_size(line).width
  145.           @max_x = cx if cx > @max_x
  146.         end
  147.         self.width = @max_x + 48 + @face_indent
  148.         self.height = (@max_y - 1) * 32 + 64
  149.       else
  150.         @max_x = self.width - 32 - @face_indent
  151.       end
  152.       # ここで一旦ウィンドウ位置更新
  153.       reset_window
  154.       # \nameがあるか?
  155.       if name_window_set
  156.         # オフセット位置
  157.         off_x =  0
  158.         off_y =  0
  159.         # 枠だけウィンドウの作成(余白を 2 に設定)
  160.         space = 2
  161.         x = self.x + off_x - space / 2
  162.         y = self.y + off_y - space / 2
  163.         w = self.contents.text_size(name_text).width + 8 + space
  164.         h = 26 + space
  165.         @name_window_frame = Window_Frame.new(x, y, w, h)
  166.         @name_window_frame.z = self.z + 1
  167.         # 擬似的な空中文字描写ウィンドウを作成
  168.         x = self.x + off_x + 4
  169.         y = self.y + off_y
  170.         @name_window_text  = Air_Text.new(x, y, name_text)
  171.         @name_window_text.z = self.z + 2
  172.       end
  173.     end
  174.     # ウィンドウを更新
  175.     reset_window
  176.     # 選択肢の場合
  177.     if $game_temp.choice_max > 0
  178.       @item_max = $game_temp.choice_max
  179.       self.active = true
  180.       self.index = 0
  181.     end
  182.     # 数値入力の場合
  183.     if $game_temp.num_input_variable_id > 0
  184.       digits_max = $game_temp.num_input_digits_max
  185.       number = $game_variables[$game_temp.num_input_variable_id]
  186.       @input_number_window = Window_InputNumber.new(digits_max)
  187.       @input_number_window.number = number
  188.       @input_number_window.x = self.x + 8
  189.       @input_number_window.y = self.y + $game_temp.num_input_start * 32
  190.     end
  191.   end
  192.   #--------------------------------------------------------------------------
  193.   # ● フレーム更新
  194.   #--------------------------------------------------------------------------
  195.   def update
  196.     super
  197.     # フェードインの場合
  198.     if @fade_in
  199.       self.contents_opacity += 24
  200.       if @input_number_window != nil
  201.         @input_number_window.contents_opacity += 24
  202.       end
  203.       if self.contents_opacity == 255
  204.         @fade_in = false
  205.       end
  206.       return
  207.     end
  208.     @now_text = nil if @now_text == "" # 変換
  209.     # 表示待ちのメッセージがある場合
  210.     if @now_text != nil and @mid_stop == false
  211.       if @write_wait > 0
  212.         @write_wait -= 1
  213.         return
  214.       end
  215.       text_not_skip = DEFAULT_TYPING_ENABLE
  216.       while true
  217.         # 最大 x y の保存。
  218.         @max_x = @x if @max_x < @x
  219.         @max_y = @y if @max_y < @y
  220.         # c に 1 文字を取得 (文字が取得できなくなるまでループ)
  221.         if (c = @now_text.slice!(/./m)) != nil
  222.           # \\ の場合
  223.           if c == "\000"
  224.             # 本来の文字に戻す
  225.             c = "\\"
  226.           end
  227.           # \C[n] の場合
  228.           if c == "\001"
  229.             # 文字色を変更
  230.             @now_text.sub!(/\[([0-9]+)\]/, "")
  231.             color = $1.to_i
  232.             if color >= 0 and color <= 7
  233.               self.contents.font.color = text_color(color)
  234.             end
  235.             # 次の文字へ
  236.             c = ""
  237.           end
  238.           # \G の場合
  239.           if c == "\002"
  240.             # ゴールドウィンドウを作成
  241.             if @gold_window == nil and @popchar <= 0
  242.               @gold_window = Window_Gold.new
  243.               @gold_window.x = 560 - @gold_window.width
  244.               if $game_temp.in_battle
  245.                 @gold_window.y = 192
  246.               else
  247.                 @gold_window.y = self.y >= 128 ? 32 : 384
  248.               end
  249.               @gold_window.opacity = self.opacity
  250.               @gold_window.back_opacity = self.back_opacity
  251.             end
  252.             # 次の文字へ
  253.             c = ""
  254.           end
  255.           # \S[n] の場合
  256.           if c == "\003"
  257.             # 文字色を変更
  258.             @now_text.sub!(/\[([0-9]+)\]/, "")
  259.             speed = $1.to_i
  260.             if speed >= 0 and speed <= 19
  261.               @write_speed = speed
  262.             end
  263.             # 次の文字へ
  264.             c = ""
  265.           end
  266.           # \A[soundname] の場合
  267.           if c == "\004"
  268.             # 再生ファイルを変更するための準備
  269.             @now_text.sub!(/\[(.*?)\]/, "")
  270.             buftxt = $1.dup.to_s
  271.             # 再生ファイル名に"/"があるか?
  272.             if buftxt.match(/\//) == nil and buftxt != "" then
  273.               # なければ"Audio/SE/"を結合する
  274.               $soundname_on_speak = "Audio/SE/" + buftxt
  275.             else
  276.               # あればそのままコピー
  277.               $soundname_on_speak = buftxt.dup
  278.             end
  279.             # 次の文字へ
  280.             c = ""
  281.           elsif c == "\004"
  282.             # 次の文字へ
  283.             c = ""
  284.           end
  285.           # \. の場合
  286.           if c == "\005"
  287.             @write_wait += 5
  288.             c = ""
  289.           end
  290.           # \| の場合
  291.           if c == "\006"
  292.             @write_wait += 20
  293.             c = ""
  294.           end
  295.           # \> の場合
  296.           if c == "\016"
  297.             text_not_skip = false
  298.             c = ""
  299.           end
  300.           # \<の場合
  301.           if c == "\017"
  302.             text_not_skip = true
  303.             c = ""
  304.           end
  305.           # \!の場合
  306.           if c == "\020"
  307.             @mid_stop = true
  308.             c = ""
  309.           end
  310.           # \~の場合
  311.           if c == "\021"
  312.             terminate_message
  313.             return
  314.           end
  315.           # \Iの場合(追加部分)
  316.           if c == "\023"
  317.             # 今の@xをインデント位置に設定
  318.             @indent = @x
  319.             c = ""
  320.           end
  321.           # \Oの場合(追加部分)
  322.           if c == "\024"
  323.             @now_text.sub!(/\[([0-9]+)\]/, "")
  324.             @opacity = $1.to_i
  325.             c = ""
  326.           end
  327.           # \Hの場合(追加部分)
  328.           if c == "\025"
  329.             @now_text.sub!(/\[([0-9]+)\]/, "")
  330.             self.contents.font.size = [[$1.to_i, 6].max, 32].min
  331.             c = ""
  332.           end
  333.           # \Bの場合(追加部分)
  334.           if c == "\026"
  335.             @now_text.sub!(/\[([0-9]+)\]/, "")
  336.             @x += $1.to_i
  337.             c = ""
  338.           end
  339.           # \Rの場合(追加部分)
  340.           if c == "\027"
  341.             @now_text.sub!(/\[(.*?)\]/, "")
  342.             # 文字を描画
  343.             @x += ruby_draw_text(self.contents, @x, @y * line_height + (line_height - self.contents.font.size), $1, @opacity)
  344.             # 文字描写のSEを演奏
  345.             if $soundname_on_speak != ""
  346.               Audio.se_play($soundname_on_speak)
  347.             end
  348.             c = ""
  349.           end
  350.           # アイコン描画用シーケンスの場合(追加部分)
  351.           if c == "\030"
  352.             # アイコンファイル名を取得
  353.             @now_text.sub!(/\[(.*?)\]/, "")
  354.             # アイコンを描画
  355.             self.contents.blt(@x , @y * line_height + 8, RPG::Cache.icon($1), Rect.new(0, 0, 24, 24))
  356.             # 文字描写のSEを演奏
  357.             if $soundname_on_speak != ""
  358.               Audio.se_play($soundname_on_speak)
  359.             end
  360.             @x += 24
  361.             # 次の文字へ
  362.             c = ""
  363.           end
  364.           # 改行文字の場合
  365.           if c == "\n"
  366.             # 選択肢ならカーソルの幅を更新
  367.             if @lines >= $game_temp.choice_start
  368.               @cursor_width = [@cursor_width, @max_x - @face_indent].max
  369.             end
  370.             # y に 1 を加算
  371.             @lines += 1
  372.             @y += 1
  373.             @x = 0 + @indent + @face_indent
  374.             # 選択肢なら字下げを行う
  375.             if @lines >= $game_temp.choice_start
  376.               @x = 8 + @indent + @face_indent
  377.             end
  378.             # 次の文字へ
  379.             c = ""
  380.           end
  381.           # 外字表示の場合
  382.           if c == "\022"
  383.             # []部分の除去
  384.             @now_text.sub!(/\[([0-9]+)\]/, "")
  385.             # 外字を表示
  386.             @x += gaiji_draw(4 + @x, @y * line_height + (line_height - self.contents.font.size), $1.to_i)
  387.             # 次の文字へ
  388.             c = ""
  389.           end
  390.           if c != ""
  391.             # 文字を描画
  392.             @x += opacity_draw_text(self.contents, @x, @y * line_height + (line_height - self.contents.font.size), c, @opacity)
  393.             # 文字描写のSEを演奏
  394.             if $soundname_on_speak != "" then
  395.               Audio.se_play($soundname_on_speak)
  396.             end
  397.           end
  398.           # Bボタンが押された場合
  399.           if Input.press?(Input::B)
  400.             text_not_skip = false
  401.           end
  402.         else
  403.           text_not_skip = true
  404.           break
  405.         end
  406.         # 終了判定
  407.         if text_not_skip
  408.           break
  409.         end
  410.       end
  411.       @write_wait += @write_speed
  412.       return
  413.     end
  414.     # 数値入力中の場合
  415.     if @input_number_window != nil
  416.       @input_number_window.update
  417.       # 決定
  418.       if Input.trigger?(Input::C)
  419.         $game_system.se_play($data_system.decision_se)
  420.         $game_variables[$game_temp.num_input_variable_id] =
  421.           @input_number_window.number
  422.         $game_map.need_refresh = true
  423.         # 数値入力ウィンドウを解放
  424.         @input_number_window.dispose
  425.         @input_number_window = nil
  426.         terminate_message
  427.       end
  428.       return
  429.     end
  430.     # メッセージ表示中の場合
  431.     if @contents_showing
  432.       # 選択肢の表示中でなければポーズサインを表示
  433.       if $game_temp.choice_max == 0
  434.         self.pause = true
  435.       end
  436.       # キャンセル
  437.       if Input.trigger?(Input::B)
  438.         if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
  439.           $game_system.se_play($data_system.cancel_se)
  440.           $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
  441.           terminate_message
  442.         end
  443.       end
  444.       # 決定
  445.       if Input.trigger?(Input::C)
  446.         if $game_temp.choice_max > 0
  447.           $game_system.se_play($data_system.decision_se)
  448.           $game_temp.choice_proc.call(self.index)
  449.         end
  450.         if @mid_stop
  451.           @mid_stop = false
  452.           return
  453.         else
  454.           terminate_message
  455.         end
  456.       end
  457.       return
  458.     end
  459.     # フェードアウト中以外で表示待ちのメッセージか選択肢がある場合
  460.     if @fade_out == false and $game_temp.message_text != nil
  461.       @contents_showing = true
  462.       $game_temp.message_window_showing = true
  463.       refresh
  464.       Graphics.frame_reset
  465.       self.visible = true
  466.       self.contents_opacity = 0
  467.       if @input_number_window != nil
  468.         @input_number_window.contents_opacity = 0
  469.       end
  470.       @fade_in = true
  471.       return
  472.     end
  473.     # 表示すべきメッセージがないが、ウィンドウが可視状態の場合
  474.     if self.visible
  475.       @fade_out = true
  476.       self.opacity -= 48
  477.       if self.opacity == 0
  478.         self.visible = false
  479.         @fade_out = false
  480.         $game_temp.message_window_showing = false
  481.       end
  482.       return
  483.     end
  484.   end
  485.   #--------------------------------------------------------------------------
  486.   # ● キャラクターの取得
  487.   #     parameter : パラメータ
  488.   #--------------------------------------------------------------------------
  489.   def get_character(parameter)
  490.     # パラメータで分岐
  491.     case parameter
  492.     when 0  # プレイヤー
  493.       return $game_player
  494.     else  # 特定のイベント
  495.       events = $game_map.events
  496.       return events == nil ? nil : events[parameter]
  497.     end
  498.   end
  499.   #--------------------------------------------------------------------------
  500.   # ● ウィンドウの位置と不透明度の設定
  501.   #--------------------------------------------------------------------------
  502.   def reset_window
  503.     # 判定
  504.     if @popchar >= 0
  505.       events = $game_map.events
  506.       if events != nil
  507.         character = get_character(@popchar)
  508.         x = [[character.screen_x -  0 - self.width / 2, 4].max, 636 - self.width].min
  509.         y = [[character.screen_y - 48 - self.height, 4].max, 476 - self.height].min
  510.         self.x = x
  511.         self.y = y
  512.       end
  513.     elsif @popchar == -1
  514.       self.x = -4
  515.       self.y = -4
  516.       self.width = 648
  517.       self.height = 488
  518.     else
  519.       if $game_temp.in_battle
  520.         self.y = 16
  521.       else
  522.         case $game_system.message_position
  523.         when 0  # 上
  524.           self.y = 16
  525.         when 1  # 中
  526.           self.y = 160
  527.         when 2  # 下
  528.           self.y = 304
  529.         end
  530.         self.x = 80
  531.         if @face_file == nil
  532.           self.width = 480
  533.         else
  534.           self.width = 600
  535.           self.x -= 60
  536.         end
  537.         self.height = 160
  538.       end
  539.     end
  540.     self.contents = Bitmap.new(self.width - 32, self.height - 32)
  541.     if @face_file != nil
  542.       self.contents.blt(16, 16, RPG::Cache.picture(@face_file), Rect.new(0, 0, 96, 96))
  543.     end
  544.     if @popchar == -1
  545.       self.opacity = 255
  546.       self.back_opacity = 0
  547.     elsif $game_system.message_frame == 0
  548.       self.opacity = 255
  549.       self.back_opacity = 160
  550.     else
  551.       self.opacity = 0
  552.       self.back_opacity = 160
  553.     end
  554.   end
  555.   #--------------------------------------------------------------------------
  556.   # ● 外字描画
  557.   #--------------------------------------------------------------------------
  558.   # x   :x座標
  559.   # y   :y座標
  560.   # num  :外字番号
  561.   # 返り値:外字幅(@x増加値)
  562.   #--------------------------------------------------------------------------
  563.   def gaiji_draw(x, y, num)
  564.     # 外字データが存在しない場合は何もしない
  565.     if @gaiji_cache == nil
  566.       return 0
  567.     else
  568.       # 指定した外字がキャッシュ範囲を超えている場合は何もしない
  569.       if @gaiji_cache.width < num * 24
  570.         return 0
  571.       end

  572.       # 文字サイズを計算
  573.       if self.contents.font.size >= 20 and self.contents.font.size <= 24
  574.         size = 24
  575.       else
  576.         size = self.contents.font.size * 100 * 24 / 2200
  577.       end

  578.       # 外字データをstretch_bltで転送
  579.       self.contents.stretch_blt(Rect.new(x, y, size, size), @gaiji_cache, Rect.new(num * 24, 0, 24, 24))

  580.       # 文字描写のSEを演奏
  581.       if $soundname_on_speak != "" then
  582.         Audio.se_play($soundname_on_speak)
  583.       end

  584.       # 文字サイズを返す
  585.       return size
  586.     end
  587.   end
  588.   #--------------------------------------------------------------------------
  589.   # ● line_height
  590.   #--------------------------------------------------------------------------
  591.   # 返り値:行の高さ(@y増加値)を返します。
  592.   #--------------------------------------------------------------------------
  593.   def line_height
  594.     # 現状、選択肢等に対応ができない為、自動的に32を返します。
  595.     return 32

  596.     # 文字サイズを計算
  597.     if self.contents.font.size >= 20 and self.contents.font.size <= 24
  598.       return 32
  599.     else
  600.       return self.contents.font.size * 15 / 10
  601.     end
  602.   end
  603.   #--------------------------------------------------------------------------
  604.   # ● 透過文字描画
  605.   #--------------------------------------------------------------------------
  606.   # target :描画対象。Bitmapクラスを指定。
  607.   # x      :x座標
  608.   # y      :y座標
  609.   # str   :描画文字列
  610.   # opacity:透過率(0~255)
  611.   # 返り値 :文字幅(@x増加値)。
  612.   #--------------------------------------------------------------------------
  613.   def opacity_draw_text(target, x, y, str,opacity)
  614.     # heightとwidthを計算
  615.     height = target.font.size
  616.     width = target.text_size(str).width

  617.     # opacityに規定値以上の値が入っている場合は修正。
  618.     opacity = [[opacity, 0].max, 255].min

  619.     # opacityが255(透過なし)の場合は通常描画
  620.     if opacity == 255
  621.       target.draw_text(x, y, width, height, str)
  622.       return width
  623.     else
  624.       # 表示テキストのheight、widthがバッファサイズを上回る場合は
  625.       # バッファを再生成する。
  626.       if @opacity_text_buf.width < width or @opacity_text_buf.height < height
  627.         @opacity_text_buf.dispose
  628.         @opacity_text_buf = Bitmap.new(width, height)
  629.       # そうでない場合はバッファクリア。
  630.       else
  631.         @opacity_text_buf.clear
  632.       end
  633.       # バッファに現在の文字サイズを反映
  634.       @opacity_text_buf.font.size = target.font.size

  635.       # バッファにテキスト描画
  636.       @opacity_text_buf.draw_text(0, 0, width, height, str)

  637.       # バッファデータをtargetに転送
  638.       target.blt(x, y, @opacity_text_buf, Rect.new(0, 0, width, height), opacity)
  639.       # 文字サイズを返す
  640.       return width
  641.     end
  642.   end
  643.   #--------------------------------------------------------------------------
  644.   # ● ルビ文字描画
  645.   #--------------------------------------------------------------------------
  646.   # target :描画対象。Bitmapクラスを指定。
  647.   # x      :x座標
  648.   # y      :y座標
  649.   # str   :描画文字列。本文,ルビの形式で入力。
  650.   #      ,区切りが2つ以上あった場合は自動的に無視される。
  651.   # opacity:透過率(0~255)
  652.   # 返り値 :文字幅(@x増加値)。
  653.   #--------------------------------------------------------------------------
  654.   def ruby_draw_text(target, x, y, str,opacity)
  655.     # フォントサイズをバックアップしておく
  656.     sizeback = target.font.size
  657.     # ルビサイズの計算
  658.     target.font.size * 3 / 2 > 32 ? rubysize = 32 - target.font.size : rubysize = target.font.size / 2
  659.     rubysize = [rubysize, 6].max
  660.    
  661.     # opacityに規定値以上の値が入っている場合は修正。
  662.     opacity = [[opacity, 0].max, 255].min
  663.     # strをsplitで分割し、split_sに格納
  664.     split_s = str.split(/,/)

  665.     # split_sがnilの場合は""にしておく(誤動作防止)
  666.     split_s[0] == nil ? split_s[0] = "" : nil
  667.     split_s[1] == nil ? split_s[1] = "" : nil

  668.     # heightとwidthを計算
  669.     height = sizeback + rubysize
  670.     width  = target.text_size(split_s[0]).width

  671.     # バッファ用の幅計算(ルビの幅が本文の幅を越える可能性がある為)
  672.     target.font.size = rubysize
  673.     ruby_width = target.text_size(split_s[1]).width
  674.     target.font.size = sizeback

  675.     buf_width = [target.text_size(split_s[0]).width, ruby_width].max

  676.     # 本文の描画幅とルビの描画幅の差を1/2にして変数に格納(後で使用)
  677.     width - ruby_width != 0 ? sub_x = (width - ruby_width) / 2 : sub_x = 0

  678.     # opacityが255(透過なし)の場合は通常描画
  679.     if opacity == 255
  680.     # ルビの描画
  681.       target.font.size = rubysize
  682.       target.draw_text(x + sub_x, y - target.font.size, target.text_size(split_s[1]).width, target.font.size, split_s[1])
  683.       target.font.size = sizeback
  684.     # 本文の描画
  685.       target.draw_text(x, y, width, target.font.size, split_s[0])
  686.       return width
  687.     else
  688.       # 表示テキストのheight、widthがバッファサイズを上回る場合は
  689.       # バッファを再生成する。
  690.       if @opacity_text_buf.width < buf_width or @opacity_text_buf.height < height
  691.         @opacity_text_buf.dispose
  692.         @opacity_text_buf = Bitmap.new(buf_width, height)
  693.       # そうでない場合はバッファクリア。
  694.       else
  695.         @opacity_text_buf.clear
  696.       end
  697.       # バッファにテキスト描画
  698.       # ルビの描画
  699.       @opacity_text_buf.font.size = rubysize
  700.       @opacity_text_buf.draw_text(0 , 0, buf_width, rubysize, split_s[1], 1)
  701.       @opacity_text_buf.font.size = sizeback
  702.       # 本文の描画
  703.       @opacity_text_buf.draw_text(0 , rubysize, buf_width, sizeback, split_s[0], 1)
  704.       # ルビの幅が本文の幅を下回る場合
  705.       if sub_x >= 0
  706.         target.blt(x, y - rubysize, @opacity_text_buf, Rect.new(0, 0, buf_width, height), opacity)
  707.       # ルビの幅が本文の幅を上回る場合
  708.       else
  709.         target.blt(x + sub_x, y - rubysize, @opacity_text_buf, Rect.new(0, 0, buf_width, height), opacity)
  710.       end
  711.       # 文字サイズを返す
  712.       return width
  713.     end
  714.   end
  715.   #--------------------------------------------------------------------------
  716.   # ● \V変換
  717.   #--------------------------------------------------------------------------
  718.   # option :オプション。無指定又は規定外の場合はindexのユーザ変数値を返す。
  719.   # index  :インデックス
  720.   # 返り値 :変換結果(アイコン表示用シーケンス込み)
  721.   #--------------------------------------------------------------------------
  722.   def convart_value(option, index)
  723.     # optionがnilの場合は""に直す(誤動作防止)
  724.     option == nil ? option = "" : nil

  725.     # optionはdowncaseしておく。
  726.     option.downcase!

  727.     # \030はアイコン表示用のシーケンス。\030[アイコンファイル名]で定義。
  728.     case option
  729.     when "i"
  730.       unless $data_items[index].name == nil
  731.         r = sprintf("\030[%s]%s", $data_items[index].icon_name, $data_items[index].name)
  732.       end
  733.     when "w"
  734.       unless $data_weapons[index].name == nil
  735.         r = sprintf("\030[%s]%s", $data_weapons[index].icon_name, $data_weapons[index].name)
  736.       end
  737.     when "a"
  738.       unless $data_armors[index].name == nil
  739.         r = sprintf("\030[%s]%s", $data_armors[index].icon_name, $data_armors[index].name)
  740.       end
  741.     when "s"
  742.       unless $data_skills[index].name == nil
  743.         r = sprintf("\030[%s]%s", $data_skills[index].icon_name, $data_skills[index].name)
  744.       end
  745.     else
  746.       r = $game_variables[index]
  747.     end

  748.     r == nil ? r = "" : nil
  749.     return r
  750.   end
  751.   #--------------------------------------------------------------------------
  752.   # ● 解放
  753.   #--------------------------------------------------------------------------
  754.   def dispose
  755.     terminate_message

  756.     # 外字キャッシュ開放
  757.     if @gaiji_cache != nil
  758.       unless @gaiji_cache.disposed?
  759.         @gaiji_cache.dispose
  760.       end
  761.     end

  762.     # 文字透過転送用バッファ開放
  763.     unless @opacity_text_buf.disposed?
  764.       @opacity_text_buf.dispose
  765.     end

  766.     $game_temp.message_window_showing = false
  767.     if @input_number_window != nil
  768.       @input_number_window.dispose
  769.     end
  770.     super
  771.   end
  772.   #--------------------------------------------------------------------------
  773.   # ● カーソルの矩形更新
  774.   #--------------------------------------------------------------------------
  775.   def update_cursor_rect
  776.     if @index >= 0
  777.       n = $game_temp.choice_start + @index
  778.       self.cursor_rect.set(4 + @indent + @face_indent, n * 32 + 4, @cursor_width, 32)
  779.     else
  780.       self.cursor_rect.empty
  781.     end
  782.   end
  783. end
  784. #==============================================================================
  785. # ■ Window_Frame (枠だけで中身の無いウィンドウ)
  786. #==============================================================================
  787. class Window_Frame < Window_Base
  788.   #--------------------------------------------------------------------------
  789.   # ● オブジェクト初期化
  790.   #--------------------------------------------------------------------------
  791.   def initialize(x, y, width, height)
  792.     super(x, y, width, height)
  793.     self.contents = nil
  794.     self.back_opacity = 160
  795.   end
  796.   #--------------------------------------------------------------------------
  797.   # ● 解放
  798.   #--------------------------------------------------------------------------
  799.   def dispose
  800.     super
  801.   end
  802. end
  803. #==============================================================================
  804. # ■ Air_Text (何も無いところに文字描写 = 枠の無い瞬間表示メッセージウィンドウ)
  805. #==============================================================================
  806. class Air_Text < Window_Base
  807.   #--------------------------------------------------------------------------
  808.   # ● オブジェクト初期化
  809.   #--------------------------------------------------------------------------
  810.   def initialize(x, y, designate_text)
  811.     super(x-16, y-16, 32 + designate_text.size * 12, 56)
  812.     self.opacity      = 0
  813.     self.back_opacity = 0
  814.     self.contents = Bitmap.new(self.width - 32, self.height - 32)
  815.     w = self.contents.width
  816.     h = self.contents.height
  817.     self.contents.draw_text(0, 0, w, h, designate_text)
  818.   end
  819.   #--------------------------------------------------------------------------
  820.   # ● 解放
  821.   #--------------------------------------------------------------------------
  822.   def dispose
  823.     self.contents.clear
  824.     super
  825.   end
  826. end
复制代码
齒車之城版:
  1. # メッセージ制御文字追加~流々牙さん顔グラフィックバージョン~ Ver 1.04
  2. # 配布元・サポートURL
  3. # http://members.jcom.home.ne.jp/cogwheel/

  4. #==============================================================================
  5. # ■ Game_Player
  6. #------------------------------------------------------------------------------
  7. #  プレイヤーを扱うクラスです。イベントの起動判定や、マップのスクロールなどの
  8. # 機能を持っています。このクラスのインスタンスは $game_player で参照されます。
  9. #==============================================================================

  10. class Game_Player < Game_Character
  11.   #--------------------------------------------------------------------------
  12.   # ● 公開インスタンス変数
  13.   #--------------------------------------------------------------------------
  14.   attr_accessor :message_speed            # メッセージ速度
  15.   attr_accessor :message_history          # メッセージ履歴
  16.   attr_accessor :history_size             # メッセージ履歴サイズ
  17.   #--------------------------------------------------------------------------
  18.   # ● オブジェクト初期化
  19.   #--------------------------------------------------------------------------
  20.   def initialize
  21.     super
  22.     @message_speed = 1
  23.     @message_history = []
  24.     @history_size = 100
  25.   end
  26. end

  27. #==============================================================================
  28. # ■ Window_Message
  29. #------------------------------------------------------------------------------
  30. #  文章表示に使うメッセージウィンドウです。
  31. #==============================================================================

  32. class Window_Message < Window_Selectable
  33.   #--------------------------------------------------------------------------
  34.   # ● 定数
  35.   #--------------------------------------------------------------------------
  36.   FADE = true                 # 顔グラのフェードイン表示
  37.   ENTER = true                # エンターキー押下時のメッセージ一括表示可否
  38.   SHIFT = 1                   # シフトスキップの可否
  39.                               # (0:不可, 1:デバッグ中のみ可, 2:常に可)
  40.   #--------------------------------------------------------------------------
  41.   # ● 顔グラフィック表示
  42.   #--------------------------------------------------------------------------
  43.   def actor(name1, name2, write = true)
  44.     if name1 > 0
  45.       name = RPG::Face.seek($game_actors[name1].character_name)
  46.     else
  47.       case name1.abs
  48.       when 1
  49.         name = "n1"
  50.       when 2
  51.         name = "n2"
  52.       end
  53.     end
  54.     if name2 > 1
  55.       name += "_" + name2.to_s
  56.     end
  57.     if write
  58.       @face.bitmap = RPG::Cache.face(name)
  59.       @face.x = self.x + 16
  60.       @face.y = self.y + self.height / 2
  61.       @face.z = self.z + 1
  62.       @face.oy = 50
  63.     end
  64.     @fi = 100
  65.     # 最初の行を字下げ
  66.     @x = @fi + @i if @x <= @fi
  67.   end
  68.   #--------------------------------------------------------------------------
  69.   # ● オブジェクト初期化
  70.   #--------------------------------------------------------------------------
  71.   def initialize
  72.     super(80, 304, 480, 160)
  73.     self.contents = Bitmap.new(width - 32, height - 32)
  74.     self.visible = false
  75.     self.z = 9998
  76.     # 顔グラフィックの作成
  77.     @face = Sprite.new(self.viewport)
  78.     @face.bitmap = Bitmap.new(10, 10)
  79.     @face.visible = false
  80.     @text = ""
  81.     @fade_in = false
  82.     @fade_out = false
  83.     @contents_showing = false
  84.     @contents_showed = false
  85.     @cursor_width = 0
  86.     self.active = false
  87.     self.index = -1
  88.     # 履歴ウィンドウの作成
  89.     @h_window = Window.new(self.viewport)
  90.     @h_window.x = 77
  91.     @h_window.y = 64
  92.     @h_window.z = 10001
  93.     @h_window.width = 486
  94.     @h_window.height = 352
  95.     @h_window.opacity = 0
  96.     @h_window.back_opacity = 160
  97.     @h_window.windowskin = RPG::Cache.windowskin($game_system.windowskin_name)
  98.     @h_window.active = false
  99.     @h_window.visible = false
  100.     @c_h = 0
  101.     # メッセージスピードの初期化
  102.     unless $game_player.message_speed.is_a?(Numeric)
  103.       $game_player.message_speed = 1
  104.     end
  105.   end
  106.   #--------------------------------------------------------------------------
  107.   # ● 解放
  108.   #--------------------------------------------------------------------------
  109.   def dispose
  110.     terminate_message
  111.     $game_temp.message_window_showing = false
  112.     @face.dispose
  113.     if @input_number_window != nil
  114.       @input_number_window.dispose
  115.     end
  116.     @h_window.dispose
  117.     super
  118.   end
  119.   #--------------------------------------------------------------------------
  120.   # ● メッセージ終了処理
  121.   #--------------------------------------------------------------------------
  122.   def terminate_message
  123.     self.active = false
  124.     self.pause = false
  125.     self.index = -1
  126.     self.contents.clear
  127.     # 表示中フラグをクリア
  128.     @contents_showing = false
  129.     @contents_showed = false
  130.     # メッセージ コールバックを呼ぶ
  131.     if $game_temp.message_proc != nil
  132.       $game_temp.message_proc.call
  133.     end
  134.     # 文章、選択肢、数値入力に関する変数をクリア
  135.     $game_temp.message_text = nil
  136.     $game_temp.message_proc = nil
  137.     $game_temp.choice_start = 99
  138.     $game_temp.choice_max = 0
  139.     $game_temp.choice_cancel_type = 0
  140.     $game_temp.choice_proc = nil
  141.     $game_temp.num_input_start = 99
  142.     $game_temp.num_input_variable_id = 0
  143.     $game_temp.num_input_digits_max = 0
  144.     # ゴールドウィンドウを開放
  145.     if @gold_window != nil
  146.       @gold_window.dispose
  147.       @gold_window = nil
  148.     end
  149.   end
  150.   #--------------------------------------------------------------------------
  151.   # ● テキスト初期化設定
  152.   #--------------------------------------------------------------------------
  153.   def text_initialize
  154.     # メッセージウィンドウ初期化設定
  155.     @text = $game_temp.message_text
  156.     @back_up = @text.clone
  157.     @rubi = ""
  158.     @speed = $game_player.message_speed
  159.     font_size = 22
  160.     @wait = 0
  161.     @push_enter = false
  162.     @contents_close = false
  163.     @cursor_width = 0
  164.     # 制御文字処理
  165.     begin
  166.       last_text = @text.clone
  167.       @text.gsub!(/\\[Vv]\[(\d+)\]/) { $game_variables[$1.to_i] }
  168.     end until @text == last_text
  169.     @text.gsub!(/\\[Nn]\[(\d+)\]/) do
  170.       $game_actors[$1.to_i] != nil ? $game_actors[$1.to_i].name : ""
  171.     end
  172.     # 便宜上、"\\\\" を "\000" に変換
  173.     @text.gsub!(/\\\\/) { "\000" }
  174.     # "\\C" を "\001" に、"\\G" を "\002" に変換
  175.     @text.gsub!(/\\[Cc]\[(\d+)\]/) { "\001[#{$1}]" }
  176.     @text.gsub!(/\\[Gg]/) { "\002" }
  177.     # 制御文字をそれぞれバックスラッシュ記法に変換
  178.     @text.gsub!(/\\[Ss]\[(\d+)\]/) { "\003[#{$1}]" }
  179.     @text.gsub!(/\\\./) { "\004" }
  180.     @text.gsub!(/\\\;/) { "\005" }
  181.     @text.gsub!(/\\\|/) { "\006" }
  182.     @text.gsub!(/\\\!/) { "\010" }
  183.     @text.gsub!(/\\\>/) { "\016" }
  184.     @text.gsub!(/\\\</) { "\017" }
  185.     @text.gsub!(/\\\^/) { "\020" }
  186.     @text.gsub!(/\\[Ii]/) { "\021" }
  187.     @text.gsub!(/\\[Ll][Tt]/) { "\022" }
  188.     @text.gsub!(/\\[Cc][Tt]/) { "\023" }
  189.     @text.gsub!(/\\[Rr][Tt]/) { "\024" }
  190.     @text.gsub!(/\\[Ff]\[(\d+)\]/) { "\025[#{$1}]" }
  191.     @text.gsub!(/\\[Aa]\[(\-*\d+),?(\d*?)\]/) { "\026[#{$1},0#{$2}]" }
  192.     @text.gsub!(/\\[Rr]\[(.+?),(.+?)\]/) { "\027[#{$1},#{$2}]" }
  193.     @text.gsub!(/\\[Oo]\[(.+?)\]/) { "\030[#{$1}]" }
  194.     @text.gsub!(/\<[Bb]\>/) { "\031" }
  195.     @text.gsub!(/\<\/[Bb]\>/) { "\033" }
  196.     @text.gsub!(/\<[Ii]\>/) { "\034" }
  197.     @text.gsub!(/\<\/[Ii]\>/) { "\035" }
  198.     @text.gsub!(/\\[Ss][Tt]/) { "" }
  199.     @text.gsub!(/\\[Nn]/) { "\n" }
  200.     @text.gsub!(/\\[Pp](.*?)\n/) { $1 }
  201.     @x = @i = 4
  202.     @fi = @y = @py = 0
  203.     # 最初の行がルビ付きの場合、字下げを行う
  204.     @text = "\n" if @text == ""
  205.     text = @text[/^.*?\n/]
  206.     r_height = 0
  207.     while ((c = text.slice!(/./m)) != nil)
  208.       # \F[n] の場合、フォントサイズの変更
  209.       if c == "\025"
  210.         text.sub!(/\[([0-9]+)\]/, "")
  211.         font_size = $1.to_i
  212.         next
  213.       end
  214.       # ルビが存在した場合
  215.       if c == "\027"
  216.         text.sub!(/\[(.+?),(.+?)\]/, "")
  217.         # ルビのテキストサイズを格納
  218.         r_height = [r_height, font_size].max
  219.         next
  220.       end
  221.     end
  222.     # 字下げの設定
  223.     @py = [(r_height + [(r_height + 66) / 8, r_height * 2 / 3].min - 5) -
  224.       max_height(@text), 0].max
  225.     # 選択肢なら字下げを行う
  226.     if $game_temp.choice_start == 0
  227.       @x = 12
  228.     end
  229.     # "\\E[n]" がある場合、イベントnに吹き出し表示
  230.     unless self.contents.disposed?
  231.       self.contents.dispose
  232.     end
  233.     # 吹き出し表示の場合
  234.     if @text.gsub!(/\\[Ee]\[(\-*?\d+),?(\d*?)\]/) { "" }
  235.       # メッセージの幅、高さの読み込み
  236.       @event = $game_system.map_interpreter.get_character($1.to_i)
  237.       self.contents = Bitmap.new(10, 10)
  238.       self.contents.font.size = font_size
  239.       self.width = text_width(@text) + 32
  240.       self.height = [text_height(@text) + 32 + @py, 32].max
  241.       # 数値入力の場合、高さと幅の調整
  242.       if $game_temp.num_input_variable_id > 0
  243.         dummy_bitmap = Bitmap.new(32, 32)
  244.         i_width = dummy_bitmap.text_size("0").width + 8
  245.         dummy_bitmap.dispose
  246.         self.width=[self.width,i_width*$game_temp.num_input_digits_max+48].max
  247.         self.height += 32
  248.         # 高さが数値分しかない場合、数値入力を繰り上げる
  249.         $game_temp.num_input_start -= 1 if self.height == 64
  250.       end
  251.       @w_pos = $2.to_i
  252.       window_position
  253.       self.contents.dispose
  254.     else
  255.       @event = nil
  256.       self.x = 80
  257.       if $game_temp.in_battle
  258.         self.y = 16
  259.       else
  260.         case $game_system.message_position
  261.         when 0  # 上
  262.           self.y = 16
  263.         when 1  # 中
  264.           self.y = 160
  265.         when 2  # 下
  266.           self.y = 304
  267.         end
  268.       end
  269.       self.width = 480
  270.       self.height = 160
  271.     end
  272.     # ウィンドウ内容の初期化
  273.     self.contents = Bitmap.new(width - 32, height - 32)
  274.     self.contents.font.size = font_size
  275.     self.contents.font.color = normal_color
  276.     self.contents.font.bold = false
  277.     self.contents.font.italic = false
  278.     # メッセージ履歴に文章を挿入
  279.     history_write(@text.clone)
  280.     # 第一行目のフォントサイズが基準フォントサイズと異なる場合の体裁を整える
  281.     @h = @c_h = max_height(@text) - self.contents.font.size
  282.     @c_w = 0
  283.   end
  284.   #--------------------------------------------------------------------------
  285.   # ● 吹き出し表示:ウィンドウ位置設定
  286.   #--------------------------------------------------------------------------
  287.   def window_position
  288.     m_x = (@event.real_x - $game_map.display_x) / 4 - self.width / 2 + 16
  289.     m_y = (@event.real_y - $game_map.display_y) / 4
  290.     if @w_pos == 0
  291.       m_y -= self.height + 32
  292.     else
  293.       m_y += 48
  294.     end
  295.     self.x =[[m_x, 0].max, 640 - self.width].min
  296.     self.y = [[m_y, 0].max, 480 - self.height].min
  297.     if @input_number_window != nil
  298.       @input_number_window.x = self.x + 8
  299.       @input_number_window.y = self.y + 32 + @h + @py
  300.     end
  301.   end
  302.   #--------------------------------------------------------------------------
  303.   # ● リフレッシュ
  304.   #--------------------------------------------------------------------------
  305.   def refresh
  306.     # 表示待ちのメッセージがある場合
  307.     if @text != nil
  308.       # c に 1 文字を取得 (文字が取得できなくなるまでループ)
  309.       while ((c = @text.slice!(/./m)) != nil)
  310.         next unless control(c)
  311.         if @push_enter
  312.           @contents_showed = true
  313.           break
  314.         end
  315.         # 文字を描画
  316.         size = self.contents.font.size
  317.         self.contents.draw_text(@x, @h + @py, 10 + size, 10 + size, c)
  318.         # x に描画した文字の幅を加算
  319.         @x += self.contents.text_size(c).width
  320.         rubi_draw if @rubi != ""
  321.         if @speed > 0 and @contents_showed == false and
  322.             not (ENTER and Input.trigger?(Input::C)) and
  323.             not (SHIFT >= ($DEBUG ? 0 : 1) and Input.press?(Input::SHIFT))
  324.           @wait += @speed if @wait <= 0
  325.           break if @wait > 0
  326.         end
  327.       end
  328.       if @text == ""
  329.         text_end
  330.       end
  331.     end
  332.   end
  333.   #--------------------------------------------------------------------------
  334.   # ● テキスト描画終了時
  335.   #--------------------------------------------------------------------------
  336.   def text_end
  337.     @contents_showed = true
  338.     # 選択肢の場合
  339.     if $game_temp.choice_max > 0
  340.       @item_max = $game_temp.choice_max
  341.       self.active = true
  342.       self.index = 0
  343.       @c_h = @h
  344.     end
  345.     # 数値入力の場合
  346.     if $game_temp.num_input_variable_id > 0
  347.       digits_max = $game_temp.num_input_digits_max
  348.       number = $game_variables[$game_temp.num_input_variable_id]
  349.       @input_number_window = Window_InputNumber.new(digits_max)
  350.       @input_number_window.number = number
  351.       @input_number_window.x = self.x + 8
  352.       @input_number_window.y = self.y + 32 + @h + @py
  353.     end
  354.   end
  355.   #--------------------------------------------------------------------------
  356.   # ● 制御文字処理
  357.   #--------------------------------------------------------------------------
  358.   def control(c)
  359.     # \\ の場合
  360.     if c == "\000"
  361.       # 本来の文字に戻す
  362.       c = "\\"
  363.       return true
  364.     end
  365.     # \C[n] の場合
  366.     if c == "\001"
  367.       c_change
  368.       return false
  369.     end
  370.     # \G の場合
  371.     if c == "\002"
  372.       gold
  373.       return false
  374.     end
  375.     # \S[n] の場合
  376.     if c == "\003"
  377.       @text.sub!(/\[(\d+)\]/, "")
  378.       @speed = $game_player.message_speed * $1.to_i
  379.       return false
  380.     end
  381.     # \. の場合
  382.     if c == "\004"
  383.       @wait = 10
  384.       c.sub!("\004", "")
  385.       return true
  386.     end
  387.     # \: の場合
  388.     if c == "\005"
  389.       @wait = 20
  390.       c.sub!("\005", "")
  391.       return true
  392.     end
  393.     # \| の場合
  394.     if c == "\006"
  395.       @wait = 40
  396.       c.sub!("\006", "")
  397.       return true
  398.     end
  399.     # \! の場合
  400.     if c == "\010"
  401.       self.pause = true
  402.       @push_enter = true
  403.       @contents_showed = true
  404.       c.sub!("\010", "")
  405.       return true
  406.     end
  407.     # \> の場合
  408.     if c == "\016"
  409.       @temp_speed = @speed
  410.       @speed = 0
  411.       return false
  412.     end
  413.     # \< の場合
  414.     if c == "\017"
  415.       @speed = @temp_speed
  416.       c.sub!("\017", "")
  417.       return true
  418.     end
  419.     # \^ の場合
  420.     if c == "\020"
  421.       @contents_close = true
  422.       return false
  423.     end
  424.     # \I の場合
  425.     if c == "\021"
  426.       @i = @x - @fi
  427.       if @y >= $game_temp.choice_start
  428.         @i = @x - @fi - 8
  429.       end
  430.       return false
  431.     end
  432.     # \LT の場合
  433.     if c == "\022"
  434.       @i = @x = @fi + 4
  435.       return false
  436.     end
  437.     # \CT の場合
  438.     if c == "\023"
  439.       @text[(/(.+?)\n/)]
  440.       width = max_width($1)[0]
  441.       @x = (@fi + self.contents.width - width) / 2
  442.       return false
  443.     end
  444.     # \RT の場合
  445.     if c == "\024"
  446.       @text[(/(.+?)\n/)]
  447.       width = max_width($1)[0]
  448.       @x = self.contents.width - width - 4
  449.       return false
  450.     end
  451.     # \F[n] の場合
  452.     if c == "\025"
  453.       s_change
  454.       return false
  455.     end
  456.     # \A[n,m] の場合
  457.     if c == "\026"
  458.       @text.sub!(/\[(\-*\d+),(\d+)\]/, "")
  459.       actor($1.to_i, $2.to_i)
  460.       return false
  461.     end
  462.     # \R[n,m] の場合
  463.     if c == "\027"
  464.       @text.sub!(/\[(.+?),(.+?)\]/) { rubi_set($1, $2) }
  465.       return false
  466.     end
  467.     # \O[i] の場合
  468.     if c == "\030"
  469.       @text.sub!(/\[(.+?)\]/, "")
  470.       letter($1.to_i)
  471.       return false
  472.     end
  473.     # <B> の場合
  474.     if c == "\031"
  475.       self.contents.font.bold = true
  476.       return false
  477.     end
  478.     # </B> の場合
  479.     if c == "\033"
  480.       self.contents.font.bold = false
  481.       return false
  482.     end
  483.     # <I> の場合
  484.     if c == "\034"
  485.       self.contents.font.italic = true
  486.       return false
  487.     end
  488.     # </I> の場合
  489.     if c == "\035"
  490.       self.contents.font.italic = false
  491.       return false
  492.     end
  493.     # 改行文字の場合
  494.     if c == "\n"
  495.       new_line
  496.       return false
  497.     end
  498.     return true
  499.   end
  500.   #--------------------------------------------------------------------------
  501.   # ● ルビ描画
  502.   #--------------------------------------------------------------------------
  503.   def rubi_draw
  504.     # フォントサイズのバックアップ
  505.     f_size = self.contents.font.size
  506.     # ルビサイズの設定
  507.     size = [(f_size + 66) / 8, f_size * 2 / 3].min
  508.     if @h_window.active
  509.       @h_window.contents.font.size = size
  510.     else
  511.       self.contents.font.size = size
  512.     end
  513.     # ルビのテキスト長 / メインテキストのテキスト長の算出
  514.     num = @rubi_s / @main_s.to_f
  515.     # 一回の描画でどれだけルビを振るか計算
  516.     cnt = num.ceil - (num.ceil - num).round
  517.     # 描画回数分だけルビの描画
  518.     for i in 1..cnt
  519.       c = @rubi.slice!(/./m)
  520.       # 履歴表示中の場合、履歴ウィンドウにルビを描画
  521.       if @h_window.active
  522.         @h_window.contents.draw_text(@rubi_x - 5 - size / 2,
  523.           @h + @py - size + 3, 10 + size, 6 + size, c, 1)
  524.       # メッセージウィンドウにルビを描画
  525.       else
  526.         self.contents.draw_text(@rubi_x - 5 - size / 2,
  527.           @h + @py - size + 3, 10 + size, 6 + size, c, 1)
  528.       end
  529.       @rubi_x += @rubi_w
  530.       @rubi_s -= 1
  531.     end
  532.     @main_s -= 1
  533.     self.contents.font.size = f_size
  534.   end
  535.   #--------------------------------------------------------------------------
  536.   # ● ルビ設定
  537.   #--------------------------------------------------------------------------
  538.   def rubi_set(main, rubi)
  539.     text = main.clone
  540.     @rubi = rubi.clone
  541.     @main_s = 0
  542.     @rubi_s = 0
  543.     while(main.slice!(/./m) != nil)
  544.       @main_s += 1
  545.     end
  546.     while(rubi.slice!(/./m) != nil)
  547.       @rubi_s += 1
  548.     end
  549.     f_size = self.contents.font.size
  550.     main_w = self.contents.text_size(text).width
  551.     self.contents.font.size = [(f_size + 66) / 8, f_size * 2 / 3].min
  552.     rubi_w = self.contents.text_size(@rubi).width
  553.     if main_w >= rubi_w or @rubi_s == 1
  554.       @rubi_x = @x + main_w.to_f / (@rubi_s * 2)
  555.       @rubi_w = main_w.to_f / @rubi_s
  556.     else
  557.       @rubi_x = @x - (rubi_w - main_w - self.contents.font.size) / 2
  558.       @rubi_w = rubi_w.to_f / @rubi_s
  559.     end
  560.     self.contents.font.size = f_size
  561.     return text
  562.   end
  563.   #--------------------------------------------------------------------------
  564.   # ● 外字の表示
  565.   #--------------------------------------------------------------------------
  566.   def letter(i)
  567.     pict = RPG::Cache.windowskin("Letter_" + (i / 16).to_s)
  568.     p_width = pict.width / 4
  569.     p_height = pict.height / 4
  570.     p_x = i % 4
  571.     p_y = (i % 16) / 4
  572.     rect = Rect.new(p_x * p_width, p_y * p_height, p_width, p_height)
  573.     if @h_window.active
  574.       @h_window.contents.blt(@x,
  575.         @h + @py + self.contents.font.size - p_height + 5, pict, rect)
  576.     else
  577.       self.contents.blt(@x,
  578.         @h + @py + self.contents.font.size - p_height + 5, pict, rect)
  579.     end
  580.     @x += p_width
  581.   end
  582.   #--------------------------------------------------------------------------
  583.   # ● 文字色変更
  584.   #--------------------------------------------------------------------------
  585.   def c_change
  586.     # 文字色を変更
  587.     @text.sub!(/\[(\d+)\]/, "")
  588.     color = $1.to_i
  589.     if color >= 0 and color <= 7
  590.       if @h_window.active
  591.         @h_window.contents.font.color = text_color(color)
  592.       else
  593.         self.contents.font.color = text_color(color)
  594.       end
  595.     end
  596.   end
  597.   #--------------------------------------------------------------------------
  598.   # ● 所持金表示
  599.   #--------------------------------------------------------------------------
  600.   def gold
  601.     # ゴールドウィンドウを作成
  602.     if @gold_window == nil
  603.       @gold_window = Window_Gold.new
  604.       @gold_window.x = 560 - @gold_window.width
  605.       if $game_temp.in_battle
  606.         @gold_window.y = 192
  607.       else
  608.         @gold_window.y = self.y >= 128 ? 32 : 384
  609.       end
  610.       @gold_window.opacity = self.opacity
  611.       @gold_window.back_opacity = self.back_opacity
  612.     end
  613.   end
  614.   #--------------------------------------------------------------------------
  615.   # ● 文字サイズ変更
  616.   #--------------------------------------------------------------------------
  617.   def s_change
  618.     # 文字色を変更
  619.     @text.sub!(/\[([0-9]+)\]/, "")
  620.     @h += self.contents.font.size - $1.to_i
  621.     self.contents.font.size = $1.to_i
  622.   end
  623.   #--------------------------------------------------------------------------
  624.   # ● 行のテキスト幅の取得
  625.   #--------------------------------------------------------------------------
  626.   def max_width(text)
  627.     # 不要な制御文字の削除
  628.     text.gsub!(/\001\[\d+\]/) { "" }
  629.     text.gsub!(/\002/) { "" }
  630.     text.gsub!(/\003\[\d+\]/) { "" }
  631.     text.gsub!(/\004/) { "" }
  632.     text.gsub!(/\005/) { "" }
  633.     text.gsub!(/\006/) { "" }
  634.     text.gsub!(/\010/) { "" }
  635.     text.gsub!(/\016/) { "" }
  636.     text.gsub!(/\017/) { "" }
  637.     text.gsub!(/\020/) { "" }
  638.     text.gsub!(/\022/) { "" }
  639.     text.gsub!(/\023/) { "" }
  640.     text.gsub!(/\024/) { "" }
  641.     text.gsub!(/\026\[\-*\d+,\d+\]/) { "" }
  642.     text.gsub!(/\027\[(.+?),(.+?)\]/) { $1 }
  643.     # 現在のウィンドウ情報を取得
  644.     size = self.contents.font.size
  645.     bold = self.contents.font.bold
  646.     italic = self.contents.font.italic
  647.     width = 0
  648.     i = @i
  649.     while ((c = text.slice!(/./m)) != nil)
  650.       # テキストが \I の場合インデントの設定
  651.       if c == "\021"
  652.         i = width
  653.         if @y >= $game_temp.choice_start
  654.           i = width - 8
  655.         end
  656.         next
  657.       end
  658.       # \F[n] の場合、フォントサイズの変更
  659.       if c == "\025"
  660.         text.sub!(/\[([0-9]+)\]/, "")
  661.         self.contents.font.size = $1.to_i
  662.         next
  663.       end
  664.       # テキストが\O[i] の場合、外字分だけ幅を増やす
  665.       if c == "\030"
  666.         text.sub!(/\[(.+?)\]/, "")
  667.         width += RPG::Cache.windowskin("Letter_"+($1.to_i/16).to_s).width / 4
  668.         next
  669.       end
  670.       # <B> の場合
  671.       if c == "\031"
  672.         self.contents.font.bold = true
  673.         next
  674.       end
  675.       # </B> の場合
  676.       if c == "\033"
  677.         self.contents.font.bold = false
  678.         next
  679.       end
  680.       # <I> の場合
  681.       if c == "\034"
  682.         self.contents.font.italic = true
  683.         next
  684.       end
  685.       # </I> の場合
  686.       if c == "\035"
  687.         self.contents.font.italic = false
  688.         next
  689.       end
  690.       width += self.contents.text_size(c).width
  691.     end
  692.     # 行終了時のウィンドウ情報の格納
  693.     e_size = self.contents.font.size
  694.     e_bold = self.contents.font.bold
  695.     e_italic = self.contents.font.italic
  696.     # ウィンドウ情報を元に戻す
  697.     self.contents.font.size = size
  698.     self.contents.font.bold = bold
  699.     self.contents.font.italic = italic
  700.     return [width, i, e_size, e_bold, e_italic]
  701.   end
  702.   #--------------------------------------------------------------------------
  703.   # ● 文章全体の幅の取得
  704.   #--------------------------------------------------------------------------
  705.   def text_width(sentence)
  706.     # 現在のウィンドウ情報を取得
  707.     size = self.contents.font.size
  708.     bold = self.contents.font.bold
  709.     italic = self.contents.font.italic
  710.     i = @i
  711.     x = @x
  712.     # 文章幅の取得開始
  713.     text = sentence.clone
  714.     width = 0
  715.     # \A[n,m] の場合
  716.     if text[/\026/]
  717.       text.sub!(/\026\[(\-*\d+),(\d+)\]/, "")
  718.       actor($1.to_i, $2.to_i, false)
  719.       width = @x
  720.     end
  721.     cnt = 0
  722.     while text != ""
  723.       t_width = max_width(text[/^.*?\n/])
  724.       # 選択肢だった場合は幅に32加算する
  725.       t_width[0] += 20 if cnt >= $game_temp.choice_start
  726.       width = [width, @i + t_width[0]].max
  727.       # ウィンドウ情報を更新して次の行へ
  728.       @i = t_width[1]
  729.       self.contents.font.size = t_width[2]
  730.       self.contents.font.bold = t_width[3]
  731.       self.contents.font.italic = t_width[4]
  732.       text.sub!(/^.*?\n/) {""}
  733.       cnt += 1
  734.     end
  735.     # ウィンドウ情報を元に戻す
  736.     self.contents.font.size = size
  737.     self.contents.font.bold = bold
  738.     self.contents.font.italic = italic
  739.     @i = i
  740.     @x = x
  741.     return width + @fi + 4
  742.   end
  743.   #--------------------------------------------------------------------------
  744.   # ● 行の最大テキスト高さを求める
  745.   #--------------------------------------------------------------------------
  746.   def max_height(sentence)
  747.     text = sentence[/(.+?)\n/]
  748.     t_size = 0
  749.     # テキストが空になるまで繰り返し
  750.     while text != "" and text != nil
  751.       c = text.slice!(/./m)
  752.       # テキストが \C[n] か \S[n] の場合次のテキストへ
  753.       if c == "\001" or c == "\003"
  754.         text.sub!(/\[([0-9]+)\]/, "")
  755.         next
  756.       end
  757.       # アクターグラフィックの場合次のテキストへ
  758.       if c == "\026"
  759.         text.sub!(/\[(\-*\d+),(\d+)\]/, "")
  760.         next
  761.       end
  762.       # テキストが\O[i] の場合
  763.       if c == "\030"
  764.         text.sub!(/\[(.+?)\]/, "")
  765.         p_height = RPG::Cache.windowskin("Letter_"+($1.to_i/16).to_s).height/4
  766.         l_height = [((p_height + 1) * 8 - 66) / 9, (p_height + 1) * 3 / 5].max
  767.         t_size = [t_size, l_height].max
  768.         next
  769.       end
  770.       # テキストが \F[n] の場合、最大テキスト高さに n を代入
  771.       if c == "\025"
  772.         text.sub!(/\[([0-9]+)\]/, "")
  773.         t_size = [t_size, $1.to_i].max
  774.       end
  775.       # 最大テキスト高さが0の場合、現在のフォントサイズを代入
  776.       t_size = self.contents.font.size if t_size == 0
  777.     end
  778.     return t_size
  779.   end
  780.   #--------------------------------------------------------------------------
  781.   # ● 文章全体の高さを求める
  782.   #--------------------------------------------------------------------------
  783.   def text_height(sentence)
  784.     # 高さ・ルビ分の高さを初期化
  785.     h = 0
  786.     size = self.contents.font.size
  787.     text = sentence.clone
  788.     if text[/^.*?\n/][/\027/]
  789.       py = [(max_height(text) + 66) / 8, max_height(text) * 2 / 3].min - 5
  790.     else
  791.       py = 0
  792.     end
  793.     # 文章の総合高さを計算
  794.     while text != ""
  795.       # 現在の行の高さを計算
  796.       height = max_height(text)
  797.       # 総高さに現在の行の高さを加算
  798.       h += height + [(height + 66) / 8, height * 2 / 3].min - 1
  799.       # \F[n] の場合、フォントサイズの変更
  800.       if text[/^.*?\n/][/.*\025\[(\d+)\]/]
  801.         self.contents.font.size = $1.to_i
  802.       end
  803.       # 次の行へ
  804.       text.sub!(/^.*?\n/) {""}
  805.     end
  806.     # 顔グラフィックがある場合
  807.     if sentence[/\026/]
  808.       h = [h, 100].max
  809.     end
  810.     self.contents.font.size = size
  811.     # 文章全体の高さを返す
  812.     return h
  813.   end
  814.   #--------------------------------------------------------------------------
  815.   # ● 改行
  816.   #--------------------------------------------------------------------------
  817.   def new_line
  818.     # 選択肢ならカーソルの幅を更新
  819.     if @h_window.active == false and @y >= $game_temp.choice_start
  820.       @cursor_width = [@cursor_width, @x].max
  821.     end
  822.     # y に 1 を加算
  823.     @y += 1
  824.     # 次の行の最大テキスト高さ + ルビ分の字下げ
  825.     height = max_height(@text)
  826.     @h += height + [(height + 66) / 8, height * 2 / 3].min - 1
  827.     @x = @fi + @i
  828.     # 選択肢なら字下げを行う
  829.     if @h_window.active == false and @y >= $game_temp.choice_start
  830.       @x = 8 + @fi + @i
  831.       # ルビ付きの場合、字下げを行う
  832.       text = @text[/^.*?\n/]
  833.       font_size = self.contents.font.size
  834.       r_height = 0
  835.       while text != "" and text != nil
  836.         c = text.slice!(/./m)
  837.         # \F[n] の場合、フォントサイズの変更
  838.         if c == "\025"
  839.           text.sub!(/\[([0-9]+)\]/, "")
  840.           font_size = $1.to_i
  841.           next
  842.         end
  843.         # ルビが存在した場合
  844.         if c == "\027"
  845.           text.sub!(/\[(.+?),(.+?)\]/, "")
  846.           # ルビのテキストサイズを格納
  847.           r_height = [r_height, font_size].max
  848.           next
  849.         end
  850.       end
  851.       # 字下げの設定
  852.       @py = [(r_height + [(r_height + 66) / 8, r_height * 2 / 3].min - 5) -
  853.         max_height(@text), 0].max
  854.     end
  855.     # 次の文字へ
  856.   end
  857.   #--------------------------------------------------------------------------
  858.   # ● フレーム更新
  859.   #--------------------------------------------------------------------------
  860.   def update
  861.     # メッセージ履歴の呼び出し
  862.     if @h_window.active == false and (@contents_showed or
  863.          $game_system.map_interpreter.running? == false) and
  864.         (Input.trigger?(Input::L) or Input.trigger?(Input::R)) and
  865.         not $game_player.message_history.empty?
  866.       history_start
  867.     end
  868.     if @h_window.active
  869.       if @h_window.opacity < 255
  870.         @h_window.opacity += 24
  871.         @h_window.contents_opacity += 24
  872.         @bar.opacity += 24
  873.         return
  874.       end
  875.       history_update
  876.       return
  877.     end
  878.     # メッセージ履歴消去中の場合
  879.     if @h_window.opacity > 0
  880.       # 透過度を増やす
  881.       @h_window.opacity -= 48
  882.       @h_window.contents_opacity -= 48
  883.       @bar.opacity -= 48
  884.       # メッセージ履歴が完全透過状態になった場合
  885.       if @h_window.opacity == 0
  886.         @h_window.visible = false
  887.         @h_window.contents.dispose
  888.         @bar.bitmap.dispose
  889.         @bar.dispose
  890.         if @contents_showed == false
  891.           $game_temp.message_window_showing = false
  892.         end
  893.       end
  894.       return
  895.     end
  896.     super
  897.     # 吹き出し表示の場合、ウィンドウ位置設定
  898.     window_position if @event != nil
  899.     # フェードインの場合
  900.     if @fade_in
  901.       self.contents_opacity += 24
  902.       @face.opacity += 24 if FADE
  903.       if @input_number_window != nil
  904.         @input_number_window.contents_opacity += 24
  905.       end
  906.       if self.contents_opacity == 255
  907.         @fade_in = false
  908.       end
  909.     end
  910.     # 数値入力中の場合
  911.     if @input_number_window != nil
  912.       @input_number_window.update
  913.       # 決定
  914.       if Input.trigger?(Input::C)
  915.         if @push_enter
  916.           self.pause = false
  917.           @push_enter = false
  918.           @contents_showed = false
  919.           return
  920.         end
  921.         $game_system.se_play($data_system.decision_se)
  922.         $game_variables[$game_temp.num_input_variable_id] =
  923.                                                   @input_number_window.number
  924.         $game_map.need_refresh = true
  925.         # 数値入力ウィンドウを解放
  926.         @input_number_window.dispose
  927.         @input_number_window = nil
  928.         terminate_message
  929.       end
  930.       return
  931.     end
  932.     # メッセージ表示中の場合
  933.     if @contents_showing and @contents_showed == false
  934.       if (ENTER and Input.trigger?(Input::C)) or
  935.           (SHIFT >= ($DEBUG ? 0 : 1) and Input.press?(Input::SHIFT))
  936.         @wait = 0
  937.       end
  938.       if @wait > 0
  939.         @wait -= 1
  940.         return if @wait > 0
  941.       end
  942.       refresh
  943.       return
  944.     end
  945.     # メッセージ表示終了の場合
  946.     if @contents_showed
  947.       # 選択肢の表示中でなければポーズサインを表示
  948.       if $game_temp.choice_max == 0
  949.         self.pause = true
  950.       end
  951.       # キャンセル
  952.       if Input.trigger?(Input::B)
  953.         if $game_temp.choice_max > 0 and $game_temp.choice_cancel_type > 0
  954.           $game_system.se_play($data_system.cancel_se)
  955.           $game_temp.choice_proc.call($game_temp.choice_cancel_type - 1)
  956.           terminate_message
  957.         end
  958.       end
  959.       # 決定
  960.       if Input.trigger?(Input::C)
  961.         if @push_enter
  962.           self.pause = false
  963.           @push_enter = false
  964.           @contents_showed = false
  965.           return
  966.         end
  967.         if $game_temp.choice_max > 0
  968.           $game_system.se_play($data_system.decision_se)
  969.           $game_temp.choice_proc.call(self.index)
  970.         end
  971.         terminate_message
  972.       end
  973.       if SHIFT == 2 and Input.press?(Input::SHIFT) and
  974.           $game_temp.choice_max == 0
  975.         if @push_enter
  976.           self.pause = false
  977.           @push_enter = false
  978.           @contents_showed = false
  979.           return
  980.         end
  981.         terminate_message
  982.       end
  983.       if @contents_close and $game_temp.choice_max == 0
  984.         if $game_temp.choice_max > 0
  985.           $game_system.se_play($data_system.decision_se)
  986.           $game_temp.choice_proc.call(self.index)
  987.         end
  988.         terminate_message
  989.       end
  990.       return
  991.     end
  992.     # フェードアウト中以外で表示待ちのメッセージか選択肢がある場合
  993.     if @fade_out == false and $game_temp.message_text != nil
  994.       @contents_showing = true
  995.       $game_temp.message_window_showing = true
  996.       reset_window
  997.       text_initialize
  998.       self.visible = true
  999.       self.contents_opacity = 0
  1000.       @face.bitmap = nil
  1001.       @face.visible = true
  1002.       if FADE
  1003.         @face.opacity = 0
  1004.       else
  1005.         @face.opacity = 255
  1006.       end
  1007.       if @input_number_window != nil
  1008.         @input_number_window.contents_opacity = 0
  1009.       end
  1010.       @fade_in = true
  1011.       refresh
  1012.       Graphics.frame_reset
  1013.       return
  1014.     end
  1015.     # 表示すべきメッセージがないが、ウィンドウが可視状態の場合
  1016.     if self.visible
  1017.       @fade_out = true
  1018.       self.opacity -= 48
  1019.       @face.opacity -= 48
  1020.       if self.opacity == 0
  1021.         self.visible = false
  1022.         @face.visible = false
  1023.         @fade_out = false
  1024.         $game_temp.message_window_showing = false
  1025.       end
  1026.       return
  1027.     end
  1028.   end
  1029.   #--------------------------------------------------------------------------
  1030.   # ● メッセージ履歴テキスト格納
  1031.   #--------------------------------------------------------------------------
  1032.   def history_write(text)
  1033.     # メッセージ履歴に不要な制御文字の削除
  1034.     text.gsub!(/\002/) { "" }
  1035.     text.gsub!(/\003\[\d+\]/) { "" }
  1036.     text.gsub!(/\004/) { "" }
  1037.     text.gsub!(/\005/) { "" }
  1038.     text.gsub!(/\006/) { "" }
  1039.     text.gsub!(/\010/) { "" }
  1040.     text.gsub!(/\016/) { "" }
  1041.     text.gsub!(/\017/) { "" }
  1042.     text.gsub!(/\020/) { "" }
  1043.     text.gsub!(/\026\[\-*\d+,\d+\]/) { "" }
  1044.     # メッセージ履歴の初期化
  1045.     unless $game_player.message_history.is_a?(Array)
  1046.       $game_player.history_size = 100
  1047.       $game_player.message_history = []
  1048.     end
  1049.     # 現在のテキストをメッセージ履歴に格納
  1050.     $game_player.message_history.push([text, text_height(text)])
  1051.     # メッセージ履歴のサイズが大きい場合、最初の方より履歴を削除
  1052.     if $game_player.message_history.size > $game_player.history_size
  1053.       $game_player.message_history.shift
  1054.     end
  1055.   end
  1056.   #--------------------------------------------------------------------------
  1057.   # ● メッセージ履歴テキスト描画
  1058.   #--------------------------------------------------------------------------
  1059.   def history_refresh
  1060.     # 描画範囲に何もかかれていない場合、メッセージ履歴の描画を行う
  1061.     while (@h >= @h_window.oy and @h != 0)
  1062.       # 初期設定
  1063.       @text = $game_player.message_history[@index][0].clone
  1064.       h = @h
  1065.       self.contents.font.size = 22
  1066.       self.contents.font.color = normal_color
  1067.       self.contents.font.bold = false
  1068.       self.contents.font.italic = false
  1069.       @rubi = ""
  1070.       @x = @i = 4
  1071.       @fi = @y = 0
  1072.       @h += max_height(@text) - self.contents.font.size - text_height(@text)
  1073.       # ルビ付きの場合、字下げを行う
  1074.       text = @text[/^.*?\n/]
  1075.       font_size = self.contents.font.size
  1076.       r_height = 0
  1077.       while ((c = text.slice!(/./m)) != nil)
  1078.         # \F[n] の場合、フォントサイズの変更
  1079.         if c == "\025"
  1080.           text.sub!(/\[([0-9]+)\]/, "")
  1081.           font_size = $1.to_i
  1082.           next
  1083.         end
  1084.         # ルビが存在した場合
  1085.         if c == "\027"
  1086.           text.sub!(/\[(.+?),(.+?)\]/, "")
  1087.           # ルビのテキストサイズを格納
  1088.           r_height = [r_height, font_size].max
  1089.           next
  1090.         end
  1091.       end
  1092.       # 字下げの設定
  1093.       @py = [(r_height + [(r_height + 66) / 8, r_height * 2 / 3].min - 5) -
  1094.         max_height(@text), 0].max
  1095.       # c に 1 文字を取得 (文字が取得できなくなるまでループ)
  1096.       while ((c = @text.slice!(/./m)) != nil)
  1097.         next unless control(c)
  1098.         # 文字を描画
  1099.         size = self.contents.font.size
  1100.         @h_window.contents.font.size = size
  1101.         @h_window.contents.font.bold = self.contents.font.bold
  1102.         @h_window.contents.font.italic = self.contents.font.italic
  1103.         @h_window.contents.draw_text(@x, @h + @py, 10 + size, 10 + size, c)
  1104.         # x に描画した文字の幅を加算
  1105.         @x += @h_window.contents.text_size(c).width
  1106.         rubi_draw if @rubi != ""
  1107.       end
  1108.       @h = h - text_height($game_player.message_history[@index][0])
  1109.       @index -= 1
  1110.     end
  1111.   end
  1112.   #--------------------------------------------------------------------------
  1113.   # ● メッセージ履歴呼び出し
  1114.   #--------------------------------------------------------------------------
  1115.   def history_start
  1116.     # メッセージ履歴初期化設定
  1117.     $game_temp.message_window_showing = true
  1118.     @h_window.active = true
  1119.     @h_window.visible = true
  1120.     # メッセージ履歴の最終行より、どれだけ描画できるか計算を行う
  1121.     @h = 0
  1122.     for history in $game_player.message_history
  1123.       @h += history[1]
  1124.     end
  1125.     # メッセージ履歴描画矩形の作成
  1126.     @h_window.contents = Bitmap.new(@h_window.width - 32, @h)
  1127.     @h_window.opacity = 0
  1128.     @h_window.contents_opacity = 0
  1129.     @h_window.contents.fill_rect(
  1130.       @h_window.width - 38, 0, 6, @h, Color.new(0, 0, 0, 128))
  1131.     @h_window.oy = [@h - (@h_window.height - 32), 0].max
  1132.     # メッセージ履歴サイドバーの作成
  1133.     @bar = Sprite.new(self.viewport)
  1134.     height = [(@h_window.height - 32) ** 2 / @h, @h_window.height - 32].min
  1135.     @bar.x = @h_window.x + @h_window.width - 22
  1136.     @bar.y = @h_window.y + @h_window.height - 16 - height
  1137.     @bar.z = 10003
  1138.     @bar.opacity = 0
  1139.     @bar.bitmap = Bitmap.new(6, height)
  1140.     @bar.bitmap.fill_rect(0, 0, 6, height, Color.new(16, 32, 64, 224))
  1141.     @bar.bitmap.fill_rect(0, 0, 5, height - 1, Color.new(32, 64, 128, 224))
  1142.     @bar.bitmap.fill_rect(1, 1, 4, height - 2, Color.new(128, 224, 255, 255))
  1143.     @bar.bitmap.fill_rect(1, 1, 3, height - 3, Color.new(192, 255, 255, 255))
  1144.     @bar.bitmap.fill_rect(2, 2, 2, height - 4, Color.new(32, 64, 128, 192))
  1145.     @bar.bitmap.fill_rect(3, 3, 1, height - 5, Color.new(48, 96, 192, 192))
  1146.     @scroll_height = @h
  1147.     # メッセージ履歴描画情報の初期設定
  1148.     @index = $game_player.message_history.size - 1
  1149.     # メッセージ履歴描画
  1150.     history_refresh
  1151.   end
  1152.   #--------------------------------------------------------------------------
  1153.   # ● メッセージ履歴フレーム更新
  1154.   #--------------------------------------------------------------------------
  1155.   def history_update
  1156.     @h_window.update
  1157.     # 十字キーの上が押下された場合
  1158.     if Input.press?(Input::UP)
  1159.       # ウィンドウ上方向にスクロール
  1160.       @h_window.oy = [@h_window.oy - 8, 0].max
  1161.     end
  1162.     # 十字キーの下が押下された場合
  1163.     if Input.press?(Input::DOWN)
  1164.       # ウィンドウ下方向にスクロール
  1165.       @h_window.oy = [[@h_window.oy + 8,
  1166.         @h_window.contents.height - (@h_window.height - 32)].min, 0].max
  1167.     end
  1168.     # 十字キーの左が押下された場合
  1169.     if Input.press?(Input::LEFT)
  1170.       # ウィンドウ上方向に大きくスクロール
  1171.       @h_window.oy = [@h_window.oy - 32, 0].max
  1172.     end
  1173.     # 十字キーの右が押下された場合
  1174.     if Input.press?(Input::RIGHT)
  1175.       # ウィンドウ下方向に大きくスクロール
  1176.       @h_window.oy = [[@h_window.oy + 32,
  1177.         @h_window.contents.height - (@h_window.height - 32)].min, 0].max
  1178.     end
  1179.     # L ボタンが押下された場合
  1180.     if Input.press?(Input::L)
  1181.       # ウィンドウ上方向に大きくスクロール
  1182.       @h_window.oy = [@h_window.oy - 96, 0].max
  1183.     end
  1184.     # R ボタンの右が押下された場合
  1185.     if Input.press?(Input::R)
  1186.       # ウィンドウ下方向に大きくスクロール
  1187.       @h_window.oy = [[@h_window.oy + 96,
  1188.         @h_window.contents.height - (@h_window.height - 32)].min, 0].max
  1189.     end
  1190.     # スクロールバーの移動
  1191.     @bar.y = 16 + @h_window.y +
  1192.       ((@h_window.height - 32) * @h_window.oy / @scroll_height.to_f).ceil
  1193.     # メッセージ履歴の更新
  1194.     history_refresh
  1195.     if Input.trigger?(Input::B)
  1196.       @h_window.active = false
  1197.     end
  1198.   end
  1199.   #--------------------------------------------------------------------------
  1200.   # ● カーソルの矩形更新
  1201.   #--------------------------------------------------------------------------
  1202.   def update_cursor_rect
  1203.     if @index >= 0
  1204.       n = @c_h + @py - ($game_temp.choice_max - 1) * 32
  1205.       self.cursor_rect.set(8, n + @index * 32, @cursor_width, 32)
  1206.     else
  1207.       self.cursor_rect.empty
  1208.     end
  1209.   end
  1210. end

  1211. #==============================================================================
  1212. # ■ RPG
  1213. #------------------------------------------------------------------------------
  1214. #  基本モジュールです
  1215. #==============================================================================

  1216. module RPG
  1217.   #============================================================================
  1218.   # ■ Cache
  1219.   #----------------------------------------------------------------------------
  1220.   #  画像処理を行うモジュールです。
  1221.   #============================================================================
  1222.   module Cache
  1223.     def self.face(filename)
  1224.       self.load_bitmap("Graphics/Faces/", filename)
  1225.     end
  1226.   end
  1227. end
复制代码
要求只有一個: 把齒車之城版中能先後顯示臉圖的功能合併到櫻雅在土版中。
拜托各位。dsu_plus_rewardpost_czw




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1