LNS220 Window_Message拡張

メッセージウィンドウまわりの処理を拡張します。






基本情報

前提スクリプト


拡張タイプ

○ 要設定 (イベントコマンドで指定する必要あり)
◆ 要注意 (内部の挙動を変えるため競合の可能性あり)


説明

概要

Window_Message の描画に関する処理をいくつか追加します。

◆ メッセージスキップ

  • [文章の表示] のキー入力待ちの際、B ボタンを押しっぱなしにすることで、自動的にメッセージを送ります。
  • A ボタンによる早送りと併用することで、高速にメッセージを送れるようになります。

◆ 強制改行

  • [文章の表示] によるメッセージが、ウィンドウサイズを超えて描画されそうになった場合、そこで文章を強制的に改行します。
  • はみ出したぶんが次の行に描画されたあと、改めて改行処理が行われます。

◆ メッセージのスクロール

  • メッセージがウィンドウの下端で改行(\n)された場合、表示済みのメッセージ全体を上にずらして続きのメッセージを描画します(改ページ)。
  • \n を制御文字として認識するようになる関係で、文中にアクターの名前を表示するコマンド \N[n] の制御文字部分 \N は大文字でなくてはなりません。
  • メッセージの終わりや文中に \f が出現した場合、その場で改ページを行います。
  • メッセージのスクロール速度は Scroll_Speed で定義します。

◆ [選択肢の表示] の連結

+ サンプル画像
イベントコマンド例
上のコマンドの実行例
  • 複数の [選択肢の表示] を連続で配置したとき、全ての選択肢を一つの選択肢ウィンドウに表示し、いずれかの結果のみを処理します。
  • (標準と同じように)連続で選択肢を表示したい場合は、各 [選択肢の表示] の間に注釈など別のイベントコマンドを挟んでください。
  • キャンセル時に選ばれる選択肢は [キャンセルの場合] が [無効] でない選択肢のうち最後の設定が反映されます。
  • [キャンセルの場合] が [分岐] の場合、キャンセル時には全ての [キャンセルの場合] ブロックが処理されます。

追加される制御文字

\n : 改行

  • その場で改行します。
  • 一つの [文章の表示] で5行以上のメッセージを設定したい場合などに使います。

\f : 改ページ

  • その場で改ページします。
  • 改ページの際にはいったん入力待ちが発生します。

\F[*] : 顔グラフィックの設定

  • このコマンドの位置で顔グラフィックを変更します。文法は以下の4通りです。
\F[X]
\F[X:Y]
\F[X>Y]
\F[X<Y]

  • \F[X] の場合、ID X 番のアクターに設定された顔グラフィックが表示されます。
    • たとえば、アクター 1 番の顔を表示させたい場合、\F[1] とします。
    • ID X の前に P が付いていた場合、パーティ内の序列を参照します。
    • \F[P1] はパーティメンバー先頭のアクターを参照します。
    • ID X の前に E が付いていた場合、X 番のエネミーを参照します。
    • ID X の前に T が付いていた場合、
戦闘中
トループ内の序列を参照します。\F[T1] はトループ内先頭のエネミーを表します。(エネミーの順番についてはイベントコマンドなどで確認できます)
マップ
イベント X 番の歩行グラフィックに対応した顔グラフィックを検索します。X に 0 を入れた場合「このイベント」になります。

  • エネミーの顔グラフィック名は、バトラー画像と同じ名前として扱われます。
    • バトラー画像名の末尾が "_数値" で終わっている場合(Actor4-1 など)で、その末尾部分を取り除いた名前(Actor4 など)の画像が存在する場合は、末尾部分をインデックスとして扱います。それ以外の場合はインデックスは常に 0(先頭)です。
      • 末尾の数字とそれ以外の区切り文字は Battler_Face_Delim で指定します。
      • 末尾の数字からインデックスに変換する際、Battler_Face_Offset のぶんだけ減らしたインデックスが参照されます。
      • バトラー画像名が "Actor4-1" で Battler_Face_Offset = 1 の場合、実際に参照される顔グラフィックのインデックスは 0 となります。

  • \F[X:Y] の場合、Xにはファイル名、Yにはインデックスを直接指定します。
    • インデックスは左上(先頭)が 0 です。
  • \F[Actor4:4] なら、"Actor4"のインデックス4番の顔グラフィックになります。
  • 基本的には [文章の表示] から直接指定したほうが楽です。メッセージの途中で顔グラフィックを変更したい場合に使います。

  • \F[X>Y] の場合、ID X 番のアクターの顔グラフィックから、Y だけインデックスをずらした顔グラフィックになります。
    • 例えばアクター1番の顔グラフィックが "Actor4"の 0 番だった場合、\F[1>1]と書と "Actor4"の 1 番の顔グラフィックが参照されます。
    • 同じ名前のファイル内に表情差分を並べている場合などに有効です。

  • \F[X<Y] の場合、ID X 番のアクターの顔グラフィックを基準として、文字列 Y で表される「表情」のインデックスを選んで表示します。
    • それぞれの表情がどのインデックスに対応するかは Face_Emotion で定義します。
    • 表情ハッシュが以下のように定義されていたとします。
