バトルファクトリーまとめ

ランク

周とは別にランクという概念を導入する。
「2周目では6戦目までは1周目と2周目のトレーナー、7戦目は3周目トレーナーが登場する」より「2周目では6戦目まではランク1とランク2のトレーナー、7戦目はランク3のトレーナーが登場する」と書いた方が分かりやすいと思うから。

乱数

ポケモンでいつも使われている線形合同法の乱数列が使われる。

NewSeed = (Seed * 0x41c64e6d + 0x6073) & 0xffffffff
Rand = NewSeed >> 16

剰余演算

xをyで割ったあまりを x % y という式で表すことにする。

流れ

  1. 7戦分のトレーナー決定 (トレーナーA)
  2. 実際には使われることがないトレーナーの決定 (トレーナーB)
  3. 最初の6匹の決定
  4. 1戦目の相手の手持ち決定
  5. プレイヤーによる選出決定・1戦目の戦闘開始
  6. n=2 から n=7 まで以下の処理を行う
    1. n戦目の相手の手持ち決定
    2. プレイヤーによる交換決定・n戦目の戦闘開始

トレーナー

出てくる対戦相手のNPC(トレーナー)は300人。0〜299までのIDをそれぞれに振る。
名前はバトルタワーのトレーナー(プラチナ/ハートゴールド・ソウルシルバー) - ポケモンの友/ポケモンデータ集参照。
トレーナーのIDによってランクが決まる。

ランク 範囲
ランク1 0〜99
ランク2 100〜119
ランク3 120〜139
ランク4 140〜159
ランク5 160〜179
ランク6 180〜199
ランク7 200〜219
ランク8 220〜299

トレーナーの決定

乱数を1消費してトレーナーを決定する。

1周目6戦目まで rand % 99 + 0 0〜98
1周目7戦目 rand % 19 + 100 100〜118
2周目6戦目まで rand % 39 + 80 80〜118
2周目7戦目 rand % 19 + 120 120〜138
3周目6戦目まで rand % 39 + 100 100〜138
3周目7戦目 rand % 19 + 140 140〜158
4周目6戦目まで rand % 39 + 120 120〜158
4周目7戦目 rand % 19 + 160 160〜178
5周目6戦目まで rand % 39 + 140 140〜178
5周目7戦目 rand % 19 + 180 180〜198
6周目6戦目まで rand % 39 + 160 160〜198
6周目7戦目 rand % 19 + 200 200〜218
7周目6戦目まで rand % 39 + 180 180〜218
7周目7戦目 rand % 19 + 220 220〜238
8周目以降 rand % 99 + 200 200〜298

トレーナー決定の範囲を図に表すと以下のようになる。

7戦分のトレーナーの決定 (トレーナーA)

「トレーナーの決定」を7戦分行う。重複があった場合はスキップする。
3周目と7周目の7戦目はネジキなので6戦分しか決定しない。

実際には使われることがないトレーナーの決定 (トレーナーB)

トレーナーAとは別にもう一度トレーナーを決定する。これは恐らくマルチバトル用のトレーナーの決定かと思われる。
トレーナーAとの重複もスキップされる。

  • プラチナでは7人目でも6人目までと同じ決定方法をとる
  • 2周目と6周目では6人分しか決定しない

最初の6匹の決定

  1. {ポケモンの種類の決定}×6匹分
  2. {親IDと性格値決定}×6匹分
  3. シャッフル

基本的に現在の周と同じランクで種類が決定される。
交換回数 / 7 (切捨て)の数だけ一つの上のランクのポケモンが出てくる。これをボーナスポケモンと呼ぶことにする。交換回数とは受付の成績で見ることが出来る値。

  • 6 - min(floor(交換回数 / 7), 5) の数だけランクnのポケモン
  • min(floor(交換回数 / 7), 5) の数だけランクn+1のポケモン

通常のランクのポケモンの種類が先に決定され、ボーナスポケモンは後に決定される。
種類の決定は種族の重複、アイテムの重複があった場合そのポケモンはスキップされる。

ポケモンの種類の決定

