PythonでSimutransの線路と道路の持ち主を変えてみた
Simutrans(http://japanese.simutrans.com)は, 素晴らしい.
プレイヤー会社を経営するわけですが、公共事業があってインフラとか地形いじりとかはそっちに任せられちゃうあたり、プレイしやすいのです!
しかし、プレイヤー会社と公共事業の切り替えはこんがらがります ...
... というわけで、とりあえず線路と道路を公共事業に譲渡しちゃおう、というのをやってみました
市道以外も、市道のように公共物でないオレンジ色の何かにできた 公共事業が2タイプある、というわけではないのだ、おそらく #simutrans pic.twitter.com/nY52LtSY7g
— shingoushori (@shingoushori) 2017年9月12日
公共事業にも2タイプあることを初めて意識した #simutrans pic.twitter.com/CrHxn4Khog
— shingoushori (@shingoushori) 2017年9月11日
とりあえず、
0 : プレイヤー会社, 1 : 公共事業, 15 : ?
です!
1 が灰色の公共事業、15が・・・? オレンジ色です
マルチプレイだと 最大15 つまり数字では 14まで
0~15 で 4 bit となっていると
市道や民家など、公共事業にも入れられないものの掃き溜めなのでしょう
...すると、公共事業じゃない市道 ... というのは
一体、どういうことなのでしょう? 一般的なのでしょうか
そして、Simutransの市道化 とは一体 ...
さておき、じゃあいっそのこと、全部 公共事業...じゃない何かオレンジ色の法人に譲渡してしまってはどうか ...
どうせ市道に勝手に譲渡させられるんなら、人口基盤のノリの高架だって譲渡してもいいでしょう!
...ということでやってみましたが ...
線路と道路だけでは...維持費が微妙に残りました おそらく、信号とかバス停とかです
その上、通行料がはいりません ... ただ、お金が減るだけ
道路と線路を 公共事業にやってもらっていたが、あまりの赤字に耐えきれずに 謎のオレンジ色法人に譲渡させてみた、Pythonでガリガリッと ... しかし 公共事業にまだ残っていて(駅に信号?)、地味に維持費が ... 作戦失敗 #simutrans pic.twitter.com/YDrIKAneGk
— shingoushori (@shingoushori) 2017年9月14日
ということで、
大人しく上述通りの
~ プレイヤー会社 の道路を 公共事業 に譲渡 ~ をやります
市道が 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()