Siege University 200

■講義201 テンプレート#2

<特殊化>

 特殊化はテンプレートシステムの最重要事項のひとつです。特殊化とは,あるテンプレートに他のテンプレートからプロパティ(コンポーネント,フィールド,値)を受け継ぐプロセスです。簡単に言えば,ツリー上位のテンプレートを特殊化した下位テンプレートは,その(上位)テンプレートにある全てのコンポーネントとフィールドを受け継ぎます。

 ダンジョンシージにあるすべてのテンプレート(7300以上あります)は,木の幹となるコア・テンプレート,枝となるベース・テンプレート,さらに伸びる枝葉となるリーフ・テンプレートといった具合に論理的なツリーのような構造で配置されています。テンプレートの4つ目のタイプは,手作業で編集するものではなく,コンテンツを設置しマップのRegionをセーブした際に,シージ・エディタによって作り出されるものです。次にこれら4つのテンプレートタイプについて簡単に説明しましょう。

・コア・テンプレート
 コア・テンプレート(ルート・テンプレートとも呼ばれます)は,ゲームを形成するテンプレートの土台となる基礎テンプレートです。他のテンプレートは最終的にコア・テンプレートのひとつから情報を受け継ぎます(無効にされない限りですが,後述します)。すべてのコア・テンプレートは"world\contentdb\templates\regular\_core\templates.gas"にあります。

 多くのベース・テンプレートは"tenmplate.gas"のコアテンプレートを特殊化します。ただしこれは,他のベーステンプレートを特殊化したベーステンプレートもありますので,包括的な決まりごとではありません。

・ベーステンプレート
 ベーステンプレートは,"world\contentdb\templates\"フォルダにある様々なGASファイルに属しています。ベーステンプレートは多くの場合"base_templatetype"のフォーマットでネーミングされます。例えば"ctn_container.gas"にある[t:template,n:base_container_barrel]のような感じです(ネーミングについては後述)。

 すべてのリーフテンプレートはベーステンプレートを特殊化します。

・リーフ・テンプレート
 リーフ・テンプレートは特殊化の連鎖の最終形であり,シージエディタによって付加されるか,またはゲームエンジンによって生成されたオブジェクトだけを定義します。言い換えれば,テンプレートAがテンプレートBによって特殊化されれば,テンプレートAはもはやシージエディタやコンソールによってRegionに付加されることはありません。

 インスタンス・テンプレートはリーフ・テンプレートを特殊化しますが,特殊化フィールドを持っていません,潜在的な「特殊化」なのです。

・インスタンス・テンプレートまたはインスタンス
 第4のテンプレートは,インスタンスと呼ばれるもので,コンテンツを配置するためにシージエディタを使った時だけに生成されるものです。インスタンスは,マップのRegionにオブジェクトやアクターを配置して,それをセーブした時にGASファイルに記述されます。
 インスタンスはエンジンによってリーフや高位のテンプレートと同じ方法で特殊化され,"specializes="というフィールドが無いにもかかわらず,元となったリーフ・テンプレートのプロパティを引き継いでいます。付け加えますと,あなたはまずインスタンス・テンプレートをいじる事はありませんし,それを習得するのは無意味です。

<特殊化の例>

 これまで述べたように,特殊化は”雪だるま効果”だと思ってもらって構いません。次の架空の例で考察してみましょう:

  1. "templates_hypothetical.gas"ファイルにて,コア・テンプレート"core_template"がA,B,Cを定義します。
  2. "stuff.gas"(ディレクトリツリーのどこかにあります)でベーステンプレート"base_template"が"core_template"を特殊化し,さらにD,Eを定義します。
  3. 2つのテンプレート"leaf_template_01"と"leaf_template_02"が"base_template"を特殊化します。
  4. "leaf_template_01"がBOBを定義します
  5. "leaf_template_02"がSALLYを定義します

 この一連の特殊化によって,リーフ・テンプレートは単にそのテンプレートにあるだけのBOBとSALLYについてより多くの情報を得ることができました。

leaf_template_01 leaf_template_02
A A
B B
C C
D D
E E
BOB SALLY

 たいていの場合リーフ・テンプレートのサイズが小さいのは,他レベルの特殊化テンプレートからコンテンツ,フィールド,値を受け継ぐからです。

 実例を見てみましょう。以下の小さなリーフ・テンプレートを見て,コアテンプレートまでの特殊化の軌跡をたどってみてください。このリーフ・テンプレートは"world\contentdb\templates\regular\non_interactive\signs_directional.gas"にあります。


