Simutransのアドオンを自然言語で検索するためのスキルとツールのセット。
pakファイルをSQLiteのインデックスに変換し、AIエージェントがそれを自律的に検索します。「旅客を100人以上積載できて電化不要な車両のうち最も安いもの」のように、自然言語によって必要なアドオンを検索することができます。
- Python 3.10 以降(標準ライブラリのみ。追加パッケージのインストールは不要です)
- Claude Code
Python 同梱の SQLite が 3.34 以降だと、全文検索インデックスが作られます。それより古い場合でも LIKE による検索は問題なく動きます。
検索内容にもよりますが、LLMモデルはhaikuでも問題なく動作するようです。
Claude Code 以外のAIエージェントでも動作するはずです(未検証)。
-
targetディレクトリに、検索対象となる*.pakファイルを配置する。 -
target/textディレクトリに、日本語化ファイルを配置する。(任意) -
インデックスを構築する。
python tools/index_pak.py
pakファイルを差し替えたら
--forceを付けて再構築してください。 -
Claude Code に日本語で質問する。
旅客を100人以上積載可能で、100km/h以上出せて、電化を必要としない車両の中で 最もコストが低い車両を探してskillが自動で起動し、SQLを組み立てて回答します。
※動作未検証ですが、
.claudeディレクトリの名称を.agentsに変更すれば、Claude Code 以外でも動作するはずです。
インデックスに直接SQLを投げることもできます。
python tools/query.py "SELECT name, name_ja, topspeed FROM v_vehicles
WHERE is_current=1 AND waytype_name='track'
ORDER BY topspeed DESC LIMIT 10"
python tools/query.py --schema # スキーマを表示
python tools/query.py --catalog # 貨物・産業などの一覧を表示SELECT と WITH のみ受け付け、データベースは読み取り専用で開きます。
- 車両 — 積載量、最高速度、出力、重量、コスト、運行費、ギア比、登場/引退年、 動力方式、走行路線、積載貨物、連結制限
- 産業 — 入出力貨物の連鎖、生産量、電力供給の有無、立地条件
- 貨物 — カテゴリ、価値、重量、速度ボーナス、互換性(同じ貨車で運べるか)
- 軌道・架線・橋・トンネル・信号・踏切 — 速度制限、建設費、維持費、軸重
- 建物 — 種別、レベル、サイズ、旅客/郵便/貨物の取扱、気候条件、駅の路線種別
| パス | 内容 |
|---|---|
.claude/skills/simutrans-pak-search/ |
スキル本体。SKILL.md と reference/ の4文書 |
tools/pakfmt/ |
pakバイナリのパーサ |
tools/index_pak.py |
インデックス構築 |
tools/query.py |
読み取り専用SQL実行 |
target/ |
検索対象のpakと日本語化ファイル |
index/ |
生成物(SQLiteとカタログ)。gitignore対象 |
日本語化ファイルを置かない場合、name_ja は空になり、Passagiere のような内部名だけで検索することになります。
Simutrans標準系(OTRPフォークを含む)のpakを想定しています。 車両はフォーマットバージョン0〜13に対応しました。
Simutrans Extended のpakは検出してフラグを立てますが、スペックは読みません。同じバージョン番号でもフィールドの配置が異なるため、標準系のレイアウトで読むと誤った数値を出してしまうためです。
Simutransでは、慣習的に運河(water)を装飾用の枠として使うことがあります。運河は床や歩道、運河架線は壁や窓、運河信号が街灯や樹木、運河港は1x1のブロックとして扱われ、これらを積み上げて建物を作る手法が「箱積み駅舎」と呼ばれています。
そのため、建物の装飾パーツを探すときに buildings テーブルだけを見ると大半を取りこぼします。逆に「運河」で検索すると屋上やフェンスが返ります。
この慣習と検索方法は reference/pak128japan-conventions.md にまとめてあります。
「黄色い駅舎」のような、見た目での検索には対応していません。今後の課題とします。
金額はセント(1/100クレジット)、日付は 年*12 + (月-1) の月数、
ギア比は64倍、車両長は1/16タイル単位です。
車両重量はフォーマットバージョンによって元データがトンとkgに分かれるため、
インデックス側でkgに統一しています。
詳細は
reference/units.md
を参照してください。
MIT License — 詳細は LICENSE を参照してください。
pakフォーマットのデコード処理は、Simutransのソースコード(descriptor/reader/*.cc、Artistic License)を読んで書き起こしたものです。
本リポジトリにSimutransのコードそのものは含んでいません。
- Twitter: @Kasumitrans
- Misskey: @cupmen@misskey.kasu.me