:Actor4_1 => { 喜: 2, 怒: ["anger", 1] },
  • アクター 1 番の顔グラフィックが"Actor4"のインデックス 1 番だった場合、
\F[1<喜] #=> ファイル名"Actor4"のインデックス 2 番が参照されます。
\F[1<怒] #=> ファイル名"anger"のインデックス 1 番が参照されます。
  • ハッシュのキーは :(ファイル名) または :(ファイル名)_(インデックス) 形式のシンボルです。

  • 顔グラフィックの切り替えにかけるフレーム数は Face_Duration で定義します。
  • [文章の表示] の内容が \F[*] で始まる場合は、もともと設定されていた顔グラフィックの設定をその内容で上書きします。

\M[*] : 名前の表示

  • メッセージの文中に \M[名前] と記述すると、メッセージウィンドウの上部にその名前を入れた小さなウィンドウを表示します。
  • 名前ウィンドウ用のスペースを確保するため、表示位置が「上」の場合は画面の上端から少し下がった位置になります。
  • \M[\N[n]] と書くと、まず \N[n] がID n 番のアクターの名前に変換され、それが名前ウィンドウの内容として適用されるため、アクターの名前を表示することができます。

\NN[*] : 顔グラと名前の一括設定

  • 特殊な記法として、\NN[*] と書くと、* の内容に応じて \F[x]\M[\N[x]] に変換されます。xx の値として許されるのは以下のいずれかです。
\NN[n] (n : アクターID)
そのまま \F[n]\M[\N[n]] に変換されます。
\NN[Vn] (n : 変数のID)
変数 n 番の値をアクター ID として参照します。
\NN[Pn] (n : パーティ内位置)
パーティの n 番目のアクターID を x として参照します。先頭のアクターが 1 番です。
\NN[En] (n : エネミーID)
\F[En]\M[\E[n]] に変換されます。すなわち、指定された ID のエネミーの名前とグラフィックに変換されます。
\NN[Tn] (n : イベントID(非戦闘時) / トループ内位置(戦闘時))
\F[Tn]\M[\T[n]] に変換されます。すなわち、戦闘時であればトループ内インデックス(イベントコマンド [敵キャラの HP 増減] などで確認できる値)、マップ画面であればイベント ID を指定して名前と顔グラに変換されます。
  • いずれの場合も、データの存在しない ID が指定された場合は全体が無視されます。

\NI[n] : アイテム名

\NW[n] : 武器名

\NA[n] : 防具名

\NS[n] : スキル名

\NT[n] : ステート名

  • ID n 番の、該当する種類のアイテム名に変換されます。
  • アイテム名の前にはそのアイテムのアイコンが表示されます。
  • 存在しないIDが指定された場合、無視されます。

\E[n] : ID n 番のエネミーの名前

\T[n] : (戦闘時)トループ内 n 番目のエネミーの名前 / (非戦闘時)ID n 番のイベントの名前

  • 該当するエネミー/イベントの名前に置き換えます。
  • イベント名を表示する際、"<"と">"で囲まれた部分は表示されません。
    • 名前を基準に特殊な処理を行う場合などは参考にしてください。

\S[n] : メッセージスピードの変更

  • 文中に \S[n] が現れた場合、文字が描画される速度を n に変更します。
  • デフォルトは 1 で、大きいほど遅くなります。0 にすると瞬間表示となります。
  • 改ページされると速度は元に戻ります。

\p : 改行の無視

  • メッセージ中に \p が登場した場合、その「直後」の改行を無視します。
  • 可読性のために一旦改行するが、表示するメッセージ自体は改行したくない場合に使います。
  • Ruby における行末の"\"と似たようなものです。

\m : [文章の表示] の連結

  • メッセージが \m で終わる場合、直後のイベントコマンドが [文章の表示] なら、顔グラフィックのみを更新して次のメッセージを直接つなげます。
  • 顔グラフィックの変更は \F[*] を用いて行われます。
  • メッセージの連結時には、\m は \f に置き換わるとみなせます。
  • 連結オプション \m があったとしても、続くメッセージの表示位置または背景が異なる場合は連結されません。
  • 次の [文章の表示] の内容は改ページを挟んで連結されますが、\m の直前が \p の場合はそのまま繋げます。

