ScenarioModVer2 更新履歴 v2.6.0.0~v2.6.5.0

v2.6.2.8 ⇒ v2.6.2.9

  • 城と経路グラフ関連の関数追加

    • グラフ(経路グラフ)とは

      通常「グラフ」という言葉を聞くと、「棒グラフ」や「円グラフ」を思い浮かべると思いますが、
      ゲーム制作において、「グラフ」とは、一般的に、
      経路グラフのことを示します。
      (道のような経路に限らず、状態遷移が矢印で繋がったような、いわゆる「点項目(ノード)」が「矢印線(エッジ)」で繋がっているものの総称です。)

      今回ScenarioModに追加された、関数は、この経路グラフ関連となります。


    • とある城を中心に、道(経路)が繋がっている隣接城の一覧を得る

      番号リスト型 clist = Get_経路連結の隣接城番号リスト【配列用】( int iCastleID );

      番号リスト型 clist = Get_経路連結の隣接城番号リスト【配列用】( 城配列番号::躑躅ヶ崎館 ); // 躑躅ヶ崎館の周囲に隣接していて、道で繋がっている城一覧
      for each ( int iCastleID in clist ) {
          デバッグ出力 << Get_城名(iCastleID) << ",";
      }
      デバッグ出力 << endl;
      
    • とある城A→城Bまで、理想的な経路を探索し、その経路上の城一覧を得る。

      Set_城経路グラフ初期化();
      番号リスト型 clist = Get_経路連結の隣接城番号リスト【配列用】( int iCastleID );

      Set_城経路グラフ初期化(); // 経路グラフを現在実行中の城位置に合わせて再構築しなおす。MapDataObgkModなど、ゲーム中に城の位置を変えているものへの対処
      
      番号リスト型 clist = Get_経路上の城番号リスト【配列用】( 城配列番号::躑躅ヶ崎館, 城配列番号::月山富田城 );  // 躑躅ヶ崎館 から 月山富田城まで
      
      for each ( int iCastleID in clist ) {
          デバッグ出力 << Get_城名(iCastleID) << ",";
      }
      デバッグ出力 << endl;
      
    • 経路探索の対象にしたくない城の設定

      先述の経路探索をする前に、「探索対象にしたくない城」を複数削除することができます。

      Set_城経路グラフから城削除( int iCastleID );

      Set_城経路グラフ初期化(); // 経路グラフを現在実行中の城位置に合わせて再構築しなおす。MapDataObgkModなど、ゲーム中に城の位置を変えているものへの対処
      
      Set_城経路グラフから城削除( 城配列番号::尾高城 );  // 尾高城は探索対象にしない。
      Set_城経路グラフから城削除( 城配列番号::上原城 ); // 上原城は探索対象にしない。
      
      番号リスト型 clist = Get_経路上の城番号リスト【配列用】( 城配列番号::躑躅ヶ崎館, 城配列番号::月山富田城 );  // 躑躅ヶ崎館 から 月山富田城まで
      for each ( int iCastleID in clist ) {
          デバッグ出力 << Get_城名(iCastleID) << ",";
      }
      デバッグ出力 << endl;
      

      forループなどで、自勢力以外の城を全て 「Set_城経路グラフから城削除」で削除 してしまえば、
      経路探索は、「自勢力の城を使ったもの」となるわけです。

      Set_城経路グラフ初期化(); // 経路グラフを現在実行中の城位置に合わせて再構築しなおす。MapDataObgkModなど、ゲーム中に城の位置を変えているものへの対処
      
      Set_城経路グラフから城削除( 城配列番号::門司城 );   // 九州の、門司城を削除
      Set_城経路グラフから城削除( 城配列番号::松葉城 );  // 四国の松葉城を削除
      
      番号リスト型 clist = Get_経路上の城番号リスト【配列用】( 城配列番号::室町御所, 城配列番号::種子島城 );  // 室町から種子島
      if ( clist.size() < 2 ) {
           // 経路が求まったのであれば、少なくとも「開始城」と「終了城」がリストに入っている。
           // 2つ未満ということは経路が求まらなかったということ。
          デバッグ出力 << "経路が求まらない" << endl;
      } else {
          for each ( int iCastleID in clist ) {
            デバッグ出力 << Get_城名(iCastleID) << ",";
          }
          デバッグ出力 << endl;
      }
      

