§
------------------------------------------------
MIP - Simutrans いろいろ機能追加パッチ

				Jul 23, 2012
				 for MIP-003
				    wackdone
------------------------------------------------

Simutransにちょこっと便利な細かい機能追加を行うパッチです。

主に以下のような機能を追加します。
  * 柔軟な高架+スロープ建設 (裏技を使わなくても高架の下にスロープが置ける)
  * トンネル入り口の建設制限解除 (スロープや駅ホームが置ける)
  * 駅ホーム設置時の向きの反転 (Ctrlキーを押しながら設置)
  * 駅ホームのレベルのダウングレード (Shiftキーを押しながら設置)
  * デフォルトツールの記憶の変更
  * 編成組替えなどに便利な「車庫へ」機能の改良
  * ゲームロード時に自動でポーズ (起動時オプション "-pause" を指定)
  * トップウィンドウだけのスクリーンショット (Ctrlキーを押しながら撮影)

それぞれの機能はビルド時に有効/無効を切り替えることができます。


--------------------
= バージョン情報
--------------------
パッチバージョン: MIP Version 0.03
対応Simutransソース: Nightly r5788
パッチファイル名: simutrans-r5788-mip-003.patch

== 適用可能ソースについて
手元では、Release 111.3 (r5772) にも適用で動作することを確認しています。
おそらく、この間のバージョンであればどれも適用可能でしょう。

--------------------
= セーブファイルのバージョン: 変わらない
--------------------
このパッチをあてることによって、セーブファイルのバージョンが変わることはありません。
またオブジェクトのタイプなどにも一切の変更はありません。
これまでのゲームをそのままロードできますし、このパッチの元で作ったゲームを
オリジナルのSimutransでロードすることもできます。

--------------------
= ご注意
--------------------
本パッチは、上述の対応バージョンのオリジナルソースに対してのみテストしています。
本パッチを使用したことによる損害などには、一切責任を負えませんのでご了承ください。

本パッチは現状、ネットワークモードで動作するかは検証されていません。

--------------------
= パッチの適用とビルド
--------------------
Simutransのビルドが可能な環境とスキルがあることを前提に説明します。

== パッチの適用
Nightlyのソースを入手し、これに対して同梱のパッチファイル
  simutrans-r5788-mip-003.patch
をpatchコマンドなどを使ってあててください。

例:
{{{
  svn co -r5788 svn://tron.homeunix.org/simutrans/simutrans/trunk
  cd r5788
  patch -p0 < simutrans-r5788-mip-003.patch
}}}

== コンフィグ
ビルドコンフィグファイル (config.defaultなど) の中に以下のような
行を追加してください。

{{{
# 高架線下のスロープ建設を可能にする
CFLAGS += -DMAY_SLOPE_UNDER_ELEVATED
# トンネル入り口上の高架線建設を可能にする
CFLAGS += -DMAY_ELEVATED_ON_TUNNEL_ENTRANCE
# トンネル入り口部のホーム建設建設を可能にする
CFLAGS += -DMAY_STATION_ON_TUNNEL_ENTRANCE
# 駅ホームの自動設置判定の反転
CFLAGS += -DMAY_FLIP_STATION_FACE
# 駅のダウングレード
CFLAGS += -DMAY_DOWNGRADE_HALT
# 線路ツールのデフォルトとして高架線を記憶しない
CFLAGS += -DDONT_REMEMBER_ELEVATED
# ゲームロード時にポーズ状態で開始
CFLAGS += -DPAUSE_AFTER_LOAD
# 最全面のウィンドウだけのスクリーンショット (Ctrlを押しながら撮影)
CFLAGS += -DSCREENSHOT_ONLY_TOPWIN
# 車庫行き予定より後の駅への旅客や貨物を積載しない
CFLAGS += -DNO_LOAD_BEYOND_DEPOT
# 「車庫へ」ボタンの機能の改良
CFLAGS += -DSMART_GO_HOME_DEPOT
}}}

