shingoushori's dialy

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

PythonでSimutransの特定の行と列の海底のレベルを水面まで持ち上げてみた

素敵な交通シミュレーション Simutrans で、
↓人工地盤っぽい感じで格子状に道路+線路を張り巡らしたいのです、私は
Simutransで人工地盤してみる - shingoushori's dialy

... 今回は、特定の行と列の海底のレベルを持ち上げてみました
高架を通すにも、海底のレベルが水面と同じじゃないと建てられないのです
自由に分岐したいので、橋では物足りないのです

今回入っている箇所を見つけた値は以下の3つ
・地面タイルの気候
・陸地の標高
・陸地の ... 水面のレベル ?

こんな感じになりました



↓サンプルコードです。
↓※絶対に元のデータを上書きしないでください。
↓※データや設定が破壊されても、責任は一切負えません。
↓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
  if (count_x % 5 == 0) or (count_y % 5 == 0) \
    or (count_x % 40 == 19) or (count_x % 40 == 21) \
    or (count_y % 40 == 19) or (count_y % 40 == 21):
    if planquadrat[0].text == "2":
      # "1" : 地中海性気候 ?, "2" : 海
      n_grund = 0
      planquadrat_iter = planquadrat.iter('grund_t')
      for grund in planquadrat_iter:
        if n_grund == 0:
          grund[0].text = grund[1].text
          # grund[0].text : 標高 ?
          # grund[1].text : 海面のレベル ?
        n_grund = n_grund + 1
  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()