v2.6.2.7 ⇒ v2.6.2.8

  • Get_武将混乱状態(int iBushouID);
  • Set_武将混乱状態(int iBushouID, int 混乱状態);

    の関数において、「列挙::戦争::混乱状態::挑発混乱」のenum値が使えるようになった。

    int iBushouID = Get_武将番号【配列用】(顔番号::武田晴信); // 武田晴信
    if ( 0 <= iBushouID && iBushouID < 最大数::武将情報::配列数 ) {
        if ( Get_武将混乱状態(iBushouID) == 混乱状態::挑発混乱 ) {
            デバッグ出力 << "晴信は挑発され頭に血がのぼっている" << endl;
        }
    }
    
    int iBushouID = Get_武将番号【配列用】(顔番号::武田晴信); // 武田晴信
    if ( 0 <= iBushouID && iBushouID < 最大数::武将情報::配列数 ) {
        Set_武将混乱状態(iBushouID, 混乱状態::挑発混乱); // 挑発状態を設定
    }
    

v2.6.2.6 ⇒ v2.6.2.7

以下の4つの関数は削除された。

  • Is_武将混乱(int iBushouID);
  • Is_武将大混乱(int iBushouID);
  • Set_武将混乱(int iBushouID);
  • Set_武将大混乱(int iBushouID);

    替えて、より用途が広い以下の2つの関数が追加された。

  • Get_武将混乱状態(int iBushouID);
  • Set_武将混乱状態(int iBushouID, int 混乱状態);
    int iBushouID = Get_武将番号【配列用】(顔番号::武田晴信); // 武田晴信
    if ( 0 <= iBushouID && iBushouID < 最大数::武将情報::配列数 ) {
        if ( Get_武将混乱状態(iBushouID) == 混乱状態::無し ) {
             デバッグ出力 << "混乱していない" << endl;
        }
        else if ( Get_武将混乱状態(iBushouID) == 混乱状態::混乱 ) {
             デバッグ出力 << "普通の混乱" << endl;
        }
        else if ( Get_武将混乱状態(iBushouID) == 混乱状態::大混乱 ) {
             デバッグ出力 << "大混乱" << endl;
        }
    
    
        if ( Get_武将混乱状態(iBushouID) >= 混乱状態::混乱 ) { // 混乱以上の状態
             デバッグ出力 << "混乱もしくは大混乱" << endl;
        }
    }
    
    int iBushouID = Get_武将番号【配列用】(顔番号::武田晴信); // 武田晴信
    if ( 0 <= iBushouID && iBushouID < 最大数::武将情報::配列数 ) {
        Set_武将混乱状態(iBushouID, 混乱状態::無し); // 混乱状態を解除
    
        // もしくは…
        Set_武将混乱状態(iBushouID, 混乱状態::混乱); // 混乱状態を設定(行動済も立つ)
    
        // もしくは…
        Set_武将混乱状態(iBushouID, 混乱状態::大混乱); // 大混乱状態を設定(行動済も立つ)
    }
    

v2.6.2.5 ⇒ v2.6.2.6

戦場において、特定のユニットを混乱・大混乱させる関数が追加された。

  • Set_武将混乱(int iBushouID);
  • Set_武将大混乱(int iBushouID);

    (※ユニットの描画更新を伴う、効果音の再生は伴わない) 戦争中ならば、概ねあらゆるタイミングで利用可能である。

    int iBushouID = Get_武将番号【配列用】(顔番号::武田晴信); // 武田晴信
    if ( 0 <= iBushouID && iBushouID < 最大数::武将情報::配列数 ) {
        Set_大混乱(iBushouID);
        効果音再生(効果音音源::挑発・混乱);
    }
    

v2.6.2.4 ⇒ v2.6.2.5

噴出ダイアログの種類が1つ追加となった

  • 噴出ダイアログ《戦場・中央》表示(int iBushouID, string メッセージ)

    この噴き出しダイアログは、天翔記の戦場にてよくみかける噴き出しと同一のものであり、
    画面中央に1つ出るモーダルタイプである。

    int iBushouID = Get_武将番号【配列用】(顔番号::武田晴信); // 武田晴信
    if ( 0 <= iBushouID && iBushouID < 最大数::武将情報::配列数 ) {
        噴出ダイアログ《戦場・中央》表示(iBushouID, "晴信。推して参る!!");
    }
    

v2.6.2.3 ⇒ v2.6.2.4

攻戦戦時、特定の場所が炎上しているかどうか、判定可能な関数が追加された。

