設計を見直そう2、保存データ、可変データ、固定データ。

ゲームつくるよー。
熱くても寒くてもー。

まずは前回気になっていたロード・アシスタントのリストラ・・ではなくて収まりの話題。
これは各起動モードごとに異なる分け方になっているのが問題なのでモジュールの位置づけを整理。

起動モードは3つ。

  • 1.ニューゲームでスタート(新規でスタート)
  • 2.ロードでスタート(セーブデータを読み込ませてスタート)
  • 3.コンティニューでスタート(入力シートを読み込ませてスタート)

それぞれ「ニューゲーム・アシスタント」「ロード・アシスタント」「コンティニュー・アシスタント」を設ける形に。
パーサーは各アシスタント内で利用する形です。

設計のみなおし図2

ニューゲームの場合はパースする対象がありませんので、パーサーを内包せず、内部で持つ固定のセーブ・データ用意します。
これを入力データからパースしたかのように振る舞わせることで同じ処理へつなげられます。

ロードは失くすことも検討しているのですが、今のところ残す方向で進めています。
ロードは「セーブ・データ」のみをゲームに読み込ませてゲームを続ける仕組みです。
TRPGさん1号では「セーブ・データ」は出力シートに含まれます。
よって、出力シートを読み込ませることでも同様の結果が得られます。
出力シートと入力シートの差異は「アクションが選択されているか否か」の違いです。
そのため、未編集の出力シートを保存しておくことでもロード時に使う「セーブ・データ」のバックアップに用いることができます。

ここでもう少し「セーブ・データ」の定義をまとめてみます。
「セーブ・データ」は現在のゲームの進行情報を表す情報です。
ゲームを継続する場合、必要とする情報の全てを復元できなければなりません。

何処にいるのか?であったり、どのようなアイテムを持っているのか?であったり、誰と出会ったかといった内部のフラグ情報もですね。
つまり、「セーブ・データ」はシートの内容をそっくりそのまま復元できるだけの情報を持っています。

あれ?

変だなって気づきましたか?

そう。
実は、出力シートには同じ情報が2つ書かれていることになります。
テキストで書かれている情報と、それをそっくり復元できる情報(セーブ・データ)と。
ちょっと無駄ですよね。
ただ、人間に読める情報を元にデータを復元するには冗長なデータ形式になってしまいますし、あやまって書き換えてしまう可能性も大きくなります。
人間に読めない情報ではゲームがどんな状態なのかわからず困ってしまいます。

「セーブ・データ」を分けて扱うことも考えたのですが、扱いが難しくなってしまうかなと思いました。
シートとセーブの2つのファイルをセットで扱うのは組み合わせを間違えてエラーになってしまう可能性があります。
とはいえ「セーブ・データ」を固定にしたりメニューで選べるようにするのも利便性や開発コスト増になります。

そういったモロモロ星人の事情から、出力シートには同じ情報が2つ含まれる形式になっています。
「セーブ・データ」のみを使ったロードを残しておこうと考えているのは構造上可能だからという点と、そういった使い方もあるかな?という観点からです。
その代わりといっては何ですが、出力シートを保存していけば内容の確認とロードの両方が行えます。

どこまで実現できるかはわかりませんが、出力シートを並べることで1つの物語のようにできたらいいなって考えています。
プレイヤーの選択と行動が記録されたものが出力シートです。
それを時系列に並べたら、それはきっと冒険の記録になるよねって。
じぶんの冒険の記録を誰かにみせたり、誰かの冒険の記録をみせてもらったり。
たのしそうですよね。

おはなしを戻して。
ロード・アシスタントは「セーブ・データ」をパースして、出力シートを生成します。
そのため、ロード・アシスタントにはロード向けパーサー(セーブ・データ抽出機能)が組み込まれます。
この際、「アクション」の入力がありませんが、現在の状態は「アクション」を実行した結果に作られるものですので、出力シートの生成には必要ありません。
例えば行き先を選んだ後に地図がもらえるとしたら、地図を受け取った時点で行き先を決める必要はありませんよね。
出力シートを地図ととらえて考えるとなんとなーくですが、捉えることが出来るかも知れません。

ニューゲームやロード時はどちらも、地図(セーブ・データ)を1枚指定している。
対してコンティニューは地図(セーブ・データ)と旅券(アクション)を指定している感じになるのかな?
地図の場所から新しい場所に行きますよって。
その結果、新しい地図(出力シート)がもらえる。
移動後には旅券は無くなっている、という感じ?

コンティニュー・アシスタントは入力シートをゲームに読み込ませることで新しいシートを得る仕組みです。
入力シートとは、出力シートを編集(アクションを選択)した状態のシートです。
入力シートからは「セーブ・データ」と「アクション」の2つをパースし、ゲーム内で新しい出力シートを生成します。
そのため、コンティニュー・アシスタントには入力向けパーサー(セーブ・データとアクション抽出機能)が組み込まれます。

まとめるとこう。

  • ・ニューゲーム・アシスタント… パーサーなし、新規用固定セーブ・データを持つ
  • ・ロード・アシスタント… セーブ・データ用パーサー内包
  • ・コンティニュー・アシスタント… セーブ・データ用パーサー、アクション用パーサー内包

 
次に、データ構造の検討も進めていきます。
今まで名前が出ているものを「保存データ」「可変データ」「固定データ」に分類して、どのようにつながるのかを線を引いてみました。
保存データはそのまま、「セーブ・データ」と置き換えて考えてもよいです。

データ構造の検討

可変データは説明がちょっと難しいのですが、ゲーム実行中にだけ実体化する入れ物と表現すると伝わるでしょうか?
どこにも形は残らないのですが、実行中にだけ形が作られます。
保存データから組み立てて、ゲームの進行に利用されるデータです。
そういう意味だと倉庫も可変データ領域にないとだめですよね・・。あれれ?直さないと。

固定データは固そうな名前の通り、変化することのない情報のあつまりです。
辞書的な位置づけの読み出し専用のデータです。
基本的にルール・シートから読み込みます。

今回初めて出てきた名前がいくつかありますが、その中でも詳細を詰めないといけなそうなのが「フラグ・データ」と「シーン」と「ストーリー・データ」です。(スキル・データは必要かなぁ・・くらいのぼんやり感で追加したのであまり気にしないでおくアルヨ)
これらはルール・シートのフォーマットとゲームのルールに関係する部分。
次回以降まとめていこうと思います。
少し間があいてしまいましたが、分岐の話題に戻ってくるのかな?と思います。

よーし。
フラグとかゲームっぽくなってきたよ。
 
 
それでは。
インフルやコロナに負けずに生き延びるですよ。
無理しちゃだめだよー。