commonplacebook9019 @ ウィキ
N6のMod用自作関数 戦闘関連
最終更新:
commonplacebook9019
-
view
現在の武将のいる地形を取得
int 戦闘用関数2_Get_地形取得(int 武将番号【配列用】) {
int 地形 = -1;
if (0 <= 武将番号【配列用】 && 武将番号【配列用】 < 最大数::武将情報::配列数) {
if (Is_攻城戦中()) {
ヘックス位置型 pos = Get_武将の攻城戦ヘックス位置(武将番号【配列用】);
地形 = Get_攻城戦ヘックス役割(pos);
return 地形;
}
else if (Is_野戦中()) {
ヘックス位置型 pos = Get_武将の野戦ヘックス位置(武将番号【配列用】);
地形 = Get_野戦ヘックス役割(pos);
return 地形;
}
return 地形;
}
else {
デバッグ出力("武将番号【配列用】は範囲外");
return 地形;
}
}
攻城戦中の武将のいる場所の階層取得
int 戦闘関数__現在の高さ(int 武将番号1) {
int 高さ = -1;
if (0 <= 武将番号1 && 武将番号1 < 最大数::武将情報::配列数) {
ヘックス位置型 pos = Get_武将の攻城戦ヘックス位置(武将番号1);
高さ = Get_攻城戦ヘックス高さ(pos);
return 高さ;
}
else {
デバッグ出力("武将番号【配列用】は範囲外");
return 高さ;
}
}
bool 攻城戦_自分は相手よりも上にいる(int 武将番号1, int 武将番号2) {
if (0 <= 武将番号1 && 武将番号1 < 最大数::武将情報::配列数 &&
0 <= 武将番号2 && 武将番号2 < 最大数::武将情報::配列数) {
int 1高さ = 戦闘関数__現在の高さ(武将番号1);
int 2高さ = 戦闘関数__現在の高さ(武将番号2);
if (1高さ > 2高さ) {
return true;
}
else {
return false;
}
}
return false;
}
武将が野戦中に城の隣にいる
bool 城隣にいる(int 武将) {
if (0 <= 武将 && 武将 < 最大数::武将情報::配列数) {
ヘックス位置型 pos武将 = Get_武将の野戦ヘックス位置(武将);
ヘックス位置リスト型 list = Get_特定の役割の野戦ヘックス位置リスト(野戦ヘックス役割::城);
for (ヘックス位置型 pos海 : list) {
if (Get_ヘックス間隔(pos武将, pos海) <= 1 && Get_野戦ヘックス役割(pos武将) != 野戦ヘックス役割::城) {
return TRUE;
}
else {
return FALSE;
}
}
return FALSE;
}
else {
return FALSE;
}
}
武将のいる距離を取得
int 戦闘用関数4_武将距離改(int 武将番号1, int 武将番号2) {
int 地形 = -1;
if (0 <= 武将番号1 && 武将番号1 < 最大数::武将情報::配列数 &&
0 <= 武将番号2 && 武将番号2 < 最大数::武将情報::配列数) {
ヘックス位置型 1, 2;
if (Is_野戦中()) { 1 = Get_武将の野戦ヘックス位置(武将番号1); }
else if (Is_攻城戦中()) { 1 = Get_武将の攻城戦ヘックス位置(武将番号1); }
if (Is_野戦中()) { 2 = Get_武将の野戦ヘックス位置(武将番号2); }
else if (Is_攻城戦中()) { 2 = Get_武将の攻城戦ヘックス位置(武将番号2); }
return Get_ヘックス間隔(1, 2);
}
else {
デバッグ出力("武将番号【配列用】は範囲外");
return 地形;
}
}
武将が本丸にいる
bool Is_部隊は特定の地形にいる_自身は本丸にいる(int 武将1) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数) {
int 今の地形_武将1 = 戦闘用関数2_Get_地形取得(武将1);
if (今の地形_武将1 == 攻城戦ヘックス役割::本丸) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
武将の数マス以内に味方武将がいる
番号リスト型 戦闘用関数_同勢力武将抽出_戦場出撃_範囲(int 武将番号, int 距離) {
番号リスト型 list;
番号リスト型 武将一覧 = Get_出陣中の武将番号リスト【配列用】《表示中マップ》();
for each(int iSelectedBushouID in 武将一覧) {
if (0 <= iSelectedBushouID && iSelectedBushouID < 最大数::武将情報::配列数) {
if (Is_自分と相手は同じ大名家所属(武将番号, iSelectedBushouID)) {
ヘックス位置型 1, 2;
if (Is_野戦中()) { 1 = Get_武将の野戦ヘックス位置(武将番号); }
else if (Is_攻城戦中()) { 1 = Get_武将の攻城戦ヘックス位置(武将番号); }
if (Is_野戦中()) { 2 = Get_武将の野戦ヘックス位置(iSelectedBushouID); }
else if (Is_攻城戦中()) { 2 = Get_武将の攻城戦ヘックス位置(iSelectedBushouID); }
if (Get_ヘックス間隔(1, 2) <= 距離) {
list.push_back(iSelectedBushouID);
}
}
}
}
return list;
}
武将が敵同士である
bool 武将は攻守陣営が違う(int 武将番号1, int 武将番号2) {
if (0 <= 武将番号1 && 武将番号1 < 最大数::武将情報::配列数 && 0 <= 武将番号2 && 武将番号2 < 最大数::武将情報::配列数) {
int 軍団1状態 = Get_武将の参戦立場(武将番号1);
int 軍団2状態 = Get_武将の参戦立場(武将番号2);
if ((軍団1状態 == 参戦立場::攻撃軍 && 軍団2状態 == 参戦立場::守備軍) ||
(軍団1状態 == 参戦立場::攻撃軍 && 軍団2状態 == 参戦立場::守備の援軍) ||
(軍団1状態 == 参戦立場::守備軍 && 軍団2状態 == 参戦立場::攻撃軍) ||
(軍団1状態 == 参戦立場::守備軍 && 軍団2状態 == 参戦立場::攻撃の援軍) ||
(軍団1状態 == 参戦立場::攻撃の援軍 && 軍団2状態 == 参戦立場::守備軍) ||
(軍団1状態 == 参戦立場::攻撃の援軍 && 軍団2状態 == 参戦立場::守備の援軍) ||
(軍団1状態 == 参戦立場::守備の援軍 && 軍団2状態 == 参戦立場::攻撃軍) ||
(軍団1状態 == 参戦立場::守備の援軍 && 軍団2状態 == 参戦立場::攻撃の援軍)) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
武将は相互共に海にいる
bool Is_部隊は特定の地形にいる_自身と相手は海にいる(int 武将1, int 武将2) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数 &&
0 <= 武将2 && 武将2 < 最大数::武将情報::配列数) {
int 今の地形_武将1 = 戦闘用関数2_Get_地形取得(武将1);
int 今の地形_武将2 = 戦闘用関数2_Get_地形取得(武将2);
if ((今の地形_武将1 == 野戦ヘックス役割::海 || 今の地形_武将1 == 野戦ヘックス役割::湖) &&
(今の地形_武将2 == 野戦ヘックス役割::海 || 今の地形_武将2 == 野戦ヘックス役割::湖)) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
敵武将は自分よりもどこかの方角にいる
bool 戦闘中_野戦で敵は南西にいる(int 武将1, int 武将2) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数 && 0 <= 武将2 && 武将2 < 最大数::武将情報::配列数) {
ヘックス位置型 1, 2;
if (Is_野戦中()) { 1 = Get_武将の野戦ヘックス位置(武将1); }
else if (Is_攻城戦中()) { 1 = Get_武将の攻城戦ヘックス位置(武将1); }
if (Is_野戦中()) {
2 = Get_武将の野戦ヘックス位置(武将2);
}
else if (Is_攻城戦中()) { 2 = Get_武将の攻城戦ヘックス位置(武将2); }
if (1.Y < 2.Y && 1.X > 2.X) {//敵は南西
return true;
}
else {
return false;
}
}
else {
return false;
}
}
bool 戦闘中_野戦で敵は南東にいる(int 武将1, int 武将2) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数 && 0 <= 武将2 && 武将2 < 最大数::武将情報::配列数) {
ヘックス位置型 1, 2;
if (Is_野戦中()) { 1 = Get_武将の野戦ヘックス位置(武将1); }
else if (Is_攻城戦中()) { 1 = Get_武将の攻城戦ヘックス位置(武将1); }
if (Is_野戦中()) {
2 = Get_武将の野戦ヘックス位置(武将2);
}
else if (Is_攻城戦中()) { 2 = Get_武将の攻城戦ヘックス位置(武将2); }
if (1.Y < 2.Y && 1.X < 2.X) {//敵は南東
return true;
}
else {
return false;
}
}
else {
return false;
}
}
bool 戦闘中_野戦で敵は北東にいる(int 武将1, int 武将2) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数 && 0 <= 武将2 && 武将2 < 最大数::武将情報::配列数) {
ヘックス位置型 1, 2;
if (Is_野戦中()) { 1 = Get_武将の野戦ヘックス位置(武将1); }
else if (Is_攻城戦中()) { 1 = Get_武将の攻城戦ヘックス位置(武将1); }
if (Is_野戦中()) {
2 = Get_武将の野戦ヘックス位置(武将2);
}
else if (Is_攻城戦中()) { 2 = Get_武将の攻城戦ヘックス位置(武将2); }
if (1.Y > 2.Y && 1.X < 2.X) {//敵は北東
return true;
}
else {
return false;
}
}
else {
return false;
}
}
bool 戦闘中_野戦で敵は北西にいる(int 武将1, int 武将2) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数 && 0 <= 武将2 && 武将2 < 最大数::武将情報::配列数) {
ヘックス位置型 1, 2;
if (Is_野戦中()) { 1 = Get_武将の野戦ヘックス位置(武将1); }
else if (Is_攻城戦中()) { 1 = Get_武将の攻城戦ヘックス位置(武将1); }
if (Is_野戦中()) {
2 = Get_武将の野戦ヘックス位置(武将2);
}
else if (Is_攻城戦中()) { 2 = Get_武将の攻城戦ヘックス位置(武将2); }
if (1.Y > 2.Y && 1.X > 2.X) {//敵は北西
return true;
}
else {
return false;
}
}
else {
return false;
}
}
武将は攻城中の特定の地形に隣接している
bool 戦闘中_本丸周辺にいる(int 武将1) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数) {
ヘックス位置リスト型 list = Get_特定の役割の攻城戦ヘックス位置リスト(攻城戦ヘックス役割::本丸);
番号リスト型 blist = Get_出陣中の武将番号リスト【配列用】《表示中マップ》();
for (int iBushouID : blist) {
ヘックス位置型 pos武将 = Get_武将の攻城戦ヘックス位置(iBushouID);
for (ヘックス位置型 本丸 : list) {
if (Get_ヘックス間隔(pos武将, 本丸) <= 1) {
return true;
}
else {
return false;
}
}
}
}
return false;
}
bool 戦闘中_閉門周辺にいる(int 武将1) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数) {
ヘックス位置リスト型 list = Get_特定の役割の攻城戦ヘックス位置リスト(攻城戦ヘックス役割::閉門);
番号リスト型 blist = Get_出陣中の武将番号リスト【配列用】《表示中マップ》();
for (int iBushouID : blist) {
ヘックス位置型 pos武将 = Get_武将の攻城戦ヘックス位置(iBushouID);
for (ヘックス位置型 本丸 : list) {
if (Get_ヘックス間隔(pos武将, 本丸) <= 1) {
return true;
}
else {
return false;
}
}
}
}
return false;
}
bool 戦闘中_櫓にいる(int 武将1) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数) {
ヘックス位置リスト型 list = Get_特定の役割の攻城戦ヘックス位置リスト(攻城戦ヘックス役割::櫓);
番号リスト型 blist = Get_出陣中の武将番号リスト【配列用】《表示中マップ》();
for (int iBushouID : blist) {
ヘックス位置型 pos武将 = Get_武将の攻城戦ヘックス位置(iBushouID);
for (ヘックス位置型 本丸 : list) {
if (Get_ヘックス間隔(pos武将, 本丸) == 0) {
return true;
}
else {
return false;
}
}
}
}
return false;
}
bool 戦闘中_城外平地にいる(int 武将1) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数) {
ヘックス位置リスト型 list = Get_特定の役割の攻城戦ヘックス位置リスト(攻城戦ヘックス役割::城外平地);
番号リスト型 blist = Get_出陣中の武将番号リスト【配列用】《表示中マップ》();
for (int iBushouID : blist) {
ヘックス位置型 pos武将 = Get_武将の攻城戦ヘックス位置(iBushouID);
for (ヘックス位置型 本丸 : list) {
if (Get_ヘックス間隔(pos武将, 本丸) == 0) {
return true;
}
else {
return false;
}
}
}
}
return false;
}
戦闘を行う城はどこかの地域にいる
bool _攻撃城の都道府県は中部() {
int 都道府県番号 = Get_地域番号【配列用】(pex9.p汎用データ.一時記録用_攻撃城番号);
if (都道府県番号 == 都道府県::富山県) {
return true;
}
else if (都道府県番号 == 都道府県::新潟県) {
return true;
}
else if (都道府県番号 == 都道府県::山形県) {
return true;
}
else if (都道府県番号 == 都道府県::秋田県) {
return true;
}
else {
return false;
}
}
戦闘中の武将は同盟国同士
bool 戦闘中_自分と相手は同盟国(int 武将1, int 武将2) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数 &&
0 <= 武将2 && 武将2 < 最大数::武将情報::配列数) {
int 今の地形_武将1 = 戦闘用関数2_Get_地形取得(武将1);
int 今の地形_武将2 = 戦闘用関数2_Get_地形取得(武将2);
int 大名1 = p武将情報[武将1].所属大名【大名番号】 - 1;
int 大名2 = p武将情報[武将2].所属大名【大名番号】 - 1;
if (0 <= 大名1 && 大名1 < 最大数::大名情報::配列数 &&
0 <= 大名2 && 大名2 < 最大数::大名情報::配列数) {
if (Is_同盟関係(大名1, 大名2)) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
else {
return false;
}
}
武将は海岸地形にいる
bool 戦闘中_海岸に隣接(int 武将1) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数) {
ヘックス位置リスト型 list = Get_特定の役割の野戦ヘックス位置リスト(野戦ヘックス役割::海);
ヘックス位置型 pos武将 = Get_武将の野戦ヘックス位置(武将1);
for (ヘックス位置型 pos城 : list) {
int 役割a = Get_野戦ヘックス役割(pos武将);
if (役割a != 野戦ヘックス役割::海) {
if (Get_ヘックス間隔(pos武将, pos城) == 1) {
return true;
}
else {
return false;
}
}else if (役割a != 野戦ヘックス役割::湖) {
if (Get_ヘックス間隔(pos武将, pos城) == 1) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
return false;
}
else {
return false;
}
}
城と城は補給路が構築されている
bool _城と城は補給路が同盟国(int 城1, int 城2) {
if (0 <= 城1 && 城1 < 最大数::城情報::配列数 &&
0 <= 城2 && 城2 < 最大数::城情報::配列数) {
int 城1軍団 = p城情報[城1].所属軍団【軍団番号】 - 1;
int 城2軍団 = p城情報[城2].所属軍団【軍団番号】 - 1;
if (0 <= 城1軍団 && 城1軍団 < 最大数::軍団情報::配列数 &&
0 <= 城2軍団 && 城2軍団 < 最大数::軍団情報::配列数) {
int 城1大名 = p軍団情報[城1軍団].所属大名【大名番号】 - 1;
int 城2大名 = p軍団情報[城2軍団].所属大名【大名番号】 - 1;
if (0 <= 城1大名 && 城1大名 < 最大数::大名情報::配列数 &&
0 <= 城2大名 && 城2大名 < 最大数::大名情報::配列数) {
Set_城経路グラフ初期化();
for (int 城 = 0; 城 < 最大数::城情報::配列数; 城++) {
int 城3軍団 = p城情報[城].所属軍団【軍団番号】 - 1;
int 城3大名 = p軍団情報[城3軍団].所属大名【大名番号】 - 1;
if (0 <= 城3大名 && 城3大名 < 最大数::大名情報::配列数) {
if (Is_同盟関係(城1大名, 城3大名)) { continue; }
if (城3大名 == 城1大名) { continue; }
if (城3大名 == 城2大名) { continue; }
Set_城経路グラフから城削除(城);
}
}
番号リスト型 clist = Get_経路上の城番号リスト【配列用】(城1, 城2); // 室町から種子島
if (clist.size() > 1) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
else {
return false;
}
}
else {
return false;
}
}
15
bool 戦闘中_城に隣接(int 武将1) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数) {
ヘックス位置リスト型 list = Get_特定の役割の野戦ヘックス位置リスト(野戦ヘックス役割::城);
ヘックス位置型 pos武将 = Get_武将の野戦ヘックス位置(武将1);
for (ヘックス位置型 pos城 : list) {
if (Get_ヘックス間隔(pos武将, pos城) <= 1) {
return true;
}
else {
return false;
}
}
return false;
}
else {
return false;
}
}
16
bool 戦闘中_階層にいる(int 武将番号, int 階層) {
if (0 <= 武将番号 && 武将番号 < 最大数::武将情報::配列数) {
ヘックス位置型 pos = Get_武将の攻城戦ヘックス位置(武将番号);
int 高さ = Get_攻城戦ヘックス高さ(pos);
if (高さ == 階層) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
武将のダメージを加算する・ほか
int ダメージ返し・拡張(int ダメージ) {
int 色々な要因 = 0;
if (ダメージ >= 1) {
if (色々な要因 >= 3) { ダメージ++; }
if (色々な要因 >= 6) { ダメージ++; }
if (色々な要因 >= 9) { ダメージ++; }
if (色々な要因 >= 12) { ダメージ++; }
if (色々な要因 >= 15) { ダメージ++; }
return ダメージ;
}
return ダメージ;
}
int 士気返し・拡張(int 士気) {
int 色々な要因 = 0;
if (士気 >= 1) {
if (色々な要因 >= 3) { 士気++; }
if (色々な要因 >= 6) { 士気++; }
if (色々な要因 >= 9) { 士気++; }
if (色々な要因 >= 12) { 士気++; }
if (色々な要因 >= 15) { 士気++; }
return 士気;
}
return 士気;
}
武将は2人とも隣接している
bool 戦闘中_条件_2人とも隣接(int 武将1, int 武将2) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数 && 0 <= 武将2 && 武将2 < 最大数::武将情報::配列数) {
ヘックス位置型 1, 2;
if (Is_野戦中()) { 1 = Get_武将の野戦ヘックス位置(武将1); }
if (Is_野戦中()) { 2 = Get_武将の野戦ヘックス位置(武将2); }
if (Get_ヘックス間隔(1, 2) == 1) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
19
bool 戦闘中_野戦で自身は南西にいる(int 武将1) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数) {
ヘックス位置型 1;
if (Is_野戦中()) { 1 = Get_武将の野戦ヘックス位置(武将1); }
else if (Is_攻城戦中()) { 1 = Get_武将の攻城戦ヘックス位置(武将1); }
if (1.Y < 20 && 1.X < 12) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
bool 戦闘中_野戦で自身は南東にいる(int 武将1) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数) {
ヘックス位置型 1;
/*
const int 中心X = 20; ///<summary>野戦の画面の中心Xの想定位置。</summary>
const int 中心Y = 12; ///<summary>野戦の画面の中心Yの想定位置。</summary>
*/
if (Is_野戦中()) { 1 = Get_武将の野戦ヘックス位置(武将1); }
else if (Is_攻城戦中()) { 1 = Get_武将の攻城戦ヘックス位置(武将1); }
if (1.Y < 20 && 1.X > 12) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
bool 戦闘中_野戦で自身は北東にいる(int 武将1) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数) {
ヘックス位置型 1;
/*
const int 中心X = 20; ///<summary>野戦の画面の中心Xの想定位置。</summary>
const int 中心Y = 12; ///<summary>野戦の画面の中心Yの想定位置。</summary>
*/
if (Is_野戦中()) { 1 = Get_武将の野戦ヘックス位置(武将1); }
else if (Is_攻城戦中()) { 1 = Get_武将の攻城戦ヘックス位置(武将1); }
if (1.Y > 20 && 1.X > 12) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
bool 戦闘中_野戦で自身は北西にいる(int 武将1) {
if (0 <= 武将1 && 武将1 < 最大数::武将情報::配列数) {
ヘックス位置型 1;
if (Is_野戦中()) { 1 = Get_武将の野戦ヘックス位置(武将1); }
else if (Is_攻城戦中()) { 1 = Get_武将の攻城戦ヘックス位置(武将1); }
if (1.Y > 20 && 1.X < 12) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}