vim-duzzle Any%RTA 1:32.02
この記事はVim Advent Calendar 2021 カレンダー2の12日目の記事です。
Vimにはvim-duzzleという、derisさんという方が作った脱出系パズルゲームがあります。
このゲームは42ステージから構成されるパズルゲームで、Vimの色々な操作を実際に試すことができます。Vimの練習用としてもよくできていて、vimtutorの次にするものとしてとてもいい感じです。想定時間は30分ぐらい。最初はもう少しかかるかもしれません。導入方法は"vim-duzzleの導入手順"にまとめています。
そんなvim-duzzleですが、もし全力で走り切ったらどれくらいかかるのか。気になって今回RTAをやってみました。開始は開始画面の[Press Enter]を押したタイミング、終了は最終画面に到達したタイミングで計測しています。結果はこちら!
だいたいこれぐらいですね。もうちょっと詰めようはあるかも…?とはいえ1:30.00を切るとなると案外難しそう。グリッチがあれば更に短縮できるかもしれないです。
各ステージ解説
思いっきりネタバレなので注意。短縮ルートを使っている箇所もあるので、最初は何も見ないでやったほうが練習になると思います。念のため折りたたみに。
解説
| ステージ | 手順 | 
|---|---|
| Room1 | カウント指定で一瞬。縦の移動量がRoom2以降と異なる点に注意。事故率高 | 
| Room2 | カウント指定で一瞬 | 
| Room3 | カウント指定で一瞬 | 
| Room4 | カウント指定で一瞬ですが回数指定が2桁なので入力ミスに注意 | 
| Room5 | カウント指定で一瞬ですが回数指定が2桁なので入力ミスに注意 | 
| Room6 | w+カウント指定で一瞬 | 
| Room7 | 正攻法が一番 | 
| Room8 | 正攻法が一番 | 
| Room9 | 正攻法が一番。,を使おうとしないよう注意 | 
| Room10 | 正攻法が一番。,を使おうとしないよう注意 | 
| Room11 | 正攻法が一番。,を使おうとしないよう注意 | 
| Room12 | 正攻法が一番 | 
| Room13 | fで中央まで移動すると短縮可。回数指定が2桁なので入力ミスに注意 | 
| Room14 | w+カウント指定で一瞬。回数指定が2桁なので入力ミスに注意 | 
| Room15 | 正攻法が一番 | 
| Room16 | 正攻法が一番 | 
| Room17 | 正攻法が一番 | 
| Room18 | fで中央まで移動すると短縮可。回数指定が2桁なので入力ミスに注意 | 
| Room19 | fで中央まで移動すると短縮可。回数指定が2桁なので入力ミスに注意 | 
| Room20 | 正攻法が一番 | 
| Room21 | 正攻法が一番 | 
| Room22 | 正攻法が一番。遡ると少し早い | 
| Room23 | 正攻法が一番。遡らないと少し早い | 
| Room24 | 正攻法が一番。%は括弧より前で使ってOK | 
| Room25 | 正攻法が一番 | 
| Room26 | 正攻法が一番。上下の逆転に注意 | 
| Room27 | 正攻法が一番 | 
| Room28 | 正攻法が一番 | 
| Room29 | dt<SPACE>dtgでゴールまで一瞬 | 
| Room30 | dt<SPACE>dtgでゴールまで一瞬 | 
| Room31 | dt<SPACE>dtgでゴールまで一瞬 | 
| Room32 | 正攻法が一番。使う括弧は4番目 | 
| Room33 | 正攻法が一番。%%とすると少し早い | 
| Room34 | 正攻法が一番。%%とすると少し早い | 
| Room35 | 正攻法が一番 | 
| Room36 | 正攻法が一番。適宜減速すること | 
| Room36 | 正攻法が一番。適宜減速すること | 
| Room37 | 正攻法が一番 | 
| Room38 | 正攻法が一番。使う括弧は2番目 | 
| Room39 | 正攻法が一番。使う括弧は2番目、3番目、4番目 | 
| Room40 | 正攻法が一番。使う括弧は最初の括弧、以降は2連続の開き括弧 | 
| Room41 | カウント指定で一瞬。縦の移動量に注意 | 
| Room42 | カウント指定で一瞬 | 
手順は簡単ですが、やってみると意外と事故します。Vimに慣れているとどこかで必ず存在しないキーを使ってしまうはず。何回か再走しましょう。
各ステージの想定キーストロークは次の通り。
| ステージ | キーストローク | 
|---|---|
| Room1 | 3j7l | 
| Room2 | 4j7l | 
| Room3 | 4j7l | 
| Room4 | 4j16l | 
| Room5 | 23l4j7h | 
| Room6 | 7w | 
| Room7 | wjjbjjw | 
| Room8 | ejjgejjw | 
| Room9 | fpjjFpjjfg | 
| Room10 | tpjjTpjjfg | 
| Room11 | fp;;;jjFp;;;jjfg | 
| Room12 | fp;;;jj,,,,jjfg | 
| Room13 | 12f<SPACE>4j | 
| Room14 | 15w | 
| Room15 | ^jjj$ | 
| Room16 | 0jjjjg_ | 
| Room17 | $3j | 
| Room18 | 12f<SPACE>12j | 
| Room19 | 12f<SPACE>4j | 
| Room20 | /g<CR> | 
| Room21 | ?g<CR> | 
| Room22 | w*NNw | 
| Room23 | w#nnnw | 
| Room24 | %llllll | 
| Room25 | %jjjj%jjjj%llllll | 
| Room26 | %hhhhh%jjjj%llllll | 
| Room27 | %Fpkkkkfg | 
| Room28 | df}lllll | 
| Room29 | lljlldt<SPACE>lljdtg | 
| Room30 | llllllldt<SPACE>lljdtg | 
| Room31 | llllllldt<SPACE>lljdtg | 
| Room32 | lllll%llllll | 
| Room33 | %%ldf)h%llllll | 
| Room34 | %%ldt<SPACE>dt<SPACE>h%dtg | 
| Room35 | jjlljllllll | 
| Room36 | jjjjjlllllljjljllllljlllllllllllllllljll | 
| Room37 | }$kk | 
| Room38 | lll%lll | 
| Room39 | llll%llll%l%%llll | 
| Room40 | %l%llll%lll%llllll%lllllllllllllll | 
| Room41 | 3j7l | 
| Room42 | 4j7l | 
vim-duzzleの導入手順
vim-duzzleはVimのプラグインなので、他のプラグインと同じ方法でインストールすれば大丈夫です。もしプラグインマネージャを使っていなかった場合でも、Vim8から追加されたパッケージ機能を使うと簡単にインストールができるので、その手順を説明します。
Windows
WSL2やMSYS2を使っている場合はLinuxのほうの手順で進めます。
もしVimが手元に無い場合
もし手元に無い場合はScoopを使ってVimをインストールするのがおすすめです。ScoopはScoopの公式サイトの手順でインストールできます。
Scoopをインストールしたら、次のコマンドを実行してvimとgitをインストールします(vim: Vim本体、git: バージョン管理システム)。
scoop install vim
scoop install git
インストール
次のコマンドでvim-duzzleをクローンします。
git clone https://github.com/deris/vim-duzzle %HOMEPATH%\vimfiles\pack\pack\start\vim-duzzle
あとは次のコマンドでVimを起動して:DuzzleStartというコマンドを実行すると開始できます。
vim
Mac
環境が手元に無く試せていませんが、恐らくLinuxのほうの手順でできると思います。
Linux
VimとGitをインストールしたのち、次のコマンドでvim-duzzleをクローンします。
git clone https://github.com/deris/vim-duzzle ~/.vim/pack/pack/start/vim-duzzle
あとは次のコマンドでVimを起動して:DuzzleStartというコマンドを実行すると開始できます。
vim
今回用に作ったRTA用のあれこれ
今回RTA用にスクリプトを作成しています。使い方は簡単で、git cloneで落としたら、後はディレクトリに入って./startvim(Windowsのcmdであればstartvim)とするだけです。そうすると、vim-duzzleのインストール、vimrcの読み込みを無効化した上での起動をやってくれます。動作には次のものが必要です。また、それぞれにPATHが通っている必要があります。
- vim
- git
また、Windows限定ですがLiveSplitと連携できるようにしていて、レイアウトファイル、スプリットファイル、タイマー制御ロジックを用意しています。レイアウトファイル、スプリットファイルはそれぞれ次の場所に配置しており、LiveSplitで読み込むだけで利用できます。
- share/livesplit/vim-duzzle-layout.lsl
- share/livesplit/vim-duzzle-split.lss
タイマー制御ロジックを利用する場合は次のファイルの編集と、次のものが必要です。
- 
conf/config.json - livesplit_enableをtrueに
- livesplit_addressをLiveSplitのアドレスに(WSL2を使っている等の場合に編集が必要です)
 
