mkworks

シムトラ関係のエントリーまとめ群

Simutransに新たな産業を生み出したい人向けの備忘録

以下のエントリーは先日投稿した以下のエントリーを加筆・再構成・資料追加したものとなります

masatrans-lab-diary.hateblo.jp



このエントリーは以下のAdventCalenderへの参加記事となります
adventar.org

Simutransを長くプレイしているうちにアドオン制作やMIDI編集に本体改造まで始める気がしますが、その中のアドオン制作から産業を作る事に重点を置いたエントリーをまとめたいと思います。
このエントリーを読んだらきっとオリジナル産業を作れるようになる気がします、以下の自分が制作している宅配便産業を保存しているgithubも資料として使いますので参照しながら見ることを推奨します。

github.com

産業の全体をイメージしてみよう

f:id:mashita_07_15:20181226163447j:plain:w200
伝票
今回は京都に住む有栖川さんと神奈川県の鶴川に済む九龍さんの間でいらなくなったPCをやり取りするというシチュエーションで一連の流れを辿って行きたいと思います

  • 有栖川さんは九龍さんに渡すPCの梱包を終え、近くの営業所に持ち込みました
  • 営業所に持ち込まれた荷物は営業所から京都を管轄するセンターに他の荷物と一緒に送られます
  • 営業所から京都センターへ送られた荷物は地区別・方面別に仕分けし、別の営業所や長距離便に積み替えます。この場合は関東方面の長距離便に積み替えますです、
  • 長距離便は東名をひた走り関東へ入りました、関東のセンターへ入り九龍さんへ渡るPCは降ろされました
  • 降ろされたPCは神奈川を管轄するセンターへ送られ、仕分けの後鶴川近辺を担当する営業所へ輸送します
  • 鶴川を管轄する営業所にPCが到着しました、トラックで九龍さんの家へ配送されます
  • 九龍さんの家にPCが到着しました、やったね

このような経路で京都から鶴川へPCが輸送されました、では経路を分解し産業に落とし込むヒントを見つけていきましょう。

  • 有栖川さんは九龍さんに渡すPCの梱包を終え、近くの営業所に持ち込みました

まずここで注目することは「梱包を終えて営業所に持ち込んだ事」です、荷物という貨物が有栖川さんの家で発生しました。
このような個人から発生するものや少量のものを小荷物と呼称します、ただしSimutransで実装するとしたらこの個人宅から荷物が発生するのはネットワーク組むのも骨が折れるレベルなので妥協し、営業所から小口荷物を発生することにします。

  • 営業所に持ち込まれた荷物は営業所から京都を管轄するセンターに他の荷物と一緒に送られます
  • 営業所から京都センターへ送られた荷物は地区別・方面別に仕分けし、別の営業所や長距離便に積み替えます。この場合は関東方面の長距離便に積み替えます
  • 長距離便は東名をひた走り関東へ入りました、関東のセンターへ入り九龍さんへ渡るPCは降ろされました

営業所から発生した小口荷物は仕分けのためにセンターに送り込まれます、同一都市内ではすぐに別の営業所へ送られますが多少離れるもしくは他県にまたがる場合は方向別に仕分けた上でカーゴを単位として集約して輸送されます。

シムトラ的には小口荷物をセンターという産業が受け入れ、それをカーゴという別の貨物に変換する形になりますね。
カーゴで運ばれた荷物をセンターで小口荷物という形に変換しています。

  • 鶴川を管轄する営業所にPCが到着しました、トラックで九龍さんの家へ配送されます
  • 九龍さんの家にPCが到着しました、やったね

この配送も実装としては営業所で完結する形になります、最初の持ち込みと一緒ですね。

産業としてフローをまとめてみよう

f:id:mashita_07_15:20181130234957p:plain:w200
産業フローイメージ

発送担当の営業所を定義する

これがさっきのイメージとしてまとめた流れを産業として落とし込んだ場合のフローです、なにやら発送と配送で産業が分かれていますね。なぜこのような構造を取ったのか順を追って見ていきましょう。

まずは発送を担当する営業所を実装し、この産業全体のフローの起点を定義します。この状態でも営業所同士を結べば荷物をやり取りすることが出来ますが、大量に営業所がある場合全てを結ぶ場合は全ての営業所を結ぶ必要がありますね。

この産業が営業所同士で完結すると仮定し、マップ全体の営業所数を10箇所と仮定してみましょう。一つの営業所からは9箇所の営業所を手動で結ぶ必要があります。それを10箇所分繰り返した場合は以下の数式より算出することが出来ます。

(\underset{営業所からの接続数}{10-1})\times \underset{総営業所数}{10}

計算すると90回必要になります、ですがこんな手間掛かる事は手植えで置いたりする限りやりたくないですね。ここで次に登場する地区物流センターと呼ばれる産業の出番となります。

ネットワーク構築をシンプルに、受け入れる地区物流センターを定義する

