ScenarioModVer2 更新履歴 v2.0.0.0~v2.3.0.0

  • v2.2.2.8 ⇒ v2.2.2.9

    • On_戦闘コマンド表示直前《戦争画面》(int 武将番号) イベントハンドラや、
    • On_基本コマンド表示直前《戦争画面》(int 武将番号) イベントハンドラが、
      正しく動いていない不具合の修正。 TSMod.dll のバージョンが 2.3.0.2 以上であること。
  • v2.2.2.8 ⇒ v2.2.2.8 (ScenarioModは更新されていない)

    • On_職業名表示直前(int 武将番号) イベントハンドラに関して、
      これまであった「職業名称を変更可能な武将は、有効な職業である者(=「職業::無し」以外の武将)に限定される
      という条件が撤廃された。
      TSMod.dll のバージョンが 2.2.5.0 以上であること。
  • v2.2.2.7 ⇒ v2.2.2.8

    • ScenarioModで、ゲーム起動時に、乱数の種である。srandを実行するようにした。
      よって、乱数などを使う際には、原則的には、srandを使う必要はなく、rand関数のみで乱数が得られるはずである。
    • 城の「位置」に関する情報について、幅広く得られるようにした。 城グリッド位置型, Get_城グリッド位置, 城グリッド方向型 などがある。
      これらは下記の利用例を見るのがわかりやすいだろう。
       string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) {
      
          int i = Get_城番号【配列用】("観音寺");
          城グリッド位置型 位置i = Get_城グリッド位置(i);
      
          デバッグ出力 << i << endl;
          デバッグ出力("観音寺:(X,Y):(%d,%d)", 位置i.X, 位置i.Y);
      
          int j = pターン情報.現在のターン【城番号】-1;
          城グリッド位置型 位置j = Get_城グリッド位置(j);
      
          デバッグ出力 << j << endl;
          デバッグ出力("%s:(X,Y):(%d,%d)", Get_城名(j).c_str(), 位置j.X, 位置j.Y);
      
          デバッグ出力 << 位置j.北西【城番号】 << endl;
          デバッグ出力 << 位置j.北【城番号】   << endl;
          デバッグ出力 << 位置j.北東【城番号】 << endl;
          デバッグ出力 << 位置j.西【城番号】   << endl;
          デバッグ出力 << 位置j.東【城番号】   << endl;
          デバッグ出力 << 位置j.南西【城番号】 << endl;
          デバッグ出力 << 位置j.南【城番号】   << endl;
          デバッグ出力 << 位置j.南東【城番号】 << endl;
      
      
          城グリッドベクトル型 my方角;
          my方角 = 位置i - 位置j;
          デバッグ出力("観音寺⇒プレイヤターン城は (Vx,Vy):(%d,%d)の方向にある。", my方角.X, my方角.Y);
      
      
    • On_戦争開始(戦争開始パラメタ型 パラメタ) 関数にて、
      「パラメタ.城番号」が渡ってくる
      ことも注目点だろう。
      この城番号とは、攻められた側の城、即ち、戦場の真ん中の城を指すわけであるから、
      上の城位置情報と組み合わせることで、
      今起きている、戦争画面に存在する城番号や城名、そして、9分割上での位置(北西の城とか)がわかるのである。
  • v2.2.2.6 ⇒ v2.2.2.7

    • On_職業名表示直前(int 武将番号)

      というイベントハンドラが加えられた。
      使い方は、「On_噴出メッセージ直前」とほぼ同じである。
      string カスタム::On_職業名表示直前(int 武将番号) {
      
        int i武将顔番号 = p武将戸籍情報[武将番号-1].顔番号;
      
        if ( i武将顔番号 == 1322 ) {
          return "占い師";
        }
      
        // 変更しない場合は何も返さない
        return "";
      }
      
      
      このように、今「職業」を表示しようしている「武将番号」が引数として渡ってくるので、
      メッセージの置き換え同様に、その時の様々な状況等判定して、職業名を返せば良い。
      通常は顔番号や名前で判定して、職業名を返すだろう。
      その瞬間の能力値等を判定して、職業名を変化させる、といった凝ったことも可能であるし、
      所属している地域によって、変化させるといったことも当然可能である。

      ただし、もともと有効な職業(=「職業::無し」以外)に付いている必要があるので、注意すること。
  • v2.2.2.5 ⇒ v2.2.2.6

    動画再生関数に関して、2番目の引数の仕様を変更した。

    • 動画再生("動画名", オプション)


      以下のように利用する。
          動画再生("KOEILOGO"); // KOEILOGO.AVI を黒バックで再生する。黒バック付がデフォルトの挙動。
      
          動画再生("MYMOVIE", 動画::黒背景OFF); // MYMOVIE.AVI(という自分で用意したAVI)を、黒バックにせずに、再生する。
      
          動画再生("HOGEHOGE", 動画::BGM継続); // HOGEHOGE.AVI(という自分で用意したAVI)を、再生する。再生する際に、それまで流れているBGMを停止せずに継続したままとする。
      
          動画再生("MYHOGE", 動画::黒背景OFF|動画::BGM継続); // MYHOGE.AVI(という自分で用意したAVI)を、再生する。
                                                                   // 再生する際に、黒バックにせずに、かつ、それまで流れているBGMを停止せずに継続したままとする。
      
  • v2.2.2.4 ⇒ v2.2.2.5

    • 動画再生("動画名", 黒バック)

      という関数を追加した。
      これは、文字通り、動画を再生するものである。
      元々存在する動画でも良いし、自作した新しい動画を、ローカルハードディスクのmovieフォルダに入れたものでも良い。
      以下のように利用する。
          動画再生("KOEILOGO"); // KOEILOGO.AVI を黒バックで再生する。黒バック付がデフォルトの挙動。
      
          動画再生("MYMOVIE", FALSE); // MYMOVIE.AVI(という自分で用意したAVI)を、黒バックにせずに、再生する。
      
  • v2.2.2.2 ⇒ v2.2.2.4

    • On_戦争開始(戦争開始パラメタ型 パラメタ)

      というイベントハンドラを追加した。
      これは、文字通り、戦争が開始された時に、このイベントハンドラが実行される。
      PC/NPC、戦場見る/見ないなどは無関係に実行される。
      PC戦闘の場合は、戦前交渉が終わり、実際の戦場画面に入る直前をもって、戦闘開始とみなす。
      引数である「パラメタ」には、ターゲットとなった「城番号」や、守備側の「軍団番号・軍団長の武将番号」、攻撃側の「軍団番号・軍団長の武将番号」などが渡ってくる。
    • On_戦争終了()

      というイベントハンドラを追加した。
      これは、文字通り、戦争が終了した時に、このイベントハンドラが実行される。
      PC/NPC、戦場見る/見ないなどは無関係に実行される。
      PC戦闘の時は、戦後の登用・斬首・解放等の処理が終わった時点をもって、戦争終了とみなす。
  • v2.2.2.0 ⇒ v2.2.2.2

    • 基本::On_技能コマンド表示直前《戦争画面》 は
      基本::On_基本コマンド表示直前《戦争画面》 と同じであるため、削除した。
    • 戦闘画面における、自ユニットコマンド実行時の「コマンド名」を条件によって変更できるようにした。
      考え方は、武将の吹き出しメッセージの置き換えと概ね同じで、「コマンド名を表示しようとする度に」、このイベントハンドラが呼ばれる。
      よって、武将番号や、武将能力、所持家宝等の条件を判定して、コマンド名を変更する。
      void カスタム::On_戦闘コマンド表示直前《戦争画面》(int 武将番号) {
          if (武将番号==189) {
             Set_コマンド名( 戦争画面::戦闘コマンド名::通常攻撃, "My攻撃");
             Set_コマンド名( 戦争画面::戦闘コマンド名::鉄砲攻撃, "レーザー超魚雷");
          }
      }
  • v2.2.1.0 ⇒ v2.2.2.0

    • 正規表現エンジンを鬼車に切り替えた。
      これは、現在、日本語向けとしては、最高峰の正規表現エンジンである。

      使い方は、変わっていない。Is_正規表現マッチ正規表現マッチ結果型 を利用して使う。
      ただし、利用可能な正規表現自体は相当増えている。

      詳しく知りたい人や、正規表現の熟練者は 鬼車の正規表現 参照のこと。
      原則的に、PerlやRubyの正規表現と同等である。
  • v2.2.0.8 ⇒ v2.2.1.0

    • 正規表現による文字列判定が可能となった。
      これにより、事前に決め打ちできないメッセージをあいまいなまま取り扱うことが出来るようになった。
      また、部分的にマッチした文字列を抽出することも格段にしやすくなった。

      以下のように利用する。
        例①:
            if (Is_正規表現マッチ(元メッセージ, "米を.+?ほど\\s売")) {
                デバッグ出力 << 元メッセージ << endl;
            }

        例②
            if (Is_正規表現マッチ(元メッセージ, "^他.+[米馬鉄砲]+を[0-9]+ほど\\s売" )) {
                デバッグ出力 << 元メッセージ << endl;
            }

        例③:詳細なマッチ結果を得る
        • 正規表現マッチ結果型 」 の変数を用意すると、 (下の例なら「マッチ結果」という変数名)
          詳細なマッチ情報が得られる。
        • マッチ結果[1]のように番号でアクセスする。中身は文字列。
        • 0番目がマッチした部分の文字列全体。
        • 1番目以降が( )でくくった部分にマッチした文字列が順次格納される。
        • 存在しない「番号」にアクセスした場合は、空の文字列相当である「""」が返ってくる。
                正規表現マッチ結果型 マッチ結果;
                if ( Is_正規表現マッチ(元メッセージ, "\\s(.+)を(\\d+?)ほど", &マッチ結果 ) ) {
                    デバッグ出力 << マッチ結果[0] << ":" << マッチ結果[1] << ":"  << マッチ結果[2] <<  endl;
                }
        
        この例であれば、元のメッセージが「「他でもない[改行]米を1100ほど[改行]売りたいのじゃ」というメッセージだった場合、
        • マッチ結果[0]は、「[改行]米を1100ほど」となる。
        • マッチ結果[1]は、1番目の( )の中身なので、「米」となり、
        • マッチ結果[2]は、2番目の( )の中身なので、「1100」となる。
  • v2.2.0.7 ⇒ v2.2.0.8

    • デバッグ出力

      について、2つの記法でModDebuggerに出力できるようにした。
      • C言語風
        printf(format, ...) と、完全に同一の記法となる。
        即ち、
        デバッグ出力("%d,%s\n", 3, 元メッセージ.c_str())
        のような記法。
        (※こちらの記法で注意すべきは、printfのフォーマット指定子は「string型」をサポートしていないので、
        string型については、c_str()すること。)
      • C++のcout風
        C++のcout << ...と、完全に同一の記法となる。
        cout で利用可能な記法やマニピュレータは原則全て利用可能である。即ち、
        デバッグ出力 << (int)メッセージ関連情報.第1人称【武将番号】 << "," << 元メッセージ << endl
        のような記法となる。
        (※こちらの記法で注意すべきは、cout 同様、数値型は(int)でキャストしておくこと。又、基本的には、endlを付けることになります。endl(もしくはデバッグ出力.flush()したタイミングで出力されます。)
      • これらのデバッグ情報は、ModDebugger.exeを起動しておくことで、見ることが可能である。
  • v2.2.0.5 ⇒ v2.2.0.7

    • int カスタム::On_メインゲーム開始()

      というイベントハンドラは利用価値が高いため、「カスタム」クラス側にもデフォルトで用意された。
    • void デバッグ出力(char *format, ...)

      を追加。ModDebuggerによって、Mod全体をデバッグしやすくする仕組み。
      formatは書式化文字列であるため、この「デバッグ出力」関数の使い方は、C言語のprintf関数と同じである。
  • v2.2.0.2 ⇒ v2.2.0.5

    • void カスタム::初期化()

      というイベントハンドラを追加。ゲーム起動時に実行される。
    • BOOL 関数::Set_効果音DLL追加(string 効果音DLL名)

      という関数を追加。 又
    • BOOL 効果音再生( int 効果音音源, string 効果音DLL名="" )

      というように、第2引数として効果音用DLLを指定することが出来るようにした。
      「Set_効果音DLL追加」で事前にDLLを追加しておけば、
      この第2引数に同じDLL名を指定することで、有効に機能する。
      (※第2引数のDLL名を指定しない場合の挙動は従来通りである)

      使い方:
      • カスタム::初期化()イベントハンドラ内にて、効果音用のDLLを呼び出す。
        void カスタム::初期化() {
            Set_効果音DLL追加("my_se1.dll"); // dllの名前はなんでも良い。
            Set_効果音DLL追加("my_se2.dll"); // 複数の効果音用のdllが登録可能。
        }
        
      • 実際にどこかで鳴らす。
        効果音再生( 3, "my_se1.dll"); // my_se1.dll内にある、 「3」というリソース名が付いたWAV音を鳴らす。
        効果音再生(20, "my_se2.dll"); // my_se2.dll内にある、「20」というリソース名が付いたWAV音を鳴らす。
        効果音再生( 3, "my_se2.dll"); // my_se2.dll内にある、 「3」というリソース名が付いたWAV音を鳴らす。
        
      • 効果音用DLLの作り方①
        • フル効果音キットを導入しているならば、「n6pwav1.dll」を、
          導入していないならば、「n6pwav.dll」を適当な名前でコピー。
          ここでは「my_se1.dll」という名前にコピーしたと仮定する。
        • リソースハッカーなどを使って、my_se1.dllを開き編集する。
          リソースハッカーでリソースの名前を変更するのはわかりにくいと思うが、
          下図の1041(これは言語番号であるが…)を右クリックして、リソースの名前を変更すれば良い。

          適当に操作していれば、そのうちリソース追加の方法や置き換え方法もわかるだろう。
      • 効果音用DLLの作り方②

        他、新規にDLLのリソースパックを作る方法は「複数の効果音・画像を1つのDLLに」にて詳細に解説している。

    v2.2.0.2 ⇒ v2.2.0.4

    • int カスタム::On_カスタム条件(string 条件名, カスタム条件パラメタ型パラメタ);
      について、条件を変更しない時には、-1を返すように変更した。
  • v2.1.0.2 ⇒ v2.2.0.2

    • On_相場変更直前()

      という駆動イベントハンドラを追加。

      これは相場が変更されるタイミング、
      即ち、季節と季節の切り替わり目、「相場が変更される直前」に 呼び出されることとなる。
      このイベントハンドラの中では以下の4つの関数を用いて相場を強制指定することが可能である。
      • Set_米相場(int 米相場);
      • Set_鉄砲相場(int 鉄砲相場);
      • Set_馬相場(int 馬相場);
      • Set_兵相場(int 兵相場);
      それ以外にも、このイベントハンドラはプレイ全てを通して、季節の頭に必ず1回だけ安定して実行される、
      という、わかりやすい駆動性質を持つため、重宝するだろう。(セーブ・ロードで実行が重複したりしない)
    • On_残りターン変化《戦争画面》(int 残りターン数)

      という駆動イベントハンドラを追加。

      これはその名の通り、残りターン数(30から減ってゆくもの)ターンが変化する境界時に呼び出される。 残りターン数には、そのまま残りターン数の数値が渡ってくる。
  • v2.1.0.0 ⇒ v2.1.0.2

    • 武将情報系に、武将年齢を得るための関数として、

      int Get_武将年齢(int 武将番号【配列用】)

      を追加。

    • Is_プレイヤ武将、Isプレイヤ軍団と類似の関数として、

      Is_プレイヤ担当大名( WORD 大名番号【配列用】 )

      を追加。

    • 基礎/カスタム駆動イベントハンドラとして、

      int カスタム::On_カスタム条件(string 条件名, カスタム条件パラメタ型 パラメタ)

      を追加。
      この関数は、TSMod等で定めている条件に対して、別の条件をORで加えたり、ANDで加えたりするものである。
      詳細は、リファレンスにて。

    v2.0.0.5 ⇒ v2.1.0.0

    • 関数という名前空間

      「○○情報型系」の、通常のAPIは全て「関数」という名前空間に収まった。
      それに伴い、基礎駆動関数.hにて、「using namespace 関数」されている。

      これにより、 「基本駆動関数」や「カスタム駆動関数」の中では、
      「関数::」というのは、付けても付けなくても良くなった。
      又、関数::と入力することで、インテリセンスが働き、存在するAPIを一覧しやすくなった。
    • 同盟系のAPI

      が加わっている。今のところは大名情報型 のファイルの中に入っている。
    • 音楽再生系のAPI

      が加わっている。
    • Get_武将番号【配列用】(武将姓名)

      というAPIが加わった。
    • 戦場情報型のAPI

      が加わった。
      現在野戦か、攻城戦か、攻城戦ならば城番号は何番か、などが得られるようになった。
    • その他

      いくつかの不適切な変数名・関数名が修正されている。

      例:
      • 効果音素材::突 ⇒ 効果音素材::突撃
      • GET_軍団役職 ⇒ Get_軍団役職
      • 城情報型::所属大名【大名番号】 ⇒ 城情報型::所属軍団【軍団番号】