[東方]紅妖永花文萃をWindows10対応にする手法
2017/06/01
どうもこんにちは、Windows10にアップグレードした(もちろん自分の意思で、決してゲイツに押し付けられた訳では無い)@HimaJyunです。
でも、Windows10では東方紅魔郷、妖々夢、永夜抄、花映塚、文花帖、萃夢想がフルスクリーンで正常に動作しない。(とにかく色々バグる)
だが、世の中は広い、いくつか(知り得る限り2つ)の手法がある、今日はその中の1つ「DX8 to DX9 convertor」を使う手法の原理を解説してみようと思う。
スポンサーリンク
先に方法を紹介しておく
この記事は技術的な解説を目的としていますが、対策方法を知りたくて来ていただいた方が居るかも知れないので、先に東方紅妖永花文萃(面倒なのでここから先「東方旧作」と表記)をWindows10に対応させる方法をご紹介しようと思います。(技術的な事を知りたい方はこの節を飛ばしてね。)
東方旧作をWindows10で正常にフルスクリーンで動作させる方法、僕が知り得る限りは2つ。
1つは、ウインドウモードで動作させて、ウインドウを強制的にフルスクリーンにしちゃうソフトを使う手法。
でも、これは色々納得がいかないので(アスペクト比が画面と合わないとか)、個人的にはここで紹介する手法をおススメします。
やり方
「DX8 to DX9 convertor」なる物を使用します、文字通りの代物(DirectX8をDirectX9に変換する)ですがね……
まずは、DX8 to DX9 converterのページを訪れる、ムズカシイコトバが並んでいるが気にしない気にしない。
下の方に小さくバージョン別のリンクが並んでいるので、最新っぽい奴をクリックする(真上に広告が配置されてるので注意、現段階(2016/07/11)での最新版はv0.0036だった)
個別のページに飛ばされるんだけど、ダウンロードボタンが分かりづらい、下の画像の通り、丸で囲った所をクリックすればダウンロード出来る
ダウンロードしたファイルを展開する、まさかきょうび展開の操作が分からない奴は居ないと信じたい所……
展開した中にある「d3d8.dll」と「enbconverter.ini」の2つを該当の東方があるフォルダ(デフォルトだと、C:\Program Files (x86)\上海アリス幻樂団、もしくはC:\Program Files\上海アリス幻樂団、どちらかの中に「東方[作品名]」と言うフォルダがある、そこの事)
サイトによっては「中身を全部」って書いてあるがlicense_en.txtとreadme_en.txtはただのテキストファイルなのでなくても良い(あっても害はないので良く分からないなら全部コピーすれば良し)
後は普通に東方を起動すれば優雅にフルスクリーンで動く。
僕が確認した限り、手元の紅魔郷、妖々夢、永夜抄は問題無く動いた。すなわち、他の物でも問題無く動くと言う事だと思う(ソースコードは基本的に使い回すものなのだ)
原理を予想してみる
ここからお話が一気に難しくなるので、dllを何か色々ダウンロード出来るサイトだと思っているオコチャマにはお帰り頂く事を推奨する。(読んでも良いけど何の価値もない)
個人的には、このDLLの動作原理が気になる。(というか知っていれば将来的にこのDLLが使えなくなっても自作できるから知っておきたい)
あくまで予想、つまり実際に検証した訳ではないけど「多分こうだろうな」という想像であることをお忘れなく。
やり方自体はファイル名(d3d8.dll)などで気付く人は気付くはず。
(ちょっと長いので、例えばあなたが「病院のベッドの上」とかでも無い限りは読まずに働いた方がよっぽど生産的、説明が正しいかどうかの保証も出来ないので……)
依存とライブラリ
この世に存在する(ほぼ)全てのソフトウェアは何かに依存している。
「俺は言語の標準ライブラリしか使ってねーよ!!」と言う方、その言語の標準ライブラリを提供するのはOSだぜ?すなわち、OSに依存しているんだ。
で、この「依存しているライブラリ」普通はlibやdllと言うファイルとして提供される(libは組み込まれるので、実質ユーザの目に触れるのはdllのみ)
libは「スタティックライブラリ」などと呼ばれ、コンパイル時にexe内に同梱される。(と言うより、組み込まれる)、こうする事でexe単体での起動が可能になる。
一方、dllは「Dynamic Link Library」の略で、exeファイルとは別に作成される。これを、実行時にメモリ上にロードして使用するのだ。
こうする事で、例えばソフトウェア(dll部に)バグがあった際にdllを置き換えるだけで修正したり、複数のソフトウェアから利用される際にメモリ上のdllを共有してメモリ効率を良くしたりする。
その代わり、exe単体では起動できなくなる。
DirectX
DirectXはMicrosoftが開発した「レンダリングとか高速に扱える凄い奴」
普通、グラボとかの命令は製品によって違いがあるのだが、DirectXはそれらの差異を吸収して、同じコードで如何なる環境でも扱える様にしてくれる(厳密には、デバイスドライバとの合体技で成り立っているんだけどもね)
良く似た物だと、OpenGLなどがあるが、DirectXの優位な点は「早い」事。
多くのPCゲームは(そして東方も)DirectXを利用して作成されている(今回問題となる東方はDirectX8を使用)
となると、必然的に利用するユーザが増える訳で、グラボメーカなどがより高速に動作する様にDirectXのための最適化を施す。
DirectXに最適化されている例として挙げられるのがnvidiaのGeForceやAMDのRadeonなどの製品(一方で、nvidiaのQuadroや、AMDのFireProの様なOpenGLに最適化された製品もある)
DirectX、これ1つで、画面への出力やサウンドの再生、果てはゲーム用のコントローラの制御も可能にする凄い奴。
しかし、弱点が無いわけでも無く、これの弱点は「Microsoftの製品」だと言う事
すなわち、Microsoftの製品(WindowsやXbox)でしか利用できず、DirectXで出来たゲームは必然的に*nix(MacとかLinux)では動作しないと言う事になる。
(ちなみに、マインクラフトはこの部分にOpenGLを利用しているのでMacでも遊べる訳だ)
dllの検索順序
先程説明した「dll」は実行ファイル(.exe)のある場所に必ず含まれているとは限らない(OSの提供するdllなど)
逆に、OSの提供するdllがある場所に目的のdllがあるとは限らない(サードパーティー製のdllなど)
すなわちどういう事かと言うと、起動する際にdllを複数の場所から検索していると言う事。
その検索順序はMSDNに記載されている通りだが、以下の様な順番
- kernel32.dllやuser32.dllなどの既知のdll
(レジストリのHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLsにて指定されている) - exeファイルが含まれているフォルダ
- プロセスのカレントディレクトリ
- Windowsのシステムフォルダ
(C:\Windows\System32) - Windowsフォルダ
(C:\Windows) - 環境変数「PATH」のフォルダ
以上の順番でdllの検索が行われ、見つかった時点での物を利用する。
もう答えが出た様なモノだね。
答え
すなわち、さっき言った「ソフトウェア(dll部に)バグがあった際にdllを置き換えるだけで修正したり」これの応用
この「DX8 to DX9 convertor」はあたかも「DirectX8を提供するためのライブラリ」の様に見せかけてOSに「同じ名前の別のライブラリ」をロードさせる。
ロードされたライブラリ内では同等の機能を提供するDirectX9のAPIを呼び出しており、見かけ上はDirectX8っぽく振る舞いつつ、中身はDirectX9、みたいな事が出来る。(ちなみに、OpenGLっぽく見せかけて中身がDirectX、もしくはその逆、みたいなライブラリもあるらしい)
こうする事で、DirectX8のAPIとして呼び出すとバグる機能も、処理をDirectX9に投げているので正常に動作する、と言う訳。
このようなDLLは「プロキシDLL」などと呼ばれる模様。
なので、この「DX8 to DX9 convertor」はファイル名が「d3d8.dll」でなくてはならず、また、プログラム(exe)がある場所と同じフォルダに配置する必要がある。(これが何故かは先程のdllの検索順序を考えれば理解出来るはず。)
ちなみに「d3d8.dll」はDirectX8のdllのファイル名。
最後に
ここで名前が挙がった様々な物は僕が作った訳では無いので、この説明や原理が正しいかどうかの保証は出来ませんが、少しでも参考になればと思い記事にしてみました。
とにもかくにも、これでWindows10でも東方が楽しめる。
パソコン関係は新しい方が良いのさ、ゴミはさっさとゴミ箱へ……