MENU

【Elin】ブラックマーケットと舶来商人の差【コード解析ベース】

Elin(エリン)、ゲームコード解析ベースで、ブラックマーケットと舶来品商人の差について解説しています。

目次

Trait.CreateStock(ブラックマーケットと舶来商人の分岐)

TraitクラスのcreateStock関数には、商人の品揃えを更新する際、アイテム1個1個の生成処理が書いてあります。

そこに以下のような分岐があります。

public Thing CreateStock()
            {
                switch (ShopType)
                {
                ......
                case ShopType.Weapon:
                    return FromFilter("shop_weapon");

                case ShopType.Gun:
                    if (EClass.rnd(8) == 0)
                    {
                        return Create("mod_ranged");
                    }
                    return FromFilter("shop_gun");

                case ShopType.Blackmarket:
                case ShopType.Exotic:
                {
                    int num = 30;
                    if (Guild.Thief.IsCurrentZone)
                    {
                        num = 25;
                    }
                    if (Guild.Merchant.IsCurrentZone)
                    {
                        num = 15;
                    }
                    if (EClass.debug.enable)
                    {
                        num = 1;
                    }
                    CardBlueprint.SetRarity(
                      (EClass.rnd(num * 5) == 0) ? Rarity.Mythical : 
                      ((EClass.rnd(num) == 0) ? Rarity.Legendary : 
                      ((EClass.rnd(5) == 0) ? Rarity.Superior : Rarity.Normal))
                    );

                    return FromFilter("shop_blackmarket");
                }
  • ショップタイプによって、呼ばれる処理が異なります。
  • ショップがBlackmarket(ブラックマーケット)、Exotic(舶来商人)の場合、同じ処理が呼び出されます。
  • 盗賊ギルド内の場合num=25、商人ギルド内の場合num=15、それ以外の場合はnum=30が代入されます
  • numを使って品質を決定します。
    • 0 ~ num * 5で乱数生成し、0なら神器になります。
    • 0 ~ num で乱数生成し、0なら奇跡になります。
    • 0 ~ 5で乱数生成し、0なら高品質になります。
    • それ以外の場合、通常品質になります。
(自宅)ブラックマーケット(舶来商人)
(num=30)
(神器)1 / 150
(奇跡)1 / 30
(高品質)1 / 5
(盗賊ギルド)ブラックマーケット
(num=25)
(神器)1 / 125
(奇跡)1 / 25
(高品質)1 / 5
(商人ギルド)舶来商人
(num=15)
(神器)1 / 75
(奇跡)1 / 15
(高品質)1 / 5

生成されるアイテムの品質を固定したら、FromFilter関数を、”shop_blackmarket”を引数にして呼びます。(舶来もブラックマーケットも同じ処理)

FromFilterの処理(アイテム生成呼び出し)

FromFilterは、createStock内で以下のように宣言されています。

Thing FromFilter(string s)
                {
                    return ThingGen.CreateFromFilter(s, ShopLv);
                }

ThingGen.CreateFromFilter、アイテム生成の処理を呼び出すだけです。

引数としてsが渡されます。今回のブラックマーケットvs舶来商人の場合は、どちらもshop_blackmarketが渡されています。

ShopLvはその名の通り、店の投資規模です。これがエンチャント生成強度等に影響します。

つまり、「shop_blackmrketタグで生成可能なアイテムを、ショップレベル相当の生成強度で作って」という意味です。

createStock()はThing型なので、戻り値として、最終的に生成されたアイテムを戻します。

ShopLv

ShopLvはtrait.cs内で、以下のように定義されています。

public virtual int ShopLv => Mathf.Max(1, EClass._zone.development / 10 + owner.c_invest * (100 + Guild.Merchant.InvestBonus()) / 100 + 1);
  • ShopLv = 街の発展度 + 商人の投資規模 * (1 + 商人ギルドのボーナス) + 1です。
  • _zone.developmentは街の発展度です。(未確定)
    • コード内では街の発展度 / 10されているように見えますが、TraitSecretary.cs内で表示される際にも1/10されており、プレイヤーが見える数字と同じです。
  • c_investは商人の投資規模です。(未確定)
  • 商人ギルドのボーナスはギルドランク6で10%です。(未確定)

未確定の部分が多い(各種変数についての認識が正しいものか調べきれない)ですが、ショップから呼び出されるモンスターボールの生成処理が以下のようになっており、shopLv+40が生成されるモンスターボールの最大Lvになっています。

ゲーム内の挙動と一致することから、この認識をある程度正しいものとします。

Create("monsterball").SetLv(40 + EClass.rnd(ShopLv)).Thing;

まとめ:舶来とBMは同じ

舶来品商人とブラックマーケットは全く同じアイテム生成処理を呼んでいます。

それぞれ、盗賊ギルド内、商人ギルド内でのみ、生成される装備の神器・奇跡抽選率が上がります。

また、生成されるアイテムのエンチャント強度はtrait.ShopLVで決定されます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次