ぺんちゃん日記

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

ゲームプレイをアシストしてもらいたい【AutoHotkey】。

f:id:yasushiito:20190403184928p:plain

引退しました。

一度だけゲームの記事を書きました。
指のリハビリにために千年戦争アイギスは続けるぞという決意でした。
しかしながら、どうしても指に力が入らなくてドラッグ操作ができなくなってしまったので引退しました。
ブログ更新の作業が忙しくなったので時間が取れなくなったとも言えますけど。

復帰できるか。

最近AutoHotkeyのスキルも上がってきて効率よく成果を出せるようになってきたので、ゲームの操作も助けてもらえば良いじゃんと思うに至りました。
スマホにも対応したゲームだから操作方法はシンプルですから、うまいことやればドラッグの左ボタンを押し続ける操作くらいは手伝ってくれるのではないかと。

操作方法。

操作方法は簡単です。
まずはゲーム画面のスクリーンショットを見てください。

f:id:yasushiito:20190610094630p:plain

画面下の方にユニットのアイコンが並んでいますので、これをドラッグ&ドロップでフィールドに落とします。
左下の王子をドラッグして出撃させる準備をしています。
配置可能な場所が丸く光るので、そちらに移動させてボタンを離すとドロップして配置が完了します。

f:id:yasushiito:20190610100408p:plain

この調子で戦士たちを出撃させて行きます。後はユニットが勝手に戦ってくれます。
それ以外の操作を戦況に応じてスキルを発動させることと撤退させることです。
どちらもフィールド上のユニットをクリックして ユニット状況を画面下に表示してからボタンをクリックします。

f:id:yasushiito:20190610100647p:plain

ユニット状況の左端に撤退ボタン、右にスキル使用ボタンがあります。

スクリーンショットでは確認できませんが、ユニットが多数にわたるときには、ユニット一覧が左右にスクロールします。
マウスポインターをユニット一覧の左右両端に持っていくと一覧がスクロールを始めます。

f:id:yasushiito:20190610100408p:plain

ユニット一覧右端のアイコンが見切れているのが確認できるでしょうか?

アシスト方法を考える。

大きく分けてユニット一覧付近はドラッグアンドドロップ、それ以外はクリックとなります。
マウスポインタが触れただけで反応してしまっては極端すぎるので、一定時間同じ場所にマウスポインタを停滞させれば反応するようにしましょうか。
マウスポインタ停滞型のスクリプトウィンドウのスクロールで実現できています。
ユニットを選択したい場合はフィールド上のユニットの上でマウスポインターを停止させます。
ユニットをドラッグ&ドロップで出撃させたい場合はユニット一覧の上でマウスポインター停止させます。
この時、内部的にドラッグ&ドロップ状態にしておき、フィールド上でマウスポインターを停止させた時に左ボタンを離してドロップさせます。
フィールドとユニット一覧のエリアが分離されているので当たり判定はこれでオッケーだと思います。

特に気をつけなければならないのは2点。

  • フィールド上での停滞はユニット選択のクリックとユニットドロップの左ボタン解放の2種類ありますから、状態を把握しておかなければなりません。
  • 撤退ボタンとスキル使用ボタンがユニット一覧スクロールエリアとかぶっているので、何らかの方法で対処しなければなりません。

2件目の対処法がちょっと分からない。
左端と右端の近辺はクリックできるようにユニットドラッグの判定エリアから外しておかなければならないのは確かです。
となると、左右両端のユニットは出撃のためのドラッグ操作ができないことになってしまいます。
ユニットアイコンの端っこをドラッグの当たり判定にすればギリギリできるかな。
仕方ない、王子の出撃がアイコンの右端だけでできるという制約は受け入れよう。

実装する。

マウスポインタの位置はスクリーン上の絶対位置で判定します。
つまりブラウザの位置が少しでも変わるだけで使えなくなります。
幸いにも常用アプリケーションのウィンドウサイズと位置を調整するためのスクリプトを作っています
これを使えば必ず同じ位置にゲームを表示できます。
Google Chrome でズーム50%の表示でプレイしています。
その前提でエリア判定を行っているので、条件が変わる場合、座標を変更することになります。
マウス状態の監視のイベント間隔は40msecくらいでいいのかな?
間に合わなかったら取りこぼすだけだから当面はこれくらいで。
マウスポインタの位置を記憶しておいて、前回のポインタ位置と比較して、ある程度の差があれば移動中とします。
2秒程度動かさなければ停滞中とします。
タイマー監視の割り込み時間が40msecなので5回程度連続で移動がなければ良いということになります。
5回連続の判定のためのカウンターが必要ですね。
停滞の判定が2秒ということは、2秒より早くクリックできないということになります。
スクリプトの性質上、その制約は受け入れなければなりません。
この感覚があまりにも短いと違ったところにドロップしたりボタンを連打するなどの操作ミスが発生してしまいます。
マウスポインターがゲーム画面から出た時はフラグを全てリセットします。
思ったようなクリックやドラッグが発生しない時は思い切って画面の外に出してしまえば確実にクリックさせられます。
特にありがちなのがユニット一覧エリアでマウスポインターを待機させてしまっていること。
ドラッグのフラグが成立してしまって操作ミスを引き起こすことになります。
ユニット出撃を待つ時はゲーム画面の下にマウスポインタを待機させるようなプレースタイルが良いかと思います。

プレースタイル込みのスクリプト解説はこんなもんでしょうか。
出来上がったコードは次のようです。


テストプレイ。

試しに遊んでみました。
と言うか既に結構トレーニングしてしまっているので操作が滑らかすぎました。
まあまあうまくできてるんじゃないでしょうか。

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

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