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

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

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


  • 一般的用途

    • 特定のシナリオで与えられているデータの初期値を変更したい場合に利用する。
      用途が、「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;
                    }
                }
    
            }
        }
    }
    


  • 例③

    シナリオ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;
                        }
                    }
                }
            }
        }
    }