void カスタム::On_シナリオデータ反映直後(int シナリオ番号)

void カスタム::On_シナリオデータ反映直後(int シナリオ番号) {
}

タイミング

  • 見た目的には特定のシナリオで大名選択画面になる前、
    シナリオ説明表示で「確認ボタン」を押した直後、「シナリオデータの各種の配置データを反映した直後」となります。

    PICTURE

一般的用途

  • 特定のシナリオで与えられているデータの初期値を変更したい場合に利用する。
    用途が、「On_シナリオ大名選択直前」と類似していますが、
  • このタイミングは「シナリオの本来の配置データ」をScenaroModで微修正するのに非常に適したタイミングだと言えます。

例①

各大名の軍団長の忠誠が0の状態からのスタート。
ゲーム開始直後付近は、独立・裏切りが跋扈する。

void カスタム::On_シナリオデータ反映直後(int シナリオ番号) {

    for (int iBushouID = 0; iBushouID < 最大数::武将情報::配列数; iBushouID++) {
        if (p武将戸籍情報[iBushouID].状態 == 状態::軍団長) {
            p武将情報[iBushouID].忠誠 = 0;
        }
    }
}

例②

シナリオ5で、明智光秀の軍団がまるまる大名として独立した状態とする

void カスタム::On_シナリオデータ反映直後(int シナリオ番号) {

    if (シナリオ番号 == 5) {
        // 明智光秀を探す
        int iBushouID = Get_武将番号【配列用】(顔番号::明智光秀);
        // 登場している
        if (0 <= iBushouID && iBushouID < 最大数::武将情報::配列数) {
            // 光秀は軍団長だ
            if (p武将戸籍情報[iBushouID].状態 == 状態::軍団長) {

                // 所属軍団
                int iGundanID = p武将情報[iBushouID].所属軍団【軍団番号】 - 1;

                // 該当の軍団長は、大名として独立する
                int iDaimyoID = Set_軍団独立(iGundanID);

                // 成否をチェック
                if (iDaimyoID != 0xFFFF) {
                    デバッグ出力 << "明智光秀は独立に成功した" << endl;
                }
            }

        }
    }
}

PICTURE

例③

シナリオ3~5で、織田家の配下から武将を見繕って、軍団を新設する。

void カスタム::On_シナリオデータ反映直後(int シナリオ番号) {

    if (3 <= シナリオ番号 && シナリオ番号 <= 5) {

        int iBushouID = Get_武将番号【配列用】(顔番号::織田信長);

        if (0 <= iBushouID && iBushouID < 最大数::武将情報::配列数) {
            if (p武将戸籍情報[iBushouID].状態 == 状態::大名) {
                // 信長の大名としての番号
                int pDaimyoID = p武将情報[iBushouID].所属大名【大名番号】 - 1;

                // 信長家で、軍団を新設したいが、可能なのか?
                // どのような「城」で、どのような「武将」が新たな軍団長となれるのか
                auto ret = Get_軍団新設候補情報(pDaimyoID);

                デバッグ出力 << "この大名が軍団を新設することは?" << (ret.Is新設可能 ? "可能" : "不可能") << endl;

                if (ret.Is新設可能) {

                    デバッグ出力 << "2~8で余っている軍団割当番号は? ";
                    for each(auto wn in ret.候補軍団割当番号リスト) {
                        デバッグ出力 << wn << " ";
                    }
                    デバッグ出力 << endl;

                    デバッグ出力 << "どの城に軍団を新設できますか?";
                    for each(auto cn in ret.候補城番号【配列用】リスト) {
                        デバッグ出力 << Get_城名(cn) + Get_城称(cn) << " ";
                    }
                    デバッグ出力 << endl;

                    デバッグ出力 << "誰を軍団に任命できますか?";
                    for each(auto bn in ret.候補武将番号【配列用】リスト) {
                        デバッグ出力 << Get_名字(bn) + Get_名前(bn) << " ";
                    }
                    デバッグ出力 << endl;

                    // 候補のうち、一番先頭の武将、先頭の城で、軍団を新設する
                    int iGundanID = Set_軍団新設(ret.候補武将番号【配列用】リスト[0], ret.候補城番号【配列用】リスト[0], ret);
                    if (iGundanID != 0xFFFF) {
                        デバッグ出力 << "軍団番号【配列用】" << iGundanID << "に軍団が新設された" << endl;
                    }
                    else {
                        デバッグ出力 << "軍団の新設には失敗した" << endl;
                    }
                }
            }
        }
    }
}

例④