各項目を入れるか入れないかで機能の有無を切り替えられます。
(上の{{{から}}}の間の部分をコピーして、必要に応じて先頭に'#'を入れてコメントアウトすると便利でしょう)
なおWindows GDI用のコンフィグのサンプルを config.MIP.sample として同梱します。

ちなみにソースコード上は全てこれを元にifdefで制御されており、
このマクロ定義をしなければ、動作がオリジナル通りになります。
障害時にはこの定義を切り替えて動作を比較してください。

== ビルド
オリジナルと同様に make でコンパイル/リンクできます。

== パッチ機能有効化の組み合わせ
全ての機能が無効の場合 (CFLAGSで何も追加せず) と、
全ての機能が有効の場合 (添付の config.sample 相当) とはビルド、動作ともに
確認しています。

それぞれの機能の有効、無効は独立になるようにコーディングしていますが、
組み合わせによっては予想外の動作をするかもしれません。
もし組み合わせによって問題が発生した場合はお知らせください。


--------------------
= 機能の説明: スロープ、トンネルまわりの建築制限の緩和
--------------------
主に高架線やトンネル入り口まわりでの建築上の制約を取り除きます。

----------
== MAY_SLOPE_UNDER_ELEVATED: 高架線下のスロープ
----------
水平な高架線の下に並行する方向のスロープが設置できます。
また逆に既存のスロープの端に接っするように、高架線の端部を下げることができます。

(例えば128な人のブログで解説されたように整地、特殊駅施設を設置、施設削除という
 手順を踏めばこれまでも可能ではありました)

----------
== MAY_ELEVATED_ON_TUNNEL_ENTRANCE: トンネル入り口上の高架線
----------
トンネル入り口の上に高架線を施設できるようにします。
トンネル入り口の真上に並行して水平に高架線を設置したい場合は、
傾斜に沿った高架線を建設したあと、スロープツールで下げてください。

----------
== MAY_STATION_ON_TUNNEL_ENTRANCE: トンネル入り口部のホーム
----------
トンネル入り口部分に駅ホームやバス停を設置できるようにします。
(昔のSimutransでは可能でした)

検討中の問題点: ホームの表示位置がずれてしまう。
  MIP-003時点では表示の問題だけ修正したが、他の面でSimutransオリジナルの
  仕様と衝突する惧れがある。


--------------------
= 機能の説明: 駅ホーム設置の柔軟性確保
--------------------
駅のホームを設置する時に、これまでできなかった事を可能にします。
(一部、SimutransVT と似ているが操作方法の異なるものがあります。
 VTをご使用中の方はご注意ください。)

----------
== MAY_FLIP_STATION_FACE: 駅ホームの自動設置判定の反転
----------
自動設置対応ホームを設置時に、Ctrlを押しながら設置することで、
本来の自動判定の向きとは逆向きのホームを建設します。
(Ctrlを押すのは設置位置をクリックするタイミングです。
 ツールを選ぶタイミングではありません。)

例えばデフォルトでは、下の線路の中央をクリックすると

　　　　　　□  ホーム
線路　＝＝＝＝＝＝＝

のように設置されるところを、Ctrlを押しながらクリックすることで、

線路　＝＝＝＝＝＝＝
　　　　　　□  ホーム

のように設置されます。
続けて並べて設置する時は (自動判定は既存のホームの向きを参考にするので)
Ctrlを押さないようにして下さい。

言葉で考えるより使ってみて慣れた方が早い機能です。
(次の MAY_DOWNGRADE_HALT を有効にすれば、資金に余裕さえあれば何度でも試せますし。)

----------
== MAY_DOWNGRADE_HALT: 駅のダウングレード
----------
既存の駅に上書きで、レベルの低い(容量の小さい)駅を建設できるようにします。
駅を設置時にShiftキーを押しながら設置します。

--------------------
= 機能の説明: その他
-------------------
その他、ゲーム時の操作を便利にする機能などです。

----------
== DONT_REMEMBER_ELEVATED: 高架線をデフォルトツールとして記憶しない
----------
't'キーで最後に選択していた線路をデフォルトツールとして呼び出すことができますが、
この時に高架線(鉄道/道路など)についてはデフォルトとして更新しないようにさせます。
道路('s')についても同様に機能します。

