shingoushori's dialy

音信号処理を専ら研究していた元博士後期課程の学生によるメモ

PythonでSimutransの線路と道路の持ち主を変えてみた

Simutrans(http://japanese.simutrans.com)は, 素晴らしい.

プレイヤー会社を経営するわけですが、公共事業があってインフラとか地形いじりとかはそっちに任せられちゃうあたり、プレイしやすいのです!

しかし、プレイヤー会社と公共事業の切り替えはこんがらがります ...
... というわけで、とりあえず線路と道路を公共事業に譲渡しちゃおう、というのをやってみました



とりあえず、
0 : プレイヤー会社, 1 : 公共事業, 15 : ?
です!
1 が灰色の公共事業、15が・・・? オレンジ色です

マルチプレイだと 最大15 つまり数字では 14まで
0~15 で 4 bit となっていると
市道や民家など、公共事業にも入れられないものの掃き溜めなのでしょう

...すると、公共事業じゃない市道 ... というのは
一体、どういうことなのでしょう? 一般的なのでしょうか
そして、Simutransの市道化 とは一体 ...

さておき、じゃあいっそのこと、全部 公共事業...じゃない何かオレンジ色の法人に譲渡してしまってはどうか ...
どうせ市道に勝手に譲渡させられるんなら、人口基盤のノリの高架だって譲渡してもいいでしょう!
...ということでやってみましたが ...
線路と道路だけでは...維持費が微妙に残りました おそらく、信号とかバス停とかです
その上、通行料がはいりません ... ただ、お金が減るだけ

ということで、
大人しく上述通りの
 ~ プレイヤー会社 の道路を 公共事業 に譲渡 ~ をやります
市道が 1 : 公共事業 じゃないので、ちゃんと 0 : プレイヤー会社 のものだけを選ぶ必要があるのです

↓サンプルコードです。
↓※絶対に元のデータを上書きしないでください。
↓※データや設定が破壊されても、責任は一切負えません。
↓version=0.120.4, 自作改造パック pak.japan_custom 用になっていますが ... 適宜正しい値になっていないと、面白いくらい開けないデータになります、多分
↓私はそれで苦戦しました
↓さらに、文字コードとかあれこれ読み込みが繊細です。

# -*- coding: utf-8 -*-
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

import xml.etree.ElementTree as ET

filename_in = 'test_in.sve'
filename_out = 'test_out.sve'

f = open(filename_in)
data1 = f.read()  # ファイル終端まで全て読んだデータを返す
f.close()

data2 = data1.replace("<![CDATA[","<CDATA>")
data2 = data2.replace("]]>","</CDATA>")

root = ET.fromstring(unicode(data2.encode('utf-8')))

# マップのサイズを取得
N_x = int(root[0][0].text)
N_y = int(root[0][13].text)

count_p = 0
count_x = 0
count_y = 0
for planquadrat in root.iter('planquadrat_t'):
  count_x = count_p % N_x
  count_y = count_p / N_x
  
  planquadrat_iter = planquadrat.iter('grund_t')
  for grund in planquadrat_iter:
    # strasse_t : 道路
    grund_iter = grund.iter('strasse_t')
    for strasse in grund_iter:
      for weg in strasse.iter('weg_t'):
        if (int(weg[0].text) == 0): 
          weg[0].text = str(1) # 0 : プレイヤー会社, 1 : 公共事業, 15 : ?
          print str(count_x) + " , " + str(count_y) + " , " + grund[0].text + " strasse_t"
    
    # schiene_t : 線路
    grund_iter = grund.iter('schiene_t')
    for schiene in grund_iter:
      for weg in schiene.iter('weg_t'):
        if (int(weg[0].text) == 0): 
          weg[0].text = str(1) # 0 : プレイヤー会社, 1 : 公共事業, 15 : ?
          print str(count_x) + " , " + str(count_y) + " , " + grund[0].text + " schiene_t"
  
  count_p = count_p + 1

data3 = ET.tostring(root, encoding="utf-8")
  
  count_p = count_p + 1

data3 = ET.tostring(root, encoding="utf-8")

data4 = "<?xml version=\"1.0\"?>\n" + data3
data4 = data4.replace("<CDATA>","<![CDATA[")
data4 = data4.replace("</CDATA>","]]>")
data4 = data4.replace("<CDATA />","<![CDATA[]]>")
data4 = data4.replace("<Simutrans pak=\"pak.japan_custom\" version=\"0.120.4\">","<Simutrans version=\"0.120.4\" pak=\"pak.japan_custom\">")

f = open(filename_out,'w') # 書き込みモードで開く
f.write(data4)  # 引数の文字列をファイルに書き込む
f.close()