shingoushori's dialy

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

Simutransのセーブデータ (非圧縮xml のみ) の路線情報を編集してみた ~ 路線番号を各社ごとの数字に振り直し

[趣旨]
Simutransのセーブデータ弄りであるとか、もちろん信号処理のなにやらづくりに向けて、デスクトップからファイルをドラッグする処理 〜 を準備します。

 

今回は、Simutransのセーブデータ (非圧縮xml のみ) をパースしてエディットして、また書き出しです。

路線情報を悪戯してみます。路線番号を各社ごとの数字に振り直します。
Simutrans本体にて新規路線を作ると、全社跨いで通しの数字が振られているようです。
そんな数字を、各社ごとでの通しの数字に置き換えます。[路線編集]ウィンドウで見た時に、ちょっと気持ちいい。

↓ Simutransのセーブデータ (非圧縮xml のみ) をドラッグアンドドロップすると、「ダウンロード」と書かれたリンクが追加されます。"output.sve"としてダウンロードできるはず。開発環境は、macchrome

Drop files here

                                   

 

 

本記事は、やっていることの整理のための脱線です。元々検討していた内容が泥沼にハマり、ディスプレイ上で燻り続けているわけです。
それは、xml形式のセーブデータ弄りではなく、binary形式、binaryのbzip2圧縮した形式のセーブデータの読み込み/書き出しでした。これが全然できない上に、どうも泥臭く元々のソースコードを丸々JavaScriptに移植する羽目になりそうでした。
そのサイズともなると、はてなブログの記事に書くのが怖くなりました。GitHubの出番でしょう。
そんなわけで、できる範囲の中で価値がありそうなネタを捻り上げてみたのでした。

 

なお、苦労。
xml の "CDATA" っていうのが、xmlでも特殊でパーサーがパースしてくれない!!

というわけで、以下のような置き換えを行なっています。

[読み込み時]

    var xml = e.target.result;
    // CDATA対策
    xml = xml.replace(/<!\[CDATA\[/g,'')
    xml = xml.replace(/\]\]>/g,'')
    // XMLのDOMをパースする
    var parser = new DOMParser();
    var dom = parser.parseFromString(xml, 'text/xml');

[書き出し時]

    var xmlString = serializer.serializeToString(dom);
    xmlString = xmlString.replace("><", ">\n<");
    // CDATA対策
    xmlString = xmlString.replace(//g,'<!\[CDATA\[')
    xmlString = xmlString.replace(/<\/CDATA>/g,'\]\]>')
    xmlString = xmlString.replace(/<CDATA\/>/g,'<!\[CDATA\[\]\]>')

 

[参考文献]

クライアントサイドJavaScriptでXML文書のDOMをパースする

XML Parser

Blob - Web API インターフェイス | MDN

HTML非表示・使用不可メモ(Hishidama's disabled/visibility/display Memo)