最終更新日 2024-09-25

BGM

天翔記内に元々あるBGM、及び、_inmmなどでユーザー独自に追加したBGMを再生するAPIです。

関連イベントハンドラ

BGMが再生される直前に、条件によって別のBGM再生に差し替えたい場合は、
On_音楽再生直前 を参照してください。

BGMの新規再生

曲目は、TSMod.iniに記載されている。ご自身の設定によりどちらかになっているかと思います。
-- - - - - - - - - - - - 13曲分布表
--
--                       01 : -
--                       02 : -
--                       03 : [東北地方][関東地方]
--                       04 : [近畿地方][外交コマンド]
--                       05 : [戦争・春][戦争・冬]
--                       06 : [東海地方][甲信地方][北陸地方]
--                       07 : [戦争・秋][戦争・信長][戦争・名将][初期設定][本能寺の変][大坂城]
--                       08 : [山陽地方][山陰地方][環境コマンド]
--                       09 : [京都御所][海外貿易港][講義コマンド][披露コマンド]
--                       10 : [四国地方][九州地方]
--                       11 : [全国統一][安土城][戦争コマンド][披露・茶会][披露・御前試合][披露・問答][戦闘・勝利][戦闘・敗北]
--                       12 : [戦争・夏][戦争・緊迫][新幕府]
--                       13 : -
--                       14 : [死亡・滅亡]
--
-- - - - - - - - - - - - 38曲分布表
--
--                       01 : -               14 : [戦争コマンド]   27 : [外交コマンド]
--                       02 : [東北地方]       15 : [戦争・春]       28 : -
--                       03 : [関東地方]       16 : [戦争・夏]       29 : [本能寺の変]
--                       04 : [東海地方]       17 : [戦争・秋]       30 : [死亡・滅亡]
--                       05 : [甲信地方]       18 : [戦争・冬]       31 : [全国統一]
--                       06 : [北陸地方]       19 : [戦争・信長]     32 : [披露・茶会]
--                       07 : [近畿地方]       20 : [戦争・名将]     33 : [披露・御前試合]
--                       08 : [山陰地方]       21 : [戦争・緊迫]     34 : [披露・問答]
--                       09 : [山陽地方]       22 : -               35 : [戦闘・勝利]
--                       10 : [四国地方]       23 : [初期設定]       36 : [戦闘・敗北]
--                       11 : [九州地方]       24 : [環境コマンド]   37 : [京都御所]
--                       12 : [海外貿易港]     25 : [講義コマンド]   38 : [大坂城]
--                       13 : [安土城]         26 : [披露コマンド]   39 : [新幕府]

MemoryEditorMod でBGMを確認するのがよい

メモリエディタ には、「p音楽情報」のタブがあり、

のように番号を変更して、カーソルを移動させると、該当の曲番号が再生されますので、トライ&エラーが捗ります。

独自に作成したイベントで、一旦既存のBGMを停止し、改めて別のBGMを流す

BGMを停止し、再生する動機としてはこのパターンが一番確率が高いと思われます。

int Get_再生音楽番号()
void 音楽再生(int 音楽番号)
void 音楽停止()
void カスタム::On_プレイヤ担当ターン《メイン画面》() {
	int iDaimyoID = pターン情報.現在のターン【大名番号】 - 1;
	デバッグ出力 << iDaimyoID << endl;

	if (Is_プレイヤ担当大名(iDaimyoID)) {

		// 現在の再生BGMを控えておく
		int 元の音楽番号 = Get_再生音楽番号();

		// 止めて別の音楽を再生
		音楽停止();
		音楽再生(6);

		// 何かイベント
		int iBushouID = p大名情報[iDaimyoID].大名【武将番号】 - 1;
		噴出ダイアログ《通常・左上》開始(iBushouID, "何か長いイベント\xAメッセージ1");
		噴出ダイアログ《通常・左上》更新(iBushouID, "何か長いイベント\xAメッセージ2です");
		噴出ダイアログ《通常・左上》更新(iBushouID, "何か長いイベント\xAメッセージ3じゃ");
		噴出ダイアログ《通常・左上》更新(iBushouID, "何か長いイベント\xAメッセージ4な");
		噴出ダイアログ《通常・左上》終了();

		// イベントが終わったので、元の音楽を再生
		音楽停止();
		音楽再生(6);

	}
}

_inmm を利用しているかどうかの判断

新たにBGMを再生するにしても、ノーマル環境の13曲の分布なのか、それとも_inmmを用いた39曲の分布なのか、あるいは_inmmは利用しているけれども13曲なのか、
状況を考慮する必要性が出てくるかもしれません。

int Get_TSMODINI設定("environment_bgm_mode")

こちらで判断するのがおすすめです。
TSMod.iniの記載にある通り、

bool Is_INMMモード()

こちらは機能はしますが、_inmmモードを使用してるかどうかだけしか取得できず、BGM曲数が判断できないため、利便性に欠けるかと思います。

void カスタム::On_プレイヤ担当ターン《メイン画面》() {
	int iDaimyoID = pターン情報.現在のターン【大名番号】 - 1;
	デバッグ出力 << iDaimyoID << endl;

	if (Is_プレイヤ担当大名(iDaimyoID)) {

		// 現在の再生BGMを控えておく
		int 元の音楽番号 = Get_再生音楽番号();

		// 止めて別の音楽を再生
		音楽停止();

		int environment_bgm_mode = Get_TSMODINI設定("environment_bgm_mode");

		// 39曲モード
		if (environment_bgm_mode == 2) {
			音楽再生(6);
		}
		// 13曲モード
		else {
			音楽再生(4);
		}

		// 何かイベント
		int iBushouID = p大名情報[iDaimyoID].大名【武将番号】 - 1;
		噴出ダイアログ《通常・左上》開始(iBushouID, "何か長いイベント\xAメッセージ1");
		噴出ダイアログ《通常・左上》更新(iBushouID, "何か長いイベント\xAメッセージ2です");
		噴出ダイアログ《通常・左上》更新(iBushouID, "何か長いイベント\xAメッセージ3じゃ");
		噴出ダイアログ《通常・左上》更新(iBushouID, "何か長いイベント\xAメッセージ4な");
		噴出ダイアログ《通常・左上》終了();

		// イベントが終わったので、元の音楽を再生
		音楽停止();
		音楽再生(6);

	}
}

その他の応用例

真田幸隆 と 会見したら、BGMが変化する例
bool 会見中フラグ = false;
void カスタム::On_プレイヤコマンド発生直前《メイン画面》(int メインコマンド番号, int サブコマンド番号) {
	if (メイン画面::メインコマンド名::会見) {
		デバッグ出力 << "コマンド会見開始" << endl;
		会見中フラグ = true;
	}
}

void カスタム::On_プレイヤコマンド完了直前《メイン画面》() {
	デバッグ出力 << "コマンド完了" << endl;
	会見中フラグ = false;
}

string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) {

	if (武将名 == "真田幸隆") {
		if (会見中フラグ == true) {

			// 今3番を再生しているのでなければ...
			if (Get_再生音楽番号() != 3) {
				音楽停止();
			}

			音楽再生(3);
			デバッグ出力 << "真田幸隆と会話" << endl;
		}
	}

	// 変更しない場合""
	return "";
}

より詳細を知るには...

動画に関する主な所は以上となります。 詳しくは「音楽情報型.h」などを参照してください。