最終更新日 2024-06-23

User.version.SDK ~城~

城の概念

城と一言で言っても3つの概念で構成されます。

ここでは、よく利用するパターンをピックアップして解説します。

使用例①

最も単純な例は、やはり全ての城をforループで回して順次処理をするというものです。
あまり「全ての城のプロパティを変更する」といったことはやらないかもしれませんが、
仕組みを理解をする上ではとても重要です。
以下は、各城が持つプロパティのほんの一部です。

城のプロパティの利用
    public static void My_戦略_軍団ターン変更時(int 軍団番号)
    {
        foreach (var c in 城.配列)
        {
            c.兵質 = 列挙.城.兵質.良;

            if (c.港)
            {
                c.金山 = true;
                c.国際港 = true;
                c.鍛冶 = true;
                c.人口 = 5000;
                c.石高 = 2500;
            }

            if (c.巨城)
            {
                c.城郭 = 200;
            }
            else
            {
                c.城郭 = 150;
            }
        }
    }

使用例②

よくあるのが「特定の武将」がどこに居るのか?
といった情報と絡めて利用するシーンでしょう。

武将が居る城名
    public static void My_戦略_軍団ターン変更時(int 軍団番号)
    {
        int iBushouID = 武将.Find_武将番号(列挙.武将.列伝番号.柴田勝家);

        if (武将.配列.Exists(iBushouID))
        {
            int iCastleID = 武将.配列[iBushouID].所属城番号;

            if (城.配列.Exists(iCastleID))
            {
                // 「城名」だけだと本来の名前部分だけとなる。
                // 「城名称」までつけると「~城、~御坊」など城称も含めた形となる。
                デバッグ出力(城.配列[iCastleID].城名);
                デバッグ出力(城.配列[iCastleID].城名称);
            }
        }
    }

城が214の場所にあるといっても、「何番がどの城に対応するのか?」などを
覚えている人はさすがに居ないことでしょう。
そこでSDK内では、天翔記に登場する全ての城(名前の変更分も含む)がすでに
列挙定義済みとなっており、これを番号代わりに利用することができます。

列挙を使って城番号を得る
    public static void My_戦略_軍団ターン変更時(int 軍団番号)
    {
        // 二条城の位置の城番号(位置だけなので、室町御所かもしれないし、伏見城かもしれない)
        int iCastleID = 列挙.城.城番号.二条城;

        var c = 城.配列[iCastleID];
        デバッグ出力(c.城名称);
        デバッグ出力(国.配列[c.所属国番号].国名);
    }

使用例③

日本全国の地図は実は、「グリッド」というラインで区切られています。
1つのグリッドあたり、最大でも城は1つしか置かれていません。(城が1つも無いグリッドもたくさんあります)

グリッドと城「城の隣接」「城の連絡経路」などを取り扱う際には、
グリッドの概念の理解が不可欠となります。
戦場グリッドマップに付属している画像や、
ヘックスエディタの野戦エディタとなるFieldEditor.exe
などを見て、どういったことなのか理解を深めましょう。
天翔記HD版でもn6dataフォルダに、
「CastleEditor.exe、FieldEditor.exe、LS11DotNet.dll」をコピーすれば、
日本地図が「どういったグリッド単位で区切られているのか」を、視覚的に理解できます。
天翔記95PK版も所持していたなら、全国切替地図の線を意識下で利用しているので、
「グリッドで切られている=城が隣接している」を自然と理解していることでしょう。
城のグリッド位置
    public static void My_戦略_軍団ターン変更時(int 軍団番号)
    {
        城グリッド位置型 pos = 城.配列[列挙.城.城番号.春日山城].グリッド位置;
        デバッグ出力("春日山城のグリッドの位置");
        デバッグ出力("X:" + pos.X + " Y:" + pos.Y);
    }

使用例④

「隣接しているグリッドに存在する城が、隣接している城」です。
グリッドの場合は「斜めに隣接している」時も隣接とみなされます。

とある城に隣接している城一覧
    public static void My_戦略_軍団ターン変更時(int 軍団番号)
    {
        var list = 城.配列[列挙.城.城番号.二条城].隣接城番号リスト;
        foreach (int iCastleID in list)
        {
            デバッグ出力(城.配列[iCastleID].城名称);
        }
    }

隣接しているというだけでは不十分で、「経路で繋がっていて隣接している」といった情報が欲しい場合もあります。
そういった場合には「経路隣接城番号リスト」を利用しましょう。

とある城に経路で繋がっていて、かつ、隣接している城一覧
    public static void My_戦略_軍団ターン変更時(int 軍団番号)
    {
        var list = 城.配列[列挙.城.城番号.躑躅ケ崎館].経路隣接城番号リスト;
        foreach (int iCastleID in list)
        {
            デバッグ出力(城.配列[iCastleID].城名称);
        }
    }

さらには、とある城から別の城まで一体どういう経路で辿っていくのが理想なのか?
といった情報を取得したいかもしれません。
SDKはこういった経路グラフを得ることも可能です。

とある城から、とある城までの、理想経路上の城一覧
    public static void My_戦略_軍団ターン変更時(int 軍団番号)
    {
        var graphlist = 城.Get_経路上の城番号リスト(列挙.城.城番号.春日山城, 列挙.城.城番号.安土城);
        デバッグ出力("-------------------------------------");
        foreach (int iCastleID in graphlist)
        {
            デバッグ出力(城.配列[iCastleID].城名称);
        }
    }

詳細となるため、ここでは触れませんが、全ての城から経路グラフを得るのではなく、
特定の範囲に限定して経路グラフを得ることも可能です。

その他

城について、主な解説は以上となります。
城関連には他にも非常に多数のプロパティやメソッドがあります。
詳しくはHD.version.SDKソース内の「城.h」や「城列挙.h」を参照してみてください。