それぞれ、LiveSplit Development Buildはリンク先のDOWNLOADSのLiveSplit Development Buildから入手、展開して任意の場所に配置(zipファイルは直下がディレクトリでないので展開時は注意)、LiveSplit.Serverはリンク先のreleasesのLiveSplit.Server.zipから入手、展開してLiveSplitのディレクトリのComponentの配下にファイルを配置すると導入できます。LiveSplit.Serverを有効にするには、Edit layoutにLiveSplit Serverを追加して、ControlからStart Serverとする必要があります。用意したレイアウトファイルには最初からLiveSplit Serverを追加しているので、レイアウトファイルを読み込んでさえいればStart Serverをするだけで大丈夫です。このStart ServerはLiveSplitの起動のたびに必要です。これらのセットアップがされていれば、開始でstarttimer、中断でpause、終了でsplitをしてくれます。
その他、vimの起動オプションに-Wを指定しており、操作ログをlog/vim.logに残すようにしてあります。
今回撮った動画の撮り方
今回は特に凝ったことしてないですが一応…。今回は、ターミナルを全画面表示にして、LiveSplit、KeyCastOWを立ち上げ、OBS Studioの画面キャプチャで録画、AviUtlでBGMを追加するぐらいしかしていないです。
- wsltty (ターミナル(フォント: Cica、テーマ: Nord))
- LiveSplit (タイマー)
- KeyCastOW (入力キー表示)
- OBS Studio (録画)
- AviUtl (動画編集)
LiveSplit、KeyCastOW、AviUtlだけ入れ方が少し複雑かもしれません。LiveSplitは前述した通りの手順で大丈夫ですが、KeyCastOWはMSBuildでのビルドが必要です。手順は次の記事等が参考になります(VisualStudioは最新版で大丈夫です)。VisualStudioを"C++によるデスクトップ開発"にチェックを入れてインストールしたら、VisualStudioでソリューションとして開いて、プロジェクトの再ターゲットをやって、後はソリューションのビルドをする感じです。
AviUtlは本体に加えて、拡張編集プラグイン、入力プラグイン、出力プラグインを入れる必要があります。手順は次のページ等が参考になります。
動画を撮る構成は何でも大丈夫だと思います。
まとめ
完走した感想…走ってみるとステージ構成がよくできていて遊びがいがありますね。最初はRoom27が気に入ってましたが、他のステージも遊んでる内にいいなと思うようになりました。あとは純粋にVimの練習をするのであれば、正攻法で全部行くのが一番いいと思います。今回は走っていないですが、monaqaさんのフォーク版のvim-duzzleも試したいところ…
また、今回RTA用にあれこれ用意したりしましたが、遊ぶ分にはvim-duzzle以外は何も入れなくて大丈夫です。もし気になったら是非遊んでみてください!

Discussion