int カスタム::On_音楽再生直前(int 再生予定番号)

int カスタム::On_音楽再生直前(int 再生予定番号) {
    return -1;
}

引数の補足

  • @再生予定番号:
    この直後に再生されるBGM番号。TSMod.iniに記述してある番号。

タイミング

  • BGMが再生される度に、その直前に呼び出される。

一般的用途

  • 既存のBGMの割り振りを、状況によってダイナミックに置き換えたい場合に利用する。

例①

ここでは、BGM置き換えでよくありがちなサンプルを紹介したい。

PICTURE

上の赤枠のような曲分布は本来は、存在しない。
しかし、これを存在するかのように振るえるよう、プログラムを記述する

例①

int カスタム::On_音楽再生直前(int 再生予定番号) { {

  /*
     * 42:[本願寺・全地方]というのを実装してみる。
     */

  // BGMモードが_INMMで、曲分布が38曲タイプに設定されているならば…
  if ( Get_TSMODINI設定("environment_bgm_mode") == 2 ) {

    if (  2<=再生予定番号 && 再生予定番号<=11  ) { // [東北地方]~[九州地方]のどれかが再生される予定ならば。

      // 現在のターンが回っている大名勢力番号【配列用】を得る。
      int iDaimyoID = pターン情報.現在のターン【大名番号】-1;

      if ( 0 <= iDaimyoID && iDaimyoID < 最大数::大名情報::配列数 ) {

        // それはプレイヤが操作している。
        if ( Is_プレイヤ担当大名( iDaimyoID ) ) {
          if ( p大名情報[iDaimyoID].家紋 == 41 ) { // 本願寺の家紋

            return 42; // 42番を再生するようにする。
          }
        }
      }
    }
  }

  // 変更しない場合-1
  return -1;
}

_inmm側で増やす

後は、_inmmでそのようなトラックを追加(42番のトラックに対応するもの)すれば再生されます。

例②

int 攻撃側軍団長【武将番号】= -1;
void カスタム::On_戦争開始(戦争開始パラメタ型 パラメタ) {
  攻撃側軍団長【武将番号】 = パラメタ.攻撃側軍団長【武将番号】;
}


int カスタム::On_音楽再生直前(int 再生予定番号) {

  /*
  * 40:[戦争・政宗]というのを実装してみる。
  */

  // BGMモードが_INMMで、曲分布が38曲タイプに設定されているならば…
  if ( Get_TSMODINI設定("environment_bgm_mode") == 2 ) {

    if ( 15<=再生予定番号 && 再生予定番号<=20 ) { // 「戦争・緊迫」以外の戦争系の曲が流れようとしている直前!

      // 現在の戦域全域を対象として出陣している武将番号配列用のリストを得る。
      番号リスト型 list = Get_出陣中の武将番号リスト【配列用】();

      for each ( int iBushouID in list ) {

        // 伊達政宗が出陣している。
        if ( p武将戸籍情報[iBushouID].顔番号 == 顔番号::伊達政宗 && Get_名字(iBushouID) == "伊達" && Get_名前(iBushouID) == "政宗" ) {

          // 政宗は大名である。
          if ( p武将戸籍情報[iBushouID].状態 == 状態::大名 ) {

            // 配列にアクセスするので攻撃を仕掛けた軍団長妥当性チェック
            if ( 0 <= 攻撃側軍団長【武将番号】 && 攻撃側軍団長【武将番号】 < 最大数::武将情報::配列数 ) {

              // 攻撃を仕掛けた軍団長の所属する大名勢力と、政宗が所属する大名勢力は同じ
              // 即ち、政宗は戦争の直接攻撃側(真っ赤ユニット勢)
              if ( p武将情報[iBushouID].所属大名【大名番号】 == p武将情報[攻撃側軍団長【武将番号】-1].所属大名【大名番号】 ) {

                // この時、「再生予定番号」に替えて、「戦争・政宗」 の音楽を流す
                return 40;
              }
            }
          }
        }
      }
    }
  }

  // 変更しない場合-1
  return -1;
}

例③

int カスタム::On_音楽再生直前(int 再生予定番号) {

  /*
  * 41:[戦争・第六天魔王信長]というのを実装してみる。
  */

  // BGMモードが_INMMで、曲分布が38曲タイプに設定されているならば…
  if ( Get_TSMODINI設定("environment_bgm_mode") == 2 ) {

    if ( 15<=再生予定番号 && 再生予定番号<=20 ) { // 「戦争・緊迫」以外の戦争系の曲が流れようとしている直前!

      // 現在の戦域全域を対象として出陣している武将番号配列用のリストを得る。
      番号リスト型 list = Get_出陣中の武将番号リスト【配列用】();

      for each ( int iBushouID in list ) {

        // 織田信長が出陣している。
        if ( p武将戸籍情報[iBushouID].顔番号 == 顔番号::織田信長 && Get_名字(iBushouID) == "織田" && Get_名前(iBushouID) == "信長" ) {

          // 信長は大名である。
          if ( p武将戸籍情報[iBushouID].状態 == 状態::大名 ) {

            // 戦争において「攻撃」出来るのは、現在のターンが回っている大名勢力だけなので、
            // 例②の記述を考え方を変えて、次のような記述方法もある。

            // 信長が所属する大名勢力は現在のターンが回っている大名勢力、即ち、戦場にいる以上、信長は戦争の直接攻撃側(真っ赤ユニット勢)
            if ( p武将情報[iBushouID].所属大名【大名番号】 == pターン情報.現在のターン【大名番号】 ) {

              // 信長が所持する城数はすでに、50を超えるかをチェック。これを第六天魔王定義とする。
              int iDaimyoID = p武将情報[iBushouID].所属大名【大名番号】-1;
              if ( Get_大名所持城数(iDaimyoID) > 50 ) {

                // この時、「再生予定番号」に替えて、[戦争・第六天魔王信長] の音楽を流す
                return 41;
              }
            }
          }
        }
      }
    }
  }

  // 変更しない場合-1
  return -1;
}