HOME > メモ > アイデア箱 > アイデア箱 BVE関連

アイデア箱 BVE関連

「こんなの欲しいな、作りたいな」と思いついたアイデアのメモ。
アイデアのお持ち帰りはご自由にどうぞ。ただ、もし良ければ教えて下さい。泣いて喜びます。
時間があるときに作る可能性があります。

BVE用のインストーラー

BVE本体の設定からScenariosフォルダの位置を読みだして、そこにアドオンを自動でインストールさせるツール。

BVEで遊ぼうとしたとき、アドオンのインストールがパソコン初心者にとって最大のハードルになっていると思います。
ここさえ自動化すれば、市販のゲーム並みに遊びやすくなると思うのです。

提供の方法としては2通り考えています。双方のメリット・デメリットを比較すると、パターン2の方が良さそうな感じがしています。7-Zipのように両パターン提供するのもありかもしれません。

パターン1. 事前にBVE Installer(仮称)をユーザーにインストールしてもらい、アドオンは独自形式の1ファイル(例:keisei_chiba.bveaddon)として提供

アドオン開発者はBVE Installer Studio(仮称)でアドオンのパッケージを生成し、公開します。アドオンのパッケージは独自形式(例:.bveaddon、.bvezipなど?)になります。
ユーザーは事前にBVE Installer(仮称)をインストールしておく必要があります。 アドオンのパッケージファイルをダブルクリックするとBVE Installerが実行され、その後は案内に従うだけでインストールが完了します。

インストール機能はBVE Installerに実装するため、パッケージはあくまでもアドオン本体とインストール時のオプションのデータのみになります。

メリット

デメリット

パターン2. アドオンは解凍機能を含んだmsiファイルとして提供し、ユーザーはファイルを実行してインストール

アドオン開発者はBVE Installer Studio(仮称)でアドオンのインストーラーを生成し、公開します。アドオンのインストーラーはmsi形式になります。
ユーザーはダウンロードしたmsiファイルを実行し、案内に従うだけでインストールが完了します。

BVE Installer StudioはWiX用のXML設定ファイルを出力し、WiX Candleでmsi(インストーラー)を生成する、という実装になります。

メリット

デメリット

参考:拡張機能の例

マップにプラグインを組み込めるようにするプラグイン

現在開発中です!(2022/04/10)→AtsEX - ATSプラグイン拡張キット for BVE 5 & 6

現在、テクスチャに動きを持たせる機能は公式には提供されていません。
そのため、シナリオ制作者は他列車や信号機などを用いる方法をあみ出し、なんとか工夫して実現しています。 ただし、これらの作業は非常に面倒で時間がかかるため、なかなか手を出しにくいのが現状です。

先日、DirectXに読み込まれたテクスチャをハックし、自在に書き換えるプログラムが公開されました。
これを保安装置プラグインから呼び出せば、抑速信号や特発、動く発車標などが簡単に作れるようになります。

しかし、ここでひとつ問題が発生します。
マップの為の機能を、車両の保安装置プラグインに組み込まなければならないということです。
これは、マップの為のプラグインを、DetailManagerなどで車両毎にいちいち組み込まなければならないことを意味します。
指定車両以外で運転したいときプラグインを車両フォルダにコピーする手間や、マップが更新されたときに全てのプラグインを差し替える手間を考えると、あまりに面倒でやっていられません。

「マッププラグイン」という新しい概念

マップの為の機能を、車両側の保安装置プラグインとして実装しない方法。
その正解のひとつとして、「マップ側でプラグインを指定できるようにする」保安装置プラグインを作るという方法を提案します。

ここから、具体的な実装方法を説明していきます。
なお、使用言語はBVE本体に合わせてC#などの.NET系言語を想定しています。

設計の例

