楽曲トラックのレコードには下記の項目がある。
(1) トラック ID。このレコードを特定するために使われる。
(2) ファイル。楽曲トラックのファイル名。
(3) 再生条件フラグ群。指定可能なフラグは header_music.py を参照のこと。
(4) 継続条件フラグ群。どのような「状況」や「文化」の時にトラックの再生を継続できるかを示す。使用可能なフラグは、header_music.py を参照のこと。
module_music.py では、モジュールで使う楽曲トラックの場所を示します。内容は単にタプルを集めたリストです。
("ambushed_by_vaegir", "ambushed_by_vaegir.ogg", mtf_culture_2|mtf_sit_ambushed|mtf_sit_siege, mtf_sit_fight|mtf_sit_multiplayer_fight|mtf_culture_all),
これは "ambushed by vaegir" という、標準的な楽曲トラックで、プレイヤーが特定の状況下で待ち伏せを受けた時に再生されます。中身を見ていきましょう。
"ambushed_by_vaegir"
コードが識別するための ID です。モジュールの他のファイルから参照する時は、track_ambushed_by_vaegir のように接頭子 track_ を付け加えます。
"ambushed_by_vaegir.ogg"
楽曲ファイルの実体の名前です。このファイルの場所は、第 3 項目に mtf_module_track を指定した場合なら このモジュールのフォルダ/Music で、それ以外なら、M&BやWarbandのフォルダ/Music です。自分の MOD のほうへファイルを置きながらフラグ指定を忘れる、という失敗に気をつけましょう。
mtf_culture_2|mtf_sit_ambushed|mtf_sit_siege
これは「再生条件」で、どのような状況や文化(デフォルトでは各勢力の街への近さで決まる)で再生されるのか、を指定しています。この例では、文化が 2(Vaegir、ヴェーガー/ヴェージャー王国) で、かつ状況が「待ち伏せまたは包囲」の場合にのみ再生されます。文化のフラグを指定しないことと、mtf_culture_all を指定することは同義で、文化の制限が無くなります。混乱する場合もあるかもしれませんが、それが M&B の仕様です。
mtf_sit_fight|mtf_sit_multiplayer_fight|mtf_culture_all),
こちらは「継続条件」です。状況や文化が変化した時に この楽曲トラックの再生を継続するか否(フェードアウトする)か、を指定します。この例では、どのような文化でも、かつ状況がどんな「戦闘」でも、かつ「シングル・プレイヤーでもマルチ・プレイヤーでも」再生され続けます。再生開始条件が再生継続条件に自動的に追加されることに注意して下さい(そうなっていることには意味があります。興味がある場合は、process_music.py を読んで下さい)。つまり、ここに mtf_culture_all を指定しなければ、その機能に任せる(再生条件にある文化を維持する)ことができます。mtf_culture_all を指定すれば、再生が継続する可能性が最大になります。再生条件のほうに個別の文化 mtf_culture_x が無いなら、ここで mtf_culture_all を指定する必要も意義もありません(自動的に継承されるからです)。
再生条件フラグ群
下記のフラグを指定できます。(王国名などは、初期設定でのものです。)
| mtf_culture_1 | 文化が 1(Swadia、スワディア)の時に再生。 |
| mtf_culture_2 | 文化が 2(Vaegirs、ヴェーガー/ヴェージャー)の時に再生。 |
| mtf_culture_3 | 文化が 3(Khergits、カーギット/ケルギト)の時に再生。 |
| mtf_culture_4 | 文化が 4(Nords、ノルド/ノード)の時に再生。 |
| mtf_culture_5 | 文化が 5(Rhodoks、ロドック/ロードク)の時に再生。 |
| mtf_culture_6 | 文化が 6(Sarranids、サラニド、訳によっては サラン)の時に再生。 |
| mtf_culture_all | あらゆる文化圏で この楽曲の再生を許す。 (プレイヤーが目に見えない境界を定期的に越えた時に再生を続けるためにも使える。 [1]。) |
| mtf_looping | 継続条件が満たされなくなるまで繰り返し再生。 |
| mtf_module_track | 楽曲ファイルの実体を、(ゲームのフォルダ下でなく)この MOD のフォルダ下の Music フォルダから参照する。 |
| mtf_persist_until_finished | 楽曲ファイルの最後まで再生され、停止できない。使用は慎重に! |
| mtf_sit_ambient_music | この楽曲を環境音楽とする。このフラグは Viking Conquest で導入されたので、Native の MOD システムを基にする場合は、header_music.py に「mtf_sit_ambient_music = 0x02000000」を書き加える必要がある。単にこのフラグを組み込んだら使えるというものではなく、Viking Conquest の MOD システムで使い方を理解する必要がある。 |
| mtf_sit_ambushed | 待ち伏せが発生している時、または戦闘でプレイヤーに対するオッズが 2:1 より悪い場合に、この楽曲を使う。 |
| mtf_sit_arena | プレイヤーが闘技場に入いったり、トーナメントに参加したり、候伯の一人と決闘したりする時に、この楽曲を使う。 |
| mtf_sit_day | ワールド・マップでの「昼間」に この楽曲を使う。(Native では使われない。) |
| mtf_sit_encounter_hostile | Native では実際には使われず、encounter_hostile_nords.ogg は再生されない。 |
| mtf_sit_feast | 訪問した領主の間で「祝宴中」の時に この楽曲を使う。 |
| mtf_sit_fight | 戦闘中に この楽曲を使う。 |
| mtf_sit_killed | プレイヤーが戦闘で負けた時や撤退中に この楽曲を使う。 |
| mtf_sit_main_title | メイン・メニューで この楽曲を使う。 |
| mtf_sit_multiplayer_fight | マルチ・プレイヤーで この楽曲を使う [2]。 |
| mtf_sit_night | ワールド・マップでの「夜間」に この楽曲を使う。(Native では使われない。) sets the music situation when it is nighttime at the world map. |
| mtf_sit_siege | 攻城(攻囲戦)中に この楽曲を使う。sets the music situation when a siege is going on. |
| mtf_sit_tavern | 宿屋(居酒屋)を訪れた時に この楽曲を使う。 |
| mtf_sit_town | 街を訪れた時に この楽曲を使う。 |
| mtf_sit_town_infiltrate | 街へ潜入中に この楽曲を使う。 |
| mtf_sit_travel | ワールド・マップ上を移動中に この楽曲を使う。 |
| mtf_sit_victorious | 戦闘で勝利した時に この楽曲を使う。 |
| mtf_start_immediately |
強制的に即座に再生する (訳注: Dragon Caliph, Anadolu 1320 Modu(トルコ語)より。) (楽曲トラック間の遅延を無くし、曲の優先順位を上書きする [3]。) |
既存の「状況」のフラグ mtf_sit_x の使用法は変更できます。ハード・コーディングされていません(mtf_sit_main_title を除く)。header_music.py には 16 個の定義済みの「状況」のフラグがあり、さらに 定数 mtf_sit_feast と mtf_module_track の間の未使用の値を使用して、最大 3 つまで実装できます [4]。最初に挙げた mtf_sit_ambient_music フラグが その(後付けの)例です。
「文化」のフラグ
文化は mtf_culture_1~mtf_culture_6 に加え、それらを全て合わせた mtf_culture_all が定義済みです。前述の通り、文化を何も指定しないのと mtf_culture_all を指定するのは、同じことです。バニラ(Warband でない)M&B では「6 番」の文化は中立の派閥用ですが、実際には様々な賊になるようコードで調整されます。Warband では、6 番は Sarranids にも賊にも使われています。Native では、プレイヤーが(どこかの勢力の)領臣になるまで、プレイヤーの隊の文化は 0 です。文化のフラグの使用例を挙げます。
("ambushed_by_neutral", "ambushed_by_neutral.ogg", mtf_sit_ambushed|mtf_sit_siege, mtf_sit_fight),
上の楽曲トラックは、どの文化の領域にいても再生され、続けられます。mtf_culture_all が指定されていないからです。
("ambushed_by_neutral", "ambushed_by_neutral.ogg", mtf_culture_1|mtf_culture_2|mtf_sit_ambushed|mtf_sit_siege, mtf_culture_4|mtf_sit_fight)
同じ ID のレコードを こちらのように変えれば、文化 1 と 2 で再生され、文化 1 と 2 と 4 で継続します。つまり、文化 3 と 5 と 6 ではフェードアウトします。
注意点として、mtf_culture_7 のような新しいフラグを追加できません。6 つがゲーム・エンジンにハード・コーディングされているからです。ただし、命令(play_track、play_cue_track、music_set_situation、music_set_culture)を使って標準の楽曲システムの動きを上書きし、文化のフラグ以外の他のゲーム内変数に基づくように制御することはできます [5]。
Warband が(バニラ W&B と異なり)現在の「文化」と「状況」の組み合わせに基づいて楽曲トラックを選択している、という事実を利用することもできます。文化や状況を単なる抽象的な数字として扱えばいいのです。6「文化」と 16 + 3「状況」(16「状況」に 3 つ追加可、は前述)、つまり 6 * 19 = 114 の固有の状況が得られます。実際には mtf_sit_main_title などは組み合わせが限定的なので、総数は 114 未満になりますが、それでも たいていは事足りる、かなりの数を得られます [4]。
Native の処理コード
(訳注: Warband のことも触れているので、「元々の処理コード」?)楽曲を変更するには、ほとんどの MOD 開発者はスクリプト music_set_situation_with_culture を利用します。そこからは music_set_situation と music_set_culture を呼び出しています。そのスクリプトを利用するにせよしないにせよ、mtf_sit_x を見て状況を分析し、状況に適した 1 つ以上の文化を決定することになります。複数の文化が条件になると、楽曲トラック内に より多くの一致が見つかり、楽曲の多様性が増す反面、プレイヤーからはランダムに見えて混乱を招くことになるので、一長一短があります。このスクリプトは楽曲を暗黙的に選んでいる(訳注: つまり候補を提示している)だけであり、実際に状況や文化の変化を検出して再生対象を決めるのは M&B 内部の楽曲システムです。
状況と文化の設定例: (訳注: ここでは原文の AND の両辺が排他的な場合があるので、「かつ」ではなく「と」と訳します。)
- 街(mtf_sit_town)では、その街が属する「勢力」の文化にする。
- ワールド・マップ上を移動中(mtf_sit_travel)は、「最寄りの街が属する勢力の文化」と「主人公の文化」とする(最大 2 文化まで)。
- 戦闘中(mtf_sit_fight または mtf_sit_ambushed)は、「率いている隊の文化」と「最寄りの街の文化」とする(最大 4 文化まで)。
- 戦闘に勝利した時(mtf_sit_victorious)は主人公自身の文化、負けた時(mtf_sit_killed)は対戦相手の文化。
- マルチ・プレイヤーでは、両チームの勢力の文化(2 文化)。 [6]
- 文化に関係しない状況もある(culture=0)。module_music.py 内では、再生条件に、文化 mtf_culture_x と状況「mtf_sit_tavern(宿屋/居酒屋)や mtf_sit_siege(攻城/攻囲)や mtf_sit_arena」(闘技場)を併用してはいけない。
- コードから使われない「状況」もある。次に挙げる「状況」で楽曲トラックを無駄に浪費してはいけない。mtf_sit_town(Warband は使用)、mtf_sit_day、mtf_sit_night(バニラ M&B は calm_night_2.ogg を再生しないが、Warband は使用)、mtf_sit_encounter_hostile(encounter_hostile_nords.ogg は再生されない)。
いくつかの共通的な「状況」(mtf_sit_x)はコードで設定されます。この x の部分は、街メニュー(travel)、街の散策(travel、Warband では town または night)、夜の通り(travel)、宿屋/居酒屋(tavern)、闘技場マスター(travel)、闘技場での練習試合(arena)、村の散策(travel)、城メニュー(travel)、城主の間(travel)のように対応します。
戦闘は、トリガーを使って楽曲を再生するので、特殊です。共通の戦闘用トリガーが 30 秒ごとに発火し、プレイヤーに対するオッズが 2:1 より悪いければ、状況を mtf_sit_fight または mtf_sit_ambushed に設定します。攻城戦では共通的な攻城の楽曲で始まり、その後は通常どおり戦闘の楽曲が再生されます。
ワールドマップにはゲーム時間ごとに起動するトリガーがあり、状況を mtf_sit_travel に設定し 移動中を表わす楽曲の再生を試みます。
また、フラグを必要としないような例外として、スクリプトから明示的に再生される楽曲も一部にあります。例えば、Native の楽曲トラック captured、empty_village、escape、victorious_evil、および(Warband のみ)結婚式 などです。
楽曲設計のヒント
MOD を開発していると、ゲーム内で想定される ありとあらゆる状況に対応した個別の楽曲を、こと細かに指定したくなるかもしれませんが、その気持ちは抑えて下さい! プレイヤーは、更に多様な移動と戦闘の楽曲を望むかもしれません。 You may want to have special tracks for every possible situation in the game - resist the urge! From a player point of view more varied travel and battle tracks may bring better value.
どの楽曲をどこで継続するか(継続条件フラグ)を設計する時は、平均的なプレイヤーの考えそうなことを考慮して下さい。プレイヤーが宿屋/居酒屋で数秒しか過ごさないのなら、移動、街、城主の間といった既製の楽曲を継続しておけばよさそうで、数秒ごとに楽曲を変える必要はなさそう。あなたの設計した宿屋/居酒屋が たむろする場所として 充分に楽しいのなら、居酒屋の楽曲以外のものをそこで流す必要は無いでしょう。
停止不能の全区間再生指定 mtf_persist_until_finished を使うのは、短いトラック(Native なら勝利の楽曲など)だけにして下さい。ただし、プレイヤーが(現実世界で)ズルや海賊版行為をしていると見なせるとか、開発者のあなたが単なる意地悪、という理由でプレイヤーを煩わせたい場合は、次のようにフラグを指定します。
("punish_player", "punish_player.ogg", mtf_looping|mtf_persist_until_finished|mtf_module_track, 0)
こうすれば、この楽曲トラックは無限ループし、プレイヤーがゲームから抜けるまで停止できません。 (訳注: その名も「プレイヤーを懲らしめる」)
スクリプト設計のヒント
再生中の楽曲をフェードアウト(徐々に音量を低下させて消音)させたい場合は、music_set_situation, 0) を指定します。この「状況」を再度指定すると、新たに再生が始まります。M&B にランダムな楽曲を選択させず、特定の楽曲トラックを再生したい場合は、play_track 命令を使います。継続条件フラグ群に注意しないと、楽曲が途中で停止する可能性があります (訳注: この命令とモジュールで指定したフラグ群との整合性のことを言っているらしい)play_cue_track 命令を使うと、既に再生中のものに重ねて再生できます。ただ、うまい活用方法は思いつきません。
ゾンビの大群などとの遭遇など、特定の場面でのみ再生するなら、最も簡単な方法は、次のような手順です。
- game_event_party_encounter() というスクリプトに次のような行を加える。
(try_begin), (eq, "$g_encountered_party_template","pt_zombie_horde"), (play_track, "track_zombie_horde", 1), (try_end), - module_music.py に下記レコードを追加し、zombie_horde.ogg ファイルを「このモジュールのフォルダ下の Music フォルダ」に置く。
("zombie_horde", "zombie_horde.ogg", mtf_module_track, mtf_sit_fight|mtf_sit_ambushed|mtf_sit_travel|mtf_culture_all),
フラグ群についての項で前述の通り、Native の「状況」のフラグに最大 3 つの状況のフラグを追加できます。フラグ mtf_sit_ambient_music は、Viking Conquest の開発者による追加例のことも既に書きました。理由不明で削除された Native の「状況」のフラグもあり、コード内に残骸が見つかります。ということで、城主の間(城と街のメニューの上のほうからアクセスできる広間)での楽曲を再実装してみましょう。その手順は次のような簡単なものです。
- 下記の行を header_music.py に追加 [7]。
mtf_sit_lords_hall = 0x02000000 - ミッション・テンプレート module_mission_templates.py ファイル内の下記の行を見つけて、コメント化している「#」を外す。
# (call_script, "script_music_set_situation_with_culture", mtf_sit_lords_hall), - スクリプト module_scripts.py ファイル内の music_set_situation_with_culture というスクリプトに下記を追加。
(this_or_next|eq, ":situation", mtf_sit_town_infiltrate), (this_or_next|eq, ":situation", mtf_sit_lords_hall), <<<--- (eq, ":situation", mtf_sit_encounter_hostile), - 楽曲 module_music.py ファイルに下記のようなレコード(楽曲トラック)を追加(ここでのフラグ群は一例なので自由に指定)し、対応する .oggs ファイルを所定のフォルダに置く。
("lords_hall_swadian", "lords_hall_swadian.ogg", mtf_module_track|mtf_culture_1|mtf_sit_lords_hall, mtf_sit_tavern|mtf_culture_all), ("lords_hall_vaegir", "lords_hall_vaegir.ogg", mtf_module_track|mtf_culture_2|mtf_sit_lords_hall, mtf_sit_tavern|mtf_culture_all), ("lords_hall_khergit", "lords_hall_khergit.ogg", mtf_module_track|mtf_culture_3|mtf_sit_lords_hall, mtf_sit_tavern|mtf_culture_all), ("lords_hall_nord", "lords_hall_nord.ogg", mtf_module_track|mtf_culture_4|mtf_sit_lords_hall, mtf_sit_tavern|mtf_culture_all), ("lords_hall_rhodok", "lords_hall_rhodok.ogg", mtf_module_track|mtf_culture_5|mtf_sit_lords_hall, mtf_sit_tavern|mtf_culture_all), ("lords_hall_sarranid", "lords_hall_sarranid.ogg", mtf_module_track|mtf_culture_6|mtf_sit_lords_hall, mtf_sit_tavern|mtf_culture_all),
最適な楽曲ファイル形式
ファイル形式に関しては、この「楽曲」の場合は「効果音」の場合のような注意は不要のようです。OGG、MP3、WAV ファイルを使えます。ゲーム開発元が使ったのは、特許が含まれず無料で使える OGG Vorbis 形式です [8] (訳注: MP3 の特許は 原文投稿時から変化。脚注[8] も参照のこと)。OGG Vorbis 形式は、費用のかかる MP3 よりも高品質で特許フリーのコンテナであり、ゲーム・エンジンはそれを完全に理解します [9] 。この形式には欠点もあるので、この web 文書の別ページ「最適な音声ファイル形式」の項も読んで下さい! ただし、テストの結果、楽曲ファイルのほうは OGG のままになりそうです。ストリーミング形式を採用するようなので、WAV に変更するのは恐らく得策ではありません [10]。モノラルだと再生時に問題を起こし得ます。ステレオのファイルを使って下さい。
- 脚注と出典:
- [1] MadVader, Modding Q&A.
- [2] MadVader, Which music tracks play in multiplayer, in Warband??.
- [3] Swyter, Warband: Engine-Related Questions.
- [4] Lav, Editing Music.
- [5] Somebody, Modding Q&A, と kalarhan, Modding Q&A。例えば、DLC(ダウンロード型コンテンツ)の Viking Conquest と、The Last Days という MOD は独自の楽曲システムを持つ。
- [6] 詳細はスクリプト script_multiplayer_init_mission_variables を参照のこと。
- [7] mtf_sit_ambient_music = 0x02000000 も追加している場合は、もちろん 0x04000000 などにずらす必要がある。
- [8] Swyter, Added music doesn't play on time. (訳注: 左の投稿は 2011 年 10 月のもので、その後 MP3 の特許保護に関する状況は大きく変化。ただし この種の状況は常に変化し得るので、将来 他人(共同開発者やプレイヤーだけでなく、権利者)に迷惑をかけないためにも「都合よく解釈して安心」したりせず、常に必ず最新の一次情報を確認しつつ、先を見越した開発を。)
- [9] Swyter, Modding Q&A.
- [9] xenoargh, Optimization Announcement: Sound and your Mods.