RMVX

말풍선 효과 스크립트 오류

by 아브렐라 posted May 06, 2012
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄
Extra Form

일본거 스크립트를 다운받아서 써봤는데요,


#==============================================================================
# ★RGSS2
# STR22Edit_MWEXT++/カスタマイズセクション v1.0 08/02/16
# サポート:http://otsu.cool.ne.jp/strcatyou/
#
# ・メッセージウィンドウEXT++の設定プラグインです。
#
#------------------------------------------------------------------------------
#
# 更新履歴
# ◇1.0
# やっぱり本体と分割。マニュアルは設定箇所の下に移動しました。
#
#==============================================================================
# ■ Window_Message
#==============================================================================
class Window_Message < Window_Selectable
  #-------------------------------------------------------------------------#
  # ★ 基本設定                                                             #
  #-------------------------------------------------------------------------#
  # 通常サイズ(X(0), Y(0), 幅, 高さ)
  WINDOW_RECT  = Rect.new(0, 0, 544, 128)
  # バトルメッセージモード
  BTMESMODE    = 0        # 0 = 通常 1 = STR11b(XP風バトル)モード
  # フェードタイプ
  FADE_TYPE    = 1        # 0 = 縦に開閉(デフォルト) 1 = 透明度変化
  # ふきだしファイル名
  POPUP_FILE   = "Window_Popup" # 使用しない場合は""
  # ふきだしタイプ参照先変数
  POPUP_TYPE_V = 12       # ◆指定した変数の値でポップアップのパターンが
                          #  決定されます。
  POPUP_MIRROR = true     # ふきだしをキャラ位置に応じて左右反転
  POPUP_LR     = 0        # ふきだしグラフィックの向き
                          # 0 = 左 1 = 右
  # スリムウィンドウ
  S_WINDOW     = true     # スリムウィンドウを有効にする
  S_WINDOW_W   = 10       # 縮めるウィンドウの横幅(pixel)
  S_WINDOW_H   = 12       # 縮めるウィンドウの縦幅(pixel)
  # ネームウィンドウ
  N_WINDOW_FN  = "UmePlus Gothic" # フォント
  N_WINDOW_FS  = 16       # フォントサイズ
  N_WINDOW_ED  = true     # 縁取り
  N_WINDOW_CO  = Color.new(255,255,255) # 通常カラー
  N_WINDOW_CE  = Color.new( 64, 32,128) # 縁取りカラー
  N_WINDOW_WH  = [10, 8]  # 幅,高さ修正[幅, 高さ]
  N_WINDOW_XY  = [0,-14]  # XY座標修正[X, Y]
  N_WINDOW_OPC = 100      # 不透明度(通常ウィンドウに対しての%)
  N_WINDOW_IX  = true     # 顔グラフィックを左側に表示した時、
                          # ネームウィンドウの位置を文章に合わせる
  N_WINDOW_1V  = true     # "背景を暗くする"の時、ネームウィンドウを
                          # 透明にする
  # ポーズサイン位置
  P_WINDOW     = 1        # ポーズサイン位置 0 = 中央下 1 = 右下
  P_WINDOW_XY  = [-24,-24]# XY座標修正[X, Y]
  # 顔グラフィック
  FACE_SIZE    = [96, 96] # サイズ[幅, 高さ]
  FACE_XY      = [0, 0]   # XY座標修正[X, Y]
  FACE_Y       = 1        # 縦位置 0 = 上 1 = 中央 2 = 下
  FACE_SPACE   = 8        # 顔グラと文章間のスペース
  # メッセージバック
  MESBACK_VA   = 13       # ◆指定した変数の値でメッセージバックが
                          #  決定されます。
  # メッセージバックリスト定義(指定した変数の値に対応するファイル名)
  #   対応する値 => "ファイル名",
  MESBACK_LIST = {0 => "MessageBack", # デフォルト
                  1 => "Window_ext",
                  2 => "",
                  }
  # メッセージ表示中移動の際にONにするスイッチID
  MESMOVE      = 12       # ◆
  #-------------------------------------------------------------------------#
  # ★ フォント                                                             #
  #-------------------------------------------------------------------------#
  # 基本
  DEFAULT_SIZE = 20       # デフォルトの文字サイズ
  WLH          = 24       # 行間
  ALIGN        = 0        # 文字揃え 0 = 左 1 = 中央 2 = 右
  # フォントリスト定義(\F[n]で指定するフォントです)
  FONTLIST = {0 => "UmePlus Gothic",  # ■デフォルトのフォント
              1 => "MS Pゴシック", # XPデフォルト
              2 => "MS P明朝",     # 渋い
              3 => "Arial",           # XPタイマーフォント
              4 => "Arial Black",     # XPダメージポップフォント
              }
  # 縁取りカラーリスト定義(\CE[n]で指定するカラーです)
  EDGE_COLOR = {0 => Color.new( 64, 32,128),   # 青
                1 => Color.new(128, 32, 32),   # 赤
                2 => Color.new( 96, 96, 32),   # 黄
                3 => Color.new( 32, 32, 32),   # 黒
                4 => Color.new(64,32,128,128), # うっすらブルー
                }
  #-------------------------------------------------------------------------#
  # ★ タイピングSE                                                         #
  #-------------------------------------------------------------------------#
  # タイピングSEリスト定義 MESSE_VNUMで指定した変数の値のSEを再生します。
  #  対応する値 => SE 情報
  MESSAGE_SE = {0 => RPG::SE.new("Open1", 60, 150), # カチャチャ
                1 => RPG::SE.new("", 80, 150),      # 無音
                }
  # 基本設定
  MESSE      = true    # タイピングSEを有効にするかどうか
  MESSE_WAIT = 2       # タイピングSEの通常再生間隔 0 で最速
  MESSE_VNUM = 10      # ◆再生するSE番号の参照元変数(ID)
                       #  指定した変数の値で再生するSEが決定されます
  MESSE_VWAI = 11      # ◆タイピングSEの再生間隔の強制指定に参照する変数(ID)
                       #  指定した変数の値が 1 以上の時、再生間隔を
                       #  その値に強制指定します
  #-------------------------------------------------------------------------#
  # ★ スキップ                                                             #
  #-------------------------------------------------------------------------#
  # 基本
  FAST_B = Input::B    # メッセージニ倍速ボタン
  F_AUTO = false       # メッセージニ倍速を標準スピードに
  SKIP_B = Input::A    # メッセージスキップボタン
  F_WAIT = 0           # 文章終了時のウェイト VXデフォルトの値は 10
  # 完全スキップ無効化スイッチID
  PSID = 9             # ◆ここで指定したスイッチがONの時、Cボタン押下を含めた
                       #  全てのメッセージスキップ機能が無効になります
  # スキップ無効化スイッチID
  SSID = 10            # ◆ここで指定したスイッチがONの時、
                       #  メッセージスキップ機能が無効になります
  # ニ倍速無効化スイッチID
  FSID = 11            # ◆ここで指定したスイッチがONの時、
                       #  メッセージニ倍速流し機能が無効になります
  #-------------------------------------------------------------------------#
  # ★ 拡張設定                                                             #
  #-------------------------------------------------------------------------#
  # マクロ定義 \M[n]で置き換えるテキストです。
  # 制御文字の "\" は "\\" と入力する必要があります。
  MACRO = { 0 => "\\c[1]\\f",                   # カラー1番、縁取り切り替え
            1 => "\\c[0]\\f",                   # カラー0番、縁取り切り替え
            2 => "を手に入れた!",              # 手に入れた。
            3 => "\\fs[16]\\eはい\\e\\fs[d]",   # 縁取り小さめのはい
            4 => "\\fs[16]\\eいいえ\\e\\fs[d]", # 縁取り小さめのいいえ
            5 => "\\r[漢,おとこ]",              # 男
            }
  # オートネームウィンドウ定義 "Actor[n]"と書くことでn番のアクターの名前に設定可
  # "ファイル名 + _ + フェイスインデックス" => "なまえ",
  # フェイスインデックスの  0123
  # 割り当て図 →      4567
  A_N_WINDOW = {"Actor1_0" => "ラルフ",
                "Actor1_3" => "ウルリカ",
                "Actor2_2" => "ベネット",
                "Actor2_5" => "イルヴァ",
                "Actor1_4" => "Actor[5]",
                "Evil_4"   => "Actor[6]",
                "Actor3_1" => "Actor[7]",
                "Actor3_2" => "Actor[8]",
                }
  def initialize_vocab
  # 用語リスト(\VO[n]で置き換える用語です)
  @vo={0 => Vocab::ShopBuy,     1 => Vocab::ShopSell,    2 => Vocab::ShopCancel,
       3 => Vocab::Possession,  4 => Vocab::ExpTotal,    5 => Vocab::ExpNext,
       6 => Vocab::SaveMessage, 7 => Vocab::LoadMessage, 8 => File,
       9 => Vocab::level,      10 => Vocab::level_a,    11 => Vocab::hp,
      12 => Vocab::hp_a,       13 => Vocab::mp,         14 => Vocab::mp_a,
      15 => Vocab::atk,        16 => Vocab::def,        17 => Vocab::spi,
      18 => Vocab::agi,        19 => Vocab::weapon,     20 => Vocab::armor1,
      21 => Vocab::armor2,     22 => Vocab::armor3,     23 => Vocab::armor4,
      24 => Vocab::weapon1,    25 => Vocab::weapon2,    26 => Vocab::attack,
      27 => Vocab::skill,      28 => Vocab::guard,      29 => Vocab::item,
      30 => Vocab::equip,      31 => Vocab::status,     32 => Vocab::save,
      33 => Vocab::game_end,   34 => Vocab::gold,       35 => "はにゃーん!",
    }
  end
  #-------------------------------------------------------------------------#
  # ★ システムパラメータ ※変更注意                               #
  #-------------------------------------------------------------------------#
  STRXXS_WINDOW = false  # STR_SlimWindow
  STR22000 =  5          # ItalicOFF
  STR22001 =  8          # BoldOFF
  STR22002 =  4          # NewLine_it
  STR22007 =  4          # LineAlpha
  STR22008 =  4          # Ruby
  STR22009 = 24          # IconSize
  STR22010 =  8          # Pause_AnimationSpeed
  STR22011 = 48          # Fadetype=1_Speed
  STR22100 =  1          # XY_Update
  STR22101 = true        # Framereset
  STR22900 = [544,416]   # Screen
end
  #-------------------------------------------------------------------------#
  # ★ フェイスアニメ                                                       #
  #-------------------------------------------------------------------------#
module STRRGSS2
  # ループアニメスピード 参考) 4で標準速 2で倍速
  STR22_ANSPEED = 4
  # ループアニメ最大セル数 1-16 ※よくわからない場合は変更しないでください
  STR22_MAXCELL = 16
