设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索

新人求解 对话框 名字变量问题 显示错误 如何修正?

查看数: 3864 | 评论数: 7 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2013-1-25 23:24

正文摘要:

本帖最后由 视觉诱惑 于 2013-1-26 22:37 编辑 脚本和 括号貌似起了冲突  不知如何 修改  求高人指点 我把\name[\N[0]] 改成了  \name[\N[1]] 数字也改了也显示不了 &n ...

回复

tseyik 发表于 2013-1-27 21:07:21
另外,你那個是旧版
只更新到2012.02.28
2012.05.02  以後的才支援在名字使用制御文字 \V、\P、\N、\G 。
05.02 各版本修正是
2012.05.02  ・名前には、制御文字 \V、\P、\N、\G が使用可能。
            ・\V については、2段階の入れ子が使用可能。
            ・ウィンドウ消去機能を、「背景を暗くする」に対応。
2012.05.09 ・通常の上表示のとき、ネームウィンドウが見切れるので少し下にずらす。
2012.05.12 ・ネームウィンドウの幅と高さを変更可能にした。
            ・ネームウィンドウの高さを変えると、どんどん下に伸びるのを修正。
2012.07.15 ・イベントコマンドで、$name_right = true と入力すると、
       名前ウィンドウが右に移ります。
2012.08.26 ・思案型テールへの変更機能追加。
            ・文章の1行目を表示しない機能は、スイッチを使えるようにした。
             (セーブ&ロードに対応していないため)
             なお、従来の$system_line も使用可能。
