ごちゃペディア

はなまるデジタル創作紀行(DTM、TAS、いろいろな技術)

「Hourglass」を利用したWindowsゲームのTAS製作

Hourglass (GitHub)Windows向けゲームのTASを作成するためのツールです。

www.nicovideo.jp

Hourglass が公開されてまもなく、洞窟物語TASStickman TAS などが公開されました。Hourglass が使えるかどうかはゲームによって異なるようですが、今後も作品数は増えていくものと思われます。

本記事では、Hourglass の基本的な使い方を紹介します。

Hourglass はどんなツール?

Hourglass は指定されたゲームを独自に書き換えして起動することで、以下に挙げるような機能を利用可能にします。

  • ムービーの記録・再生(キー記録のみ、マウスなどは執筆時現在未対応)
  • セーブステートの読み込みと保存(どこでもセーブ機能)
  • スローモーション、フレームアドバンス(コマ送り)、早送りなどの実行速度制御
  • ゲーム画面・音声のAVIファイル記録(低速でもコマ落ちしないはず)

ユーザーは何も考えず Hourglass からゲームを起動するだけでよいです。

中には Hourglass で起動を行うと、まったく正常に起動しないゲームや、一部機能がうまく動作しないゲームがあります。外部からアプリケーションに無理やり介入するので安定性の問題は避けられないと思いますが、今後徐々に解消されることを期待したいです。

動作環境に関してですが、開発者からは「XP推奨、Vistaや7でもそれなりに動くけれど十分なサポートはされていません(特に64ビット版)」というふうに言われています。

対応状況

いくつかのゲームでは安定して動作するようですが、同期ずれ(desync)がときどき発生するゲームや、エラーが出て起動できないゲームもあるようです。先駆者がそういった情報を公開していることもあるので、まずは既存の情報を探すと良いでしょう(検索例:東方 hourglass)。

Hourglass のインストール

2016年現在、Hourglass は TASVideos のページ上からダウンロードできます。

Nitsuja 氏が作成した元祖 Hourglass と、改良版の Hourglass Resurrection があるようです。2016年時点ではどちらも「開発途上(開発停滞中)」の様相を見せており、一概にはどちらを利用すべきとも言い難いようです。

インストールは、ダウンロードした圧縮ファイルを任意のディレクトリに展開するだけです。また、アンインストールは展開したファイルをフォルダごと削除するだけです。


使い方

多くの機能は操作感がエミュレータのそれとほぼ一致します。


ムービーの記録と再生

「Game Executable」で起動したいゲームを選んで「Run and Record New Movie」を押せば、ゲームが起動して、動画の記録が始まります。

「Stop Running」を押すとゲームが終了して、動画の記録が停止します(注*1)。

ムービーの再生は、既存ムービーが選ばれた状態で「Run and Play Existing Movie」を押すだけです。

キー設定の変更

「Input」メニューからキー設定を変更することができます。

「Configure Hotkeys」では、Hourglassの機能に割り当てるショートカットキーを編集することができます。デフォルトの設定を把握したいときも、この設定画面を見ればよいです。割り当てを変更したいときは、項目を選択して「Reassign」を押してください。

「Configure Game Input」では、ゲームに送るキーの設定ができます。デフォルト設定から変更することで、カーソルキーの左右の認識を入れ替えたり、特定のキー以外は押してもゲーム側で認識されないように設定したりすることができます。Hourglassの機能キーとゲームの操作キーが重複するような場合、この設定で割り当てを調整するとよいでしょう。


ステートの読み込みと保存

いわゆるどこでもセーブです。ステートの読み込みと保存はショートカットキーで行います(デフォルト設定では、F1〜F10でロード、Shift+F1〜F10でセーブ)。

一度作成したムービーの途中から記録を再開するには、以下の手順を行います(一般的なエミュレータでの操作と同じ)。

  1. ムービーの再生を開始する
  2. 記録を再開したい箇所でステートをセーブする
  3. Hourglass のウィンドウを見て Read+Write モードであることを確認し、先ほどのステートをロードする
  4. 動画を記録する状態になっているので、ここから記録を続ける
フレームアドバンス、速度変更

フレームアドバンスというのはコマ送り機能のことです。