flowchart LR; bve["BVE本体"] <==> dm(["Detail Managerなど"]); style dm fill:#fdd, stroke:#f88; subgraph "保安装置プラグイン(車両側)" subgraph "その他の保安装置プラグインの例" ats_1["ATS-Pプラグイン"]; ats_2["モーター音プラグイン"]; ats_3["ワンマンプラグイン"]; end dm <--> ats_1; dm <--> ats_2; dm <--> ats_3; dm <==> ats_mpp(["Map Plugin Provider(仮称)"]); style ats_mpp fill:#fdd, stroke:#f88; end ats_mpp <==> mpl{{"マッププラグインリスト"}}; style mpl fill:#fdb, stroke:#f80; subgraph "マッププラグイン(マップ側)" subgraph "マッププラグインの例" mp_1["抑速現示プラグイン"]; mp_2["発車標プラグイン"]; end mpl <--> mp_1; mpl <--> mp_2; end

Map Plugin Provider(仮称)について

保安装置プラグインとして「Map Plugin Provider」(仮称)を作成します。
このプラグインは、Detail Managerなど(BVE本体側)とマッププラグインの橋渡し的な役割を果たします。
モーター音プラグインなどの他の補助プラグインと同様、DetailManagerで他のプラグインと併用する前提です。

具体的な処理の流れとしては、

  1. シナリオ読込時(Load関数)、BVEのプロセスを取得します。
  2. リフレクションでマップファイルのパスを取得します。BVEの外部からマップファイルのパスがとれる構造になっていることは確認済です。
    ここではマップファイルのパスを "HogeLine\Map_1234M.txt" とします。
  3. マップファイルのパスを基に、マッププラグインリスト "HogeLine\Map_1234M.mplist.txt" を読み込みます。
  4. マッププラグインリストの内容を基に、マッププラグインを動的に読み込みます。
    • 特定のインターフェイス(仮に Automatic9045.BveMapPluginProvider.IMapPlugin とします)を実装したクラスをもって、マッププラグインとします。
    • IMapPluginは、メンバーとして
      • void Load()関数
      • void Dispose()関数
      • void Initialize()関数
      • void Elapse(ATS_VEHICLESTATE vehicleState, int[] sound)関数
      を最低限もちます。ただし、必要に応じて引数を増やすことも要検討。
  5. 各マッププラグインのLoad関数を呼び出します。
  6. 各マッププラグインのInitialize関数を呼び出します。
  7. フレーム毎に、各マッププラグインのElapse関数を呼び出します。
こんな感じです。

ドアの開閉に合わせて音量が変わるプラグイン

ドアが閉まった後も放送の音量が同じなの、違和感ありません?

一応これは標準の機能のみで簡単に作れるのですが、
音量を変えたい音声はプラグインに同梱することになるので、マッププラグインとして実装した方が奇麗になりそうです。

マップを3Dで編集出来るソフトウェア

他軌道の座標をセンチ単位で微調整しながらリロードしまくる、あの苦行。 内輪向けに架空鉄道のシナリオを作ったことがあるのですが、あれ本当に大変ですよね。
おまけに、分岐を作るときは3平方の定理や三角関数、他軌道の緩和曲線を作るときは積分と、幅広い数学の知識が必要なため 非常に作成へのハードルが高いです。特に積分なんて、それも数学Ⅲ範囲の積分ですからね。 高校で理系分野を専攻しないとそもそも数学Ⅲは習いませんから、大人でも知らない方のほうが多いかもしれません。
3Dの画面で直感的にマップを作成出来たら、どんなに楽なことか。

メリット

3D化することによって得られるメリットは非常に大きなものです。

直感的に作れるようになる

数学の知識に富んでいない人でも気軽に作れるようになりますし、何よりかかる時間と脳を使う量が大幅に削減されます。

複数経由、往復のシナリオも一気に作れる

これが一番大きなメリットなんじゃないでしょうか。
1つの駅の経由番線を変えるだけでも一苦労、逆方向を作るのはほぼ不可能……という常識をぶっ壊します!

本家BVE5・6と同様、C#+DirectXで1~2年後から開発予定です。
クラスの設計もほぼ頭の中で完成しています。