「乱数解析」の編集履歴(バックアップ)一覧に戻る
乱数解析 - (2008/07/26 (土) 19:42:30) のソース
**ある程度のゲーム知識が必要になります *あくまでもエミュを使用して調査した物であり、実機とは異なっているかもしれません ---- *事前調査 何も1から自力でやるのではなく、すでに誰かが解明しているものならば わざわざ自分でやらなくても良いのです (マイナーなゲームだと望みは薄いですが) Google先生に聞いてみると乱数表は既に解析されているようです ※初出はEDRというサイトらしいですが既に閉鎖しているようです |>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|CENTER:EDR乱数表| |00|55|11|67|23|79|35|91|46|02|58|14|70|26|82|37| |93|49|05|61|17|73|28|84|40|96|52|08|64|19|75|31| |87|43|99|55|10|66|22|78|34|90|46|01|57|13|69|25| |81|37|92|48|04|60|16|72|28|83|39|95|51|07|63|19| |75|30|86|42|98|54|10|66|21|77|33|89|45|01|57|12| |68|24|80|36|92|48|03|59|15|71|27|83|39|94|50|06| |62|18|74|30|85|41|97|53|09|65|21|76|32|88|44|00| |56|12|67|23|79|35|91|47|03|58|14|70|26|82|38|94| |50|05|61|17|73|29|85|41|96|52|08|64|20|76|32|87| |43|99|55|11|67|23|78|34|90|46|02|58|14|69|25|81| |37|93|49|05|60|16|72|28|84|40|96|51|07|63|19|75| |31|87|42|98|54|10|66|22|78|33|89|45|01|57|13|69| |25|80|36|92|48|04|60|16|71|27|83|39|95|51|07|62| |18|74|30|86|42|98|53|09|65|21|77|33|89|44|00|56| |12|68|24|80|35|91|47|03|59|15|71|26|82|38|94|50| |06|62|17|73|29|85|41|97|53|08|64|20|76|32|88|44| 使い方はとりあえず置いておきます この乱数表に対してよく言われているのが 「大→小→大→小を繰り返している」 ということです(サーチする時に参考になるので覚えておきましょう) 乱数表がわかったので、後は現在の乱数がわかれば運操作できるかもしれません 乱数はゲーム中にフレーム単位で変化するらしいです (FE聖戦などのフレーム経過で変化しないものもある) 乱数はどこかのアドレスに入っているはずなので 改造コードをサーチするような感じで判明するでしょう ---- **ここからエミュの出番です *乱数アドレスをサーチ とりあえず動かして"ゲーム部分"まで進めます タイトル画面やデータ選択画面等でサーチするのは賢明ではありません 具体的にいうと "第一章の初めの会話が終わってカーソルが動かせるようになった所まで"進めます ***上部メニューから Cheat → Search for New Cheats(active)を選択 するとサーチウインドウがでてきます 各オプションは -Comparison Type(検索方法) --Not Equal To(不一致) -Compare To(どれと) --Previous Value(前の数値) -Data Type(データ形式) --Unsigned(符号なし) -Data Size(データサイズ) --1 byte(1バイト) に設定します 各意味の説明は省きますが **"常に変動している数値"はこうやってサーチする と覚えてもいいかもしれません(見つからなかったらデータサイズやデータ形式を変えてみましょう) 右上にあるResetボタンを押してからゲームを少し動かします その後、Searchボタンを押すと何個かのアドレスに絞れます 今回のケースでは9個に絞れました (場合によって違いますが、だいたい似たような結果になります) 更にゲームを動かしてみましょう サーチウインドウではリアルタイムに数値が変わっていきます その中で -ランダムに数値が変わっているもの -変化が早いもの が乱数と思われるアドレスです 結果として -7E046B -7E046C が候補として残りました これらをそれぞれ選択した状態で右にあるWatchボタンを押すことで 常に画面に表示されるようになります *コマ送りで数値を観察 Pauseキーでゲームが一時停止されます その状態で\キーを押すと1フレームずつ進められます しばらくポチポチ押して乱数を観察してみましょう 7E046Cの数値が大→小→大→小を繰り返しているのがわかると思います 試しにこのアドレスの数値を固定してみましょう 改造コードでいうと"7E046C53"です ※試し斬りの前にQSしておきましょう(Shift+F10でセーブ F10でロード) マルスで下の盗賊を攻撃してみます すると何度やっても必殺がでるはずです (出ない場合は改造コードが正しく入力されているか、改造コードがチェックされているか、Cheat → Appry Cheats がチェックされているかを確認してください) つまりこれが乱数のアドレスということです ---- 乱数を見ていると、EDR乱数表にはない数値がでてきます それは実際の乱数は0~255であり、EDR乱数表は見やすいように0~99に直した物だからです(多分) これでは乱数から乱数表の位置がわからないので、自力で乱数表を作成しなければいけません で、出来たものがこれ |>|>|>|>|>|>|>|>|>|>|>|>|>|>|>|CENTER:自力乱数表| |000|143|030|173|060|203|090|233|120|007|150|037|180|067|210|097| |240|127|014|157|044|187|074|217|104|247|134|021|164|051|194|081| |224|111|254|141|028|171|058|201|088|231|118|005|148|035|178|065| |208|095|238|125|012|155|042|185|072|215|102|245|132|019|162|049| |192|079|222|109|252|139|026|169|056|199|086|229|116|003|146|033| |176|063|206|093|236|123|010|153|040|183|070|213|100|243|130|017| |160|047|190|077|220|107|250|137|024|167|054|197|084|227|114|001| |144|031|174|061|204|091|234|121|008|151|038|181|068|211|098|241| |128|015|158|045|188|075|218|105|248|135|022|165|052|195|082|225| |112|255|142|029|172|059|202|089|232|119|006|149|036|179|066|209| |096|239|126|013|156|043|186|073|216|103|246|133|020|163|050|193| |080|223|110|253|140|027|170|057|200|087|230|117|004|147|034|177| |064|207|094|237|124|011|154|041|184|071|214|101|244|131|018|161| |048|191|078|221|108|251|138|025|168|055|198|085|228|115|002|145| |032|175|062|205|092|235|122|009|152|039|182|069|212|099|242|129| |016|159|046|189|076|219|106|249|136|023|166|053|196|083|226|113| これで乱数表と乱数アドレスが揃いました 後はこれらの使い方です 具体的にいうと計算方法を解析します 先ほどの改造コードで、なぜ必殺が出たのでしょう? まず固定した数値「83」 乱数表の一番下の段の右から3番目にあります そこからの乱数を書き出してみると 083 226 113 000 143 030 となっています ここで怪しいのは4番目の「000」 試しに4番目が「255」になるように「82」で固定してみると通常攻撃になります これを踏まえて調査していきましょう ---- *乱数と命中率、必殺率の関係を調査 サンプル |>|>|>|>|>|CENTER:命中率が83、必殺率が10の時| |結果|固定した乱数|2番目|3番目|4番目|5番目| |通常|082|225|112|255|142| |必殺|083|226|113|000|143| |必殺|108|251|138|025|168| |通常|109|252|139|026|169| このケースでは必殺がでる許容範囲が0~25のようです 必殺のことは置いといて、命中率を見てみましょう |>|>|>|>|>|CENTER:命中率が83、必殺率が10の時| |結果|固定した乱数|2番目|3番目|4番目|5番目| |通常|185|072|215|102|245| |ミス|186|073|216|103|246| |ミス|225|112|255|142|029| |通常|226|113|000|143|030| 3番目の乱数に注目します 255と000で結果が変わっています 命中する許容範囲が0~215のようです 命中率を変えてサンプルをとってみます |>|>|>|>|>|CENTER:命中率が95の時| |結果|固定した乱数|2番目|3番目|4番目|5番目| |通常|215|102|245|132|019| |ミス|216|103|246|133|020| |ミス|225|112|255|142|029| |通常|226|113|000|143|030| 許容範囲が0~245に広がっています どうやら3番目が命中、4番目が必殺の判定に使用する乱数で ゲームでの数値(0~100)が大きいと乱数の数値(0~255)も大きいということのようです ここでEDR乱数表と自力乱数表を見比べてみます |自力|EDR| |025|09| |215|83| |245|95| となっています 合っているようで微妙に違っています EDRでは0~99なので(ゲーム数値-1)で見るはず つまり必殺率10ならEDRの0~9で必殺のはず しかし命中83ならEDRの0~82で命中のはずなのに 83で命中しています これは計算式が違うからです ---- *各種計算式 **情報提供により、正確な計算式がわかりました コメントで情報提供してくれた方、詳しく教えてくれた方、ありがとうございました *命中率 **(乱数×100)÷256(小数点以下切捨て)≦実効命中率 実効命中率というのは戦闘画面で表示される命中率のことです &s(){(実効命中率+1)×2.56=命中度(小数点以下切捨て)} &s(){乱数≦命中度で命中} &s(){命中率83なら83+1で84} &s(){84×2.56で215(小数点以下切捨て)} &s(){{これで調査結果と合いました} &s(){命中率+1ということは命中率が0の場合おかしくなるのではないか} &s(){と思う方もいるかもしれません} &s(){計算してみると} &s(){0+1で1} &s(){1×2.56で2} &s(){となり、乱数が0~2の時に命中してしまうことになります} &s(){やってみるとわかりますが、実際に命中します} &s(){命中が99の場合も+1で100になり} &s(){100×2.56で256} &s(){乱数は0~255なので100%命中します} &s(){(この辺のバグっぽい挙動はあまりサンプルをとってないので間違っている可能性があります)} *必殺率 **(乱数×100)÷256(小数点以下切捨て)<実効必殺率 &s(){実効必殺率×2.56=必殺度(小数点以下切捨て)} &s(){乱数≦必殺度で必殺} &s(){必殺度が0だと出ない} *成長率 **(乱数×100)÷256(小数点以下切捨て)<成長率 &s(){成長率×2.56=成長度(小数点以下切捨て)} &s(){乱数≦成長度で成長} &s(){成長度が0だと成長しない} ---- *乱数の使用順 まだ調査中であるため間違っている可能性が大きいです **暫定乱数判定使用順 |>|攻撃した側|>|攻撃された側|>|再攻撃|>|>|>|>|>|>|>|成長| |命中|必殺|命中|必殺|命中|必殺|力|技|速|運|守|魔|HP|武| *乱数が飛ぶケース -攻撃された側が死亡する場合の攻撃された側 -攻撃された側が反撃不能の場合(間接攻撃や無装備)の攻撃された側 -命中しない場合の必殺 -ダメージが0の場合の必殺 -再攻撃がない場合の再攻撃 -成長しない場合の成長 *敵軍ターンで乱数が飛ぶ現象 敵軍ターンでは2フレームにまたがって乱数判定計算する場合があり その間で「1フレームごとに乱数が進む」という処理が入ることによって 乱数が1つ進むことがある この現象により、本来ありえない事(低い成長率のパラメータが同時に上がる等)が起こるかもしれません ---- #pcomment(reply,noname,fem04)