ジャンル不定の日記です。

ブラウザゲームのマクロ作ってみた

最近ブラウザゲームの「かんぱに☆ガールズ」ってのやり始めたんだが、カード収集ゲームにしては珍しくゲームっぽくて面白い。

のだが、素材収集とかレベル上げとか作業感が強い。
そこで、ゲームのマクロ作成に初挑戦してみた。
言語は慣れたPerlで。


この手のゲーム操作自動化は、スクリーンキャプチャ取って画像解析してクリック。
って感じだとは思ったが、
  1. ImageMagickのimportコマンドで画面キャプチャ。
  2. Imagerモジュールで画像比較。
  3. X11::GUITestモジュールでマウス移動とクリック。
って感じの処理になった。

スクリーンキャプチャの画像をメモリで扱えればいいんだが、Perlで簡単にやる方法が見つからなかったんでImageMagick経由でTIFF画像作成。
TIFF形式は初めて使ったが、Linuxで使う.bmpみたいなもん?
`import -window root -crop 1x1+横座標+縦座標 capture.tif`;
って感じに。
最初は全画面から判別用の領域画像をサーチして座標を求めようとしたが、
ゲーム画面に透過箇所が多く、ほぼ全体が常時微妙にアニメーションしてるようで領域比較は難しかったのでピンポイントの1x1px画像を比較して判別するようにした。
importコマンドは-cropオプションで特定位置の画像を取れるが、helpや公式サイト見てもわかりにくい。
-cropオプションに続いて「サイズ」又は「サイズ+位置」を指定で、位置指定する場合の書式は「横幅x縦幅+横位置+縦位置」となる。
領域画像の判別が困難だったから、一度画面解析せずにタイマーのみで自動化する処理を作ったんだが、タイマーだけだとやっぱ誤差が出てダメな感じ。

Imagerモジュールで画像比較は、
my $img=Imager->new(file=>"判別用画像");
my $cap=Imager->new(file=>"キャプチャ画像");
って感じで2ファイル読み込んで、
if($img->getpixel(x=>0,y=>0)->equals(other=>$cap->getpixel(x=>0,y=>0))){
   一致
}
って感じ。
画像が両方共1pxなんで座標は0x0。

X11::GUITestモX11::GUITestモジュールは、
X11::GUITest::MoveMouseAbs(横座標,縦座標);
X11::GUITest::ClickMouseButton(X11::GUITest::M_LEFT);
って感じでマウス移動と左クリックができる。
キーボード操作なんかもできる。
最初、入力デバイスの自動操作ってどうやるんだ?
ってわけでググったが、Win32の情報がでてきてLinux用のこれ見つけるのに苦労した。



そんなわけで、「かんぱに☆ガールズ」の夢幻の迷宮とメインクエのループ作業自動化ができた。
食料確認して迷宮とメインクエを自動で分けるように作ったが、
できれば社員解雇や素材売却、自動カンカンなんかもできるようにできるといいが、難しいかな。
まあ、メインクエ1回行くのに迷宮2回として計10分以上かかるから、社員枠が10あれば3時間位動けるかな?

初めてゲーム用マクロ作ったが、今回の応用で他ゲームのも作れそう。