VimからPICO-8・TIC-80・LÖVEをお手軽に使えるようにする

色々あって更新がだいぶ久しぶりになってしまいました。

ここ一年くらい、2D系のゲームエンジンをちょこちょこいじって楽しむことが多かったのですが、その中でも触れる機会が多かったのが以下の3つのゲームエンジンです。

参考(Fantasy Console Game Jam 3):

www.youtube.com

どのエンジンも、Lua等のスクリプトで気軽にゲーム開発を始められるのが魅力ですが、せっかくならVimから簡単に実行できるようにして、もっと手軽にコーディングを楽しみたい!ということで、専用の実行コマンドを作成してみることにしました。

やりたいこと

  • VimのコマンドでPICO-8、TIC-80、LÖVEを起動する
  • その際に、現在編集中のソースコードを自動的に実行する
  • LÖVE場合は自動で起動フォルダを探して指定する
  • WindowとMacのどちらでも同じコマンドが使える

思いついたらさっとコードを書いて、面倒な設定なしにショートカットを押すだけで即実行、というのが目指す姿です。

なお、TIC-80はコードをテキスト形式で保存可能な$5の有料版を使用します。

実現方法

当初はvim-quickrunで実現しようと思ったのですが、OSごとに処理を振り分けたり、バックグラウンドで実行したかったりと、色々調整が必要だったので、独自コマンドを作成する方針に切り替えました。

コード

作成したVim scriptがこちら。

if has('mac')
  let s:pico8 = "/Applications/PICO-8.app/Contents/MacOS/pico8"
  let s:tic80 = "/Applications/tic80.app/Contents/MacOS/tic80"
  let s:love = "/Applications/love.app/Contents/MacOS/love"
elseif has('win32') || has('win64')
  let s:pico8 = "C:/Program Files (x86)/PICO-8/pico8"
  let s:tic80 = "C:/Program Files (x86)/tic80_pro_0.60.3/tic80"
  let s:love = "C:/Program Files/LOVE/love"
endif

function! s:Run(c)
  if has('mac')
    execute 'silent !' . a:c . '&'
  elseif has('win32') || has('win64')
    execute 'silent !start ' . a:c
  endif
endfunction

function! s:RunPico8(...)
  call s:Run('"' . s:pico8  . '" -run %')
endfunction

function! s:RunTic80(...)
  call s:Run('"' . s:tic80 . '" -code-watch %')
endfunction

function! s:RunLove(...)
  let l:dir = fnamemodify(findfile('main.lua', expand('%:p:h') . ';'), ':p:h')
  call s:Run('"' . s:love . '" ' . l:dir)
endfunction

command! Pico8 call s:RunPico8()
command! Tic80 call s:RunTic80()
command! Love call s:RunLove()

動作の流れ

最初にMacWindowsそれぞれの各エンジンのパスを指定し、それをベースにs:RunPico8s:RunTic80s:RunLoveの各関数で実行コマンドを作成しています。実行コマンドはs:Run関数でOSに適した形でバックグランド実行されます。

ちょっとトリッキーなのはLÖVEの実行コマンド作成箇所で、以下のコードにより

  let l:dir = fnamemodify(findfile('main.lua', expand('%:p:h') . ';'), ':p:h')

作成中のファイルがあるフォルダから、ルートフォルダにさかのぼりながら、main.luaを含むフォルダを探して、それをプロジェクトのフォルダとして使用するようにしてあります。

PICO-8の起動方法

Vimで.p8ファイルを保存した後に、コマンド:Pico8を実行すると、PICO-8が起動してファイルが自動実行されます。

PICO-8起動後はコードを更新するごとに、PICO-8 上でCommand(またはCTRL)+rを押すとファイルが再読み込みされます。

なお、新規に.p8ファイルを作成した際はコードの先頭に以下のヘッダを記述する必要があります。(v0.1.11g時点のもの)

pico-8 cartridge // http://www.pico-8.com
version 16
__lua__

.vimrcに以下のように記述すると、luaシンタックスハイライトの適用とヘッダの挿入を自動で行います。

function! s:EditPico8()
  set filetype=lua
  if getline(1)[:5] != 'pico-8'
    call append(0, 'pico-8 cartridge // http://www.pico-8.com')
    call append(1, 'version 16')
    call append(2, '__lua__')
  endif
endfunction

augroup pico8
  autocmd!
  autocmd BufRead,BufNewFile *.p8 call s:EditPico8()
augroup END

TIC-80の起動方法

Vimで.lua/.moon/.jsファイルを保存した後に、コマンド:Tic80を実行すると、TIC-80が起動してファイルが自動実行されます。

TIC-80起動後はコードを更新するごとに、TIC-80上でCommand(またはCTRL)+rを押すとファイルが再読み込みされます。

なお、TIC-80はPICO-8と異なり、TIC-80側からファイルを上書きすると、規定の保存用フォルダに同名の別ファイルが作成されてしまうため、TIC-80のfolderコマンドで開かれる保存用フォルダにファイルを作成するのが無難です。

LÖVEの起動方法

プロジェクトフォルダ内の任意の.luaファイルを保存した後に、コマンド:Loveを実行すると、LÖVEが起動してファイルが自動実行されます。

編集するファイルはプロジェクトフォルダ内のものであればどれでも大丈夫ですが、LÖVEのルールとして、プロジェクトファイルの直下にmain.luaファイルが存在している必要があります。