2013年1月30日水曜日

BVE5用の京王線快速2001列車をATC化する作業を自動化するスクリプト

ご無沙汰してます、はざまです。時が経つのは速いもので、もう2013年も一ヶ月がたとうとしていますね。さて、今回はいつもとちょっと毛色の違う話題をしようと思います。といっても、最終的にはプログラミングの話に落ち着くんですけどね(^_^;)


話は年が明けたのを機に調子が悪くなっていたデスクトップPCのビデオカードを入れ替えたところから始まります。自身初のNvidiaだったので、ドライバー入れるまでにWindowsUpdateのせいで何回も再起動させられるなど、紆余曲折を経て無事セットアップを終え、GeForce660の性能を試してみたくていくつかゲームを試してみたんですが、GPU負荷的には余裕がある。こりゃ、今持ってるゲームじゃ660をフル回転させるのは無理だなと判断して普段使ってるノートPCでは起動できないBVEを久しぶりにやろうと考えてなにか面白そうなルートはないかグーグル先生に訊いてみたら、次のような記事を発見したわけですよ。
これは面白そうだということで、早速櫻井 倫氏作成の2001列車ルートを落としてきて書き換えを始めたんですが、作業を始めて20分ぐらいしてから全部手作業でやるのはかなりめんどいことに気づいたわけです。手作業がめんどいんなら全部自動化すればいいよねということで、今回の本題であるPythonスクリプトにご登場願えるわけですよ。
当のPythonスクリプトはこちらからダウンロードしてください。ページ上部左の"ZIP"ボタンを押せばZIPファイルでダウンロードできるはずです。以下、このスクリプトの使い方の解説に入りますが、多少、コマンドプロンプトなどのコマンドラインの知識が要求されることとPython2.7.3のランタイムがインストールされている必要があることを予めご了承ください。

  1. まず、落としてきたZIPファイルを解凍しましょう。今回使用するのはその中のko_2001というフォルダーの中身です。(まあ、まだko_2001以外にフォルダーがないので、迷うことはないとは思いますが)
  2. 櫻井 倫氏のウェブサイトから2001列車のルートデータを、BVE公式サイトからデータコンバーターをそれぞれダウンロードしてきて解凍します。
  3. 2001列車のルートデータをデータコンバーターに通してBVE5で動く形式にします。(一旦、次のステップに行く前にこの状態で本当にBVE5で動作するか軽くテストしてみるといいでしょう。)
  4. ステップ1で解凍したko_2001フォルダーの中身をBVE5用に変換された2001列車データフォルダーに移動します。標準なら"マイドキュメント\Bvets\Scenarios\"にあるはずです。(このステップは、ステップ6で使用しているコマンドの意味がわかる人は飛ばしても構いません。)
  5. 次にコマンドラインを起動し(Windowsの場合Vista以降か7以降かは定かではありませんが、標準でコマンドプロンプトかWindows PowerShellという2種類のコマンドライン(っぽい)環境が使用できますが、今回のスクリプトはコマンドプロンプトの方でのみ動作確認をしております。Cygwinとか入れている人はそれを使ってもいけますが、コマンドプロンプトに合わせてエラーメッセージのエンコーディングをS-JISに設定しているので、エラーメッセージが文字化けします(多分)。Cygwin使いの人たちはf*ck you cmd.exeとでも叫んでおきましょう(^_^;) )先ほどko_2001フォルダーの中身を移動したディレクトリーに移動します。
  6. コマンドラインに次のコマンドを入力します。
    ko_2001フォルダーの中身を移動した人:
    > python ko_2001_bve5-ify.py Map.txt (なにか適当なファイル名:例えば、Map_ATC.txtなど)

    ko_2001フォルダーの中身を移動しなかった人:
    > python (上記のスクリプトへのパス) Map.txt (なにか適当なファイル名:例えば(ry)
以上で、このスクリプト自体の使い方の解説は終わりです。あとは、シナリオファイルや車両ファイルなどを書き換えれば晴れて2001列車をATC環境で運転できるようになります。運転できるようになるんですが、はっきり言って停車パターンが鬼畜です。全線運転して初見で一回もパターンに引っ掛けずに運転するなんてはっきり言って無理でしょう。あんな鬼畜な停車パターンに毎日耐えて運転しているKOの運転士たちはきっとドMに間違…おっと誰か来たようだ。

今回の2001列車ATC化プロジェクトはここでおしまいですが、今後も(面白そうなルートとやる気があれば)BVE5-ifyプロジェクトと題して今回のようなPythonスクリプトを不定期で公開していくかもしれません(もっとも、今回のはBVE5ならではの機能は一切使っていませんが)。もしもシリーズ化することになったら、そのときはお付き合いください。

なお、このスクリプトを使用したために発生した不具合に関しては一切責任を負いかねますので、予めご了承ください。また、Python 2.7.3以外での動作は保証しかねます。

13 件のコメント:

  1. スクリプトの「こちら」からDLしようとすると404エラーが出ます。自分も手作業で入力していて挫折した者なのでDLしたいのですがDLできません。対処の程、よろしくお願いします。

    返信削除
  2. だいぶ時間が経ってしまいましたが、リンク先のURLを間違えていたようです。修正しました。ご報告ありがとうございました。

    返信削除
  3. このコメントは投稿者によって削除されました。

    返信削除
  4. すいません、こうなってしまい出来ないのですがどうしたら良いでしょうか・・・・。
    1.pyは、ダウンロードしたpyファイルです。

    Microsoft Windows [Version 6.3.9600]
    (c) 2013 Microsoft Corporation. All rights res

    C:\WINDOWS\system32>cd C:\a

    C:\a>python 1.py Map.txt
    Traceback (most recent call last):
    File "1.py", line 111, in
    main()
    File "1.py", line 47, in main
    output_file_name = sys.argv[2]
    IndexError: list index out of range

    返信削除
    返信
    1. Python 2.7.3を使用しました。

      削除
  5. やり方よくわかりません

    返信削除
  6. ページが英語でよくわからないんだが

    返信削除
  7. やり方がいまいちよくわからないのですが・・・

    返信削除
  8. Shift_JISの日本語環境でエラーメッセージが文字化けしてしまいました。
    また、Line51と111でエラーが出て進みません。

    返信削除
    返信
    1. 51行目のエラーは、1000さんへの返信と同じ対処法で回避できます。
      よろしければ試してみてください

      削除
  9. line47と111でエラーが出ますが、
    ・最新のコンバータで変換するとMap2.02
    ・最終行は18234行
    ・コンバータが変換したMapファイルは新しい構文を使用している
    というのが原因でしょうか。

    返信削除
    返信
    1. 1000さん, あどみんさん
      返信遅れてしまって申し訳ありません。
      47行目でエラーが出るのは、引数をスクリプトのファイル名と置換前のマップファイルの名前の2個しか渡していないのが原因と思われます。置換後のマップファイル名を3つ目の引数として'python'コマンドに渡してみてください。

      ・最新のコンバータで変換するとMap2.02
      ・最終行は18234行
      という箇所もスクリプト停止の原因なので、自己責任で書き換えてみてください。

      削除
  10. 上のものをDL・実行したのですが、エラーが出てしまいました。
    エラーが文字化けしていて意味が分かりません。
    解決方法を教えて頂けますでしょうか?

    実行したコマンド
    python ko_2001_bve5-ify.py Map.txt Map_ATC.txt
    (ko_2001フォルダーの中身はコンバートしたフォルダ内に移動しました)

    結果(エラー)
    C:\Users\?\Documents\Bvets\Scenarios\京王電鉄-2001>python ko_2001_bve5-ify
    .py Map.txt Map_ATC.txt
    Traceback (most recent call last):
    File "ko_2001_bve5-ify.py", line 111, in
    main()
    File "ko_2001_bve5-ify.py", line 51, in main
    assert len(file_content) == 18104, u"繝輔ぃ繧、繝ォ縺ョ髟キ縺輔′諠ウ螳壹→驕輔>
    縺セ縺吶€・.encode("cp932")
    AssertionError: ファイルの長さが想定と違います。

    なお、コンバートした2001列車は正常に動作しました。
    また、コマンドラインはコマンドプロンプトを使用しました。
    さらに、Pythonは、Python2.7.3のランタイムを入れ、環境設定も変えました。
    長文になってしまい、すみません。
    返信お願い致します。

    返信削除

なにか意見や感想、質問などがあれば、ご自由にお書きください。