最終更新日 2024-09-25

大名 - 大名Aと大名Bの関係

大名の関係には

「友好値」

大名Aと大名B は「親密度」という意味での「友好値」

同盟関係 (大名Aは、複数の大名と同盟可能)

婚姻関係 (大名Aは、複数の大名と婚姻可能)

敵対関係(大名Aは、1つの大名に対してのみ敵対設定可能)

共闘関係(大名Aは、1つの大名に対してのみ共闘可能)

共闘関係を結ぶと、必然的に敵対大名も設定される。

があります。

ScenarioModやメモリエディタでは歴史的な都合で「p大名情報[ix].友好大名【大名番号】」が「共闘関係の大名番号」に相当します

大名Aと大名B の同盟関係の取得や設定

int Is_同盟関係(int 大名A番号【配列用】, int 大名B番号【配列用】)
void Set_同盟関係(int 大名A番号【配列用】, int 大名B番号【配列用】, BOOL 同盟化 = TRUE)
void カスタム::On_プレイヤ担当ターン《メイン画面》() {
	int iBushouID_A = Get_武将番号【配列用】(顔番号::織田信長);
	int iBushouID_B = Get_武将番号【配列用】(顔番号::武田晴信);
	if (0 <= iBushouID_A && iBushouID_A < 最大数::武将情報::配列数 &&
		0 <= iBushouID_B && iBushouID_B < 最大数::武将情報::配列数 ) {

		// 両者とも大名である
		if (p武将戸籍情報[iBushouID_A].身分 == 身分::大名 && p武将戸籍情報[iBushouID_B].身分 == 身分::大名) {
			int iDaimyoID_A = p武将情報[iBushouID_A].所属大名【大名番号】 - 1;
			int iDaimyoID_B = p武将情報[iBushouID_B].所属大名【大名番号】 - 1;

			if (0 <= iDaimyoID_A && iDaimyoID_A < 最大数::大名情報::配列数 &&
				0 <= iDaimyoID_B && iDaimyoID_B < 最大数::大名情報::配列数) {

				// 同盟関係でなければ、同盟関係を結ぶ
				if ( Is_同盟関係(iDaimyoID_A, iDaimyoID_B) == false) {
					Set_同盟関係(iDaimyoID_A, iDaimyoID_B);
				}
			}
		}
	}
}

大名Aと大名B の婚姻関係の取得や設定

int Is_婚姻関係(int 大名A番号【配列用】, int 大名B番号【配列用】)
void Set_婚姻関係(int 大名A番号【配列用】, int 大名B番号【配列用】, BOOL 婚姻化 = TRUE)
void カスタム::On_プレイヤ担当ターン《メイン画面》() {
	int iBushouID_A = Get_武将番号【配列用】(顔番号::織田信長);
	int iBushouID_B = Get_武将番号【配列用】(顔番号::武田晴信);
	if (0 <= iBushouID_A && iBushouID_A < 最大数::武将情報::配列数 &&
		0 <= iBushouID_B && iBushouID_B < 最大数::武将情報::配列数 ) {

		// 両者とも大名である
		if (p武将戸籍情報[iBushouID_A].身分 == 身分::大名 && p武将戸籍情報[iBushouID_B].身分 == 身分::大名) {
			int iDaimyoID_A = p武将情報[iBushouID_A].所属大名【大名番号】 - 1;
			int iDaimyoID_B = p武将情報[iBushouID_B].所属大名【大名番号】 - 1;

			if (0 <= iDaimyoID_A && iDaimyoID_A < 最大数::大名情報::配列数 &&
				0 <= iDaimyoID_B && iDaimyoID_B < 最大数::大名情報::配列数) {

				// 婚姻関係でなければ、婚姻関係を結ぶ
				if ( Is_婚姻関係(iDaimyoID_A, iDaimyoID_B) == false) {
					Set_婚姻関係(iDaimyoID_A, iDaimyoID_B);
				}
			}
		}
	}
}

大名Aと大名B の友好値の取得や設定

int Get_友好関係(int 大名A番号【配列用】, int 大名B番号【配列用】)
void Set_友好関係(int 大名A番号【配列用】, int 大名B番号【配列用】, int 友好値)
友好値は実は一定の規則がある友好関係は自由な値をとるわけではなく、
0, 10, 20, 30, 40, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100 のいずれかの値を取ります。
これらと一致しない数値を指定した場合には、「指定した値より小さく」かつ「上記数値に一致するもっとも近い数値」が採用されます。
void カスタム::On_プレイヤ担当ターン《メイン画面》() {
	int iBushouID_A = Get_武将番号【配列用】(顔番号::織田信長);
	int iBushouID_B = Get_武将番号【配列用】(顔番号::武田晴信);
	if (0 <= iBushouID_A && iBushouID_A < 最大数::武将情報::配列数 &&
		0 <= iBushouID_B && iBushouID_B < 最大数::武将情報::配列数 ) {

		// 両者とも大名である
		if (p武将戸籍情報[iBushouID_A].身分 == 身分::大名 && p武将戸籍情報[iBushouID_B].身分 == 身分::大名) {
			int iDaimyoID_A = p武将情報[iBushouID_A].所属大名【大名番号】 - 1;
			int iDaimyoID_B = p武将情報[iBushouID_B].所属大名【大名番号】 - 1;

			if (0 <= iDaimyoID_A && iDaimyoID_A < 最大数::大名情報::配列数 &&
				0 <= iDaimyoID_B && iDaimyoID_B < 最大数::大名情報::配列数) {

				// 友好関係が60を超えていたら80に設定
				if ( Get_友好関係(iDaimyoID_A, iDaimyoID_B) >= 60) {
					Set_友好関係(iDaimyoID_A, iDaimyoID_B, 80);
				}
			}
		}
	}
}

