AND条件::戦争::退却可否

int カスタム::On_カスタム条件(string 条件名, カスタム条件パラメタ型 パラメタ) {
  if ( 条件名 == "AND条件::戦争::退却可否" ) {
  }

  // 変更しない場合-1
  return -1;
}
  • 引数の補足

    • パラメタ.整数1:

      退却を試みた武将番号
  • タイミング

    • このカスタム条件は、とある武将が退却を試みた際、その成否の判定時に呼び出される。

  • 一般的用途

    • このメソッドでは、「退却可能」な武将を、「特定条件下では退却不可能」な状態に変えたい場合に利用する。
      一方で、「退却不可能」な状態を「退却可能」には出来ないで注意。
      天翔記のデフォルトの仕様において、退却不可能な状態とは、「退却場所たる自勢力の城が1つも存在しない」状態だからである。
  • 例①

    int カスタム::On_カスタム条件(string 条件名, カスタム条件パラメタ型 パラメタ) {
    
      if ( 条件名=="AND条件::戦争::退却可否" ) {
    
        // いつも退却できない。
        return false;
      }
    
      // それ以外は条件を変えない。
      return -1;
    }
    
    しかし、元来退却が出来ない時とは、「退却出来る城がない」時だけですから、
    上記のままでは、退却できない理由が可笑しくなります。

    一般的には、次のような「退却出来ない条件」と「退却出来ない理由へのメッセージ置換」のセットを作成することとなるでしょう。
  • 例②

    int 退却できない理由=0;
    enum { 城内で退却できない=1, 野戦中央の川で退却できない=2 };
    
    string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) {
    
      // 戻れる城が無いのが原因というのを別原因にメッセ―を変える。
      if ( Is_文字列マッチ(元メッセージ, "もはやどこにも\x0A戻れる城がない") ) {
        int iBushouID = メッセージ関連情報.第1人称【武将番号】-1;
    
        if ( 0 <= iBushouID && iBushouID < 最大数::武将情報::配列数 ) {
          if ( 退却できない理由==城内で退却できない ) {
            int iCastleID = Get_攻城戦中の城番号()-1;
            if ( 0 <= iCastleID && iCastleID < 最大数::城情報::配列数 ) {
              退却できない理由 = 0; // 理由を使ったので理由リセット。
              return "まずは\x0A"+Get_城名(iCastleID) + Get_城称(iCastleID)+"の外へ\x0A出るのじゃ";
            }
          } else if ( 退却できない理由==野戦中央の川で退却できない ) {
            退却できない理由 = 0; // 理由を使ったので理由リセット。
            return "ここは戦場のど真ん中\x0Aしかも川中ぞ\x0Aまずは移動じゃ!";
          }
        }
      }
    
      // 変更しない場合""
      return "";
    }
    
    
    int カスタム::On_カスタム条件(string 条件名, カスタム条件パラメタ型 パラメタ) {
    
        /*
         * 城内に居たら退却できない。
         * 野戦で画面中央で「川」の中に居たら退却できない。
         */
    
        if ( 条件名=="AND条件::戦争::退却可否" ) {
    
            // 退却を試みた、武将番号が入る。
            int iBushouID = パラメタ.整数1 - 1;
    
            if ( 0 <= iBushouID && iBushouID < 最大数::武将情報::配列数 ) {
                // 攻城戦の画面では一切退却できなくする。
                if ( Is_攻城戦中() ) {
    
                    退却できない理由 = 城内で退却できない;
                    return false;
    
                // 野戦の時は、画面のある程度中央で、川の中だと無理
                } else if ( Is_野戦中() ) {
                    ヘックス位置型 pos = Get_武将の野戦ヘックス位置(iBushouID);
                    int iHexRole = Get_野戦ヘックス役割(pos);
    
                    if ( iHexRole == 野戦ヘックス役割::川 ) {
                        ヘックス位置型 center( 野戦ヘックス::中心X, 野戦ヘックス::中心Y );
                        if ( Get_ヘックス間隔( pos, center ) <= 8 ) { // ほぼ画面の中央
    
                            退却できない理由 = 野戦中央の川で退却できない;
                            return false;
                        }
                    }
                }
            }
        }
    
        // 変更しない場合-1
        return -1;
    }