考え方は、既存の関数 Get_攻城戦ヘックス役割Get_野戦ヘックス役割と同じである。

  • Get_攻城戦ヘックス炎上(double x, double y)
  • Get_攻城戦ヘックス炎上(ヘックス位置型 p)
    if ( Is_攻城戦中() ) {
        int iBushouID = Get_武将番号【配列用】(顔番号::武田晴信); // 武田信玄の武将番号【配列用】
        ヘックス位置型 p = Get_武将の攻城戦ヘックス位置(iBushouID); // 武将番号【配列用】→武将のヘックス上の位置を得る
        int i炎上状態左   = Get_攻城戦ヘックス炎上(p.X-1  , p.Y  );
        int i炎上状態右   = Get_攻城戦ヘックス炎上(p.X+1  , p.Y  );
        int i炎上状態     = Get_攻城戦ヘックス炎上(p);
        int i炎上状態右下 = Get_攻城戦ヘックス炎上(p.X+0.5, p.Y+1);
        int i炎上状態左下 = Get_攻城戦ヘックス炎上(p.X-0.5, p.Y+1);
    
        if (i炎上状態 == 攻城戦ヘックス炎上::炎上) {
          デバッグ出力 << "武田信玄ユニットの位置は炎上している" << endl;
        }
    
        デバッグ出力 << "炎上左:" << i炎上状態左 << endl;
        デバッグ出力 << "炎上右:" << i炎上状態右 << endl;
        デバッグ出力 << "炎上右下:" << i炎上状態右下 << endl;
        デバッグ出力 << "炎上左下:" << i炎上状態左下 << endl;
    }
    
    

v2.6.2.3 ⇒ v2.6.2.3

天翔記のゲーム描画域の解像度を取得するための関数が追加された。

ゲーム内に存在する(1024x768)など、表面的な解像度ではない。
実際の天翔記はそのような解像度ではないためである。

あくまでも本当のゲーム画面の描画領域の解像度が取得される。

  • 解像度型 Get_天翔記解像度()
    void カスタム::On_トップメニュー表示時() {
      解像度型 解像度 = Get_天翔記解像度();
      デバッグ出力 << 解像度.X << "," << 解像度.Y << endl;
    }
    

v2.6.2.2 ⇒ v2.6.2.3

噴出ダイアログ系関数のいくつかのバグが修正された。
又、噴出ダイアログのダメなパターンを提示する。

  • 描画の乱れの修正

    「噴出ダイアログ《通常・左上》」「噴出ダイアログ《通常・右下》」系関数において、
    会話終了時に、背景描画が乱れていた問題を解消した。

  • 制限の追加

    「噴出ダイアログ《通常・左上》更新() 「噴出ダイアログ《通常・右下》更新() 関数において、
    「開始関数」と「更新関数」で「違う武将番号」を指定することは出来なくなった。
    (例えば、会話の開始時に「信長」と指定していたのに、会話の更新時に「秀吉」とすることはできなくなった。
    それは「更新」ではなく、新規会話チャンネルの開始であり、整合性が取れないため)

    又、この噴出メッセージによる会話には一種の制限がある。

  • 制限の内容

    “話者Aと話者Bが話している”時に、話者Cが乱入してこないこと。 という制限が付く。
    • OKなパターン。

      信長と勝家は話していた。
      2人の噴出を閉じ、即座に信長の噴出を再登場させたあと、秀吉を登場させている。

      信長:開始 「勝家よ」
      勝家:開始 「はい」
      信長:更新 「腹が減った」
      勝家:更新 「私も」
      信長:終了
      勝家:終了
      信長:開始 「外へ出かけるか」
      秀吉:開始 「私もいきまする」
      信長:終了
      秀吉:終了

    • NGなパターン。

      信長と勝家は話していた。

      2人の噴出を閉じず、信長の噴出を開いたまま、秀吉が登場している。
      これをすると、噴出の背景描画が乱れるときがある。

      信長:開始 「勝家よ」
      勝家:開始 「はい」
      信長:更新 「腹が減った」
      勝家:更新 「私も」
      信長:更新 「外へ出かけるか」
      勝家:終了
      秀吉:開始 「私もいきまする」
      信長:終了
      秀吉:終了

v2.6.2.1 ⇒ v2.6.2.1

TSMod更新により、以下の2つのカスタム条件が利用可能となった。

以下のカスタム条件の名前が変更となった。

v2.6.2.0 ⇒ v2.6.2.1

戦争時、武将ユニットの兵数の再描画を行う関数が追加された。

  • 武将ユニット兵数描画更新《戦争画面》(int iBushouID);
    void カスタム::On_残りターン変更《戦争画面》(int 残りターン数) {
      if ( 残りターン数 < 29 ) {
    
        番号リスト型 lstBushouID = Get_出陣中の武将番号リスト【配列用】《表示中マップ》();
    
        for each ( int iBushouID in lstBushouID ) {
          int 兵 = p武将情報[iBushouID].兵数;
          if (兵>5) {
            p武将情報[iBushouID].兵数 -= 5;
            武将ユニット兵数描画更新《戦争画面》(iBushouID);
          }
        }
      }
    }
    

v2.6.1.9 ⇒ v2.6.2.0

天翔記起動後、比較的最初の方で実行される2つのイベントハンドラが追加された。

