2019年10月15日火曜日

【ゲーム】simutrans 連続堀割の検討

I want to build a continuous artificial slope to create a city with a street grid.
連続堀割をしたいです、井桁シティ(碁盤目状の街)を作るために。

さて、simutransです。
前の投稿で書いたように僕は井桁シティ派です。バス、トラック、市電、列車、船すべてを含む複合駅を駅範囲の漏洩なく井桁に並べて悦に浸ってます。

井桁シティの作成には手間がかかるのですが、井桁でキレイに並べるために好みのマップも用意できるようになり、下準備の整地がかなり楽になりました。さらに楽にしたいです。

今一番作成に手間がかかるのは、堀割に運河を作成する作業です、運河は連続で引けるのですが、その前段階の堀割に多大な手間がかかります。タルくてダルいです。ソースいじって始点と終点ダダァと堀割するようにしようかと思ったり、ソース見てもピンとせずやる気が出なかったり、しかし一つ一つ堀割するのも大変だし、、、どうしましょう、方法を考えてみました。

【連続堀割の方法の考察】
  1. simutransの画面操作
    • 一つ一つ手で堀割する
      可能だが、そもそもこれがメンドクサイ
      個々人の状況によっては、他人にやってもらう事も可能ではある
    • マウス自動化ツールを使う
      可能、しかし問題あり、単純マウス操作再現では脱調が心配、画像認識系では画面の多様さの対応が面倒
  2. simutransの現状正規の機能で可能か?
    • 設定ファイルの変更
      不可、現状では連続堀割を可能にする設定はない
    • アドオンとして追加
      不可、現状では連続堀割を可能にする設定はない
    • シナリオとして追加
      不可、現状では連続堀割を可能にする設定はない
      Squirrel-APIにも地形変更の口は用意されていない
      仮に可能であっても、普通のゲームの開始後に堀割し井桁シティを作りたい目的に合わない
    • 「町の発展」にやらせる
      不可、現状では連続堀割を可能にする設定はないし、cityrules.tabの設定でも出来ない
      仮に可能であっても、ゲーム内時間がかかり、ゲーム開始の初めの頃に堀割し井桁シティを作りたい目的に合わない
    • 他社AIにやらせる
      不可、現状では連続堀割を可能にする設定はない
      Squirrel-APIにも地形変更の口は用意されていない
      仮に可能であっても、ゲーム内時間がかかり、ゲーム開始の初めの頃に堀割し井桁シティを作りたい目的に合わない
  3. simutransの入出力ファイルの変更
    • マップデータの変更
      無理、ソース変更すれば可能
    • セーブデータの変更
      可能、形式(バイナリ、xml)、圧縮解凍(zip、bzip2)の、情報もソースも公開されているため可能
      編集を汎用のエディタ(テキストエディタ、バイナリエディタ)で行うか、専用の編集ツールを作成するか検討が必要
  4. simutrans本体の変更(ソースコード変更)
    • Squirrel-APIの追加
      可能、地形変更を可能にすることによって、シナリオや他社AIにやらせることが可能、しかし、ゲーム開始の初めの頃に堀割し井桁シティを作りたい目的に合わない
    • 「町の発展」の動作の変更
      可能、地形変更を可能にすることによって、「町の発展」にやらせることが可能
      cityrules.tabの拡張も含めた変更が好ましい
      しかし、ゲーム内時間がかかり、ゲーム開始の初めの頃に堀割し井桁シティを作りたい目的に合わない
    • マップファイル読み込み時の動作の変更
      可能、画像ファイルからゲームデータへの変更時に、特定の条件の高度差1の場合堀割とするとか、別ファイルで堀割箇所指定とか、いろいろ変更はできるが、不自然かな
    • 運河ツールに追加
      可能だが、他の道路や線路ではそのような機能がないため不自然
    • スロープツールに追加
      可能、まあ変更するならここが無難かな

さて、どの方法で対応しますかね。
ぼくはC/C++系のプログラマーだったりするので、ここはスロープツールへの連続堀割機能の追加と行きたいところですが、グータラなのでやめにします。セーブデータをテキストエディタで編集する方法で対応しようと思います、楽だしね。

次回は、セーブデータの中身の説明とか書こうと思ってます。

2019年10月14日月曜日

【ゲーム】simutrans 井桁シティ (simutransの楽しみ方)

なんだか最近simutransばかりの記事ですが、、、「同じ系統の記事ばかりじゃ変かなぁ」なんて思い書かないと、結局何も書かなくなるので、、、書ける時に書いちゃう事にしました。

simutransですが、いろんな楽しみ方があります。実際の地形や鉄道路線を再現したり、仮想ではあるが多様な地形のマップで路線を運用するとか、限られた予算でうまく経営して発展させるとか、路線運用をいろいろと工夫したり、リアルな見た目で性能も考慮した鉄道車両やバス等を作成したり、路線や建物を作成したり、、、ホント多様な楽しみ方があります。そんな中僕の楽しみ方は、、、

