Skip to content

Built Hometown

故郷が無くなっていたので、ローカルに建てた。

戻ろうとしたMMOの話を、前に書いた。その続きだ。世界は跡形もなかった。だから自分で建てた。

オープンソースのサーバー実装が公開されていた。月額制、永遠のグラインド、一晩の進捗を一瞬で消すPK。当時のバランスのまま動くものだ。Javaで書かれていた。日本語は無かった。

ソースは綺麗で、メジャーアップデートごとに整理されていた。開発に莫大な時間がかかっていることが伺えた。

クライアントは正規DVDをオークションで入手した。もう動くはずもないのに、ひどいプレミア価格だった。

Rooからclaude codeに乗り換えた頃だった。サブスクのプランが出て、膨大な量の翻訳作業がAPI料金を払うことなく回せると分かって、すぐ着手した。ローカライズのパッチを書き始めた。

LLMには手を焼いた。テキストを投げると壊れたXMLが返ってくる。タグが閉じない。句点が全角になる。固有名詞の表記がチャンクごとに揺れる。同じNPCの口調が、ファイルが変わると別人になる。プロンプトを書き直す。少し直る。違う場所が壊れる。

いま思えばMCPを使えばよかった。当時はノウハウが無く、ガードレールは自前で組むしかなかった。

数万のファイルがあった。前段に対訳辞書を置いた。日本語版クライアントのライブラリからゲーム内の固有名詞を引き抜き、正規の表記に固定した。

全ファイルを一度DBに放り込んだ。CLIで next を叩くと未処理の塊が一つ返り、終わったらCLIで戻す。並列に走らせる。返ってきたものはHTMLコメントを placeholder で退避してから補正をかけ、最後に戻す。指示書を分けて入出力の形を契約として固定する。

support/ の中に試行錯誤の塊が四つ、誰にも見せられない泥の山として残った。

数週間の格闘の末、作業は終わった。

ようやく、思い出の世界を歩けた。世界は静かで、景色はあのときのままだった。あのときの賑やかさも喧噪もない。

今になって思い返してみると、いまの自分の開発手法と、あの泥の山が同じ形をしている。

LLMの出力を信用せず後段で確定する。スキーマを契約として固定する。エージェントの返答にバリデータを噛ませる。長いコンテキストをチャンクに切って段階的に処理する。DBを多重処理のキューに使う。Excelとビット単位で揃えるオラクル検証も、認証ライブラリの境界設計も、タスクシステムのMCP統合も、根はぜんぶ、故郷の言葉を整えるために手探りで作ったものだった。

Javaから初めてなにかを学んだ。いや、Javaではないか。