特殊改行文字の使用例

  • \p、\n、\f、\m の使い方の具体例をいくつか挙げます。「」内が [文章の表示] での記述例です。
A)「あいうえお\nかきくけこ」
B)「あいうえお
    かきくけこ」(通常の改行)
  • 以上の A) と B) は同じ動作です。A) は記述する行数を節約したい場合に使えます。

A)「あいうえお\fかきくけこ」
B)「あいうえお\m」「かきくけこ」(2つのコマンド)
  • 以上の A) と B) は基本的には同じ動作です。最初の内容(あいうえお)の表示後キー入力待ちを挟み、内容が上にスクロールしてから次の内容(かきくけこ)が表示されます。ただし B) の場合、1つ目と2つ目のコマンドで設定された顔グラフィックが異なれば切り替えが行われます。
C) 「あいうえお」「かきくけこ」(2つのコマンド)
  • これは改ページではなく、表示中のメッセージを一旦消去してから次のメッセージを描画します。これは標準の動作です。

A)「あいうえお\!かきくけこ」
B)「あいうえお\p\m」「かきくけこ」(2つのコマンド)
  • 以上の A) と B) は基本的には同じ動作です。ただし B) の場合、1つ目と2つ目のコマンドで設定された顔グラフィックが異なれば切り替えが行われます。

A)「あいうえおかきくけこ」
B)「あいうえお\^\p\m」「かきくけこ」
  • 以上の A) と B) は基本的には同じ動作です。
  • 特殊文字 \^ を伴う場合、コマンド境界での入力待ちを行いません。


備考

再定義されるメソッド

Game_Interpreter#command_101 (文章の表示)
  • 複数の [文章の表示] を連結したり、顔グラ自動設定などの処理を追加します。

Game_Interpreter#setup_choices
Game_Interpreter#command_403 (キャンセルの場合)
Window_ChoiceList#cancel_enabled?
  • 選択肢の連結機能に対応して再定義されます。

Window_Message#process_all_text
  • 名前の表示などの処理を追加するため再定義されます。

Window_Message#party_member_name (厳密には再定義ではなくオーバーライド)
  • 非戦闘メンバーのインデックスも取得できるようにします。

Window_Message#process_new_line
  • 改ページが必要な際の改ページ処理を追加します。

設定項目

Scroll_Speed <既定値 6 >
改ページ時のスクロール速度
Face_Duration <既定値 12 >
顔グラ変更にかける時間
Battler_Face_Delim <既定値 /[_-]/ >
バトラー画像名の区切り文字
Battler_Face_Offset <既定値 1 >
バトラー画像名から顔グラインデックスへの変換時オフセット
Face_Emotion
表情設定(以下は例)
:(ファイル名) => { (表情名): (インデックス) },
:sample      => { 喜: 1, 怒: 2, 哀: 3, 楽: 4 },


更新履歴

  • 2021/01/08 選択肢の中に選択肢があるとうまく連結されない不具合を修正
  • 2021/01/03 説明を書いた / [選択肢の表示] 連結機能の追加
  • 2020/12/29 新版公開

  • こんにちは。不具合を発見したのでご報告いたします。 LNS000 組み込み拡張 LNS010 Input拡張 LNS100 プリセット拡張 LNS102 マウス操作 LNS140 マップ/キャラ拡張 の5つを導入した状態で、マップ画面でマウスカーソルをゲームウインドウの外側で大きく動かすなどすると、「 スクリプト 'LNS 140 マップ/キャラ拡張' の 980 行目で IndexError が発生しました。 index -1 too small for array; minimum: 0 」というエラーメッセージが表示され、ゲームが終了してしまいます。 スクリプトは全て最新で、内容は改変していません。 -- 2022-07-26 01:29:40
  • 確認が遅れましたが、対応修正しました。正確には「既に対応済みであったがアップロードを忘れていた」という状態でした…… -- 2022-11-01 15:39:07
  • 対応ありがとうございます!しかし LNS000, 010, 100, 102, 140 の5つを入れた状態で起動直後に「スクリプト 'LNS140 マップ/キャラ拡張' の 1719 行目で NameError が発生しました。 undefined method 'lns102_dash?' for class 'Game_Player'」と表示され、終了します。 -- 2022-12-24 16:39:35
コメント:

すべてのコメントを見る
最終更新:2021年01月08日 07:42
添付ファイル