最終更新日時: 2010年04月19日 (月) 01時18分59秒

自動発展パラメータ


FreeTrain EX Av本体の、街の自動発展に関するパラメータの議論及び変更の記録です。


自動発展アルゴリズムの書かれているソースファイル


core \ world \ development \ DevelopmentAlgorithm.cs


自動発展の引き金パラメータ変更の経過


  • 当初いつからこうなっていたのかは不明であるが、FreeTrain EX Avになって以降~正式版1.0.1~2.0.1.8及び3.0.1.4の間、自動発展は駅の「発着本数」と「前週の乗車客数」がパラメータとして利用されていた。
  • 「前週の降車客数」は、Station.cs内にてカウントはされていたものの、自動発展アルゴリズムには一切利用されていなかった。

これに関するソースは、修正前が187行目からの以下の部分。
public void Update(){
 strength *= F_StrDiffuse;
 strength = target.ScoreExported;
 vie = (int)target.ScoreTrains;
 }
ScoreExportedというのが、「前週の乗車客数」(Exported=その駅から外に運ばれて出て行った)をスコア化したものである。
ちなみに「前週の降車客数」はScoreImportedとして変数管理されている。

  • 本家「A列車で行こう4」の発展アルゴリズムは、「駅の降車客数」が引き金となるようになっている。
  • それを考慮すると、この「前週の乗車客数」のみが利用され、「前週の降車客数」が利用されていないと言うのは、設計ミス=バグであろうと推察される。
  • また、このことにより、既に建物が立っている駅の周辺だけひんぱんに建て替えが起こり、その駅から乗客が運ばれていった先のまだ発展してない駅の周りはいつまで経っても空白地のままという現象がしばしば起こっていた。これはゲーム性としてはおかしい。

また、ソースでは
strength *= F_StrDiffuse;
と、strengthにかける演算を行った次に
strength = target.ScoreExported;
と代入を行っており、これでは前の行でかけた意味がまったくなくなっている。

これらを踏まえ、2.0.2.0及び3.0.1.5では次のようにソースを変更した。
public void Update(){
 strength = target.ScoreImported;
 strength *= F_StrDiffuse;
 vie = (int)target.ScoreTrains;
 }

このことにより、たくさんの乗客が降車しているがまだ発展をしてなかった駅の周りが、激しく発展を始めた。

しかし、それでは「A列車で行こう4」をそのまま真似ただけであり、また、せっかく変数管理されているScoreExportedがまったく利用されていないのも寂しい感じがした。

そこで、2.0.2.1及び3.0.1.6では再度この部分を変更し、次のようにしてみた。
public void Update(){
strength = target.ScoreImported + target.ScoreExported*0.1;
strength *= F_StrDiffuse;
vie = (int)target.ScoreTrains;
}
10%だけ、「前週の乗客数」も影響するようにしてみたのである。

この結果と評価はまだ行われていない。
特に問題がなければこれでよいと思うのだが。

プロトタイプ3における乗客の集客範囲と発展の寄与範囲


  • FreeTrainから、Av正式版1.0~2系統~3.0.1.4において、駅の乗客は「半径10ボクセル」から集まってきていた。
  • また同時に、駅の利用客が周辺の発展に寄与する範囲も同じく「半径10ボクセル」であった。

それぞれのソースはこれとなる。

駅の乗客の集客範囲 core \ world \ rail \ Station.cs 315行目
public const int REACH_RANGE = 10;
この定数 REACH_RANGE が、43~50行目で利用されている。

駅の利用客の発展影響 core \ world \ development \ DevelopmentAlgorithm.cs 152行目
internal static int F_PopAmpBase = 10;
この変数 F_PopAmpBase が実際に使われているのは328行目
World w = World.world;
int amp = F_PopAmpBase+(int)(Math.Pow(w[loc].landPrice,F_PopAmpPower)*F_PopAmpScale);
// then randomly pick nearby voxel
loc.x = Rand(loc.x,amp);
loc.y = Rand(loc.y,amp);
loc.z = w.getGroundLevel(loc);
ここのみ。

  • FreeTrain EX Avの1系統・2系統の時間進行軸であれば、このそれぞれ10ボクセルというのは決して狭いものではなかったと思う。
  • なので、1系統・2系統ではこの数値はいじらないこととする。

  • 一方、プロトタイプ3系統の時間軸では、駅間は結構広めにとることになる。
  • プロトタイプ3では、駅と駅の間に発展の空白地帯ができてしまう(バスが実装されていないし)。
  • また、1時間に何本という単位で頻繁に列車が到着し、乗客が分散して乗車率があまり良くないという現象も見られる。
  • これらすべてを解決する手段として、両方の数値を「半径25ボクセル」に広げることとした。
  • プロトタイプ3.0.1.5において駅の乗車客の集客範囲を半径10ボクセルから半径25ボクセルに拡大
  • プロトタイプ3.0.1.6において自動発展の範囲を半径25ボクセルに拡大

この結果はまだ出ていない。
テストプレイの評価により、もっと狭くてもいいとか議論が出れば、また変更する。