
進捗報告 / BaMaDiS改めBooCarDi、scheme とracketの違いとか
BooCarDieが誕生した
BaMaDiSはシステムじゃなくて内容だった
自分の構想が妥当なものか検討するために、Ren'PyやSuika2のようなちゃんとしたゲームエンジンではなくて、プログラミング言語でざっくりBaMaDiSを作ってみるか、とRacketをいじりだした訳ですが、ざっくりとは言えプログラムとして1から作り出してみると、どういう機能が必須でどこからは後回しにしていいかを考えざるを得なくなってきます。
それで、さっさと結論を書いてしまうと、当初考えていたバトルマンガ・ダイススレシミュレーションことBaMaDiSというのは「作りたい内容」であって、ずっと考え続けてきてだいぶ整理された「作った本人も楽しめるストーリーのバリエーションを生むシステム」を指すものとはズレてきてるな、と思い至りました。
じゃあ、どう言い表すのが適切なのかな、と考えたのですが、前回の最後で書いたようなゲームメカニクスになぞらえて表現するのが良いかと思いついて、
ゲームブック、カード、ダイス
からとって
Boo(k)Car(d)Die(c)->BooCarDie
が分かりやすいかな、とこじつけてみました。語尾が掛かってて語呂もいいし。
と、そこでこのnoteを書こうとブラウザを開いたら、トップバナーを見て、ああ、となりました。答えは最初からあったのだなあ。1冊がゲームブックなら完璧だったけど。
ということで、今後しばらくはRacketでBooCarDieを作っていくことになりました。
BooCarDieをアナログの比喩で脳内プレイしてみる
これまで、ずーっと人が読んでもBaMaDiSって何やろうとしてるのか分かりにくい感じだったと思うんですが、BooCarDieになってだいぶ整理されて伝えやすくなった気がするので、ちょっとこんな感じのメカニクスになる、なるだろう、というのを本とトランプとダイスの比喩で説明してみます。どうだろうか。
あなたの目の前にあるのは、ゲームブックとトランプとダイスの3つ。
ゲームブックを手にとってめくってみると、序章の説明以降のパラグラフが通常のゲームブックと違うことに気が付く。パラグラフの数字の代わりにハート4、スペードQueen、などのトランプのカードが振ってあるのだ。
どうやらトランプが関係しているらしい、と箱から出してみると、トレーディングカードゲームのように下半分にテキストが書いてある。それはフレーバーテキストと言うよりは、「手札から1枚捨て、ハート数札の山から1枚引く」といったカードのプレイの指示が書いてあるようだ。
残るダイスはごく普通のダイスが2個。これはよくあるゲームブックでの使用法と同じのようだ。
興味を引かれたあなたはゲームブックを最初から読むことにした。やはりカードを手札にして選んだカードのパラグラフに進んでいくルールのようだ。
あなたは指示通り、カードをジョーカーのみの山1つ、スートごとの絵札の山と6から10の山計8つを作り、よく切ってそれぞれ裏を上にしてテーブルに置く。
残りのカード系20枚は同じくよく切って一山にまとめ、同じく裏を上にして置く。そして上から10枚を手に取り手札にする。
さて準備が出来たところで、ゲームブックの序章を読み進める。あなたはこの街にやってきた冒険者だ。カードで指示されたイベントにダイス目で挑み、この街に隠された大きな秘密に迫るのが目的らしい。
行動は1週間単位で7枚のカードをプレイする。プレイしたカードは捨て札としてテーブルに置いていく。1週間したら山札から引いて7枚を手札にする。山札がなくなったら捨て札をよく切って山札にもどして繰り返す。
なるほど、手札の中からどう言う順番で何をプレイするか、という作戦を立てていくことになるようだ。プレイしたくないイベントはどんどん手の中に留まっていくことになる。
プレイしていくうちにストーリーのイベント内容がわかっていく。
ハートのイベントは人との交流、ダイヤは金稼ぎイベント、クラブは成長イベント、スペードは犯罪的な行動のイベントが起きるようだ。
イベントの中には1度しか起きないものもあり、それをプレイするとそのカードはトランプの箱に戻し2度とプレイできない。足りない分は5以上の同じスートの山から1枚引くことになる。
また、イベントによってダイス目によっては手札を全部捨てなくてはいけないので、プレイしたいカードがプレイできなくなることもあるが、手札に残っていくプレイしたくないカードを捨てるチャンスにもなる。
特にスペードのカードは犯罪的なだけあってハイリスクハイリターンなイベントが多い。カードの指示も手札から他のスーツのカードを捨て、スペードの札から1枚引くというものが多く、どんどんリスクが高くなっていく。
ハートのカードで協力者を探す、ダイヤのカードで金を稼ぐ、クラブのカードで成長していく、などの準備ができていないところでスペードの札のイベントを連続してプレイするのは命取りだ。
だんだんスペードの札が増えて首が締まってきたところで、スペード10のイベントでダイス目が腐り失敗してしまった。
スペード10イベント失敗時のカードの指示は
「スペード絵札の山から一枚引き、そのページへ行け」
引いたのはクイーン。街のマフィアの女ボスとの対決だ。
あと一歩のところでイベント失敗。敏捷値が1足りなかった。スペードクイーンイベント失敗の指示は
「手札を全て捨てジョーカーを引け」
あなたは手札を全て捨てジョーカーを手に取る。
あたなは他の選択肢も無く、ジョーカーのページを読んだ。
「ダイスを1個振れ。1から5までが出たらあなたは全ての装備を身ぐるみ剥がされて宿屋に戻る。ジョーカーを山札に戻し手札を10枚引け。
6が出たら神様の機嫌が特に悪かったようだ。14へ行け。」
ああ、なるほど。
分からない人はJ・H・ブレナンのゲームブックについて調べてみてほしい。
Scheme / Racket 手習い
schemeの復習
あらためてBooCarDieを作っていく訳ですが、ブック、カード、ダイスのうちダイスについてはほぼ完成しちゃってるので、あとはブックとカードを作ればいい訳です。
schemeの本やネットの資料をぼちぼち見ながらなのであまり進んではいないのですが、カードについてはリスト操作でベタベタにコーディングすればそんなに難しくないのはダイスを作って分かりました。
ただ、Racketはschemeじゃなくて、schemeの仕様範囲にない便利な関数というか手続きというかがいっぱいあるので難しくないという話ではございます。
一応、Racketだけじゃなくてgaucheでもダイスのプログラムが動くようにしてみてたりしたので、本家scheme自体の知識も仕入れつつ。
scheme自体の仕様はコンパクトでシンプルに設計されているので、各scheme言語は実用プログラム用にガンガンライブラリを拡張していて、そのライブラリもある程度仕様を統一するようにはなっているのですが、それでも色々差はあるし、特にRacketはもうschemeを名乗っていないので、独自仕様がいっぱいあります。
なので最終的にはRacketの公式ドキュメントを読むのが1番良いのですが、日本語資料はあんまりないので、schemeの知識も一緒に入れていくことになってます。
とりあえず物理書籍は「プログラミングGauche」「Schemeによる記号処理入門」読んでます。
これらはいったい何年前に買ったんだっけと思うとクラクラします。
もっともゲーム画面的には全然派手じゃ無くて文字だけで良いと思っているので、そのレベルであればRacketもschemeもそう変わらないです。
ただ最終的に配布する段になったらコンソールオンリーというのは流石にプレイしてもらうのはキツかろう、と思うので起動したらウィンドウの1つでも立ち上げたいです。


