最終更新日 2024-09-25

void カスタム::On_被ダメージ時(int 武将番号, int ダメージ兵数)

void カスタム::On_被ダメージ時(int 武将番号, int ダメージ兵数) {
}

引数の補足

タイミング

一般的用途

例①

void カスタム::On_被ダメージ時(int 武将番号, int ダメージ兵数) {
    // デバッグのみ。
  int iBushouID = 武将番号-1;
  if ( 0 <= iBushouID && iBushouID < 最大数::武将情報::配列数 ) {
    デバッグ出力 << Get_名前(iBushouID) << endl;
    デバッグ出力 << ダメージ兵数 << endl;
  }
}

例②

void カスタム::On_被ダメージ時(int 武将番号, int ダメージ兵数) {
    // 誰も兵数0にならない。
    int iDamagedBushouID = 武将番号-1;
    if ( 0 <= iDamagedBushouID && iDamagedBushouID < 最大数::武将情報::配列数 ) {
        if ( p武将情報[iDamagedBushouID].兵数 < 1 ) {
            p武将情報[iDamagedBushouID].兵数 = 1;
        }
    }
}

例③

static int iAttackBushouID = -1;
static int iAttackMethodID = -1;

void カスタム::On_攻撃方法決定時《戦争画面》(int 主体武将番号, int 客体武将番号, 攻撃方法決定時パラメタ型 パラメタ) {
    // 鉄砲攻撃を通じなくする。よって、攻撃者や攻撃方法をここで控えておく

    int iBushouID = 主体武将番号-1;
    int iTargetID = 客体武将番号-1;

    iAttackBushouID = iBushouID; // グローバル用にコピー
    iAttackMethodID = パラメタ.攻撃方法番号;

    // 武将番号範囲チェック
    if ( (0 <= iBushouID && iBushouID < 最大数::武将情報::配列数) &&
        (0 <= iTargetID && iTargetID < 最大数::武将情報::配列数) ) {

            if ( iAttackMethodID == 攻撃方法::鉄砲 ) {
                デバッグ出力("⇒鉄砲" );
            }
    }
}

void カスタム::On_被ダメージ時(int 武将番号, int ダメージ兵数) {

    // 控えておいた直前の情報が「鉄砲攻撃」ならその攻撃方法によるダメージを修復することでダメージをなかったことにする。
    int iDamagedBushouID = 武将番号-1;
    if ( 0 <= iDamagedBushouID && iDamagedBushouID < 最大数::武将情報::配列数 ) {
        if ( iAttackMethodID == 攻撃方法::鉄砲 ) {
            デバッグ出力 << "鉄砲攻撃は効かない" << endl;
            デバッグ出力 << "攻撃者:" << Get_名前(iAttackBushouID) << endl;
            p武将情報[iDamagedBushouID].兵数 += ダメージ兵数; // 受けたダメージ分だけ元へと戻す。
        }

    }

    // 攻撃者や攻撃方法は必ずクリアしておく。攻撃者が居ない場合に、前の値のまま処理してしまうのを防止するため。
    iAttackBushouID = -1;
    iAttackMethodID = -1;
}

void カスタム::On_戦争終了() {
    // 念のためのクリア。
    iAttackBushouID = -1;
    iAttackMethodID = -1;
}

例④

例③同じですが、鉄砲の威力を鉄砲伝来からの年月で変化させる例となります。

static int iAttackBushouID = -1;
static int iAttackMethodID = -1;

void カスタム::On_攻撃方法決定時《戦争画面》(int 主体武将番号, int 客体武将番号, 攻撃方法決定時パラメタ型 パラメタ) {
    // 例③と同じソースを記述のこと
}

// 1543~1603年の間で、その時の西暦をもとに、0.4~1.8の値に変換したものを返す。
double Get鉄砲強さ係数() {
    const int MinPowerYear = 1543; // 伝来の年
    const int MaxPowerYear = 1603; // 1603年で鉄砲は成熟を見ると仮定。

    const double minPowerCoef = 0.4; // 最初は0.4倍
    const double maxPowerCoef = 1.8; // 最後は1.8倍

    const double x2 = MaxPowerYear;
    const double x1 = MinPowerYear;
    const double y2 = maxPowerCoef;
    const double y1 = minPowerCoef;

    // 入門ということで一次方程式  y=ax+b
    // b = y-ax

    // ゼロ除算防止。maxとminに同じ年(もしくは同じ力)が設定されている!!
    if (x2 == x1 || y2 == y1 ) { return 1; }

    double a = (y2 - y1) / (x2 - x1); // 傾き
    double b = (y1 - a*x1);           // 切片
    デバッグ出力 << a << endl;
    デバッグ出力 << b << endl;

    // 今求めたy = ax+bの線上における、x=Get_西暦()の時の Yの値が 鉄砲の強さの係数となる。(中学生の数学。一次方程式)
    double x = Get_西暦();
    double y = a*x + b; // ax+bという式。xが西暦の時、yの鉄砲の力を求めよ

    // 実際にはyが0.4~1.8の間の線分(CLAMP処理)
    if (y < minPowerCoef ) { y = minPowerCoef; }
    else if (y > maxPowerCoef) { y = maxPowerCoef; }

    return y;
}


void カスタム::On_被ダメージ時(int 武将番号, int ダメージ兵数) {

    // 控えておいた直前の情報が「鉄砲攻撃」なら、その瞬間の「西暦」に応じて鉄砲のダメージの強さを変更する
    int iDamagedBushouID = 武将番号-1;
    if ( 0 <= iDamagedBushouID && iDamagedBushouID < 最大数::武将情報::配列数 ) {
        if ( iAttackMethodID == 攻撃方法::鉄砲 ) {

            double dダメージ = double(ダメージ兵数) * Get鉄砲強さ係数();
            int 新ダメージ = (int)round(dダメージ);

            // 負のオーバーフロー等を起こさないように一旦int
            int 兵数 = p武将情報[iDamagedBushouID].兵数;
            兵数 += ダメージ兵数; // 天翔記のダメージは無しにして…
            兵数 -= 新ダメージ;   // 新ダメージの方を採用
            if (兵数 < 0) {
                兵数 = 0;
            }

            // 計算し終わったので、武将の兵数として代入
            p武将情報[iDamagedBushouID].兵数 = 兵数;
        }

    }

    // 攻撃者や攻撃方法は必ずクリアしておく。攻撃者が居ない場合に、前の値のまま処理してしまうのを防止するため。
    iAttackBushouID = -1;
    iAttackMethodID = -1;
}


void カスタム::On_戦争終了() {
    // 例③と同じソースを記述のこと
}