f:id:mashita_07_15:20181201004341j:plain:w200
先に断っておきます、営業所だけでもこの産業のネットワークは組むことが出来ます。ですが、先程の大量の作業が必要になる問題が出てきましたね。この地区物流センターを用いてネットワークを整理するとともに手間を削減しましょう。

では、営業所と地区物流センターを結べるようにします。営業所で生産した小口荷物を地区物流センターで消費するように実装するとネットワークとしても結ばれます。
この到着した小口荷物をただ消費するだけでは荷物は目的地へ到着することは出来ません、目的地に近い営業所や別のセンターに長距離便へ積み替える必要が出てきます。

積み替えるということはすなわち産業の実装としては別の貨物に変換することになります、そこでどういう変換を行えばいいかと言うと最初に出したフローのイメージを参照してください。地区カーゴという別の貨物が定義されていますね、これが変換の重要なポイントでありリアリティのポイントでも有ります。

センターに集まった荷物はセンターにぶら下がる営業所へ送るものだったり、かたや北海道や九州・沖縄と言った相当な遠方に送られる品物まで多種多様です。それらは一緒くたに1台のトラックに詰め込んでおしまいとしたら無駄な時間がかかりますね、営業所から到着したトラックにその営業所から配送する荷物を積み込んだり別のセンターとを行き来するトラックに積み込む方がいいですよね。
ここで貨物の変換が活きてきます、実装としてもシンプルになりますからね。

ここまでの実装を元に2つのセンターにそれぞれ5箇所の営業所を繋がっていると仮定した場合、次の数式で手間を算出できます

\underset{営業所からセンターに繋ぐ回数}{(1 \times 5) \times 2)}\underset{センター同士を結ぶ回数}{ + 2}

先程と比較して2つのセンターに営業所から接続し、センター間を繋ぐだけでネットワークが成立するようになりました。10回営業所とセンターを繋ぎセンター同士を1回繋ぐだけなので先程の90回と比較したらかなり楽ですね。

センターが乱立するから集約したいぞ

ここまでで営業所間を結ぶのに地区物流センターを経由することでネットワーク構築の簡略化が達成されました、ですが大量の地区物流センターがあるとそれを結ぶのも営業所程ではなくとも結ぶのには時間がかかります。

この産業の実装に際して参考にしたクロネコヤマトにおいてはゲートウェイ構想という形で大量の発送・配送が発生する都市圏にゲートウェイと呼ばれる設備の設置を行い、荷物の集約と高頻度輸送がすでに実施されています。

それに則りマップ内において大量の荷物が発生する都市圏には地区物流センターからの荷物を集約する設備を建設し、その設備間での大量輸送を行う環境を構築し何十本という貨物列車やトラックが走り回る後者はOTRPが必要であろう物流天国地獄までをマップに構築します。
この設備を以後主要物流センターとし、大量の荷物を扱う設備とします。

フロー構築については営業所から地区物流センターの構築とほぼ共通です、地区物流センターにて発生した地区カーゴを主要物流センターへ搬入し荷物の目的地に繋がる主要物流センターから地区物流センターを介し営業所まで繋がるルートを走るトラックに載せる幹線カーゴと呼ばれる貨物に変換します。
これでネットワークの構築は完了しました、では具体的に深い実装を目指しましょう。

貨物を定義する

f:id:mashita_07_15:20181201004327j:plain:w200

ここまでで産業ネットワークの流れと必要になる産業や貨物が決まりました、次は貨物の詳細を定義していきます。
まずは次のコードを見ていただきます

obj=good
name=Delivery_Box(Small)
metric=box
catg=1
value=180
speed_bonus=40
weight_per_unit=1

これは実際に宅配便産業にて定義している小口荷物のdat(性能定義)です、objとnameについては説明は不要だと思うので3つ目の項目から順を追って説明していきます。

貨物の1個あたりの単位

まずはmetricと言う値です、これは「貨物1個あたりの単位」を定義しています。今回は荷物は全て箱に入っているという前提でboxとしていますが他に特殊なものを設定したいとか単位としてはおかしいぞという場合には個々を書き換えると別の単位を定義できます。
ja.tabファイルにてboxに対して訳語を設定するとシムトラ上でも訳語にて表示されるので使う方はお試しください

貨物の分類はどれにあたりますか?

catgと聞いて面を食らう人がいると思われますがcategoryという単語を短縮しただけなのでご安心ください、でこの値は何を設定するのかと言うと「Simutrans内における貨物の大まかな分類」を行います。
分類とは言っていますがどのような分類があるのかと言うと普段よりプレイしているpak.nipponのカテゴリーリストより引用した基本的な分類は以下の表のとおりです

  • 0 : 独自貨物
    • 例:自動車・発電所で用いる変圧器等の専用貨車が必要になる品物
  • 1:梱包済み製品(piece goods)
    • 例:書籍
  • 2:ばら積み貨物(bulk goods)
    • 例:石炭
  • 3:液体貨物(oil/gasoline)
    • 例:石油
  • 4:低温貨物
    • 例:牛乳・魚・肉類等
  • 5 : 飲料(liquid food)
    • 例:飲料水(コーラ等)
  • 6 : 長尺物(long goods)
    • 例:木材
  • 7 : ペレット・粉体貨物
    • 例:小麦粉等

