第3部:XML記述リファレンス (2/2)
3.4 地形・自然
地形や自然要素に関するコントリビューションの定義です。
3.4.1 地表
地面のテクスチャを定義します。
<contribution type="land" id="{GUID-LAND-001}">
<group>舗装</group>
<name>石畳</name>
<price>100</price>
<!-- 地形ビルダークラス
StaticLandBuilder: 固定の1種類の画像を使用
RandomLandBuilder: 複数の画像をランダムに配置
-->
<class name="freetrain.contributions.land.StaticLandBuilder">
<sprite origin="0,0" offset="0"> <!-- 地表は通常 offset=0 -->
<picture src="land.bmp" />
</sprite>
</class>
</contribution>
ランダム配置の例:
<contribution type="land" id="{GUID-LAND-RANDOM}">
<class name="freetrain.contributions.land.RandomLandBuilder"/>
<group>舗装</group>
<name>ランダム石畳</name>
<price>100</price>
<!-- 構成要素となる他のLandContributionのIDを列挙 -->
<lands>
{GUID-LAND-PART1}
{GUID-LAND-PART2}
</lands>
</contribution>
3.4.2 柵
柵は land コントリビューションの一種として実装されていますが、特殊なクラス FenceBuilder を使用します。
この機能を利用するには、拡張プラグイン jp.co.tripod.chiname.lib.fence に含まれる Fence.DLL が必要です。
<contribution type="land" id="{GUID-FENCE-001}">
<group>柵</group> <!-- グループを「柵」にすると専用メニューに追加される -->
<price>100</price>
<!-- FenceBuilderクラスを指定し、codebaseでDLLの場所を指す -->
<class name="freetrain.contributions.fence.FenceBuilder"
codebase="../jp.co.tripod.chiname.lib.fence/bin/Fence.DLL"/>
<picture src="fence.bmp" offset="16">
<!-- 4方向の画像座標指定 -->
<left_back>0,0</left_back> <!-- 北面(内側) -->
<right_back>32,0</right_back> <!-- 東面(内側) -->
<right_front>64,0</right_front> <!-- 南面(外側) -->
<left_front>96,0</left_front> <!-- 西面(外側) -->
</picture>
</contribution>
- 画像形式: 1枚の画像に4つのパターン(内側2面、外側2面)を含める必要があります。
- 操作: ゲーム内ではドラッグして直線的に設置したり、ボクセル内の特定位置をクリックして4辺のいずれかに設置したりできます。
3.4.3 森林
森林は、land コントリビューションの一種として、専用のクラス freetrain.world.land.forest.ForestBuilder を使用して実装されています。
これにより、地面(Voxel)の上にランダムに木が生えている状態を表現します。この方法で作成された森は「地形」の一部(MountainVoxel)として扱われます。
<contribution type="land" id="{GUID-FOREST-001}">
<group>森林</group>
<name>杉林</name>
<class name="freetrain.world.land.forest.ForestBuilder"
codebase="bin/FreeTrain.Forest.dll"/> <!-- 標準DLLを使用 -->
<price>100</price>
<computerCannotBuild/> <!-- 自動発展で勝手に生えないようにする -->
<!-- 樹木の画像定義 -->
<picture src="trees_sugi.bmp">
<override when="winter" src="trees_sugi.WIN.bmp" />
</picture>
<!-- 下地の地面画像(省略可)
省略時は元の地面の上に木だけが描画されます。
指定すると、地面もこの画像に置き換わります。 -->
<ground>
<picture src="forest_ground.bmp" origin="0,0"/>
</ground>
<!--
size: 画像チップ全体のサイズ (幅,高さ)
count: 画像に含まれる木の種類(パターン)の数
density: 1ボクセルあたりに生やす木の密度の目安 (1〜3程度)
-->
<size>288,42</size>
<count>9</count>
<density>3</density>
</contribution>
3.5 システム・その他
システム挙動のカスタマイズや、メニュー拡張などに関する定義です。
3.5.1 金融・経済設定
株式市場
株式市場の挙動や営業時間を設定できます。
<contribution type="stockMarket" id="{GUID-STOCK-MARKET}">
<settings>
<!-- 営業時間の設定 -->
<businessHour open="9" close="15" />
<!-- イベント発生間隔の調整(ソースコード: StockMarketConfig.cs)
d=日, m=月, y=年
-->
<eventSpans>1d,2d,4d,8d,10d,20d,30d</eventSpans>
</settings>
</contribution>
銀行
銀行の融資・預金ルールを設定できます。
<contribution type="bank" id="{GUID-BANK}">
<settings>
<businessHour open="9" close="17" />
<!-- 借金の可否と返済可否 -->
<debt available="true" repayable="true" />
<!-- 預金の可否と解約可否 -->
<deposit available="true" cancelable="false" />
</settings>
</contribution>
3.5.2 BGM
ゲーム内で再生可能なBGMを追加します。定義された曲は「設定」>「音楽」メニューから選択可能になります。
<contribution type="bgm" id="{GUID-BGM-001}">
<name>素敵な音楽</name>
<author>作曲者名</author>
<!-- MIDI, MP3, WMAなどが使用可能 -->
<href>music/my_song.mid</href>
</contribution>
name: 音楽設定メニューに表示されるタイトルです。href: 音楽ファイルのパスを指定します。- サポート形式: MIDI, MP3, WMA, WAV など(システムにインストールされているDirectShowデコーダに依存します)。
3.5.3 新規ゲーム
地形のみの新規ゲーム (terrainOnlyNewGame)
「新規作成」ダイアログに新しい種類のゲームモード(地形生成ルール)を追加します。
※この機能を使用するには、org.kohsuke.freetrain.tools.terrainloader プラグインへの依存定義が必要です。
<plug-in>
...
<depend on="org.kohsuke.freetrain.tools.terrainloader" />
<contribution type="terrainOnlyNewGame" id="{GUID-NEWGAME-001}">
<name>平原マップ</name>
<author>MapCreator</author>
<description>広大な平原からスタートします。</description>
<!-- マップ生成に使用する高さマップ画像 -->
<image href="heightmap.bmp" />
<size>200,200</size> <!-- マップサイズ -->
<height>64</height> <!-- 最大高さ -->
<waterLevel>10</waterLevel> <!-- 水面高さ -->
</contribution>
</plug-in>
ゲーム作成ウィザードの追加 (newGame)
C#でプログラムされた独自の新規ゲーム作成ウィザードを追加します。
<contribution type="newGame" id="{GUID-NEWGAME-LOGIC}">
<class name="MyNamespace.MyNewGameWizard" codebase="MyPlugin.dll"/>
</contribution>
※ NewGameContribution クラスを継承し、createNewGame() メソッドなどを実装する必要があります。
3.5.5 ドッキングウィンドウ
メインウィンドウにドッキング(吸着)可能な情報ウィンドウを追加します。会計サマリや駅リストなどがこの形式で実装されています。
<contribution type="dockingContent" id="{GUID-DOCK-TOOL}">
<name>マイツール</name>
<!-- 実装クラス: System.Windows.Forms.Control を継承している必要があります -->
<class name="MyNamespace.MyToolWindow" codebase="MyPlugin.dll"/>
<!-- メニューへの追加設定
name: メニュー項目名
location: 追加先のメニュー階層(例: view/tools = 表示>ツール)
-->
<menu name="マイツールを表示" location="view/tools" />
<!-- 複数のウィンドウを開くことを許可する場合(省略時はシングルトン) -->
<!-- <multiple/> -->
</contribution>
<class>: ウィンドウの中身となるコントロールのクラスを指定します。<menu>: メインメニューのどこに表示切り替え項目を追加するかを指定します。location:view/financial(経営),view/tools(ツール),view/system(システム) などが指定可能です。
3.6 高度な拡張
これらは通常、C#によるプログラミングを伴う高度な拡張で使用されます。
- picture: 前述の通り、画像を単体で定義して他のプラグインから参照可能にします。詳細は3.1.3 画像リソースを参照してください。
- menu: C#で実装したクラスを指定し、メインメニューに項目を追加します。
<contribution type="menu" id="{GUID-MENU}"> <class name="MyNamespace.MyMenu" codebase="MyPlugin.dll"/> </contribution> - bgmFactory: BGMの再生システムそのものを拡張・追加する場合に使用します(例: 特殊な形式の再生サポートなど)。
<contribution type="bgmFactory" id="{GUID-BGMFACTORY}"> <class name="MyNamespace.MyBgmFactory" codebase="MyPlugin.dll"/> </contribution> - contribution: 新しい種類のコントリビューションタイプ自体を定義します。システムプラグインなどが使用するメタ的な機能です。
<contribution type="contribution" id="{GUID-CONTRIB-DEF}"> <name>myNewType</name> <!-- 新しいtype名 --> <class name="MyNamespace.MyNewContribution" codebase="MyPlugin.dll"/> </contribution> - specialRail: 鉄橋、機関庫、トンネルなどの特殊な線路を定義します。
<contribution type="specialRail" id="{GUID-SP-RAIL}"> <class name="MyNamespace.MySpecialRail" codebase="MyPlugin.dll"/> </contribution> - specialStructure: サッカースタジアムや空港など、独自の機能を持つ特殊な建築物を定義します。
<contribution type="specialStructure" id="{GUID-SP-STRUCT}"> <class name="MyNamespace.MySpecialStructure" codebase="MyPlugin.dll"/> </contribution> - trainController: 列車の運行制御の仕組み(ダイヤグラム機能など)を追加します。
<contribution type="trainController" id="{GUID-TRAIN-CONT}"> <class name="MyNamespace.MyTrainController" codebase="MyPlugin.dll"/> </contribution>