ダイアログ表示に「情報フレームダイアログ表示」という新しいタイプのダイアログが1件追加された。

void カスタム::On_残りターン変更《戦争画面》(int 残りターン数) {
    if ( 残りターン数 < 30 ) {
        情報フレームダイアログ表示("あいう");
    }
}

PICTURE PICTURE

v2.6.1.7 ⇒ v2.6.1.9

武将兵数がダメージを受けた際に呼び出されるイベントハンドラが追加された。

戦争中の「武将の移動力の残量」の取得・設定をする関数が追加された。

天翔記では、「移動残量(機動力)」という概念があり、移動や行動をするとこれが減る。
(目一杯移動すると0になるが、少しの移動や移動しない時などは移動残量が蓄積される)
又、天翔記の元来の仕様では移動残量15がMAXであるが、それを超えて設定することをも可能とする。

  • Set_武将移動力残量(int 武将番号【配列用】, int 移動力残量);
  • Get_武将移動力残量(int 武将番号【配列用】;
void カスタム::On_残りターン変更《戦争画面》(int 残りターン数) {

  // 現在出陣中の武将
  番号リスト型 blist = Get_出陣中の武将番号リスト【配列用】《表示中マップ》();

  // 現在の移動力残量に+5する。
  for each ( int iBushouID in blist ) {
    int current = Get_武将移動力残量(iBushouID);
    Set_武将移動力残量(iBushouID, current + 5 );
  }

}

v2.6.1.6 ⇒ v2.6.1.7

プレイヤが何かのコマンドを実行する際に欠かせない、以下の強力な2つのイベントハンドラが追加された。

v2.6.1.4 ⇒ v2.6.1.6

以下の2つのイベントハンドラが追加された。

v2.6.1.3 ⇒ v2.6.1.4

v2.6.0.1 ⇒ v2.6.1.3

  • On_攻撃方法決定時《戦争画面》(int 主体武将番号, int 客体武将番号, int 攻撃方法番号)

    というイベントハンドラが追加された。
    詳細は、「On_攻撃方法決定時《戦争画面》

v2.6.0.0 ⇒ v2.6.0.1

  • 天翔記のアプリケーションとしてのメニュー項目追加機能

    天翔記の「アプリケーション」としてのメニューに独自のメニューアイテムを追加できるようになった。
    この意義とは、「プログラムで組まれたタイミング」ではなく、「手動」で何かを実行したい場合に便利な機能となる。

    まずは、以下のように、On_起動時() あたりでメニューを追加する。
    どのイベントハンドラでも、メニューの追加は出来る。

    static int menu1番号 = -1;
    static int menu2番号 = -1;
    void カスタム::On_起動時() {
      menu1番号 = アプリケーション::メニューアイテム追加("熟練度MAX");
      menu2番号 = アプリケーション::メニューアイテム追加("ノートパッド");
      アプリケーション::メニューアイテム追加("---"); // セパレータ
    }
    
    

    このように、「アプリケーション::メニューアイテム追加」関数で、メニューが追加できる。
    「返り値」は該当メニューに割り当てた「番号」とでもいえるもの。
    後で、必要となる番号ならば、この値をソースのように保存しておく。
    ソースにあるように、横線(セパレータ)を入れることも可能である。

    PICTURE

  • On_アプリケーションメニュー選択時(int メニュー番号) が追加された。

    このイベントハンドラは、「アプリケーションとしてのメニューが選択される度」に呼ばれる。
    「メニュー番号」は該当のメニューに割り当てられている「番号」が渡ってくる。
    番号が割り当てられていない場合、通常「0」が渡ってくる。

    void カスタム::On_アプリケーションメニュー選択時(int メニュー番号) {
        デバッグ出力 << メニュー番号 << endl;
    
        if (メニュー番号 == menu1番号) {
            // 532の武将の熟練度をMAXに
            for (int i=0; i<最大数::武将情報::配列数 ;i++) {
                p武将情報[i].政治熟練値=2000; p武将情報[i].戦闘熟練値=2000; p武将情報[i].智謀熟練値=2000; }
        }
        if (メニュー番号==menu2番号){// 外部アプリケーションを実行 (win32apiで、ノートパッドを実行)
            ShellExecute(NULL, NULL, "notepad.exe", NULL, NULL, SW_SHOWNORMAL);
        }
    }
    

v2.5.1.0 ⇒ v2.6.0.0

  • C++/CLIとなった

    ScenarioModの言語が、C++ではなく、C++/CLIとなった。

    .NET FrameWorkのAPIに簡単にアクセス可能となる。
    又、C#やVisualBasic.NETといったような言語との関数やオブジェクトのやり取りが、非常に簡単となる。