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で決定されます。

コメント