ダビスタ96 完全解析

ダビスタ96のレース出走馬決定について

レース出走馬確定の流れ

レース出走馬確定の流れ順にを追いながら、数値の決定を見ていく。

自馬の出走登録

 年齢性別チェック
 →レース条件チェック
 →特殊出走条件G1チェック
 →賞金クラス判定
 →同一レース登録馬チェック
 →連闘確認
 →負担重量確認
 →遠征確認

のような流れ。
ランダム性はなく、基本は表記通りの処理なので面白い点のみ言及する。

特別な出走条件のあるG1

以下のG1に出るには優先出走権を得るか、下記の本賞金額以上が必要。
レース本賞金(万)
桜花賞1200
オークス1600
秋華賞1600
皐月賞1200
日本ダービー1600
菊花賞1600
NHKマイルカップ1600
宝塚記念 4000
ジャパンカップ6000
有馬記念5000

所有馬の同時登録

同一レース5頭目以降は断られるが、エンディング視聴可能の場合は断られない。

重量条件と負担重量

レースごとに定義された37種類の重量条件によって計算。
60kg以上で警告確認があり、別定戦で80kg以上だと断られる。

ハンデ戦の負担重量

レースのランクごとの基準人気値と馬の人気値によって決定する。
オープン1500万900万500万
基準人気値60524436
基準人気値と等しいとき56kg。
基準人気値を上回るときは人気4ごとに+1kg、ただしオープン以外(条件戦)では最大59kg。
基準人気値を下回るときは人気2ごとに-1kg、ただし最低は48kg。
4歳馬の場合は人気を-1して計算。(0.25kg~0.5kg相当なので混合ハンデ戦は馬齢系より不利)
人気100の場合でも最大66kgなのでG1複数冠の馬の場合は別定戦よりだいぶマシになる。

 人気-重量 早見表
オープン1500万900万500万
66kg100
65kg96-99
64kg92-95
63kg88-91
62kg84-87
61kg80-83
60kg76-79
59kg72-7564-10056-10048-100
58kg68-7160-6352-5544-47
57kg64-6756-5948-5140-43
56kg60-6352-5544-4736-39
55kg58-5950-5142-4334-35
54kg56-5748-4940-4132-33
53kg54-5546-4738-3930-31
52kg52-5344-4536-3728-29
51kg50-5142-4334-3526-27
50kg48-4940-4132-3324-25
49kg46-4738-3930-3122-23
48kg 0-45 0-37 0-29 0-21

ライバル馬の負担重量

馬齢やハンデの場合は自馬と同じ。
別定戦 (本賞金〇〇万毎1kg増) の場合、人気50以上で+1kg、人気70以上で+2kg。
GⅠ1着馬2kg増GⅡ1着馬1kg増(3歳戦を除く) の条件の場合、人気60以上で+1kg、人気80以上で+2kg。

ライバル馬の年齢

海外馬も含めると、ダビスタ96には2132頭のライバル馬が存在する。
それぞれに年齢と年齢サイクルが定義されていて、年数の進行とともに年をとったり、再び若返ったりしている。

ライバル馬の年齢は、開始からの年数と牧場名の最初から2文字によって決定される。
開始からの年数はメモリの7E1F1Aに2バイトで保存(1年目 = 0)。
牧場名は7E1F12からの2バイトが最初の2文字分である。
年齢基準数 = 年数(7E1F1A) + 牧場名(7E1F12) + 馬ID x 17
ただし65535を超えるとオーバーフローする。
アスキー牧場の場合、"ア","ス"はそれぞれ文字コードで0x21, 0x2Dなので
まとめて2バイト表現にすると 0x2D21 (11553)
馬齢 = 基準馬齢 + 年齢基準数 % 年齢幅
例えば、ライバル馬データの3番目、ID=2にあるオサイチジョージの場合
基準年齢4歳、年齢幅3なので3年周期で4+0~2歳、つまり4~6歳を繰り返す。
アスキー牧場の2年目(内部数値=1)の場合は
(1 + 11553 + 2*17) % 4 = 11588 % 3 = 2
4 + 2 = 6歳

レース出走馬の計算がされるタイミング

・セーブしたデータをロードするとき
・データロードした週以外で、その週初めて所有場の出走登録を行うとき
・上記以外で競馬場に行くとき
  (だと思う)

出走馬決定に使う乱数

出走馬決定ルーチンに使う乱数はメイン乱数アドレス0x7E1600(2バイト)であるが、
出走登録をして出走予定馬を確認した状態で一度ゲームをやめた場合などに矛盾が生じないようにするためか
週の開始(切替)時点に保存された乱数シードを再ロードしてから計算を開始する。