例としては (あくまで一つの使用スタイルとしてですが)、
't'で呼び出されるのはその時代に合った一般的な地上線路で建設を進め、
一部だけ高架線を使用して建設を行うということがあると思います。
この時、頻繁に使う地上線路は素早く't'で呼び出せてほしいので、
高架線建設を行うたびにデフォルトツールが変更されるのは迷惑です。

この機能はこのような状況での操作性を改善します。

----------
== PAUSE_AFTER_LOAD: ゲームロード時にポーズ状態で開始
----------
起動時のコマンドラインオプション "-pause" を追加します。

このオプションが指定されて起動すると、
ゲームをロードした直後、ポーズ状態でゲームを開始します。
大規模開発されてしまい動作中だと重くて操作できないような
ゲームをロードする際などに便利です。

また開発中の機能などを試している状況で、ロード直後に発生するような
タイミング依存の症状がある場合に、これを再現する助けにもなります。
(これはあくまで、こちらの手元の事情ではありますが。)

----------
== SCREENSHOT_ONLY_TOPWIN: トップウィンドウだけのスクリーンショット
----------
Ctrlキーを押しながらスクリーンショット撮影ボタンを押すことで、
現在表示されているウィンドウ(Simutransの中のもの) のなかで
最全面にあるウィンドウだけのスクリーンショットを作成します。
作成されたスクリーンショットは screenshot/simwinNN.bmp という
ファイル名になります。(将来変更の可能性あり)

機能解説資料を作る時や、問題報告でウィンドウの画像だけをアップしたい場合に
画像を切り出す手間がなくなるので、少しだけ便利になると思います。
(結局 bmpからpngなどへの変更は必要でしょうが。)

注記:
  現在は、SDL 用のコードのみ実装されています。
  (Windows GDL などでは使えません。)
  またSDLでも (Windows だけにある) png 出力には対応していません。
  他のバックエンドにコードを対応してくれる方を募集します。


--------------------
= 機能の説明: 乗物の操作と動作の改善
--------------------

----------
== NO_LOAD_BEYOND_DEPOT: 車庫行き予定以降の積載を行わない
----------
スケジュールの途中に車庫へ行く項目がある場合、この車庫行きより後に停車する
駅への旅客・郵便・貨物を積載しません。
次の項目 "SMART_GO_HOME_DEPOT" と組み合わせて、編成組替えや交換などの作業を
スムーズに行うことを目的として組込みました。

Simutransでは乗物が車庫へ入ると、その乗物に積載されていた積荷は全て無賃で
降ろされてしまいます。つまりこの輸送分の利益は失われることになります。
このため運行の途上で車庫に入る列車に、その車庫より先へ行くべき積荷を積むのは
(後述する一時的な混雑解消の目的以外では) 無意味です。

このNO_LOAD_BEYOND_DEPOTを有効にした場合、積荷を積んだまま車庫へ入ることを
防ぐことができます。
(ただし実際にはスケジュールの構成方法や、車庫行きを指示するタイミングにより
完璧に防げるとは限りません。)
例えば、
  A → B → C → 車庫 → D → E
というスケジュールになっている場合に列車が A に到着すると、
  B、Cへの積荷: 積載する
  D、Eへの積荷: 積載しない
となります。このため車庫に入る段階では積荷は空になっています。

注意:
  128な人のブログで紹介されているように、駅の混雑を解消する手段として
  「わざと車庫行きの運行」を行い、積荷を捨てるというテクニックがあります。
  NO_LOAD_BEYOND_DEPOT を有効にすると、このテクニックが使えなくなるので
  注意してください。(いくつかの技を組み合わせて代用は可能ですが面倒です。)

技術的な説明と課題は、INTERNAL_MIP_ja.txtに記載しています。


----------
== SMART_GO_HOME_DEPOT: 「車庫へ」ボタンの機能の改良
----------
乗物の情報ウィンドウの中にある「車庫へ」("go home")ボタンの動作を改良します。
運行中の編成の組替えや車両の一部変更などを行いやすくするための機能です。

