shingoushori's dialy

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

PythonでSimutransの街の座標をずらしてみた

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

"日本の役場セット" ( アドオン/建物2 - Simutrans日本語化・解説 ) には, ニヤニヤしてしまいます.

しかし, 一段階大きい庁舎に変わる時に, 別のところに移る & 元の場所が適当な市内建築に置き換わる.
...(略)... というわけで, とりあえずその界隈に改めて,
元々の庁舎と同じ建物をランドマークとして建てられるようにしよう ... というのを、前回やりました
Simutransで, "日本の役場セット"をランドマークとして遺せるように魔改造してみた - shingoushori's dialy

その後、あれこれセーブデータとにらめっこしていたところ、単に1つの街に複数の庁舎を建てるだけなら、魔改造したpakを用意する必要はないことがわかりました

さらに、新庁舎が建った時、元々の庁舎を削除させないだけなら、街の座標を元々の庁舎の座標からずらすだけで良いことがわかりました

ずらし方は完全に探れてはいません
とりあえず多分庁舎の北西の角が街の座標なので
そこから北西方向に1マスずつずらしてみました

さて、ここで今回眉間にシワが寄り頭を掻きむしったのが、
1つの街に関する情報の取得です
これまで扱ってきたような、特定のtagの木にまとまっていません
仕方がないので、セーブデータを見比べて傾向を捉えた怪しい探り方をしています
実に危うい

↓サンプルコードです。
↓※絶対に元のデータを上書きしないでください。
↓※データや設定が破壊されても、責任は一切負えません。
↓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)
print str(N_x) + " " + str(N_y)

root_iter = root.iter()
while True:
    try:
        i = root_iter.next()
        if (i.tag == 'planquadrat_t'):
          break
        if (i.tag == 'CDATA'):
          j = root_iter.next()
          if (j.tag == 'koord'):
            print(i.text + " " + j[0].text + " " + j[1].text)
            j_x = int(j[0].text)
            j_y = int(j[1].text)
            if (j_x == 0) :
              j_x = 2 # 元庁舎のx方向の幅の最大値が 2だとする
            else :
              j_x = j_x - 1
            if (j_y == 0) :
              j_y = 2 # 元庁舎のy方向の幅の最大値が 2だとする
            else :
              j_y = j_y - 1
            j[0].text = str(j_x)
            j[1].text = str(j_y)
            print(" -> " + j[0].text + " " + j[1].text)
    except StopIteration:
        break

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()