最終更新日 2024-09-25

HD.version.SDK ~武将->戦争->ヘックス位置~

武将->戦争->ヘックス位置

武将->戦争->ヘックス位置とは、
戦争中、画面に表示されているヘックス画面(野戦もしくは籠城戦)において、
武将が居るヘックス(升目)の「位置」もしくは、その位置の役割(山・橋・門等)を得るための
オブジェクトとなります。

ヘックスはゲーム中の機能でも下記のような升目になっていることがわかります。

使用例①

現在の画面に出陣している武将のヘックス位置を得る
int 前回表示した状況 = 0;
String^ 天翔記クラス::On_噴出メッセージ直前(String^ 元メッセージ, 噴出メッセージパラメタ型^ パラメタ) {

  if (戦争->Is_野戦中 || 戦争->Is_籠城戦中) {

    // 毎回表示されるとうっとおしいので、「ターン」「野戦か籠城戦か」の状況が変化したら、表示する。
    int 状況 = int(戦争->Is_野戦中) * 1000 + int(戦争->Is_籠城戦中) * 100 + 戦争->ターン->残りターン;
    if (前回表示した状況 != 状況) {
      前回表示した状況 = 状況;

      // 今表示中の武将達のヘックス位置を表示する。
      auto blist = 武将->戦争->出陣中_表示戦場_武将番号リスト;
      for each (int iBushouID in blist) {
        auto b = 武将->配列[iBushouID];
        auto h = b->戦争->ヘックス位置;
        デバッグ出力 << b->姓名 << ":" << endl;
        デバッグ出力 << "└ ヘックス位置:" << "(" << h->X << " , " << h->Y << ")" << endl;
      }
    }
  }
  return "";
}

使用例②

武将の位置をとるだけでは、あまり意味がありません。
通常は武将Aと武将Bのヘックス上での間隔などを得るために、
位置をとっているといえるでしょう。

表示中の戦場に上杉謙信と武田信玄が両方いるなら、2人の間隔を得る
String^ 天翔記クラス::On_噴出メッセージ直前(String^ 元メッセージ, 噴出メッセージパラメタ型^ パラメタ) {

  if (戦争->Is_野戦中 || 戦争->Is_籠城戦中) {

    auto blist = 武将->戦争->出陣中_表示戦場_武将番号リスト;

    int 上杉謙信_武将番号 = 武将->Find_武将番号(列挙::武将::列伝番号::長尾景虎);
    int 武田信玄_武将番号 = 武将->Find_武将番号(列挙::武将::列伝番号::武田晴信);

    // 2人とも今表示されている戦場に居るならば
    if ( blist->Contains(上杉謙信_武将番号) && blist->Contains(武田信玄_武将番号) ) {
      auto 謙信の位置 = 武将->配列[上杉謙信_武将番号]->戦争->ヘックス位置;
      auto 信玄の位置 = 武将->配列[武田信玄_武将番号]->戦争->ヘックス位置;
      auto vec = 謙信の位置 - 信玄の位置;

      // ヘックスマスとして勘定した場合の間隔(何マスで相手のところに到着するのか)
      デバッグ出力 << vec->間隔 << endl;

      // こちらは普通のベクトルとしての長さ
      デバッグ出力 << vec->長さ << endl;
    }
  }
  return "";
}

使用例③

武将の具体的な位置に対応する「ヘックスの役割(山・橋・門等)」も
同様の手段で得ることができます。

原始的な記述例
int 前回表示した状況 = 0;
String^ 天翔記クラス::On_噴出メッセージ直前(String^ 元メッセージ, 噴出メッセージパラメタ型^ パラメタ) {

  if (戦争->Is_野戦中 || 戦争->Is_籠城戦中) {

    // 毎回表示されるとうっとおしいので、「ターン」「野戦か籠城戦か」の状況が変化したら、表示する。
    int 状況 = int(戦争->Is_野戦中) * 1000 + int(戦争->Is_籠城戦中) * 100 + 戦争->ターン->残りターン;
    if (前回表示した状況 != 状況) {
      前回表示した状況 = 状況;

      // 今表示中の武将達のヘックス位置を表示する。
      auto blist = 武将->戦争->出陣中_表示戦場_武将番号リスト;
      for each (int iBushouID in blist) {
        auto b = 武将->配列[iBushouID];
        auto h = b->戦争->ヘックス位置;
        デバッグ出力 << b->姓名 << ":" << endl;
        デバッグ出力 << "└ ヘックス役割:" << h->役割 << endl;

        if (h->役割 == 列挙::戦争::ヘックス::野戦役割::川) {
          デバッグ出力 << b->姓名 << "は川の上に居ます" << endl;
        }
        else if (h->役割 == 列挙::戦争::ヘックス::野戦役割::道) {
          デバッグ出力 << b->姓名 << "は道の上に居ます" << endl;
        }
        else if (h->役割 == 列挙::戦争::ヘックス::籠城戦役割::城壁) {
          デバッグ出力 << b->姓名 << "は城壁の上に居ます" << endl;
        }
        else if (h->役割 == 列挙::戦争::ヘックス::籠城戦役割::櫓) {
          デバッグ出力 << b->姓名 << "は櫓の上に居ます" << endl;
        }
      }
    }
  }
  return "";
}

使用例④

その他、ヘックスの炎上情報や高さ情報なども得ることができます。

ヘックスの炎上状態やヘックスの高さ
String^ 天翔記クラス::On_噴出メッセージ直前(String^ 元メッセージ, 噴出メッセージパラメタ型^ パラメタ) {

  if (戦争->Is_野戦中 || 戦争->Is_籠城戦中) {

    auto blist = 武将->戦争->出陣中_表示戦場_武将番号リスト;

    for each (int iBushouID in blist) {
      auto b = 武将->配列[iBushouID];

      if (b->戦争->ヘックス位置->炎上 == 列挙::戦争::ヘックス::籠城戦炎上::炎上) {
        デバッグ出力 << b->姓名 << "のヘックスは炎上しています!" << endl;
      }
      デバッグ出力 << b->姓名 << "の居る場所の高さ:" << b->戦争->ヘックス位置->高さ << endl;
    }
  }
  return "";
}

その他

武将->戦争->ヘックス位置について、主な解説は以上となります。
詳しくは「戦争_ヘックス.h」や「戦争_ヘックス列挙.h」を参照してみてください。