週の切り替え時 : 0x7E1600 →コピー→ 0x7E1F1E
レース出走馬計算開始時 : 0x7E1F1E →コピー→ 0x7E1600

また、途中で通常の線形合同法による乱数を用いることもあるが、
簡易だがより高速に呼べる乱数表を用いた乱数を使用することがある。

レースの計算順序

同じ週の複数のレースに同じ馬が出走しないよう、重複を避ける処理が行われている。
そのため、その週に行われるレースのうち重要度の高い(基本的に格の高い)レースから順に計算が行われる。

レースの計算順序はROMの0x290A24 以降に格納されている。
1月1週から12月4週まで、1週ごとに28バイトのデータである。
数値の意味は以下の通り、ただし0xFFはレースなしを示す値。
00 関東1R 0D 関西5R
01 関西1R 0E 地方5R
02 地方1R 0F 関東6R
03 関東2R 10 関西6R
04 関西2R 11 地方6R
05 地方2R 12 関東7R
06 関東3R 13 関西7R
07 関西3R 14 地方7R
08 地方3R 15 関東8R
09 関東4R 16 関西8R
0A 関西4R 17 地方8R
0B 地方4R 18 関東9R
0C 関東5R 19 関西9R

例えば、7月1週分のデータは0x29CCD以下の28バイトであり
16 17 13 15 14 12 10 11 18 0E 09 19 0B 0F 0D 07 0C 0A 06 03 04 05 00 01 02 08 FF FF

最初が 16 = 関西8R = 阪急杯 (G3)
2番目 17 = 地方8R = 札幌日経オープン (OP)
3番目 13 = 関西7R = エメラルドS (OP)
4番目 15 = 関東8R = 福島テレビ杯 (1500万)
最後は 08 = 地方3R = 3歳新馬
となる。

計算結果の格納場所

各レースについて確定した出走登録場(出走予定馬)は、メモリの以下の番地に格納される。
格納されている値は各2バイトで、ライバル馬のID番号 に17(0x11) を掛けたものである。
※ 17倍されているのはROMの0x28000C以降に1頭分17バイトで格納されている
 ライバル馬のパラメータにスムーズにアクセスするため。
レース先頭アドレスレース先頭アドレスレース先頭アドレス
関東1R0x7E1A2A関東4R0x7E1B4A関東7R0x7E1C6A
関西1R0x7E1A4A関西4R0x7E1B6A関西7R0x7E1C8A
地方1R0x7E1A6A地方4R0x7E1B8A地方7R0x7E1CAA
関東2R0x7E1A8A関東5R0x7E1BAA関東8R0x7E1CCA
関西2R0x7E1AAA関西5R0x7E1BCA関西8R0x7E1CEA
地方2R0x7E1ACA地方5R0x7E1BEA地方8R0x7E1D0A
関東3R0x7E1AEA関東6R0x7E1C0A関東9R0x7E1D2A
関西3R0x7E1B0A関西6R0x7E1C2A関西9R0x7E1D4A
地方3R0x7E1B2A地方6R0x7E1C4A
1レースあたり16データ(32バイト)で、16頭に満たない場合の空きは0xFFFFで埋められる。
自馬を登録した際は0xC000などが入るようだ。(検証中)

以下、各レースについて行う計算内容を見ていく。

登録頭数の決定

まず、プレイヤーの所有馬以外でそのレースに登録される頭数を計算する
G1の場合とそうでない場合で別計算を行う。

G1レースの場合

レースごとに決まっている最小登録頭数~最大登録頭数の間でランダムに決定される。
登録数 = 最小登録頭数 + DS96rand(最大登録頭数 - 最小登録頭数 + 1)
レース最小最大
阪神3歳牝馬S 13 16
朝日杯3歳S 11 16
桜花賞 16 16
オークス 16 16
秋華賞 16 16
NHKマイルカップ 16 16
皐月賞 16 16
日本ダービー 16 16
菊花賞 16 16
天皇賞・春 11 16
天皇賞・秋 13 16
エリザベス女王杯 13 16
高松宮杯 13 16
安田記念 13 16
マイルCS 13 16
スプリンターズS 13 16
宝塚記念 11 16
ジャパンカップ 12 12
有馬記念 12 16
凱旋門賞 11 11

G1レース以外の場合