僕の楽しみ方は、なんなんでしょ、効率重視の街づくりをしているつもりで、無駄に同じ複合駅(鉄道駅、バス停、市電、運河、等々)を井桁に並べて、駅の範囲外に建物立てたくない感じ。プレイしている画面を見られたらきっと糾弾されます。「結局あんたは設計主義者なんだよ、いろんな目線で複合的になんて言っちゃいるが、その実は単純目線の積み重ねでしかなく、全然複合的で無い」とか、「人間の何たるかをまったくわかっちゃいない野郎とは思っていたが、それがこのゲームに如実にあらわれてるね、たかがゲームだが、たかがゲームで普通な楽しみ方も出来ない奴という事だ、そんな奴に人間の理解は無理だわさ、ぷぷぷ。」とか、「あんた、偏執狂なのか、やっぱそうか」とか、「あーそういうところがキライなんだよね、相変わらずだねー」とか、「おいらもsimutransやってるけどさ、同じ輩に見られたくないなぁ」とか、、、そして最終的に『あんたが何言ってるのか、まったくわからないよ』となって、孤独に夜の飲み屋街をうろつき酔いつぶれてドブの中で朝目覚める……なんだか何を書いているのかよくわからなくなってきましたが、、、悲しいです。

さて、僕の最強の井桁シティですが、だいたい下記の感じです。
  • 00_整地前
  • 01_整地マーク
  • 02_運河マーク
  • 03_運河引く
  • 04_橋を架ける
  • 05_送電線を引く準備
  • 06_送電線を引く
  • 07_駅周りの道
  • 08_高架台座
  • 09_高架を引く
  • 10_高架下の削除
  • 11_高架駅の設置
  • 12_市電線の設置
  • 13_市電駅バス停貨物ヤードの設置
  • 14_運河港の設置
  • 15_架線の設置
  • 16_確認微調整
  • 17_モノレール
  • 18_空港
  • 19_一部拡張
  • 20_マップ拡張
  • 21_石油
  • 22_外縁旅客
  • 23_石炭
  • 24_外縁旅客逆回り追加
  • 25_外縁市電追加
  • 26_ここで発展した場合テスト
井桁シティの作り方(あ)
井桁シティの作り方
あと、いろいろ試してもいます。

  • いろんな地形で楽しんでいたのに、いつのまにか井桁化
  • 方向別/線路別複々線を作って楽しみ、いつのまにか産業チェーンの強化確認に
  • 複合駅の範囲の正方化とか、高々架のテストとか

井桁変遷
井桁変遷
研究(笑)
研究(笑)
方向別_線路別_複々線1
方向別_線路別_複々線1
方向別_線路別_複々線2
方向別_線路別_複々線2
 
なんか、悲しくなてきた。


【ゲーム】simutrans 自作マップ 高度についてバージョンと設定値での違い

先日simutransの自作マップでの、マップの色と高さの関係を書きました。
【ゲーム】simutrans 自作マップ
そこに、結論じみた形で高さとクレースケールの表を書いたのですが、どうもそれだけではなくて、simutransのバージョンや設定で違いがある事がわかりました。のでそれを書きます。

まずバージョンによって違います。すべてのバージョンで確認したわけではないのですが、
  simutrans 102.2.1
  simutrans 120.4.1 <現時点での最新
少なくとも上記2バージョンで違いがあるです。
先日書いたのは、simutrans 120.4.1での値になります。

そこでいろいろ試してみようと思ったのですが、よく考えたらsimutransはソースが公開されてます、そうです、シムトランスはsourceが公開されているんです。なのでソースコードを確認してみる事にしました、source codeはSVNで管理されているようで、GitHubでも公開されています。(SVNとGitHubどっちが本流本元なのかな、たぶんSVNのような感じです。)

確認したのは下記2バージョンです。
・simutrans 102.2.1
 https://github.com/sanna/simutrans
 /simworld.cc : karte_t::get_height_data_from_file()
 設定による違いは無いです。ので1つです。

・simutrans 120.4.1
 https://github.com/aburch/simutrans/tree/master/simutrans
 /dataobj/height_map_loader.h : rgb_to_height()
 設定により違います。
 [height_map_conversion_version_new ON/OFF]
 [pak_height_conversion_factor == 2 / != 2]
 4通りあります。

この5つの違いを確認すべく、確認プログラムを作ってそれぞれ0~255の結果をテキストで出力しました。結果はテキストファイルとして公開しますね。公開結果テキストはココです(ついでに確認プログラムのソースも公開しておきます。単にsimutransのソースと同じ計算してprintf()してるだけですが。)あ、値はなぜかsimutransのゲーム画面で表示されるものより1少なかったりしますがたぶん後の処理で表示は+1されるんでしょということで気にしない方向で(笑い)  まあ、区切りがわかればいいという程度で。

簡単に結論を書くと

・simutrans 102.2.1は、11区切りか10区切り。
 0~10が-14、11~21が-13、22~31が-12、、、235~245が8、246~255が9
 (区切りとはこんな感じですので、以下は値範囲の具体的な記述を省略します。
  詳しくは結果テキストをご覧ください。)

・simutrans 120.4.1は、
 [height_map_conversion_version_new ON/OFF](以下verと呼びます)と
 [pak_height_conversion_factor == 2 / != 2](以下convと呼びます)の設定で変わります。
 ver OFF  conv == 2 :5区切りか6区切り。
 ver OFF  conv != 2  :11区切りか10区切りで、simutrans 102.2.1と同じ。
 ver ON   conv == 2 :4区切りで、252~255が29(ゲームでは高さ30になります)
 ver ON   conv != 2  :8区切りで、【ゲーム】simutrans 自作マップ で書いたのはこれ。

となりました。

ver ON   conv == 2で高さ30まで表現できるのはいいなぁと思いますた。
height_conversion_factorの設定を2にして海-20 高さ30まで表現可能
height_conversion_factorの設定を2にして海-20 高さ30まで表現可能