ポケモンの型の種類は950。1〜950までのIDをそれぞれに振る。
データはバトルタワーのポケモン(プラチナ/ハートゴールド・ソウルシルバー) - ポケモンの友/ポケモンデータ集参照。
乱数を1消費して、種類を決定する。
オープンレベルでは種類はランクを+3して決定する。

ランク IDの決定方法 範囲
ランク1 150 - (rand % 150) 1〜150
ランク2 250 - (rand % 100) 151〜250
ランク3 350 - (rand % 100) 251〜350
ランク4 486 - (rand % 136) 351〜486
ランク5 622 - (rand % 136) 487〜622
ランク6 758 - (rand % 136) 623〜758
ランク7 894 - (rand % 136) 759〜894
ランク8以降(A) 950 - (rand % 328) 623〜950
ランク8以降(B) 950 - (rand % 600) 351〜950
ネジキ(準伝説あり) 950 - (rand % 192) 759〜950
ランク8以降について

オープンレベルの最初の6匹の7周目まではA。
Lv50 オープンレベルともに8周目以降の最初の6匹、7周目のボーナスポケ、相手の手持ちはB。

ポケモンの親IDと性格値の決定

乱数を2つ消費して親IDを決定。(1つ目が表ID、2つ目が裏ID)
乱数を2つずつ消費して性格値を生成。ポケモンごとに決められた性格になり、色違いでなければそれを採用。

最初の6匹のシャッフル

最初の6匹は決定された順番そのままにはならない。並び順がシャッフルされる。これはボーナスポケモンが後ろに固まらないように行っているものと考えられる。
インデックスは0 originとする

  1. 4番目と(rand % 6)番目を入れ替え
  2. 5番目と(rand % 6)番目を入れ替え

合計で乱数2消費。

個体値

ポケモン個体値はランクが7以下ならば(ランク - 1) * 4、ランクが8以上ならば31となる。
このランクは、ポケモンの種類の決定のときのようにオープンレベルでは値が増えるということはない。

相手トレーナーの手持ち決定

相手の手持ちの決定はその直前の交換の前に行われる。1周目で交換する前に相手の手持ちを教えてくれることを考えれば自明。プレイヤーの手持ちになる可能性があるポケモンとは種族やアイテムが重複しないように決定される。
プレイヤーの手持ちになる可能性があるポケモンとは具体的に以下の通り

  • 1戦目の場合は最初の6匹
  • 2戦目以降の場合は一つ前の戦闘時のプレイヤーの手持ちと相手トレーナーの手持ちの合計6匹

相手トレーナーの手持ちはトレーナーのランクのポケモンになる。
最初の6匹と同じように種類の決定、親IDと性格値の決定が行われる。ただし、相手の手持ちはシャッフルは行われない。

1戦ごとの乱数消費

相手トレーナーの手持ちを決定するごとに固定個数の乱数消費がある。何に使われているかは不明。

1周目1戦目 24
1周目2戦目以降 6
2周目1戦目 相手がランク1の場合42, ランク2の場合48
2周目2戦目以降 相手がランク1の場合6, ランク2の場合12
3〜4周目1戦目 48
3〜4周目2戦目以降 12
5周目以降1戦目 60
5周目以降2戦目以降 24

7戦目での消費はちゃんと調べていない。

ネジキの手持ち

A 486 - (rand % 136) ランク4と同じ
B 950 - (rand % 192) 準伝説あり
Lv50
プラチナ HGSS
銀ネジキ A A
金ネジキ A B
オープンレベル
プラチナ HGSS
銀ネジキ B A
金ネジキ B B

個体値は銀ネジキでは12、金ネジキでは31である。

ネジキの言ってくるパーセント

rand % 90 + 10 で決定される。
決定されるタイミングはネジキの手持ちが決定され、1戦ごとの消費が行われた後。

追記 (2010-01-24T23:26:48+09:00)

3周目のトレーナーBの消費を調査したので追記

追記 (2010-02-15T18:12:20+09:00)

7周目まで調査したので修正。修正内容はHistory for 2010-01-24-1264323887.txt - oupo/hatenadiary-oupo · GitHubを参照。

追記 (2010-02-19T03:11:49+09:00)

8周目以降を調査したので修正。
ネジキの手持ちの表を分かりやすく変更。