Copyright(C)Static 1998-2004, All Rights Reserved.
このノートは非常に断片的です。
XMLの持つ入れ子構造の記述能力はデータ型の定義だけでなく、データを扱うプログラムをも定義することができます。
この計画書は、コンピュータRPGをXMLの入れ子構造を用いて記述しようという、1つのモデルケースを提案するものです。
ここでは、XML-RPG(仮)の大まかな挙動について述べます。 XML-RPG(仮)のシステムはシナリオとデータを記述するファイルと、それを実行するプログラム(実行エンジン)とに分けられます。 シナリオはXML構造をもつ言語で記述され、エンジンはシナリオを内部形式に展開した上で、解釈を行います。 また、ゲームデータもXML構造を用いて記述されます。データファイルはシナリオファイルとは別に記述され、 シナリオやエンジンの必要に応じて読み込まれ、また変更を受けます。 このシステムでは、通常のRPGシステムのようにシナリオとデータを分離して記述します。 こうすることで各部分の校正が行いやすくなり、またデータを共有した別のゲーム、つまり「続編」や「外伝」といった サイドストーリーを持つゲームを制作しやすくなります。また、XML周辺技術の1つである、XSLTを使うことで、 データ構造の変換(コンバート)も容易に行えることになります。
本計画では、シナリオとデータを分離して記述することが1つの目標です。 そのため、「イベントキャラクター」というRPG特有の仕組みの扱いをはっきりしておきたいと思います。 イベントキャラクターはオブジェクトの一種で、 マップ上での位置やフラグ値の他に、イベント発生時に実行するシナリオを含んでいます。 ここで、XML-RPG(仮)ではイベントキャラクターがシナリオそのものを含むのではなく、シナリオへのリンクを持っていると考えます。 このとき、イベントキャラクターはシナリオと結合したオブジェクト、つまりデータであり、シナリオへのリンクを用いることで イベントキャラクターをシナリオとデータとに分離して記述できます。
通常のRPGでは、イベントキャラクターをシナリオとデータとに分離して考えません。 しかし今回のように分離するのは、ストーリーから「RPGへのシナリオ」への書き換えという手間を省くためでもありますが ストーリーそのものを記述する方が汎用性の高いものとなるためです。 普段、ストーリーを書く段階からフラグ値を細かく考慮することはしないと思います。 また、ストーリー自体はイベントキャラクターなどのゲーム特有の機構に縛られることはないし、縛られるべきではないと思います。 RPGだけでなく、ADVやACT(!)など様々なシナリオを書けるようになるためには、 ゲームの構造に依存しないシナリオを書くことで訓練することが良いと考えました。
本計画ではこのアイデアに基づき、シナリオからあまり手を加えずにゲームが動作するような言語や意味構造を考えます。
本案および本案に沿って構築されるRPGシステムの名称はまだ未定です。案はいろいろとあります。
本文書内で本案を指すときには、XML-RPG(仮)とXML-RPGに(仮)をつけたものを名称とします。
XML-RPG(仮)は次の言語群から構成されます。
Scenario Coreは文章のみで構成されるシナリオで、XML-RPG(仮)のシナリオの中核をなしています。 Scenario EventsはCoreを拡張する言語で、エンジンに対するプログラム的な命令を含んでいます。 RPG特有のものはCoreでなくEventsの方で記述するすることになると思います。
Atlasはマップとイベントキャラクターの情報を記述する言語です。 Map(地形)はマップデータを表現していて、W3C-SVGで記述します。 Geometry(地勢)はマップとイベントキャラクターの位置関係を表現しています。シナリオとして分類されてもよいと思います。 MapはテスクチャでGeometryはそれを張り付けられるメタデータ、という関係にあります。
Characterは戦闘シーンに登場する全キャラクター、すなわちプレイヤー・敵・NPCのデータを記述する言語です。 キャラクターのデータとしては、名前・能力値の他に経験値テーブルや所持品なども含まれます。
Actionsは戦闘中や移動中に用いる魔法・アイテム、つまり特殊行動のデータを記述する言語です。 通常、魔法とアイテムは別のデータスキーマを持ちますが、互いに効果の等しいケースが多いので、 本案では両者を統合したデータスキーマを考えたいと思います。
なお、現在のところ、草案が作られているのはScenario Coreのみです。
XML-RPG(仮)シナリオを記述する言語の要素と属性について解説します。
例はそれぞれのモジュールごとにあります。