パンヤというゴルフゲームは「真ん中で止める」のがほとんどすべてであるが
フィーリングで補う部分も多数ある。その多数が、内部ではプログラムによって処理されている

今回は、まず風について、プログラムから推測される現実、すなわち正解を知ること
地道ではあるがスコアに直結する知識となろう


pang_wind

まずは風速であるが

8B3D 58C79900 MOV EDI,DWORD PTR DS:[<&msvcr71.rand>]
75 0C         JNE SHORT 0047A925
FFD7          CALL EDI
99            CDQ
B9 09000000   MOV ECX,9
F7F9          IDIV ECX
8ADA          MOV BL,DL



<&msvcr71.rand>の文字列のとおり乱数を発生させているんだな、とわかれば十分である
アセンブラを直訳すると

msvcr71.dllのrand関数の存在するメモリ上のアドレスを「EDI」に格納し、CALL EDIによってrand関数を実行
する
EAXに乱数が入った後、CDQにより符号拡張して乱数をEDX:EAXに格納する
ECXに9を入れる
EDX:EAXの値をECXで割って、商をEAX、余りをEDXに格納する
EDXの下位1バイトであるDLをBLに格納する

これを簡単に言えば
乱数を9で割った余りをBLに格納する。9で割った余りは必ず0〜8の9種類になる


次に風向であるが、ほとんど同じ内容であるから直訳はしない

FFD7          CALL EDI
99            CDQ
B9 FF000000   MOV ECX,0FF
F7F9          IDIV ECX
885424 50     MOV BYTE PTR SS:[ARG.20],DL

10進数の255(16進数のFF)で割った余りの下位1バイト「DL」の値をARG.20(スタックの20番目)の位置に格納する
余りは0〜254の255通り



こちらはスタックの内容
windstack

ESP値が12EC0Cでベーススタック、その20番目の値に格納するというわけだ
スタック内には複数の数値が格納されているが、たとえばコース情報(ID)などが入っているだろうと予測することができる


ほとんど解析が終わっているとされる現在のパンヤ事情
パンヤ情報なんてのはこれぐらい突っ込んだ内容でなければ価値がないうえ
ランカーにもなればこれぐらいのことは(死ぬほどパンヤしているので)想像がつく
すなわち、記事としての価値を得るためにはこれぐらいの内容が当然である


一般人とランカーの差というものは、単なるデータという知識、計算力、パンヤ止め力だけでなく
プログラム内の処理をある程度知っている。ここが絶対的な識差になっている
制作したプログラマ並みにパンヤのことを知っているわけだ
もはやこの程度の内容が常識になりつつあるといえる


次回はこの続きを追っていく内容である
風速がこのままでは0〜8である。画像をみていただければ想像はつくだろうが
「FADD」命令であるとか、FLOAT 1.0000という数値が見える
その後の処理の流れを次回に紹介していこうと思う

本気で読んでいる方、各自、一個一個の処理の流れを自分で考えて欲しい
コンピュータの中身は、非常に単純な動作の集合体であるから、誰でも理解できるはずだ


使用しているデバッガはollydbg。今後もこれをメインとしつつ
利便性のため別のツールを使うこともある