新しいバナーを追加する

Nativeに新しくバナーを追加するまでの過程です。
参考:Adding Bannersの方々に感謝



必要となるもの

新しいバナー画像(1024x1024サイズ)
Texture Converter(ddsをbmpファイルに変換するのに必要)
DirectXTextureTool(MipMap付きddsファイル作成に必要)
※上記二つはDirectXSDKをインストールすると付いてくる
Paint.NETならddsのまま編集可能。保存時にDTX1+mipmap作成もOK
BRFEdit
画像を編集するソフト(Gimp,Photoshopなど)
pyを編集できる環境

新しいバナー画像の作成

~\Mount&Blade\Texturesフォルダにあるbanner_a~f.ddsファイルを一つコピーし
右クリックで"Convert To file format…"を選び、Enable extended.DDS file optionsのチェックを外し
Pixel Formatで"A8R8G8B8"などを選びbmpに変換する。
できたbmpを画像編集ソフトなどで各バナーを追加したいバナーに編集する
そして編集した画像をDirectXTextureToolで開き、Format項目で"Genarate MipMaps"でMipMapを作成する。
"Change Surface Format..."でDXT1を選択、File項目Save As...でddsを作成する(例:banners_g.ddsなど)

NativeModuleSystem(.pyファイル)の編集

編集するpyファイルはmodule_map_icons.py、module_meshes.py、
module_scene_props.py、module_presentations.py、module_constants.pyの5つ。
module_map_icons.pyの編集
 ("banner_126",0,"map_flag_15", banner_scale,0),の後に
 
 ("banner_127",0,"map_flag_g01", banner_scale,0),
 ("banner_128",0,"map_flag_g02", banner_scale,0),
 ("banner_129",0,"map_flag_g03", banner_scale,0),
 ("banner_130",0,"map_flag_g04", banner_scale,0),
 ("banner_131",0,"map_flag_g05", banner_scale,0),
 ("banner_132",0,"map_flag_g06", banner_scale,0),
 ("banner_133",0,"map_flag_g07", banner_scale,0),
 ("banner_134",0,"map_flag_g08", banner_scale,0),
 ("banner_135",0,"map_flag_g09", banner_scale,0),
 ("banner_136",0,"map_flag_g10", banner_scale,0),
 ("banner_137",0,"map_flag_g11", banner_scale,0),
 ("banner_138",0,"map_flag_g12", banner_scale,0),
 ("banner_139",0,"map_flag_g13", banner_scale,0),
 ("banner_140",0,"map_flag_g14", banner_scale,0),
 ("banner_141",0,"map_flag_g15", banner_scale,0),
 ("banner_142",0,"map_flag_g16", banner_scale,0),
 ("banner_143",0,"map_flag_g17", banner_scale,0),
 ("banner_144",0,"map_flag_g18", banner_scale,0),
 ("banner_145",0,"map_flag_g19", banner_scale,0),
 ("banner_146",0,"map_flag_g20", banner_scale,0),
 ("banner_147",0,"map_flag_g21", banner_scale,0),