2012.08.26版本
  1. =begin
  2. 吹きだしウィンドウVXAce

  3. 2011.12.25 tamura改造
  4. 2012年08月26日 改訂

  5. ※このスクリプトは、ちいさな本屋様(http://xrxs.at-ninja.jp/)
  6. が製作されたものをtamuraがACE用に改造した物です。

  7. 原版:
  8. ▽▽▽ XRXSv2. メッセージ表示フルグレードアップVX ▽▽▽
  9. publish 2010/ 3/ 2
  10. update  - 11/ 1/10a


  11. ※※警告※※
  12. THINK_TAIL や SYSTEM_LINE の機能を使わない場合は、
  13. これらに使用していないスイッチを割り当てておいてください。


  14. 「立ち絵機能」をONにしている時に、立ち絵を表示せずに、ウィンドウ位置を
  15. 右か左に変更した時、テールのY座標がずれるようです。
  16. 原因は調査中です。立ち絵を表示しない時は、イベントコマンド「注釈」で、
  17. 「立ち絵表示 off」と記述して立ち絵機能をOFFにしておいてください。

  18. ●機能一覧
  19. ・イベントコマンド「スクリプト」で、$win_x $win_yに値を入力すると、
  20.  ($win_x 、$win_y)の位置にウィンドウを表示する。画面左上が(0,0)。

  21. ・キーボードのQ(装備画面で前のキャラに戻るボタン)を押すと、
  22.  ウィンドウが消える。Qか決定、キャンセルキーで元に戻る。

  23. ・イベントコマンド「スクリプト」で、
  24. $name_right = true
  25. と入力すれば、ネームウィンドウがウィンドウの右に移ります。
  26. 元に戻すには、イベントコマンド「スクリプト」で
  27. $name_right = false
  28. と入力すれば、左側に戻ります。


  29. ・イベントコマンド「スクリプト」で、
  30. $system_line = true
  31. と入力すれば、最初の一行目を表示しません。
  32. $system_line = false
  33. で元に戻ります。


  34. ・文章のどこでもいいので、以下の表記を行う。
  35. ・ \name[] : []の中の文字を、ウィンドウ左上に小さく表示する。
  36.  表示させる名前には、制御文字 \V、\P、\N、\G が使用可能。

  37. \h[-1] : プレーヤーの上にウィンドウをポップ。
  38. \h[0] : 現在アクティブのイベントの上にウィンドウをポップ。
  39. \h[1] : IDが1番のイベントの上にウィンドウをポップする。
  40. hは大文字でもOK。

  41. ポップアップを行うとき、
  42. 「メッセージの表示」の設定で、ウィンドウの「表示位置」によって、
  43. ウィンドウがイベントの上に出るか下に出るかを設定できます。

  44. ウィンドウは通常の大きさのまま、テールだけ表示したい場合は、
  45. \t[-2] : ウィンドウが上下に表示される時は、X座標をMINAS_TWE_X_POSで固定。
  46.            $win_x で左右に表示される時は、Y座標がウィンドウの中心やや下で固定。
  47. \t[-3] : ウィンドウが上下に表示される時は、X座標をMINAS_THREE_X_POSで固定。
  48.            $win_x で左右に表示される時は、Y座標がウィンドウの中心やや下で固定。
  49. \t[-1] : プレーヤーの上に向かってテール表示。
  50. \t[0] : 現在アクティブのイベントに向かってテール表示。
  51. \t[1] : IDが1番のイベントの上に向かってテール表示。

  52. その他
  53. \O[128] : 文字を透明にする。128はalphaの値で、0で透明、255で通常。
  54. \D : 文字に影をつける
  55. \hold : メッセージ表示の、最後の文章に限定。
  56.      メッセージが終わっても、ウィンドウを閉じずに残します。
  57.      他のメッセージが表示されて次へ送られる時に消えます。
  58.      なお、ホールドされているウィンドウは、Qボタンで消せません。



  59. ●その他
  60. ・ACEに標準装備されている機能は通常通り使用できます。
  61. ・A1殿(http://a1tktk.web.fc2.com/)の立ち絵スクリプトに対応しています。
  62.  このスクリプトの上に「RGSS3用A1共通処理」
  63.  このスクリプトの下に「空メッセージでウィンドウを開かない」「立ち絵表示」を
  64.  配置して下さい。
  65.  残念ながら、「ネームウィンドウ」は使えません。上記\nameをお使いください。
  66. ※立ち絵を表示しない時は、注釈で「立ち絵表示 off」とした方が無難です。
  67. ・イベントの下から話しかけたら上へポップ、上から話しかけたら下へポップするという
  68.  機能を追加。カスタマイズポイントで POP_DIRECTION = ture と変更のこと。


  69. ●廃止機能 
  70. ・\Iがすでに使われているので、イタリック文字変換を廃止。
  71. ・スピード変更、改行、最後に入手したアイテムの表示を、ACE化にともない廃止。


  72. 【改訂履歴】
  73. 2012.01.10  ・ウィンドウを消したまま次のウィンドウを自動で表示すると、
  74.               ネームウィンドウが表示されるのを修正。
  75. 2012.01.11  ・ネームウィンドウが出しっぱなしになるのを修正。
  76. 2012.01.12  ・メニューを出してから決定ボタンを押すとネームウィンドウがでる不具合の修正。
  77. 2012.02.01 ・ネームウィンドウのオープン&クローズのタイミングを変更。
  78.       ・hold機能を追加。
  79. 2012.02.10 ・キャラポップした時、一行ずつしか表示されない不具合を修正。
  80. 2012.02.14 ・アイテム名などの文字数が正常に取得できなかったのを修正。
  81. 2012.02.21 ・話しかけられた方向によって、ポップ方向を変えられるようにした。
  82. 2012.02.25 ・すべてのシーン遷移の際はテールを破棄(イベント中でショップ起動など)
  83. 2012.02.28 ・エスケープ文字の処理が上手くいかない問題について暫定対策。
  84. 2012.03.05 ・微妙にウィンドウ幅が足りない時があったので、僅かにウィンドウ幅追加。
  85. 2012.03.14 ・ポップアップ時の顔グラ表示に対応。
  86. 2012.04.20 ・吹きだしが大型になると選択肢が入りきらない不具合の修正。
  87.             ・ネームウィンドウが残ったままシーン遷移があると、ネームウィンドウが
  88.              閉じない不具合の修正。
  89. 2012.05.02  ・名前には、制御文字 \V、\P、\N、\G が使用可能。
  90.             ・\V については、2段階の入れ子が使用可能。
  91.             ・ウィンドウ消去機能を、「背景を暗くする」に対応。
  92. 2012.05.09 ・通常の上表示のとき、ネームウィンドウが見切れるので少し下にずらす。
  93. 2012.05.12 ・ネームウィンドウの幅と高さを変更可能にした。
  94.             ・ネームウィンドウの高さを変えると、どんどん下に伸びるのを修正。
  95. 2012.07.15 ・イベントコマンドで、$name_right = true と入力すると、
  96.        名前ウィンドウが右に移ります。
  97. 2012.08.26 ・思案型テールへの変更機能追加。
  98.             ・文章の1行目を表示しない機能は、スイッチを使えるようにした。
  99.              (セーブ&ロードに対応していないため)
  100.              なお、従来の$system_line も使用可能。

  101. =end

  102. #==============================================================================
  103. # カスタマイズポイント
  104. #==============================================================================
  105. #=begin
  106. class Window_Message < Window_Base
  107.   #
  108.   # 基本行数
  109.   #
  110.   MAX_LINE = 4
  111.   #
  112.   # \p[] - キャラポップの高さ
  113.   #
  114.   CHARPOP_HEIGHT = 40
  115.   #
  116.   #
  117.   #\name[]で表示されるウィンドウのX座標、Y座標、幅、高さ の変更値。
  118.   #座標は、メッセージウィンドウの左上端が原点。名前はウィンドウ中央に表示。
  119.   NAME_WINDOW_OFFSET_X =   0
  120.   NAME_WINDOW_OFFSET_Y = -24
  121.   NAME_WINDOW_OFFSET_WIDTH = 0
  122.   NAME_WINDOW_OFFSET_HIGHT = 5
  123.   
  124.   #
  125.   #
  126.   MINAS_TWE_X_POS = 100 # $t[-2]のときの、テールのX座標。
  127.   MINAS_THREE_X_POS = 444 # $t[-3]のときの、テールのX座標。
  128.   
  129.   POP_DIRECTION = false #イベントの方向を考慮。
  130.   
  131.   THINK_TAIL = 101 #この番号のゲームスイッチがONの時、思案型テールになります。
  132.   SYSTEM_LINE = 102 #この番号のゲームスイッチがONの時、最初の1行を表示しません。
  133.   
  134. end

  135. #(メモ)上表示で、ネームウィンドウのために少し下にずらす機能は、
  136. #再定義したupdate_placement_positionのところ。

  137. #==============================================================================
  138. # 参照機能
  139. #==============================================================================
  140. class Game_Temp
  141.   attr_accessor :last_gain_material
  142.   attr_accessor :last_gain_holder
  143. end

  144. class Window_Message < Window_Base
  145.   #--------------------------------------------------------------------------
  146.   # ● 改ページ処理
  147.   #--------------------------------------------------------------------------
  148.   def new_page(text, pos)
  149.     contents.clear
  150.     draw_face($game_message.face_name, $game_message.face_index, 0, 0)
  151.     reset_font_settings
  152.     pos[:x] = new_line_x
  153.    
  154.     #変更部分。システム用の一行目を表示しない。
  155.     if $system_line == false and $game_switches[SYSTEM_LINE] == false
  156.       pos[:y] = 0
  157.     else
  158.       pos[:y] = 0 - line_height
  159.     end

  160.     pos[:new_x] = new_line_x
  161.     pos[:height] = calc_line_height(text)
  162.     clear_flags
  163.   end
  164. end

  165. #==============================================================================
  166. # フルグレードアップベース - 制御文字・基本機能
  167. #==============================================================================
  168. class Window_Message < Window_Base
  169.   attr_accessor :tail
  170.   #--------------------------------------------------------------------------
  171.   # ● 特殊文字の変換 + 準備
  172.   #     変換・消去してもいい部分を処理、フラグのセット。
  173.   #--------------------------------------------------------------------------
  174.   alias xrxsv2_convert_escape_characters convert_escape_characters
  175.   def convert_escape_characters(text)
  176.     #@textsが使いずらいので、ここで別変数に保管。
  177.     @all_texts = []
  178.     str = text.gsub(/\\/) { "\e" }
  179.     @all_texts = str.split("\n")
  180.    
  181.     #この段階で、変数・アクター名を変換してしまう。
  182.     #ネームウィンドウ内の文字を変換するため。
  183.     text = convert_escape_characters_easy(text)
  184.    
  185.     # 初期化
  186.     contents.font.size   = Font.default_size
  187.     contents.font.bold   = Font.default_italic
  188.     contents.font.italic = Font.default_bold
  189.     contents.font.shadow = Font.default_shadow
  190.     @type_wait = 0
  191.     @line_widths = []
  192.     @line_aligns = []
  193.     self.pop_character = nil
  194.     # ウィンドウ保持指定\holdがあるか?
  195.     @window_hold = (text.gsub!(/\\hold/) { "" } != nil)
  196.     # \info
  197.     @info_mode = (text.gsub!(/\\info/) { "" } != nil)
  198.     # 改行削除指定\_があるか?
  199.     if (/\\_(.*?)\x00/.match(@text)) != nil
  200.       $game_message.choice_start -= 1
  201.       text.gsub!(/\\_(.*?)\x00/) { $1.to_s }
  202.     end
  203.     # \name 判定
  204.     if text.sub!(/\\[Nn]ame\[(.*?)\]/) { "" }
  205.       name = $1
  206.       bitmap = @name_sprite.bitmap
  207.       w = [bitmap.text_size(name).width, 1].max + NAME_WINDOW_OFFSET_WIDTH
  208.       bitmap.dispose
  209.       @name_sprite.bitmap = Bitmap.new(w, 32)
  210.       bitmap = @name_sprite.bitmap
  211.       bitmap.draw_text(0, 0, bitmap.width, bitmap.height, name)
  212.       @name_window.width = w + 16
  213.       @name_window.height = bitmap.height + NAME_WINDOW_OFFSET_HIGHT
  214.       @name_window.create_contents
  215.       @name_window.open if @name_window.openness == 0
  216.       if self.visible #名前だけ表示されるのを防止。
  217.         @name_window.visible = true
  218.         @name_sprite.visible = true
  219.       else
  220.         @name_window.visible = false
  221.         @name_sprite.visible = false
  222.       end
  223.     else
  224.       @name_window.visible = false
  225.       @name_sprite.visible = false
  226.       @name_sprite.bitmap.dispose
  227.       @name_sprite.bitmap = Bitmap.new(32,32)
  228.     end
  229.     $name = $1 #あれこれで使うので、ネームウィンドウに表示予定の名前を取得。
  230.     # キャラボップモード
  231.     if text.gsub!(/\\[Hh]\[-1\]/) { "" }
  232.       self.pop_character = -1
  233.     elsif text.gsub!(/\\[Hh]\[([0-9]+)\]/) { "" }
  234.       self.pop_character = $1.to_i
  235.     elsif text.gsub!(/\\[Hh]/) { "" }
  236.       self.pop_character = 0
  237.     #テール表示モード
  238.     elsif text.gsub!(/\\[Tt]\[-1\]/) { "" }
  239.       self.tail_character = -1
  240.     elsif text.gsub!(/\\[Tt]\[-2\]/) { "" }
  241.       self.tail_character = -2
  242.     elsif text.gsub!(/\\[Tt]\[-3\]/) { "" }
  243.       self.tail_character = -3
  244.     elsif text.gsub!(/\\[Tt]\[([0-9]+)\]/) { "" }
  245.       self.tail_character = $1.to_i
  246.     elsif text.gsub!(/\\[Tt]/) { "" }
  247.       self.tail_character = 0
  248.     else
  249.       self.pop_character = nil
  250.     end
  251.    
  252.     # 制御文字処理
  253.     text = xrxsv2_convert_escape_characters(text)
  254.     text.gsub!(/\\[Ss]\[([0-9]+)\]/i) { "\eS[#{$1}]" }
  255.     text.gsub!(/\\[Oo]\[([0-9]+)\]/i) { "\eO[#{$1}]" }
  256.     text.gsub!(/\\last_holder/i) { "\e18" }
  257.     text.gsub!(/\\last_material/i) { "\e19" }
  258.     text.gsub!(/\\B/) { "\eB" }
  259.     text.gsub!(/\\D/) { "\eD" }
  260.     #text.gsub!(/\\n/) { "\n" }
  261.     #
  262.     # ライン情報の取得
  263.     rxs = ["\x01","\x02","\x03","\x04","\x05","\x06","\x07","\x08",
  264.       /\[([0-9]+)\]/,
  265.       "\x11","\x12","\x13","\x14", "\x15", "\x16", "\x17", "\x18","\x19"]
  266.     lines = text.split("\x00")
  267.     @lines_max = lines.size
  268.     for i in 0...@lines_max
  269.       line = lines[i]
  270.       for rx in rxs
  271.         line.gsub!(rx) {""}
  272.       end
  273.       @line_aligns[i] =
  274.         line.sub!(/\\center/) {""} ? CENTER :
  275.         line.sub!(/\\right/)  {""} ? RIGHT :
  276.                                      AUTO
  277.       # 行の横幅の取得と設定
  278.       cx = text_width_no_escape(line,text) #test
  279.       #cx = contents.text_size(line,text).width
  280.       @line_widths[i] = cx
  281.     end
  282.     # 位置揃え制御文字の削除
  283.     text.gsub!(/\\center/) {""}
  284.     text.gsub!(/\\right/) {""}
  285.     # キャラポップ時のウィンドウリサイズ
  286.     reszie_window_for_pop
  287.    
  288.     del_tail # if @tail != nil
  289.     # $mes_id が空のときと戦闘中はふきだしを表示しない
  290.     if defined?($game_system.show_stand_picture) #立ち絵に対応。
  291.       $mes_id = -1 if $game_system.show_stand_picture == true
  292.     end
  293.     if $mes_id != nil and not $game_party.in_battle
  294.       # ふきだしのテールを描画
  295.       skin = "Window"
  296.       if @background == 0
  297.         #画像の準備
  298.         @tail = Sprite.new
  299.         @tail.visible = false
  300.         # 位置を取得
  301.         tale_pos = get_tale_pos
  302.         if $win_x != nil
  303.           if $win_x > 0
  304.             @tail.bitmap = Cache.system(skin + "-right")
  305.             @tail.x = tale_pos[0]
  306.             @tail.y = tale_pos[1]
  307.             @tail.z = self.z + 1
  308.           elsif  $win_x < 0
  309.             @tail.bitmap = Cache.system(skin + "-left")
  310.             @tail.x = tale_pos[0]
  311.             @tail.y = tale_pos[1]
  312.             @tail.z = self.z + 1
  313.           else
  314.             create_tail_up_under
  315.           end
  316.         else
  317.           create_tail_up_under
  318.         end
  319.         # エクストラスプライトに登録
  320.         @extra_sprites = [] if @extra_sprites.nil?
  321.         @extra_sprites.push(@tail) if @tail != nil
  322.         # 更新
  323.         update_tail
  324.       end
  325.     end

  326.     open_and_wait #リサイズが終わった時点でウィンドウオープン。
  327.    
  328.     return text
  329.   end
  330.   #--------------------------------------------------------------------------
  331.   # ● 制御文字の変換。
  332.   #    変数・パーティ名・アクター名・所持金のみ変換する。
  333.   #    文字「\」はエスケープ文字(\e)に変換。
  334.   #--------------------------------------------------------------------------
  335.   def convert_escape_characters_easy(text)
  336.     result = text.to_s.clone
  337.     result.gsub!(/\\[vV]\[/)          { "\eV\[" }
  338.     result.gsub!(/\\[nN]\[/)          { "\eN\[" }
  339.     result.gsub!(/\\[pP]\[/)          { "\eP\[" }
  340.     result.gsub!(/\\[gG]/)          { "\eG" }
  341.     result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
  342.     result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
  343.     result.gsub!(/\eN\[(\d+)\]/i) { actor_name($1.to_i) }
  344.     result.gsub!(/\eP\[(\d+)\]/i) { party_member_name($1.to_i) }
  345.     result.gsub!(/\eG/i)          { Vocab::currency_unit }
  346.     result
  347.   end
  348.   #--------------------------------------------------------------------------
  349.   # ● 文字の長さを取得する。エスケープ文字は含まない。
  350.   # line : 表示しようとしている全ての文字列。
  351.   # text : その列の文字。
  352.   #--------------------------------------------------------------------------
  353.   def text_width_no_escape(line , text_o)
  354.     add = 5 #微妙に足りないので水増し。
  355.     text = Marshal.load(Marshal.dump(text_o))
  356.     text.gsub!(/\ehold/) { "" }
  357.     text.gsub!(/\einfo/) { "" }
  358.     # 改行削除指定\_があるか?
  359.     if (/\\_(.*?)\x00/.match(@text)) != nil
  360.       $game_message.choice_start -= 1
  361.       text.gsub!(/\\_(.*?)\x00/) { "" }
  362.     end
  363.     # \name 判定
  364.     text.sub!(/\e[Nn]ame\[(.*?)\]/) { "" }
  365.     text.gsub!(/\e[Hh]\[-1\]/) { "" }
  366.     text.gsub!(/\e[Hh]\[([0-9]+)\]/) { "" }
  367.     text.gsub!(/\e[Hh]/) { "" }
  368.     text.gsub!(/\e[Tt]\[-1\]/) { "" }
  369.     text.gsub!(/\e[Tt]\[-2\]/) { "" }
  370.     text.gsub!(/\e[Tt]\[-3\]/) { "" }
  371.     text.gsub!(/\e[Tt]\[([0-9]+)\]/) { "" }
  372.     text.gsub!(/\e[Tt]/) { "" }
  373.     # 制御文字処理
  374.     text.gsub!(/\e[Ss]\[([0-9]+)\]/i) { "" }
  375.     text.gsub!(/\e[Oo]\[([0-9]+)\]/i) { "" }
  376.     text.gsub!(/\elast_holder/i) { "" }
  377.     text.gsub!(/\elast_material/i) { "" }
  378.     #text.gsub!(/\eV/) { "" } #変数に置き換える。
  379.     #text.gsub!(/\eN/) { "" } #名前へ置き換える。
  380.     #text.gsub!(/\eP/) { "" } #名前へ置き換える。
  381.     #text.gsub!(/\eG/) { "" } #金額へ置き換える。
  382.     #text.gsub!(/\eC/) { "" }
  383.     text.gsub!(/\eB/) { "" }
  384.     text.gsub!(/\eD/) { "" }
  385.     if text =~ /\eI/
  386.       loop do
  387.         if str = text.sub!(/\eI\[(\d+)\]/){ "" }
  388.           add += 24
  389.         else
  390.           break
  391.         end
  392.       end
  393.     end
  394.     #text.gsub!(/\\n/) { "\n" }
  395.     text.sub!(/\ecenter/) {""}
  396.     text.sub!(/\eright/)  {""}
  397.     text.gsub!(/\ecenter/) {""}
  398.     text.gsub!(/\eright/) {""}
  399.    
  400.     text = xrxsv2_convert_escape_characters(text)
  401.     basic_width = text_size(text).width + add
  402.     esc = text.scan(/\e(\S)/)
  403.     return ( basic_width - esc.size * (contents.font.size - 4) ) #\eの幅は20?
  404.   end
  405.   #--------------------------------------------------------------------------
  406.   # ● 最も長い列の長さを調べる。エスケープ文字は含まない。
  407.   #--------------------------------------------------------------------------
  408.   def max_width
  409.     text_size = []
  410.     for i in 0 ... @all_texts.size
  411.       text_size.push text_width_no_escape(@all_texts[i],@all_texts[i]) + 20
  412.     end
  413.     return text_size.max
  414.   end
  415.   #--------------------------------------------------------------------------
  416.   # ● 吹きだしテールが上か下の場合の画像を準備。
  417.   #--------------------------------------------------------------------------
  418.   def create_tail_up_under
  419.     skin = "Window"
  420.     tale_pos = get_tale_pos
  421.     case @position
  422.     when 0  # 上
  423.       @tail.bitmap = Cache.system(skin + "-top")
  424.       @tail.x = tale_pos[0]
  425.       @tail.y = tale_pos[1]
  426.       @tail.z = self.z + 1
  427.     when 1  # 中
  428.       @tail.dispose
  429.       @tail = nil
  430.     when 2  # 下
  431.       @tail.bitmap = Cache.system(skin + "-under")
  432.       @tail.x = tale_pos[0]
  433.       @tail.y = tale_pos[1]
  434.       @tail.z = self.z + 1
  435.     end
  436.   end
  437.   #--------------------------------------------------------------------------
  438.   # ● 全テキストの処理
  439.   #--------------------------------------------------------------------------
  440.   def process_all_text
  441.     #open_and_wait #リサイズがあるので、すぐにウィンドウをオープンしない。
  442.     text = convert_escape_characters($game_message.all_text)
  443.     pos = {}
  444.     new_page(text, pos)
  445.     process_character(text.slice!(0, 1), text, pos) until text.empty?
  446.   end
  447.   #--------------------------------------------------------------------------
  448.   # ● メッセージの更新 *
  449.   #--------------------------------------------------------------------------
  450.   def update_message
  451.     @wait_count = @type_wait
  452.     loop do
  453.       c = @text.slice!(/./m)
  454.       case update_message_type(c)
  455.       when 1
  456.         break
  457.       when 2
  458.         next
  459.       end
  460.       break unless @show_fast or @line_show_fast
  461.     end
  462.   end
  463.   #--------------------------------------------------------------------------
  464.   # 一文字の描画 (返り値 1:break, 2:next)
  465.   #--------------------------------------------------------------------------
  466. #=begin
  467.   def process_escape_character(code, text, pos)
  468.     case code.upcase
  469.     when '
  470.       @gold_window.open
  471.     when '.'
  472.       wait(15)
  473.     when '|'
  474.       wait(60)
  475.     when '!'
  476.       input_pause
  477.     when '>'
  478.       @line_show_fast = true
  479.     when '<'
  480.       @line_show_fast = false
  481.     when '^'
  482.       @pause_skip = true
  483.     #when 'n'                      # 改行
  484.     #  new_line
  485.     #  max = MAX_LINE
  486.     #  max = 14 if self.pop_character != nil
  487.     #  if @line_count >= max      # 行数が最大のとき
  488.     #    unless @text.empty?           # さらに続きがあるなら
  489.     #      self.pause = true           # 入力待ちを入れる
  490.           #return 1
  491.     #    end
  492.     #  end
  493.     #when 'S'                       # \S[n]  (スピード変更)
  494.     #  text.sub!(/\[([0-9]+)\]/, "")
  495.     #  @type_wait = $1.to_i
  496.     #  return 2
  497.     when 'O'                       # \O 文字を透明にする。
  498.       text.sub!(/\[([0-9]+)\]/, "")
  499.       contents.font.color.alpha = $1.to_i
  500.       #return 2
  501.     when 'D' #\D 文字に影をつける
  502.       contents.font.shadow ^= true
  503.     #when '18'
  504.     #  name = ($game_temp.last_gain_holder.name rescue "")
  505.     #  update_message_type_draw_at(name)
  506.     #when '19'
  507.     #  item = ($game_temp.last_gain_material.item rescue nil)
  508.     #  draw_item_name(item, @contents_x, @contents_y)
  509.     #  @contents_x += 196
  510.     else
  511.       super
  512.     end
  513.         
  514.   end
  515. #=end
  516.   #--------------------------------------------------------------------------
  517.   # ● 改ページ処理
  518.   #--------------------------------------------------------------------------
  519.   alias xrxsv2_new_page new_page
  520.   def new_page(text, pos)
  521.     xrxsv2_new_page(text, pos)
  522.     update_charpop_window
  523.   end
  524.   #--------------------------------------------------------------------------
  525.   # ● 改行位置の取得
  526.   #--------------------------------------------------------------------------
  527.   #def new_line_x
  528.   #  $game_message.face_name.empty? ? 0 : 112
  529.   #end
  530.   #--------------------------------------------------------------------------
  531.   # ● 改行処理
  532.   #--------------------------------------------------------------------------
  533.   alias xrxsv2_new_line_x new_line_x
  534.   def new_line
  535.     xrxsv2_new_line
  536.     set_align
  537.   end
  538.   #--------------------------------------------------------------------------
  539.   # 位置揃え
  540.   #--------------------------------------------------------------------------
  541.   def set_align
  542.     w = @line_widths[@line_count].to_i
  543.     a = @line_aligns[@line_count]
  544.     case a
  545.     when CENTER
  546.       @contents_x = @contents_x + ((contents.width - @contents_x) - w) / 2
  547.     when RIGHT
  548.       @contents_x = contents.width - w
  549.     end
  550.   end
  551.   #--------------------------------------------------------------------------
  552.   # ● ファイバーのメイン処理 ☆再定義
  553.   #--------------------------------------------------------------------------
  554.   def fiber_main
  555.     $game_message.visible = true
  556.     update_background
  557.     update_placement
  558.     loop do
  559.       process_all_text if $game_message.has_text?
  560.       process_input
  561.       $game_message.clear
  562.       @gold_window.close
  563.       process_hold #ホールドウィンドウの処理。
  564.       Fiber.yield
  565.       break unless text_continue?
  566.     end
  567.     close_and_wait
  568.     $game_message.visible = false
  569.     @fiber = nil
  570.   end
  571.   #--------------------------------------------------------------------------
  572.   # 定数
  573.   #--------------------------------------------------------------------------
  574.   AUTO   = 0
  575.   LEFT   = 1
  576.   CENTER = 2
  577.   RIGHT  = 3
  578. end
  579. #==============================================================================
  580. # アクティブイベント取得
  581. #==============================================================================
  582. class Game_Interpreter
  583.   attr_reader   :event_id
  584. end


  585. #==============================================================================
  586. # 各種機能の追加 - キャラポップ/ネーム/ホールド
  587. #==============================================================================
  588. class Window_Message < Window_Base
  589.   #--------------------------------------------------------------------------
  590.   # ● カーソルの更新 *
  591.   #--------------------------------------------------------------------------
  592.   def update_cursor
  593.     if @index >= 0
  594.       x = ($game_message.face_name.empty? ? 0 : 112)
  595.       y = ($game_message.choice_start + @index) * WLH - 1
  596.       w = contents.width - x
  597.       if self.pop_character != nil
  598.         x += 28
  599.         w -= 20
  600.       end
  601.       self.cursor_rect.set(x, y, w, WLH)
  602.     else
  603.       self.cursor_rect.empty
  604.     end
  605.   end
  606.   #--------------------------------------------------------------------------
  607.   # キャラクターの取得
  608.   #   parameter : パラメータ
  609.   #--------------------------------------------------------------------------
  610.   def get_character(parameter)
  611.     # パラメータで分岐
  612.     case parameter
  613.     when -1  # プレイヤー
  614.       return $game_player
  615.     when 0  # 現在アクティブなイベント
  616.       id = $game_map.interpreter.event_id
  617.       events = $game_map.events
  618.       return events == nil ? nil : events[id]
  619.     else  # 特定のイベント
  620.       events = $game_map.events
  621.       return events == nil ? nil : events[parameter]
  622.     end
  623.   end
  624.   #--------------------------------------------------------------------------
  625.   # (メッセージ終了時)ホールドの処理
  626.   #--------------------------------------------------------------------------
  627.   def process_hold
  628.     if @window_hold
  629.       @held_windows.push(Window_Copy.new(self))
  630.       @held_windows.push(Window_Copy.new(@name_window))
  631.       @held_windows.push(Sprite_Copy.new(@name_sprite))
  632.       @held_windows.push(Sprite_Copy.new(@back_sprite))
  633.       for sprite in @extra_sprites
  634.         next if sprite.disposed?
  635.         @held_windows.push(Sprite_Copy.new(sprite))
  636.       end
  637.       @extra_sprites.clear
  638.       self.openness = 0
  639.       #@name_window.openness = 0
  640.       @back_sprite.visible = false
  641.     else
  642.       @held_windows.each {|object| object.dispose}
  643.       @held_windows.clear
  644.     end
  645.     #@name_window.close
  646.     #@name_sprite.visible = false
  647.   end
  648.   #--------------------------------------------------------------------------
  649.   # キャラポップ位置の設定と取得
  650.   #--------------------------------------------------------------------------
  651.   def pop_character=(character_id)
  652.     @pop_character = character_id
  653.   end
  654.   def pop_character
  655.     return @pop_character
  656.   end
  657.   #--------------------------------------------------------------------------
  658.   # キャラポップ時のウィンドウリサイズ
  659.   #--------------------------------------------------------------------------
  660.   def reszie_window_for_pop
  661.     #キャラポップ
  662.     if self.pop_character != nil
  663.       #max_x = @line_widths.max.to_i
  664.       #n  = max_x + 32
  665.       n = 0
  666.       n += $game_message.face_name.empty? ? 0 : 122
  667.       m  = $game_message.face_name.empty? ? 0 : 96
  668.       w  = @name_sprite.bitmap.width
  669.       self.width  = max_width + n
  670.       self.height = [@all_texts.size * line_height, m].max + 32
  671.       
  672.       #システム用の一行目を表示しない。
  673.       if $system_line or $game_switches[SYSTEM_LINE]
  674.         self.height -= line_height
  675.       end
  676.       
  677.       create_contents
  678.       update_charpop_window
  679.     elsif @info_mode
  680.       @line_aligns[0] = CENTER
  681.       self.x = - 8
  682.       self.width = Graphics.width + 16
  683.       self.height = 56
  684.       create_contents
  685.     else
  686.       self.x = 0
  687.       self.width  = Graphics.width
  688.       self.height = MAX_LINE * line_height + 32
  689.       update_placement #位置情報修正。
  690.       create_contents
  691.     end
  692.   end
  693.   #--------------------------------------------------------------------------
  694.   # ● 背景スプライトの作成
  695.   #--------------------------------------------------------------------------
  696.   alias xrxsv2_create_back_sprite create_back_sprite
  697.   def create_back_sprite
  698.     xrxsv2_create_back_sprite
  699.     @back_sprite.zoom_x = 1.0 * Graphics.width / @back_sprite.bitmap.width
  700.     @name_window = Window_Base.new(0,0,112,36)
  701.     @name_window.visible = false
  702.     @name_sprite = Sprite.new
  703.     @name_sprite.bitmap = Bitmap.new(32,32)
  704.     @name_sprite.visible = false
  705.     self.x = self.x
  706.     self.y = self.y
  707.     self.z = self.z
  708.     @held_windows = []
  709.     @extra_sprites = []
  710.   end
  711.   #--------------------------------------------------------------------------
  712.   # ● 背景スプライトの解放
  713.   #--------------------------------------------------------------------------
  714.   alias xrxsv2_dispose_back_sprite dispose_back_sprite
  715.   def dispose_back_sprite
  716.     xrxsv2_dispose_back_sprite
  717.     @name_window.dispose if @name_window != nil #メニュー画面を出そうとするとエラー?
  718.     @name_sprite.dispose if @name_sprite != nil
  719.     for window in @held_windows
  720.       window.dispose
  721.     end
  722.   end
  723.   #--------------------------------------------------------------------------
  724.   # ● 背景スプライトの更新
  725.   #--------------------------------------------------------------------------
  726.   alias xrxsv2_update_back_sprite update_back_sprite
  727.   def update_back_sprite
  728.     @name_window.update
  729.     xrxsv2_update_back_sprite
  730.     update_charpop_window
  731.   end
  732.   #--------------------------------------------------------------------------
  733.   # ウィンドウの位置と不透明度の設定 (キャラポップ)
  734.   #--------------------------------------------------------------------------
  735.   def update_charpop_window
  736.     if self.pop_character
  737.       character = get_character(self.pop_character)
  738.       return if character == nil
  739.       # [X座標]
  740.       n = self.width / 2
  741.       n = [n, @name_skin.width + 16].max if @current_name != nil
  742.       w = @name_sprite.bitmap.width
  743.       x = character.screen_x - [[n, w].max, self.width - 32].min
  744.       # [Y座標]
  745.       if self.pop_character == 0 and POP_DIRECTION #イベントの方向を考慮。
  746.         if character.direction == 2 #下向き
  747.           @position = 0 #上にポップ
  748.         elsif character.direction == 8 #上向き
  749.           @position = 2 #下にポップ
  750.         end
  751.       end
  752.       case @position
  753.       when 0
  754.         y = character.screen_y - CHARPOP_HEIGHT - self.height
  755.       else
  756.         y = character.screen_y + 16
  757.       end
  758.       x_max = Graphics.width - 4 - self.width
  759.       x_min = 4
  760.       y_max = Graphics.height - self.height
  761.       y_min = 4
  762.       self.x = [[x, x_max].min, x_min].max
  763.       self.y = [[y, y_max].min, y_min].max
  764.     end
  765.   end
  766.   #--------------------------------------------------------------------------
  767.   # 位置の連動
  768.   #--------------------------------------------------------------------------
  769.   def x=(n)
  770.     super
  771.     if @name_window
  772.       if $name_right
  773.         @name_window.x = n + self.width - @name_window.width - NAME_WINDOW_OFFSET_X
  774.         @name_sprite.x = @name_window.x + 8 + NAME_WINDOW_OFFSET_WIDTH / 2
  775.       else
  776.         @name_window.x = n + NAME_WINDOW_OFFSET_X
  777.         @name_sprite.x = @name_window.x + 8 + NAME_WINDOW_OFFSET_WIDTH / 2
  778.       end
  779.     end
  780.   end
  781.   def y=(n)
  782.     super
  783.     if @name_window
  784.       @name_window.y = n + NAME_WINDOW_OFFSET_Y
  785.       @name_sprite.y = n + NAME_WINDOW_OFFSET_Y + 2 + NAME_WINDOW_OFFSET_HIGHT / 2
  786.     end
  787.   end
  788.   def z=(n)
  789.     super
  790.     if @name_window
  791.       @name_window.z = n + 11#1 テールの上に表示されるので、Zを水増しする。
  792.       @name_sprite.z = n + 12#2
  793.     end
  794.   end
  795.   #--------------------------------------------------------------------------
  796.   # ● ファイバーのメイン処理
  797.   #--------------------------------------------------------------------------
  798.   def fiber_main_namewin
  799.     fiber_main_namewin_default
  800.     @name_window.openness = 0
  801.     @name_sprite.bitmap.clear
  802.     $name = ""
  803.   end
  804.   alias :fiber_main_namewin_default :fiber_main
  805.   alias :fiber_main :fiber_main_namewin
  806. end
  807. #==============================================================================
  808. # 伸縮対応
  809. #==============================================================================
  810. class Window_Message < Window_Base
  811.   #--------------------------------------------------------------------------
  812.   # ● ウィンドウの背景と位置の設定 [再定義]
  813.   #--------------------------------------------------------------------------
  814.   def reset_window
  815.     @background = $game_message.background
  816.     @position = $game_message.position
  817.     if @background == 0   # 通常ウィンドウ
  818.       self.opacity = 255
  819.     else                  # 背景を暗くする、透明にする
  820.       self.opacity = 0
  821.     end
  822.     case @position
  823.     when 0  # 上
  824.       self.y = 0
  825.       @gold_window.y = 360
  826.     when 1  # 中
  827.       self.y = (Graphics.height - self.height) / 2
  828.       @gold_window.y = 0
  829.     when 2  # 下
  830.       self.y = Graphics.height - self.height
  831.       @gold_window.y = 0
  832.     end
  833.   end
  834. end
  835. #==============================================================================
  836. # □ Window_Copy
  837. #------------------------------------------------------------------------------
  838. #   指定のウィンドウのコピーを作成します。
  839. #==============================================================================
  840. class Window_Copy < Window_Base
  841.   #--------------------------------------------------------------------------
  842.   # ○ オブジェクト初期化
  843.   #--------------------------------------------------------------------------
  844.   def initialize(window)
  845.     super(window.x, window.y, window.width, window.height)
  846.     self.contents = window.contents.dup unless window.contents.nil?
  847.     self.opacity = window.opacity
  848.     self.back_opacity = window.back_opacity
  849.     self.z = window.z - 3
  850.     self.visible = window.visible
  851.   end
  852. end
  853. #==============================================================================
  854. # □ Sprite_Copy
  855. #------------------------------------------------------------------------------
  856. #   指定のスプライトのコピーを作成します。
  857. #==============================================================================
  858. class Sprite_Copy < Sprite
  859.   #--------------------------------------------------------------------------
  860.   # ○ オブジェクト初期化
  861.   #--------------------------------------------------------------------------
  862.   def initialize(sprite)
  863.     super()
  864.     self.bitmap = sprite.bitmap.dup unless sprite.bitmap.nil?
  865.     self.opacity = sprite.opacity
  866.     self.x = sprite.x
  867.     self.y = sprite.y
  868.     self.z = sprite.z - 3
  869.     self.ox = sprite.ox
  870.     self.oy = sprite.oy
  871.     self.zoom_x = sprite.zoom_x
  872.     self.visible = sprite.visible
  873.   end
  874. end



  875. #■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
  876. #■吹きだしテールの表示ルーチン。
  877. #■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
  878. #==============================================================================
  879. # +++ 「+ふきだし表示」VX +++
  880. # by パラ犬  http://2d6.parasite.jp/
  881. #      ×
  882. #    row       http://xms.rdy.jp/
  883. #
  884. # publish 2010/ 3/ 2
  885. # update  -
  886. #
  887. #------------------------------------------------------------------------------
  888. #    ほぼどんなメッセージウィンドウに対しても後付け可能な「ふきだし表示」です。
  889. #  また、テール部分のみの自動追尾機能を持ちます。
  890. #   ふきだし表示をするには、
  891. #  テール用画像「Window-top」「Window-under」を
  892. #  「Graphics/System」フォルダにインポートしておく必要があります。
  893. #==============================================================================
  894. # ■ Window_Message
  895. #==============================================================================
  896. class Window_Message < Window_Base
  897.   #--------------------------------------------------------------------------
  898.   # ● メッセージの開始
  899.   #--------------------------------------------------------------------------
  900.   alias parashelf_update_all_windows update_all_windows
  901.   def update_all_windows
  902.     parashelf_update_all_windows
  903.     update_tail
  904.   end
  905.   #--------------------------------------------------------------------------
  906.   # クローズ [オーバーライド]
  907.   #--------------------------------------------------------------------------
  908.   def close
  909.     super
  910.     del_tail
  911.     @name_window.close if @name_window != nil #ネームウィンドウのクローズ動作。
  912.   end
  913.   #--------------------------------------------------------------------------
  914.   # ● 背景スプライトの更新
  915.   #--------------------------------------------------------------------------
  916.   alias parashelf_update_back_sprite update_back_sprite
  917.   def update_back_sprite
  918.     parashelf_update_back_sprite
  919.     update_tail
  920.   end
  921.   #--------------------------------------------------------------------------
  922.   # ○ フレーム更新 (ふきだしテールの更新)
  923.   #--------------------------------------------------------------------------
  924.   def update_tail
  925.     # ふきだしモードではイベントの動きに追従
  926.     if $mes_id != nil and @tail != nil
  927.       tale_pos = get_tale_pos
  928.       @tail.x = tale_pos[0]
  929.       @tail.y = tale_pos[1]
  930.       update_tail_bitmap
  931.     end
  932.   end
  933.   ##--------------------------------------------------------------------------
  934.   # ○ ふきだしテールの画像を更新。
  935.   #--------------------------------------------------------------------------
  936.   def update_tail_bitmap
  937.     skin = "Window"
  938.     skin = "Think" if $game_switches[THINK_TAIL]
  939.     if $win_x != nil
  940.       if $win_x > 0
  941.         @tail.bitmap = Cache.system(skin + "-right")
  942.       elsif  $win_x < 0
  943.         @tail.bitmap = Cache.system(skin + "-left")
  944.       else
  945.         case @position
  946.         when 0  # 上
  947.           @tail.bitmap = Cache.system(skin + "-top")
  948.         when 2  # 下
  949.           @tail.bitmap = Cache.system(skin + "-under")
  950.         end
  951.       end
  952.     else
  953.       case @position
  954.       when 0  # 上
  955.         @tail.bitmap = Cache.system(skin + "-top")
  956.       when 2  # 下
  957.         @tail.bitmap = Cache.system(skin + "-under")
  958.       end
  959.     end
  960.     # 可視状態
  961.     if self.visible == true
  962.       @tail.visible = self.openness == 255
  963.     else
  964.       @tail.visible = false
  965.     end
  966.   end
  967.   #--------------------------------------------------------------------------
  968.   # ○ テールの位置を計算
  969.   #--------------------------------------------------------------------------
  970.   def get_tale_pos
  971.     if defined?($game_system.show_stand_picture) #A1立ち絵スクリプトを入れている。
  972.       if $game_system.show_stand_picture #立ち絵on
  973.         pos = get_tale_pos_stand_pic
  974.       else
  975.         pos = get_tale_pos_normal
  976.       end
  977.     else
  978.       pos = get_tale_pos_normal
  979.     end
  980.     return pos
  981.   end
  982.   #--------------------------------------------------------------------------
  983.   # ○ テールの位置を計算/立ち絵使用時。※NAME_CHANGEの編集必須。
  984.   #--------------------------------------------------------------------------
  985.   def get_tale_pos_stand_pic
  986.     if $game_message.face_name != ""  and @tail != nil
  987.       name = A1_System::StandPicture::NAME_CHANGE[$game_message.face_name]
  988.       chara = name[$game_message.face_index][0]
  989.       if @stand_pic[chara] != nil #立ち絵無しの場合通常通り。
  990.         x = @stand_pic[chara].pic_sprite.x + @stand_pic[chara].pic_sprite.width / 2
  991.         y = get_tale_pos_normal_updown
  992.         update_tail_bitmap
  993.       else
  994.         return get_tale_pos_normal #立ち絵が見つからない場合は通常通り。
  995.       end
  996.     else
  997.       return get_tale_pos_normal #立ち絵が見つからない場合は通常通り。
  998.     end
  999.     return [x,y]
  1000.   end
  1001.   #--------------------------------------------------------------------------
  1002.   # ○ テールの位置を計算/立ち絵未使用時。
  1003.   #--------------------------------------------------------------------------
  1004.   def get_tale_pos_normal
  1005.     if $mes_id == (-2) #左右の場合は高さはウィンドウ中心。上下ならやや左に配置。
  1006.       if $win_x != nil
  1007.         if $win_x > 0
  1008.           x = $win_x - @tail.width / 2
  1009.           y = self.y + self.height / 2 - @tail.height / 2
  1010.         elsif $win_x < 0
  1011.           x = self.width - @tail.width / 2
  1012.           y = self.y + self.height / 2 - @tail.height / 2
  1013.         else
  1014.           x = MINAS_TWE_X_POS
  1015.           y = get_tale_pos_normal_updown
  1016.         end
  1017.       else
  1018.         x = MINAS_TWE_X_POS
  1019.         y = get_tale_pos_normal_updown
  1020.       end
  1021.     elsif $mes_id <= (-3) #左右の場合は高さはウィンドウ中心。上下ならやや左に配置。
  1022.       if $win_x != nil
  1023.         if $win_x > 0
  1024.           x = $win_x - @tail.width / 2
  1025.           y = self.y + self.height / 2
  1026.         elsif $win_x < 0
  1027.           x = self.width - @tail.width / 2
  1028.           y = self.y + self.height / 2
  1029.         else
  1030.           x = MINAS_THREE_X_POS
  1031.           y = get_tale_pos_normal_updown
  1032.         end
  1033.       else
  1034.         x = MINAS_THREE_X_POS
  1035.         y = get_tale_pos_normal_updown
  1036.       end
  1037.     else
  1038.       character = get_character($mes_id)
  1039.       x = [[character.screen_x - 16, self.x].max, self.x + self.width - 32].min
  1040.       if $win_x != nil
  1041.         if $win_x > 0
  1042.           x = $win_x - @tail.width / 2
  1043.           y = character.screen_y
  1044.         elsif $win_x < 0
  1045.           x = self.width
  1046.           y = character.screen_y
  1047.         else
  1048.           y = get_tale_pos_normal_updown
  1049.         end
  1050.       else
  1051.         y = get_tale_pos_normal_updown
  1052.       end
  1053.     end
  1054.     return [x, y]
  1055.   end
  1056.   #--------------------------------------------------------------------------
  1057.   # ○ テールが上下の時、かつ[-2][-3]でない時のy座標の取得。
  1058.   #--------------------------------------------------------------------------
  1059.   def get_tale_pos_normal_updown
  1060.     case @position
  1061.     when 0
  1062.       y = self.y + self.height - @tail.height / 2
  1063.     else
  1064.       y = self.y - @tail.height / 2
  1065.     end
  1066.     return y
  1067.   end
  1068.   #--------------------------------------------------------------------------
  1069.   # ○ ふきだしを破棄
  1070.   #--------------------------------------------------------------------------
  1071.   def del_tail
  1072.     if @tail != nil
  1073.       @tail.dispose
  1074.       @tail = nil
  1075.     end
  1076.   end
  1077. end
  1078. #
  1079. # ▼▲▼ XRXS 9拡張CO-X. ふきだし自動設定 ▼▲▼
  1080. #==============================================================================
  1081. # ■ Window_Message
  1082. #==============================================================================
  1083. class Window_Message < Window_Base
  1084.   #--------------------------------------------------------------------------
  1085.   # ○ ポップキャラクターの設定
  1086.   #--------------------------------------------------------------------------
  1087.   def pop_character=(character_id)
  1088.     @pop_character = character_id
  1089.     $mes_id = character_id
  1090.   end
  1091.   #--------------------------------------------------------------------------
  1092.   # ○ テールキャラクターの設定
  1093.   #--------------------------------------------------------------------------
  1094.   def tail_character=(character_id)
  1095.     #@pop_character = character_id
  1096.     $mes_id = character_id
  1097.   end
  1098. end


  1099. #==============================================================================
  1100. # ■ Window_ChoiceList
  1101. #------------------------------------------------------------------------------
  1102. #  イベントコマンド[選択肢の表示]で、Y座標を修正します。
  1103. #==============================================================================
  1104. class Window_ChoiceList < Window_Command
  1105.   #--------------------------------------------------------------------------
  1106.   # ● ウィンドウ位置の更新
  1107.   #--------------------------------------------------------------------------
  1108.   def update_placement_hukidasi
  1109.     #self.width = [max_choice_width + 12, 96].max + padding * 2
  1110.     #self.width = [width, Graphics.width].min
  1111.     #self.height = fitting_height($game_message.choices.size)
  1112.     #self.x = Graphics.width - width
  1113.     #if @message_window.y >= Graphics.height / 2
  1114.     #  self.y = @message_window.y - height
  1115.     #else
  1116.     #  self.y = @message_window.y + @message_window.height
  1117.     #end
  1118.     update_placement_hukidasi_default
  1119.     if self.y + self.height > Graphics.height
  1120.       self.y -= ( ( self.height + self.y ) - Graphics.height)
  1121.       self.z += 100
  1122.     end
  1123.   end
  1124.   alias :update_placement_hukidasi_default :update_placement
  1125.   alias :update_placement :update_placement_hukidasi
  1126. end

  1127. #==============================================================================
  1128. # ■ Scene_Menu
  1129. #------------------------------------------------------------------------------
  1130. #  メニューを開いてからウィンドウが出るとネームウィンドウが表示される不具合修正。
  1131. #==============================================================================
  1132. #class Scene_Menu < Scene_MenuBase
  1133. #  def terminate_hukidasi_menyu
  1134. #    @name_window.openness = 0 if @name_window != nil
  1135. #    terminate_hukidasi_menyu_default
  1136. #  end
  1137. #  alias :terminate_hukidasi_menyu_default :terminate
  1138. #  alias :terminate :terminate_hukidasi_menyu
  1139. #end

  1140. #■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
  1141. #■ウィンドウ非表示ルーチン
  1142. #■吹きだしテールとネームウィンドウに対応。
  1143. #■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
  1144. #==============================================================================
  1145. # L(キーボードのQ)を押すと、メッセージウィンドウを表示・非表示
  1146. #==============================================================================
  1147. class Window_Message < Window_Base
  1148.   def update_winoff
  1149.     unless $game_party.in_battle #バトル中は無効。
  1150.       if Input.trigger?(Input::L)
  1151.         if self.visible == true
  1152.           self.visible = false
  1153.           @background = 777 if @back_sprite != nil and @background == 1 #「背景を暗くする」
  1154.           @tail.visible = false if @tail != nil
  1155.         else
  1156.           self.visible = true
  1157.           @background = 1 if @back_sprite != nil and @background == 777 #「背景を暗くする」
  1158.         end
  1159.         if @name_window != nil
  1160.           if @name_window.visible == false and $name != nil and $name != ""
  1161.             @name_window.visible = true
  1162.             @name_sprite.visible = true
  1163.           else
  1164.             @name_window.visible = false
  1165.             @name_sprite.visible = false
  1166.           end
  1167.         end
  1168.       elsif Input.trigger?(Input::C) or Input.trigger?(Input::B)
  1169.         if self.visible == false
  1170.           self.visible = true
  1171.           @back_sprite.visible = true unless @back_sprite
  1172.         end
  1173.         @tail.visible = true if @tail != nil and @tail.visible == false
  1174.         if @name_window != nil and $name != nil
  1175.           if $name != ""
  1176.             @name_window.visible = true
  1177.             @name_sprite.visible = true
  1178.           end
  1179.         end
  1180.       end
  1181.     end
  1182.     update_winoff_default
  1183.   end
  1184.   alias :update_winoff_default :update
  1185.   alias :update :update_winoff
  1186. end


  1187. #■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
  1188. #■ウィンドウ表示位置指定ルーチン
  1189. #■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
  1190. #===========================================================================
  1191. #イベントコマンド「スクリプト」を使い、
  1192. #$win_x=100 
  1193. #$win_y=100
  1194. #と入力すれば、ウィンドウを(100、100)の位置に表示します。
  1195. #使わない時は
  1196. #$win_x=nil
  1197. #などとnilを入力しておいてください。
  1198. #===========================================================================
  1199. class Window_Message < Window_Base
  1200.   #--------------------------------------------------------------------------
  1201.   # ● ウィンドウの背景と位置の設定 [再定義]
  1202.   #--------------------------------------------------------------------------
  1203.   def update_placement_position
  1204.     update_placement_position_default
  1205.     if $win_x != nil
  1206.       if $win_x > 0
  1207.         self.x = $win_x
  1208.         self.width -= $win_x
  1209.       else
  1210.         self.x = 0
  1211.         self.width += $win_x
  1212.       end
  1213.     end
  1214.     if $win_y != nil
  1215.       self.y = $win_y
  1216.     end
  1217.     #上表示の時、ネームウィンドウが見切れるので少し下にずらす。
  1218.     if self.y == 0 and @position == 0 and @name_window != nil and $name != nil
  1219.       self.y += (-NAME_WINDOW_OFFSET_Y)
  1220.     end
  1221.   end
  1222.   alias_method :update_placement_position_default, :update_placement
  1223.   alias_method :update_placement, :update_placement_position
  1224. end


  1225. #==============================================================================
  1226. # ■ SceneManager
  1227. #------------------------------------------------------------------------------
  1228. #  シーン遷移のさい、テールを破棄。ネームウィンドウのデータをクリア。
  1229. #==============================================================================
  1230. module SceneManager
  1231.   #--------------------------------------------------------------------------
  1232.   # ● 呼び出し
  1233.   #--------------------------------------------------------------------------
  1234.   def self.call_sceman_hukidasi(scene_class)
  1235.     if defined?(self.scene.message_window)
  1236.       self.scene.message_window.del_tail if self.scene.message_window.tail != nil
  1237.       $name = ""
  1238.     end
  1239.     @stack.push(@scene)
  1240.     @scene = scene_class.new
  1241.   end
  1242.   #--------------------------------------------------------------------------
  1243.   # ● クラスメソッドのエイリアス
  1244.   #--------------------------------------------------------------------------
  1245.   class << self
  1246.     alias :call_sceman_hukidasi_default :call
  1247.     alias :call :call_sceman_hukidasi
  1248.   end
  1249. end

  1250. #==============================================================================
  1251. # ■ Scene_Map
  1252. #------------------------------------------------------------------------------
  1253. #  戦闘トランジションのさい、テールを破棄。
  1254. #==============================================================================
  1255. class Scene_Map < Scene_Base
  1256.   attr_accessor :message_window
  1257.   #--------------------------------------------------------------------------
  1258.   # ● 戦闘前トランジション実行
  1259.   #--------------------------------------------------------------------------
  1260.   def perform_battle_transition_hukidasi
  1261.     @message_window.del_tail #テールの破棄
  1262.     perform_battle_transition_hukidasi_default
  1263.   end
  1264.   alias_method :perform_battle_transition_hukidasi_default, :perform_battle_transition
  1265.   alias_method :perform_battle_transition, :perform_battle_transition_hukidasi
  1266. end
复制代码

评分

参与人数 1梦石 +1 收起 理由
迷糊的安安 + 1 认可答案 附赠66RPG提供的精美好人卡一张^^.

查看全部评分

tseyik 发表于 2013-1-27 16:28:01
本帖最后由 tseyik 于 2013-1-27 16:52 编辑

你改用個巴
追加機能
追加点は、\{ 或 \} 可簡単変更文字大小。考慮圖示表示可能(需A1的考慮圖示Window_Popup.png)
使用例:
\}\h[0]\C[5]\C[0] #名前が薄紫文字 ※一般モブ
\}\h[0]\C[4]\C[0] #名前が青文字 ※イベント
\}\h[0]\C[5]◆???\C[0] #名前が薄紫文字 ※一般モブ
\}\h[0]\C[31]◆???\C[0] #名前が紫っぽい文字 ※イベント

吹きだしウィンドウVXAce改
  1. # ===========================================================================
  2. # ◆ 吹きだしウィンドウVXAce改 ◆
  3. #
  4. # バージョン    : 1.00 (2012/08/16)
  5. # 作者          : 名も無き絵かき
  6. # URL      : http://nonameillustrator.blog.fc2.com/
  7. #
  8. # 改変元作者      : tamura様
  9. # 改変元公開URL    : http://tamurarpgvx.blog137.fc2.com/
  10. # 改変元スクリプトver : 2012/05/12改訂版
  11. #
  12. # 原板スクリプト製作者 : ちいさな本屋様
  13. # 原板スクリプト公開元 : http://xrxs.at-ninja.jp/
  14. # 原板スクリプト名   : ★メッセージ表示フルグレードアップVX(RGSS2専用)
  15. #
  16. # ---------------------------------------------------------------------------
  17. # 更新履歴   :2012/08/16 Ver1.00 思考テール及び、フォントサイズの最適化
  18. #
  19. #
  20. # ---------------------------------------------------------------------------
  21. =begin
  22. ※このスクリプトは“ちいさな本屋様”及び“tamura様”のスクリプトを改変したものです。
  23. 原板及び改変元は上記に記載してありますので、そちらを御覧ください。

  24. ●追加機能の説明
  25. ・メッセージ機能の“\{”“\}”を使うことにより、メッセージの文字サイズを任意の
  26.  大きさに変更出来る。
  27. ・ゲームスイッチの切り替えにより、思考テールとの切り替えが出来るようになった。
  28. □使用方法
  29. ・改変ポイントの MESFONT_MAKE の数値を変更することにより、文字サイズを変更できる。
  30. ※デフォルトサイズ( \{ や \} を使用しない場合のサイズ)は0と同値。
  31.  また、メッセージウィンドウのサイズが MESFONT_SIZE_SMALL の大きさに強制変更
  32.  されますのでご注意ください。

  33. ・THINK_SWITCHES の数値を変更することで、対応するスイッチ番号を変更可能。
  34. ※初期設定だと20番のスイッチが指定されている。


  35. ===ここから下の説明文は、tamura様のものをそのまま引用しています===

  36. ※※警告※※
  37. 「立ち絵機能」をONにしている時に、立ち絵を表示せずに、ウィンドウ位置を
  38. 右か左に変更した時、テールのY座標がずれるようです。
  39. 原因は調査中です。立ち絵を表示しない時は、イベントコマンド「注釈」で、
  40. 「立ち絵表示 off」と記述して立ち絵機能をOFFにしておいてください。

  41. ●機能一覧
  42. ・イベントコマンド「スクリプト」で、$win_x $win_yに値を入力すると、
  43.  ($win_x 、$win_y)の位置にウィンドウを表示する。画面左上が(0,0)。

  44. ・キーボードのQ(装備画面で前のキャラに戻るボタン)を押すと、
  45.  ウィンドウが消える。Qか決定、キャンセルキーで元に戻る。

  46. ・文章のどこでもいいので、以下の表記を行う。
  47. ・ \name[] : []の中の文字を、ウィンドウ左上に小さく表示する。
  48.  表示させる名前には、制御文字 \V、\P、\N、\G が使用可能。

  49. \h[-1] : プレーヤーの上にウィンドウをポップ。
  50. \h[0] : 現在アクティブのイベントの上にウィンドウをポップ。
  51. \h[1] : IDが1番のイベントの上にウィンドウをポップする。
  52. hは大文字でもOK。

  53. ウィンドウは通常の大きさのまま、テールだけ表示したい場合は、
  54. \t[-2] : ウィンドウが上下に表示される時は、X座標をMINAS_TWE_X_POSで固定。
  55.            $win_x で左右に表示される時は、Y座標がウィンドウの中心やや下で固定。
  56. \t[-3] : ウィンドウが上下に表示される時は、X座標をMINAS_THREE_X_POSで固定。
  57.            $win_x で左右に表示される時は、Y座標がウィンドウの中心やや下で固定。
  58. \t[-1] : プレーヤーの上に向かってテール表示。
  59. \t[0] : 現在アクティブのイベントに向かってテール表示。
  60. \t[1] : IDが1番のイベントの上に向かってテール表示。

  61. \O[128] : 文字を透明にする。128はalphaの値で、0で透明、255で通常。
  62. \D : 文字に影をつける
  63. \hold : メッセージ表示の、最後の文章に限定。
  64.      メッセージが終わっても、ウィンドウを閉じずに残します。
  65.      他のメッセージが表示されて次へ送られる時に消えます。
  66.      なお、ホールドされているウィンドウは、Qボタンで消せません。


  67. ●その他
  68. ・ACEに標準装備されている機能は通常通り使用できます。
  69. ・A1殿(http://a1tktk.web.fc2.com/)の立ち絵スクリプトに対応しています。
  70.  このスクリプトの上に「RGSS3用A1共通処理」
  71.  このスクリプトの下に「空メッセージでウィンドウを開かない」「立ち絵表示」を
  72.  配置して下さい。
  73.  残念ながら、「ネームウィンドウ」は使えません。上記\nameをお使いください。
  74. ※立ち絵を表示しない時は、注釈で「立ち絵表示 off」とした方が無難です。
  75. ・イベントの下から話しかけたら上へポップ、上から話しかけたら下へポップするという
  76.  機能を追加。カスタマイズポイントで POP_DIRECTION = ture と変更のこと。


  77. ●廃止機能 
  78. ・\Iがすでに使われているので、イタリック文字変換を廃止。
  79. ・スピード変更、改行、最後に入手したアイテムの表示を、ACE化にともない廃止。


  80. 【tamura様改訂履歴】
  81. 2012.01.10  ・ウィンドウを消したまま次のウィンドウを自動で表示すると、
  82.               ネームウィンドウが表示されるのを修正。
  83. 2012.01.11  ・ネームウィンドウが出しっぱなしになるのを修正。
  84. 2012.01.12  ・メニューを出してから決定ボタンを押すとネームウィンドウがでる不具合の修正。
  85. 2012.02.01 ・ネームウィンドウのオープン&クローズのタイミングを変更。
  86.       ・hold機能を追加。
  87. 2012.02.10 ・キャラポップした時、一行ずつしか表示されない不具合を修正。
  88. 2012.02.14 ・アイテム名などの文字数が正常に取得できなかったのを修正。
  89. 2012.02.21 ・話しかけられた方向によって、ポップ方向を変えられるようにした。
  90. 2012.02.25 ・すべてのシーン遷移の際はテールを破棄(イベント中でショップ起動など)
  91. 2012.02.28 ・エスケープ文字の処理が上手くいかない問題について暫定対策。
  92. 2012.03.05 ・微妙にウィンドウ幅が足りない時があったので、僅かにウィンドウ幅追加。
  93. 2012.03.14 ・ポップアップ時の顔グラ表示に対応。
  94. 2012.04.20 ・吹きだしが大型になると選択肢が入りきらない不具合の修正。
  95.             ・ネームウィンドウが残ったままシーン遷移があると、ネームウィンドウが
  96.              閉じない不具合の修正。
  97. 2012.05.02  ・名前には、制御文字 \V、\P、\N、\G が使用可能。
  98.             ・\V については、2段階の入れ子が使用可能。
  99.             ・ウィンドウ消去機能を、「背景を暗くする」に対応。
  100. 2012.05.09 ・通常の上表示のとき、ネームウィンドウが見切れるので少し下にずらす。
  101. 2012.05.12 ・ネームウィンドウの幅と高さを変更可能にした。
  102.             ・ネームウィンドウの高さを変えると、どんどん下に伸びるのを修正。

  103. =end
  104. #==============================================================================
  105. # 改変ポイント
  106. #==============================================================================
  107. MESFONT_MAKE = 5 # \{ や \} を使用した場合のサイズ変更
  108. MESFONT_SIZE_BIG = 64 - MESFONT_MAKE # \{ を用いた場合のサイズ
  109. MESFONT_SIZE_SMALL = 24 - MESFONT_MAKE # \} を用いた場合のサイズ

  110. THINK_SWITCHES = 20 #ここで設定した数値のスイッチ番号がONの時に限り、
  111.                      #吹き出しが思考テール
  112. #==============================================================================
  113. # ■ Window_Base
  114. #------------------------------------------------------------------------------
  115. #  ゲーム中の全てのウィンドウのスーパークラスです。
  116. #==============================================================================
  117. class Window_Base < Window
  118.   #--------------------------------------------------------------------------
  119.   # ● フォントを大きくする
  120.   #--------------------------------------------------------------------------
  121.   def make_font_bigger
  122.     contents.font.size += MESFONT_MAKE if contents.font.size <= MESFONT_SIZE_BIG
  123.   end
  124.   #--------------------------------------------------------------------------
  125.   # ● フォントを小さくする
  126.   #--------------------------------------------------------------------------
  127.   def make_font_smaller
  128.     contents.font.size -= MESFONT_MAKE if contents.font.size >= MESFONT_SIZE_SMALL
  129.   end
  130. end
  131. #==============================================================================
  132. # カスタマイズポイント
  133. #==============================================================================
  134. #=begin
  135. class Window_Message < Window_Base
  136.   #
  137.   # 基本行数
  138.   #
  139.   MAX_LINE = 4
  140.   #
  141.   # \p[] - キャラポップの高さ
  142.   #
  143.   CHARPOP_HEIGHT = 40
  144.   #
  145.   #
  146.   #\name[]で表示されるウィンドウのX座標、Y座標、幅、高さ。
  147.   #座標は、メッセージウィンドウの左上端が原点。名前はウィンドウ中央に表示。
  148.   NAME_WINDOW_OFFSET_X =   0
  149.   NAME_WINDOW_OFFSET_Y = -30
  150.   NAME_WINDOW_OFFSET_WIDTH = 32
  151.   NAME_WINDOW_OFFSET_HIGHT = 10
  152.   
  153.   #
  154.   #
  155.   MINAS_TWE_X_POS = 100 # $t[-2]のときの、テールのX座標。
  156.   MINAS_THREE_X_POS = 444 # $t[-3]のときの、テールのX座標。
  157.   
  158.   POP_DIRECTION = true#false #イベントの方向を考慮。
  159. end

  160. #(メモ)上表示で、ネームウィンドウのために少し下にずらす機能は、
  161. #再定義したupdate_placement_positionのところ。

  162. #==============================================================================
  163. # 参照機能
  164. #==============================================================================
  165. class Game_Temp
  166.   attr_accessor :last_gain_material
  167.   attr_accessor :last_gain_holder
  168. end
  169. #==============================================================================
  170. # フルグレードアップベース - 制御文字・基本機能
  171. #==============================================================================
  172. class Window_Message < Window_Base
  173.   attr_accessor :tail
  174.   #--------------------------------------------------------------------------
  175.   # ● 特殊文字の変換 + 準備
  176.   #     変換・消去してもいい部分を処理、フラグのセット。
  177.   #--------------------------------------------------------------------------
  178.   alias xrxsv2_convert_escape_characters convert_escape_characters
  179.   def convert_escape_characters(text)
  180.     #@textsが使いずらいので、ここで別変数に保管。
  181.     @all_texts = []
  182.     str = text.gsub(/\\/) { "\e" }
  183.     @all_texts = str.split("\n")
  184.    
  185.     #この段階で、変数・アクター名を変換してしまう。
  186.     #ネームウィンドウ内の文字を変換するため。
  187.     text = convert_escape_characters_easy(text)
  188.    
  189.     # 初期化
  190.     contents.font.size   = MESFONT_SIZE_SMALL #Font.default_size
  191.     contents.font.bold   = Font.default_italic
  192.     contents.font.italic = Font.default_bold
  193.     contents.font.shadow = Font.default_shadow
  194.     @type_wait = 0
  195.     @line_widths = []
  196.     @line_aligns = []
  197.     self.pop_character = nil
  198.     # ウィンドウ保持指定\holdがあるか?
  199.     @window_hold = (text.gsub!(/\\hold/) { "" } != nil)
  200.     # \info
  201.     @info_mode = (text.gsub!(/\\info/) { "" } != nil)
  202.     # 改行削除指定\_があるか?
  203.     if (/\\_(.*?)\x00/.match(@text)) != nil
  204.       $game_message.choice_start -= 1
  205.       text.gsub!(/\\_(.*?)\x00/) { $1.to_s }
  206.     end
  207.     # \name 判定
  208.     if text.sub!(/\\[Nn]ame\[(.*?)\]/) { "" }
  209.       name = $1
  210.       bitmap = @name_sprite.bitmap
  211.       w = [bitmap.text_size(name).width, 1].max + NAME_WINDOW_OFFSET_WIDTH
  212.       bitmap.dispose
  213.       @name_sprite.bitmap = Bitmap.new(w, 32)
  214.       bitmap = @name_sprite.bitmap
  215.       bitmap.draw_text(0, 0, bitmap.width, bitmap.height, name)
  216.       @name_window.width = w + 16
  217.       @name_window.height = bitmap.height + NAME_WINDOW_OFFSET_HIGHT
  218.       @name_window.create_contents
  219.       @name_window.open if @name_window.openness == 0
  220.       if self.visible #名前だけ表示されるのを防止。
  221.         @name_window.visible = true
  222.         @name_sprite.visible = true
  223.       else
  224.         @name_window.visible = false
  225.         @name_sprite.visible = false
  226.       end
  227.     else
  228.       @name_window.visible = false
  229.       @name_sprite.visible = false
  230.       @name_sprite.bitmap.dispose
  231.       @name_sprite.bitmap = Bitmap.new(32,32)
  232.     end
  233.     $name = $1 #あれこれで使うので、ネームウィンドウに表示予定の名前を取得。
  234.     # キャラボップモード
  235.     if text.gsub!(/\\[Hh]\[-1\]/) { "" }
  236.       self.pop_character = -1
  237.     elsif text.gsub!(/\\[Hh]\[([0-9]+)\]/) { "" }
  238.       self.pop_character = $1.to_i
  239.     elsif text.gsub!(/\\[Hh]/) { "" }
  240.       self.pop_character = 0
  241.     #テール表示モード
  242.     elsif text.gsub!(/\\[Tt]\[-1\]/) { "" }
  243.       self.tail_character = -1
  244.     elsif text.gsub!(/\\[Tt]\[-2\]/) { "" }
  245.       self.tail_character = -2
  246.     elsif text.gsub!(/\\[Tt]\[-3\]/) { "" }
  247.       self.tail_character = -3
  248.     elsif text.gsub!(/\\[Tt]\[([0-9]+)\]/) { "" }
  249.       self.tail_character = $1.to_i
  250.     elsif text.gsub!(/\\[Tt]/) { "" }
  251.       self.tail_character = 0
  252.     else
  253.       self.pop_character = nil
  254.     end
  255.    
  256.     # 制御文字処理
  257.     text = xrxsv2_convert_escape_characters(text)
  258.     text.gsub!(/\\[Ss]\[([0-9]+)\]/i) { "\eS[#{$1}]" }
  259.     text.gsub!(/\\[Oo]\[([0-9]+)\]/i) { "\eO[#{$1}]" }
  260.     text.gsub!(/\\last_holder/i) { "\e18" }
  261.     text.gsub!(/\\last_material/i) { "\e19" }
  262.     text.gsub!(/\\B/) { "\eB" }
  263.     text.gsub!(/\\D/) { "\eD" }
  264.     #text.gsub!(/\\n/) { "\n" }
  265.     #
  266.     # ライン情報の取得
  267.     rxs = ["\x01","\x02","\x03","\x04","\x05","\x06","\x07","\x08",
  268.       /\[([0-9]+)\]/,
  269.       "\x11","\x12","\x13","\x14", "\x15", "\x16", "\x17", "\x18","\x19"]
  270.     lines = text.split("\x00")
  271.     @lines_max = lines.size
  272.     for i in 0...@lines_max
  273.       line = lines[i]
  274.       for rx in rxs
  275.         line.gsub!(rx) {""}
  276.       end
  277.       @line_aligns[i] =
  278.         line.sub!(/\\center/) {""} ? CENTER :
  279.         line.sub!(/\\right/)  {""} ? RIGHT :
  280.                                      AUTO
  281.       # 行の横幅の取得と設定
  282.       cx = text_width_no_escape(line,text)#test
  283.       #cx = contents.text_size(line,text).width
  284.       @line_widths[i] = cx
  285.     end
  286.     # 位置揃え制御文字の削除
  287.     text.gsub!(/\\center/) {""}
  288.     text.gsub!(/\\right/) {""}
  289.     # キャラポップ時のウィンドウリサイズ
  290.     reszie_window_for_pop
  291.    
  292.     del_tail # if @tail != nil
  293.     # $mes_id が空のときと戦闘中はふきだしを表示しない
  294.     if defined?($game_system.show_stand_picture) #立ち絵に対応。
  295.       $mes_id = -1 if $game_system.show_stand_picture == true
  296.     end
  297.     if $mes_id != nil and not $game_party.in_battle
  298.       # ふきだしのテールを描画
  299.       skin = "Window"
  300.       if @background == 0
  301.         #画像の準備
  302.         @tail = Sprite.new
  303.         @tail.visible = false
  304.         # 位置を取得
  305.         tale_pos = get_tale_pos
  306.         if $win_x != nil
  307.           if $win_x > 0
  308.             @tail.bitmap = Cache.system(skin + "-right")
  309.             @tail.x = tale_pos[0]
  310.             @tail.y = tale_pos[1]
  311.             @tail.z = self.z + 1
  312.           elsif  $win_x < 0
  313.             @tail.bitmap = Cache.system(skin + "-left")
  314.             @tail.x = tale_pos[0]
  315.             @tail.y = tale_pos[1]
  316.             @tail.z = self.z + 1
  317.           else
  318.             create_tail_up_under
  319.           end
  320.         else
  321.           create_tail_up_under
  322.         end
  323.         # エクストラスプライトに登録
  324.         @extra_sprites = [] if @extra_sprites.nil?
  325.         @extra_sprites.push(@tail) if @tail != nil
  326.         # 更新
  327.         update_tail
  328.       end
  329.     end

  330.     open_and_wait #リサイズが終わった時点でウィンドウオープン。
  331.    
  332.     return text
  333.   end
  334.   #--------------------------------------------------------------------------
  335.   # ● 制御文字の変換。
  336.   #    変数・パーティ名・アクター名・所持金のみ変換する。
  337.   #    文字「\」はエスケープ文字(\e)に変換。
  338.   #--------------------------------------------------------------------------
  339.   def convert_escape_characters_easy(text)
  340.     result = text.to_s.clone
  341.     result.gsub!(/\\[vV]\[/)          { "\eV\[" }
  342.     result.gsub!(/\\[nN]\[/)          { "\eN\[" }
  343.     result.gsub!(/\\[pP]\[/)          { "\eP\[" }
  344.     result.gsub!(/\\[gG]/)          { "\eG" }
  345.     result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
  346.     result.gsub!(/\eV\[(\d+)\]/i) { $game_variables[$1.to_i] }
  347.     result.gsub!(/\eN\[(\d+)\]/i) { actor_name($1.to_i) }
  348.     result.gsub!(/\eP\[(\d+)\]/i) { party_member_name($1.to_i) }
  349.     result.gsub!(/\eG/i)          { Vocab::currency_unit }
  350.     result
  351.   end
  352.   #--------------------------------------------------------------------------
  353.   # ● 文字の長さを取得する。エスケープ文字は含まない。
  354.   # line : 表示しようとしている全ての文字列。
  355.   # text : その列の文字。
  356.   #--------------------------------------------------------------------------
  357.   def text_width_no_escape(line , text_o)
  358.     add = 5 #微妙に足りないので水増し。
  359.     text = Marshal.load(Marshal.dump(text_o))
  360.     text.gsub!(/\ehold/) { "" }
  361.     text.gsub!(/\einfo/) { "" }
  362.     # 改行削除指定\_があるか?
  363.     if (/\\_(.*?)\x00/.match(@text)) != nil
  364.       $game_message.choice_start -= 1
  365.       text.gsub!(/\\_(.*?)\x00/) { "" }
  366.     end
  367.     # \name 判定
  368.     text.sub!(/\e[Nn]ame\[(.*?)\]/) { "" }
  369.     text.gsub!(/\e[Hh]\[-1\]/) { "" }
  370.     text.gsub!(/\e[Hh]\[([0-9]+)\]/) { "" }
  371.     text.gsub!(/\e[Hh]/) { "" }
  372.     text.gsub!(/\e[Tt]\[-1\]/) { "" }
  373.     text.gsub!(/\e[Tt]\[-2\]/) { "" }
  374.     text.gsub!(/\e[Tt]\[-3\]/) { "" }
  375.     text.gsub!(/\e[Tt]\[([0-9]+)\]/) { "" }
  376.     text.gsub!(/\e[Tt]/) { "" }
  377.     # 制御文字処理
  378.     text.gsub!(/\e[Ss]\[([0-9]+)\]/i) { "" }
  379.     text.gsub!(/\e[Oo]\[([0-9]+)\]/i) { "" }
  380.     text.gsub!(/\elast_holder/i) { "" }
  381.     text.gsub!(/\elast_material/i) { "" }
  382.     #text.gsub!(/\eV/) { "" } #変数に置き換える。
  383.     #text.gsub!(/\eN/) { "" } #名前へ置き換える。
  384.     #text.gsub!(/\eP/) { "" } #名前へ置き換える。
  385.     #text.gsub!(/\eG/) { "" } #金額へ置き換える。
  386.     #text.gsub!(/\eC/) { "" }
  387.     text.gsub!(/\eB/) { "" }
  388.     text.gsub!(/\eD/) { "" }
  389.     if text =~ /\eI/
  390.       loop do
  391.         if str = text.sub!(/\eI\[(\d+)\]/){ "" }
  392.           add += 24
  393.         else
  394.           break
  395.         end
  396.       end
  397.     end
  398.     #text.gsub!(/\\n/) { "\n" }
  399.     text.sub!(/\ecenter/) {""}
  400.     text.sub!(/\eright/)  {""}
  401.     text.gsub!(/\ecenter/) {""}
  402.     text.gsub!(/\eright/) {""}
  403.    
  404.     text = xrxsv2_convert_escape_characters(text)
  405.     basic_width = text_size(text).width + add
  406.     esc = text.scan(/\e(\S)/)
  407.     return ( basic_width - esc.size * (contents.font.size - 4) ) #\eの幅は20?
  408.   end
  409.   #--------------------------------------------------------------------------
  410.   # ● 最も長い列の長さを調べる。エスケープ文字は含まない。
  411.   #--------------------------------------------------------------------------
  412.   def max_width
  413.     text_size = []
  414.     for i in 0 ... @all_texts.size
  415.       text_size.push text_width_no_escape(@all_texts[i],@all_texts[i]) + 20
  416.     end
  417.     return text_size.max
  418.   end
  419.   #--------------------------------------------------------------------------
  420.   # ● 吹きだしテールが上か下の場合の画像を準備。
  421.   #--------------------------------------------------------------------------
  422.   def create_tail_up_under
  423.     skin = "Window"
  424.     tale_pos = get_tale_pos
  425.     case @position
  426.     when 0  # 上
  427.       @tail.bitmap = Cache.system(skin + "-top")
  428.       @tail.x = tale_pos[0]
  429.       @tail.y = tale_pos[1]
  430.       @tail.z = self.z + 1
  431.     when 1  # 中
  432.       @tail.dispose
  433.       @tail = nil
  434.     when 2  # 下
  435.       @tail.bitmap = Cache.system(skin + "-under")
  436.       @tail.x = tale_pos[0]
  437.       @tail.y = tale_pos[1]
  438.       @tail.z = self.z + 1
  439.     end
  440.   end
  441.   #--------------------------------------------------------------------------
  442.   # ● 全テキストの処理
  443.   #--------------------------------------------------------------------------
  444.   def process_all_text
  445.     #open_and_wait #リサイズがあるので、すぐにウィンドウをオープンしない。
  446.     text = convert_escape_characters($game_message.all_text)
  447.     pos = {}
  448.     new_page(text, pos)
  449.     process_character(text.slice!(0, 1), text, pos) until text.empty?
  450.   end

  451.   #--------------------------------------------------------------------------
  452.   # ● メッセージの更新 *
  453.   #--------------------------------------------------------------------------
  454.   def update_message
  455.     @wait_count = @type_wait
  456.     loop do
  457.       c = @text.slice!(/./m)
  458.       case update_message_type(c)
  459.       when 1
  460.         break
  461.       when 2
  462.         next
  463.       end
  464.       break unless @show_fast or @line_show_fast
  465.     end
  466.   end
  467.   #--------------------------------------------------------------------------
  468.   # 一文字の描画 (返り値 1:break, 2:next)
  469.   #--------------------------------------------------------------------------
  470. #=begin
  471.   def process_escape_character(code, text, pos)
  472.     case code.upcase
  473.     when '
  474.       @gold_window.open
  475.     when '.'
  476.       wait(15)
  477.     when '|'
  478.       wait(60)
  479.     when '!'
  480.       input_pause
  481.     when '>'
  482.       @line_show_fast = true
  483.     when '<'
  484.       @line_show_fast = false
  485.     when '^'
  486.       @pause_skip = true
  487.     #when 'n'                      # 改行
  488.     #  new_line
  489.     #  max = MAX_LINE
  490.     #  max = 14 if self.pop_character != nil
  491.     #  if @line_count >= max      # 行数が最大のとき
  492.     #    unless @text.empty?           # さらに続きがあるなら
  493.     #      self.pause = true           # 入力待ちを入れる
  494.           #return 1
  495.     #    end
  496.     #  end
  497.     #when 'S'                       # \S[n]  (スピード変更)
  498.     #  text.sub!(/\[([0-9]+)\]/, "")
  499.     #  @type_wait = $1.to_i
  500.     #  return 2
  501.     when 'O'                       # \O 文字を透明にする。
  502.       text.sub!(/\[([0-9]+)\]/, "")
  503.       contents.font.color.alpha = $1.to_i
  504.       #return 2
  505.     when 'D' #\D 文字に影をつける
  506.       contents.font.shadow ^= true
  507.     #when '18'
  508.     #  name = ($game_temp.last_gain_holder.name rescue "")
  509.     #  update_message_type_draw_at(name)
  510.     #when '19'
  511.     #  item = ($game_temp.last_gain_material.item rescue nil)
  512.     #  draw_item_name(item, @contents_x, @contents_y)
  513.     #  @contents_x += 196
  514.     else
  515.       super
  516.     end
  517.         
  518.   end
  519. #=end
  520.   #--------------------------------------------------------------------------
  521.   # ● 改ページ処理
  522.   #--------------------------------------------------------------------------
  523.   alias xrxsv2_new_page new_page
  524.   def new_page(text, pos)
  525.     xrxsv2_new_page(text, pos)
  526.     update_charpop_window
  527.   end
  528.   #--------------------------------------------------------------------------
  529.   # ● 改行位置の取得
  530.   #--------------------------------------------------------------------------
  531.   #def new_line_x
  532.   #  $game_message.face_name.empty? ? 0 : 112
  533.   #end
  534.   #--------------------------------------------------------------------------
  535.   # ● 改行処理
  536.   #--------------------------------------------------------------------------
  537.   alias xrxsv2_new_line_x new_line_x
  538.   def new_line
  539.     xrxsv2_new_line
  540.     set_align
  541.   end
  542.   #--------------------------------------------------------------------------
  543.   # 位置揃え
  544.   #--------------------------------------------------------------------------
  545.   def set_align
  546.     w = @line_widths[@line_count].to_i
  547.     a = @line_aligns[@line_count]
  548.     case a
  549.     when CENTER
  550.       @contents_x = @contents_x + ((contents.width - @contents_x) - w) / 2
  551.     when RIGHT
  552.       @contents_x = contents.width - w
  553.     end
  554.   end
  555.   #--------------------------------------------------------------------------
  556.   # ● ファイバーのメイン処理 ☆再定義
  557.   #--------------------------------------------------------------------------
  558.   def fiber_main
  559.     $game_message.visible = true
  560.     update_background
  561.     update_placement
  562.     loop do
  563.       process_all_text if $game_message.has_text?
  564.       process_input
  565.       $game_message.clear
  566.       @gold_window.close
  567.       process_hold #ホールドウィンドウの処理。
  568.       Fiber.yield
  569.       break unless text_continue?
  570.     end
  571.     close_and_wait
  572.     $game_message.visible = false
  573.     @fiber = nil
  574.   end
  575.   #--------------------------------------------------------------------------
  576.   # 定数
  577.   #--------------------------------------------------------------------------
  578.   AUTO   = 0
  579.   LEFT   = 1
  580.   CENTER = 2
  581.   RIGHT  = 3
  582. end
  583. #==============================================================================
  584. # アクティブイベント取得
  585. #==============================================================================
  586. class Game_Interpreter
  587.   attr_reader   :event_id
  588. end


  589. #==============================================================================
  590. # 各種機能の追加 - キャラポップ/ネーム/ホールド
  591. #==============================================================================
  592. class Window_Message < Window_Base
  593.   #--------------------------------------------------------------------------
  594.   # ● カーソルの更新 *
  595.   #--------------------------------------------------------------------------
  596.   def update_cursor
  597.     if @index >= 0
  598.       x = ($game_message.face_name.empty? ? 0 : 112)
  599.       y = ($game_message.choice_start + @index) * WLH - 1
  600.       w = contents.width - x
  601.       if self.pop_character != nil
  602.         x += 28
  603.         w -= 20
  604.       end
  605.       self.cursor_rect.set(x, y, w, WLH)
  606.     else
  607.       self.cursor_rect.empty
  608.     end
  609.   end
  610.   #--------------------------------------------------------------------------
  611.   # キャラクターの取得
  612.   #   parameter : パラメータ
  613.   #--------------------------------------------------------------------------
  614.   def get_character(parameter)
  615.     # パラメータで分岐
  616.     case parameter
  617.     when -1  # プレイヤー
  618.       return $game_player
  619.     when 0  # 現在アクティブなイベント
  620.       id = $game_map.interpreter.event_id
  621.       events = $game_map.events
  622.       return events == nil ? nil : events[id]
  623.     else  # 特定のイベント
  624.       events = $game_map.events
  625.       return events == nil ? nil : events[parameter]
  626.     end
  627.   end
  628.   #--------------------------------------------------------------------------
  629.   # (メッセージ終了時)ホールドの処理
  630.   #--------------------------------------------------------------------------
  631.   def process_hold
  632.     if @window_hold
  633.       @held_windows.push(Window_Copy.new(self))
  634.       @held_windows.push(Window_Copy.new(@name_window))
  635.       @held_windows.push(Sprite_Copy.new(@name_sprite))
  636.       @held_windows.push(Sprite_Copy.new(@back_sprite))
  637.       for sprite in @extra_sprites
  638.         next if sprite.disposed?
  639.         @held_windows.push(Sprite_Copy.new(sprite))
  640.       end
  641.       @extra_sprites.clear
  642.       self.openness = 0
  643.       #@name_window.openness = 0
  644.       @back_sprite.visible = false
  645.     else
  646.       @held_windows.each {|object| object.dispose}
  647.       @held_windows.clear
  648.     end
  649.     #@name_window.close
  650.     #@name_sprite.visible = false
  651.   end
  652.   #--------------------------------------------------------------------------
  653.   # キャラポップ位置の設定と取得
  654.   #--------------------------------------------------------------------------
  655.   def pop_character=(character_id)
  656.     @pop_character = character_id
  657.   end
  658.   def pop_character
  659.     return @pop_character
  660.   end
  661.   #--------------------------------------------------------------------------
  662.   # キャラポップ時のウィンドウリサイズ
  663.   #--------------------------------------------------------------------------
  664.   def reszie_window_for_pop
  665.     #キャラポップ
  666.     if self.pop_character != nil
  667.       #max_x = @line_widths.max.to_i
  668.       #n  = max_x + 32
  669.       n = 0
  670.       n += $game_message.face_name.empty? ? 0 : 122
  671.       m  = $game_message.face_name.empty? ? 0 : 96
  672.       w  = @name_sprite.bitmap.width
  673.       self.width  = max_width + n
  674.       self.height = [@all_texts.size * line_height, m].max + 32
  675.       create_contents
  676.       update_charpop_window
  677.     elsif @info_mode
  678.       @line_aligns[0] = CENTER
  679.       self.x = - 8
  680.       self.width = Graphics.width + 16
  681.       self.height = 56
  682.       create_contents
  683.     else
  684.       self.x = 0
  685.       self.width  = Graphics.width
  686.       self.height = MAX_LINE * line_height + 32
  687.       update_placement #位置情報修正。
  688.       create_contents
  689.     end
  690.   end
  691.   #--------------------------------------------------------------------------
  692.   # ● 背景スプライトの作成
  693.   #--------------------------------------------------------------------------
  694.   alias xrxsv2_create_back_sprite create_back_sprite
  695.   def create_back_sprite
  696.     xrxsv2_create_back_sprite
  697.     @back_sprite.zoom_x = 1.0 * Graphics.width / @back_sprite.bitmap.width
  698.     @name_window = Window_Base.new(0,0,0,36)
  699.     @name_window.visible = false
  700.     @name_sprite = Sprite.new
  701.     @name_sprite.bitmap = Bitmap.new(32,32)
  702.     @name_sprite.visible = false
  703.     self.x = self.x
  704.     self.y = self.y
  705.     self.z = self.z
  706.     @held_windows = []
  707.     @extra_sprites = []
  708.   end
  709.   #--------------------------------------------------------------------------
  710.   # ● 背景スプライトの解放
  711.   #--------------------------------------------------------------------------
  712.   alias xrxsv2_dispose_back_sprite dispose_back_sprite
  713.   def dispose_back_sprite
  714.     xrxsv2_dispose_back_sprite
  715.     @name_window.dispose if @name_window != nil #メニュー画面を出そうとするとエラー?
  716.     @name_sprite.dispose if @name_sprite != nil
  717.     for window in @held_windows
  718.       window.dispose
  719.     end
  720.   end
  721.   #--------------------------------------------------------------------------
  722.   # ● 背景スプライトの更新
  723.   #--------------------------------------------------------------------------
  724.   alias xrxsv2_update_back_sprite update_back_sprite
  725.   def update_back_sprite
  726.     @name_window.update
  727.     xrxsv2_update_back_sprite
  728.     update_charpop_window
  729.   end
  730.   #--------------------------------------------------------------------------
  731.   # ウィンドウの位置と不透明度の設定 (キャラポップ)
  732.   #--------------------------------------------------------------------------
  733.   def update_charpop_window
  734.     if self.pop_character
  735.       character = get_character(self.pop_character)
  736.       return if character == nil
  737.       # [X座標]
  738.       n = self.width / 2
  739.       n = [n, @name_skin.width + 16].max if @current_name != nil
  740.       w = @name_sprite.bitmap.width
  741.       x = character.screen_x - [[n, w].max, self.width - 32].min
  742.       # [Y座標]
  743.       if self.pop_character == 0 and POP_DIRECTION #イベントの方向を考慮。
  744.         if character.direction == 2 #下向き
  745.           @position = 0 #上にポップ
  746.         elsif character.direction == 8 #上向き
  747.           @position = 2 #下にポップ
  748.         end
  749.       end
  750.       case @position
  751.       when 0
  752.         y = character.screen_y - CHARPOP_HEIGHT - self.height
  753.       else
  754.         y = character.screen_y + 16
  755.       end
  756.       x_max = Graphics.width - 4 - self.width
  757.       x_min = 4
  758.       y_max = Graphics.height - self.height
  759.       y_min = 4
  760.       self.x = [[x, x_max].min, x_min].max
  761.       self.y = [[y, y_max].min, y_min].max
  762.     end
  763.   end
  764.   #--------------------------------------------------------------------------
  765.   # 位置の連動
  766.   #--------------------------------------------------------------------------
  767.   def x=(n)
  768.     super
  769.     if @name_window
  770.       @name_window.x = n + NAME_WINDOW_OFFSET_X
  771.       @name_sprite.x = n + NAME_WINDOW_OFFSET_X + 8 + NAME_WINDOW_OFFSET_WIDTH / 2
  772.     end
  773.   end
  774.   def y=(n)
  775.     super
  776.     if @name_window
  777.       @name_window.y = n + NAME_WINDOW_OFFSET_Y
  778.       @name_sprite.y = n + NAME_WINDOW_OFFSET_Y + 2 + NAME_WINDOW_OFFSET_HIGHT / 2
  779.     end
  780.   end
  781.   def z=(n)
  782.     super
  783.     if @name_window
  784.       @name_window.z = n + 11#1 テールの上に表示されるので、Zを水増しする。
  785.       @name_sprite.z = n + 12#2
  786.     end
  787.   end
  788.   #--------------------------------------------------------------------------
  789.   # ● ファイバーのメイン処理
  790.   #--------------------------------------------------------------------------
  791.   def fiber_main_namewin
  792.     fiber_main_namewin_default
  793.     @name_window.openness = 0
  794.     @name_sprite.bitmap.clear
  795.     $name = ""
  796.   end
  797.   alias :fiber_main_namewin_default :fiber_main
  798.   alias :fiber_main :fiber_main_namewin
  799. end
  800. #==============================================================================
  801. # 伸縮対応
  802. #==============================================================================
  803. class Window_Message < Window_Base
  804.   #--------------------------------------------------------------------------
  805.   # ● ウィンドウの背景と位置の設定 [再定義]
  806.   #--------------------------------------------------------------------------
  807.   def reset_window   
  808.     @background = $game_message.background
  809.     @position = $game_message.position
  810.     if @background == 0   # 通常ウィンドウ
  811.       self.opacity = 255
  812.     else                  # 背景を暗くする、透明にする
  813.       self.opacity = 0
  814.     end
  815.     case @position
  816.     when 0  # 上
  817.       self.y = 0
  818.       @gold_window.y = 360
  819.     when 1  # 中
  820.       self.y = (Graphics.height - self.height) / 2
  821.       @gold_window.y = 0
  822.     when 2  # 下
  823.       self.y = Graphics.height - self.height
  824.       @gold_window.y = 0
  825.     end
  826.   end
  827. end
  828. #==============================================================================
  829. # □ Window_Copy
  830. #------------------------------------------------------------------------------
  831. #   指定のウィンドウのコピーを作成します。
  832. #==============================================================================
  833. class Window_Copy < Window_Base
  834.   #--------------------------------------------------------------------------
  835.   # ○ オブジェクト初期化
  836.   #--------------------------------------------------------------------------
  837.   def initialize(window)
  838.     super(window.x, window.y, window.width, window.height)
  839.     self.contents = window.contents.dup unless window.contents.nil?
  840.     self.opacity = window.opacity
  841.     self.back_opacity = window.back_opacity
  842.     self.z = window.z - 3
  843.     self.visible = window.visible
  844.   end
  845. end
  846. #==============================================================================
  847. # □ Sprite_Copy
  848. #------------------------------------------------------------------------------
  849. #   指定のスプライトのコピーを作成します。
  850. #==============================================================================
  851. class Sprite_Copy < Sprite
  852.   #--------------------------------------------------------------------------
  853.   # ○ オブジェクト初期化
  854.   #--------------------------------------------------------------------------
  855.   def initialize(sprite)
  856.     super()
  857.     self.bitmap = sprite.bitmap.dup unless sprite.bitmap.nil?
  858.     self.opacity = sprite.opacity
  859.     self.x = sprite.x
  860.     self.y = sprite.y
  861.     self.z = sprite.z - 3
  862.     self.ox = sprite.ox
  863.     self.oy = sprite.oy
  864.     self.zoom_x = sprite.zoom_x
  865.     self.visible = sprite.visible
  866.   end
  867. end



  868. #■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
  869. #■吹きだしテールの表示ルーチン。
  870. #■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
  871. #==============================================================================
  872. # +++ 「+ふきだし表示」VX +++
  873. # by パラ犬  http://2d6.parasite.jp/
  874. #      ×
  875. #    row       http://xms.rdy.jp/
  876. #
  877. # publish 2010/ 3/ 2
  878. # update  -
  879. #
  880. #------------------------------------------------------------------------------
  881. #    ほぼどんなメッセージウィンドウに対しても後付け可能な「ふきだし表示」です。
  882. #  また、テール部分のみの自動追尾機能を持ちます。
  883. #   ふきだし表示をするには、
  884. #  テール用画像「Window-top」「Window-under」を
  885. #  「Graphics/System」フォルダにインポートしておく必要があります。
  886. #==============================================================================
  887. # ■ Window_Message
  888. #==============================================================================
  889. class Window_Message < Window_Base
  890.   #--------------------------------------------------------------------------
  891.   # ● メッセージの開始
  892.   #--------------------------------------------------------------------------
  893.   alias parashelf_update_all_windows update_all_windows
  894.   def update_all_windows
  895.     parashelf_update_all_windows
  896.     update_tail
  897.   end
  898.   #--------------------------------------------------------------------------
  899.   # クローズ [オーバーライド]
  900.   #--------------------------------------------------------------------------
  901.   def close
  902.     super
  903.     del_tail
  904.     @name_window.close if @name_window != nil #ネームウィンドウのクローズ動作。
  905.   end
  906.   #--------------------------------------------------------------------------
  907.   # ● 背景スプライトの更新
  908.   #--------------------------------------------------------------------------
  909.   alias parashelf_update_back_sprite update_back_sprite
  910.   def update_back_sprite
  911.     parashelf_update_back_sprite
  912.     update_tail
  913.   end
  914.   #--------------------------------------------------------------------------
  915.   # ○ フレーム更新 (ふきだしテールの更新)
  916.   #--------------------------------------------------------------------------
  917.   def update_tail
  918.     # ふきだしモードではイベントの動きに追従
  919.     if $mes_id != nil and @tail != nil
  920.       tale_pos = get_tale_pos
  921.       @tail.x = tale_pos[0]
  922.       @tail.y = tale_pos[1]
  923.       update_tail_bitmap
  924.     end
  925.   end
  926.   ##--------------------------------------------------------------------------
  927.   # ○ ふきだしテールの画像を更新。
  928.   #--------------------------------------------------------------------------
  929.   def update_tail_bitmap
  930.     skin = "Window"
  931.     skin = "Think" if $game_switches[THINK_SWITCHES]
  932.     if $win_x != nil
  933.       if $win_x > 0
  934.         @tail.bitmap = Cache.system(skin + "-right")
  935.       elsif  $win_x < 0
  936.         @tail.bitmap = Cache.system(skin + "-left")
  937.       else
  938.         case @position
  939.         when 0  # 上
  940.           @tail.bitmap = Cache.system(skin + "-top")
  941.         when 2  # 下
  942.           @tail.bitmap = Cache.system(skin + "-under")
  943.         end
  944.       end
  945.     else
  946.       case @position
  947.       when 0  # 上
  948.         @tail.bitmap = Cache.system(skin + "-top")
  949.       when 2  # 下
  950.         @tail.bitmap = Cache.system(skin + "-under")
  951.       end
  952.     end
  953.     # 可視状態
  954.     if self.visible == true
  955.       @tail.visible = self.openness == 255
  956.     else
  957.       @tail.visible = false
  958.     end
  959.   end
  960.   #--------------------------------------------------------------------------
  961.   # ○ テールの位置を計算
  962.   #--------------------------------------------------------------------------
  963.   def get_tale_pos
  964.     if defined?($game_system.show_stand_picture) #A1立ち絵スクリプトを入れている。
  965.       if $game_system.show_stand_picture #立ち絵on
  966.         pos = get_tale_pos_stand_pic
  967.       else
  968.         pos = get_tale_pos_normal
  969.       end
  970.     else
  971.       pos = get_tale_pos_normal
  972.     end
  973.     return pos
  974.   end
  975.   #--------------------------------------------------------------------------
  976.   # ○ テールの位置を計算/立ち絵使用時。※NAME_CHANGEの編集必須。
  977.   #--------------------------------------------------------------------------
  978.   def get_tale_pos_stand_pic
  979.     if $game_message.face_name != ""  and @tail != nil
  980.       name = A1_System::StandPicture::NAME_CHANGE[$game_message.face_name]
  981.       chara = name[$game_message.face_index][0]
  982.       if @stand_pic[chara] != nil #立ち絵無しの場合通常通り。
  983.         x = @stand_pic[chara].pic_sprite.x + @stand_pic[chara].pic_sprite.width / 2
  984.         y = get_tale_pos_normal_updown
  985.         update_tail_bitmap
  986.       else
  987.         return get_tale_pos_normal #立ち絵が見つからない場合は通常通り。
  988.       end
  989.     else
  990.       return get_tale_pos_normal #立ち絵が見つからない場合は通常通り。
  991.     end
  992.     return [x,y]
  993.   end
  994.   #--------------------------------------------------------------------------
  995.   # ○ テールの位置を計算/立ち絵未使用時。
  996.   #--------------------------------------------------------------------------
  997.   def get_tale_pos_normal
  998.     if $mes_id == (-2) #左右の場合は高さはウィンドウ中心。上下ならやや左に配置。
  999.       if $win_x != nil
  1000.         if $win_x > 0
  1001.           x = $win_x - @tail.width / 2
  1002.           y = self.y + self.height / 2 - @tail.height / 2
  1003.         elsif $win_x < 0
  1004.           x = self.width - @tail.width / 2
  1005.           y = self.y + self.height / 2 - @tail.height / 2
  1006.         else
  1007.           x = MINAS_TWE_X_POS
  1008.           y = get_tale_pos_normal_updown
  1009.         end
  1010.       else
  1011.         x = MINAS_TWE_X_POS
  1012.         y = get_tale_pos_normal_updown
  1013.       end
  1014.     elsif $mes_id <= (-3) #左右の場合は高さはウィンドウ中心。上下ならやや左に配置。
  1015.       if $win_x != nil
  1016.         if $win_x > 0
  1017.           x = $win_x - @tail.width / 2
  1018.           y = self.y + self.height / 2
  1019.         elsif $win_x < 0
  1020.           x = self.width - @tail.width / 2
  1021.           y = self.y + self.height / 2
  1022.         else
  1023.           x = MINAS_THREE_X_POS
  1024.           y = get_tale_pos_normal_updown
  1025.         end
  1026.       else
  1027.         x = MINAS_THREE_X_POS
  1028.         y = get_tale_pos_normal_updown
  1029.       end
  1030.     else
  1031.       character = get_character($mes_id)
  1032.       x = [[character.screen_x - 16, self.x].max, self.x + self.width - 32].min
  1033.       if $win_x != nil
  1034.         if $win_x > 0
  1035.           x = $win_x - @tail.width / 2
  1036.           y = character.screen_y
  1037.         elsif $win_x < 0
  1038.           x = self.width
  1039.           y = character.screen_y
  1040.         else
  1041.           y = get_tale_pos_normal_updown
  1042.         end
  1043.       else
  1044.         y = get_tale_pos_normal_updown
  1045.       end
  1046.     end
  1047.     return [x, y]
  1048.   end
  1049.   #--------------------------------------------------------------------------
  1050.   # ○ テールが上下の時、かつ[-2][-3]でない時のy座標の取得。
  1051.   #--------------------------------------------------------------------------
  1052.   def get_tale_pos_normal_updown
  1053.     case @position
  1054.     when 0
  1055.       y = self.y + self.height - @tail.height / 2
  1056.     else
  1057.       y = self.y - @tail.height / 2
  1058.     end
  1059.     return y
  1060.   end
  1061.   #--------------------------------------------------------------------------
  1062.   # ○ ふきだしを破棄
  1063.   #--------------------------------------------------------------------------
  1064.   def del_tail
  1065.     if @tail != nil
  1066.       @tail.dispose
  1067.       @tail = nil
  1068.     end
  1069.   end
  1070. end
  1071. #
  1072. # ▼▲▼ XRXS 9拡張CO-X. ふきだし自動設定 ▼▲▼
  1073. #==============================================================================
  1074. # ■ Window_Message
  1075. #==============================================================================
  1076. class Window_Message < Window_Base
  1077.   #--------------------------------------------------------------------------
  1078.   # ○ ポップキャラクターの設定
  1079.   #--------------------------------------------------------------------------
  1080.   def pop_character=(character_id)
  1081.     @pop_character = character_id
  1082.     $mes_id = character_id
  1083.   end
  1084.   #--------------------------------------------------------------------------
  1085.   # ○ テールキャラクターの設定
  1086.   #--------------------------------------------------------------------------
  1087.   def tail_character=(character_id)
  1088.     #@pop_character = character_id
  1089.     $mes_id = character_id
  1090.   end
  1091. end


  1092. #==============================================================================
  1093. # ■ Window_ChoiceList
  1094. #------------------------------------------------------------------------------
  1095. #  イベントコマンド[選択肢の表示]で、Y座標を修正します。
  1096. #==============================================================================
  1097. class Window_ChoiceList < Window_Command
  1098.   #--------------------------------------------------------------------------
  1099.   # ● ウィンドウ位置の更新
  1100.   #--------------------------------------------------------------------------
  1101.   def update_placement_hukidasi
  1102.     #self.width = [max_choice_width + 12, 96].max + padding * 2
  1103.     #self.width = [width, Graphics.width].min
  1104.     #self.height = fitting_height($game_message.choices.size)
  1105.     #self.x = Graphics.width - width
  1106.     #if @message_window.y >= Graphics.height / 2
  1107.     #  self.y = @message_window.y - height
  1108.     #else
  1109.     #  self.y = @message_window.y + @message_window.height
  1110.     #end
  1111.     update_placement_hukidasi_default
  1112.     if self.y + self.height > Graphics.height
  1113.       self.y -= ( ( self.height + self.y ) - Graphics.height)
  1114.       self.z += 100
  1115.     end
  1116.   end
  1117.   alias :update_placement_hukidasi_default :update_placement
  1118.   alias :update_placement :update_placement_hukidasi
  1119. end

  1120. #==============================================================================
  1121. # ■ Scene_Menu
  1122. #------------------------------------------------------------------------------
  1123. #  メニューを開いてからウィンドウが出るとネームウィンドウが表示される不具合修正。
  1124. #==============================================================================
  1125. #class Scene_Menu < Scene_MenuBase
  1126. #  def terminate_hukidasi_menyu
  1127. #    @name_window.openness = 0 if @name_window != nil
  1128. #    terminate_hukidasi_menyu_default
  1129. #  end
  1130. #  alias :terminate_hukidasi_menyu_default :terminate
  1131. #  alias :terminate :terminate_hukidasi_menyu
  1132. #end

  1133. #■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
  1134. #■ウィンドウ非表示ルーチン
  1135. #■吹きだしテールとネームウィンドウに対応。
  1136. #■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
  1137. #==============================================================================
  1138. # L(キーボードのQ)を押すと、メッセージウィンドウを表示・非表示
  1139. #==============================================================================
  1140. class Window_Message < Window_Base
  1141.   def update_winoff
  1142.     unless $game_party.in_battle #バトル中は無効。
  1143.       if Input.trigger?(Input::L)
  1144.         if self.visible == true
  1145.           self.visible = false
  1146.           @background = 777 if @back_sprite != nil and @background == 1 #「背景を暗くする」
  1147.           @tail.visible = false if @tail != nil
  1148.         else
  1149.           self.visible = true
  1150.           @background = 1 if @back_sprite != nil and @background == 777 #「背景を暗くする」
  1151.         end
  1152.         if @name_window != nil
  1153.           if @name_window.visible == false and $name != nil and $name != ""
  1154.             @name_window.visible = true
  1155.             @name_sprite.visible = true
  1156.           else
  1157.             @name_window.visible = false
  1158.             @name_sprite.visible = false
  1159.           end
  1160.         end
  1161.       elsif Input.trigger?(Input::C) or Input.trigger?(Input::B)
  1162.         if self.visible == false
  1163.           self.visible = true
  1164.           @back_sprite.visible = true unless @back_sprite
  1165.         end
  1166.         @tail.visible = true if @tail != nil and @tail.visible == false
  1167.         if @name_window != nil and $name != nil
  1168.           if $name != ""
  1169.             @name_window.visible = true
  1170.             @name_sprite.visible = true
  1171.           end
  1172.         end
  1173.       end
  1174.     end
  1175.     update_winoff_default
  1176.   end
  1177.   alias :update_winoff_default :update
  1178.   alias :update :update_winoff
  1179. end


  1180. #■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
  1181. #■ウィンドウ表示位置指定ルーチン
  1182. #■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
  1183. #===========================================================================
  1184. #イベントコマンド「スクリプト」を使い、
  1185. #$win_x=100 
  1186. #$win_y=100
  1187. #と入力すれば、ウィンドウを(100、100)の位置に表示します。
  1188. #使わない時は
  1189. #$win_x=nil
  1190. #などとnilを入力しておいてください。
  1191. #===========================================================================
  1192. class Window_Message < Window_Base
  1193.   #--------------------------------------------------------------------------
  1194.   # ● ウィンドウの背景と位置の設定 [再定義]
  1195.   #--------------------------------------------------------------------------
  1196.   def update_placement_position
  1197.     update_placement_position_default
  1198.     if $win_x != nil
  1199.       if $win_x > 0
  1200.         self.x = $win_x
  1201.         self.width -= $win_x
  1202.       else
  1203.         self.x = 0
  1204.         self.width += $win_x
  1205.       end
  1206.     end
  1207.     if $win_y != nil
  1208.       self.y = $win_y
  1209.     end
  1210.     #上表示の時、ネームウィンドウが見切れるので少し下にずらす。
  1211.     if self.y == 0 and @position == 0 and @name_window != nil and $name != nil
  1212.       self.y += (-NAME_WINDOW_OFFSET_Y)
  1213.     end
  1214.   end
  1215.   alias_method :update_placement_position_default, :update_placement
  1216.   alias_method :update_placement, :update_placement_position
  1217. end


  1218. #==============================================================================
  1219. # ■ SceneManager
  1220. #------------------------------------------------------------------------------
  1221. #  シーン遷移のさい、テールを破棄。ネームウィンドウのデータをクリア。
  1222. #==============================================================================
  1223. module SceneManager
  1224.   #--------------------------------------------------------------------------
  1225.   # ● 呼び出し
  1226.   #--------------------------------------------------------------------------
  1227.   def self.call_sceman_hukidasi(scene_class)
  1228.     if defined?(self.scene.message_window)
  1229.       self.scene.message_window.del_tail if self.scene.message_window.tail != nil
  1230.       $name = ""
  1231.     end
  1232.     @stack.push(@scene)
  1233.     @scene = scene_class.new
  1234.   end
  1235.   #--------------------------------------------------------------------------
  1236.   # ● クラスメソッドのエイリアス
  1237.   #--------------------------------------------------------------------------
  1238.   class << self
  1239.     alias :call_sceman_hukidasi_default :call
  1240.     alias :call :call_sceman_hukidasi
  1241.   end
  1242. end

  1243. #==============================================================================
  1244. # ■ Scene_Map
  1245. #------------------------------------------------------------------------------
  1246. #  戦闘トランジションのさい、テールを破棄。
  1247. #==============================================================================
  1248. class Scene_Map < Scene_Base
  1249.   attr_accessor :message_window
  1250.   #--------------------------------------------------------------------------
  1251.   # ● 戦闘前トランジション実行
  1252.   #--------------------------------------------------------------------------
  1253.   def perform_battle_transition_hukidasi
  1254.     @message_window.del_tail #テールの破棄
  1255.     perform_battle_transition_hukidasi_default
  1256.   end
  1257.   alias_method :perform_battle_transition_hukidasi_default, :perform_battle_transition
  1258.   alias_method :perform_battle_transition, :perform_battle_transition_hukidasi
  1259. end
复制代码
视觉诱惑 发表于 2013-1-26 23:25:43
tseyik 发表于 2013-1-26 13:49
請善用捜索,同様問題不知答了多小次了
?按下鍵盤Q、
 窗口消失。Q決定、取消鍵元戻。

就是 显示 名称那里 出现了 一个变量 问题 希望 谢谢~~~
视觉诱惑 发表于 2013-1-26 22:38:09
tseyik 发表于 2013-1-26 13:49
請善用捜索,同様問題不知答了多小次了
?按下鍵盤Q、
 窗口消失。Q決定、取消鍵元戻。

麻烦在指点 一下 我这 刚编辑了帖子 出现了新的问题

点评

出现什麼的问题?  发表于 2013-1-26 23:07
tseyik 发表于 2013-1-26 13:49:42
請善用捜索,同様問題不知答了多小次了
?按下鍵盤Q、
 窗口消失。Q決定、取消鍵元戻。

?文章設定、可用以下文字操作。
? \name[] : 在對話窗口上出現小窗口中,出現[]内的文字。

\h[-1] : 在玩者上面出現對話窗口。
\h[0] : 在正發生的事件出現對話窗口。
\h[1] : 在[]内的ID號的事件出現對話窗口。
H可用大文字。

通常的窗口、但對話吹出位置不同、
\t[-2] : 窗口上下に表示時、X座標MINAS_TWE_X_POS固定。
           $win_x 左右表示時、Y座標窗口中心下固定。
\t[-3] : 窗口上下に表示時、X座標MINAS_THREE_X_POS固定。
           $win_x 左右表示時、Y座標窗口中心下固定。
\t[-1] : 玩者向對話吹出位置表示。
\t[0] : 現在執行的事件對話吹出位置表示。
\t[1] : []内的ID事件對話吹出位置表示。

\O[128] : 文字透明。[]内是alpha値、0透明、255通常。
\D : 文字影有
\hold : 最後的文章限定。信息結束,不關上窗口。
      其他的信息被表示時消失。
      被鎖定的窗,不能用Q按鈕消去。
视觉诱惑 发表于 2013-1-26 00:30:11
冰鎮史萊姆 发表于 2013-1-25 23:46
脚本第32~34行有写
\h[-1] : 主角
\h[0] : 現在的事件

谢谢!!!问题已经解决
冰鎮史萊姆 发表于 2013-1-25 23:46:28
脚本第32~34行有写
\h[-1] : 主角
\h[0] : 現在的事件
\h[1] : 事件ID 1号(可改)
拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-17 20:39

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表