Racketを知る
前段のようにschemeでも動くような極々シンプルな部分はschemeでの知識でも良いのですが、ウィンドウ出したりデータ読んできたりといったところはRacket依存で楽に公式ドキュメントをポツポツ読んでます。
特にデータ読んできて処理するところとか、エンジンを1つ作ったらあとは外部のテキストファイルをいじればどんどん新しいゲーム作れるようにしたいのですけれど、Racketはもともとドメイン固有言語といって単一目的用独自言語を自分でつくっちゃうのがやりやすい設計がなされているので、そこら辺は大いに活用したいです。もっともLisp族言語はそういう感じみたいですが。
Racketのドメイン固有言語開発環境としての側面について解説と実践がある貴重な日本語資料はこちら。
その他でいうと、Racketは教育用言語として作られたというところもあって、英語だけれども分かりやすい入門書があったりして、公式にIDEであるDrRacket自体がその入門書をフォローするシステムになっていたりします。
”How to Design Programs”、略称htdpはRacketでのライブラリ名にもなっていて、これを読み込むと、ビジュアル的な結果だとかネットワークプログラミングとかが簡単にできるようになります。


旧版にもある図形表示機能が楽しい。
それで、このhtdpライブラリにはbig-bangという仕組みがあって、これはいわゆるゲームプログラムで必ず出てくるメインループというやつ。つまりフレーム単位ごとに処理したり画像を書き換えたりという機能が公式で提供されているのでアクションゲームとかが割合簡単に作れちゃうのです。
じゃあこれゲームエンジンじゃん!
でも自分が考えているのはテキストゲームなんでそこまでの機能はいらなかったりします。
さらに2htdpライブラリの方ではこのbig-bangの仕組みがクライアント/サーバモデルになっていて、ネットワークでの同時プレイまで視野に入っていて高性能な分複雑になってて、こうサクッと感が薄れてしまうほど。
今は旧htdpライブラリは非推奨らしいので、2htdpで低機能なアプリをサクッと作る方法を勉強中です。
あとRacketはデータ形式に構造体があるのでゲームのキャラデータはこれで作るのが良いだろうと当たりを付けてるんですが、まだ勉強の手がついてません。
まあやることいっぱいなのですが、Lispだから楽しくやれてて義務感がないのはストレスフリーで楽しいです。