賞金クラスと馬齢条件ごとに、登録馬数の多くなりやすさ(馬数Index)が決められている。
馬齢条件クラス馬数Index距離基準(芝)距離基準(ダ)
3歳 新馬 3 1700m 1700m
3歳 未勝利 3 1700m 1700m
4歳 未勝利 3 2000m 2000m
3歳 500万 2 2000m 2000m
4歳 500万 3 2000m 2000m
5歳上 500万 4 2200m 2100m
4歳上 500万 4 2200m 2100m
4歳 900万 2 2400m 2400m
5歳上 900万 4 2200m 2100m
4歳上 900万 5 2200m 2100m
5歳上 1500万 4 2400m 2400m
4歳上 1500万 5 2400m 2400m
3歳 OPEN 0 2400m 2400m
4歳 OPEN 5 2400m 2400m
5歳上 OPEN 4 2400m 2400m
4歳上 OPEN 5 --- ---
ただし、以下の場合に馬数Indexは1減少する。
・上の表にある距離基準以上の長距離レースの場合
・3000m以上の長距離レースの場合(上と重複してさらに-1される)
・3歳新馬で各月の2週目の場合

最後に、DS96rand(100)で0-99の乱数を取得し、以下の表に基づいて登録馬数を決定する。
馬数
Index
6頭 7頭 8頭 9頭 10頭 11頭 12頭 13頭 14頭 15頭 16頭
00-8
(9%)
9-23
(15%)
24-42
(19%)
43-62
(20%)
63-79
(17%)
80-89
(10%)
90-95
(6%)
96-98
(3%)
99
(1%)
- -
10-3
(4%)
4-11
(8%)
12-24
(13%)
25-41
(17%)
42-58
(17%)
59-74
(16%)
75-88
(14%)
89-95
(7%)
96-97
(2%)
98-99
(2%)
-
20-2
(3%)
3-9
(7%)
10-19
(10%)
20-35
(16%)
36-51
(16%)
52-66
(15%)
67-80
(14%)
81-90
(10%)
91-95
(5%)
96-98
(3%)
99
(1%)
30-1
(2%)
2-7
(6%)
8-16
(9%)
17-29
(13%)
30-44
(15%)
45-59
(15%)
60-73
(14%)
74-84
(11%)
85-92
(8%)
93-97
(5%)
98-99
(2%)
40
(1%)
1-2
(2%)
3-9
(7%)
10-21
(12%)
22-35
(14%)
36-50
(15%)
51-64
(14%)
65-76
(12%)
77-86
(10%)
87-94
(8%)
95-99
(5%)
5- 0-1
(2%)
2-5
(4%)
6-15
(10%)
16-28
(13%)
29-43
(15%)
44-58
(15%)
59-70
(12%)
71-81
(11%)
82-91
(10%)
92-99
(8%)

登録馬の決定

ここからは、レースのクラスごとに若干違った計算を行う。
その前に、ライバル馬のカテゴリ分けについて説明しておく。
2132頭のライバル馬は、6つのカテゴリに分けられている。
カテゴリID馬名ID馬名備考
10サクラホクトオー361リスクフローラオープン馬級
2362アームバンガード769ネオタイクーン~1500万
3770イシタキ1379ワイドトッキュウ~900万
41380アウローラ2026テイエムブランド~500万
52027ベストナイン2046ユキノコンコン未勝利級
62047ベタールスンアップ2131カーリング海外馬
海外馬のカテゴリ6を除き、カテゴリ1→カテゴリ5の順にランクの低い馬の扱いになる。

オープン以外のクラスのレースの場合

出走可能性のあるライバル馬が、上記カテゴリ1-5の組み合わせで定義されている。
レースカテゴリ1カテゴリ2カテゴリ3カテゴリ4カテゴリ5
3歳新馬(1-2週目)
3歳新馬(3-4週目)×
3歳未勝利××
4歳未勝利×××
3歳500万××
4歳500万×××
5歳上500万××××
4歳上500万××××
4歳900万×××
5歳上900万××××
4歳上900万××××
1500万××××
新馬戦は前半のみに強敵が出るなど、細かい設定がされているのがわかる。

対象カテゴリの馬に対して、番号が若い順に計算を行う。
現年齢が出走条件に合わない場合、父内国産や性別が出走条件に合わない場合、既にその週の他のレースに登録確定している馬 については以下の計算は行わずにスキップする。
出走条件に合う場合、1頭ごとに登録優先度を計算する。
まず、ライバル馬のデータに存在する0-3の出走傾向タイプと、レースの距離および芝・ダートによるカテゴリから基礎優先度を出す。
距離種別
カテゴリ
条件タイプ0
優先度
タイプ1
優先度
タイプ2
優先度
タイプ3
優先度
芝短距離芝 1000m - 1400m 24 56 40 0
芝マイル芝 1500m - 1600m 32 56 48 0
芝中距離芝 1700m - 2000m 32 32 56 48
芝長距離芝 2200m - 3600m 32 0 48 56
ダ短距離ダ 1000m - 1500m 56 48 32 0
ダ長距離ダ 1600m - 3600m 56 32 48 40
おそらく、以下のような特徴づけだと思われる。
タイプ0 = ダート馬
タイプ1 = スプリンター
タイプ2 = バランス型
タイプ3 = ステイヤー
※条件馬の出走傾向を再現するための処理なためか、オープン級(カテゴリ1)の馬は全て未設定(0)。
 →月の前半の新馬戦では例外的にランダム出走の計算対象になり、ダート馬として扱われる。
  そのため、1~2週目のダート新馬戦には強豪馬が出やすい傾向になると思われる。

