PythonでSimutransの道路の下を掘って、ペデストリアンデッキを設置してみた
フリーの交通?シミュレーション
Simutrans(http://japanese.simutrans.com)が, 素晴らしい.
それでもって私は人工地盤っぽいことをやっています。
Simutransで人工地盤してみる - shingoushori's dialy
大規模な都市開発をさっさとやるべく、Pythonでセーブデータをいじっています
... 人工地盤プレイに限らない、Simutransの話題に
「市道化防止パッチ」というのがあります
twitter.com
市街地が拡がった時、せっかく設置した高規格道路が市道化されてバス大迷惑
それも歯抜けで拡がるから見た目にも苦しい、加減速を繰り返すバス可哀想
という苦しみです
色々議論がありますが ...
私なりの苦しい回避策が 「道路の下を掘って、高架化する」です
↓こんな感じです↓
悲惨な市道化防止策 : 地下掘って、高架にする #Simutrans pic.twitter.com/qi3DFnUX28
— shingoushori (@shingoushori) 2017年11月19日
できるだけ本体改造せず、セーブデータも独自拡張せず、
やりたい私だけがちょっとした苦労だけに抑えるべく、
セーブデータの改造でできるだけ済ませたいのです
喧嘩、怖い 門前払い、心と体が保たない いじめ、よくない
やってみると、色々ありそうなのですけども
とりあえず、2点気づきました
・掘ったところに設置するなら、箱積み駅舎のペデストリアンデッキがオススメ
→ 掘ったところに何かを設置しないと、そこに家がたってしまいます
どうせなら、後々地下鉄...的な何か 開削工法だと言い張ってみる!を設置したいですよね
そうすると、消しやすい何かがいいのです
となると、箱積み駅舎のペデストリアンデッキならば、実態は運河なのでちょうどいい はずです
↓こんな感じです↓
掘ったところに、フェンスや箱積み駅舎のペデストリアンデッキを配置できるようになった pic.twitter.com/TPlSMAcdsI
— shingoushori (@shingoushori) 2017年11月25日
・AIプレイヤーの道路は割り込んでくる
→どういう処理なのかは未確認ですが、勝手に接続して来ちゃいます
市道は接続しなかった気がするのですが ...
↓こんな感じです↓
そして、AIプレーヤーの道路には、あっけなく汚染されてしまった ... #Simutrans pic.twitter.com/vrACCkk6Rd
— shingoushori (@shingoushori) 2017年11月24日
なお、サンプルコードでは、とりあえず次のようにしています
・特定のプレイヤー target_player_num の道路についてのみ処理
・掘ったところに敷く道路/フェンス/ペデストリアンデッキの接続方向は 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 = 'testout_elv_road.sve' filename_out = 'testresult.sve' # 特定プレイヤーの道路の下を掘って、何やらを設置 def dig_gut_under_way(root, target_player_num, target_gut_way, target_gut_way_type): # 検索用 l_planquadrat = list(root.findall('planquadrat_t')) 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 len(planquadrat[1].getchildren()) < 6 : print str(count_x) + " " + str(count_y) count_p = count_p + 1 continue if (planquadrat[1][5].text == '1'): # 道路あり player_num = int(planquadrat[1][6][0][0].text) if (player_num != target_player_num): count_p = count_p + 1 continue #接続方向 #print str(count_x) + " " + str(count_y) + " " + planquadrat[1][6][0][1].text connect_arg = int(planquadrat[1][6][0][1].text) # 1:toN, 2:toE, 4:toS, 8:toW # 掘らないタイプの道路 target_way = planquadrat[1][6][1].text if (target_way == target_gut_way): count_p = count_p + 1 continue # #### 処理 # 高度 海面 計画 target_h = int(planquadrat[1][0].text) # 高度 target_hs = int(planquadrat[1][1].text) # 海面? target_hs2 = planquadrat[1][2].text # target_hd = target_h - 1 # 高度 掘 if (target_hs >= target_hd) : target_hs = target_hd - 1 target_h = str(target_h) target_hs = str(target_hs) target_hd = str(target_hd) target_grad = planquadrat[1][4].text # 0 : 平地 # 4 : 南北 ud b00000100 # 8 : 南北 ud b00001000 h # 12 : 東西 ud b00000110 # 28 : 東西 du b00010110 # 36 : 南北 du b00100100 # 高架追加 count_ch = len(planquadrat.getchildren()) elem_1 = ET.Element('id') elem_1.text = '6' elem_2 = ET.Element('grund_t') subelem_1 = ET.SubElement(elem_2, 'i8') subelem_1.text = str(target_h) # 高度 subelem_1 = ET.SubElement(elem_2, 'i8') subelem_1.text = target_hs # 海面 subelem_1 = ET.SubElement(elem_2, 'i8') subelem_1.text = target_hs2 subelem_1 = ET.SubElement(elem_2, 'CDATA') subelem_1.text = '' # subelem_1 = ET.SubElement(elem_2, 'i8') subelem_1.text = target_grad # 勾配 subelem_1 = ET.SubElement(elem_2, 'id') subelem_1.text = '1' # subelem_1 = ET.SubElement(elem_2, 'strasse_t') subelem_2 = ET.SubElement(subelem_1, 'weg_t') subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = str(target_player_num) # owner? subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = str(connect_arg) # 接続方向 subelem_3 = ET.SubElement(subelem_2, 'i16') subelem_3.text = '0' # 速度 (ロード時 pakの情報に上書き) subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i32') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i32') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i32') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i32') subelem_3.text = '0' # subelem_2 = ET.SubElement(subelem_1, 'CDATA') subelem_2.text = target_way #'city_road' subelem_1 = ET.SubElement(elem_2, 'id') subelem_1.text = '-1' # subelem_1 = ET.SubElement(elem_2, 'i8') subelem_1.text = '0' # planquadrat.insert(count_ch-1, elem_1) planquadrat.insert(count_ch, elem_2) # 沈め planquadrat[1][0].text = target_hd planquadrat[1][1].text = target_hs # 接続方向 planquadrat[1][6][0][1].text = str(0) # 置き換え planquadrat[1][6][1].text = target_gut_way if (target_gut_way_type == 2) : planquadrat[1][5].text = '2' planquadrat[1][6].tag = 'schiene_t' if (target_gut_way_type == 3) : planquadrat[1][5].text = '3' planquadrat[1].insert(7, planquadrat[1][6][1]) planquadrat[1].insert(7, planquadrat[1][6][0]) planquadrat[1].remove(planquadrat[1][6]) count_p = count_p + 1 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) target_player_num = 1 target_gut_way = 'city_road' target_gut_way_type = 1 # 道路は、1 ※ただし、市道化される target_gut_way = 'green_fence2' target_gut_way_type = 2 # フェンスは、2 ※ただし、一括で消せない target_gut_way = 'wa-cs-pedway-ground' target_gut_way_type = 3 # ペデストリアンデッキは、3 dig_gut_under_way(root, target_player_num, target_gut_way, target_gut_way_type) 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()
Mac で フォルダ同士で差分比較する目的で TextWrangler を入れてみた
タイトル通りです.
Windowsでは、WinMargeをとりあえず使っています.すごい便利.
Macでも、フォルダ同士で差分比較したくなりました.
目下、Simutrans の他の方が作っていらっしゃるソースコードの、
どこが改造されているのかの確認です.
OTRPatch を覗いてみようとしているわけです.
調べて、色々入れてみたところ、TextWrangler に巡り合いました.
Macで文書ファイルやフォルダ構成などの差分比較(diff)にオススメなアプリ「TextWrangler」 - Blue Leaf
ようやく意図通り、サクッとフォルダ同士での差分比較ができました.
YouTube はじめました
YouTube はじめました
とりあえず、素敵な交通シミュレーション Simutrans の本体改造、
人工地盤プレイについてあげてみています
PythonでSimutransのマップに天空の市道の格子点にバス停を追加してみた
フリーの交通?シミュレーション
Simutrans(http://japanese.simutrans.com)が, 素晴らしい.
それでもって私は人工地盤っぽいことをやっています。
Simutransで人工地盤してみる - shingoushori's dialy
大規模な都市開発をさっさとやるべく、Pythonでセーブデータをいじっています
先日、↓道路の格子を特定階層に構築するのをやりました。
PythonでSimutransのマップに天空の市道の碁盤の目を追加してみた - shingoushori's dialy
今回は、その道路の格子点にバス停を追加してみました。
↓こんな感じです↓
Pythonによるセーブデータいじり 格子の道路+格子点にバス停を 多層、地下、バス停名(とりあえず座標値) ができた ... セーブデータがひらけない条件がありそうで釈然としないけれども #Simutrans pic.twitter.com/26OeR39bpi
— shingoushori (@shingoushori) 2017年9月20日
恐ろしいことに、道路とバス停の方向が別にあっていなくてもバス停を置けそうです。セーブデータをいじる限りは
交差点や曲がり角でも、まぁ、置けそうです。恐ろしや
shingoushori on Twitter: "セーブデータをいじっていたところ、バス停の道路を交差点にできた、一応 #simutrans https://t.co/OxuT7w6V3c"
プレイしていくうちに、エラーが出そうで怖いです
いやその前に、特定の向きのバス停を特定の方向に接続されている道路に追加したところセーブデータの読み込みに失敗することもありました
それが、何度もPythonスクリプトを走らせていたら安定してきたような、とても不安です
ですから、交差点や曲がり角には、やはり置くべ機ではないでしょう
↓私ならば、こんな感じでバス停の向きに道路の向きを揃えてしまいます↓
PythonでSimutransの特定の行と列の格子点にある特定の種類の道路の接続方向を揃えてみた - shingoushori's dialy
とりあえず、成功することもあるんだ ぐらいのメモです
バス停の追加では、これまでとの大きな違いがありました
1つ新規で追加するときにセーブデータ上で追加する箇所が2箇所でした
・各座標のところにpakを登録
・一意なバス停番号付きでバス停情報?を追加
後者はなくても大丈夫かも?全くもって、よくわかりません
↓サンプルコードです。
↓※絶対に元のデータを上書きしないでください。
↓※データや設定が破壊されても、責任は一切負えません。
↓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 = 'testout_elv_road.sve' filename_out = 'testresult.sve' # 格子状に道路を敷く def structline_create_constF(root, N_x, N_y, pitch_x, pitch_y, target_h, target_way): 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 % pitch_x == 0) or (count_y % pitch_y == 0): count_ch = len(planquadrat.getchildren()) # 1:toN, 2:toE, 4:toS, 8:toW connect_arg = 0 if (count_x % pitch_x == 0): connect_arg = connect_arg + 1 + 4 if (count_y % pitch_y == 0): connect_arg = connect_arg + 2 + 8 if (count_x == 0): connect_arg = connect_arg & (15 - 8) if (count_x == N_x-1): connect_arg = connect_arg & (15 - 2) if (count_y == 0): connect_arg = connect_arg & (15 - 1) if (count_y == N_x-1): connect_arg = connect_arg & (15 - 4) print str(count_x) + " " + str(count_y) + " " + str(connect_arg) elem_1 = ET.Element('id') elem_1.text = '6' elem_2 = ET.Element('grund_t') subelem_1 = ET.SubElement(elem_2, 'i8') subelem_1.text = str(target_h) #'10' # 高度 subelem_1 = ET.SubElement(elem_2, 'i8') subelem_1.text = '-6' # subelem_1 = ET.SubElement(elem_2, 'i8') subelem_1.text = '4' # subelem_1 = ET.SubElement(elem_2, 'CDATA') subelem_1.text = '' # subelem_1 = ET.SubElement(elem_2, 'i8') subelem_1.text = '0' # subelem_1 = ET.SubElement(elem_2, 'id') subelem_1.text = '1' # subelem_1 = ET.SubElement(elem_2, 'strasse_t') subelem_2 = ET.SubElement(subelem_1, 'weg_t') subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = '15' # owner? subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = str(connect_arg) # 接続方向 subelem_3 = ET.SubElement(subelem_2, 'i16') subelem_3.text = '0' # 速度 (ロード時 pakの情報に上書き) subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i32') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i32') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i32') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i32') subelem_3.text = '0' # subelem_2 = ET.SubElement(subelem_1, 'CDATA') subelem_2.text = target_way #'city_road' subelem_1 = ET.SubElement(elem_2, 'id') subelem_1.text = '-1' # subelem_1 = ET.SubElement(elem_2, 'i8') subelem_1.text = '0' # planquadrat.insert(count_ch-1, elem_1) planquadrat.insert(count_ch, elem_2) count_p = count_p + 1 # バス停を格子点に作る def create_haltestelle_structline_constF(root, N_x, N_y, pitch_x, pitch_y, target_h): 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 % pitch_x == 0) and (count_y % pitch_y == 0): create_haltestelle(root, N_x, N_y, count_x, count_y, target_h, '('+str(count_x)+','+str(count_y)+')') #create_haltestelle(root, N_x, N_y, count_x, count_y, target_h, str(count_x)) count_p = count_p + 1 # バス停を作る def create_haltestelle(root, N_x, N_y, target_x, target_y, target_h, target_str): # get バス停の数 n_haltestelleNum = 0 while (root[n_haltestelleNum].tag != 'haltestelle_t'): n_haltestelleNum = n_haltestelleNum + 1 n_haltestelleNum = n_haltestelleNum - 1 haltestelleNum = int(root[n_haltestelleNum].text) #print str(haltestelleNum) # バス停 haltestelleNum = haltestelleNum + 1 root[n_haltestelleNum].text = str(haltestelleNum) subelem_1 = ET.Element('haltestelle_t') subelem_2 = ET.SubElement(subelem_1, 'i16') subelem_2.text = str(haltestelleNum) # 番号 subelem_2 = ET.SubElement(subelem_1, 'i32') subelem_2.text = str(1) # owner subelem_2 = ET.SubElement(subelem_1, 'koord3d') subelem_3 = ET.SubElement(subelem_2, 'i16') subelem_3.text = str(target_x) # 座標 x subelem_3 = ET.SubElement(subelem_2, 'i16') subelem_3.text = str(target_y) # 座標 y subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = str(target_h) # 標高 y subelem_2 = ET.SubElement(subelem_1, 'koord3d') subelem_3 = ET.SubElement(subelem_2, 'i16') subelem_3.text = str(-1) # subelem_3 = ET.SubElement(subelem_2, 'i16') subelem_3.text = str(-1) # subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = str(-1) # subelem_2 = ET.SubElement(subelem_1, 'CDATA') subelem_2.text = '' # n_i64 = 0 for n_i64 in range(96): subelem_2 = ET.SubElement(subelem_1, 'i64') subelem_2.text = str(0) # root.insert(n_haltestelleNum + 1, subelem_1) subelem_0 = ET.Element('id') subelem_0.text = '7' # subelem_1 = ET.Element('gebaeude_t') subelem_2 = ET.SubElement(subelem_1, 'obj_t') subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = '1' # owner? subelem_2 = ET.SubElement(subelem_1, 'CDATA') subelem_2.text = 'wa-road-busstop-3' # subelem_2 = ET.SubElement(subelem_1, 'i16') subelem_2.text = '0' # 向き 0 : 南北, 1 : 東西 subelem_2 = ET.SubElement(subelem_1, 'i32') subelem_2.text = '0' # 向き? 揃える必要あり? subelem_2 = ET.SubElement(subelem_1, 'i32') subelem_2.text = '-1' # target_p = target_x + target_y * N_x count_p = 0 count_x = 0 count_y = 0 planquadrat_iter = root.iter('planquadrat_t') target_planquadrat = list(planquadrat_iter)[target_p] # マーカー #target_planquadrat[1][3].text='('+ str(target_x) +','+ str(target_y) +')' grund_iter = target_planquadrat.iter('grund_t') for grund in grund_iter: if (grund[0].text == str(target_h)): # 狙いの高度のgrundを発見 if (grund[5].text == str(1)): # 道路あり grund[3].text = target_str # CDATA grund[8].text = str(int(grund[8].text)+1) grund.insert(9, subelem_0) grund.insert(10, subelem_1) 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) pitch_x = 4 pitch_y = 4 target_h = 10 target_way = 'city_road' structline_create_constF(root, N_x, N_y, pitch_x, pitch_y, target_h, target_way) target_h = 5 structline_create_constF(root, N_x, N_y, pitch_x, pitch_y, target_h, target_way) create_haltestelle_structline_constF(root, N_x, N_y, pitch_x, pitch_y, target_h) pitch_x = 5 pitch_y = 5 target_h = -1 structline_create_constF(root, N_x, N_y, pitch_x, pitch_y, target_h, target_way) create_haltestelle_structline_constF(root, N_x, N_y, pitch_x, pitch_y, target_h) 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()
PythonでSimutransのマップに空き地に道路を格子で敷いてみた
Simutrans(http://japanese.simutrans.com)は, 素晴らしい.
セーブデータをxmlにできるので、乱開発したい気持ちとPythonの練習を高ぶらせられて幸せです.
今回は、乱開発のために市街を広げさせて交通需要を増やすための布石です.
それなりにちゃんと地上に道路を敷きます.
前回、天空に市道を敷いてみました.
しかし、地上は市街化しませんでした.
PythonでSimutransのマップに天空の市道の碁盤の目を追加してみた - shingoushori's dialy
従って、面倒だけれども、地上に道路を敷きます...
空き地に道路を格子で敷くPythonスクリプトを書いたが、惜しい 坂道を絞るのと 隣接する市道との接続 接続していないと、大方繋がらないまま市道化されてしまった #simutrans pic.twitter.com/pK9Hm7mgDn
— shingoushori (@shingoushori) 2017年9月17日
地上に道路を敷く上で今回考慮した面倒な要素を列挙します
・木 -> 削除
・役場 -> 残す
・その他建物 -> 残す
・坂 -> 残す
・坂道 -> 東西, 南北 方向は、その方向に敷設
ただし, 格子の方向に双方に限る
格子点が 東西, 南北 方向であれば敷設
さあ、それでもとりあえず残るのが 隣接する市道との接続
接続していないと、大方繋がらないまま市道化されてしまいました.
これを解決しようにも、現行のPythonのxmlパーサで 1次元でイテレータを回しているやり方だと、接続方向について検索するのが厳しいです ...
先は長い ...
↓サンプルコードです。
↓※絶対に元のデータを上書きしないでください。
↓※データや設定が破壊されても、責任は一切負えません。
↓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 pitch_x = 3 pitch_y = 3 for planquadrat in root.iter('planquadrat_t'): count_x = count_p % N_x count_y = count_p / N_x if (count_x % pitch_x == 0) or (count_y % pitch_y == 0): if (planquadrat[1][5].text == '-1') and (planquadrat[0].text == '1'): # 道路なし # # 建物なし if ((planquadrat[1][4].text == '0') \ or ((planquadrat[1][4].text == '28') and (((count_x % pitch_x != 0) and (count_y % pitch_y == 0)) or ((count_x % pitch_x == 0) and (count_y % pitch_y == 0))) ) \ or ((planquadrat[1][4].text == '36') and (((count_x % pitch_x == 0) and (count_y % pitch_y != 0)) or ((count_x % pitch_x == 0) and (count_y % pitch_y == 0))) ) ): # 0 : 平地 # 28 : 東西 # 36 : 南北 # 木などを除去 count_ch = len(list(planquadrat[1])) for num in range(count_ch, 6, -1): planquadrat[1].remove(planquadrat[1][num-1]) # 補正 subelem_1 = ET.SubElement(planquadrat[1], 'id') subelem_1.text = '-1' # subelem_1 = ET.SubElement(planquadrat[1], 'i8') subelem_1.text = '0' # # 1:toN, 2:toE, 4:toS, 8:toW connect_arg = 0 if (count_x % pitch_x == 0): connect_arg = connect_arg + 1 + 4 if (count_y % pitch_y == 0): connect_arg = connect_arg + 2 + 8 if (count_x == 0): connect_arg = connect_arg & (15 - 8) if (count_x == N_x-1): connect_arg = connect_arg & (15 - 2) if (count_y == 0): connect_arg = connect_arg & (15 - 1) if (count_y == N_x-1): connect_arg = connect_arg & (15 - 4) planquadrat[1][5].text ='1' subelem_1 = ET.Element('strasse_t') subelem_2 = ET.SubElement(subelem_1, 'weg_t') subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = '15' # owner? subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = str(connect_arg) # 接続方向 subelem_3 = ET.SubElement(subelem_2, 'i16') subelem_3.text = '0' # 速度 (ロード時 pakの情報に上書き) subelem_3 = ET.SubElement(subelem_2, 'i8') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i32') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i32') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i32') subelem_3.text = '0' # subelem_3 = ET.SubElement(subelem_2, 'i32') subelem_3.text = '0' # subelem_2 = ET.SubElement(subelem_1, 'CDATA') subelem_2.text = 'dirt_road' #'city_road' planquadrat[1].insert(6, subelem_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()