【Before We Leave】チュートリアルを攻略

戦闘の無い優しい世界で都市開発を行うゲームです。

EPIC Gamesでダウンロードできます。

週間アスキーにて紹介されていたのでプレイして見ました。

ただ、一つ問題がありまして、

日本語化されていないんですよね。

なので、チュートリアルを解説付きでプレイしていきます。

左上に指示が出ていますので、この通りに進めていきます。

マウスの右クリック・ドラッグでカメラを移動、ホイールの回転でズームを行います。

道(Road)を3つ、小屋(HUT)を3つ作成します。

左下に矢印が出ているので、どれが該当するアイコンかが分かると思います。

ジャガイモ農場(Potato Field)2つと井戸(well)を作成します。

農場系は井戸の周りに作成すると効率が上がります。

逆に工業系の近くに置くと、汚染が発生するので、効率は下がります。

木切り場(woodcutter)を森の近くに配置します。

これで木材の供給が可能になります。

森を3つ破壊し、石を3つ獲得します。

矢印の施設でツールを作成します。

施設をクリックすると、右下にウィンドウが出るので、緑のボタンを押すと、木材からツールを5つ獲得します。

今のところツールを作成するのはこの方法しかありません。

冒険者の小屋(Explorers Hut)と図書館(Library)を建築します。

冒険者の小屋は地図上のエンシャントテクノロジー(緑色のカプセルみたいなの)を回収し、グリーンテクノロジーに変換します。

図書館はこのグリーンテクノロジーを消費してテクノロジーを獲得します。

図書館でエレベータのテクノロジーを獲得し、エレベーターを作成します。

図書館をクリックすると右下にウィンドウが表示されるので、緑のボタンを押すと、

この画面が出るので、エレベーターをリサーチします。

エレベーターは高台に上るために必要になります。

高台と平地の間に設置します。

そのまえに、高台まで道が繋がっている必要があります。

図書館でマイニングを獲得します。

採石場(Quarry)を建設します。矢印があるmountainの隣に設置します。

修復(Repair)を獲得します。

Hutの数を増やして、人間の数を25以上にします。

倉庫(Warehouse)をリサーチして倉庫を建設します。

倉庫を建設するには2つスペースが必要になります。

また、この頃にはツールが足りなくなると思うので、ツールを生産する必要があります。

次に倉庫に溜める資材を選択します。次のチュートリアルに進むためには最低3つ選択する必要があります。

次はMetalworkをリサーチします。

そうすると、鉄鉱山(Iron mine)を建築できるようになるので、Rusty Hulkの側に建設します。

次は発電所を修復します。

発電所を修復すると、パワー(power)を獲得できます。

パワーは発電所のみで獲得できます。

それが出来たら鉄精錬所(Iron Smelter)とToolsmithを建設します。

これで鉄鉱石とパワーを消費し、鉄とツールの供給が可能になります。

この2つは汚染を発生させるので、農場とは離れたところに設置するといいでしょう。

次はガーデニング(Gardening)をリサーチし、野菜畑2つとハーブ畑を2つ建設します。

これも井戸の近くに設置すると効率が上がります。

最後に船を修復します。

船を修復したら船を操作して新大陸を探します。

新大陸を発見したら、船を大陸の側に移動させて右下の緑のボタンから上陸させます。

これで序盤はクリア。

まだまだ続きますが、新大陸に上陸した後も何をすれば良いかが分かるはずです。

【北海道大戦】バトル処理を実装する。

前回までの状況はこちら。

最新ソースはこちら(gitHub)

https://github.com/takishita2nd/HokkaidoWar

前回は対戦相手を選択する処理を作成したので、

今回は実際にバトルを行う処理を作成します。

    class Battle
    {
        public void NextTurn()
        {
            if (lastDeffece != null)
            {
                lastDeffece.ClearPaint();
            }
            if (lastAttack != null)
            {
                lastAttack.ClearPaint();
            }

            var targets = _cities[cityCnt].GetLinkedCities();
            var r = Singleton.GetRandom();
            int targetIdx = r.Next(0, targets.Count + 1);
            lastAttack = _cities[cityCnt];
            lastAttack.PaintAttackColor();

            var info = Singleton.GetGameProcessInfomation();
            if(targetIdx >= targets.Count)
            {
                info.ShowText(lastAttack.GetPosition(), string.Format("{0} turn {1} / {2} {3}",
                    turn, cityCnt + 1, _cities.Count, lastAttack.Name));
            }
            else
            {
                lastDeffece = targets[targetIdx];
                lastDeffece.PaintDeffenceColor();
                float attack = lastAttack.Population * (float)(r.Next(5, 30) / 10.0);
                float deffence = lastDeffece.Population * (float)(r.Next(5, 30) / 10.0);
                if(attack > deffence)
                {
                    info.ShowText(lastAttack.GetPosition(), string.Format("{0} turn {1} / {2} {3}\r\ntarget {4} \r\n{5} vs {6}\r\nwin",
                        turn, cityCnt + 1, _cities.Count, lastAttack.Name, lastDeffece.Name, (int)attack, (int)deffence));
                    lastAttack.CombinationCity(lastDeffece);
                    _cities.Remove(lastDeffece);
                    lastDeffece = null;
                }
                else
                {
                    info.ShowText(lastAttack.GetPosition(), string.Format("{0} turn {1} / {2} {3}\r\ntarget {4} \r\n{5} vs {6}\r\nlose",
                        turn, cityCnt + 1, _cities.Count, lastAttack.Name, lastDeffece.Name, (int)attack, (int)deffence));
                }
            }

            cityCnt++;
            if(cityCnt >= _cities.Count)
            {
                _cities = cityRandomReplace(_cities);
                cityCnt = 0;
                turn++;
            }
        }
    class City
    {
        public List<Map> GetMaps()
        {
            return _maps;
        }

        public void CombinationCity(City lose)
        {
            addMaps(lose.GetMaps());
            _population += lose.Population;
        }

        private void addMaps(List<Map> maps)
        {
            foreach(var m in maps)
            {
                m.SetCity(this);
            }
            _maps.AddRange(maps);
        }

とりあえず、0.5倍~3倍の乱数で戦力値に補正をかけて勝敗を決めます。

そして、攻撃側が勝利した場合は防御側を吸収合併します。

これで一通り実装は完了したので、実際に大戦を実行しましょう。

札幌の一人勝ちでした。

もうちょっとパラメータを調整しないといけないですね。