フレームアドバンスはショートカットキーで操作します(デフォルトでは \ キー、スペースキーに割り当て)。フレームアドバンスを行ったあとの停止状態から、通常の速度に戻すには Pause を解除します(デフォルトでは Esc キー、Delete キー、Pause キーに割り当て)。

フレームアドバンスがあれば必要ありませんが、ゲームを50%などの一定の速度でスロー動作させることもできます。

また、Fast-Forward は極力ウェイト類を飛ばして高速に動作させようとします。作成したムービーの確認時などに便利です。

映像・音声のAVIファイル記録

「AVI」メニューで「Capture Video and Audio」を選ぶと、映像と音声がAVIファイルに記録されます。「AVI Capture Disabled」を選ぶと、記録は停止されます。


メモリアドレスの検索と監視

エミュレータに搭載の RAM Watch と RAM Search がありますが未完成気味です。現在のところは、これらの代替として MHS のような外部ビューアを利用することを推奨します。

関連: プロセスメモリエディタ「MHS」を利用したメモリ監視・操作 - ごちゃログ

*1:私が動作を確認したところによると、ゲーム終了後もHourglassを閉じるまではプロセスが残り続けていました。Windows XP 32bitでは起きない問題なのかもしれませんが、多重起動防止ロジックがあるゲームがこれにより起動できなくなることがあるので注意が必要です。ゲームを終了後は一旦Hourglassを閉じるのが確実です。

GitHubへのコミットをIRCにリアルタイム通知するには?

GitHubリポジトリにコミットしたとき、CIA.vcを利用してIRCにメッセージが飛ぶようにします。簡単、無料です。

GitHub の設定

  1. リポジトリの Admin ページを開く (管理者アカウントが必要)
  2. Service Hooks をクリックして、一覧からCIAを選択
  3. Active にチェックを入れて、Update Settings で変更を保存

これだけ、じつに簡単です。ほかにも Twitter などとも連携できるようです。

CIA.vc の設定

アカウントを持っていなければ、CIA.vc - Register an Account から登録してください。アカウント名やメールアドレスなど、若干の基本的な情報を聞かれるだけで簡単、無料です。また、アカウント名以外はあとから変更できます。

アカウントが準備できたら、ログインして CIA.vc - Your Account ページを開きましょう。

まず、通知メッセージを流したいチャンネルを追加します。左側のメニューから Bots → Add bot... とクリック、サーバとチャンネル名を入力して Add します(例:Freenode, TASers)。

