Hatena::ブログ(Diary)

oupoの日記

2010-01-24

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

| 18:04

ランク

周とは別にランクという概念を導入する。

「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によってランクが決まる。

ランク範囲
ランク10〜99
ランク2100〜119
ランク3120〜139
ランク4140〜159
ランク5160〜179
ランク6180〜199
ランク7200〜219
ランク8220〜299

トレーナーの決定

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

1周目6戦目までrand % 99 + 00〜98
1周目7戦目rand % 19 + 100100〜118
2周目6戦目までrand % 39 + 8080〜118
2周目7戦目rand % 19 + 120120〜138
3周目6戦目までrand % 39 + 100100〜138
3周目7戦目rand % 19 + 140140〜158
4周目6戦目までrand % 39 + 120120〜158
4周目7戦目rand % 19 + 160160〜178
5周目6戦目までrand % 39 + 140140〜178
5周目7戦目rand % 19 + 180180〜198
6周目6戦目までrand % 39 + 160160〜198
6周目7戦目rand % 19 + 200200〜218
7周目6戦目までrand % 39 + 180180〜218
7周目7戦目rand % 19 + 220220〜238
8周目以降rand % 99 + 200200〜298

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

f:id:oupo:20100219054809j:image


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の決定方法範囲
ランク1150 - (rand % 150)1〜150
ランク2250 - (rand % 100)151〜250
ランク3350 - (rand % 100)251〜350
ランク4486 - (rand % 136)351〜486
ランク5622 - (rand % 136)487〜622
ランク6758 - (rand % 136)623〜758
ランク7894 - (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戦目での消費はちゃんと調べていない。

ネジキの手持ち

A486 - (rand % 136)ランク4と同じ
B950 - (rand % 192)準伝説あり
Lv50
プラチナHGSS
銀ネジキAA
金ネジキAB
オープンレベル
プラチナHGSS
銀ネジキBA
金ネジキBB

個体値は銀ネジキでは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周目以降を調査したので修正。

ネジキの手持ちの表を分かりやすく変更。

だだぢぢだだぢぢ 2010/01/24 18:48 お疲れさまでした。非常に分かりやすいと思います。

oupooupo 2010/01/24 20:25 どうもありがとうございます。

トラックバック - http://d.hatena.ne.jp/oupo/20100124/1264323887