はびこった悪
技術的に正しい対症療法 (政治的に正しいとは限らない)
(続き)
そもそもの発端は、MoEがNT5系のOS上では故意に頭の悪い決め撃ちを試みるため、そのままNT5.2で起動すると「ゲーム実行速度の同期が取れません」で自殺してしまう点にあります。そしてそういう理由なので、ApplicationGoo を使ってNT6を詐称してやるとMoEはひとまず普通に動作します。
ところがNT6系、すなわちVista以降では右Shiftのキーコードが何故か変更されており、この変化はアプリケーション側で吸収しなければならない腐れ仕様です。よってMoEも対応したわけですが・・・今回の場合、MoEには詐称でNT6に見えているものの、実際に動いているのはNT5.2です。ここに齟齬が生じ、(KeyConfig で設定する/した操作として) 右Shiftを押しても反応しないという問題になります。
前回は Keyboard Layout の Scancode Map による対症療法をすると、問題は回避できるもののセッション全体に副作用があるということで却下しました。そもそも問題を起こすのはMoEだけなのに、使った対策の効果範囲が広すぎるために副作用まで拡散してしまったわけです。
MoEが見ている入力イベントは DirectInput8 経由のもので、内部でキー入力の判定に使っているコードは最終的には DINPUT8.DLL によってマッピングされた値です。これはMoEの内部をアレな感じで覗き見とかするまでもなく、外見から容易に推察可能なことで、KeyConfig に表示されるキー名はあからさまに dinput.h の DIK_* に由来しています (例: キー「^」が CIRCUMFLEX ではなく PREVTRACK になる)。
ここでさらっと「マッピング」と言ったのがミソで、キー入力によって発生し (た後キーボードドライバによって変換され) たスキャンコードは、さらに DINPUT8.DLL で変換されてからMoEに渡ります。よってMoEに読み込まれる DINPUT8.DLL の変換テーブルをちょろまかしてやれば、正しくMoEに対してのみ修正を施すことができます。
というわけで、何となく見た目でテーブルの所在を割り出して、書き換えて、MoEに読み込ませればミッションコンプリートです。以下具体的な手順。
- とりあえず %SystemRoot%\system32\DINPUT8.DLL を作業用にコピーしてきます。
- バイナリエディタで以下のバイト列のテーブルを探します。似て非なるものがいくつか連続して並んでいるので注意してください。なおこれは変換元のキーボードが日本語106/109キーの場合で、他の種類の場合はその似て非なるものの方になることがあります。
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 90 0E 0F
5.3.3790.3959 (srv03_sp2_rtm.070216-1710) の場合は 28348h からの256バイトになります。
10 11 12 13 14 15 16 17 18 19 91 1A 1C 1D 1E 1F
20 21 22 23 24 25 26 27 92 94 2A 1B 2C 2D 2E 2F
30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F
40 41 42 43 44 C5 46 47 48 49 4A 4B 4C 4D 4E 4F
50 51 52 53 00 2B 00 57 58 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
70 00 00 2B 00 00 00 00 00 79 00 7B 00 7D 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 9C 9D 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 B5 00 B7 B8 00 00 00 00 00 00 00
00 00 00 00 00 45 00 C7 C8 C9 00 CB 00 CD 00 CF
D0 D1 D2 D3 00 00 00 00 00 00 00 DB DC DD 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 - 発見したテーブルの先頭から B6h の位置にある 00 を 36 に変更します。B5 00 B7 の真ん中です。
- MoEのインストールフォルダ (MasterOfEpic.exe のあるところ) に NetG_CL.rel.Local なる名のフォルダを作成し、その中に書き換えた DINPUT8.DLL を配置します。
以上!