これは基本的な例であり、他のpakセットにおいては別名である可能性もありますが基本的には上の分類が適用されます。
このカテゴリーは自分で定義することも可能でありcatgの数字を8から31の間にすることで独自の種類を定義することが可能です、これを用いた例としてpak.nipponの作者であるwaさんが作成した原子力発電所チェーンでは31番を用いて核燃料等という分類を定義しています。

CATEGORY_31
核燃料等

引用元:原子力発電所チェーンよりファイル「ja.np-nuclear.tab」

この産業では既存の車両を用いて輸送する事を前提とします、そのため分類として一番近い物は1番の梱包済み製品にあたるのでcatgを1とします。

ゲーム内における輸送単価はどれくらいにしますか?

ツールがあるのですが、ソースコードの解読資料を紛失したため割愛します。

貨物の1単位あたりの数はどれくらいですか?

weight_per_unitは貨物の1単位(今回は箱)の数量を指定します、今回は小口荷物を実装しているのと1回でそんなに箱は出ないとして1と定義します。これを2とか5にすると1回で2箱から5箱も荷物を送りつけてますね。

産業を定義しよう

貨物も定義し終わりました、ではその貨物を生産したり消費する産業の定義を進めていきましょう。
リポジトリより営業所のdatを2つ用意しました

Obj=factory
Name=Delivery_Office(Out)
Location=Land
DistributionWeight=1
Productivity=5
Range=20
Mapcolor=39
chance=100
OutputGood[0]=Delivery_Box(Small)
OutputCapacity[0]=250
OutputFactor[0]=150
dims=1,1,1
BackImage[0][0][0][0][0][0]=Delivery_Office.0.1
----
Obj=factory
Name=Delivery_Office(In)
Location=Land
DistributionWeight=1
Productivity=5
Range=30
Mapcolor=39
chance=100
InputGood[0]=Delivery_Box(Small)
InputCapacity[0]=250
InputFactor[0]=200
dims=1,1,1
BackImage[0][0][0][0][0][0]=Delivery_Office.0.0

objとnameは割愛してLocationから始めていきます

どんな場所なら建てられますか?

Locationでは産業を建てられる場所を指定します、以下の3種類から選択できます

  • Land(陸地)
  • City(都市)
  • Water(水上)

水上以外では特にツッコミどころはありませんが、町中にあるべき産業ならCityがおすすめですね。
逆に

どれくらいの割合で誘致されますか?

DistributionWeightでこの営業所が誘致する頻度を設定します、1〜127のどれかですが大きくなるほど大量に営業所が発生するのでバランスを見ながらどうぞ。

どれくらい貨物を発生させますか?

Productivityで基本となる貨物の発生(受入)量を設定します、次のばらつく度合いと関連します。

同じ営業所でも発生(受入)量にばらつきはありますか?

はい、Rangeという値で設定出来ます。

どんなものを生産しますか?

OutputGood / OutputCapacity / OutputFactorの3つのパラメタを使って定義します、プログラミングに明るい人ならば配列構造を用いている事に気づかれると思います。今回は1つの貨物を対象としているため[0]だけですが2つ以上の貨物を受け入れたり消費することも可能です。

まずは営業所からはどんな物が出ていきますか、集配や持ち込まれたであろう小口荷物を発送(生産)する必要があるので小口荷物を設定します。次に出ていく小口荷物は営業所にどれだけ置いておく事が出来るか? ここでは250箱はおいておける事とします。

最後に比率です、小口荷物を1箱発送(生産)するためにはどれだけ物が必要かを定義します。今回は150%とし、1.5箱の小口荷物が発生するものとします。

どんなものを消費しますか?

先程の生産の内容を逆に消費する場合を想定してください。

実際にアドオンとして作ってみよう

ここまでで産業ネットワークを構成するpakを作成するために必要になるdatは作れるようになりました、そして画像を用意する段階ですが今回のエントリーとはやや方向性が外れるため割愛します。

後記

トップバッターとして書いたAdventCalenderのエントリーを新たに追加したいものを入れまくったら元の倍以上の分量となってしまいました、実際に自分が産業ネットワークを実装する時のフローを後追いする形で文字に起こすとここまでシンプルなんですね。

運賃のくだりについてはソースコードを再度読み直して必要なパラメーターを拾ったりして別エントリーにてまとめる予定です、ご期待しないで待って頂けると助かります。

欲しいアドオンについて

pak.nippon(64)基準としてもまだ足りない物は結構多いですね、車両から建物まで足りない物は大量にあると思います。
特に駅舎の種類をresizeobj等を通して128からも導入しているので64向けにほしいレベル、五番星先生あたりがハイクオリティな物を量産しているので更に種類を増やして頂けると幸いです。
苗穂駅が建て替わったので前の苗穂駅あたりを是非制作してほしかったり。