eraシリーズ改造/バリアント開発の覚え書き

11月28日の雑記


「RubyのFiberを使えばpure rubyでシナリオファイルを書けるんじゃないか?」ということに気付く。
ゲームは普通メインループで入出力の更新を行う。たとえばキー入力待ちはメインループでやるのだが、シナリオファイルの中にキー入力待ちをしろという命令が書いてあったときは、シナリオの実行を中断してメインループに復帰するというような処理になる。
問題はメインループからシナリオへの復帰である。どこまでシナリオを実行したか覚えておかないと、また頭から実行することになる。そういうわけでシナリオファイルはふつう配列構造で扱われる。抜けるときにインデックスを保持して、復帰するときはそのインデックスから実行する、というわけだ。これをRubyで書こうと思うと、Procオブジェクトの配列として表現することになるだろうが、そんなもんいちいちシナリオファイルで書くのは大変だ。だから普通シナリオファイルは独自言語をテキストに書いて、Rubyで読み込んでパースして命令と引数をペアにした順序つき辞書配列として保持する、というやり方になるだろう。これはパーサを書くのが大変だし、命令を実行するインタプリタも書かなければいけない。例のRubieraはパーサまではできているが、順序つき辞書配列にするところで作業がとまっている。もちろんインタプリタも手付かずだ。先は長いだろう。

で、そのへんすっとばしてうまくやれるのがFiberクラスである。
Fiberは、処理を中断した後で中断した場所に復帰できる仕組みを備えている。Fiberを使えば、キー入力待ちでメインループに戻った後も、適切にシナリオの実行を再開できる。
Rubyをそのまま使えると何がうれしいかというと、パーサを書かなくていいしインタプリタも書かなくていい。これだけでも結構メリットがあるが、それ以上に、Rubyの潤沢な機能をそのまま使えるというところが大きい。シナリオファイルを書くために必要な機能は、Rubyで実装すればいい。RubyはRubyの文法範囲内なら拡張文法を許容してくれる。いわゆる内部DSLというやつだが、そういう拡張のために必要な機能がRubyには備わっている。また、シナリオファイル内に限定するなら演算子オーバーロードもありだろう。

うーんこうなってくるとERBパーサ作った意味あんまりないじょん……。いやいや、パーサはパーサで役には立つか。既存のERBをrubyに変換するコンバータを作るとか。

何にしてもとりあえずコンソールエミュレータを作ろう。ERBインタプリタを組み込むにせよ、Rubyでシナリオファイルを書くにせよ、これは必須になるのだし。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

リンク

漠々ト、獏
eramaker/eramaker2の開発元の公式サイト。

Emuera - emurator of eramaker
C#で書かれたeramakerのエミュレータ「Emuera」のプロジェクトページ。

eraシリーズを語るスレ まとめ
eraシリーズ全般のまとめ。バリアント情報、改造情報など。

eratoho まとめ
eramakerのバリアント「eratoho」のまとめ。

era板
eraシリーズについての掲示板。

サブページ

Rubiera
Bitbucket上のRubieraプロジェクトページ。Rubieraのソースコードのダウンロードはここで。

管理人/副管理人のみ編集できます