Age of Empire II のWine化とマウス真ん中クリックをCtrl化するまでの長い道のり
Age of Empire II のWine化とマウス真ん中クリックをCtrl化するまでの長い道のり
はじめに
私はいまだに古い Age of Empires II をプレイしています(しかもオリジナル版).
わざわざその為にネイティブ32bit Windows7 を残していたりするのですが,マシンにケーブル類を繋ぎ変えるのが面倒なので,前からやりたいと思っていた Wine 化を施しました.
というか,以前もやっていたのですが,いつの間にか動かなくなっていたので,本腰を入れて直そうかと.
ゲームの導入そのものは,さほど苦労はしなかったのですが,それよりも,マウス真ん中ボタンをX上でうまく扱える様にするのに苦労しました.
Linux 環境 で Windows ゲームを動かす際,入力周りの差異が問題になる事がよくあります.
最終的には解決に至りますが,かなりの遠回りをしました.同様の問題に遭遇した場合の参考になれば幸いです.
AoKのインストール(Wine)
まず,既に Windows7 環境で動作しているオリジナルの AoK を丸ごと Linux に持ってきました.
元々no cd化は済ませてあります(必須).
rsync -ax --progress "/mnt/win7/Program Files/Microsoft Games/" "~/drive_c/Program Files/Microsoft Games/"
ただし,このままでは以下のようなクラッシュが発生しました.
Unhandled exception: page fault on write access
これはDirectDraw周りの問題であることが多いです.
cnc-ddrawの導入
DirectDrawの互換レイヤとして cnc-ddraw を導入します.
cd ~/drive_c/Program Files/Microsoft Games/Age of Empires II/Age2_x1/ wget https://github.com/FunkyFr3sh/cnc-ddraw/releases/latest/download/cnc-ddraw.zip unzip cnc-ddraw.zip
同じディレクトリに ddraw.dll と ddraw.ini が出てきます.
cnc-ddraw の導入で起動する様にはなりましたが,解像度が低かったので,ddraw.ini を適宜変更します.
元々AoK用の初期設定が含まれるので,以下の様に変更.
; Age of Empires II: The Conquerors [age2_x1] nonexclusive=true adjmouse=true width=1920 height=1080 fullscreen=true
起動スクリプト
こんな感じに.
#!/bin/bash
AOK="${HOME}/drive_c/Program Files/Microsoft Games/Age of Empires II/Age2_x1/age2_x1.exe"
WINEDLLOVERRIDES="ddraw=n,b" \
WINEESYNC=1 WINEFSYNC=1 \
wine "${AOK}"
中クリックをCtrlにしたい
むしろこちらがこの記事の本題です.
目的:
- 中クリック → Ctrlとして動作
- 元のCtrl → そのまま使用可能
失敗例まとめ
xmodmap
xmodmap -e "pointer = 1 0 3 4 5"
→ 中クリック無効化は可能
→ Ctrl化は不可
AutoHotkey(Wine内)
winetricksで導入.設定ファイルを以下の様な感じに,
MButton::
Send {Ctrl down}
KeyWait, MButton
Send {Ctrl up}
return
→ AoKがDirectInputで取得するため効かない
keyd
→ 動作はするが全体に影響しすぎて危険
→ 暴走して操作不能になる
input-remapper導入
最終的にこれで解決しました.
xubuntu 20.04 には標準で入っていないため手動インストール:
wget https://github.com/sezanzeb/input-remapper/releases/download/1.4.0/input-remapper-1.4.0.deb sudo apt install ./input-remapper-1.4.0.deb
※ 途中で dpkg の statoverride エラーが出る場合あり
(postdrop, crontab, mlocate グループ欠損など)
最大の罠:デバイス選択
ここが最重要ポイントです.
GUI上で表示されるデバイス名は信用できません.
例えば,
Barcode Reader
→ 実際はマウス
正しい判定方法は,リストされたデバイスをそれぞれ選んで,キャプチャボタンを押して真ん中クリックした時に,
BTN_MIDDLE
が出るデバイスを選ぶ
設定内容
input-remapper GUIで:
- Device:BTN_MIDDLEが出るデバイス
- 入力:BTN_MIDDLE
- 出力:KEY_LEFTCTRL
もう一つの罠
単純に割り当てると 元々のCtrlが効かなくなる ハッキリ言って致命的です.
これは「置き換え」になっているためです.
解決策
ゲームは左右のCtrlを区別しないので,真ん中ボタンを KEY_RIGHTCTRL に割り当てます.これにより,
元Ctrl → そのまま 中クリック → Ctrl
が両立されます.
結論
今回の本質は以下の通りです:
入力は“どの層で処理するか”が全て
- X層 → 弱い(ゲームに負ける)
- Wine内 → さらに弱い
- evdev層 → 有効
- デバイス名は信用するな
- evtestが真実
- 変換はできるだけ下の層でやる
おわりに
最終的にはLinuxでもWindowsと同じ操作性を再現できました.
ただし,そのためには「どの層で入力が処理されているか」を正しく理解する必要があります.
同じ問題でハマっている方の助けになれば幸いです.