Simutrans の経済メカニズムとロジスティクスについて解説します。工場による生産、貨物流通、プレイヤーの財務管理が統合的に機能します。
ファイル: src/simutrans/simfab.h, simfab.cc
工場(fabrik_t)は、原材料を消費して製品を生産する施設です。サプライチェーンを形成し、経済システムの中核を担います。
最新の生産システムで、以下の特徴があります:
// ブースト定数
#define FAB_BOOST_ELECTRIC 2 // 電力ブースト
#define FAB_BOOST_PAX 3 // 旅客ブースト
#define FAB_BOOST_MAIL 4 // 郵便ブースト
flowchart TD
Start[生産サイクル開始] --> CheckInput{原材料あり?}
CheckInput -->|No| Wait[待機]
CheckInput -->|Yes| CheckOutput{製品在庫<br/>少ない?}
CheckOutput -->|No| Slowdown[生産速度低下<br/>RAMPDOWN]
CheckOutput -->|Yes| FullSpeed[フル生産]
Slowdown --> CalcBoost
FullSpeed --> CalcBoost[ブースト計算]
CalcBoost --> Electric{電力供給?}
Electric -->|Yes| +5%
Electric -->|No| Base[基本生産力]
+5% --> Pax{旅客到着?}
Base --> Pax
Pax -->|Yes| +10%
Pax -->|No| Mail{郵便到着?}
+10% --> Mail
Mail -->|Yes| +5%2[+5%]
Mail -->|No| Produce[生産実行]
+5%2 --> Produce
Produce --> UpdateStats[統計更新]
UpdateStats --> Distribute[製品を配送]
Distribute --> Start
Wait --> CheckTimer{1秒経過?}
CheckTimer -->|No| Wait
CheckTimer -->|Yes| Start
style Start fill:#e1f5ff
style Produce fill:#d4edda
style Slowdown fill:#fff3cd
#define FAB_PRODUCTION 0 // 生産量
#define FAB_POWER 1 // 電力消費
#define FAB_BOOST_ELECTRIC 2 // 電力ブースト
#define FAB_BOOST_PAX 3 // 旅客ブースト
#define FAB_BOOST_MAIL 4 // 郵便ブースト
#define FAB_PAX_GENERATED 5 // 発生した旅客
#define FAB_PAX_DEPARTED 6 // 出発した旅客
#define FAB_PAX_ARRIVED 7 // 到着した旅客
#define FAB_MAIL_GENERATED 8 // 発生した郵便
#define FAB_MAIL_DEPARTED 9 // 出発した郵便
#define FAB_MAIL_ARRIVED 10 // 到着した郵便
graph LR
Mine[鉱山<br/>Factory] -->|鉄鉱石| Steel[製鉄所<br/>Factory]
Coal[炭鉱<br/>Factory] -->|石炭| Steel
Steel -->|鋼鉄| Car[自動車工場<br/>Factory]
Car -->|自動車| City[都市<br/>Stadt]
Forest[森林<br/>Factory] -->|木材| Sawmill[製材所<br/>Factory]
Sawmill -->|木材| Furniture[家具工場<br/>Factory]
Furniture -->|家具| City
style Mine fill:#8B4513
style Coal fill:#2F4F4F
style Steel fill:#708090
style Car fill:#4682B4
style City fill:#FFD700
// 生産を実行
void step(uint32 delta_t);
// 原材料を受け取る
void liefere_an(const goods_desc_t* ware, uint32 amount);
// 製品を配送
void distribute_goods(uint32 product_index);
// ブーストを更新
void update_boosts();
ファイル: src/simutrans/simware.h, simware.cc
貨物(ware_t)は、輸送される品物の単位です。出発地・目的地・経由地の情報を持ち、経路に沿って移動します。
class ware_t {
goods_desc_t* desc; // 貨物種別
uint32 amount; // 数量
koord target_pos; // 最終目的地
koord via_pos; // 経由地(トランスファー)
halthandle_t target_halt; // 目的停留所
halthandle_t via_halt; // 経由停留所
uint32 arrival_time; // 到着予定時刻
};
貨物は以下のカテゴリに分類されます:
enum goods_catg {
INDEX_PAS = 0, // 旅客(Passengers)
INDEX_MAIL = 1, // 郵便(Mail)
INDEX_NONE = 2, // 貨物なし
INDEX_GOODS = 3 // 一般貨物(以降)
};
flowchart TD
Start[貨物発生] --> HasDirect{直接経路あり?}
HasDirect -->|Yes| DirectRoute[直接経路を設定<br/>via_halt = NULL]
HasDirect -->|No| FindTransfer[トランスファー探索]
FindTransfer --> CheckConnections{接続を確認}
CheckConnections --> CalcBest[最短経路を計算<br/>A*アルゴリズム]
CalcBest --> SetVia[via_halt を設定]
SetVia --> Wait1[停留所1で待機]
DirectRoute --> Wait1
Wait1 --> Load1[編成1に積載]
Load1 --> Transfer{トランスファー?}
Transfer -->|Yes| Unload1[停留所2で降車]
Transfer -->|No| ToFinal[最終目的地へ]
Unload1 --> Wait2[停留所2で待機]
Wait2 --> Load2[編成2に積載]
Load2 --> ToFinal
ToFinal --> Arrive[目的地到着]
Arrive --> Deliver[配達完了]
style Start fill:#e1f5ff
style Deliver fill:#d4edda
style FindTransfer fill:#fff3cd
複数の路線を経由して目的地に到達する仕組みです。
例: 鉱山 → 製鉄所への輸送
graph LR
Mine[鉱山] -->|トラック| Station1[中継駅]
Station1 -->|鉄道| Station2[工業地帯駅]
Station2 -->|トラック| Steel[製鉄所]
style Mine fill:#8B4513
style Station1 fill:#FFD700
style Station2 fill:#FFD700
style Steel fill:#708090
旅客は待ち時間に応じて不満を持ちます:
// 待ち時間の閾値
#define HAPPY_THRESHOLD 2000 // この時間以内なら満足
#define UNHAPPY_THRESHOLD 5000 // これを超えると不満
graph LR
Spawn[旅客発生] --> Wait[停留所で待機]
Wait --> Check{待ち時間}
Check -->|< 2000ms| Happy[満足<br/>HAPPY++]
Check -->|2000-5000ms| Normal[普通]
Check -->|> 5000ms| Unhappy[不満<br/>UNHAPPY++]
Happy --> Board[乗車]
Normal --> Board
Unhappy --> Board
Board --> Travel[移動]
Travel --> Arrive[到着]
style Happy fill:#d4edda
style Unhappy fill:#f8d7da
style Arrive fill:#e1f5ff
// 目的地を設定
void set_target(koord target_pos);
// 経由地を設定(トランスファー)
void set_via(koord via_pos);
// 到着時刻を記録
void set_arrival_time(uint32 time);
// 貨物を統合(同じ目的地の貨物をまとめる)
void merge(const ware_t &w);
ファイル: src/simutrans/player/simplay.h, finance.h
各プレイヤーは独立した財務システムを持ち、収入・支出・資産を管理します。
enum finance_t {
COST_CONSTRUCTION, // 建設費
COST_VEHICLE_RUN, // 車両運用費
COST_NEW_VEHICLE, // 車両購入費
COST_INCOME, // 収入
COST_MAINTENANCE, // 維持費
COST_ASSETS, // 資産
COST_CASH, // 現金
COST_NETWEALTH, // 純資産
COST_PROFIT, // 利益
COST_OPERATING_PROFIT,// 営業利益
COST_MARGIN, // 利益率
COST_TRANSPORTED_GOODS,// 輸送量
COST_POWERLINES, // 電線費用
COST_WAY_TOLLS, // 通行料
MAX_PLAYER_COST_BUTTON
};
flowchart TD
Income[収入] --> Revenue[運賃収入<br/>COST_INCOME]
Revenue --> Gross[粗利益]
Expenses[支出] --> Running[運用費<br/>COST_VEHICLE_RUN]
Expenses --> Maint[維持費<br/>COST_MAINTENANCE]
Expenses --> Toll[通行料<br/>COST_WAY_TOLLS]
Running --> TotalExp[総支出]
Maint --> TotalExp
Toll --> TotalExp
Gross --> OpProfit[営業利益<br/>COST_OPERATING_PROFIT]
TotalExp --> OpProfit
OpProfit --> NetProfit[純利益<br/>COST_PROFIT]
Construction[建設費<br/>COST_CONSTRUCTION] --> NetProfit
Purchase[車両購入<br/>COST_NEW_VEHICLE] --> NetProfit
NetProfit --> Cash[現金<br/>COST_CASH]
Cash --> Assets[資産評価<br/>COST_ASSETS]
Assets --> NetWealth[純資産<br/>COST_NETWEALTH]
style Income fill:#d4edda
style Expenses fill:#f8d7da
style NetWealth fill:#e1f5ff
毎月、以下の処理が実行されます:
void new_month() {
// 1. 先月の統計を保存
roll_finance_history_month();
// 2. 維持費を計算
calc_maintenance();
// 3. 利益率を計算
calc_margin();
// 4. 資産評価を更新
update_assets();
// 5. AIの場合、戦略を再評価
if(is_ai()) {
ai->new_month();
}
}
現金がマイナスになると警告が出ます:
stateDiagram-v2
[*] --> 健全: 会社設立
健全 --> 警告: 現金 < 0
警告 --> 健全: 黒字化
警告 --> 猶予1ヶ月: 1ヶ月経過
猶予1ヶ月 --> 健全: 黒字化
猶予1ヶ月 --> 猶予2ヶ月: 1ヶ月経過
猶予2ヶ月 --> 健全: 黒字化
猶予2ヶ月 --> 倒産: 1ヶ月経過
倒産 --> [*]
note right of 警告
メッセージ表示
"資金不足"
end note
note right of 倒産
全資産売却
プレイヤー削除
end note
// 財務統計を記録
void book_stat(sint64 amount, finance_t type);
// 維持費を計算
sint64 calc_maintenance() const;
// 資産評価
sint64 calc_assets() const;
// 倒産チェック
bool check_bankrupt() const;
graph TD
Factory[工場] -->|製品生産| Ware[貨物発生]
Ware --> |配送経路| Halt[停留所]
Halt --> |積載| Convoy[編成]
Convoy --> |運賃収入| Player[プレイヤー財務]
Player --> |車両購入費| Convoy
Player --> |線路建設費| Halt
City[都市] --> |旅客・郵便発生| Ware
Ware --> |配達完了| City
style Factory fill:#8B4513
style Ware fill:#87CEEB
style Halt fill:#FFD700
style Convoy fill:#90EE90
style Player fill:#FFA07A
このシステム統合により、プレイヤーの投資判断が直接経済に影響を与える深いゲームプレイを実現しています。
| システム | 責務 | 主要ファイル |
|---|---|---|
| Factory | 生産、ブースト管理 | simfab.h/cc |
| Ware | 貨物流通、トランスファー | simware.h/cc |
| Finance | 財務管理、決算処理 | simplay.h, finance.h |
これら 3 つが相互作用して、Simutrans の経済シミュレーションが成立しています。