表示(プレゼンテーション)のレコードには下記の項目がある。
(1) 表示 ID。他のファイルから このレコードを特定するために使われる。ID の手前に接頭子 prsnt_ が自動的に付加される。
(2) フラグ群。指定可能なフラグは header_presentations.py を参照のこと。
(3) 背景メッシュ。module_meshes.py のメッシュを指定。
(4) トリガー群。この表示に対応する、いくつかの「単純トリガー」。
module_presentations.py 未記入。たぶんゲーム・エンジンによるデフォルトのものとともに章を追加することに。
訳注:
プレゼンテーション(表示)は画面を自由に作成する機能です。例えば、Native では開発に貢献した人へのクレジット表示、引退画面、週間収支の画面、クイック・バトルの設定画面などがプレゼンテーションで作られています。
他にも、元帥(marshall)選定画面、戦闘画面内の「ここで停止」「突撃」などの命令選択肢表示、練習試合(乱闘)での残数表示、スライダー・バー群のある画面、プレイヤーに旗(バナー)を選ばせる画面、マルチ・プレイヤー用の画面などが Native つまりデフォルトの MOD 開発システムに含まれています。
メニュー機能や会話機能や登場人物一覧画面のような ほぼハード・コーディングされた定型画面とは異なり、プレゼンテーションは MOD 開発者が自由な位置にテキスト、矩形、画像、ボタン、コンボボックス(プルダウン・リスト)、スライダーといった GUI コントロールを「オーバレイ」(overlay)として配置できます。縦に長い領域をスクロール可に指定すると、スクロール・バーが自動的に表示されます。その他にも街などの 3D シーンや、エンジンに生成させた 2D の人物画像なども表示できるし、戦闘シーンなどの表示中に重ねて表示させることもできます。クレジット画面のようなフェード・インとアウト、つまり時間とともに徐々に見えるようにしたり隠したりすることができます。