追加されたチャンネルが一覧に表示されるのでクリック、Filter by project を選択して入力欄にプロジェクト名を入力してください(たとえば https://github.com/snes9xgit/snes9x の場合であれば snes9x と入力する。また、複数のプロジェクトの状況を監視したければ改行区切りで入力する)。Save を押して変更を保存すれば、これで指定のIRCチャンネルにコミット情報が通知されるようになります。

高度なフィルタリング (forkの考慮)

上記の方法でプロジェクトを追加すると、forkによる派生版の情報もIRCに流されます。派生リポジトリが本家のアップデートをマージすると、その分のコミット情報もすべて流れてきます。いくつか派生版があって、それらすべてがこまめに本家リポジトリの更新を取り込んでいるとすると、IRCに同じ情報が何度も流れてきて非常に不都合です。

状況を改善するには、Filter by project の代わりに Custom filter を選択して、より細かなフィルタリングを行います*1。フィルタリングの記法は CIA.vc - Advanced Filtering で説明されています。難しくはないので、内容に関しては割愛します。

以下にフィルタの例を示します。snes9xgit/snes9x の gocha さん以外からのコミットと、snes9x-rr の gocha さんからのコミットだけを通知しています。

<or>
  <and>
    <match path="project">snes9x</match>
    <or>
      <and>
        <find path="url">github.com/snes9xgit/snes9x</find>
        <not><match path="author">gocha</match></not>
      </and>
      <and>
        <find path="url">github.com/snes9x-rr/snes9x</find>
        <match path="author">gocha</match>
      </and>
    </or>
  </and>
</or>

<formatter medium="irc"/>
<formatter name="IRCProjectName"/>

なお、特定の人のコミット情報は http://cia.vc/stats/author/gocha のようなURLから閲覧可能です。Link をたどるとコミット情報を記した XML データを閲覧することができます。フィルタの作成にあたっては、一度どのようなデータが含まれているか眺めてみると役に立つことでしょう。

*1:Filter by project と Custom filter の併用はできない。乗り換える場合は <match path="project"> を記述して同等の効果を得るようにする。

古い Snes9xで使うライブラリのビルド方法 (zlib, libpng)

2011 年時点の Snes9x 向けの zlib と libpng のビルド手順です。2019 年現在は公式ビルドガイドに沿っていればこういったことを考える必要はありません。

本体のビルドについては、Snes9x のソースコードをコンパイルするをご覧ください。

使用するツールとライブラリ

スタティックライブラリをビルドします。DLLであれば些細なバージョン違いでのエラーは発生しないと思うので、手間なく継続的に開発できるようにするには、DLLとリンクする方が良いかもしれません。

本記事では Snes9x 向けのライブラリをビルドするので、文字コード(MBCS/Unicode 両サポート)周りで通常のビルドとは異なる手順を必要とします。

コンパイル手順

前準備
  1. zlib と libpng のソースコードをダウンロードして展開する
  2. libpng/projects/vstudio/zlib.props を開いて、ZLibSrcDir を修正する(相対指定は zlib.vcxproj からの相対位置になる)
  3. zlib/contrib/masmx86/bld_ml32.bat を開いて、ml のオプションに /safeseh を追加する(/safeseh 追加の参考
  4. 修正したらソリューション vstudio.sln を開いて、デフォルト設定のビルドが成功することを確認する
Win32 ビルド

*** 最適化及びデバッグオプションの統一

[Debug Library] [Release Library] のオプションを、zlib, libpng についてそれぞれ変更する。

  • 最適化オプションを Snes9x と揃える([ランタイム オプション])
  • [C/C++]-[デバッグ情報の形式] を Snes9x と揃える
  • [全般]-[ターゲット名] を出力したいファイル名に設定する
  • [全般]-[文字セット] を [マルチバイト文字セットを使用する] あるいは [設定なし] にする
  • [C/C++]-[出力ファイル]-[プログラム データベース ファイルの名前] をなど出力したいファイル名に設定する(コンパイル後のリネーム厳禁)(例: $(OutDir)$(TargetName).pdb)。

*** zlib コンパイルの修正

  • 「error LNK2001: unresolved external symbol _gzclose」への対策を行う
    • zlib プロジェクトに gzclose.c, gzlib.c, gzread.c, gzwrite.c を追加する
    • [C/C++]-[プリプロセッサ]-[プリプロセッサの定義] から Z_SOLO を削除する
    • [C/C++]-[全般]-[警告をエラーとして扱う] を「いいえ」に設定する

以上を設定後、libpng プロジェクトをリビルドする。

x64 ビルド

Win32 ビルドの構成を複製するので、ビルド設定を完了後に実施してください。

  • メニュー [ビルド]-[構成マネージャー] を開いて、Win32 構成を元に x64 構成を新規作成する
  • 出力ファイル名を適宜変更する

以上を設定後、libpng プロジェクトをリビルドする。

Unicode ビルド

Cランタイム関数の呼び出しをUnicode版に差し替えることで、Unicode サポートを実現します。

  • [全般]-[文字セット] を [Unicode 文字セットを使用する]に設定する
  • snes9x/win32 ディレクトリの _tfwopen.cpp を zlib, libpng プロジェクトに追加する
  • snes9x/win32 ディレクトリの _tfwopen.h をインクルードパス上に配置する
  • [C/C++]-[詳細設定]-[必ず使用されるインクルード ファイル] に _tfwopen.h を追加する
  • [プリコンパイル済みヘッダー] を使用しない設定に変更する
その他

ライブラリのビルド以外における留意事項です。

  • libpng/scripts/pnglibconf.h.prebuilt を pnglibconf.h にリネームして snes9x の所定ディレクトリに配置する

古い Snes9x のソースコードをコンパイルする

以下はとても古い時代に書かれた記事です。最新の Snes9x は CI で自動ビルドされています。バイナリがほしいだけなら自分でビルドする必要もありません。それでも自分でビルドしたい方は公式なビルドガイドを参照してください。この記事を執筆した当時と比べてずっと簡単です。

当時のコード向けのビルド済みの依存ライブラリファイルをおいておきます。

続きを読む