AIが働くのを眺めるのが好きすぎて、ターミナルをRPGにした話

はじめに
俺は、動くものが勝手に進むのを眺めるのが好きだ。工場のラインでも、シミュレーションでも、放っておいても何かが動き続けてるやつ。ずっと見ていられる。
AIが働いてるのも、それと同じで好きだ。Claude Code や Codex が、次々とツールを叩いて作業を進めていく様子は、見てて飽きない。
ただ、限度はある。ターミナルのログが延々スクロールするのを眺め続けるのは、さすがに地味だ。
そこで、待ち時間を少しだけ面白くできないかと思って作った。普段は真面目なものばかり作ってるので、たまにはこういう、完全に無意味なやつを。
作ったのは rpgdev。Macの画面の隅で、AIがコードを書いてる間ずっと、小さなRPGが勝手に進む。自分では操作しない。コードを書いてると、横で勇者が冒険してる。それだけ。
npm にあって、Mac専用。先に言っておくと、くだらない。でも面白い。使ってみてくれ(笑)。
第1章:何が起きるのか
仕組みはこうだ。AIがツールを1回使うたびに、一定確率で敵が湧く。出れば戦闘。勇者が技を出して倒す。
技名は、使ったツールの名前そのままだ。Bash を使えば「Bash」、パッチを当てれば「ApplyPatch」。AIが今まさに叩いてるツールが、そのまま必殺技の名前として画面に出る。
AIが作る TODO リストは、そのままクエスト一覧になって画面の上に並ぶ。未着手・進行中・達成が、ちゃんとアイコンで切り替わる。
舞台も進む。作業が進むほど、草原 → 洞窟 → 城、と奥に入っていく。背景もBGMも切り替わる。
AIがサブの作業役(サブエージェント)を立てると、精霊が仲間として参戦してくる。火・地・風・水の4属性。勇者の攻撃のあとに追撃してくれる。
背景もBGMも効果音もドット絵も、全部自作だ。BGMは「草原・洞窟・城」×「探索・戦闘」で7曲ある。城のBGMはちゃんと荘厳な行進曲にした。誰も気づかないだろうけど。
要するに、自分のAIコーディングが、そのまま勝手にRPGの戦闘ログになる。眺めてるだけで、勝手に進む。
第2章:最初は「エラー=モンスター」だった
最初に思いついた案は、もっと素直だった。AIがエラーを出したらモンスターが湧く。 失敗が敵で、直すのが討伐。意味が通ってて、きれいだろ。
問題は「失敗かどうか」をどう見分けるかだ。手っ取り早く、ツールの出力に error っていう単語が入ってたら失敗、ということにした。
これが盛大に滑った。
ただ成功しただけのファイル読み込みや検索が、出力に “error” の文字を含んでるだけで片っ端からモンスター化する。実際に自分のログを数えたら、戦闘の4分の1が偽物の敵だった。
しかも皮肉なことに、作ってるソフト自体がエラー処理の話だらけで、error という単語まみれだ。開発すればするほど、偽物の敵が湧く。 自分の書いたコードに殴られてる気分だった。
単語で失敗を見分けるのは信用できない、と判断して、この方式は捨てた。今は「ツールを使うたびに一定確率で敵が出る」、ただのランダムエンカウントにしてある。RPGなんだから、それで十分だ。
ちなみに相手は二人いる。Claude と Codex、両方で動かしたかったので、両方に存在する通知だけで作る縛りにした。余談だが、Codex はツールが失敗したことすら外に教えてくれない仕様だった。だから Codex 側では、敵は反撃してこない。平和だ。
第3章:本当に苦労したのは、コードじゃなく絵だった
正直に言うと、ここまでの仕組みはそんなに大変じゃない。一番手こずったのは、画像だ。
ドット絵のキャラをAIに描かせる。これ自体はいい。難所は「同じキャラの差分」だった。傷ついた版、別の向き、待機ポーズと戦闘ポーズ。同じ見た目を保ったまま、一箇所だけ変えたい。
これがAI画像生成の、一番苦手とするところだ。「このキャラのまま、ここだけ変えて」と文章で頼んでも、相手は全部を描き直す自由を持ってる。だから毎回、微妙に別人になる。輪郭が細くなる。気づいたら、ドット絵じゃなく高解像度のイラストになってる。
最終的にこれを片付けたのは、Codex の内蔵の画像生成ツールだった。元の絵を土台として渡して、編集させる。プロンプトには毎回「レトロなドット絵・限られた色数・太い輪郭」みたいな固定の呪文を必ず入れる。出てきた絵は背景を機械的に抜いて、表示位置はピクセル単位で元の絵と突き合わせて合わせる。
リポジトリには、その過程で溜まった禁止リストが残ってる。「手で描き足すな、気に入らなければ生成し直せ」「この背景色はキャラと色がぶつかるから使うな」みたいなやつ。苦労の化石だ。でも、おかげで火・地・風・水の4体の、ドットの粒度がやっと揃った。
第4章:「ちゃんとやろう」として作った自作ツールは、空振りだった
実はもう一個、回り道をしている。
毎回手で呪文を唱えて位置を合わせるのは面倒だ。だから、ローカルで効率よく差分を量産する専用ツールを別に作った。キャラを「髪」「衣装」「武器」みたいなパーツの木に分解して、パーツ単位でプロンプトを管理して、状態を切り替えて再生成する——という、それなりに凝ったやつだ。
これが、全然ダメだった。
一貫性を出すための肝心な部分を動かすには、手元のグラフィックボード(メモリ16GB)では本命のモデルが回らない。無理やり動かしても精度が出ず、出てくる絵は使い物にならなかった。
結局、凝った自作ツールがこけて、ありものの内蔵ツールが普通に勝った。まあ、よくある話だ。
ローカル路線はちゃんと試したいので、メモリの大きいグラフィックボード(32GBの方)を発注した。今は到着待ち。来たら、再戦する。
おわりに
そんなわけで、rpgdev。AIが働いてる横で、小さな冒険が勝手に進む。敵を倒しても何ももらえないし、城まで辿り着いても何も起きない。完全に無意味だ。
リポジトリは github.com/kitepon-rgb/rpgdev。npm install -g rpgdev で入る。今はMac専用だけど、WindowsとWSL2への対応も進めてる。
くだらない。でも、コードを書いてる横で勇者が勝手に戦ってるのは、思ったより悪くない。使ってみてくれ(笑)。