最終更新日 2024-09-25

On_データファイル読込直前

On_データファイル読込直前

データファイルが読み込まれる度に
呼びだされるイベントハンドラとなります。

データファイルとは、イベント用メッセージや、UI用のメッセージ、
戦国武将列伝、戦国名城物語、戦国名物事典など、
野戦や籠城戦の構成データ
などを指します。

BGMやMovieなどは別途それ専用のイベントハンドラが存在します。

注意点

このメソッドは極めて重要な働きをします。

Steam配信のゲームは全て、Steamの機能「ゲームキャッシュの整合性を確認」を実行すると、
ファイルが全てオリジナルのものへと戻ります
この機能は重要なエラー修復の機能であり、利用は必須であり
「改造してるから利用するな」などといった横暴な言い分は現実的ではありません。

そこで便利なのが、このメソッドように、
何かファイルを読み込もうとした時に、状況に応じてその場その場で別ファイルを読み込む
リダイレクトという考え方です。

使い処

武将列伝や家宝列伝を書き換えた。
Steamの「ゲームキャッシュの整合性を確認」の影響を受けないようにしたい。

使用例

武将列伝・家宝列伝・HEXMAPの構成データを別ファイルから読み込めるようにする
String^ 天翔記クラス::On_データファイル読込直前(String^ 元ファイル名) {

  // 武将列伝だ
  // 既存武将を、ちょっと編集しちゃったんで
  //「bfile*.dat」ではなく、「my_bfile*.dat」という別ファイルから読み込むようにする。
  if ( 元ファイル名->ToLower()->Contains("\\bfile") ) {

    // 新たなファイル名を構築 bfile*.datではなく、my_bfile*.datとする
    String^ 新ファイル名 = 元ファイル名->ToLower()->Replace("bfile", "my_bfile");

    // その新しいファイル名が実際に存在するのなら
    if (System::IO::File::Exists(新ファイル名)) {

      // 元のファイルではなく、新ファイルの方を読み込む
      return 新ファイル名;
    }
  }

  // 家宝列伝だ
  // 独自家宝を作るなど、ちょっと編集しちゃったんで
  //「ifile*.dat」ではなく、「my_ifile*.dat」という別ファイルから読み込むようにする。
  if (元ファイル名->ToLower()->Contains("\\ifile")) {

    // 新たなファイル名を構築 ifile*.datではなく、my_ifile*.datとする
    String^ 新ファイル名 = 元ファイル名->ToLower()->Replace("ifile", "my_ifile");

    // その新しいファイル名が実際に存在するのなら
    if (System::IO::File::Exists(新ファイル名)) {

      // 元のファイルではなく、新ファイルの方を読み込む
      return 新ファイル名;
    }
  }

  // ヘックス系データだ。
  // ちょっと編集しちゃったんで
  //「hexmap.nb6」ではなく、「my_hexmap.nb6」という別のファイルから読み込むようにする。
  if (元ファイル名->ToLower()->Contains("\\hexmap.nb6")) {

    // 新たなファイル名を構築 hexmap.nb6ではなく、my_hexmap.nb6とする
    String^ 新ファイル名 = 元ファイル名->ToLower()->Replace("hexmap", "my_hexmap");

    // その新しいファイル名が実際に存在するのなら
    if (System::IO::File::Exists(新ファイル名)) {

      // 元のファイルではなく、新ファイルの方を読み込む
      return 新ファイル名;
    }
  }

  return "";
}

その他

「On_データファイル読込直前」イベントハンドラについて、主な解説は以上となります。