プログラムを改造する(9)
EU4パッチの技術情報です。
前回
バグ修正
下記の記事で修正したときに混入したバグを直します。
var_630というのがいますね。これは元々いませんでした。
いないのに上書きするとメモリが破壊されて死にます。
修正
ルーチンの最初でローカル変数用の領域を確保しています。0x630に書き込むためには0xC(3回push)しているので、0x630 - 0xC = 0x624に修正する必要があります。
ツールチップの修正1
内容的にはこのあたりです
修正前1
文字転送です。
修正後1
エスケープだけ転送されてしまうのを防ぎます。
修正前2
修正前1の下の方にあるいつものやつです。
修正後2
ツールチップを直していたはずですが、何故かボタンのテキストの位置が調整されました。
ツールチップの修正2
いつものやつです
修正前
修正後
ツールチップの修正3
内容的にはこのあたりです。 popush.hatenablog.com
ツールチップの改行位置の特定ですが、1文字づつ幅を計算して・・・とはいきません。改行位置の特定は二分探索で行われるからです。全体の文字列がNあったらN/2の文字列の長さを計算し、表示に余裕があれば、N/4を足して・・といった感じです。ここで問題なのが文字列の長さ=バイト数なので、エスケープされた文字列に対してはうまくいきません。そこで、文字列の長さを計算する関数を改造して、文字列の長さを正しく返却するようにします。
修正
ツールチップの修正2を更に修正します。バイトがはみ出たら強制的にループを抜けるようにします。
次回はプログラムを改造する(A)です。