end
#==============================================================================
# ★ STR22_メッセージウィンドウEXT++ マニュアル
#  一通り目を通しておくことをお勧めします。
#  あと、ここに書いてない機能や仕様があったりして・・・(汗)
#==============================================================================
#
# ◇素材規格
#
# □ふきだし(/Graphics/Systemフォルダ)
#  ウィンドウのフレーム部分にかぶせて、
#  ふきだしのように見せるためのグラフィック。
#
#   幅 = 32 + 32
#  高さ = 64 * 任意のふきだしパターン数
#
#  1パターンの64*64内にふきだし上下のグラフィックを収めます。
#  左32*64に下向きのふきだし、右32*64に上向きのふきだしを、
#  ウィンドウの枠部分と重ねて、違和感がないように配置します。
#
#  サンプルのふきだしグラフィックを見ていただくのが
#  一番分かりやすいと思われます。
#
#  ※ふきだしパターンは上から01234...と順番に割り当てられます。
#   この割り当ては変数でパターン指定する際の対応する値となります。
#
#------------------------------------------------------------------------------
#
# ★追加制御文字 アルファベットは小文字で入力しても可
#
# \* \xxxxx :解説
#
# \  = [カッコ内]には、\N、\V等の制御文字が使用できます。
#  * = テキストが改行されると情報が初期化されます。
#
# ◇エクステンド--------------------------------------------------------◇
#
# \ \M[n]  □テキスト置き換え(マクロ)。
#       設定箇所で定義したリストの n 番のテキストに置き換えます。
#       使い方次第で、様々な文章打ち込みの作業を
#       大幅に簡略化することが可能です。
# \ \P[n]  □キャラクターにポップアップ。
#       n 番のイベントにポップアップ+自動リサイズします。
#       0 で実行元のイベント、-1 でプレイヤーにポップアップします。
#       また、同時にふきだし設定(\PP[n])を行います。
# \  \PP[n] □ふきだしを n 番のイベントに位置指定します。
#       0 で実行元のイベント、-1 でプレイヤー、-2 で非表示に。
#       通常メッセージでふきだしを表示させる場合や
#       逆に、ポップアップのふきだしを非表示にする時に使います。
# \  \NA[t] □ネームウィンドウ表示。t に任意の文字列。
#       例:\NA[ラルフ] ラルフを表示
#         \NA[\N[1]] 1番のアクターの名前を表示
#       また、\NA[] と、何も書かずに制御文字を入れると
#       ネームウィンドウは非表示になります。
#       この機能は、オートネームウィンドウ(後述)による表示を
#       無効にしたい場合に使用します。
#  \NEXT  □文章の連続表示。
#       行数拡張(後述)で指定した、最大行数を超えない範囲で
#       メッセージをまとめて表示します。
#       行数拡張の項目も合わせてご覧ください。
# \  \SH[p,s,d]
#      □メッセージウィンドウのシェイク。
#       p に強さ、s にスピード、d に時間(1/60sec)を指定します。
#       シェイクの仕様はイベントコマンドで行える
#       "画面のシェイク"と同じです。
#       例:\sh[6,20,60]うおおお! → 1秒速シェイク
#
# ◇キャラ操作----------------------------------------------------------◇
#
# \ \A[n,m] □キャラクターにアニメーション。
#       n 番のイベントに m 番のアニメーションを再生します。
#       n を 0 にすると実行元のイベント、-1 でプレイヤーに再生します。
# \ \U[n,m] □キャラクターにフキダシアイコン。
#       n 番のイベントに m に対応したフキダシアイコンを表示します。
#       n を 0 にすると実行元のイベント、-1 でプレイヤーに表示します。
#       m = 0:びっくり 1:はてな 2:音符 3:ハート 4:怒り
#         5:汗 6:くしゃくしゃ 7:沈黙 8:電球 9:Zzz
#
# ◇ウェイトコントロール------------------------------------------------◇
#
#  \MOVE  □メッセージ表示中のプレイヤー移動を許可します。
#       この制御文字で移動が許可されている間、設定箇所で指定した
#       スイッチがONになります。
#       ※メッセージ表示中に接触イベントなどが起動できない仕様の
#        対策のため。スイッチがONの間、イベントをすり抜ける等の
#        症状を解決させるための仕様です。
#  \STOP  □マップ更新ストップ。
#       文章表示中、マップの更新(イベント移動など)が停止します。
# \ \S[n]  □文章スピード。値が大きいほどスピードが遅くなります。
#       n には 0 以上の整数を指定してください。
# \ \W[n]  □詳細ウェイト。n フレームのウェイトを掛けます。(1/60sec)
#
# ◇フェイス------------------------------------------------------------◇
#
#  \FR   □顔グラフィックの位置を右側に設定します。
#  \FM   □顔グラフィックを左右反転表示させます。
# \ \FC[n,m]□顔グラフィック変更。
#       n に"ファイル名"、m にフェイスインデックスを指定します。
#       顔グラフィックが指定されて無い場合は無効になります。
#       例:\fc[Actor2,2] → ベネットさん
#  \FCM  □リアルタイムに顔グラフィックを左右反転させます。
#       ギャグっぽい演出に使えそうですね。
# \ \FA[n] □顔グラフィックに n 番のアニメーションを再生させます。
# \ \FAL[n] □顔グラフィックに n 番のアニメーションをループ再生させます。
#       \FLCでアニメーションループ再生に置き換えられている場合、
#       置き換えのアニメを n 番のアニメーションに変更します。
# \ \FLC[n] □顔グラフィックを n 番のアニメーションループ再生に置き換えます。
#       ウゴウゴする顔や口パクなどができる予感。
#       これらのアニメ指定で、n を 0 にするとアニメOFFになります。
#
# ◇置き換え/描画強化---------------------------------------------------◇
#
# \ \MAP  □現在のマップ名に置き換えます。
#       マップ名の # 以降の文字列は無視されます。
#       例:テストマップ#その1 → テストマップ
#       ※ # を2つ以上含んだマップ名の場合、うまく描画されません
# \ \VO[n] □用語。設定箇所で定義した、n 番の用語に置き換えます。
# \ \IC[n] □アイコン。n番のインデックスのアイコンを描画します。
# \ \IN[n,m]□アイテム名。n の種類の m 番のアイテムの名前を描画します。
#       種類(n):0 = アイテム 1 = 武器 2 = 防具 3 = スキル
# \ \IT[n,m]□アイコン+アイテム名。nの種類のm番のアイテムを描画します
#       種類(n):0 = アイテム 1 = 武器 2 = 防具 3 = スキル
# \ \SPIX[n]□スペース。nピクセルの空白を挿入します。
#
# ◇フォント------------------------------------------------------------◇
#
# \ \R[t,r] □ルビ振り。t に通常の文字、r にルビ文字を指定します。
#       例:\r[野口英世,1000YEN]
#       ルビサイズは 文字サイズ / 2 です。
#       ※ルビサイズが小さくなりすぎるとエラーがでます。
#        ご注意ください。
# \* \AL[n] □文字揃え。その行の文字揃えを設定します。
#       n:0 = 左 1 = 中央 2 = 右
#       ○設定箇所でデフォルトの文字そろえを設定できます。
# \* \F[n]  □フォント。設定箇所で定義したリストの
#       n 番のフォントに設定します。
# \* \FS[n] □フォントサイズ。n のサイズに設定します。
#       n に D を入れると、デフォルトのフォントサイズに設定します。
#       \fs[d] この様に、d は小文字でも可。
#       ※小さすぎる値もしくは大きすぎる値を指定するとエラーがでます。
#        ご注意ください。
#  * \B   □太字モードON/OFF
#  * \I   □斜体モードON/OFF
#  * \E   □縁取りモードON/OFF(エッジ)
# \ \CE[n] □縁取りカラー設定。設定箇所で定義したリストの
#       n 番のカラーに設定します。
# * \UND  □アンダーライン(_)ON/OFF
# * \STR  □打ち消し線ON/OFF
#
# ◇スイッチ/変数操作---------------------------------------------------◇
#
# \ \SW[i,f]□スイッチ操作。i に操作するスイッチID、
#       fにON,OFF,RV(ON/OFF/反転)のいずれかを指定します。
#       例:\sw[\v[128],rv] → 変数128番の値のスイッチを反転
# \ \VA[i,n]□変数代入。i に操作する変数ID、n に代入する値を指定します。
#       例:\va[256,-512] → 変数256番に-512を代入
#       ※あくまで補助的な制御文字なので、
#        代入以外の操作は行えません。また、少数の代入も非サポートです。
#
#------------------------------------------------------------------------------
#
# ★その他の機能
#
# □行数拡張
# イベントコマンド等のスクリプトで、以下のスクリプトを実行すると
# メッセージの最大行数を拡張することができます。
#
# $game_message.maxlineex = line
#
# line に最大行数を指定します。初期値は 4、推奨値は 4 の倍数です。
# 5 以上に指定した時、\NEXTの制御文字を含めた文章コマンドを並べることで、
# 五行以上のメッセージを流すことが可能です。
# 長い説明(プレイングマニュアル等)に便利。
#
# □ウィンドウ位置/サイズ強制指定
# イベントコマンド等のスクリプトで、以下のスクリプトを実行すると
# ウィンドウ位置とサイズを強制指定することが出来ます。
#
# $game_message.xywh.set(240, 176, 64, 64)
#
# 括弧には(X座標, Y座標, 幅, 高さ)の順に数値を指定します。
# 初期値は(0, 0, 32, 32)です。幅と高さのどちらかが33未満の場合、
# 位置/サイズ強制指定は無効になります。
#
# □オートネームウィンドウ
# 設定箇所で定義した顔グラフィックが指定された場合、
# 自動でネームウィンドウを表示します。
# この機能によるネームウィンドウ表示をさせたくない時は、
# \NA[]とメッセージに記入してください。
#
# □メッセージ二倍速流し/高速メッセージスキップ
# 設定箇所で指定したボタンが押されている間、
# メッセージを高速でスキップします。
# 設定箇所で指定したスイッチをONにする事で
# 機能を無効にすることが可能です。
#
# □タイピングSE
# メッセージ描画時に効果音を鳴らせるようになります。
# 設定箇所で複数設定する事ができ、変数を使って鳴らす音を
# 変更する事が可能です。
#
# □スリムウィンドウ
# 16+16ピクセルを占める枠部分を縮めて、
# メッセージウィンドウをスリムに見せます。
# 設定箇所で指定したピクセル分だけウィンドウを縮めます。 
#
# □ポーズサイン位置変更
# ポーズサインの位置をある程度変更出来るようになります。
# (デフォルトのポーズサイン位置は下中央)
# 
# □顔グラフィックサイズ変更
# 顔グラフィック一枚あたりのサイズを変更する事が出来ます。
# 
# □フェードタイプ変更
# 通常の縦開閉タイプに加え、透明度を変化させるタイプの
# フェードイン/アウトに設定する事ができます。
#
# □Etc...
#
#==============================================================================
#
# ○追加機能案はいつでも受付中。なにかあったらどうぞ。
#  他のメッセージ系スクリプトとの併用が絶望的なので
#  「○○の△△を作ってくれー」とか言ってくれれば
#  出来る限り機能再現します。
#
#==============================================================================


