AI作るにあたりADSと連携できないかとファイル漁ってたら、どうやらGithubに公開されているらしいので見に行くと、C++とLuaで書かれていたのでとりあえずソースからコンパイルして実行できないか試してみた。
github.com
プロジェクトになれていない私には睡眠3時間のハードタスクだった。
OSはwindows10
手順概要
ソースコードに書いてある。
という不親切なことはやめておいて、未来の自分のためにメモしておこう。
ざっくりとした手順は次の通り。
- 必要なツール、ライブラリをダウンロードして環境を整える。
- プロジェクトチームが作成したビルド用のシェルスクリプトを読み解きながら、コマンド入力を行う。
- エラーを処理しながらビルドする。
シェルスクリプト解読に気付くまでに17時間くらい使い、そこから4時間程度で完成。
Githubのwiki欄を参照すると古い情報ゆえに私のように無駄な時間を過ごすので、スクリプトの意味がわからなかった時にだけ参考にするように。
参照コード
.travis.ymlとtravisフォルダ
travisCIというサービスが自動でビルドしてくれるらしく、その命令用のソースがこれら。
即ちビルド手順が全てここに詰め込まれているのである。
次の三行を実行すればよい。
(そのままコマンドラインに入力しても無意味なことに注意!)
インストールしたツールたち
それぞれビルドとダウンロードに使う。
VisualStudioには「C++によるデスクトップ開発」と「個別コンポーネント/VS 2017 (v141) ツールの C++ Windows XP サポート [非推奨]」をインストールしておく必要がある。
ソースのダウンロード
Unixコマンドを使用するためターミナルにはGit Bashを使用する。
(Cの講義取ってなかったらUnixコマンド一生知らなかっただろうな...)
ダウンロードしたいディレクトリに移動して
#ソースのダウンロード $ git clone https://github.com/edo9300/ygopro.git ads $ cd ads #ocgcoreのダウンロード $ git clone https://github.com/edo9300/ygopro-core ocgcore
例の3行を実行
2行目
ソースの中身を見ると次の三つを実行すべきだとわかる
#!/usr/bin/env bash set -euxo pipefail ./travis/install-local-dependencies.sh if [[ "$TRAVIS_OS_NAME" == "windows" ]]; then ./travis/get-windows-vcpkg-cache.sh ./travis/get-windows-d3d9sdk.sh fi
ちなみに$TRAVIS_OS_NAME
は.travis.yml
で定義されている変数なのでファイルをそのまま実行しても機能しない。
./travis/install-local-dependencies.sh
上から一行一行処理していけばよい。
やっていることは3dゲームエンジンやサウンドエンジンなどのダウンロード、解凍、しかるべき場所への配置である。
Unixコマンドなので調べなくても感覚で読めるかもしれない。
./travis/get-windows-vcpkg-cache.sh(vcpkg)
#!/usr/bin/env bash set -euxo pipefail mkdir -p "$VCPKG_ROOT" cd "$VCPKG_ROOT" curl --retry 5 --connect-timeout 30 --location --remote-header-name --output installed.7z $VCPKG_CACHE_7Z_URL 7z x installed.7z mv irrlicht/include /usr/local/include/irrlicht mv irrlicht/lib/* /usr/local/lib
モジュールのダウンロード。
数行の処理だが変数が噛んでいるため、そのままは実行できない。
適当な場所(Cドライブ直下とか)にvcpkg
ディレクトリを作成して、zipファイルを解凍すればよい。
その後mvコマンドに従ってフォルダを移動させる。
移動させなくても2回目のビルドができたが、それが以前何かしらの操作をしていたからなのかは不明。
./travis/get-windows-d3d9sdk(dirextX9 SDK)
#!/usr/bin/env bash set -euxo pipefail git clone --depth=1 https://github.com/kevinlul/DXSDK201006.git "$DXSDK_DIR"
"$DXSDK_DIR" はCドライブ直下がおすすめ。(元がそうであるため。)
3行目
とりあえずソースコードを参考に次のコマンドを打ち込む
$ ./premake5 vs2019 --sound=sdl-mixer #使用しているvsによってvs2017のように変更
そうすると/ads
にbuild
フォルダが追加される。
そのままソースコードの手順に従っても良いが、私はygo.sln
をVisual Studio 2019で開いてビルドを行った。
ビルドを行うとエラーを吐きまくって、まず成功はしない。
そこで主要なエラーに対する処置を記載しておく。
- includeエラー
各プロジェクトは名前が一致するフォルダ内に配置されたpremake5.lua
(数字は異なり得る)に従って構成されている。
例えば、次のコードはirrlicht/premake5.lua
であるが$(DXSDK_DIR)
という変数が使われているのがわかる。
project "Irrlicht" kind "StaticLib" includedirs "include" links "imm32" dofile("defines.lua") exceptionhandling "Off" rtti "Off" files { "**.cpp", "**.c", "**.cxx", "**.hpp", "**.h" } filter "options:no-direct3d" defines "NO_IRR_COMPILE_WITH_DIRECT3D_9_" filter "options:not no-direct3d" defines "IRR_COMPILE_WITH_DX9_DEV_PACK" includedirs "$(DXSDK_DIR)Include" libdirs "$(DXSDK_DIR)Lib/x86"
これを先ほどダウンロードしたdirectX9 SDKのパスを直接書き込んでやればよい。
私はそれでも解決しなかったため、Include
内全部をirrlicht/include
にコピペした。
2回目もここで詰まったので、最初からInclude
の中身をirrlicht/include
にコピペするのが良いかもしれない。
以下のエラーはedopro
https://github.com/edo9300/ygopro-coreの公開しているCoreを使用することで回避可能。
- back_inserter' 'std' のメンバーではありません。
VC++10の仕様変更の影響。
相当古いソースを使っているらしい。
該当ファイル(ocgcore/operations.cpp
)のインクルードに#include < iterator >
を追加する。
流石にソースからビルドするような人にインクルードの説明は要らないだろう。
- 'uint32_t' から 'int' への変換には縮小変換が必要です
MicroSoftのドキュメントによるとキャストすれば直るらしいが、直らなかったのでそのままexeファイルを実行したら動いたのでとりあえず無視することにした。
いつかエラー吐くのが楽しみですね。
と、全てのコンパイルエラーを抜ければ起動できるようになるので、予めインストーラー等で導入したEDOproのカード画像やフォントを使えばADSが動くわけである。
(そもそもADSをインストールできない人はダメ元で./travis/quickrun.sh
を試してみるとか?)
まとめ
手順の流れを1つのシェルスクリプトにしてみたので、Windows10環境ならコピペでも動くかも?
#githubからクローンしてきた後、そのディレクトリ(eg. c/ads)で実行する # install core engine git clone https://github.com/edo9300/ygopro-core ocgcore # install premake5.exe ./travis/install-premake5.sh windows # install irrklang64 curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name http://www.ambiera.at/downloads/irrKlang-64bit-1.6.0.zip echo Extracting irrKlang64... unzip -uo irrKlang-64bit-1.6.0.zip > /dev/null rm -rf irrKlang mv irrKlang-64bit-1.6.0 irrKlang rm irrKlang-64bit-1.6.0.zip # install freetype curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name http://downloads.sourceforge.net/freetype/freetype-2.6.5.tar.bz2 echo Extracting FreeType... tar xf freetype-2.6.5.tar.bz2 > /dev/null mv freetype-2.6.5/builds freetype mv freetype-2.6.5/include freetype mv freetype-2.6.5/src freetype rm -rf freetype-2.6.5 rm freetype-2.6.5.tar.bz2 # install irrklang32 # We wrap irrKlang32's extract because its zip has a hidden macOS directory that we don't want curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://www.ambiera.at/downloads/irrKlang-32bit-1.6.0.zip echo Extracting irrKlang32... unzip -uo irrKlang-32bit-1.6.0.zip -d irrKlang-tmp > /dev/null # Merge 32-bit binaries into folder mv irrKlang-tmp/irrKlang-1.6.0/bin/win32-gcc irrKlang/bin/win32-gcc mv irrKlang-tmp/irrKlang-1.6.0/bin/win32-visualStudio irrKlang/bin/win32-visualStudio mv irrKlang-tmp/irrKlang-1.6.0/lib/Win32-gcc irrKlang/lib/Win32-gcc mv irrKlang-tmp/irrKlang-1.6.0/lib/Win32-visualStudio irrKlang/lib/Win32-visualStudio rm -rf irrKlang-tmp rm irrKlang-32bit-1.6.0.zip # install irrlicht curl --retry 5 --connect-timeout 30 --location --remote-header-name --remote-name https://github.com/edo9300/irrlicht1-8-4/archive/master.zip echo Extracting irrlicht... this may take some time. unzip -uo irrlicht1-8-4-master.zip > /dev/null mv irrlicht1-8-4-master/include irrlicht/include # Technically, only code files need to be moved, and code files in lzma and aesGladman, but this is easier mv irrlicht1-8-4-master/source/Irrlicht irrlicht/src rm -rf irrlicht1-8-4-master rm irrlicht1-8-4-master.zip # We will build against vcpkg-provided versions of these libs rm -rf irrlicht/src/bzip2 irrlicht/src/jpeglib irrlicht/src/libpng irrlicht/src/zlib irrlicht/src/MacOSX # ※install vcpkg-cache and directX9 sdk here if you need※ # irrlicht/premake5.luaの"$(DXSDK_SDK)"を書き換えるコード # build for vs2019 ./premake5 vs2019 --sound=sdl-mixer
成功した後、わずかに書き換えたため不備があれば連絡求む