プレゼンテーション画面を起動するには、メニューや単純トリガーなどから start_presentation 命令を実行します。開始直後に presentation_set_duration 命令を使って表示持続時間(header_operation.h 拡張版のコメントによると、単位 0.01 秒)を指定するようにします。特に早く終わらせたいのでなければ、その値は充分に大きい値にします。終了するには、presentation_set_duration, 0 を実行します。一時的に不可視にすることもできます。
テキストやボタンなどの各オーバレイを生成する命令は名前の先頭に create_ が付きます。オーバレイの種類や使い方の概要は header_operations.h 拡張版の中の create_ を検索すると見つかります。これらの生成命令はオブジェクト ID(数値)を返すので、それを後続命令で使い、位置、縦横サイズ、左右や中央寄せ、可視状況などを指定します。
| 命令と生成されるオブジェクト | 説明 |
|---|---|
| create_text_overlay テキスト | 文字列。静的なものでもよいし、読み出したり加工したりして作った文字列や数値を {s#} 形式や {reg#} 形式で埋め込んでもよい。(下記の文字列でも同様) |
| create_mesh_overlay 2D メッシュ | 指定した既存メッシュ、つまり画像。 |
| create_mesh_overlay_with_item_id 物品の 2D 化メッシュ | ID で指定した物品(アイテム)の画像が、エンジンによって生成される。 |
| create_mesh_overlay_with_tableau_material 紋章付き 2D メッシュ | 指定したメッシュに紋章マテリアルを施した画像。 |
| create_button_overlay 文字列ボタン | 文字列(キャプション)をそのものがボタンとして機能する。 |
| create_game_button_overlay 標準ゲーム・ボタン | 指定した文字列(キャプション)の周りに既定の枠を持つ画像が表示される。この画像は特定のメッシュ内にある。 |
| create_in_game_button_overlay 標準イン・ゲーム・ボタン | 上と同様で、画像だけ異なる? |
| create_image_button_overlay 画像ボタン | 画像付きのボタン。押していない状態と押した状態の各画像を指定。「絵」が描かれた矩形だけでなく、無地の矩形を使うテクニックもある。例えば他のテキスト行がメニューのように縦に並んでいて、その各行の手前に「半透明の矩形」として被せ、マウス・ホバー時に色を変えるように処理を書いておくと、カーソルのようになる。その場合、項目の数だけグローバル変数が必要となるが、そうするよりも空きスロットを配列として使うほうが処理が容易でコードの保守性や可読性も良くなる。 |
| create_image_button_overlay_with_tableau_material 紋章付き画像ボタン | 紋章付き画像付きボタン |
| create_slider_overlay スライダー | プレイヤーが左右にドラッグして値を指定できるようにする。 |
| create_progress_overlay 進捗バー | 何かの進捗度などを 0~100 % の横棒グラフのようなもので表示する(はず)。mod システム v1.171 のソース内には使用箇所が見当たらない。 |
| create_number_box_overlay 数値入力ボックス | プレイヤーが数値を入力できるようにする欄。 |
| create_text_box_overlay テキスト入力ボックス | プレイヤーが文字列を入力できるようにする欄。(Native で不使用とのことで、廃止なのかも。) |
| create_simple_text_box_overlay 単純テキスト入力ボックス | プレイヤーが文字列を入力できるようにする欄。 |
| create_check_box_overlay チェック・ボックス | チェック表記の有無によりオンかオフかの 2 状態だけをとりうる入力欄。 |
| create_list_box_overlay リスト・ボックス | 1 つ以上の項目を縦に並べた一覧から選択させる(はず)。mod システム v1.171 のソース内には使用箇所が見当たらない。 |
| create_combo_label_overlay コンボ見出し | コンボ・ボタンの見出しとなる文字列。 |
| create_combo_button_overlay コンボ・ボタン | 通常は折りたたまれていて、押下中だけ下に選択リストが展開する。リストからどれかを選択すると、再び自動的に折りたたまれ、選択したものが(キャプションとして)表示される。 |
ボタンのクリックや矩形領域へのマウス・ホバーなど、プレイヤーの GUI 操作を検知して処理するには、それらのイベントにより発生する割り込みを受け取る各トリガーのコードを書いておきます。
| プレゼンテーション用トリガー | 発生契機 |
|---|---|
| ti_on_presentation_load | ロード時。 |
| ti_on_presentation_run | 実行中に定期的。恐らく描画フレーム間隔(fps)ごと。 |
| ti_on_presentation_event_state_change | ボタンなどの押下状態などの変化時。 |
| ti_on_presentation_mouse_enter_leave | マウスがオーバレイ領域に入いった時と出た時 |
| ti_on_presentation_mouse_press | オーバレイ領域をマウス・ボタン押下時。 |
より複雑な応用例として、「兵種ツリー」という昇格経路を図示する機能があり、一部の既製 MOD が採用しています。 そのようなものもプレゼンテーションで設計し実現できます。「線」は、細長い矩形を描くことで実現できます。
一方、スキル画面のように、Warband にハード・コーディングされているものは、(全部を作り直さない限り)プレゼンテーションとして操作できません(game_variables.txt で一部座標だけ指定できます)。
その他、座標など詳しくは presentations モジュールのコードと実際を見比べてみて下さい。
フラグ群
フラグ群には次のようなものを指定する。
| prsntf_manual_end_only | 未記入 |
| prsntf_read_only | 未記入 |
テキスト・フラグ
テキスト・フラグとしては次のようなものを指定する。
| tf_center_justify | 未記入 |
| tf_double_space | 未記入 |
| tf_left_align | 未記入 |
| tf_right_align | 未記入 |
| tf_single_line | 未記入 |
| tf_scrollable | 未記入 |
| tf_scrollable_style_2 | 未記入 |
| tf_vertical_align_center | 未記入 |
| tf_with_outline | 未記入 |
色コード
M&B での色コードの形式は 0xAARRGGBB です。この 4 バイトのうち最初の「AA」というバイトの意味はアルファ(ここでは不透明度。値が大きいほど不透明)です。その後ろの各バイトは順に、赤、青、緑の成分です。このように 16 進数で表わし、例えば赤い色を指定するなら 0xFFFF0000 です。この場合、赤の成分が最大値 255 つまり 100% で、青と緑が 0 % です。各成分の混合方法を知っておくと、標準以外の色を扱うのに役立つでしょう [1]。下記は基本的な色の例です。
| 青 | 0xFF0000FF | 明るい青 | 0xFF00D8FF | 赤 | 0xFFFF0000 |
| 黄 | 0xFFFFFF00 | ピンク | 0xFFFF00FF | 紫 | 0xFF600089 |
| 黒 | 0xFF000000 | 白 | 0xFFFFFFFF | 緑 | 0xFF00FF00 |
| 茶 | 0xFF704800 |
アルファは 255(0xff)が完全な不透明を表わします。[2]
命令コードで色コードを計算。 Somebody, Modding Q&A, and dunde, Python Script/Scheme Exchange
その他
ゲーム内カーソル
カーソルはウィンドウ自体の一部なので、シェーダ経由で変更することはできません。[3]
照準の大きさ
プレイヤーが遠距離武器を持った時に現れる「照準」は ui_gadgets.dds というテクスチャ・ファイルの中にあります。Native では その画像の左上です。色が変わるだけ、という場合、原因としてアルファ・マップ(照準の「形状」を定義するテクスチャの一部)を編集していないことが考えれらます。アルファ・テクスチャは、表示されるものとされないものを決めます [4]。
照準の大きさと、狙いを定めている最中の大きさの変化は、遠距離武器の精度と与ダメージ値で決まります。これは「表示」での指定ではなく、エンジンによって描画されます。精度が高くダメージが低いほど照準を狭めることができます [5]。
その他の注意点
有効な表示は一度に一つ。 Somebody, Modding Q&A
メニューの背景に、テクスチャ全体を使う 1 つの平面メッシュだけが必要な場合は OpenBRF の「新しいメニューの背景」。表示では、フラグとシェーダが恐らく使えるが寸法が変わるかも。 Somebody, Modding Q&A
prsntf_read_only フラグ。 Caba`drin, Modding Q&A
overlay_set_area_size 命令, Somebody, Modding Q&A
表示で一番単純なのは arena_training (闘技場での練習)。 Somebody, Modding Q&A
tf_with_outline フラグを create_text_overlay 命令で使うと、DirectX7 モードで機能しない。 Vornne, Modding Q&A
表示の座標。M&B は 4:3 というアスペクト比を使うらしい。 Vornne, Modding Q&A
マルチ・プレイヤーで、兵選択メニューの兵の名前にマウス・ポインタをかざした時に特定のメッシュを描画させたい。 Caba`drin, Modding Q&A
レンダリングの順。プレイヤーのスタミナと背景の黒い座布団という計 2 つの矩形のメッシュ・オーバレイがあり、オーバレイのサイズを変えると、背景が上に出てしまう。OpenBRF のフラグ画面でレンダリング順を調整。宣言順も有意。 Vornne and Lav, Modding Q&A
tf_right_align フラグ。 cmpxchg8b, Modding Q&A
テキスト・オーバレイの垂直方向の配置を変更する。 Caba`drin, Modding Q&A
マウスの座標。表示(presentation)の基本。 Vornne と MadVader, Modding Q&A
ハードと直結する表示 prsnt_game_escape 。 The_dragon, Modding Q&A と Lumos, Modding Q&A
presentation.py 内でテキスト・ボックスの値を変数やスロットに読み込む。 Somebody, Modding Q&A と Modding Q&A と Modding Q&A
オーバレイ ID として 0 もあり得る。 MadocComadrin, Modding Q&A
アスペクト比の解像度と無関係に、「表示」(presentation)内のオーバレイが常に画面全体を占めるようにする。 Lav, Modding Q&A
ワールド・マップ上の表示(presentation)では、s1 は常に上書きされるので使えない。 Ikaguia と Lav, Modding Q&A
表示(presentation)設計で参考になるもの。 DerGreif (credit), Modding Q&A
透明な黒い背景を持つ表示を作っているが、内部のオーバーレイの一部は透明度の影響を受け、ボタンなどがほとんど見えなくなってしまう。表示する順が影響。 kalarhan, Modding Q&A
表示(presentation)にはトリガーが 5 つある。 kalarhan, Modding Q&A
表示(presentation)終了の検出。 kalarhan, Modding Q&A
表示(presentation)に関する情報。表示は、フレームごとに更新される画面。 kalarhan, Modding Q&A
表示(presentation)にオーバレイを加えたが、9 つのうち 5 つしか表示されない。Kuba helper でマウス・ポインタの座標を読む。 kalarhan, Modding Q&A
意図通りに表示されない時。動作を試す。コンテナの理解。要素 ID を保持し、それらをさまざまなトリガーで使用する方法、要素を表示/非表示にする方法などの理解。 kalarhan, Modding Q&A
Warband での画面の座標。 Arch3r (credit), Modding Q&A
表示では reg0 は上書きされるので避けよ。 kalarhan, Modding Q&A
set_background_mesh 命令が効かない。 Somebody と kalarhan, Modding Q&A
- 脚注と出典:
- [1] jik, Updated Module System Tutorial, pages 18-19.
- [2] Dalion, Mount & Blade Modding Discord.
- [3] dstn, Mount & Blade Modding Discord.
- [4] La Grandmaster, Modding Q&A.
- [5] _Sebastian_, Modding Q&A.