ゲーム自動操作マクロの作り方

ゲームをやっていると「楽しくない単純作業」に気付くことがあります。延々とレベルを上げたり、目的の宝箱が出るまで周回したり。楽しくないけど、仕方なくやっている。そういう作業。

じゃあパソコンに自動で片付けさせてしまえ、そうなりますね。

ゲーム自動操作マクロとは

パソコン操作はマウス入力とキーボード入力で行います。そしてWindowsではこれらをプログラムで自動で行うことができます。「敵を倒す入力を行って、敵が倒れたら宝箱を開けて、中身が伝説の剣でなければもう一度繰り返す」…みたいなプログラムが作れるということです。こういう自動操作プログラムをマクロと言います。

具体的には次の機能を使います。

  • マウス入力
  • キーボード入力
  • 指定座標の色情報を取得する
  • 繰り返し
  • 待機
  • 条件分岐

これらを組み合わせてマクロを作っていきます。

ランス10を自動化してみる

自動化できそうな作業を発見する

ランス10では、戦闘後に確率で宝箱がドロップします。ドロップしてもしなくても物語が進んでしまい、同じ戦闘は繰り返せないので、ドロップしないと不利になります。嫌ですね。

なので「戦闘直前にセーブして、ドロップしなかったらリセットしてやり直す」という操作が発生します。戦闘部分は複雑なので、リセット操作を自動化してみましょう。

とりあえず作ってみる


ランス10では「タイトル画面に戻る」機能にショートカットキーAlt+Rが割り当てられているので、これを使ってタイトル画面に戻って、最新のセーブデータをロードすれば戦闘前まで戻れそうです。

SendKey(Alt+R)
Click(ロードボタンの位置)
Click(最新のセーブデータの位置)

こんな感じですね。ただしこれではマトモに動きません。

ゲームに合わせて待機する

マクロはゲーム画面を見ているわけではなく、言われたとおりに処理を実行するだけです。Alt+Rの直後にロードボタンの位置をクリックしますが、まだゲーム画面にロードボタンが表示されていません。ゲーム画面の多くはゆっくりと切り替わるものなので。

ではロードボタンが表示されるまで待てばいいんですね。

SendKey(Alt+R)
Sleep(10秒)
Click(ロードボタンの位置)
Click(最新のセーブデータの位置)

Alt+Rから何秒後にロードボタンが表示されるかわからなかったので、とりあえず10秒待ってみました。確かにロードボタンを押すところまでは動作しましたが、ロードボタンが表示されてからもしばらく待ってしまっていました。無駄ですね。

ここで「指定座標の色情報を取得する」機能を使います。「ロードボタンが表示されたときには、ここはこの色になっているはずだ」という座標・色を指定して監視します。

SendKey(Alt+R)
Loop{
If(GetColor(100,200)=赤色) Then Exit Loop
Sleep(0.1秒)
}
Click(ロードボタンの位置)
Loop{
If(GetColor(150,600)=緑色) Then Exit Loop
Sleep(0.1秒)
}
Click(最新のセーブデータの位置)

これでほぼ無駄なくロードボタンをクリックできるようになりました。しかしこれだとときどき動かないことがあります。ときどきって何だよ。毎回動くなら正しく作れたと言えますが、動いたり動かなかったりって不気味ですね。

画面の変化に対応する

タイトル画面に戻るところまでは正常に動いていたのに、ロードボタンをクリックしてくれないので、その間に問題がありそうです。座標100,200が赤色になるまで待っているだけなのに…あ、ロードボタンがオレンジ色になるパターンに気付きました。

ゲームのボタンはマウスカーソルを合わせたときに表示が変わることが多いので、ロードボタンの位置が赤色になるまで待つ上記のマクロは引っかかります。

そういうことならマウスカーソルをゲーム画面から外してやればいいですね。

MouseMove(ウィンドウの外側)
SendKey(Alt+R)
Loop{
If(GetColor(100,200)=赤色) Then Exit Loop
Sleep(0.1秒)
}
Click(ロードボタンの位置)
Loop{
If(GetColor(150,600)=緑色) Then Exit Loop
Sleep(0.1秒)
}
Click(最新のセーブデータの位置)

これでこのマクロは意図したとおりに動作します。いつでもこのマクロを使用するだけで自動で戦闘前に戻ってくれます。でもちょっと使いづらいです。毎回マウスカーソルがウィンドウの外側に飛んでしまいます。なので最後に復元するようにしてみましょう。

GetMousePosition(MouseX,MouseY)
MouseMove(ウィンドウの外側)
(中略)
Click(最新のセーブデータの位置)
MouseMove(MouseX,MouseY)

完成しました。他にも色々な場面で応用できそうですね。プログラミングってこんなもんです。思ったより簡単そうじゃないですか。

AutoHotkeyの紹介

今回は「こういうふうに考えながら作ります」という解説でしたが、じゃあこのマクロをどこに書けばいいんだって話ですね。単純にメモ帳に書いても動きません。

そのマクロに必要な環境を提供してくれるのがAutoHotkeyです。拡張子を「.ahk」にしたテキストファイルを作って、そこにAutoHotkey語でマクロを書けば動きます。AutoHotkeyにはマクロのための様々な便利機能が搭載されています。

キーやキーの組み合わせでマクロを実行する機能

a::
MouseMove,100,200
b::
MouseMove,200,300
Return

のように「キー名::」と書いた行はラベルとして扱われ、そのキーを押すとそこから処理が始まります。aキーを押すとMouseMove,100,200とMouseMove,200,300を実行しますし、bキーを押すとMouseMove,200,300を実行します。Returnは処理の終わりです。

「aキーを押すだけで簡単にリセットできる」って便利ですね。「aキーにbキーを送信するマクロを登録する」「aキーを押しても何もしないようにする」というようなことをやってキーボードを魔改造することもできます。

条件に応じてキーの役割を変更する機能

毎回aキーでリセットマクロを実行されても困りますね。文字入力したいことだってあります。このような場合は

#IfWinActive,ランス10
a::
リセットマクロ
Return
#IfWinActive

のように書いて「~の間だけaキーでリセットマクロを使用する」という使い方をします。

AutoHotkeyはその他様々な便利機能を提供してくれます。どんどん使っていきましょう。

いかに短時間で作れるか

このマクロはそれなりに便利です。簡単にリセットできるようになり、楽になりました。しかし「マクロを作る手間」が掛かっています。つまり「マクロを作る手間」が「リセットする手間」を上回って初めて得ということです。上回らないなら、手動でリセットした方がマシです。

やろうと思えば敵・味方の状態を全て認識して自動で最適な戦闘を行うマクロも作れますが、手間が掛かります。そしてゲームのプレイ時間は1作品につき精々数百時間でしょう。

そういうワケで、精々数百時間の中の一部を自動化する程度なので、今回のように「ぱぱっと作って動かしてみて、動かなかったり不便だったりしたら軽く修正する」がゲーム自動操作マクロ制作の基本方針になります。IT企業が契約して作るようなガチガチのプログラムと違い利用者は自分だけで、大金が動くわけでもないのでこれで十分です。

まとめ

  • パソコン上のつまらない単純作業はAutoHotkeyで片付けられる
  • とりあえず使える程度のマクロを目指す

プログラムって何かすごく難しそうですよね。継承がどうとか、機械学習がどうとかこうとか。けど今回作ったマクロにはそんな要素は全くなく、それでもそれなりに便利なマクロが作れました。プログラムなんて上を目指さなければそんなに難しいもんじゃないです。

「自分にもできそうだな」と感じたらAutoHotkeyをインストールしてやってみましょう。多分作れます。