官位とは「太政大臣」や「関白」といったものです。
官位と一言で言っても3つの概念で構成されます。
官位という抽象的なカテゴリの概念。
官位の一覧リストに相当する「官位の配列」の概念。
官位の配列のうち、どれか1つの官位
void カスタム::On_プレイヤ担当ターン《メイン画面》() { 番号リスト型 list; // 官位名と一致で判定するなら以下のようになる「官位名を書き換えているとマッチしない」ので注意 for (int KanniID = 0; KanniID < 最大数::官位情報::配列数; KanniID++) { if (Get_官位名(KanniID) == "大納言") { list.push_back(KanniID); } } for (int KaniID : list) { int iBushouID = p官位情報[KaniID].所有武将【武将番号】 - 1; デバッグ出力 << "官位番号【配列用】:" << KaniID << "の" << Get_官位名(KaniID) << "は..." << endl; // 武将番号【配列用】の範囲なら if (0 <= iBushouID && iBushouID < 最大数::武将情報::配列数) { デバッグ出力 << Get_名字(iBushouID) + Get_名前(iBushouID) << "が所持しています" << endl; } else { デバッグ出力 << "誰も所持していません" << endl; } } }
さきほどの、「大納言」のソース例でもわかることですが、
官位には全く同じ名前のものが複数存在します。
官位を操作する際には、この点に注意しましょう。
特定の武将が官位を所持するかは、上述の「特定の官位からそれを所持する武将を求める」と同様の処理となります。
void カスタム::On_プレイヤ担当ターン《メイン画面》() { int iBushouID = Get_武将番号【配列用】(顔番号::長尾景虎); int 上杉謙信の持ってる最高の官位 = -1; if (0 <= iBushouID && iBushouID < 最大数::武将情報::配列数) { for (int iKanniID = 0; iKanniID < 最大数::家宝情報::配列数; iKanniID++) { // 官位の「所持武将【武将番号】」→「武将番号【配列用】」 に直したものと一致するなら所持者 if (iBushouID == p官位情報[iKanniID].所有武将【武将番号】 - 1) { 上杉謙信の持ってる最高の官位 = iKanniID; break; // iKanniIDが少ないほど高位の官位であるため、一番はじめに見つけた官位が最上位。このためbreak;してしまう。 } } if (0 <= 上杉謙信の持ってる最高の官位 && 上杉謙信の持ってる最高の官位 < 最大数::官位情報::配列数) { デバッグ出力 << "上杉謙信が持っている最高の官位は..." << Get_官位名(上杉謙信の持ってる最高の官位) << "です。" << endl; } else { デバッグ出力 << "上杉謙信は官位を持っていません。" << endl; } } }
官位名の所持者を変更するには、専用の関数が用意されています。
bool Set_官位所有者変更(int 官位番号【配列用】, int 宛先武将番号【配列用】)
void カスタム::On_プレイヤ担当ターン《メイン画面》() { int iBushouID = Get_武将番号【配列用】(顔番号::長尾景虎); int 上杉謙信の持ってる最高の官位 = -1; if (0 <= iBushouID && iBushouID < 最大数::武将情報::配列数) { // 内大臣を上杉謙信に Set_官位所有者変更(4, iBushouID); } }
void カスタム::On_プレイヤ担当ターン《メイン画面》() { int iBushouID = Get_武将番号【配列用】(顔番号::長尾景虎); int 上杉謙信の持ってる最高の官位 = -1; if (0 <= iBushouID && iBushouID < 最大数::武将情報::配列数) { // 内大臣を上杉謙信に for (int KanniID = 0; KanniID < 最大数::家宝情報::配列数) { if (Get_官位名(KanniID) == "内大臣") { Set_官位所有者変更(KanniID, iBushouID); break; // break; を付けるのを忘れないようにすること。breakを付け忘れると、同じ官位名を全て総取りしてしまう。 } } } }
void カスタム::On_プレイヤ担当ターン《メイン画面》() { int iBushouID = Get_武将番号【配列用】(顔番号::長尾景虎); for (int KanniID = 0; KanniID < 最大数::家宝情報::配列数; KanniID++) { // 所持者が長尾景虎と一致した if (iBushouID == p官位情報[KanniID].所有武将【武将番号】 - 1) { // 官位を朝廷に返上 Set_官位所有者変更(KanniID, 0xFFFF); } } }
string Get_官位名(int 官位番号【配列用】)
官位名の取得については、すでに何箇所かで記載があるので問題はないことでしょう。
void Set_官位名(int 官位番号【配列用】, string 官位名)
void カスタム::On_プレイヤ担当ターン《メイン画面》() { Set_官位名(4, "菜っ葉大臣"); }
p官位情報[ix].位階
void カスタム::On_プレイヤ担当ターン《メイン画面》() { 番号リスト型 list; for (int KaniiID = 0; KaniiID < 最大数::官位情報::配列数; KaniiID++) { if (p官位情報[KaniiID].位階 == 位階::従三位) { list.push_back(KaniiID); } } int iSelectedKanniID = 選択官位ダイアログ表示(list); }
p官位情報[ix].上昇値
void カスタム::On_プレイヤ担当ターン《メイン画面》() { 番号リスト型 list; for (int KaniiID = 0; KaniiID < 最大数::官位情報::配列数; KaniiID++) { if (p官位情報[KaniiID].上昇値 >= 7) { list.push_back(KaniiID); } } int iSelectedKanniID = 選択官位ダイアログ表示(list); }
p官位情報[ix].上昇値
官位の「上昇値」を変更させる際には、「上昇値」だけ変更しても、当該の官位をすでに所持している武将には反映されません。
このため、一旦該当の官位を「朝廷に返上」し、「上昇値」を変更してから、元の武将へ再び付け直す、といった作業が必要となります。
void カスタム::On_プレイヤ担当ターン《メイン画面》() { int 関白の官位番号【配列用】 = 0; for (int KaniID = 0; KaniID < 最大数::官位情報::配列数; KaniID++) { if (Get_官位名(KaniID) == "関白") { int iBushouID = p官位情報[KaniID].所有武将【武将番号】 - 1; // 今持ってる武将番号を【配列用】に変更して控えておく Set_官位所有者変更(KaniID, 0xFFFF); // 上昇値を変化させる前に、朝廷へと返上する p官位情報[KaniID].上昇値 = 16; // 10ではなく16上昇するようにする // 元々が武将が所有していたのであれば... if (0 <= iBushouID && iBushouID < 最大数::武将情報::配列数) { Set_官位所有者変更(KaniID, iBushouID); } } } }
bool Set_官位上昇値(int 官位番号【配列用】, int 上昇値)
上昇値が1~24の範囲であれば、Set_官位上昇値を利用するのがお手軽です。
void カスタム::On_プレイヤ担当ターン《メイン画面》() { int iBushouID = Get_武将番号【配列用】(顔番号::長尾景虎); int 上杉謙信の持ってる最高の官位 = -1; if (0 <= iBushouID && iBushouID < 最大数::武将情報::配列数) { for (int iKanniID = 0; iKanniID < 最大数::家宝情報::配列数; iKanniID++) { // 官位の「所持武将【武将番号】」→「武将番号【配列用】」 に直したものと一致するなら所持者 if (iBushouID == p官位情報[iKanniID].所有武将【武将番号】 - 1) { 上杉謙信の持ってる最高の官位 = iKanniID; break; // iKanniIDが少ないほど高位の官位であるため、一番はじめに見つけた官位が最上位。このためbreak;してしまう。 } } if (0 <= 上杉謙信の持ってる最高の官位 && 上杉謙信の持ってる最高の官位 < 最大数::官位情報::配列数) { デバッグ出力 << "上杉謙信が持っている最高の官位は..." << Get_官位名(上杉謙信の持ってる最高の官位) << "です。" << endl; Set_官位上昇値(上杉謙信の持ってる最高の官位, 24); } else { デバッグ出力 << "上杉謙信は官位を持っていません。" << endl; } } }
「官位」に関する主な所は以上となります。
詳しくは「官位情報型.h」や「官位情報列挙.h」などを参照してください。