Inform
Informは、1993年にGraham Nelsonが開発したインタラクティブフィクション(テキストアドベンチャー)のためのプログラミング言語であり、設計システムである。Inform は、ZコードまたはGlulx仮想機械で動作するコードを生成する。
バージョン1から5は1993年から1996年までにリリースされた。1996年ごろ Nelson は Inform を一から書き換え、バージョン6(Inform 6)を開発した。その後約10年間、Inform 6 は安定版としてインタラクティブフィクションの執筆に広く使われた。2006年、Nelson は Inform 7(Natural Inform とも)をリリースした。これは、全く新しい自然言語的記法が可能な言語で、書籍出版のメタファーとなっている各種ツール群も新たに開発された。
Inform は全バージョンでソースコードからZコードのファイル(ストーリーファイル)を生成する。生成されたファイル群をZコードインタプリタ(Zコードの仮想機械仕様またはZマシン仕様を実装したプログラム)で実行する。Zマシン(Z-machine)は1979年にインフォコムがインタラクティブフィクションのために開発したものである。Zコードインタプリタはほとんど全てのコンピュータに移植されており、Zコードは変更することなくそれらのプラットフォーム上で実行可能である。
Andrew Plotkinは、自身が設計した仮想機械Glulx向けのファイルを生成するInform 6の非公式版を開発した。Glulxは開発されてから数十年を経て古くなったZマシンの各種制限への対処として設計されたものである。2004年2月29日にリリースされたInform 6.3で、Plotkinの成果が正式版に取り入れられ、Inform 6は2種類の仮想機械に対応するようになった。Inform 7の初期のバージョンはGlulxに対応していなかったが、2006年8月に対応版がリリースされた。
Inform 1-6
Informは1993年、Graham Nelsonによって開発された。1996年、NelsonはInformを一から書き換え、バージョン6 (Inform 6) を開発した。その後約10年間、Inform 6は安定版としてインタラクティブフィクションの執筆に広く使われた。
Inform 6は大きく2つのコンポーネントに分かれている。Inform コンパイラは、ソースコードからストーリーファイルを生成する。Inform ライブラリはプレイヤーのテキスト入力の構文解析器と世界モデルを保持するための機能を備えたソフトウェアスイートである。また、コンパイラの入力となるプログラミング言語もInformと呼ぶ。
Inform 6とZマシンは本来、インタラクティブフィクションの開発用に設計されたものだが、それ以外の開発にも使われている。例えば、BASICインタプリタ、LISPチュートリアル(完全なインタプリタ付き)、テトリスゲームなどのゲームがInform 6を使って開発されたことがある。
Informコンパイラは、Inform 6向けのソースコードからZマシンまたはGlulxで実行可能なファイル(ストーリーファイル)を生成する。
Inform言語は、オブジェクト指向かつ手続き型である。言語の基本要素はオブジェクトで、オブジェクトは親子関係のオブジェクトツリーで管理される。この親子関係は場所を表すのにも使われているため、あるオブジェクトの親となっているオブジェクトは、子オブジェクトを保持している (hold) とも言われる。オブジェクトはツリー上を移動できる。トップレベルオブジェクトは例えば、ゲーム内の部屋などの場所を表し、家具や小物やノンプレイヤーキャラクター、プレイヤーのキャラクター、背景効果などがオブジェクトとして保持される。親子関係は任意であり、例えばlivingroom(居間)オブジェクトがinsurancesaleman(保険外交員)オブジェクトを保持し、insurancesalemanオブジェクトがbriefcase(かばん)オブジェクトを保持し、briefcaseオブジェクトがinsurancepaperwork(保険書類)オブジェクトを保持するといったことが考えられる。
初期のInformでは、オブジェクトはいわゆるオブジェクト指向プログラミングのオブジェクトとは異なるもので、クラスに相当する概念がなかった。その後、クラス定義が追加され、オブジェクトはクラスに属せるようになった。オブジェクトやクラスは複数のクラスを継承できる。インタラクティブフィクションゲームには一般に多数のオブジェクトが登場する。そのためInformでの多くのオブジェクトは「メタクラス」オブジェクト以外のクラスを継承しない。しかし、オブジェクトには属性(ブーリアン型のプロパティ、sceneryやedibleなど)があることが多く、Informライブラリがそれを認識する。普通の言語であれば、これら属性は継承によって実装されるべきものである。
以下にInform 6のソースコードの例を示す。
[ Main;
print "Hello World^";
];
InformシステムにはInformライブラリがあり、インタラクティブフィクションのプログラミングで難しい部分のほとんどを自動化している。特にプレイヤーが入力するテキストの構文解析器と、部屋やドアやプレイヤーの持ち物などのオブジェクト(とそのプロパティ)を保持する世界モデルが含まれる。
Informコンパイラから見ればInformライブラリは必須ではない。代替ライブラリもいくつか存在し、PlutypusやInformATEなどがある(後者はスペイン語向け)。
Informライブラリを使ったInformのソースコードの例を以下に示す。Inform 6を前提としている。Inform 7では全く文法が異なるが、レガシーコードであることを示すよう修正を加えれば、Inform 7でも使用可能である。
<pre>
Constant Story "Hello World";
Constant Headline "^An Interactive Example^";
Include "Parser";
Include "VerbLib";
[ Initialise;
location = Living_Room;
"Hello World";
];
Object Kitchen "Kitchen";
Object Front_Door "Front Door";
Object Living_Room "Living Room"
description "A comfortably furnished living room.",
n_to Kitchen,
s_to Front_Door,
has light;
Object -> Salesman "insurance salesman"
name 'insurance' 'salesman' 'man',
description "An insurance salesman in a tacky polyester
suit.  He seems eager to speak to you.",
before [;
Listen:
move Insurance_Paperwork to player;
"The salesman bores you with a discussion
of life insurance policies.  From his
briefcase he pulls some paperwork which he
hands to you.";
],
has animate;
Object -> -> Briefcase "briefcase"
name 'briefcase' 'case',
description "A slightly worn, black briefcase.",
has container;
Object -> -> -> Insurance_Paperwork "insurance paperwork"
name 'paperwork' 'papers' 'insurance' 'documents' 'forms',
description "Page after page of small legalese.";
Include "Grammar";
</pre>
Curses, by Graham Nelson (1993) - Informで書かれた最初のゲーム。
So Far, by Andrew Plotkin (1996) - 1996年、最初のXYZZY Award for Best Gameを受賞。
Anchorhead, by Michael S. Gentry (1998) - ハワード・フィリップス・ラヴクラフトのクトゥルフ神話に基づいたホラー。
Photopia, by Adam Cadre (1998) - ほとんどパズル的要素のない初のゲーム。1998年のInteractive Fiction Competitionで優勝。
Varicella by Adam Cadre (1999) - 1999年のXYZZY awardsのBest Game部門などで優勝。学術的論文も書かれた。
Galatea, by Emily Short (2000) - 同名のアニメーション化した像との対話を中心にしたゲーム。インタラクティブフィクションでのノンプレイヤーキャラクターとの対話としては最も複雑なものとされている。Adam CadreはGalateaを "the best NPC ever" と称した。
Slouching Towards Bedlam, by Star C. Foster and Daniel Ravipinto (2003) - スチームパンクの設定で、メタゲーム的構造を持つ(内部に別のゲームが登場し、そのゲームをセーブしたものを外側のゲームとしてリストア可能)。 XYZZY awardsを受賞し、2006年のInteractive Fiction Competitionでも好成績を収めた。
Inform 7
2006年4月30日、Graham Nelsonはrec.arts.int-fictionというニュースグループでInform 7のベータ版リリースを発表した。Inform 7は主に3つの部分から構成される。Inform 7 IDEはインタラクティブフィクションのテストに特化した開発ツールである。Inform 7コンパイラは新たな言語用コンパイラ、"The Standard Rules" はInform 7のライブラリの中核である。Inform 7では、Inform 6のコンパイラとライブラリも必要とする。Inform 7のコンパイラはソースコードからInform 6用ソースコードを生成し、そこから Inform 6のコンパイラでGlulxやZコードのストーリーファイルを生成する。Inform 7はインタラクティブフィクションのパッケージ形式であるBlorbファイルもデフォルトでサポートしている。これは、Zコードのファイルや表紙画像、検索用メタデータなどを格納するアーカイブファイルである。Inform 7の完全セットは今のところMac OS X、Windows、Linuxで利用可能である。2007年3月25日、Linuxでのコマンド行サポートが追加され、新たなリリースではSourceForge.netのGNOME Inform 7プロジェクトで開発されているGNOMEデスクトップ環境で動作するIDEも同梱されるようになっている。言語とツールの開発は続いており、2007年3月25日のリリースでも言語に様々な変更が加えられた。
Inform 7は短期間だけNatural Informと呼ばれていたが、その後Inform 7に改名された。このため、Inform 7のコンパイラは "NI" とも呼ばれる。
Inform 7には、Mac OS XとWindowsで動作する統合開発環境 (IDE) が付属する。Mac OS X版IDEはAndrew Hunterが開発し、Windows版IDEはDavid Kinderが開発した。
Inform 7 IDEには、Inform 7のソースコード編集のためのテキストエディタが含まれる。他のソースコードエディタと同様、シンタックス強調機能がある。引用符で囲まれた文字列は色付きで表示される。章節見出しは太字で大きく表示される。コメントはやや小さいフォントで別の色付きで表示される。
IDE にはZコードインタプリタも組み込まれている。Mac版IDEのインタプリタは、Andrew Hunterが開発したZoom インタプリタを基本としている。Windows版IDEのインタプリタはWinFrotzに基づく。
開発者が組み込みのインタプリタでゲームをテストすると、IDEの "skein" または "transcript" ビューにその進行状況が報告される。skeinビューでは、分岐する木構造としてプレイヤーのコマンドを追跡する。分岐においてゲームの同じ部分を再生せずに開発中ゲームの異なる経路を再試行でき、迅速なテストが可能である。経路には注釈をつけたり、正解としてマークしたりできる(それをテキストでのウォークスルー用に出力可能)。transcriptビューでは、プレイヤーのコマンドとゲームの応答を記録する。応答が正しければ、それを "blessed" とマークできる。再生したときblessedとマークされた部分は強調されるので、開発者が問題を発見する助けとなる。
IDEは開発中のプログラムに各種索引を提供する。コードをクラス階層として示したり、従来的なIFマップで示したり、本の目次のように示したり、といった様々な形態の表示が可能である。索引上の項目をクリックすると、対応するソースコードにジャンプできる。
IDEは2つのペインを左右に並べて表示する。それぞれのペインには、ソースコード、コンパイルの現在状態、skein、transcript、ソースコードの索引、ゲームの実行中画面、Inform 7の文書、その他プラグイン、設定などが表示できる。これは、多数のペインを同時表示するのではなく2つの向かい合うページのようにペインを表示することで、ノートを模倣しているのである。
Inform 7のコンパイラはInform 6のソースコードを生成する。その後Inform 6のコンパイラを使ってZコードを出力する。Inform 7は "Natural Inform" と呼ばれていた関係で、そのコンパイラは "NI" とも呼ばれている。
特筆すべき機能として、宣言型プログラミングによる強化と、オブジェクトが使われる状況からその型と属性を推論する能力がある。例えば、"John wears a hat."(ジョンは帽子をかぶっている)という文から、"John" という "person" が生成され(wear という動詞の主語は人物だけであるため)、"wearable" 属性を持つ "thing" が生成され(wearの目的語は着用可能でなければならないため)、Johnが帽子を着用している状態に設定される。
また、オブジェクト間の関係も直接サポートしている。例えば、あるオブジェクトの中に別のオブジェクトがあるとか、あるオブジェクトが別のオブジェクトを着用しているといった関係を自動的に抽出する。また、開発者が独自の関係を追加することもできる。例えば、「愛する」とか「嫌う」といった関係を追加することもでき、登場人物間の好悪関係を保持することができる。
Inform 7はドメイン固有言語の一種であり、Inform 6よりも抽象的なレベルでインタラクティブフィクションを構築でき、ソースコードの可読性も向上している。
以下は、上掲の "Hello World" の例をInform 7で書いて再実装したものである。Inform 7でのコンパイルで自動的にリンクされる "The Standard Rules" というライブラリを使っている。
Emily ShortのMystery House Possessed(2005年)は、一般にリリースされた最初のInform 7を使ったゲーム。"Mystery House Taken Over" プロジェクトの一環としてリリースされた。
2006年3月1日、Shortは3つのゲームのリリースを発表した。Bronze(パズル指向の従来型ゲーム)、Damnatio Memoriae(Short 作の Inform 6 のゲーム Savoir-Taire の続編)、Graham Nelson の The Reliques of Tolti-Aphである。2006年4月30日にInform 7のパブリックベータ版を発表すると同時に、3月1日にリリースされた3本を含む6本の「動作例」がソースコードと共に公開された。
Emily ShortのFloatpointはInform 7を使ったゲームとして初めてInteractive Fiction Competitionで優勝した。また、2006年のXYZZY awardsのBest Setting部門とBest NPCs部門でも優勝している。nespresso作のRendition(2007年)は、テキストアドベンチャーゲームの形態をとった政治的実験小説であり、プレイヤーは自身の共犯に立ち向かうことを要求される。この悲劇の手法はACMとケンブリッジ大学で学術的に論じられている。