• Showing Page History #105995

Show page source of manual_CreateContribution #105996

== 新しいコントリビューションの追加 ==

1. コントリビューションクラスの追加

{{{ code csharp
namespace nft.contributions.ui
{
	/// <summary>
	/// CtbMenuItem の概要の説明です。
	/// </summary>
	public class CtbMenuItem : Contribution
	{
		/// <summary>
		/// Contributes a menu and submenu items to mainmenu.
		/// 
		/// This contribution can add several items at once.
		/// </summary>
        public CtbMenuItem(Plugin p, ParamsReader e)
            : base(p, e) 
		{
                        // 実装を定義
		}
	}
}
}}}


2. コントリビューションタイプの宣言
plugin.xmlに以下のような記述を追加する
{{{ code xml
<declare-contribution type="MenuItem">
    <name>Menu items</name>
    <class name="nft.contributions.ui.CtbMenuItem"/>
    <!--<factory-class name="nft.framework.plugin.DefaultContributionFactory"/> 省略化-->
 </declare-contribution>
}}}

3. コントリビューションの追加
plugin.xmlに以下のような記述を追加する。
任意の数だけ記述することが出来る。2 とは別のplugin.xmlに書くこともできる。
{{{ code xml
<contribution type="MenuItem" id="hogehoge">
    <name>Sample Menu Item</name>
    <description>サンプルのメニュー項目</description>
    <!--その他固有のパラメータ-->
 </contribution>
}}}

4. NeoFT起動
起動時にCtbMenuItemのコンストラクタが呼ばれるようになる。
引数 ParamsReader には 3 に記述したノードの内容が含まれる。

== 特殊例 ==
=== バイナリモジュール
BinaryModule を継承して作る
ゲームシステムに'''必須ではない拡張コード'''を伴う。
基本的にはそれ単体で完結するシングルトン的利用を想定しているが、同じクラスを複数登録することもできる。
(その場合はxmlにパラメーターを記述して挙動を変えたりすることになると思われる)
{{{
  <contribution type="binary" id="TestModule">
    <name>TestBinaryModule</name>
    <class name="nft.debug.TestBinaryModule" codebase=".Core"/>
  </contribution>
}}}

=== グローバルモジュール
IGlobalModule を実装したクラス
コントリビューションの一種ではなくゲームシステムに'''必須なモジュール'''。
ただし、モジュールごとに別な実装による置き換えは想定している。
アプリケーション内では GlobalModules で管理されている。

=== デフォルトコントリビューションファクトリ
DefaultContributionFactory
FreeTrainで存在したContributionFactoryの概念を引き継いだもの。
コントリビューションごとに独自のファクトリを宣言できるが、基本的にはこれ一つで事足りるはず。

=== 匿名コントリビューション
CtbAnonymous クラスを継承して作る
{{{
  <contribution type="Anonymous" id="Test_CtbAnonymous">
    <name>匿名コントリビューション</name>
    <description>ファクトリ宣言を必要としない、孤立したコントリビューションのサンプル(CtbAnonymousを継承すべし)</description>
    <class name="nft.debug.TestAnonymousCtb" codebase=".Core"/>
  </contribution>
}}}
実際には type=Anonymous の宣言がメインのplugin.xmlに書いてある
シングルトンのような孤立したコントリビューションを気軽に追加できるように作ったものだが、
改めて考えると、そういう物は基本コードで成り立つので、BinaryModule として定義する方がよい。
(各プラグインの初期化順に影響するため)

今後処遇検討