ぺんちゃん日記

食と歴史と IT と。 Web の旅人ぺんじろうが好奇心赴くままに彷徨います 。

【AutoHotkey】千年戦争アイギスのアシストスクリプトを修正した。

f:id:yasushiito:20190403184928p:plain
ドラッグアンドドロップできない私が千年戦争アイギスをプレイするために用意したドラッグアンドクリックアシストスクリプトがあります。
以前から時々反応しないことがあるなと思いながらも気のせいにしてきました。
今週に入って明らかに反応しないケースが頻発しました。
具体的に言うとクリック連打防止処理が作動してクリックしないことがある。
この連打防止機能がないと、ステータスが出たり消えたりしてしまって好きなタイミングでスキル発動できないことになってしまいます。
そこで、一度クリックしたらマウスポインターをぐいっと動かすならクリックを防止するようにしました。
そこの判定でバグってるとクリックして欲しい時に反応してくれない。
そして今紛れもなくその現象が起こっている。

これは気のせいじゃないし、放置していたらゲームにならないなと重い腰をあげながらクソコードと向き合ってみました。



一番怪しいのは画像認識部分
処理が間に合っていないか、ゲーム画面のデザインが微妙に変わったか

次に怪しいのがぐいっと動いた判定。
座標保存しているのだけど、フラグとしての判定にも使っていて正直ややこしい。
タイマー割り込みで何回かに一回だけに 関係するので間違いやすい。

次に怪しいのはタイマー割り込み。
画像認識処理が重すぎて次のタイマー割り込みまでに間に合わなくてこけているのではないかな。
こういう処理は慣れてないからデバック方法がいまいちわからない。
画像認識処理を他の手段に変更するわけにはいかないし。
でもdocumentを見ると、次の割り込み時間がやってきても今の処理が終わるまで中止しないようだ。
多分大丈夫なんだろうなぁ。

次に悔しいのはカリスマ消費。
デバッグのためにミッションに入るもののゲームは待ってくれない。
イベントがちょうど悪霊の迷宮なのでゲームをクリアしながらテストしているんだけど、ドロップコンプしながら動作を見定めるのすごく難しい。
スキルを使いたい時に障害が発生するから度々ミッションミスするし。
気がついたらミッション遂行のためにゲームに夢中になってるし。
カリスマ90のミッション周回しちゃって何個も石を割って。
もう嫌だ。

そして、 if 文が大きく間違っているのを発見。
and でつないでいるような条件を判定するときは括弧でくくらないと後ろの方まで文字列扱いされてしまうんでした。
今までよく動いていたの。
if 文について調べていなかったら気が付かなかったわ。
それと条件が&ではなく or でなければならない。
ちょっと恥ずかしい。
ぴったり水平方向に動かすなんて滅多にないから実害はなさそうだけど。

この修正でもクリック判定は治らなかった。
最後の最後に一箇所だけ疑わしい場所がある。
それはマウスクリックイベント送信コマンド。
クリック速度が早すぎてゲームがクリックを見逃しているかもしれない。
でもそんなことあるのかな?

ダメ元でクリックイベントではなく、ボタンを押して少し待ってからボタンを放すことにした。

                ImageSearch, fx, fy, 900,480,945,520,*40 blue.bmp
                if (ErrorLevel = 1 or bcx < 0)
                {
                    Send, {LButton down}
                    Sleep, 20
                    Send, {LButton up}
                    ;クリックしたので座標記録しておく。
                    bcx := mx
                    bcy := my
                    dblstopper := True
                }

myahk/aigis.ahk at master · yasushiito/myahk


そしたらめちゃくちゃ感度が良くなった。
ゲームアプリ側がイベントを取りこぼしていたのか。
ボタンを押した後の待ち時間を短くしすぎると同じように取りこぼすのを見てしまった。
そりゃクリックイベントでは早すぎて駄目だわ。


そして最終確認のために何度かミッションに挑戦して、マウスボタンを離す待ち時間の調整をしていたらカリスマが亡くなって石を割ると。



この記事に登場するAutohotkey スクリプトについて

この記事の中で私が作成したプログラムは、全て自由に使うことができます。
詳しくはこちら