次に遠征補正を行う。各騎手には月ごとに主戦場にする地域(関東,関西,地方,いずれでもない)がある。
レースの開催地がライバル馬に設定されている主戦騎手のその月の担当地域と一致しない場合、
遠征扱いになり上記の基本優先度が半減する。(選ばれにくくなる)

3歳レースの場合、さらに全馬一律で半減される。
これは各馬の特徴づけを薄める方向に働く。

これに0-63の簡易乱数を足して登録優先度になる
…のを意図したプログラムだと思われるが、実際は0-255の乱数を4で割る時に四捨五入が入ってしまっていて
実際は以下のような0-64の乱数が足されている。
X = FAST96rand(256)
登録優先度 = 基本優先度 + X/4 + (X%4)/2
出走可能性のあるすべての馬に対してこの計算を繰り返し、前に計算した登録頭数まで仮追加していく。 登録頭数を超えた場合は、すでに仮追加された馬のうち最も登録優先度の低いものと登録優先度の比較を行い、 新しい馬の方が登録優先度が高い場合は入れ替える。
(逆に言えば、登録優先度が等しい場合は先に計算したほうが優先となる条件で優先度の高い馬だけを残す)

出走可能性のあるすべての馬に対して計算が終わった段階で、登録頭数内に選ばれた馬は登録確定として、 これ以降に計算されるほかのレースには出走登録されないようにフラグがつけられる。
0x7E1A2A以降にある保存領域に計算結果をコピーして終了。

オープンクラスのレースの場合

オープンクラスのレースには、優先的に出走する固有のオープン馬がそれぞれに定義されている。
このテーブルに記述されている順に、1頭ずつ登録優先度を計算していく。
事前に計算した現年齢が出走条件に合わない場合や、既に他のレースへの出走が確定している場合はスキップ。
基本優先度=120、ただし現年齢が4歳で出走条件が4歳上の場合のみ基本優先度=116になる。
(4歳馬が古馬に混ざる出走はやや控えられるということ)
これに0-64の簡易乱数を足して登録優先度になる
X = FAST96rand(256)
登録優先度 = 基本優先度 + X/4 + (X%4)/2
レースに割り当てられた固有オープン馬すべてに対してこの計算を繰り返し、前に計算した登録頭数まで仮追加していく。 登録頭数を超えた場合は、すでに仮追加された馬のうち最も登録優先度の低いものと登録優先度の比較を行い、 新しい馬の方が登録優先度が高い場合は入れ替える。
(逆に言えば、登録優先度が等しい場合は先に計算したほうが優先となる条件で優先度の高い馬だけを残す)

レースに割り当てられた固有オープン馬すべてに対して計算が終わった段階で、登録頭数内に選ばれた馬は仮確定として、 これ以降に計算されるほかのレースには出走登録されないようにフラグがつけられる。

次に、年齢条件に合う固有オープン馬が少なかった場合の欠員の補充(格上挑戦?)の計算を行う。
補充候補は以下のカテゴリから選ばれる。
レースカテゴリ1カテゴリ2カテゴリ3カテゴリ4カテゴリ5
3歳OPEN××
4歳OPEN×××
5歳上OPEN××××
4歳上OPEN××××
対象カテゴリの馬に対して、番号が若い順に計算を行う。
各馬に対する計算方法は、オープン以外のクラスのときと全く同じである。
好みの距離かつ遠征でなく、最高の乱数(64)を引いた場合でも 56 + 64 = 120 なので ランダムな補充要員が固有オープン馬(120+乱数の優先度)を押しのけることは基本的に発生しない。
ただし、4歳馬の4歳上参戦ペナルティがある場合は稀に交換が起こることがある。
その場合でも既に付いた出走確定フラグを消すことはないので、押しのけられた4歳オープン馬はその週のほかのレースの計算から除外されたままである。

ランダム補充分の計算も全て終えたところで、登録頭数内に選ばれた馬は登録確定となり、 これ以降に計算されるほかのレースには出走登録されないようにフラグがつけられる。
0x7E1A2A以降にある保存領域に計算結果をコピーして終了。

調査中

自馬登録時の騎手選択、除外判定(16頭→12頭)などは今後調査予定。
inserted by FC2 system