シナリオ3で、真田幸隆が独立した状態でスタートする。

 void カスタム::On_シナリオデータ反映直後(int シナリオ番号) {

    if (シナリオ番号 == 3) {

        int 幸隆BushouID = Get_武将番号【配列用】(顔番号::真田幸隆);

        // 居る
        if (0 <= 幸隆BushouID && 幸隆BushouID < 最大数::武将情報::配列数) {

            // 現役
            if (p武将戸籍情報[幸隆BushouID].状態 == 状態::現役) {

                int 幸隆の所属大名DaimyoID = p武将情報[幸隆BushouID].所属大名【大名番号】 - 1;

                // 今、幸隆がいる大名家は、新軍団を作成できますか?
                auto 情報 = Get_軍団新設候補情報(幸隆の所属大名DaimyoID);

                if (情報.Is新設可能) {
                    // 軍団を新設する候補情報の、軍団長になりうる人物として、幸隆は含まれているのか?
                    auto biter = std::find(情報.候補武将番号【配列用】リスト.begin(), 情報.候補武将番号【配列用】リスト.end(), 幸隆BushouID);

                    // 軍団を新設する候補情報の、城情報リストの中に「戸石城」はあるか?
                    auto citer = std::find(情報.候補城番号【配列用】リスト.begin(), 情報.候補城番号【配列用】リスト.end(), 城::城配列番号::戸石城);

                    // 両方大丈夫
                    if (biter != 情報.候補武将番号【配列用】リスト.end() &&
                        citer != 情報.候補城番号【配列用】リスト.end()) {
                        int i幸隆の新設GundanID = Set_軍団新設(幸隆BushouID, 城::城配列番号::戸石城, 情報);

                        // 軍団化に成功している
                        if (i幸隆の新設GundanID != 0xFFFF) {

                            int i幸隆の新設DaimyoID = Set_軍団独立(i幸隆の新設GundanID);

                            if (i幸隆の新設DaimyoID != 0xFFFF) {
                                デバッグ出力 << "幸隆は大名化した" << endl;
                            }
                        }
                    }
                }
            }
        }
    }

}

例⑤

シナリオ3~5で、織田家の配下から武将を見繕って、軍団を新設し、
その軍団長は、信長から可能なかぎりありったけの城をもっていき、
そして独立して大名となる。

void カスタム::On_シナリオデータ反映直後(int シナリオ番号) {

    if (3 <= シナリオ番号 && シナリオ番号 <= 5) {

        int iBushouID = Get_武将番号【配列用】(顔番号::織田信長);

        if (0 <= iBushouID && iBushouID < 最大数::武将情報::配列数) {
            if (p武将戸籍情報[iBushouID].状態 == 状態::大名) {
                // 信長の大名としての番号
                int pDaimyoID = p武将情報[iBushouID].所属大名【大名番号】 - 1;

                // 信長家で、軍団を新設したいが、可能なのか?
                // どのような「城」で、どのような「武将」が新たな軍団長となれるのか
                auto ret = Get_軍団新設候補情報(pDaimyoID);

                デバッグ出力 << "この大名が軍団を新設することは?" << (ret.Is新設可能 ? "可能" : "不可能") << endl;

                if (ret.Is新設可能) {

                    デバッグ出力 << "2~8で余っている軍団割当番号は? ";
                    for each(auto wn in ret.候補軍団割当番号リスト) {
                        デバッグ出力 << wn << " ";
                    }
                    デバッグ出力 << endl;

                    デバッグ出力 << "どの城に軍団を新設できますか?";
                    for each(auto cn in ret.候補城番号【配列用】リスト) {
                        デバッグ出力 << Get_城名(cn) + Get_城称(cn) << " ";
                    }
                    デバッグ出力 << endl;

                    デバッグ出力 << "誰を軍団に任命できますか?";
                    for each(auto bn in ret.候補武将番号【配列用】リスト) {
                        デバッグ出力 << Get_名字(bn) + Get_名前(bn) << " ";
                    }
                    デバッグ出力 << endl;

                    // 候補のうち、一番先頭の武将、先頭の城で、軍団を新設する
                    int iGundanID = Set_軍団新設(ret.候補武将番号【配列用】リスト[0], ret.候補城番号【配列用】リスト[0], ret);
                    if (iGundanID != 0xFFFF) {
                        デバッグ出力 << "軍団番号【配列用】" << iGundanID << "に軍団が新設された" << endl;
                    }
                    else {
                        デバッグ出力 << "軍団の新設には失敗した" << endl;
                    }

                    int list_castle_cnt = ret.候補城番号【配列用】リスト.size();

                    // 最初の城(vix==0)は軍団長独立に使ったので残りの候補の城を全て奪う、
                    for (int vix = 1; vix < list_castle_cnt; vix++) {
                        Set_非本拠城所属軍団(ret.候補城番号【配列用】リスト[vix], iGundanID);
                    }

                    // 奪うだけ奪ってから独立
                    int iDaimyoID = Set_軍団独立(iGundanID);
                    if (iDaimyoID != 0xFFFF) {
                        デバッグ出力 << "独立し、大名化に成功した" << endl;
                    }
                    else {
                        デバッグ出力 << "独立し、大名化に失敗した" << endl;
                    }
                }
            }
        }
    }
}

PICTURE