Autohotkeyによるショートカット化に目覚めた。
前回は主にテキストエディタじょうでカーソル移動することに労力を費やしたわけだが
Autohotkeyはアプリごとに設定を変更できると聞いてチャレンジ
※三国志11PKは前から好きで発売から10年以上経つけど未だにやってるゲーム。
■経緯
Autohotkeyもネット上にすでにあっていくつかのショートカットが登録されていた。
これをダウンロードしてきて改造に着手。
仕様を考えるのが楽しい。
■内容
1.メニューのショートカット作成
とりあえず都市をクリックしてでてくるメニューを都市メニュー、
部隊をクリックしてでてくるメニューを部隊メニューとして定義。
事前にクリックするべき場所をコマンドで記憶。
その後ショートカットキーでその場所に移動してクリックし、メニューを出せるようにした。
また、メニューの各アイテムにキーを割り当てた。
さらにTooltipでそのショートカットを表示した。
※なお、メニューを選択した状態で無変換+j/kでメニューを上下することもできるようにした。(VI風)
2.メニューから展開する画面の各ボタンにショートカット作成
都市メニューから呼び出した画面の位置をレジストリから取得し
各ボタンを押すショートカットキーをその場で作成。
メニュー同様Tooltipでショートカットのキーがわかるように表示
※対象武将一覧画面のようにデータの一覧があるタイプの画面上では無変換+j/kでそのデータ1行分上下するようにした(VI風)
※都市メニューは何度も同じ場所からメニュー出すからいいけど
部隊メニューは毎度毎度違う武将の位置を記憶する作業がだるいわ。
わかってたけどこの操作性はダルい。
部隊メニューについてはやろうとして結局挫折。
それなりにショートカットは表示されるものの結局場所のクリックをキーボードで代替するのが
難しすぎて使い物にならない、素直にマウスでやったほうがマシ。
3.VI風に無変換+hjklで上下左右にカーソル移動
すでに上でも書いたがjkは上下、hlは左右にカーソル移動
なお、メインメニュー上で左→サブメニューの表示
サブメニュー上で右→メインメニューに戻るとした
上下動の幅は状況によって変更する。(メニュー上の場合、画面上の場合)
VI好きにはまあまあ便利。
4.元の三国志11用Autohotkey設定にあった、一覧画面の選択ショートカットを
べつのショートカットに割り当てて再定義。
いわゆる一等地(打ちやすいキー)を割り当てすぎ。そんなにつかわない。
■問題点とその対処(三国志内の(疑似)ウインドウの位置)
AutohotkeyはWindowsのコントロール単位で認識して、そこに命令を送ることが可能なのだが
三国志系のアプリではこれが通用しない。
理由は簡単でWindowsのコントロールを使用せず、独自でコマンドの(疑似)ウインドウを描画しているせい。
なんでそんなことをするのかというと他のゲーム機(PS等)でも動かしたいから。だと思う。
どういうことかというと、三国志内で表示される(疑似)メニューや(疑似)リスト画面はWindowwsの部品ではない。
三国志はAutohotkeyからすると単なる一枚絵にしか見えていない、ということ
これは画面を捕まえてそこにコマンドを送り込みたい側からすると非常に不便。
どうにかしたかったのだがダサダサの方法として個別のウインドウの位置を決め打ちにするという方法よりは多少マシな方法がわかった。
個別のウインドウの位置情報がレジストリ内に保存されている。これを読み出して画面の位置として使用できる。
これで少しだけましになった。
ただし、ゲーム実行中に三国志内の(疑似)ウインドウを動かしてしまうと追従できない。
レジストリの情報を更新するのは画面終了時にのみ行う模様。(悲しい)
※三国志自体のウインドウはいくら動かしても良い。
■複数キーの組み合わせ(の組み合わせ)を導入
※コマンドの種類が多すぎるので全部ショートカットにしようとすると
修飾キー+キーの組み合わせが足りない。
というか修飾キーを押さえ直すのがだるいので
修飾キーは左手=無変換、右手=変換に統一したい。
色々検討した結果、修飾キー+キー→修飾キー→キーと2つのキー組み合わせで
一つのショートカットを表す設計にした。
このやり方ならショートカットが不足することも無い。
例:一覧画面メニュー(左上にあるやつ)
最初のキー=無変換+v
次のキー=無変換+asdzxhkl;で
a:自都市一覧
s:自武将一覧
d:自部隊一覧
h:マップメニュー
j:情報メニュー
k:オプションメニュー
l;ヘルプメニュー
;:技巧
を表示する。
「無変換+vが直前に行われていたら」というロジックを各キーの実行条件分岐として設定する。
コードはまあ汚くなるけどしゃーない。
この方式だと修飾キーはほぼ無変換一択で行けるので親指が楽。
この最初のキーを「起点キー」と勝手に呼び、「起点キー方式」と命名。
組み合わせの数だけショートカットを作れるようになり、考えるのが少し楽になった。
都市メニューはこんな感じ
無変換+t→abcdef
a;都市
b:軍事
c:人材
d:外交
e:計略
f:君主
部隊メニューも同様無変換+b→a~i
●注意点
最初のキーに使うキーを後のキーとして使うと制御が難しくなるので設計時に明確に分離すること。
後のキーの方は最初のキーとの組み合わせの数だけショートカットを用意できる。
とはいえ、ロジック的に判断がつかないようなコマンドを同じキーに割り当ててしまうと失敗するので設計時によく検討すること。
■三国志11Autohotkey化の課題
・部隊メニューはやることが複雑過ぎ、かつカーソル移動が多くて面倒臭い。
・正直カーソル移動はキーでやるとイライラ感が半端ないのでイマイチな感じ
●解決案1(失敗):左側に出てくるリスト画面でクリックして選択すれば都市にしろ部隊にしろ中央に表示されるから
そこをめがけてカーソル移動すれば楽なのでは?と思った時期がありました。
実際にやってみるとわかるけど真ん中っぽい位置に表示するだけで同じ座標ではないんだよなあ。
これのせいでリスト画面で選択→真ん中にカーソル移動してコマンド開始というシステムが作れない。(悲しい)
何を考えて開発チームはこのようにしたのか質問してみたいところ。
・メニューあたりをキーに割り付けたとしても画面が表示されてからのクリック数が半端ないのでそこもなんとかしたい。
メニューだけではあまり楽になっていないのでよく使うコマンドを中心にもう少し楽にしたいと考えている。
よく使うコマンドの例:
人材探索:序盤で行動力が余ったら金策も兼ねて行動力が尽きるまでやる。
商人:金コメの変換、これを繰り返すと政治パラメータが上がる。
93以上になったら金コメ変換を繰り返すだけで金もコメも増えていく。
人材探索などは軍師が余計なコメント「だれもおらんと思うよ」をするので
それを消すために1クリック必要。そこから「実行武将」ボタンにカーソルを移動して「実行武将選択」画面に飛び
その一人目にカーソルを移動する。まで自動化したらだいぶ楽になった。
他のコマンドはまだ実装していない。
※2020/07/08 まあ薄々気づいていたことだがマウスの動きをキーで代替するのは可能ではあるけれども
精神的に苦痛を感じる。むしろマウスを触らせてくれ。と言いたくなる操作性といえよう。
本末転倒である。
これを解決したくていろいろ考えた。
●解決案2(微妙に失敗):マウス移動をサポートする仕組みを作る。
画面上に格子のような縦横の線を等間隔で引く。
ショートカットキーを押すとその線の上にジャンプする。という仕様の方がマウスのカーソル移動を
キーを押し続ける時間で管理するよりは精神的に受け入れやすいと思ったのでそうすることにした。
ただ、やってみるとわかるのだが格子の間隔を相当狭くしないとクリックしたい点がクリックできない。
三国志の画面でいうと縦横それぞれ40本くらい引かないと1マス1マスをクリック可能にはできない。
そうすると格子の移動が結構たいへんになる。
各格子にショートカットキーを割り当ててやれば一発ジャンプできるがどのキーを押せばその格子に行くかわからん。
仕方ないのでTooltipを表示するようにした。押すべきキーをA,B,CみたいにTooltip上で表示してあげる。うん、これはわかりやすい。
と思ってたら落とし穴が。
AutohotkeyではTooltipを最大20個までしかツカエませんだとさ。じゃあ、格子数ふやしてもショートカットキーを表示できないやん。
ということでもう一度考え直す。
1回に表示する格子(縦横の分割数)は8個までにする。
ある程度目標の近くに移動したら、今度は狭いエリアでもっと細かい幅の格子を表示する。
言ってみれば格子のネストだな。二段階の作業になるけどまあこれでなんとかなりそうだ。
それなりに動くものが出来上がったけど。結局三国志11が快適に操作できるレベルではないことが判明
・目的のマスをきちんとクリックできないことがある。
・部隊が立て込んでいる場合は更にその傾向が強い
格子状のいちをクリックして敵を攻撃しようとしても味方への追従コマンドになってしまったり。
ここまでやってギブアップした、やはりショートカットキーで目的の位置にジャンプできないなら操作は厳しい。
可能性としては
A.各マスにショートカット・キーがありそれを押してダイレクトにジャンプ
あるいは
B.各軸にそって上下左右キー(HJKLでも良し)でマウス移動できる。
Aは無理でもせめてB.の操作性を実現しないと先頭を全部キーボードでやるのは厳しいという結論に達した。
で、問題なのは三国志11の敵味方の座標位置を知る方法(計算する方法)が無いということ。
後述するように三国志11内のメモリ情報が解析された上で取得できない限り無理と判断。
流石に無理と感じたので戦闘のショートカット化は一旦断念するう。
※今の仕様でもそれなりに使えるシチュエーションは存在する。
隘路などで味方と敵が睨み合っていて、味方も敵もほぼ移動せず、敵の戦闘部隊を混乱に陥れているケースなどでは
慣れればそれなりにキーボードだけで戦闘できそうではある。
■san11Editorと連携(できたらなあ)
もっとアプリ内の情報を引き出す方法としてSan11Editor(有志が作成したハックするツール)と連携するという手段が考えられる。
これはかなり禁断の方法ではあるがSan11Editor自体は三国志のゲームをPCで楽しむ層なら
割とポピュラーな手段なのでAutohotkeyだけではどうしようもない部分に手を出すなら
ぜひやりたいと思っているところ
例1:上に書いた、リスト画面で選択した都市や部隊などの座標がほしい。
リスト画面で選択した後、その座標めがけてカーソル移動したい。
例2:矢印キーで一コマずつカーソルを移動する。など
こんなの画面に表示されている拡大、縮小、角度、傾き等が全部わかってないと絶対ムリだけど
マウスを切り捨てたいのでなんとかして導入したいところ。
例3:見えてる範囲内の部隊にタブでカーソルを移動する。など
攻撃対象もマウスでクリックする必要がある。マウスだるい。
なお、現在はsteamで三国志11PKをやっており、対応するSan11Editorがない模様。
作者が一つ前のVersionには対応してくれたという話なのでアドレス書き換えだけで対応できると思うんだけど
アセンブラの解析ができないとどうしようもないのでいまは着手しない。
前回は主にテキストエディタじょうでカーソル移動することに労力を費やしたわけだが
Autohotkeyはアプリごとに設定を変更できると聞いてチャレンジ
※三国志11PKは前から好きで発売から10年以上経つけど未だにやってるゲーム。
■経緯
Autohotkeyもネット上にすでにあっていくつかのショートカットが登録されていた。
これをダウンロードしてきて改造に着手。
仕様を考えるのが楽しい。
■内容
1.メニューのショートカット作成
とりあえず都市をクリックしてでてくるメニューを都市メニュー、
部隊をクリックしてでてくるメニューを部隊メニューとして定義。
事前にクリックするべき場所をコマンドで記憶。
その後ショートカットキーでその場所に移動してクリックし、メニューを出せるようにした。
また、メニューの各アイテムにキーを割り当てた。
さらにTooltipでそのショートカットを表示した。
※なお、メニューを選択した状態で無変換+j/kでメニューを上下することもできるようにした。(VI風)
2.メニューから展開する画面の各ボタンにショートカット作成
都市メニューから呼び出した画面の位置をレジストリから取得し
各ボタンを押すショートカットキーをその場で作成。
メニュー同様Tooltipでショートカットのキーがわかるように表示
※対象武将一覧画面のようにデータの一覧があるタイプの画面上では無変換+j/kでそのデータ1行分上下するようにした(VI風)
※都市メニューは何度も同じ場所からメニュー出すからいいけど
部隊メニューは毎度毎度違う武将の位置を記憶する作業がだるいわ。
わかってたけどこの操作性はダルい。
部隊メニューについてはやろうとして結局挫折。
それなりにショートカットは表示されるものの結局場所のクリックをキーボードで代替するのが
難しすぎて使い物にならない、素直にマウスでやったほうがマシ。
3.VI風に無変換+hjklで上下左右にカーソル移動
すでに上でも書いたがjkは上下、hlは左右にカーソル移動
なお、メインメニュー上で左→サブメニューの表示
サブメニュー上で右→メインメニューに戻るとした
上下動の幅は状況によって変更する。(メニュー上の場合、画面上の場合)
VI好きにはまあまあ便利。
4.元の三国志11用Autohotkey設定にあった、一覧画面の選択ショートカットを
べつのショートカットに割り当てて再定義。
いわゆる一等地(打ちやすいキー)を割り当てすぎ。そんなにつかわない。
■問題点とその対処(三国志内の(疑似)ウインドウの位置)
AutohotkeyはWindowsのコントロール単位で認識して、そこに命令を送ることが可能なのだが
三国志系のアプリではこれが通用しない。
理由は簡単でWindowsのコントロールを使用せず、独自でコマンドの(疑似)ウインドウを描画しているせい。
なんでそんなことをするのかというと他のゲーム機(PS等)でも動かしたいから。だと思う。
どういうことかというと、三国志内で表示される(疑似)メニューや(疑似)リスト画面はWindowwsの部品ではない。
三国志はAutohotkeyからすると単なる一枚絵にしか見えていない、ということ
これは画面を捕まえてそこにコマンドを送り込みたい側からすると非常に不便。
どうにかしたかったのだがダサダサの方法として個別のウインドウの位置を決め打ちにするという方法よりは多少マシな方法がわかった。
個別のウインドウの位置情報がレジストリ内に保存されている。これを読み出して画面の位置として使用できる。
これで少しだけましになった。
ただし、ゲーム実行中に三国志内の(疑似)ウインドウを動かしてしまうと追従できない。
レジストリの情報を更新するのは画面終了時にのみ行う模様。(悲しい)
※三国志自体のウインドウはいくら動かしても良い。
■複数キーの組み合わせ(の組み合わせ)を導入
※コマンドの種類が多すぎるので全部ショートカットにしようとすると
修飾キー+キーの組み合わせが足りない。
というか修飾キーを押さえ直すのがだるいので
修飾キーは左手=無変換、右手=変換に統一したい。
色々検討した結果、修飾キー+キー→修飾キー→キーと2つのキー組み合わせで
一つのショートカットを表す設計にした。
このやり方ならショートカットが不足することも無い。
例:一覧画面メニュー(左上にあるやつ)
最初のキー=無変換+v
次のキー=無変換+asdzxhkl;で
a:自都市一覧
s:自武将一覧
d:自部隊一覧
h:マップメニュー
j:情報メニュー
k:オプションメニュー
l;ヘルプメニュー
;:技巧
を表示する。
「無変換+vが直前に行われていたら」というロジックを各キーの実行条件分岐として設定する。
コードはまあ汚くなるけどしゃーない。
この方式だと修飾キーはほぼ無変換一択で行けるので親指が楽。
この最初のキーを「起点キー」と勝手に呼び、「起点キー方式」と命名。
組み合わせの数だけショートカットを作れるようになり、考えるのが少し楽になった。
都市メニューはこんな感じ
無変換+t→abcdef
a;都市
b:軍事
c:人材
d:外交
e:計略
f:君主
部隊メニューも同様無変換+b→a~i
●注意点
最初のキーに使うキーを後のキーとして使うと制御が難しくなるので設計時に明確に分離すること。
後のキーの方は最初のキーとの組み合わせの数だけショートカットを用意できる。
とはいえ、ロジック的に判断がつかないようなコマンドを同じキーに割り当ててしまうと失敗するので設計時によく検討すること。
■三国志11Autohotkey化の課題
・部隊メニューはやることが複雑過ぎ、かつカーソル移動が多くて面倒臭い。
・正直カーソル移動はキーでやるとイライラ感が半端ないのでイマイチな感じ
●解決案1(失敗):左側に出てくるリスト画面でクリックして選択すれば都市にしろ部隊にしろ中央に表示されるから
そこをめがけてカーソル移動すれば楽なのでは?と思った時期がありました。
実際にやってみるとわかるけど真ん中っぽい位置に表示するだけで同じ座標ではないんだよなあ。
これのせいでリスト画面で選択→真ん中にカーソル移動してコマンド開始というシステムが作れない。(悲しい)
何を考えて開発チームはこのようにしたのか質問してみたいところ。
・メニューあたりをキーに割り付けたとしても画面が表示されてからのクリック数が半端ないのでそこもなんとかしたい。
メニューだけではあまり楽になっていないのでよく使うコマンドを中心にもう少し楽にしたいと考えている。
よく使うコマンドの例:
人材探索:序盤で行動力が余ったら金策も兼ねて行動力が尽きるまでやる。
商人:金コメの変換、これを繰り返すと政治パラメータが上がる。
93以上になったら金コメ変換を繰り返すだけで金もコメも増えていく。
人材探索などは軍師が余計なコメント「だれもおらんと思うよ」をするので
それを消すために1クリック必要。そこから「実行武将」ボタンにカーソルを移動して「実行武将選択」画面に飛び
その一人目にカーソルを移動する。まで自動化したらだいぶ楽になった。
他のコマンドはまだ実装していない。
※2020/07/08 まあ薄々気づいていたことだがマウスの動きをキーで代替するのは可能ではあるけれども
精神的に苦痛を感じる。むしろマウスを触らせてくれ。と言いたくなる操作性といえよう。
本末転倒である。
これを解決したくていろいろ考えた。
●解決案2(微妙に失敗):マウス移動をサポートする仕組みを作る。
画面上に格子のような縦横の線を等間隔で引く。
ショートカットキーを押すとその線の上にジャンプする。という仕様の方がマウスのカーソル移動を
キーを押し続ける時間で管理するよりは精神的に受け入れやすいと思ったのでそうすることにした。
ただ、やってみるとわかるのだが格子の間隔を相当狭くしないとクリックしたい点がクリックできない。
三国志の画面でいうと縦横それぞれ40本くらい引かないと1マス1マスをクリック可能にはできない。
そうすると格子の移動が結構たいへんになる。
各格子にショートカットキーを割り当ててやれば一発ジャンプできるがどのキーを押せばその格子に行くかわからん。
仕方ないのでTooltipを表示するようにした。押すべきキーをA,B,CみたいにTooltip上で表示してあげる。うん、これはわかりやすい。
と思ってたら落とし穴が。
AutohotkeyではTooltipを最大20個までしかツカエませんだとさ。じゃあ、格子数ふやしてもショートカットキーを表示できないやん。
ということでもう一度考え直す。
1回に表示する格子(縦横の分割数)は8個までにする。
ある程度目標の近くに移動したら、今度は狭いエリアでもっと細かい幅の格子を表示する。
言ってみれば格子のネストだな。二段階の作業になるけどまあこれでなんとかなりそうだ。
それなりに動くものが出来上がったけど。結局三国志11が快適に操作できるレベルではないことが判明
・目的のマスをきちんとクリックできないことがある。
・部隊が立て込んでいる場合は更にその傾向が強い
格子状のいちをクリックして敵を攻撃しようとしても味方への追従コマンドになってしまったり。
ここまでやってギブアップした、やはりショートカットキーで目的の位置にジャンプできないなら操作は厳しい。
可能性としては
A.各マスにショートカット・キーがありそれを押してダイレクトにジャンプ
あるいは
B.各軸にそって上下左右キー(HJKLでも良し)でマウス移動できる。
Aは無理でもせめてB.の操作性を実現しないと先頭を全部キーボードでやるのは厳しいという結論に達した。
で、問題なのは三国志11の敵味方の座標位置を知る方法(計算する方法)が無いということ。
後述するように三国志11内のメモリ情報が解析された上で取得できない限り無理と判断。
流石に無理と感じたので戦闘のショートカット化は一旦断念するう。
※今の仕様でもそれなりに使えるシチュエーションは存在する。
隘路などで味方と敵が睨み合っていて、味方も敵もほぼ移動せず、敵の戦闘部隊を混乱に陥れているケースなどでは
慣れればそれなりにキーボードだけで戦闘できそうではある。
■san11Editorと連携(できたらなあ)
もっとアプリ内の情報を引き出す方法としてSan11Editor(有志が作成したハックするツール)と連携するという手段が考えられる。
これはかなり禁断の方法ではあるがSan11Editor自体は三国志のゲームをPCで楽しむ層なら
割とポピュラーな手段なのでAutohotkeyだけではどうしようもない部分に手を出すなら
ぜひやりたいと思っているところ
例1:上に書いた、リスト画面で選択した都市や部隊などの座標がほしい。
リスト画面で選択した後、その座標めがけてカーソル移動したい。
例2:矢印キーで一コマずつカーソルを移動する。など
こんなの画面に表示されている拡大、縮小、角度、傾き等が全部わかってないと絶対ムリだけど
マウスを切り捨てたいのでなんとかして導入したいところ。
例3:見えてる範囲内の部隊にタブでカーソルを移動する。など
攻撃対象もマウスでクリックする必要がある。マウスだるい。
なお、現在はsteamで三国志11PKをやっており、対応するSan11Editorがない模様。
作者が一つ前のVersionには対応してくれたという話なのでアドレス書き換えだけで対応できると思うんだけど
アセンブラの解析ができないとどうしようもないのでいまは着手しない。
コメント