anti scroll

ブラウザと小説の新しい関係を模索する

ゲームパッドの操作を記述する言語「combo-script」と、その再生アプリ「combo-player」を作りました

きっかけ

作ったきっかけは、最近買ったウイイレ2020の操作が、ちっとも頭に入らなかったからです。。。

一応ゲーム内にマニュアルがあるんですけど、文字とか矢印で説明されても、ピンと来ないんですよね。。。

そこで思いついたのが「ゲームの操作をぱぱっと記述したら、パッド上の動きをアニメーションを再生しつつ、操作ログも出してくれる」みたいなものがあったら、理解が捗るかなあ〜?ということです。

というわけで作ったのが、combo-scriptと、combo-playerです。

例えばcombo-scriptで昇龍拳を記述して、combo-playerで再生するとこんな感じになります。

f:id:convertical:20200811165349g:plain
昇龍拳

その他、色々なコマンドについては、デモサイトを見てください。

tategakibunko.github.io

上のデモサイトでは、ウイイレの他に、スト5とか鉄拳のコマンドとかも追加しておきました。

メニューの「Games」から選択できます。

コマンド部分は編集可能になっているので、色々と書き換えて遊んでみてください。

f:id:convertical:20200811165922p:plain
コマンド部分(編集可能)

combo-script

combo-scriptは、ゲーム操作を記述するための言語です。こんな風に記述します。

コナミコマンド

up, up, down, down, left, right, left, right, A, B

昇龍拳十字キー操作で記述)

right, down, (right, down), punch

(right, down)は右と左を同時押し(つまり右下)という意味です。

一般にボタンの同時押しは(X, Y, Z...)のように記述します。

昇龍拳(スティック操作で記述)

setL(0), moveL(0, 90), rotateL(90, 45), punch

これは左スティックを0度(真右)に方向け、そこから真下に動かし、更にそこから45度(右斜め下)の位置まで回転させ、最後にパンチボタンを押す、という意味です。

setL, moveL, rotateLの引数は、傾ける先の角度ですが、この角度は時計回りであることに注意してください。時計回りなので、90度は真上ではなく、真下です。

ウイイレ、コントロールシュート

R2 { square }

上の構文はHolding Syntaxと言って、X { Y, Z, ... } などと書くと「Xの操作をしながらY,Z」という意味になります。

なので上のコマンドは

  • R2を押しながら□ボタン
  • 終わったらR2を離す

という意味になります。

combo-script(言語仕様)

詳しくは公式サイトを見てほしいのですが、大雑把に説明すると、

  • ボタンの押下、押しっぱなし、同時押し、各種スティック操作などを抽象化した言語です。
  • 特別なプログラミング知識がいらないので、誰でもコマンド部分を記述できます。
  • 矛盾した操作はコンパイル時にエラーが出ます(押し込んでいる最中のボタンを再び押すとか、左と右を同時に押すとか、色々)。
  • 押下についてはpushDown, pushUpを個別に扱う方法もあります。
  • プラグインで拡張することができます。
  • 定義済みの関数(rotateLとかmoveLとか色々)以外のシンボル名は、ユーザー定義のボタン名、もしくはユーザー定義のプラグイン関数として解釈されます。
  • 例えばpunchと書いたら、ユーザー定義のpunchボタンがあって、それを押して離す、という一連の動作として解釈されます。つまり、punchという名前のボタンをどう解釈するかは、combo-scriptを組み込む実装者に任されます。
  • 関数も同様です。例えばfoo(1,2)と書いた場合、そういう定義済みの関数はないので、ユーザー定義のプラグイン関数とみなされます。そして、実際の動作はcombo-scriptを組み込む実装者に任されます。
  • つまりボタン名も関数名も、それを解釈するのはプレイヤー側の仕事で、combo-script側は名前にルールや制限を設けません。コンパイラ側が判断するのは、それがボタンか、関数か、そしてそれらの動作は、どういう文脈で押されたか、ということだけです(通常押し、同時押し、押しっぱなしなど)。
  • というわけで、例えばパッド右側にある4つのボタンなどは、プレステ風にtriangle/circle/cross/squareと定義してもいいし、Xbox風にY,B,A,Xと定義してもいいです。
  • ただしボタン名を数字から始めることはできません。つまりbutton1はいいけど、1buttonは駄目。
  • ちなみに、combo-scriptは大文字と小文字を区別しません。だからupと書いてもUPと書いても同じです。これは関数も同じ。
  • あとボタン名については英数じゃなくてもいいです。例えば日本語で強パンチとか書いても問題ありません。

コンパイルの仕方とか、それをどうやって自分のプレイヤーアプリに組み込むか、みたいなことは公式サイトを確認してください。

感想

  • ウイイレ2020は難しい。
  • 昇龍拳のコマンドを初めて知った。
  • 鉄拳のコマンドを思い出すことが出来た。