[t:template,n:sign_cav_glitterdelve]
{
    doc = "directional_glitterdelve";
    specializes = base_sign_directional;
    [aspect]
    {
        model = m_i_cav_sign-glitterdelve;
    }
    [common]
    {
        screen_name = "Glitterdelve";
    }
}

 この"sign_cav_glitterdelve"というテンプレートは"base_sign_directional"を特殊化します。"base_sign_directional.gas"ファイルの冒頭を見れば,このテンプレートが特殊化する"base_sign_directional"というベーステンプレートが有るのがわかります。


[t:template,n:base_sign_directional]
{
    category_name = "sign";
    doc = "base template for directional signs";
    specializes = interactive;
    [aspect]
    {
        draw_selection_indicator = false;
        is_selectable = true;
        lodfi_lower = 0;
        lodfi_upper = 0;
        megamap_icon = b_gui_ig_mnu_arrow;
        megamap_orient = true;
        megamap_override = true;
    }
    [common]
    {
        auto_expiration_class = immediate;
        forced_expiration_class = immediate;
        rollover_display = true;
    }
}

 ご覧のように,このベーステンプレートはこれを特殊化するリーフ・テンプレートより多くの情報を明示しています。これは特殊化の能力を示す良い例でしょう−それぞれのリーフ・テンプレートに大量の同一データを持つのではなく,すべての共通コンポーネントフィールドの値はベーステンプレートにあるわけです。このファイルにある他のすべての"sign"はこれらの値を引き継ぎます。これによりゲームのロードが早くなるだけでなく,テンプレートを操作する際にも見やすくなります。ベーステンプレートはできるだけ詳しく記述し,リーフ・テンプレートはできるだけ小さくまとめましょう。

 それでは特殊化の軌跡を見てみましょう。
 今度はベーステンプレート"base_sign_directional"がテンプレート"interactive"を特殊化する番です。このテンプレートは"template.gas"に属しています。


[t:template,n:interactive]
{
    doc = "An interactive item or object";
    
    aspect:is_selectable = true;
    aspect:megamap_icon	= b_gui_ig_mnu_dropped_item;
    aspect:use_range = 2;
    
    [common]
    {
        forced_expiration_class = normal;
        auto_expiration_class = normal;
    }
    
    [placement]	{  }
}

 この対応するテンプレートにあるすべてのコンポーネントは結果的に"world\contentdb\templates\regular\non_interactive\signs_directional.gas"にある"sign"リーフ・テンプレートから受け継ぎます。

 このテンプレートで2つの事柄が明らかになりましたが,これらは今までのものとは少し違います。ひとつめは,複数のaspectコンポーネントのラインでコロン(;)が出てきました。ふたつめは空っぽの[placement]ブロックがでてきました。

 ひとつめについてですが,これはコンポーネントブロックの簡略表記で,通常はコンポーネントに1つか2つだけフィールドが有る場合に使います。例えばこんな感じです。


    aspect:is_selectable = true;
    aspect:megamap_icon	= b_gui_ig_mnu_dropped_item;
    aspect:use_range = 2;

 これは,以下の表記とまったく同じです。


[aspect]
{
    is_selectable = true;
    megamap_icon = b_gui_ig_mnu_dropped_item;
    use_range = 2;
}
 どちらで表記しても構いません。

 空のコンポーネント(この場合[placement]ブロック)はコアテンプレートにはよく現れるもので,単にこのコンポーネントはエンジンがこのコンポーネントをゲーム中に出現させる前には必ずテンプレートのどこかに現れなくてはならないと言うことを示しています。実際,[placement]コンポーネントは,下層のどのテンプレートにも無く,シージエディタを通してオブジェクトが配置された際に,テンプレートの依頼により追加されたもの,つまりシージエディタが自動的に[placement]コンポーネントとそれに関連したフィールドを追加したのです。
 このテンプレートのこのコンポーネントは空で現れましたが,実際にはcomponent.gasで決められたデフォルトの値を持っているわけです(components.gasの[t:component,n:placement]をご覧下さい)。

<特殊化のコンポーネントやフィールドを無効化する>

 無効化は下位のツリーにあるテンプレートが,上位にあるテンプレートが特殊化されたコンポーネントのフィールド値を無効化した際に発生します。例えば,もしベーステンプレート("base_tree")が"Tree"のscreen_nameを特殊化し,リーフ・テンプレート("tree_oak_01")が"Oak Tree"のscreen_nameを特殊化すると,そのリーフ・テンプレートのscreen_nameはベーステンプレートのscreen_nameフィールドを無効にします。

前に戻る | 次のページへ