東方弾幕風の不満点、およびその解決策

東方のファンをやっていると、時々「こんな弾幕が有ったら面白くね?」と思ったりします。
そんな時、 東方弾幕風 を使うと気軽に弾幕を製作できて便利なのですが、不満点が幾つか。
この東方弾幕風スクリプトで使われている言語が、弾幕風オリジナルの言語なのです。
別にオリジナルの言語を使っているから不満というわけではないのですが、

  • C で言う構造体に相当するものがない
  • 動的型付けの言語なのに文字列が wchar_t の配列
  • 無引数の関数を () 無しで呼べてしまうため、関数を値として扱えない
  • 重い

等の、見過ごせない不満点があるのは、やはりオリジナル言語だからだと思うのです。


そもそもプログラムというのは楽をしてなんぼの世界であり、
いちいちオリジナルの言語を設計し、その処理系を作り、云々だと、完成度は低くなりがちです。
その点、世の中で広く用いられている言語を使えば、バグも少ないし、動作も速いし、
サンプルコードも大量に見つかるし、細かい仕様も考えなくていいし、といいことずくめ。
オリジナルの言語を使う唯一のメリットは、自作であるが故にライセンスが自由な点ですが、
そもそもスクリプト言語のライセンスは緩いものが多いので、大したメリットにはならないでしょう。


勿論、現行の弾幕風には、それなりの良さが有って、それは task による擬似マルチタスクな訳ですが、
これは最近の言語では coroutine と呼ばれている機能で簡単に代替できます。
そう考えると、東方弾幕風がオリジナル言語である必要は殆ど皆無である、とすら言えるのです。


無論、公式の東方弾幕風は、過去のスクリプトとの互換性もありますので、乗り換えは難しいでしょう。
そこで銀天研究所は、東方弾幕風の使用感を残したまま、言語を既存のスクリプト言語
具体的には Lua を用いて書き換えた東方弾幕風 like な弾幕シミュレータを作りたいのです。


その際、現行の東方弾幕風スクリプトを単純に Lua で置き換えるのでは、少し芸が無い。
というのも、現行の弾幕スクリプトには、過去からの経緯による、少しばかり不細工な関数が多いですし、
そもそもモジュール化されていないし、 Lua の良さを活かすのは少々難しい。
また、オリジナルの弾を使いたいとか、画面サイズを変えたいとか、そういう要求にも応えにくいです。


この問題にどうやって対処しようかと考え、僕は一つのアイデアを思いつきました。
それは「東方弾幕風Lua 版」というアイデアを取り払う、というもの。
いっそのこと、 Lua を用いた汎用の弾幕製作フレームワークを作ってしまえば良いのです。
そのフレームワークのコア部分では、必要最小限の共通部分だけを提供する。
そして、具体的な画面サイズや弾や自機等の諸々は、処理系に任せてしまおう、という考え方です。


具体的に考えましょう。フレームワークのコア部分では、まず何を提供するか。
まず、ファイルのフォーマットを指定する必要があります。
東方弾幕風では、再生するスクリプトを選ぶ際、弾幕の名前や簡単な説明等を見れます。
ファイルの冒頭部分に、それらの情報を特定フォーマットで指定しておけば、
簡単な解析を行うだけでスクリプト情報を取得出来るし、再生させないことも可能になります。
次に、基本的な情報の取得周りの関数群の定義は必要でしょう。
「画面の大きさ」「縦スクロールか横スクロールか」「処理系非依存にするため、基本的な弾を得たい」「敵の標準的な体力を調べたい」「自機の攻撃力の目安を知りたい」「自機の判定の大きさを知りたい」等です。
それから、ボスの移動やボス位置の取得、自機座標の取得、弾の発射、といった一通りの関数は、当然必要。
これらの関数を駆使することで、処理系によらない弾幕を作ることも可能になるようにしたい。
それが、コア部分の存在する意義であり、目指す所となります。


次に、処理系で決めることは、何があるか。
これは要するに、具体的なあれこれです。画面の大きさ、自機について、敵弾について、等々。
コア部分で抽象的に定義されていた物は、ここで全て具体的に決められます。
それに伴ない、特殊攻撃のための関数を用意したり、といったことも普通にあるようにしたいです。
それから、大事なこととしては、コア部分の関数をラップすることも可能にしたい。
これは、専ら東方弾幕風との兼ね合いで必要です。
従来の東方弾幕風と同じような書き方で、同じように動作させたい、という需要は有る筈。
というか、僕がそうです。構文が違うので無改変で動かすのは無理ですが、
それこそちょっとしたスクリプトを書いて単純な置換を行えば、それで移植が出来るようにしたい。
これは、恐らく最も大事なことであると考えます。
また、こうすることで、東方弾幕風とは違った感じの弾幕シミュレータも作れます。
横スクロールにしたり、ファイル選択をなくして一本道にしたり、等。
おまけとして、MODの製作を行い易くする、という意図もあります。
これらの製作を行いやすくする、というのも、処理系とコア部分を分割する意義となります。


まとめ。

  • 東方弾幕風は便利だが、俺言語を使ってるのがキモい。どうにかしたい。
  • Lua で動作する弾幕製作ツールがあると嬉しい。便利だし軽快。
  • その際、オリジナルの東方弾幕風スクリプトからの移植が簡単であると嬉しい。
  • その為にレイヤーを二つに分ける。コア部分と周辺部分。
  • 周辺部分のレイヤーで、東方弾幕風由来の成分を吸収し、コア部分に影響が無いようにする。
  • コア部分では東方弾幕風とは無関係に、出来るだけ合理的・抽象的に設計する。
  • 最終的な目標として、東方弾幕風的ではない処理系が作られて、そこで動くようにしたい。
  • MODとかも簡単に動くといいし、商用のエンジンに使われたりとかしたら最高。

こんな感じのフレームワークがあればいいな、と思うわけです。


と、いろいろ書きましたが、まだまだ構想段階に過ぎません。
何か見落としもあると思いますし、「こうすればもっとよくなる」点もあるでしょう。
具体的に決めるべき事柄は山ほどありますし、完成がいつになるかは正直 不明です。


しかし、これだけは言わせてください。東方弾幕風は、もっと便利になるべきです。


なんか弾幕風の公式では新バージョンを作ってるみたいですが、仕様メモのページによると、構文は改変しない、とあります。
それは当然のことであり、軽々しく変えてはいけない部分。しかし、それでは不満を持つ人も居るのです。
そこで、公式でない僕らが、公式では不可能な自由さで、新しい枠組みを作るのも悪くないのではないか。
僕はそう主張したいのです。そしてその為には、僕一人の頭脳では足りないやもしれない。
そこで、このアイデアに関しては、Web上で広く意見を集めることにしたいと思います。
肯定的な意見、否定的な意見、いろいろあると思いますが、もし何かあればコメントやついったーでお知らせ下さい。
また協力者は随時受付中です。もし「協力したい」という親切な方がいらっしゃいましたら、ご連絡くださると幸いです。


以上。ご意見お待ちしております。