機能の変更を簡単に説明すると:
  (1) 「所属車庫へ」の時に押すと、乗物が以前に出庫した車庫へ戻ろうとします
  (2) 「最寄車庫へ」の時に押すと、最寄りの車庫へ戻ろうとします (オリジナル通りの動作)

この時、(1)では戻り先の車庫の直前までの営業は続けようとします。例えば、
  A → B → C → D → E
というスケジュールで運行していて B と Cの間に前回出庫した車庫があるとします。
(その時は、スケジュール上の C から運行を開始したとします)
この状態で「所属車庫へ」を押すと、列車の現在位置にかかわらず
  A → B → 車庫 → C → D → E
のように車庫行きのスケジュールが挿入されます。

なお「所属車庫」==「前回出庫した車庫」が工事などにより無くなってしまった場合、
あるいはそこへ行くことが出来なくなっている場合には、エラーを表示します。
この場合は、ボタンの表示は「車庫へ」になり、(2)の動作しか行わなくなります。

(2)の段階の動作は、オリジナルの「車庫へ」ボタンの動きと同じです。
(車庫を見つける処理を一般的な使用に合わせて若干高速化しています)

注記:
  現状の実装では、ゲームのセーブデータに「以前に出庫した時のスケジュール上の
  位置」が記録されません。位置は 0 にリセットされてしまいます。
  また乗物のスケジュールが変更された場合などにも、この位置情報が正しく追従
  できない場合があります。
  乗物が再び車庫から出庫する時点でこの値は再設定されます。

技術的な説明と課題は、INTERNAL_MIP_ja.txtに記載しています。


--------------------
= 過去の機能の分離
--------------------
TIPとして公開当初に入っていた機能の一部は、それぞれ独立したパッチとして分離しました。
  * 「簡易タイムテーブル機能」は TTT として分離しました。
  * Windows以外での日本語入力を可能にする機能は STSKK として分離しました。

またパッチ提供上の問題などから、以下の機能は一旦削除しました。

  * 「路線の複製」ボタン (路線編集ウィンドウ)
        ← TTTと同時にパッチを当てようとすると衝突します
        → 要望があればTTT側に導入します

  * 「停止点の変更」 (スケジュール作成中にCtrlを押しながら停止点をクリック)
        ← 停止点のハイライト表示を元に戻すことができないなどの理由により廃止
           (TTTの時間情報の引きつぎなどの問題もあります。)
        → 要望があれば機能を整え再度導入します


--------------------
= ご利用上の注意点とお願い
--------------------
このパッチは現在、αクオリティです。
作者自身、この機能を充分に使い込み、試しているわけではありません。
突然、あなたのマップのあちこちで居住権を訴える運動が発生しても
作者はデモ鎮圧も代替用地補償もできませんのでご了承ください :-)

バグのご報告や機能改善のご提案はウェルカムです。
ご連絡は日本語フォーラム
  Japanese Simutrans Forum
の該当トピックへお願いいたします。
(どうしても個人的にという場合は、wackdone@gmail.com へメールください)

このパッチの各機能はどれも軽いものなので、多くの人にとって便利なようであれば
本家に取り入れてもらえるようにしたいと考えています。
宜しければフォーラムや巨大掲示板などで、
  「この機能はすぐにでも本家に入って欲しい」
とお伝え頂けますでしょうか。声の大きかったものから優先して本家へ
働きかけたいと思います。

また逆に、一部の機能を切り出してご自身で本家へアプローチされても結構です。
(その方が私は助かります。特に私は英語がダメなものでorz)

なお、みなさんに是非この機能を使ってより深くSimutransを楽しんでいただけたらと
願っております。
この機能を使ったマップ紹介ページや動画などを公開して頂くのは大歓迎です。


--------------------
= 技術面補足情報
--------------------
以下の機能については、その実装内容の簡単な説明と検討課題を
INTERNAL_MIP_ja.txt に記載しています。合わせてご参照ください。
  NO_LOAD_BEYOND_DEPOT
  SMART_GO_HOME_DEPOT
