最終更新日 2024-09-25

戦争 - 野戦と攻城戦

戦争を大きなくくりで判定したいことがあります。
戦争中なのか、野戦中なのか、攻城戦中なのか、などです。

最も大きなくくりでの「戦争中」とは

void カスタム::On_戦争開始(戦争開始パラメタ型 パラメタ)

から戦争が始まり、

void カスタム::On_戦争終了()

で戦争が終わります。

戦争中は、各種対応するイベントハンドラが呼ばれるため、その中で記述すればよいため、
Is_戦争中() といった判定関数は用意されていませんが、下記のようにすれば簡単に実現できまます。

bool g戦争中 = false;
void カスタム::On_戦争開始(戦争開始パラメタ型 パラメタ) {
	g戦争中 = true;
}

void カスタム::On_戦争終了() {
	g戦争中 = false;
}

各イベントハンドラのタイミングの詳細は、

を、参照してください。

野戦中の画面であることの判定

bool Is_野戦中()

攻城戦中の画面であることの判定

bool Is_攻城戦中()

例1

string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) {

	// 武将番号【配列用】がはいってて、かつ、名前も渡ってきている
	int iBushouID = メッセージ関連情報.第1人称【武将番号】 - 1;
	if (武将名 == "真田幸隆") {

		if (Is_文字列マッチ(元メッセージ, "わが隊はすでに\x0A士気旺盛")) {
			if (Is_野戦中()) {
				return "野戦中です";
			}
			else if (Is_攻城戦中()) {
				return "攻城戦中です";
			}
		}
	}

	// 変更しない場合""
	return "";
}

例2

void カスタム::On_残りターン変更《戦争画面》(int 残りターン数) {
	if (Is_野戦中()) {
		デバッグ出力 << "野戦中です" << endl;
	}
	else if (Is_攻城戦中()) {
		デバッグ出力 << "攻城戦中です" << endl;
	}
}

void カスタム::On_ターン変更《攻城中画面》(int ターン数) {
	if (Is_野戦中()) {
		デバッグ出力 << "野戦中です" << endl;
	}
	else if (Is_攻城戦中()) {
		デバッグ出力 << "攻城戦中です" << endl;
	}
}

ゲーム中に通過する全てのイベントハンドラで判定可能ですが、
通常は「戦争時に通過するイベントハンドラ内で、使用することとなるでしょう。

現在、攻城戦中なら、どこの城の攻城戦中なのかを取得する

WORD Get_攻城戦中の城番号()

「城番号」を得る関数ですので、「城番号【配列用】」を得るためには「-1」する必要があります。

string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) {

	if (武将名 == "真田幸隆") {

		if (Is_文字列マッチ(元メッセージ, "わが隊はすでに\x0A士気旺盛")) {
			if (Is_攻城戦中()) {
				int iCastleID = Get_攻城戦中の城番号() -1; // 城番号→城番号【配列用】
				string 城名 = Get_城名(iCastleID) + Get_城称(iCastleID) ;
				return 城名;
			}
		}
	}

	// 変更しない場合""
	return "";
}

void カスタム::On_ターン変更《攻城中画面》(int ターン数) {
	int iCastleID = Get_攻城戦中の城番号() - 1; // 城番号→城番号【配列用】
	デバッグ出力 << Get_城名(iCastleID) + Get_城称(iCastleID) << endl;
}

より詳細を知るには...

「戦争 - 戦争と野戦と攻城戦」に関する主な所は以上となります。 詳しくは「戦場情報型.h」などを参照してください。