プログラムを改造する(8)
EU4パッチの技術情報です。
マップテキストの調整1
概略
特定の文字表示がずれるのを修正しています。話的には下記です。 popush.hatenablog.com
修正前
いつものやつです
修正後
マップテキストの調整2
概略
調整1だけの修正だと、その少し上でやっているテキスト転送のコードが失敗してしまいます(カウントを2つ強制的に勧めているため、エスケープ文字だけ転送されてしまう)。そのため自力でテキストを転送するように改造します。
修正前
簡単に解説すると、mov [eax+edi]で現在位置(edi)の文字をalに取り出し、1AC14C0でvar_38に転送しています。その後、var_38(eax)をvar_A4をD7CE80にecx渡ししてvar_4に転送しています。面倒な手段を取っているのは前回説明した内部のテキストの構造体の関係です。
修正後
まずエスケープ文字とその後ろの2バイトを頑張ってvar_38に転送します。ここでは転送するだけなので、UCS2を引いたりしてはいけません。
その後、var_38をちょっといじって文字数を変えます。
マップテキストの調整3
概略
ツールチップをスキップして、最近修正したものを解説します。「マップテキストの表示処理3」のバグ修正です。
マップテキストは文字の配置を(その文字の順番/全体の文字数-1)の割合で決めています。例えばFranceなら全体で6文字なので分母が5、Fは0番目なので、0/5*100=0%で左端、rは1/5=20%、aは2/5=40%、nは3/5=60%、cは4/80%、eは5/5=100%の位置に来ます。しかしパッチではカウンタを強制的に2つ進めていたため、最初の文字から2ずつづれていました。そのため、インテントされている用に見えていました。
修正
正しく修正するためにはバイト数ではなくて、文字数を取得し、いろいろやる必要があります。が、めんどうなので+2をなかったことにします。「マップテキストの表示処理3」のコードを修正してカウンタを自動変数に保存する処理を削除しました。
そしてその下で割合を求めた後に+2します。
次回プログラムを改造する(9)