#==============================================================================
# ★RGSS2
# STR22Core_メッセージウィンドウEXT++/本体 v1.2 08/02/17
# サポート:http://otsu.cool.ne.jp/strcatyou/
#
# ・メッセージ機能を大幅に拡張強化強化します。
# ・37種類もの制御文字を追加。コレを使いこなせる人はスゴイ。
# ・いろいろマニアックな仕様になっていますが、
#  その辺りは実際に使って覚えてください。
# ・えくすてんどぷらすぷらす、と読む。どうでもいい
# ※STR09と併用しないでください。STR09の機能はこのスクリプトに含まれています。
#
#------------------------------------------------------------------------------
#
# 更新履歴
# ◇1.1→1.2
# STR11bとうまく併用できないバグを修正・一部仕様改善
# ◇1.00→1.1
# バトルメッセージの挙動がおかしいバグを修正
# バグ修正ラッシュを想定して、このバージョンから設定箇所と分割。
# ◇0.95β→1.00
# フキダシアイコン表示の制御文字を追加(\U[n,m])
# 一部処理を軽量化・ポーズサインの座標指定の仕様変更
# ネームウィンドウのフォントをある程度指定できるようになった
# 設定箇所追加・地味に解像度変更に対応
# ふきだし反転判定のXY値が間違ってたバグを修正
# いろいろ
# ◇0.95β
# テストバージョン
#
#==============================================================================
# ■ Window_Message
#==============================================================================
class Window_Message < Window_Selectable
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化(エイリアス)
  #--------------------------------------------------------------------------
  alias initialize_str22 initialize
  def initialize
    # 初期設定
    initialize_vocab            # 用語リスト作成
    @mwextpp = true             # EXT判定
    @fade_type = FADE_TYPE      # フェードタイプ
    @indent_fx = 0              # 顔グラフィックによるインデント
    @pause_x = @pause_y = 0     # ポーズサイン座標
    shake_reset                 # シェイク
    @s_window_w = S_WINDOW_W
    @s_window_h = S_WINDOW_H
    # ポーズサインスプライト
    @pause_window = Sprite_STRPause.new
    # 同期ウィンドウ作成
    @slim_window = Window.new if S_WINDOW
    # ネームウィンドウ
    name = Cache.system("Window").clone
    name.clear_rect(80, 16, 32, 32)
    @name_sprite = Sprite.new
    @name_d_window = Window.new
    @name_d_window.width = 24
    @name_d_window.height = 24
    @name_d_window.windowskin = name
    @name_sprite.visible = false
    @name_d_window.visible = false
    # ふきだしスプライト
    @popup = Sprite.new
    @popup.bitmap = Cache.system(POPUP_FILE)
    @popup.src_rect.set(0, 0, 32, 64)
    @popup.visible = false
    # フェイススプライト
    @face_sprite = Sprite_STRFace.new(nil)
    # 呼び戻し
    initialize_str22
    # リサイズ
    self.x = WINDOW_RECT.x
    self.y = WINDOW_RECT.y
    self.width = WINDOW_RECT.width
    self.height = WINDOW_RECT.height
    # いろいろ初期化
    @w_opacity = 0              # 不透明度
    @face_lr = 0                # 顔グラフィック位置
    @contents_width = [0]       # 各行の幅
    @contents_y_line = [0]      # 選択肢用縦幅配列
    @e_color = 0                # 縁取りカラーインデックス
    @messe_wait = 0             # タイピングSEウェイト
    @popid = @popid_f = -99     # ポップアップ/ふきだしID
    @name_text = ""             # ネームウィンドウ
    @text_speed = 0             # 文章スピード
    @und_on = @str_on = false   # アンダーライン/打ち消し線ONフラグ
    reset_ext                   # 共通リセット
  end
  #--------------------------------------------------------------------------
  # ● 解放(エイリアス)
  #--------------------------------------------------------------------------
  alias dispose_str22 dispose
  def dispose
    # 呼び戻し
    dispose_str22
    # ポーズサイン・スリムウィンドウ・
    # ネームウィンドウ・フェイススプライト開放
    @pause_window.dispose
    @slim_window.dispose if S_WINDOW
    @name_sprite.bitmap.dispose if @name_sprite.bitmap != nil
    @name_sprite.dispose
    @name_d_window.dispose
    @face_sprite.bitmap.dispose if @face_sprite.bitmap != nil
    @face_sprite.dispose
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新(エイリアス)
  #--------------------------------------------------------------------------
  alias update_str22 update
  def update
    @messe_wait -= 1 if @messe_wait > 0 # SE再生間隔調整ウェイトを進める
    # フェード処理
    update_str22                        # 呼び戻し
    if @background == 0
      self.opacity = @w_opacity
    else
      self.opacity = 0
    end
    self.contents_opacity = @w_opacity
    @face_sprite.update                 # フェイススプライト更新
    update_shake                        # シェイク更新
    return unless $game_message.visible # メッセージ非表示ならリターン
    return unless (Graphics.frame_count % STR22100) == 0
    @pause_window.update if self.pause  # ポーズサイン更新
    # ネームスプライト・フェイススプライトの可視状態設定
    @name_sprite.visible = (self.openness == 255)
    @face_sprite.visible = @name_sprite.visible
    # キャラポップアップ中の場合、座標更新
    r = $game_message.xywh
    window_xy_update if @popid != -99 and (r.width <= 32 or r.height <= 32)
    # ふきだしの座標更新・可視状態設定
    window_xy_update_f if @popid_f != -99
    @popup.visible = false if self.opacity != 255
    # 数値入力(スクロールに対応させるため)
    number_xy_update if $game_message.num_input_variable_id > 0
  end
  #--------------------------------------------------------------------------
  # ● 背景スプライトの更新
  #--------------------------------------------------------------------------
  def update_back_sprite
    r = $game_message.xywh
    a = [self.openness, @w_opacity][FADE_TYPE]
    @back_sprite.visible = (@background == 1)
    @back_sprite.x = self.x + (self.width / 2)
    @back_sprite.y = self.y + (self.height / 2)
    @back_sprite.opacity = a
    @back_sprite.update
  end
  #--------------------------------------------------------------------------
  # ● ポップアップ用座標計算(追加)
  #--------------------------------------------------------------------------
  def window_xy_update
    # IDで分岐
    case @popid
    when -1 ; event = $game_player                             # プレイヤー
    when  0 ; event = $game_map.events[$game_message.event_id] # このイベント
    else    ; event = $game_map.events[@popid]                 # 指定イベントID
    end
    return if event == nil
    # X座標
    wx = event.screen_x - (self.width / 2)
    position = @position
    # プレイヤーの位置でポップアップ位置変更
    if @popid == 0
      if $game_player.screen_y >= event.screen_y
        position = 0
      else
        position = 2
      end
    end
    # ポジション別にY座標計算
    case position
    when 0  # 上
      @gold_window.y = 360
      # キャラクターの高さ
      if event.tile_id > 0
        pop_y = 32
      else
        b = Cache.character(event.character_name)
        sign = event.character_name[/^[\!\$]./]
        if sign != nil and sign.include?('$')
          pop_y = b.height / 4
        else
          pop_y = b.height / 8
        end
        pop_y -= 4 unless sign != nil and sign.include?('!')
      end
      pop_y += 16
      #
      wy = event.screen_y - self.height - pop_y
    when 1  # 中
      @gold_window.y = 0
      wy = event.screen_y - (self.height / 2)
    when 2  # 下
      @gold_window.y = 0
      wy = event.screen_y + 16
    end
    # 設定
    self.x = [[wx, STR22900[0] - self.width].min, 0].max
    self.y = [[wy, STR22900[1] - self.height].min, 0].max
  end
  #--------------------------------------------------------------------------
  # ● ふきだし座標計算(追加)
  #--------------------------------------------------------------------------
  def window_xy_update_f
    @popup.visible = false
    # IDで分岐
    case @popid_f
    when -1 ; event = $game_player                             # プレイヤー
    when  0 ; event = $game_map.events[$game_message.event_id] # このイベント
    else    ; event = $game_map.events[@popid_f]               # 指定イベントID
    end
    return if @popid_f == -2 or event == nil
    src_y = $game_variables[POPUP_TYPE_V] * 64
    @popup.visible = true if self.openness == 255
    if event.screen_y < self.y + (self.height / 2)
      position = 2
      @popup.src_rect.set(32, src_y, 32, 64)
      my = self.y - 32 + (@s_window_h / 2)
    else
      position = 0
      @popup.src_rect.set(0, src_y, 32, 64)
      my = self.y + self.height - 32 - (@s_window_h / 2)
    end
    x = event.screen_x - 16
    mx = self.x + 16 + (@s_window_w / 2)
    mw = self.x + self.width - 48 - (@s_window_w / 2)
    @popup.x = [[x, mw].min, mx].max
    @popup.y = my
    if POPUP_MIRROR
      case position
      when 0 ; @popup.mirror = (event.screen_x > @popup.x + 16)
      when 2 ; @popup.mirror = (event.screen_x > @popup.x + 16)
      end
      @popup.mirror ^= true if POPUP_LR == 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 数値入力ウィンドウ座標セット
  #--------------------------------------------------------------------------
  def number_xy_update
    @number_input_window.x = self.x
    if @face_lr == 0 and not $game_message.face_name.empty?
      @number_input_window.x += FACE_SIZE[0] + FACE_SPACE
    end
    @number_input_window.y = self.y + @contents_y
  end
  #--------------------------------------------------------------------------
  # ● タイピングSE再生
  #--------------------------------------------------------------------------
  def typese_update
    if @messe_wait <= 0
      MESSAGE_SE[$game_variables[MESSE_VNUM]].play
      @messe_wait = MESSE_WAIT
      @messe_wait = $game_variables[MESSE_VWAI] if $game_variables[MESSE_VWAI] > 0
    end
  end
  #--------------------------------------------------------------------------
  # ● 文字揃えセット
  #--------------------------------------------------------------------------
  def align_set
    cx = @contents_x
    w = @contents_width[@line_count]
    w += FACE_SIZE[0] + FACE_SPACE if @face_lr == 1
    case @line_align[@line_count]
    when 1 ; @contents_x += (self.width - 32 - cx - w) / 2
    when 2 ; @contents_x += self.width - 32 - cx - w
    end
  end
  #--------------------------------------------------------------------------
  # ● 共通リセット(改ページ/改行)
  #--------------------------------------------------------------------------
  def reset_ext
    @maxtextsize = WLH           # 行中の最大テキストサイズ
    @line_show_fast = false      # 行早送り
    @font_index = 0              # フォントインデックス
    @font_size = DEFAULT_SIZE    # フォントサイズ
    @e_text = false              # 縁取りテキストフラグ
    @font_bold = false           # 太字フラグ
    @font_italic = false         # 斜体フラグ
    @bold_off = false            # 太字OFFフラグ
    @italic_off = false          # 斜体OFFフラグ
    @tx_und = false              # アンダーラインフラグ
    @tx_str = false              # 打ち消し線フラグ
    @r_mode = false              # ルビ描画モード
    @rbx = 0                     # ルビ開始X座標
    @rbw = 0                     # ルビ幅
  end
  #--------------------------------------------------------------------------
  # ● 改ページ処理(再定義)
  #--------------------------------------------------------------------------
  def new_page
    contents.clear                      # コンテンツクリア
    @contents_x = 0                     # 描画X座標
    @contents_y = 0                     # 描画Y座標
    @line_count = 0                     # 現在の行
    @show_fast = false                  # 早送り
    @pause_skip = false                 # ポーズを待たない
    # フェイススプライト設定
    @face_sprite.set_face("", 0, FACE_SIZE[0], FACE_SIZE[1])
    unless $game_message.face_name.empty?
      name = $game_message.face_name
      index = $game_message.face_index
      @face_sprite.set_face(name, index, FACE_SIZE[0], FACE_SIZE[1])
      @contents_x = FACE_SIZE[0] + FACE_SPACE if @face_lr == 0
    end
    @indent_fx = @contents_x            # インデント
    contents.font.color = text_color(0) # カラー初期化
    @e_color = 0                        # 縁取りカラー初期化
    @messe_wait = 0                     # タイピングSEウェイト
    @name_text = ""                     # ネームウィンドウを空に
    @text_speed = 0                     # 文章スピード
    reset_ext                           # 共通リセット
    align_set                           # 文字揃えセット
    self.x = self.x                     # ウィンドウを同期
  end
  #--------------------------------------------------------------------------
  # ● 改行処理(再定義)
  #--------------------------------------------------------------------------
  def new_line
    @contents_x = 0              # 描画X座標
    @contents_y += @maxtextsize  # 描画Y座標
    @line_count += 1             # 行を進める
    # フェイスによるインデントを設定
    unless $game_message.face_name.empty?
      @contents_x = FACE_SIZE[0] + FACE_SPACE if @face_lr == 0
    end
    reset_ext                    # 共通リセット
    align_set                    # 文字揃えセット
  end
  #--------------------------------------------------------------------------
  # ● メッセージの開始(エイリアス)
  #--------------------------------------------------------------------------
  alias start_message_str22 start_message
  def start_message
    start_message_str22
    Graphics.frame_reset if STR22101
  end
  #--------------------------------------------------------------------------
  # ● メッセージの終了(エイリアス)
  #--------------------------------------------------------------------------
  alias terminate_message_str22 terminate_message
  def terminate_message
    @face_sprite.animation_id = @face_sprite.loop_animation_id = 0
    @contents_y_line = [0]
    @popid = @popid_f = -99
    terminate_message_str22
  end
  #--------------------------------------------------------------------------
  # ● 特殊文字の変換(エイリアス)
  #--------------------------------------------------------------------------
  alias convert_special_characters_str22 convert_special_characters
  def convert_special_characters
    # 変数・マクロ
    @text.gsub!(/\\V\[([0-9]+)\]/i)    { $game_variables[$1.to_i] }
    @text.gsub!(/\\M\[([0-9]+)\]/i)    { MACRO[$1.to_i] }
    # 呼び戻し
    convert_special_characters_str22
    @text.gsub!(/\\g/)                 { "\x02" }
    # 現在のマップ名
    @text.gsub!(/\\MAP/i)              { $game_map.map_name_strextpp }
    # 用語
    @text.gsub!(/\\VO\[([0-9]+)\]/i)   { @vo[$1.to_i] }
    # アイコン・アイテム
    i = [$data_items, $data_weapons, $data_armors, $data_skills]
    @text.gsub!(/\\IT\[([0-9]+),([0-9]+)\]/i)   {
    "\\IC[#{i[$1.to_i][$2.to_i].icon_index.to_s}]\\IN[#{$1},#{$2}]" }
    @text.gsub!(/\\IC\[([0-9]+)\]/i)            { "\x10[#{$1}]" }
    @text.gsub!(/\\IN\[([0-9]+),([0-9]+)\]/i)   { i[$1.to_i][$2.to_i].name }
    # アニメーション
    @text.gsub!(/\\A\[([0-9]+),([0-9]+)\]/i)    { "\x11[#{[$1]},#{[$2]}]" }
    @text.gsub!(/\\A\[\-1,([0-9]+)\]/i)         { "\x11[9999,#{[$1]}]" }
    # バルーン
    @text.gsub!(/\\U\[([0-9]+),([0-9]+)\]/i)    { "\xb0[#{[$1]},#{[$2]}]" }
    @text.gsub!(/\\U\[\-1,([0-9]+)\]/i)         { "\xb0[9999,#{[$1]}]" }
    # 文字揃え
    @text.gsub!(/\\AL\[([0-9]+)\]/i)            { "\x12[#{$1}]" }
    # ルビ
    @text.gsub!(/\\R\[([^\[\]\s]+),([^\[\]\s]+)\]/i){ "\x98#{$1}\x99[#{$2}]" }
    # ネームウィンドウ
    @text.sub!(/\\NA\[([^\[\]\s]*)\]/i){ "\x89[#{$1}]]" }
    # フェイス
    @text.gsub!(/\\FR/i)               { "\x13" }
    @text.gsub!(/\\FM/i)               { "\x14" }
    @text.gsub!(/\\FC\[([^\[\]\s]+),([0-9]+)\]/i) { "\xa1[#{$1}][#{$2}]" }
    @text.gsub!(/\\FCM/i)              { "\xa2" }
    @text.gsub!(/\\FA\[([0-9]+)\]/i)   { "\x15[#{$1}]" }
    @text.gsub!(/\\FAL\[([0-9]+)\]/i)  { "\x16[#{$1}]" }
    @text.gsub!(/\\FLC\[([0-9]+)\]/i)  { "\x17[#{$1}]" }
    # メッセージ表示中移動・ストップ・ウェイト・文章スピード
    @text.gsub!(/\\MOVE/i)             { "\xa3" }
    @text.gsub!(/\\STOP/i)             { "\x18" }
    @text.gsub!(/\\W\[([0-9]+)\]/i)    { "\x94[#{$1}]" }
    @text.gsub!(/\\S\[([0-9]+)\]/i)    { "\x93[#{$1}]" }
    # フォント
    @text.gsub!(/\\E/i)                { "\x81" }
    @text.gsub!(/\\FS\[([0-9]+)\]/i)   { "\x82[#{$1}]" }
    @text.gsub!(/\\FS\[D\]/i)          { "\xa0" }
    @text.gsub!(/\\B/i)                { "\x83" }
    @text.gsub!(/\\I/i)                { "\x84" }
    @text.gsub!(/\\F\[([0-9]+)\]/i)    { "\x85[#{$1}]" }
    @text.gsub!(/\\CE\[([0-9]+)\]/i)   { "\x86[#{$1}]" }
    @text.gsub!(/\\UND/i)              { "\x95" }
    @text.gsub!(/\\STR/i)              { "\x96" }
    # ポップアップ・ふきだし
    @text.sub!(/\\P\[([0-9]+)\]/i)     { "\x87[#{$1}]" }
    @text.sub!(/\\P\[\-1+\]/i)         { "\x88" }
    @text.sub!(/\\PP\[([0-9]+)\]/i)    { "\x90[#{$1}]" }
    @text.sub!(/\\PP\[\-1+\]/i)        { "\x91" }
    @text.sub!(/\\PP\[\-2+\]/i)        { "\x92" }
    # シェイク
    @text.gsub!(/\\SH\[(\d+),(\d+),(\d+)\]/i) { "\xa4[#{[$1]},#{[$2]},#{[$3]}]" }
    # スイッチ/変数
    @text.gsub!(/\\SW\[(\d+),ON\]/i)      { "\xa5[#{$1}]" }
    @text.gsub!(/\\SW\[(\d+),OFF\]/i)     { "\xa6[#{$1}]" }
    @text.gsub!(/\\SW\[(\d+),RV\]/i)      { "\xa7[#{$1}]" }
    @text.gsub!(/\\VA\[(\d+),(\d+)\]/i)   { "\xa8[#{$1},#{$2}]" }
    @text.gsub!(/\\VA\[(\d+),\-(\d+)\]/i) { "\xa9[#{$1},#{$2}]" }
    # ネクスト
    @text.gsub!(/\\NEXT/i)                { "" }
    # 空白
    @text.gsub!(/\\SPIX\[([0-9]+)\]/i)    { "\x97[#{$1}]" }
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウリセット-F(追加)
  #--------------------------------------------------------------------------
  def reset_window_f
    # 各行の文字揃え
    ar = []
    for i in 0..$game_message.maxlineex
      ar[i] = ALIGN
    end
    @line_align = ar
    # 更新ストップオフ
    $game_message.mapstop = false
    # フェイス
    @face_sprite.no_face = false    # カオナシフラグ アッアッアー
    @face_lr = 0                    # 顔位置
    @face_sprite.mirror = false     # 顔反転
    # バック・ポジション取得
    @background = $game_message.background
    @position   = $game_message.position
    # 透明ウィンドウなら透明に
    if @background != 0
      @w_opacity = 0
      self.opacity = @w_opacity
      if @background == 1
        @back_sprite.bitmap.dispose
        @back_sprite.bitmap = Cache.system(MESBACK_LIST[$game_variables[MESBACK_VA]])
        @back_sprite.ox = @back_sprite.bitmap.width / 2
        @back_sprite.oy = @back_sprite.bitmap.height / 2
      end
    end
    # 縦開閉フェードの場合不透明度255
    @w_opacity = 255 if FADE_TYPE == 0
    # 透明度変化フェードの場合オープン度255
    self.openness = 255 if FADE_TYPE == 1
    # オートネームウィンドウの設定
    if not $game_message.face_name.empty?
      name = $game_message.face_name + "_" + $game_message.face_index.to_s
      @name_text = A_N_WINDOW[name] if A_N_WINDOW[name] != nil
      if @name_text[/Actor\[(\d+)\]/i] != nil
        @name_text.sub(/Actor\[(\d+)\]/i, "")
        @name_text = $game_actors[$1.to_i].name
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● ネームウィンドウ設定(追加)
  #--------------------------------------------------------------------------
  def name_window_set
    # ネームウィンドウ設定
    @name_sprite.bitmap.dispose if @name_sprite.bitmap != nil
    @name_sprite.bitmap = nil
    unless @name_text.empty?
      # 計算用ダミービットマップ
      bitmap = Cache.system("")
      bitmap.font.name = N_WINDOW_FN
      bitmap.font.size = N_WINDOW_FS
      tw = bitmap.text_size(@name_text).width + 8
      # ビットマップ作成
      bitmap = Bitmap.new(tw, bitmap.font.size + 4)
      bitmap.font.name = N_WINDOW_FN
      bitmap.font.size = N_WINDOW_FS
      bitmap.font.color = N_WINDOW_CO
      unless N_WINDOW_ED
        bitmap.draw_text(0, 0, bitmap.width, bitmap.height, @name_text, 1)
      else
        co = N_WINDOW_CE
        bitmap.draw_text_f(0, 0, bitmap.width, bitmap.height, @name_text, 1, co)
      end
      # スプライト設定
      @name_sprite.bitmap = bitmap
      @name_sprite.ox = bitmap.width / 2
      @name_sprite.oy = bitmap.height / 2
      # ネームウィンドウリサイズ
      @name_d_window.width = bitmap.width + N_WINDOW_WH[0]
      @name_d_window.height = bitmap.height + N_WINDOW_WH[1]
    end
    # ネームウィンドウ可視状態設定
    @name_d_window.visible = (self.visible and not @name_text.empty?)
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウリセット
  #--------------------------------------------------------------------------
  def reset_window
    reset_window_f    # ウィンドウリセット-F
    shake_reset       # シェイク
    # いろいろ初期化
    ar = []
    for i in 0..$game_message.maxlineex
      ar[i] = 0
    end
    @pause_x = @pause_y = 0             # ポーズサイン座標
    @rb_h = ar                          # ルビ高さ
    str_line_size = 0                   # ライン
    contents_x = [0]                    # X配列
    contents_y = [0]                    # Y配列
    text = @text.clone                  # テキスト
    maxtextsize = WLH                   # 最大テキストサイズ
    font_size = DEFAULT_SIZE            # フォントサイズ
    font_index = 0                      # フォント
    e_text = false                      # 縁取り
    font_bold = false                   # 太字
    bold_off = false                    # 太字OFFフラグ
    font_italic = false                 # 斜体
    italic_off = false                  # 斜体OFFフラグ
    #-----------------------------------------------------------
    # ★ 内容先読みループ/ウィンドウサイズ等を正確に割り出す
    loop do
      c = text.slice!(/./m)             # 次の文字を取得
      case c
      when nil ; break                  # 残りの文字が無い場合、ループ中断
      when "\x02"                       # \G  (所持金表示)
      when "\x03"                       # \.  (ウェイト 1/4 秒)
      when "\x04"                       # \|  (ウェイト 1 秒)
      when "\x05"                       # \!  (入力待ち)
      when "\x06"                       # \>  (瞬間表示 ON)
      when "\x07"                       # \<  (瞬間表示 OFF)
      when "\x08"                       # \^  (入力待ちなし)
      when "\x01" ;text.sub!(/\[([0-9]+)\]/, "")   # \C[n]  (文字色変更)
      when "\x81" ;e_text ^= true                  # \E
      when "\x88" ;@popid = @popid_f =  -1         # \P[-1]
      when "\x91" ;@popid_f = -1                   # \PP[-1]
      when "\x92" ;@popid_f = -2                   # \PP[-2]
      when "\x93" ;text.sub!(/\[([0-9]+)\]/, "")   # \S[n]
      when "\x94" ;text.sub!(/\[([0-9]+)\]/, "")   # \W[n]
      when "\x95"                                  # \UND
      when "\x96"                                  # \STR
      when "\x11" ;text.sub!(/\[([0-9]+)\,([0-9]+)\]/, "")# \A[n]
      when "\xb0" ;text.sub!(/\[([0-9]+)\,([0-9]+)\]/, "")# \U[n]
      when "\x13" ;@face_lr = 1                    # \FR
      when "\x14" ;@face_sprite.mirror = true      # \FM
      when "\x15" ;text.sub!(/\[([0-9]+)\]/, "")   # \FA[n]
      when "\x16" ;text.sub!(/\[([0-9]+)\]/, "")   # \FAL[n]
      when "\x18" ;$game_message.mapstop = true    # \STOP
      when "\x98"                                  # \R
      when "\xa0" ;font_size = DEFAULT_SIZE        # \FS[d]
      when "\xa1" ;text.sub!(/\[([^\[\]\s]+)\]\[([0-9]+)\]/, "")# \FC[n,m]
      when "\xa2"                                  # \FCM
      when "\xa4" ;text.sub!(/\[\d+,\d+,\d+\]/, "")# \SH[p,s,d]
      when "\xa5" ;text.sub!(/\[\d+\]/, "")        # \SW[id,ON]
      when "\xa6" ;text.sub!(/\[\d+\]/, "")        # \SW[id,OFF]
      when "\xa7" ;text.sub!(/\[\d+\]/, "")        # \SW[id,RV]
      when "\xa8" ;text.sub!(/\[\d+,\d+\]/, "")    # \VA[id,n]
      when "\xa9" ;text.sub!(/\[\d+,\d+\]/, "")    # \VA[id,n]
      when "\x00"                       # 改行
        contents_x[str_line_size] += font_size / STR22002 + 2 if font_italic or italic_off
        str_line_size += 1
        contents_x[str_line_size] = 0
        contents_y[str_line_size] = 0
        contents_y[str_line_size] += maxtextsize + @rb_h[str_line_size - 1]
        maxtextsize = WLH               # 最大テキストサイズ
        font_size = DEFAULT_SIZE        # フォントサイズ
        font_index = 0                  # フォント
        e_text = false                  # 縁取り
        font_bold = bold_off = false    # 太字
        font_italic = italic_off = false# 斜体
        if str_line_size >= $game_message.maxlineex # 行数が最大のとき
          break unless text.empty?      # ループ中断
        end
      when "\x82"                                  # \FS[n]
        text.sub!(/\[([0-9]+)\]/, "")
        font_size = $1.to_i
      when "\x83"                                  # \B
        bold_off = true if font_bold
        font_bold ^= true
      when "\x84"                                  # \I
        italic_off = true if font_italic
        font_italic ^= true
      when "\x85"                                  # \F[n]
        text.sub!(/\[([0-9]+)\]/, "")
        font_index = $1.to_i
      when "\x86"                                  # \CE[n]
        text.sub!(/\[([0-9]+)\]/, "")
        e_color = $1.to_i
      when "\x87"                                  # \P[n]
        text.sub!(/\[([0-9]+)\]/, "")
        @popid = @popid_f = $1.to_i
      when "\x90"                                  # \PP[n]
        text.sub!(/\[([0-9]+)\]/, "")
        @popid_f = $1.to_i
      when "\x89"                                  # \NA[s]
        text.sub!(/\[([^\[\]\s]*)\]\]/, "")
        @name_text = $1
      when "\x97"                                  # \SPIX[n]
        text.sub!(/\[([0-9]+)\]/, "")
        contents_x[str_line_size] += $1.to_i
      when "\x10"                                  # \IC[n]
        text.sub!(/\[([0-9]+)\]/, "")
        contents_x[str_line_size] += STR22009
      when "\x12"                                  # \AL[n]
        text.sub!(/\[([0-9]+)\]/, "")
        @line_align[str_line_size] = $1.to_i
      when "\x17"                                  # \FLC[n]
        text.sub!(/\[([0-9]+)\]/, "")
        @face_sprite.loop_animation_id = $1.to_i
        @face_sprite.no_face = true
      when "\xa3"                                  # \MOVE
        $game_message.mes_move = $game_switches[MESMOVE] = true
        $game_map.need_refresh = true
      when "\x99"                                  # \R
        text.sub!(/\[([^\[\]\s]+)\]/, "")
        size = (font_size / STR22008)
        @rb_h[str_line_size] = size if size > @rb_h[str_line_size]
      else                                         # 普通の文字
        # 字体別文字幅修正
        unless italic_off
          iw = 0
        else
          iw = contents.font.size / STR22000
          italic_off = false
        end
        if bold_off
          iw += contents.font.size / STR22001
          bold_off = false
        end
        # フォント設定読み込み
        contents.font.name = FONTLIST[font_index]
        contents.font.size = font_size
        contents.font.bold = font_bold
        contents.font.italic = font_italic
        maxtextsize = font_size if font_size > maxtextsize
        wlh = maxtextsize
        contents.font.bold = false
        c_width = contents.text_size(c).width + iw
        contents_x[str_line_size] += c_width
      end
    end
    # ★ 内容先読みループ ここまで
    #-----------------------------------------------------------
    # ネームウィンドウ設定
    name_window_set
    # 顔グラフィックを表示するか
    face = (not $game_message.face_name.empty?)
    # 高さを求める
    h = 0
    for i in contents_y
      h += i
    end
    # フェイス表示時の高さが足りない場合
    h = WINDOW_RECT.height - 32 if face and (32 + h < WINDOW_RECT.height)
    if $game_message.xywh.width > 32 and $game_message.xywh.height > 32
      # 強制位置設定/リサイズ
      self.x = $game_message.xywh.x
      self.y = $game_message.xywh.y
      self.width = $game_message.xywh.width
      self.height = $game_message.xywh.height
    elsif @popid != -99 # ポップアップが有効な場合
      # 幅を求める
      w = contents_x[0]
      if contents_x.size > 2
        for i in 1...contents_x.size
          w = contents_x[i] if contents_x[i] > w
        end
      end
      # 数値入力位置修正
      input = ($game_message.num_input_variable_id > 0)
      input_w = 50 + (16 * $game_message.num_input_digits_max)
      if face
        indent = FACE_SIZE[0] + FACE_SPACE
        w += indent
        w = input_w + indent if input and w < input_w + indent
      else
        w = input_w if input and w < input_w
      end
      # リサイズ
      self.width = 32 + w
      self.height = 32 + h
      window_xy_update
    else
      # 通常ウィンドウ(ポップアップ無し)
      h = WINDOW_RECT.height - 32 if 32 + h < WINDOW_RECT.height
      self.width = WINDOW_RECT.width
      self.height = 32 + h
      self.x = WINDOW_RECT.x
      # ポジション別座標設定
      @gold_window.y = 0
      self.y = 0
      case @position
      when 0 ; @gold_window.y = STR22900[1] - 56
      when 1 ; self.y = (STR22900[1] / 2) - (self.height / 2)
      when 2 ; self.y = STR22900[1] - self.height
      end
    end
    # XY座標幅高さの情報格納
    @contents_width = contents_x
    @contents_y_line[0] = []
    @contents_y_line[1] = contents_y
    for i in 0...contents_y.size
      @contents_y_line[0][i] = 0
      for l in 0..i
        @contents_y_line[0][i] += contents_y[l]
      end
    end
    create_contents      # コンテンツ作成
  end
  #--------------------------------------------------------------------------
  # ● メッセージの更新(再定義)
  #--------------------------------------------------------------------------
  def update_message
    loop do
      @wait_count = @text_speed if @wait_count <= 0
      c = @text.slice!(/./m)            # 次の文字を取得
      case c
      when nil                          # 描画すべき文字がない
        finish_message                  # 更新終了
        break
      when "\x00"                       # 改行
        new_line
        if @line_count >= $game_message.maxlineex # 行数が最大のとき
          unless @text.empty?           # さらに続きがあるなら
            self.pause = true           # 入力待ちを入れる
            break
          end
        end
      when "\x06" ;@line_show_fast = true         # \>  (瞬間表示 ON)
      when "\x07" ;@line_show_fast = false        # \<  (瞬間表示 OFF)
      when "\x08" ;@pause_skip = true             # \^  (入力待ちなし)
      when "\x88" ;next                           # \P[-1]
      when "\x91" ;next                           # \PP[-1]
      when "\x92" ;next                           # \PP[-2]
      when "\x13" ;next                           # \FR 
      when "\x14" ;next                           # \FM
      when "\x17" ;@text.sub!(/\[([0-9]+)\]/, "") # \FLC[n]
      when "\x18" ;next                           # \STOP
      when "\xa3" ;next                           # \MOVE
      when "\x01"                       # \C[n]  (文字色変更)
        @text.sub!(/\[([0-9]+)\]/, "")
        contents.font.color = text_color($1.to_i)
        next
      when "\x02"                       # \G  (所持金表示)
        @gold_window.refresh
        @gold_window.open
      when "\x03"                       # \.  (ウェイト 1/4 秒)
        @wait_count = 15
        break
      when "\x04"                       # \|  (ウェイト 1 秒)
        @wait_count = 60
        break
      when "\x05"                       # \!  (入力待ち)
        self.pause = true
        break       
      when "\x81"                       # \E
        @e_text ^= true
        next
      when "\x82"                       # \FS[n]
        @text.sub!(/\[([0-9]+)\]/, "")
        @font_size = $1.to_i
        next
      when "\xa0"                       # \FS[d]
        @font_size = DEFAULT_SIZE
        next
      when "\x83"                       # \B
        @bold_off = true if @font_bold
        @font_bold ^= true
        next
      when "\x84"                       # \I
        @italic_off = true if @font_italic
        @font_italic ^= true
        next
      when "\x85"                       # \F[n]
        @text.sub!(/\[([0-9]+)\]/, "")
        @font_index = $1.to_i
        next
      when "\x86"                       # \HC[n]
        @text.sub!(/\[([0-9]+)\]/, "")
        @e_color = $1.to_i
        next
      when "\x87"                       # \P[n]
        @text.sub!(/\[([0-9]+)\]/, "")
        next
      when "\x90"                       # \PP[n]
        @text.sub!(/\[([0-9]+)\]/, "")
        next
      when "\x89"                       # \NA[s]
        @text.sub!(/\[([^\[\]\s]*)\]\]/, "")
        next
      when "\x93"                       # \S[n]
        @text.sub!(/\[([0-9]+)\]/, "")
        @text_speed = $1.to_i
        break
      when "\x94"                       # \W[n]
        @text.sub!(/\[([0-9]+)\]/, "")
        @wait_count = $1.to_i
        break
      when "\x95"                       # \UND
        @tx_und ^= true
        @und_on = true if @tx_und
        next
      when "\x96"                       # \STR
        @tx_str ^= true
        @str_on = true if @tx_str
        next
      when "\x97"                       # \SPIX[n]
        @text.sub!(/\[([0-9]+)\]/, "")
        @contents_x += $1.to_i
        next
      when "\xa4"                       # \SH[p,s,d]
        @text.sub!(/\[(\d+),(\d+),(\d+)\]/, "")
        start_shake($1.to_i, $2.to_i, $3.to_i)
        next
       
      when "\xa5"                       # \SW
        @text.sub!(/\[([0-9]+)\]/, "")
        $game_switches[$1.to_i] = true
        $game_map.need_refresh = true
        next
      when "\xa6"                       # \SW
        @text.sub!(/\[([0-9]+)\]/, "")
        $game_switches[$1.to_i] = false
        $game_map.need_refresh = true
        next
      when "\xa7"                       # \SW
        @text.sub!(/\[([0-9]+)\]/, "")
        $game_switches[$1.to_i] ^= true
        $game_map.need_refresh = true
        next
      when "\xa8"                       # \VA
        @text.sub!(/\[([0-9]+),([0-9]+)\]/, "")
        $game_variables[$1.to_i] = $2.to_i
        $game_map.need_refresh = true
        next
      when "\xa9"                       # \VA
        @text.sub!(/\[([0-9]+),([0-9]+)\]/, "")
        $game_variables[$1.to_i] = -($2.to_i)
        $game_map.need_refresh = true
        next
      when "\x10"                       # \IC[n]
        @text.sub!(/\[([0-9]+)\]/, "")
        wlh = @contents_y_line[1][@line_count+1] / 2
        draw_icon($1.to_i, @contents_x, @contents_y + @rb_h[@line_count] + wlh - (STR22009 / 2))
        @contents_x += STR22009
        typese_update
      when "\x11"                       # \A[n,m]
        @text.sub!(/\[([0-9]+)\,([0-9]+)\]/, "")
        case $1.to_i
        when 9999 ; event = $game_player
        when 0    ; event = $game_map.events[$game_message.event_id]
        else      ; event = $game_map.events[$1.to_i]
        end
        event.animation_id = $2.to_i
      when "\xb0"                       # \U[n,m]
        @text.sub!(/\[([0-9]+)\,([0-9]+)\]/, "")
        case $1.to_i
        when 9999 ; event = $game_player
        when 0    ; event = $game_map.events[$game_message.event_id]
        else      ; event = $game_map.events[$1.to_i]
        end
        event.balloon_id = $2.to_i
      when "\x12"                       # \AL[n]
        @text.sub!(/\[([0-9]+)\]/, "")
        next
      when "\xa1"                       # \FC[n,m]
        @text.sub!(/\[([^\"\[\]\s]+)\]\[([0-9]+)\]/, "")
        unless $game_message.face_name.empty?
          @face_sprite.set_face($1, $2.to_i, FACE_SIZE[0], FACE_SIZE[1])
        end
        next
      when "\xa2"                       # \FCM
        @face_sprite.mirror ^= true
        next
      when "\x15"                       # \FA[n]
        @text.sub!(/\[([0-9]+)\]/, "")
        @face_sprite.animation_id = $1.to_i
      when "\x16"                       # \FAL[n]
        @text.sub!(/\[([0-9]+)\]/, "")
        @face_sprite.loop_animation_id = $1.to_i
      when "\x98"                       # \R
        @r_mode = true
        @rbx = @contents_x
        @rbw = 0
        next
      when "\x99"                       # \R
        @r_mode = false
        @text.sub!(/\[([^\[\]\s]+)\]/, "")
        contents.font.name = FONTLIST[@font_index]
        contents.font.size = (@font_size / 2)
        contents.font.bold = @font_bold
        contents.font.italic = @font_italic
        rw = @contents_y_line[1][@line_count+1] / 2
        rby = @contents_y + @rb_h[@line_count] + rw - (contents.font.size * 2)
        unless @e_text
          contents.draw_text(@rbx, rby, @rbw, contents.font.size, $1, 1)
        else
          # 縁取りON
          co = EDGE_COLOR[@e_color]
          contents.draw_text_f(@rbx, rby, @rbw, contents.font.size, $1, 1, co)
        end
        next
      else                              # 普通の文字
        # いろいろ
        @maxtextsize = wlh = @contents_y_line[1][@line_count+1]
        iw = font_w
        yy = @contents_y + @rb_h[@line_count]
        ww = @font_size + 8
        # 内容描画
        draw_message22_text(iw,yy,ww,wlh,c)     # 通常文字の描画
        draw_message22_und(iw,wlh,c) if @tx_und # アンダーライン
        draw_message22_str(iw,wlh,c) if @tx_str # 打ち消し線
        typese_update                           # タイピングSE
        # 幅加算
        contents.font.bold = false
        c_width = contents.text_size(c).width + iw
        @contents_x += c_width
        @rbw += c_width if @r_mode              # ルビ用文字幅
      end
      break unless @show_fast or @line_show_fast
    end
  end
  #--------------------------------------------------------------------------
  # ● 字体別文字幅修正
  #--------------------------------------------------------------------------
  def font_w
    unless @italic_off
      iw = 0
    else
      iw = contents.font.size / STR22000
      @italic_off = false
    end
    if @bold_off
      iw += contents.font.size / STR22001
      @bold_off = false
    end
    return iw
  end
  #--------------------------------------------------------------------------
  # ● 通常文字の描画
  #--------------------------------------------------------------------------
  def draw_message22_text(iw,yy,ww,wlh,c)
    # フォント設定読み込み
    contents.font.name = FONTLIST[@font_index]
    contents.font.size = @font_size
    contents.font.bold = @font_bold
    contents.font.italic = @font_italic
    # 文字描画
    unless @e_text
      contents.draw_text(@contents_x + iw, yy, ww, wlh, c)
    else
      # 縁取りON
      co = EDGE_COLOR[@e_color]
      contents.draw_text_f(@contents_x + iw, yy, ww, wlh, c, 0, co)
    end
  end
  #--------------------------------------------------------------------------
  # ● アンダーラインの描画
  #--------------------------------------------------------------------------
  def draw_message22_und(iw,wlh,c)
    unless @e_text
      rect = Rect.new(@contents_x + iw,@contents_y+(wlh-2),
                      contents.text_size(c).width + iw,1)
      oc = contents.font.color
      r_color = Color.new(oc.red, oc.green, oc.blue, oc.alpha)
      contents.fill_rect(rect, r_color)
      rect.y += 1
      r_color.alpha /= STR22007
      contents.fill_rect(rect, r_color)
    else
      rect = Rect.new(@contents_x + iw + 1,@contents_y+(wlh-3),
                      contents.text_size(c).width + iw,1)
      oc = EDGE_COLOR[@e_color]
      r_color = Color.new(oc.red, oc.green, oc.blue, oc.alpha - 16)
      contents.fill_rect(rect, r_color)
      rect.x -= 1
      rect.y += 1
      if @und_on
        a = rect.width
        rect.width = 1
        contents.fill_rect(rect, r_color)
        rect.width = a
      end
      rect.x += 2
      contents.fill_rect(rect, r_color)
      rect.x -= 1
      rect.y += 1
      contents.fill_rect(rect, r_color)
      rect.y -= 1
      oc = contents.font.color
      r_color = Color.new(oc.red, oc.green, oc.blue, oc.alpha)
      contents.fill_rect(rect, r_color)
    end
    @und_on = false
  end
  #--------------------------------------------------------------------------
  # ● 打ち消し線の描画
  #--------------------------------------------------------------------------
  def draw_message22_str(iw,wlh,c)
    unless @e_text
      rect = Rect.new(@contents_x + iw,@contents_y+(wlh/2),
                      contents.text_size(c).width + iw,1)
      oc = contents.font.color
      r_color = Color.new(oc.red, oc.green, oc.blue, oc.alpha)
      contents.fill_rect(rect, r_color)
      rect.y += 1
      r_color.alpha /= STR22007
      contents.fill_rect(rect, r_color)
    else
      rect = Rect.new(@contents_x + iw + 1,@contents_y+(wlh/2),
                      contents.text_size(c).width + iw,1)
      oc = EDGE_COLOR[@e_color]
      r_color = Color.new(oc.red, oc.green, oc.blue, oc.alpha - 16)
      contents.fill_rect(rect, r_color)
      rect.x -= 1
      rect.y += 1
      if @str_on
        a = rect.width
        rect.width = 1
        contents.fill_rect(rect, r_color)
        rect.width = a
      end
      rect.x += 2
      contents.fill_rect(rect, r_color)
      rect.x -= 1
      rect.y += 1
      contents.fill_rect(rect, r_color)
      rect.y -= 1
      oc = contents.font.color
      r_color = Color.new(oc.red, oc.green, oc.blue, oc.alpha)
      contents.fill_rect(rect, r_color)
    end
    @str_on = false
  end
  #--------------------------------------------------------------------------
  # ● シェイクの開始
  #--------------------------------------------------------------------------
  def start_shake(power, speed, duration)
    @shake_power = power
    @shake_speed = speed
    @shake_duration = duration
  end
  #--------------------------------------------------------------------------
  # ● シェイクリセット
  #--------------------------------------------------------------------------
  def shake_reset
    @shake = @shake_power = 0
    @shake_speed = @shake_duration = 0
    @shake_direction = 1
  end
  #--------------------------------------------------------------------------
  # ● シェイクの更新
  #--------------------------------------------------------------------------
  def update_shake
    if @shake_duration >= 1 or @shake != 0
      delta = (@shake_power * @shake_speed * @shake_direction) / 10.0
      if @shake_duration <= 1 and @shake * (@shake + delta) < 0
        @shake = 0
      else
        @shake += delta
      end
      if @shake > @shake_power * 2
        @shake_direction = -1
      end
      if @shake < - @shake_power * 2
        @shake_direction = 1
      end
      if @shake_duration >= 1
        @shake_duration -= 1
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウを開く
  #--------------------------------------------------------------------------
  def open
    a = [self.openness, @w_opacity][FADE_TYPE]
    @opening = true if a < 255
    @closing = false
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウを閉じる
  #--------------------------------------------------------------------------
  def close
    a = [self.openness, @w_opacity][FADE_TYPE]
    @closing = true if a > 0
    @opening = false
    if a == 0
      t = $game_switches[MESMOVE]
      $game_message.mes_move = $game_switches[MESMOVE] = false
      $game_map.need_refresh = true if t != $game_switches[MESMOVE]
    end
  end
  #--------------------------------------------------------------------------
  # ● 次のメッセージを続けて表示するべきか判定
  #--------------------------------------------------------------------------
  def continue?
    a = [self.openness, @w_opacity][FADE_TYPE]
    return true if $game_message.num_input_variable_id > 0
    return false if $game_message.texts.empty?
    if a > 0 and not $game_temp.in_battle
      return false if @background != $game_message.background
      return false if @position != $game_message.position
    end
    return true
  end
  #--------------------------------------------------------------------------
  # ★ エイリアス
  #--------------------------------------------------------------------------
  alias finish_message_str09m finish_message
  def finish_message
    finish_message_str09m
    @wait_count = F_WAIT
  end
  alias update_message_str09m update_message
  def update_message
    fast = (not $game_switches[PSID] and not $game_switches[FSID] and Input.press?(FAST_B))
    if F_AUTO
      update_message_str09m
      update_message_str09m if @wait_count <= 0 and @text != nil
      update_message_str09m if @wait_count <= 0 and @text != nil and fast
      update_message_str09m if @wait_count <= 0 and @text != nil and fast
    else
      update_message_str09m
      update_message_str09m if @wait_count <= 0 and @text != nil and fast
    end
  end
  #--------------------------------------------------------------------------
  # ● 早送りフラグの更新(再定義)
  #--------------------------------------------------------------------------
  def update_show_fast
    return if $game_switches[PSID]
    id = (not $game_switches[SSID])
    a = [self.openness, @w_opacity][FADE_TYPE]
    if self.pause or a < 255
      @show_fast = false
    elsif (Input.trigger?(Input::C) or (Input.press?(SKIP_B) and id))
      @show_fast = true
    elsif not Input.press?(Input::C)
      @show_fast = false
    end
    @wait_count = 0 if @show_fast and @wait_count > 0
  end
  #--------------------------------------------------------------------------
  # ● 文章送りの入力処理(再定義)
  #--------------------------------------------------------------------------
  def input_pause
    id = (not $game_switches[SSID])
    if Input.trigger?(Input::B) or Input.trigger?(Input::C) or
       (Input.press?(SKIP_B) and id)
      self.pause = false
      if @text != nil and not @text.empty?
        new_page if @line_count >= $game_message.maxlineex
      else
        terminate_message
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● カーソルの更新(再定義)
  #--------------------------------------------------------------------------
  def update_cursor
    if @index >= 0
      x = $game_message.face_name.empty? ? 0 : FACE_SIZE[0] + FACE_SPACE
      y = @contents_y_line[0][$game_message.choice_start + @index]
      h = @contents_y_line[1][$game_message.choice_start + @index + 1]
      self.cursor_rect.set(x, y, contents.width - x, h)
    else
      self.cursor_rect.empty
    end
  end
  #--------------------------------------------------------------------------
  # ● ダミーウィンドウ同期(追加)
  #--------------------------------------------------------------------------
  # リーダー
  def pause
    @pause_window.pause
  end
  def opacity
    if S_WINDOW
      return @slim_window.opacity
    else
      super
    end
  end
  def visible
    if S_WINDOW
      return @slim_window.visible
    else
      super
    end
  end
  # アクセサ
  def windowskin=(a)
    super
    @slim_window.windowskin = a if S_WINDOW
  end
  def viewport=(a)
    super
    @name_d_window.viewport = @pause_window.viewport = a
    @slim_window.viewport = a if S_WINDOW
    @face_sprite.viewport = a
  end
  def active=(a)
    super
    @slim_window.active = a if S_WINDOW
  end
  def visible=(a)
    super
    @pause_window.visible = a if self.visible and @pause_window.pause
    @face_sprite.visible = a
    @slim_window.visible = a if S_WINDOW
  end
  def pause=(a)
    @pause_window.pause = a
  end
  def x=(a)
    a += @shake
    super(a)
    @indent_fx = 0 unless N_WINDOW_IX
    @name_d_window.x = a + N_WINDOW_XY[0] + @indent_fx
    @name_sprite.x = (a + N_WINDOW_XY[0]) + (@name_d_window.width / 2) + @indent_fx
    @slim_window.x = a + (@s_window_w / 2) if S_WINDOW
    case P_WINDOW
    when 0 ; @pause_window.x = a + (self.width / 2) - 12 + P_WINDOW_XY[0]
    when 1 ; @pause_window.x = a + self.width - 12 + P_WINDOW_XY[0]
    end
    case @face_lr
    when 0 ; @face_sprite.x = self.x + 16 + (FACE_SIZE[0] / 2) + FACE_XY[0]
    when 1 ; @face_sprite.x = self.x + self.width - 16 - (FACE_SIZE[0] / 2) + FACE_XY[0]
    end
  end
  def y=(a)
    super
    @name_d_window.y = a + N_WINDOW_XY[1]
    @name_sprite.y = (a + N_WINDOW_XY[1]) + (@name_d_window.height / 2)
    @slim_window.y = a + (@s_window_h / 2) if S_WINDOW
    @pause_window.y = a + self.height - 12 + P_WINDOW_XY[1]
    case FACE_Y
    when 0 ; @face_sprite.y = self.y + 16 + (FACE_SIZE[1] / 2) + FACE_XY[1]
    when 1 ; @face_sprite.y = self.y + (self.height / 2) + FACE_XY[1]
    when 2 ; @face_sprite.y = self.y + self.height - 16 - (FACE_SIZE[1] / 2) + FACE_XY[1]
    end
  end
  def width=(a)
    super
    @slim_window.width = a - @s_window_w if S_WINDOW
  end
  def height=(a)
    super
    @slim_window.height = a - @s_window_h if S_WINDOW
  end
  def z=(a)
    super
    @name_sprite.z = a + 6
    @name_d_window.z = a + 5
    @popup.z = a
    @pause_window.z = a + 10
    @slim_window.z = a - 10 if S_WINDOW
    @face_sprite.z = a + 4
  end
  def opacity=(a)
    if S_WINDOW
      super(0)
      @slim_window.opacity = a
    else
      super
    end
    if N_WINDOW_1V
      @name_d_window.opacity = a * (N_WINDOW_OPC / 100.0)
    elsif @background == 1
      @name_d_window.opacity = @w_opacity
    else
      @name_d_window.opacity = a * (N_WINDOW_OPC / 100.0)
    end
  end
  def back_opacity=(a)
    if S_WINDOW
      super(0)
      @slim_window.back_opacity = a
    else
      super
    end
    @name_d_window.back_opacity = a
  end
  def contents_opacity=(a)
    super
    @name_d_window.contents_opacity = a
    @slim_window.contents_opacity = a if S_WINDOW
    @name_sprite.opacity = @face_sprite.opacity = a
  end
  def openness=(a)
    super
    @name_d_window.openness = a
    @slim_window.openness = a if S_WINDOW
  end
end
#==============================================================================
# ■ Window_BattleMessage
#==============================================================================
class Window_BattleMessage < Window_Message
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  alias initialize_btm_str22 initialize
  def initialize
    initialize_btm_str22
    @mode = BTMESMODE
    @str22maxline = $game_message.maxlineex
    $game_message.maxlineex = 4
    @s_window_w = 0
    @s_window_h = 0
    @slim_window.opacity = 0
    btm_str22resize
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  alias dispose_btm_str22 dispose
  def dispose
    $game_message.maxlineex = @str22maxline
    dispose_btm_str22
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_str22bt update
  def update
    update_str22bt
    self.openness = 255
    self.opacity = 0 if @mode == 1
    @w_opacity = 255
  end
  #--------------------------------------------------------------------------
  # ● ウィンドウの背景と位置の設定 (無効化)
  #--------------------------------------------------------------------------
  alias reset_window_str22bt reset_window
  def reset_window
    #reset_window_str22bt
    super
    if @b_sprite != nil
      self.x = 0
      self.y = 0
      @position = 0
      self.opacity = 0
    end
    btm_str22resize
    create_contents
  end
  #--------------------------------------------------------------------------
  # ● メッセージの終了
  #--------------------------------------------------------------------------
  alias terminate_message_str22bt terminate_message
  def terminate_message
    terminate_message_str22bt
    btm_str22resize
    @face_sprite.set_face("", 0, FACE_SIZE[0], FACE_SIZE[1])
    @name_sprite.bitmap.dispose if @name_sprite.bitmap != nil
    @name_sprite.bitmap = nil
    @name_d_window.visible = false
  end
  #--------------------------------------------------------------------------
  # ● リサイズ
  #--------------------------------------------------------------------------
  def btm_str22resize
    self.width = Window_Message::STR22900[0]
    self.height = 128
    self.x = 0
    if @mode == 0
      self.y = Window_Message::STR22900[1] - 128
    else
      self.y = 0
    end
  end
end
#==============================================================================
# ■ Window_NumberInput
#==============================================================================
class Window_NumberInput < Window_Base
  def y=(a)
    super(a-24)
  end
end
#==============================================================================
# ■ Window_Base
#==============================================================================
class Window_Base < Window
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_str22_base update
  def update
    if @mwextpp and @fade_type == 1
      super
      if @opening
        @w_opacity = [[@w_opacity + Window_Message::STR22011, 255].min, 0].max
        @opening = false if @w_opacity == 255
      elsif @closing
        @w_opacity = [[@w_opacity - Window_Message::STR22011, 255].min, 0].max
        @closing = false if @w_opacity == 0
      end
    else
      update_str22_base
    end
  end
end
#==============================================================================
# ■ Bitmap
#==============================================================================
class Bitmap
  #--------------------------------------------------------------------------
  # ● 文字縁取り描画
  #--------------------------------------------------------------------------
  def draw_text_f(x, y, width, height, str, align = 0, color = Color.new(64,32,128))
    shadow = self.font.shadow
    b_color = self.font.color.dup
    font.shadow = false
    font.color = color
    draw_text(x + 1, y, width, height, str, align)
    draw_text(x - 1, y, width, height, str, align)
    draw_text(x, y + 1, width, height, str, align)
    draw_text(x, y - 1, width, height, str, align)
    font.color = b_color
    draw_text(x, y, width, height, str, align)
    font.shadow = shadow
  end
  def draw_text_f_rect(r, str, align = 0, color = Color.new(64,32,128))
    draw_text_f(r.x, r.y, r.width, r.height, str, align = 0, color)
  end
end
#==============================================================================
# ■ Sprite_STRPause
#==============================================================================
class Sprite_STRPause < Sprite
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(viewport = nil)
    super(viewport)
    w = Cache.system("Window")
    r = [Rect.new(96, 64, 32, 16), Rect.new(96, 80, 32, 16)]
    bitmap = Bitmap.new(64, 16)
    bitmap.blt(0, 0, w, r[0])
    bitmap.blt(32, 0, w, r[1])
    self.ox = -8
    self.oy = -8
    self.bitmap = bitmap
    self.visible = false
    self.src_rect.set(0, 0, 16, 16)
    @count = 0
    @wait = Window_Message::STR22010
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  def dispose
    self.bitmap.dispose
    super
  end
  #--------------------------------------------------------------------------
  # ● ポーズ
  #--------------------------------------------------------------------------
  def pause
    self.visible
  end
  def pause=(a)
    self.visible = a
    @count = 0 unless self.visible
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    return unless self.visible
    super
    @wait -= 1
    if @wait == 0
      @wait = Window_Message::STR22010
      @count += 1
      @count = 0 if @count * 16 >= self.bitmap.width
      self.src_rect.set(@count * 16, 0, 16, 16)
    end
  end
end
#==============================================================================
# ■ Sprite_STRFase+LoopAnimation
#==============================================================================
class Sprite_STRFace < Sprite_Base
  @@loop_animations = []
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :no_face
  attr_accessor :animation_id
  attr_accessor :loop_animation_id
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize(viewport)
    super(viewport)
    @animation_id = 0
    @loop_animation_duration = 0
    @loop_animation_id = 0
    @no_face = false
    @face_name = ""
    self.bitmap = Cache.face("")
  end
  #--------------------------------------------------------------------------
  # ● 解放
  #--------------------------------------------------------------------------
  def dispose
    super
    dispose_loop_animation
  end
  #--------------------------------------------------------------------------
  # ● フェイス設定
  #--------------------------------------------------------------------------
  def set_face(name, index, w, h)
    self.bitmap.dispose if self.bitmap != nil and @face_name != name
    @face_name = name
    self.bitmap = Cache.face(@face_name)
    self.src_rect.x = index % 4 * w
    self.src_rect.y = index / 4 * h
    self.src_rect.width = w
    self.src_rect.height = h
    self.ox = w / 2
    self.oy = h / 2
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    super
    if @no_face
      self.ox = 0
      self.oy = 0
      self.src_rect.set(0,0,0,0)
    end
    set_oxy if @animation != nil
    animation = $data_animations[@loop_animation_id]
    start_loop_animation(animation)
    if @animation_id != 0
      animation = $data_animations[@animation_id]
      start_animation(animation)
      @animation_id = 0
    end
    if @loop_animation != nil
      @loop_animation_duration -= 1
      if @loop_animation_duration % STRRGSS2::STR22_ANSPEED == 0
        set_loop_oxy
        update_loop_animation
      end
    end
    @@loop_animations.clear
  end
  #--------------------------------------------------------------------------
  # ● 通常アニメーションの座標決定
  #--------------------------------------------------------------------------
  def set_oxy
    if @animation.position == 3
      if viewport == nil
        @animation_ox = Window_Message::STR22900[0] / 2
        @animation_oy = Window_Message::STR22900[1] / 2
      else
        @animation_ox = viewport.rect.width / 2
        @animation_oy = viewport.rect.height / 2
      end
    else
      @animation_ox = x - ox + width / 2
      @animation_oy = y - oy + height / 2
      if @animation.position == 0
        @animation_oy -= height / 2
      elsif @animation.position == 2
        @animation_oy += height / 2
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● アニメーションの開始
  #--------------------------------------------------------------------------
  def start_loop_animation(animation)
    return if @loop_animation != nil and @loop_animation.id == animation.id
    dispose_loop_animation
    @loop_animation = animation
    return if @loop_animation == nil
    @loop_animation_mirror = false
    @loop_animation_duration = @loop_animation.frame_max * STRRGSS2::STR22_ANSPEED + 1
    load_loop_animation_bitmap
    @loop_animation_sprites = []
    if @loop_animation.position != 3 or not @@loop_animations.include?(animation)
      if @use_sprite
        for i in 0...STRRGSS2::STR22_MAXCELL
          sprite = ::Sprite.new(viewport)
          sprite.visible = false
          @loop_animation_sprites.push(sprite)
        end
        unless @@loop_animations.include?(animation)
          @@loop_animations.push(animation)
        end
      end
    end
    set_loop_oxy
  end
  #--------------------------------------------------------------------------
  # ● アニメーションの座標決定
  #--------------------------------------------------------------------------
  def set_loop_oxy
    if @loop_animation.position == 3
      if viewport == nil
        @loop_animation_ox = Window_Message::STR22900[0] / 2
        @loop_animation_oy = Window_Message::STR22900[1] / 2
      else
        @loop_animation_ox = viewport.rect.width / 2
        @loop_animation_oy = viewport.rect.height / 2
      end
    else
      @loop_animation_ox = x - ox + width / 2
      @loop_animation_oy = y - oy + height / 2
      if @loop_animation.position == 0
        @loop_animation_oy -= height / 2
      elsif @loop_animation.position == 2
        @loop_animation_oy += height / 2
      end
    end
  end
  #--------------------------------------------------------------------------
  # ● アニメーション グラフィックの読み込み
  #--------------------------------------------------------------------------
  def load_loop_animation_bitmap
    animation1_name = @loop_animation.animation1_name
    animation1_hue = @loop_animation.animation1_hue
    animation2_name = @loop_animation.animation2_name
    animation2_hue = @loop_animation.animation2_hue
    @loop_animation_bitmap1 = Cache.animation(animation1_name, animation1_hue)
    @loop_animation_bitmap2 = Cache.animation(animation2_name, animation2_hue)
    if @@_reference_count.include?(@loop_animation_bitmap1)
      @@_reference_count[@loop_animation_bitmap1] += 1
    else
      @@_reference_count[@loop_animation_bitmap1] = 1
    end
    if @@_reference_count.include?(@loop_animation_bitmap2)
      @@_reference_count[@loop_animation_bitmap2] += 1
    else
      @@_reference_count[@loop_animation_bitmap2] = 1
    end
    Graphics.frame_reset
  end
  #--------------------------------------------------------------------------
  # ● アニメーションの解放(追加)
  #--------------------------------------------------------------------------
  def dispose_loop_animation
    if @loop_animation_bitmap1 != nil
      @@_reference_count[@loop_animation_bitmap1] -= 1
      if @@_reference_count[@loop_animation_bitmap1] == 0
        @loop_animation_bitmap1.dispose
      end
    end
    if @loop_animation_bitmap2 != nil
      @@_reference_count[@loop_animation_bitmap2] -= 1
      if @@_reference_count[@loop_animation_bitmap2] == 0
        @loop_animation_bitmap2.dispose
      end
    end
    if @loop_animation_sprites != nil
      for sprite in @loop_animation_sprites
        sprite.dispose
      end
      @loop_animation_sprites = nil
      @loop_animation = nil
    end
    @loop_animation_bitmap1 = nil
    @loop_animation_bitmap2 = nil
  end
  #--------------------------------------------------------------------------
  # ● アニメーションの更新
  #--------------------------------------------------------------------------
  def update_loop_animation
    if @loop_animation_duration > 0
      f = STRRGSS2::STR22_ANSPEED - 1
      ff = STRRGSS2::STR22_ANSPEED
      frame_index = @loop_animation.frame_max - (@loop_animation_duration + f) / ff
      loop_animation_set_sprites(@loop_animation.frames[frame_index])
      for timing in @loop_animation.timings
        if timing.frame == frame_index
          loop_animation_process_timing(timing)
        end
      end
    else
      @loop_animation_duration = @loop_animation.frame_max * STRRGSS2::STR22_ANSPEED + 1
    end
  end
  #--------------------------------------------------------------------------
  # ● アニメーションスプライトの設定
  #--------------------------------------------------------------------------
  def loop_animation_set_sprites(frame)
    cell_data = frame.cell_data
    for i in 0...STRRGSS2::STR22_MAXCELL
      sprite = @loop_animation_sprites[i]
      next if sprite == nil
      pattern = cell_data[i, 0]
      if pattern == nil or pattern == -1
        sprite.visible = false
        next
      end
      if pattern < 100
        sprite.bitmap = @loop_animation_bitmap1
      else
        sprite.bitmap = @loop_animation_bitmap2
      end
      sprite.visible = true
      sprite.src_rect.set(pattern % 5 * 192,
        pattern % 100 / 5 * 192, 192, 192)
      if @loop_animation_mirror
        sprite.x = @loop_animation_ox - cell_data[i, 1]
        sprite.y = @loop_animation_oy + cell_data[i, 2]
        sprite.angle = (360 - cell_data[i, 4])
        sprite.mirror = (cell_data[i, 5] == 0)
      else
        sprite.x = @loop_animation_ox + cell_data[i, 1]
        sprite.y = @loop_animation_oy + cell_data[i, 2]
        sprite.angle = cell_data[i, 4]
        sprite.mirror = (cell_data[i, 5] == 1)
      end
      sprite.z = self.z + 300 + i
      sprite.ox = 96
      sprite.oy = 96
      sprite.zoom_x = cell_data[i, 3] / 100.0
      sprite.zoom_y = cell_data[i, 3] / 100.0
      sprite.opacity = cell_data[i, 6] * self.opacity / 255.0
      sprite.blend_type = cell_data[i, 7]
    end
  end
  #--------------------------------------------------------------------------
  # ● SE とフラッシュのタイミング処理(追加)
  #--------------------------------------------------------------------------
  def loop_animation_process_timing(timing)
    timing.se.play
    case timing.flash_scope
    when 1
      self.flash(timing.flash_color, timing.flash_duration * STRRGSS2::STR22_ANSPEED)
    when 2
      if viewport != nil
        viewport.flash(timing.flash_color, timing.flash_duration * STRRGSS2::STR22_ANSPEED)
      end
    when 3
      self.flash(nil, timing.flash_duration * STRRGSS2::STR22_ANSPEED)
    end
  end
end
#==============================================================================
# ■ Game_Message
#==============================================================================
class Game_Message
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :event_id                 # 表示元イベントID
  attr_accessor :xywh                     # 表示位置/座標
  attr_accessor :mapstop                  # マップ更新停止
  attr_accessor :maxlineex                # 最大行数拡張
  attr_accessor :mes_move                 # メッセージ中移動可能
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化(エイリアス)
  #--------------------------------------------------------------------------
  alias initialize_str22 initialize
  def initialize
    initialize_str22
    @xywh = Rect.new(0, 0, 32, 32)
    @mapstop = false
    @maxlineex = 4
  end
  def visible=(a)
    @visible = a
    @mapstop = a unless a
  end
  #--------------------------------------------------------------------------
  # ● クリア(エイリアス)
  #--------------------------------------------------------------------------
  alias clear_str22 clear
  def clear
    clear_str22
    @event_id = 0
    @mes_move = false
  end
  #--------------------------------------------------------------------------
  # ● 改ページ
  #--------------------------------------------------------------------------
  def new_page
    while @texts.size % @maxlineex > 0
      @texts.push("")
    end
  end
end
#==============================================================================
# ■ Game_Map
#==============================================================================
class Game_Map
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  alias update_str22 update
  def update
    return if $game_message.visible and $game_message.mapstop
    update_str22
  end
  #--------------------------------------------------------------------------
  # ★ マップネーム取得(追加)
  #--------------------------------------------------------------------------
  def map_name_strextpp
    map = load_data("Data/MapInfos.rvdata")
    if map[@map_id].name["#"] != nil
      return map[@map_id].name.sub!(/(\S*)\#\S*/) { "#{$1}" }
    else
      return map[@map_id].name
    end
  end
end
#==============================================================================
# ■ Game_Player
#==============================================================================
class Game_Player < Game_Character
  #--------------------------------------------------------------------------
  # ● 方向ボタン入力による移動処理(再定義)
  #--------------------------------------------------------------------------
  def move_by_input
    return unless movable?
    # 条件変更
    return if $game_map.interpreter.running? and $game_message.mes_move == false
    case Input.dir4
    when 2;  move_down
    when 4;  move_left
    when 6;  move_right
    when 8;  move_up
    end
  end
  #--------------------------------------------------------------------------
  # ● 移動可能判定(再定義)
  #--------------------------------------------------------------------------
  def movable?
    return false if moving?                     # 移動中
    return false if @move_route_forcing         # 移動ルート強制中
    return false if @vehicle_getting_on         # 乗る動作の途中
    return false if @vehicle_getting_off        # 降りる動作の途中
    # 条件変更
    return false if $game_message.visible and $game_message.mes_move == false
    return false if in_airship? and not $game_map.airship.movable?
    return true
  end
end
#==============================================================================
# ■ Game_Interpreter
#==============================================================================
class Game_Interpreter
  #--------------------------------------------------------------------------
  # ● 文章の表示(再定義)
  #--------------------------------------------------------------------------
  def command_101
    unless $game_message.busy
      # イベントIDを渡す
      $game_message.event_id = @event_id
      #
      $game_message.face_name = @params[0]
      $game_message.face_index = @params[1]
      $game_message.background = @params[2]
      $game_message.position = @params[3]
      # オーバーライン
      next_mes = true
      loop do
        if @list[@index].code == 101 and next_mes and
           $game_message.maxlineex > $game_message.texts.size
          @index += 1
        else
          break
        end
        next_mes = false
        while @list[@index].code == 401       # 文章データ
          next_mes = true if @list[@index].parameters[0][/\\NEXT/i] != nil
          if $game_message.maxlineex > $game_message.texts.size
            $game_message.texts.push(@list[@index].parameters[0])
          end
          @index += 1
        end
      end
      #
      if @list[@index].code == 102          # 選択肢の表示
        setup_choices(@list[@index].parameters)
      elsif @list[@index].code == 103       # 数値入力の処理
        setup_num_input(@list[@index].parameters)
      end
      set_message_waiting                   # メッセージ待機状態にする
    end
    return false
  end
  #--------------------------------------------------------------------------
  # ● 選択肢のセットアップ(再定義)
  #--------------------------------------------------------------------------
  def setup_choices(params)
    if $game_message.texts.size <= $game_message.maxlineex - params[0].size
      # イベントIDを渡す
      $game_message.event_id = @event_id
      #
      $game_message.choice_start = $game_message.texts.size
      $game_message.choice_max = params[0].size
      for s in params[0]
        $game_message.texts.push(s)
      end
      $game_message.choice_cancel_type = params[1]
      $game_message.choice_proc = Proc.new { |n| @branch[@indent] = n }
      @index += 1
    end
  end
  #--------------------------------------------------------------------------
  # ● 数値入力のセットアップ(再定義)
  #--------------------------------------------------------------------------
  def setup_num_input(params)
    if $game_message.texts.size < $game_message.maxlineex
      # 行追加(ポップアップ時のサイズ不足対策)
      $game_message.texts.push("")
      #
      $game_message.num_input_variable_id = params[0]
      $game_message.num_input_digits_max = params[1]
      @index += 1
    end
  end
end


#==============================================================================
# ★RGSS2
# STR23_アイテムセレクト v1.0 08/02/13
# サポート:http://otsu.cool.ne.jp/strcatyou/
#
# ・所持アイテムを選択するイベントを作れるようになります。
# ・「そそそれはエリクサー!?私どもにくださるというのですか・・・!」
#
# <<使用方法>>
# 以下のスクリプトをイベントコマンドのスクリプト等で実行します。
#
# $game_temp.itemselect = n
#
# n に選択されたアイテムIDを格納する、変数IDを指定することで
# アイテムセレクトウィンドウを開きます。
# 格納される値はアイテムの種類によって変わります。
#
#  種類    格納値
# アイテム → アイテムID(そのまま)
#   武器 → 1000 + 武器ID
#   防具 → 2000 + 防具ID
#
#==============================================================================
# ■ STRRGSS2
#==============================================================================
module STRRGSS2
  # ヘルプウィンドウを表示するか
  STR23HELP   = false
  # ウィンドウサイズ    (x, y, width, height)
  STR23RECT_H = Rect.new(   0,   0, 544,  56) # ヘルプウィンドウ矩形
  STR23RECT_I = Rect.new(   0, 288, 544, 128) # アイテムウィンドウ矩形
  # ウィンドウフェードスピード
  STR23FADE   = 48
end
#==============================================================================
# ■ Scene_Map_Itemselect
#==============================================================================
class Scene_Map_Itemselect
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_reader   :item_id
  attr_reader   :scene_end
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化
  #--------------------------------------------------------------------------
  def initialize
    @item_id = 0
    @scene_end = false
    @viewport = Viewport.new(0, 0, 544, 416)
    @viewport.z = 10000
    if STRRGSS2::STR23HELP
      @help_window = Window_Help.new
      r = STRRGSS2::STR23RECT_H
      @help_window.x = r.x
      @help_window.y = r.y
      @help_window.width = r.width
      @help_window.height = r.height
      @help_window.create_contents
      @help_window.viewport = @viewport
      @help_window.opacity = 0
      @help_window.contents_opacity = 0
    end
    r = STRRGSS2::STR23RECT_I
    @item_window = Window_Itemselect.new(r.x, r.y, r.width, r.height)
    @item_window.viewport = @viewport
    @item_window.help_window = @help_window if STRRGSS2::STR23HELP
    @item_window.opacity = 0
    @item_window.contents_opacity = 0
    Graphics.frame_reset
  end
  #--------------------------------------------------------------------------
  # ● 開放
  #--------------------------------------------------------------------------
  def dispose
    @item = @item_window.item
    @item_id = @item.id
    if @item.is_a?(RPG::Weapon)
      @item_id += 1000
    elsif @item.is_a?(RPG::Armor)
      @item_id += 2000
    end
    @close = true
  end
  #--------------------------------------------------------------------------
  # ● フレーム更新
  #--------------------------------------------------------------------------
  def update
    if @close
      if STRRGSS2::STR23HELP
        @help_window.opacity -= STRRGSS2::STR23FADE
        @help_window.contents_opacity -= STRRGSS2::STR23FADE
      end
      @item_window.opacity -= STRRGSS2::STR23FADE
      @item_window.contents_opacity -= STRRGSS2::STR23FADE
      if @item_window.opacity == 0
        @viewport.dispose
        @help_window.dispose if STRRGSS2::STR23HELP
        @item_window.dispose
        @scene_end = true
      end
      return
    elsif @item_window.opacity != 255
      if STRRGSS2::STR23HELP
        @help_window.opacity += STRRGSS2::STR23FADE
        @help_window.contents_opacity += STRRGSS2::STR23FADE
      end
      @item_window.opacity += STRRGSS2::STR23FADE
      @item_window.contents_opacity += STRRGSS2::STR23FADE
      return
    end
    @help_window.update if STRRGSS2::STR23HELP
    @item_window.update
    if Input.trigger?(Input::B)
      Sound.play_cancel
      dispose
      @item_id = 0
    elsif Input.trigger?(Input::C)
      Sound.play_decision
      dispose
    end
  end
end
#==============================================================================
# ■ Window_Itemselect
#==============================================================================
class Window_Itemselect < Window_Item
  #--------------------------------------------------------------------------
  # ● アイテムを許可状態で表示するかどうか
  #--------------------------------------------------------------------------
  def enable?(item)
    return true
  end
end
#==============================================================================
# ■ Scene_Map
#==============================================================================
class Scene_Map < Scene_Base
  #--------------------------------------------------------------------------
  # ● フレーム更新(エイリアス)
  #--------------------------------------------------------------------------
  alias update_str23 update
  def update
    if $game_temp.itemselect > 0
      s_itemselect = Scene_Map_Itemselect.new
      while s_itemselect.scene_end != true
        Graphics.update             # ゲーム画面を更新
        Input.update                # 入力情報を更新
        s_itemselect.update         # アイテムセレクト更新
        $game_map.update            # マップを更新
        $game_player.update         # プレイヤーを更新
        $game_system.update         # タイマーを更新
        @spriteset.update           # スプライトセットを更新
        @message_window.update      # メッセージウィンドウを更新
      end
      $game_variables[$game_temp.itemselect] = s_itemselect.item_id
      $game_temp.itemselect = 0
    end
    update_str23
  end
end
#==============================================================================
# ■ Game_Temp
#==============================================================================
class Game_Temp
  #--------------------------------------------------------------------------
  # ● 公開インスタンス変数
  #--------------------------------------------------------------------------
  attr_accessor :itemselect
  #--------------------------------------------------------------------------
  # ● オブジェクト初期化(エイリアス)
  #--------------------------------------------------------------------------
  alias initialize_str23 initialize
  def initialize
    initialize_str23
    @itemselect = 0
  end
end

이런 스크립트입니다. 이 스크립트를 사용하기만 하면 이런 오류가 뜹니다.

이 스크립트 외에는 아무것도 사용하지 않았는데...

왜 그런지 알려주세요!