🐎

vim-duzzle Any%RTA 1:32.02

2021/12/12に公開

この記事はVim Advent Calendar 2021 カレンダー2の12日目の記事です。

Vimにはvim-duzzleという、derisさんという方が作った脱出系パズルゲームがあります。

https://github.com/deris/vim-duzzle

このゲームは42ステージから構成されるパズルゲームで、Vimの色々な操作を実際に試すことができます。Vimの練習用としてもよくできていて、vimtutorの次にするものとしてとてもいい感じです。想定時間は30分ぐらい。最初はもう少しかかるかもしれません。導入方法は"vim-duzzleの導入手順"にまとめています。

そんなvim-duzzleですが、もし全力で走り切ったらどれくらいかかるのか。気になって今回RTAをやってみました。開始は開始画面の[Press Enter]を押したタイミング、終了は最終画面に到達したタイミングで計測しています。結果はこちら!

https://twitter.com/nil_two/status/1469684926488653825

だいたいこれぐらいですね。もうちょっと詰めようはあるかも…?とはいえ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から追加されたパッケージ機能を使うと簡単にインストールができるので、その手順を説明します。

https://qiita.com/thinca/items/cdc0169e3bcc5a55a5ba

Windows

WSL2やMSYS2を使っている場合はLinuxのほうの手順で進めます。

もしVimが手元に無い場合

もし手元に無い場合はScoopを使ってVimをインストールするのがおすすめです。ScoopはScoopの公式サイトの手順でインストールできます。

https://scoop.sh/

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用のあれこれ

https://github.com/nil-two/vim-duzzle-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

タイマー制御ロジックを利用する場合は次のファイルの編集と、次のものが必要です。

それぞれ、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でソリューションとして開いて、プロジェクトの再ターゲットをやって、後はソリューションのビルドをする感じです。

https://ntukey.hatenablog.com/entry/2021/04/03/195049

AviUtlは本体に加えて、拡張編集プラグイン、入力プラグイン、出力プラグインを入れる必要があります。手順は次のページ等が参考になります。

https://aviutl.info/intro/

動画を撮る構成は何でも大丈夫だと思います。

まとめ

完走した感想…走ってみるとステージ構成がよくできていて遊びがいがありますね。最初はRoom27が気に入ってましたが、他のステージも遊んでる内にいいなと思うようになりました。あとは純粋にVimの練習をするのであれば、正攻法で全部行くのが一番いいと思います。今回は走っていないですが、monaqaさんのフォーク版のvim-duzzleも試したいところ…

また、今回RTA用にあれこれ用意したりしましたが、遊ぶ分にはvim-duzzle以外は何も入れなくて大丈夫です。もし気になったら是非遊んでみてください!

Discussion