simutransとdiscordを連携させるシステムです.simutrans OTRP v29_5以降 が必要です.
pythonプログラムとSquirrel AI Playerから成り立っています.pythonプログラムはDiscordからの入力をテキストファイルに書き出し,Squirrel側でそれを読んで処理を行う仕組みです.
CLIの使用を前提とします.
- Python3(3.8以降が必要)とpipを導入し,
pip install -r python/requirements.txt
でライブラリを導入します. - DiscordでBOTアカウントを作成し,BOTをサーバーに招待します.
参考: https://discordpy.readthedocs.io/ja/latest/discord.html - DiscordのBOT設定ページで、BOTに対して"Message Content"インテントを付与します.
参考: https://discordpy.readthedocs.io/ja/latest/intents.html#privileged-intents python/config.template.py
をコピーしてpython/config.py
を作成し,BOTのアクセストークン,メッセージをやり取りするテキストチャンネルのID(Discordで確認できます),Simutransの動作ディレクトリを記入します.UTF-8を扱えるエディタで編集してください.sqai_hm_monitor
ディレクトリを,Simutransの動作ディレクトリ下のai
ディレクトリにコピーします.
- Pythonプログラムを起動します.
python
ディレクトリに移動した上で,python monitor.py
を実行します. このとき,Simutrans動作ディレクトリにfile_io
ディレクトリが作成され,ファイルが配置されます.正常に起動すると,Discordの指定したチャンネルに,おはようさん.?をつけてなんでもいうてな.
というメッセージが送信されます. - Simutransを起動し,AIプレイヤーを追加します.Scripted AI'sを選択し,左側の有効化ボタンを押します.スクリプトは
sqai_hm_monitor
を選択してください.
Simutrans本体より先にPythonプログラムを起動するようにしてください.
Discordの指定したチャンネルにコマンドを投げることで情報を取り出せます.
config.nut で各機能のON/OFFなどを切り替えできます.
書式: ?待機,<駅名>,エントリ数
例:?待機,東京駅,3
応答例:
東京駅の待機客は 51人/1216人 やね.
21人 ... 座間駅
19人 ... 山科駅
8人 ... 松本駅
指定された停車場の待機客およびその行き先を返します.エントリ数は省略可能で,デフォルト値は5です.省略形のコマンドは ?待機,<駅名>
です.
書式:?プレイヤー
ゲームに参加しているプレイヤー一覧と,その番号を返します.ここで返される番号は,プレイヤーを指定するコマンドで使用します.
書式:?赤棒,<プレイヤー番号>
例:?赤棒,1
応答例:
こく☆てつ の赤棒駅はこれや!
上平塚駅 ... 507/480人
内子西停 ... 72/64人
指定したプレイヤーに所属する停車場で,いわゆる赤棒が立っている駅とその待機客を返します.
書式: ?時間
現在の年と月を返します.
書式:?財務
各社の現在の残金を返します.
書式: ?路線,<プレイヤー番号>,<waytype (option)>
例:?路線,5
、?路線,10,r
応答例:
プレイヤー会社 の路線一覧(計 138 路線)
1 : (1) 路線
2 : (2) 路線
3 : (3) 路線
4 : 江差本線 普通 江差~小勢
指定したプレイヤーの路線番号と路線名を一覧で返します.
オプションとして、表示するwaytypeを指定できます。waytypeは以下の文字で指定します。
s
... 自動車(wt_road)r
... 鉄道(wt_rail)w
... 船(wt_water)m
... モノレール(wt_monorail)g
... マグレブ(wt_maglev)n
... ナローゲージ(wt_narrowgauge)a
... 航空(wt_air)
書式: ?停車駅,<路線番号>
例:?停車駅,4
応答例:
江差本線 普通 江差~小勢 (プレイヤー会社)はこんな感じにとまるで!
江差駅
市東駅
羽衣町駅 (久野)
鳥羽街道駅 (坂梨)
指定した路線のスケジュール上にある停車駅を順番に返します.その路線が原因で混雑している駅は太字で表示されます。
3つ目のパラメタを指定すると,路線上にある駅を利用者順でソートして返します.
書式: ?停車駅,<路線番号>,<停車場数>
例:?停車駅,4,3
応答例:
江差本線 普通 江差~小勢 (プレイヤー会社)が止まる駅で繁盛しとるんはこのへんや!
2,5564 人 ... 江差駅
1,9037 人 ... 小勢 修道院前 駅
2513 人 ... 市東駅
ちなみに利用者数は前の月やで.
ここで,利用者とは前月の「到着」と「出発」の和です.
待機客が定員オーバーの駅が発生すると,通知します.
config.nut
のパラメーター:chk_overcrowded_cmd(頻度, 割合, 最低待機数))
- 頻度 ... 月あたり何回このチェックを行うか.
- 割合 ... 駅の定員に対して何倍の客が溜まったときに通知を行うか.
- 最低待機数 ... 通知を行う待機客の最低値.
路線に所属する編成で,積載中ではない停止が多数発生したときに通知します.
config.nut
のパラメーター:chk_stucked_cmd(頻度, 割合))
- 頻度 ... 月あたり何回このチェックを行うか.
- 割合 ... 路線に所属する編成のうち,どれだけの割合が停止状態になったときに通知を行うか.
コマンドや常時監視タスクはかんたんに追加できるようになっています.
くわしくは, modification_guide.mdをご覧ください.
気が向いたら.アイデアください.
https://github.com/teamhimeh/simutrans_world_monitor
MITライセンスです.