module_meshes.pyの編集
 ("banner_f21", 0, "banner_a15", 0, 0, 0, -90, 0, 0, 1, 1, 1),の後に
 
 ("banner_g01", 0, "banner_g01", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g02", 0, "banner_g02", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g03", 0, "banner_g03", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g04", 0, "banner_g04", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g05", 0, "banner_g05", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g06", 0, "banner_g06", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g07", 0, "banner_g07", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g08", 0, "banner_g08", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g09", 0, "banner_g09", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g10", 0, "banner_g10", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g11", 0, "banner_g11", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g12", 0, "banner_g12", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g13", 0, "banner_g13", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g14", 0, "banner_g14", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g15", 0, "banner_g15", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g16", 0, "banner_g16", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g17", 0, "banner_g17", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g18", 0, "banner_g18", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g19", 0, "banner_g19", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g20", 0, "banner_g20", 0, 0, 0, -90, 0, 0, 1, 1, 1),
 ("banner_g21", 0, "banner_g21", 0, 0, 0, -90, 0, 0, 1, 1, 1),

module_scene_props.pyの編集
 ("banner_f21", 0, "banner_a15", "0", []),の後に
 
 ("banner_g01", 0, "banner_g01", "0", []),
 ("banner_g02", 0, "banner_g02", "0", []),
 ("banner_g03", 0, "banner_g03", "0", []),
 ("banner_g04", 0, "banner_g04", "0", []),
 ("banner_g05", 0, "banner_g05", "0", []),
 ("banner_g06", 0, "banner_g06", "0", []),
 ("banner_g07", 0, "banner_g07", "0", []),
 ("banner_g08", 0, "banner_g08", "0", []),
 ("banner_g09", 0, "banner_g09", "0", []),
 ("banner_g10", 0, "banner_g10", "0", []),
 ("banner_g11", 0, "banner_g11", "0", []),
 ("banner_g12", 0, "banner_g12", "0", []),
 ("banner_g13", 0, "banner_g13", "0", []),
 ("banner_g14", 0, "banner_g14", "0", []),
 ("banner_g15", 0, "banner_g15", "0", []),
 ("banner_g16", 0, "banner_g16", "0", []),
 ("banner_g17", 0, "banner_g17", "0", []),
 ("banner_g18", 0, "banner_g18", "0", []),
 ("banner_g19", 0, "banner_g19", "0", []),
 ("banner_g20", 0, "banner_g20", "0", []),
 ("banner_g21", 0, "banner_g21", "0", []),

module_presentations.pyの編集
     (ti_on_presentation_event_state_change,
      [(store_trigger_param_1, ":object"),
       (try_begin),
         (eq, ":object", "$g_presentation_obj_1"),
         (val_add, "$g_presentation_page_no", 1),
         (val_mod, "$g_presentation_page_no", 8), ←の数字を10にする

module_constants.pyの編集
 # Banner constants
 banner_meshes_begin = "mesh_banner_a01"
 banner_meshes_end_minus_one = "mesh_banner_f21" ←"mesh_banner_g21"に変える
 
 banner_map_icons_begin = "icon_banner_01"
 banner_map_icons_end_minus_one = "icon_banner_126" ←"icon_banner_147"に変える
 
 banner_scene_props_begin = "spr_banner_a"
 banner_scene_props_end_minus_one = "spr_banner_f21" ←"spr_banner_g21"に変える

BRFEditでBRFファイルを作成する

BRFEditを起動して
~\Mount&Blade\CommonResフォルダのbanners.brfからbanner_f01からbanner_f21、
~\Mount&Blade\CommonResフォルダのmap_flag_c.brfからmap_flag_f01からmap_flag_f21をImportして
Nameをそれぞれbanner_g01からbanner_g21、map_flag_g01からmap_flag_g21に変更し、Materialを共通の名前(bannar_gmなど)にする
Matのタブを選択し、addでdefault_materialを作成し、先ほどの名前に変更して用意したバナー用の画像名(.ddsを省く)をDiffuseに記入
Texのタブを選択し、addでdefault_texture.ddsを作成し、名前をバナー用の画像名にしてセットする
後はNativeのResourceフォルダにBRFファイルを保存し、Texturesフォルダにバナーの画像を置いて
module.iniの最後にload_mod_resource = BRFの名前(.brfを省く) を記入すれば終了です。

ゲーム上での反映を確かめる

バナー選択のページは16ずつしか表示されないのでa~gで21x7=147のバナーを表示するには10ページ必要ですが
最後のバナーは現状表示されません。(やりようはあるようです)
記述、BRFの作成が成功していればこのようになります。

一度この作業をすれば後はddsファイルを編集するだけでいつでも新しいバナーに変える事が出来ます。

補足

バナー画像は一つが140x341のサイズです。しかしそれだと1024x1024全体サイズではHight(画像の縦)が1pixel余ります・・・
なので私は上段(140x341)、中段(140x342)、下段(140x341)としました。一応表示に問題はありませんでした。
他のバナー同様に服に反映させる場合、module_meshes.pyの"arms_f01~f21"の項目をコピーしてfをgに変えて
module_constants.pyのarms_meshes_end_minus_one = "mesh_arms_f21"を"mesh_arms_g21"に変えればできます。
(※旗用のmeshが標準(長方形)ならそのまま使えますが、旗の形状がそれ以外の場合には標準の形のmeshをarms_用に作る必要があります)



添付ファイル