*OTRPの開発に挑戦してみた話*
- 深沼悠花

- 4 日前
- 読了時間: 5分
Simutrans Advent Calendar 2025 の連動記事です。
OTRP開発に挑戦してみたので、そのときの話を。
今回の記事は時間不足で画像ナシです。あと投稿遅刻です。ごめんなさい。
謝辞:介護に付き合ってくださったsimu_poppo先生、ありがとうございます。
1.はじまり
2.要件定義
3.環境構築で手詰まり連発
4.とりあえずやってみよう!
5.VSCode最強説?
6.仕様と最適化の争い
7.感想戦
*1.はじまり*
市内建築ツールには複数選択によるランダム建築機能があり、OTRPでも本家版でも同じ機能が搭載されています。
ローカル環境ではよいのですが、NetSimutrans環境では、仕様からくる不具合がありました。
仕様上通信のサイズに上限があり、選択したときにアドオン名によっては途中で選択キューがカットされます。
これによって一部の選択された建物が建設されないという仕様がありました。(おおよそ9種~11種程度が上限)
NetSimutransで全手動建設をすることが多い私のプレイスタイルでは、この仕様にはなかなか苛立ちがありました。
違う建物を出すために、建築物をすべて毎回選びなおす必要があったのです。
この仕様をなんとかしたい!と思い、本体開発に挑戦することにしました。
*2.要件定義*
プログラミングには要件定義が必要です。
現行コードも読まず、なんとなく現行仕様を推定してみて、それをもとに原案を考えました。
現行仕様
①選択によって送信キューにアドオン名が入る
②ツール、範囲+アドオン名が飛ぶ前にパケットからあふれる分はカットされる
改善方向性(原案)
・パケットがあふれるなら全部1個ずつの設置として送ればいいじゃない!
もちろん原案と書いてある通り、コードを作って行く中で仕様との格闘技が始まり、結果としては妥協妥協を繰り返し全く違うものができるのですが、それはあとのはなし。
*3.環境構築で手詰まり連発*
まぁまずはビルド環境を作ろうや!ということでこちらのひめし先生のサイトを参照しました。
なんと、コーディングよりこちらのほうがはるかに難易度が高かった!
まずインストールで詰まる詰まる。
msysの32bit版がスタートメニューに生成されず、インストールフォルダから手動で叩いたり……
パッケージが入っておらず、エラーを読んでは不足パッケージを推測、困ったときはAIに聞き、インストール作業を繰り返し……
もっとも詰まったのはminiupnpcに関連するエラーでした。
何も考えずに最新版をインストールしたところコンパイルエラーでsim.exeが生成されず。
小一時間調べ倒し、たどり着いたのはこちらのフォーラム投稿でした。
『2.2.7じゃないとむりだよ!』
先に言え!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
ともあれ、こうしてSim.exeのコンパイルに成功しました。一歩前進です。
*4.とりあえずやってみよう!*
深く考えず、GithubでOTRPのforkを作成。
それからいろいろなソースコードを読みながら、先のサイトを資料として、simu_poppo先生にもいろいろ伺いながらコードを捜索。
捜索の過程でさまざまな仕様を理解し、そして改善の方向性を変更していくことになりますが、これはのちほど。
正直、有識者の助力がないと、「変更したいコード」を捜索し、挙動を理解するのはかなり難しかったです。
ここらへんは「とりあえずやってみよう!」の精神と一番遠い部分にあると思いました。
Discordの交流会議鯖がなければたぶん途中でぶん投げていたような気がしています。交流会議鯖の存在にも感謝です。
*5.VSCodeをつかえ!
最初は阿呆なのでGithubから直接いじるという沼プをしていました。
おかげでファイル名から内容を推測し、しらみつぶしに探すという非効率なことをしていました。
そこにsimu_poppo先生に”VSCode”というソフトの存在をご教示頂き、速攻インストール!
知らなかったというのは単純に私の無知です。これまでテキストエディタはすべてメモ帳で済ませていたため、認知の必要がなかったという感じで。情けない話です。
ともあれ、これでフォルダ内の特定文字列を簡単に捜索できるようになり、挙動特定までの時間がある程度短縮できました。
*6.仕様との狭間
最初から想定通りに行くわけないよね、というお話です。
案の定というかお決まりですが、想定と実態が違うことはよくあることです。
現行版(改善前)の実際の仕様は以下の通りです。
*少し違うかも。参考程度に
①選択された建物を配列から取得
②それを順次サーバーに送るパケットに押し込む
③マウスを離してパケットを範囲情報→建物情報の順で送信
④(パケット上限からあふれた分は送れない)
③の処理が別の部分で行われており、初期構想をそのまま実現するのはかなり面倒そうだったため方針変更することにしました。
・パケットに押し込む順番を変えればいいのでは?
これ自体は直接的な解決策ではありませんし、初期構想からは大きく離れています。
そもそもの課題は「手植えするときに建物毎回1から選びなおすのがだるい」でした。
ならば、「毎回配置対象を変えればいいのでは?」という発想の転換です。
というわけでこの方針で作業を再開。
途中、「ランダム数値生成何使う?」の問題にぶちあたりましたが、なんとか形にできました。
記事執筆時点ではプルダウンリクエスト(これでとりあえず見て)で確認待ちです。V48あたりで統合されると思います。
*7.感想戦
「思ったより大変だな」と「思ったより簡単だな」という逆の感情が入り混じっています。
わかれば簡単なのですが、わかるまでがとっても難しいなどいう感想を抱きました。
先鞭をつけてくださった方々には頭が上がりません。
また実装したい機能とかがあったら、そのときは挑戦してみようと思います。


コメント