入力について考える?よし、大豆に相談だ!、パーサー。

あれ?節分が駆け抜けていったような気がする。
大豆だからまぁ、仕方ないか。

大豆つながりでソイジョイさんの電車広告最近みないよね。
昨年は色々な意味で飛ばしてたのに。

TRPGさん1号はフェーズ2のシナリオエンジンの実装のところでつまずき中。
うへあ。
最初にパーサーを作ろうと思ったものの、何でもできるぞーを目指すと終わらないので、
まずは「今回必要なものを洗い出す」ところから取り掛かることに。

パーサーと一言で言っても色々な実現方法があります。
ちなみにパーサーとは、ルールに沿って組まれたデータの塊をルールに沿って扱いやすい形に置き換える機能です。
例えばえーっと、辞書とかを例にすると。
辞書を開くと文字がいっぱいありますよね。
その中から単語、読み方、意味、などの「要素」ごとに分解して、目録を組み直すイメージかな?
普通の辞書は「単語」にあたるワードが目次になりますよね。
それをパースすることで「読み方」が目次になるようにしたり、「意味」が目次になるようにしたりします。

ちょっとアバウトですが、目的に合わせ、利用がしやすい形に情報を並べ直すのがパーサーのお仕事ととらえておけば、大体意味が通じるかなと思います。

お話を戻して。
今回必要になるパーサーはどのようなものか考えてみます。

TRPGさん1号はシートという形でゲーム進行を表現します。
全てテキストになりますが、情報は役割毎にまとめられます。

ものすごく大雑把に説明すると、ゲームから毎ターン新聞が発行されるようなイメージです。(ちょっとうまい表現な気がしてきた)
その新聞には今起きていることや、さまざまな情報が書かれています。
そして次号へのアンケート欄もあります。

アンケートに答えると、新聞はより自分好みに変わっていきます。
次号へのアンケートに答えるには、新聞内の専用の記入欄に必要事項を書き込みます。
記入済みの新聞をゲームに放り込むと、新しい新聞が発行されます。
 
 
シートの構成はこのような感じ。

ステータス関係:
・environmental information area(環境情報領域)
・physical condition area(体調領域)
・Inventory list area(所持品領域)
・equipment list area(装備品猟奇)
・current situation area (現在の状況領域)
セーブ関係:
・save data area(セーブ情報領域)
施設関係:
・facility information area(施設情報領域)
アクション関係:
・common actions area(共通アクション領域)
・proposed actions area(提案アクション領域)
・selected actions area(選択アクション領域)★

※プレイヤーが編集するのは★の位置のみ

ちょっとイメージわかないと思いますが、もう少しできあがってくるとわかるかもです。
伝わりにくい表現でごめんなさい。
テーブルトークRPGのキャラクターシートに小説が付随しているようなものをイメージすると、ぼんやりイメージできるかな。無理?
作るものは名前のとおりRPGなので、ちょっと情報が多めかも。
 
  
これを元に、整理してみます。

基本的な用語:
・シート
ゲーム進行に使用するテキストファイルを指す呼び名。
ゲームから出力される。
シートには以下の情報が含まれる。
 ・ステータス関係:現在の状況に関する情報
 ・セーブ関係:ゲームの進行情報
 ・施設関係:現在利用できる施設の情報
 ・アクション関係:現在選択できる行動一覧と、今回の行動の記入欄

・アクション
プレイヤーの行動を指す呼び名。
「階段の灯りを点ける」「コップに水を汲む」など、その場でしかできないアクションを「提案アクション」と呼ぶ。
「身を隠す」「攻撃する」「休憩する」など、場所を選ばないアクションを「共通アクション」と呼ぶ。
「選択アクション」とは「提案アクション」または、「共通アクション」から選んだアクションのことを指す。

 
ゲームの流れはこうかな?

プレイヤーはシートを確認し、次の「アクション」を「共通アクション領域」と「提案アクション領域」より選択する。
アクションには番号が振ってあり、プレイヤーはその番号を使い、選択したアクションを「選択アクション領域」に記述する。
アクションを記述したシートをゲームに渡すことで、新しいシートを入手することができる。

ここからパーサーに求められる機能を考えると、処理する必要がある要素は2つ。

  • 1. プレイヤーが記述した選択アクションの取得
  • 2. セーブ情報の取得

ありゃ。
意外と少ない。

他は全部読み飛ばしてよいので、
選択アクションとセーブ情報だけシート内から見つけられるようにできれば、そこまで高性能のパーサーはいらなそう。

うーん。
HTMLみたいにタグを設けて目印にしてみるですとか。
セパレータの数で位置を特定するですとか。
フォーマットを考えないとですね。
 
 
がんばろう。