大名A が 大名B を敵対大名とする

p大名情報[ix].敵対大名【大名番号】
void カスタム::On_プレイヤ担当ターン《メイン画面》() {

	// 織田信長が帰属する大名家の家紋を151番に変更する
	int iBushouID = Get_武将番号【配列用】(顔番号::織田信長);

	// 織田信長が大名の時、大名番号【配列用】を取得する
	int i信長のDaimyoID = 0xFFFF;
	if (0 <= iBushouID && iBushouID < 最大数::武将情報::配列数) {
		if (p武将戸籍情報[iBushouID].身分 == 身分::大名) {
			int iDaimyoID = p武将情報[iBushouID].所属大名【大名番号】 - 1;

			if (0 <= iDaimyoID && iDaimyoID < 最大数::大名情報::配列数) {
				i信長のDaimyoID = iDaimyoID;
			}
		}
	}

	// 全ての大名家が、織田信長を敵国設定する
	if ( 0 <= i信長のDaimyoID && i信長のDaimyoID < 最大数::武将情報::配列数) {
		for(int iDaimyoID = 0; iDaimyoID < 最大数::大名情報::配列数; iDaimyoID++) {

			// 織田信長の織田家自身の情報については、敵対大名の変更をしない(織田家自身が織田家を敵対とか意味不明なため)
			if (iDaimyoID == i信長のDaimyoID) { continue; }

			// 有効な大名である。
			if (p大名情報[iDaimyoID].大名【武将番号】 != 0xFFFF) {

				p大名情報[iDaimyoID].敵対大名【大名番号】 = i信長のDaimyoID + 1; // 大名番号【配列用】→大名番号 に変更して代入
			}
		}
	}
}

敵対大名を解除

敵対大名を解除する時には「敵対大名【大名番号】」に「255(=0xFF)」を代入すればよい

大名A が 大名B と共闘関係(友好関係)となる

p大名情報[ix].友好大名【大名番号】
void カスタム::On_プレイヤ担当ターン《メイン画面》() {

	int 武田信玄のDaimyoID = -1;
	int 上杉謙信のDaimyoID = -1;
	int 織田信長のDaimyoID = -1;


	for (int iDaimyoID = 0; iDaimyoID < 最大数::大名情報::配列数; iDaimyoID++) {

		// 大名家の大名本人の武将番号【配列用】
		int iBushouID = p大名情報[iDaimyoID].大名【武将番号】 - 1;

		if (0 <= iBushouID && iBushouID < 最大数::武将情報::配列数) {
			// それは
			if (p武将戸籍情報[iBushouID].顔番号 == 顔番号::武田晴信) {
				武田信玄のDaimyoID = iDaimyoID;
			}
			else if (p武将戸籍情報[iBushouID].顔番号 == 顔番号::長尾景虎) {
				上杉謙信のDaimyoID = iDaimyoID;
			}
			else if (p武将戸籍情報[iBushouID].顔番号 == 顔番号::織田信長) {
				織田信長のDaimyoID = iDaimyoID;
			}
		}
	}

	// 3者が全て居る。
	if (0 <= 武田信玄のDaimyoID && 武田信玄のDaimyoID < 最大数::大名情報::配列数 &&
		0 <= 上杉謙信のDaimyoID && 上杉謙信のDaimyoID < 最大数::大名情報::配列数 &&
		0 <= 織田信長のDaimyoID && 織田信長のDaimyoID < 最大数::大名情報::配列数) {

		// 武田信玄と上杉謙信が友好関係(共闘関係)となり、織田信長を敵対とする
		p大名情報[武田信玄のDaimyoID].友好大名【大名番号】 = 上杉謙信のDaimyoID + 1;  // 大名番号【配列用】→大名番号になおして代入
		p大名情報[上杉謙信のDaimyoID].友好大名【大名番号】 = 武田信玄のDaimyoID + 1;  // 大名番号【配列用】→大名番号になおして代入

		p大名情報[武田信玄のDaimyoID].敵対大名【大名番号】 = 織田信長のDaimyoID + 1;  // 大名番号【配列用】→大名番号になおして代入
		p大名情報[上杉謙信のDaimyoID].敵対大名【大名番号】 = 織田信長のDaimyoID + 1;  // 大名番号【配列用】→大名番号になおして代入
	}
}

友好大名を解除

友好大名を解除する時には「友好大名【大名番号】」に「255(=0xFF)」を代入すればよい

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

「大名Aと大名B」に関する主な所は以上となります。
詳しくは「大名情報型.h」や「大名情報列挙.h」などを参照してください。