カルネージハートの作り方を考える

カルネージハートはアートディングの傑作である。
http://www.genki.co.jp/games/carnage/
ロボットを設計し、プログラムを作って、戦わせる。
俺もはるか昔に似たようなことを考えて、オリジナルのアセンブラでコードを書けるようにしてロボットが動くよーなのを作ったこともあったが、HDDがクラッシュして消えた。
カルネージハートの最初のやつが出る5年前ぐらいの話である。
まあ、そんなことはどうでもよい。


この、カルネージハート、プログラムが書けるといってもコードを実際に書くのではなく、ある程度の機能を持ったパネルを並べてプログラムを書く。
弾を撃つとか、移動するとか、そんなの。
で、例えば半径これぐらいの中に敵の弾があるかを判定するパネルとかがあって、trueとfalseで分岐する。
パネルは正方形で、CPUのメモリによってパネルが置ける広さが変わってくるから、ロボットのCPUを変更するとプログラムも書き直しになる。
装備を変えても書き直しなんだけど。
それはともかくこの仕組み、Rubyで作れないだろうか。


パネルを置くのはそのようなツールでやるとして、実行するときの話。
同じパネルを複数置くこともできるから、パネルはクラスになるだろう。
んで、置かれたぶんだけインスタンスを生成する。
パネルは全てスーパークラスPanelから派生させて、そこには、実際の実行をするrunメソッドと、結果として分岐するインスタンス変数tとfを作る。
tとfには、インスタンス化するときに、次に実行するオブジェクトを突っ込む。
んで、runメソッドは結果としてtかfのどちらかのオブジェクトを返す。
こういう形にすると、パネルの並びをゲームシステムが追いかける必要がなく、オブジェクトリストでプログラムを表現できるから、作るのがラクになる。


パネルをRubyで書けたら、自分で好きなパネルを作ることができるようになる。
自分で作れなくても、人が作ったパネルを持ってきて使うとか。
昔あったDelphi用のブラウザコンポーネントみたいに、フォームを作ってコンポーネントを1個おいてコンパイルして実行したらブラウザになっちゃうみたいな、プログラムにパネルを1個おいたらちょー強いロボットになっちゃうとか。
そんなのもアリだ。
そういうのを作ろうと思ったら、ゲームシステムもRubyで作るしかないわけだが、どっちかというとゲームをCで書いてLuaでパネルを書くほうが現実的な解だろう。
全く話が逸れてるけどLuaみたいに使えるマクロスクリプトRubyとかも面白いかもしれない。
誰か作ってくれないかな。
あ、ActiveScriptRubyを使ってCからCOM経由で呼び出してしまえばいいのか。
でもそれだと実行環境がややこしいな。
JRubyとかironRubyとかの世界になるのかな。


閑話休題
実際に作るとしたら、一番大きな問題になるのはパネルの実行速度の制御だろう。
自由に作れるなら、その実行負荷を計測して、ゲーム時間に反映させないといけない。
じゃないとコード量が多いほうが有利だ。
たとえばコード量を実行時間として扱うと、今度はループする処理が有利になる。
2機のロボットを公平にしようと思ったら、Rubyのスレッドを活用すれば問題なくなるが、そうすると今度はゲームシステムとの兼ね合いが問題になる。
俺が前に作ってたやつは、CPUエミュレータから作っていたから、命令ごとのクロック数で制御していた。
Rubyのような高級言語で制御するのは難しいのだ。
実時間を計測するようなことを考えてみたが、ロボットのルーチン実行中にGCが起きると困る。
GCは一時的に停止すればいいか。
しかしはたしてそんなやりかたでまともにゲームが動くのだろうか。