RPG・ADV用ゲームエンジン(CLI・フレームワーク)であるgozenを公開

今まで仮組みしていた RPG・ADV・SLG の機能を nao1215/gozen として公開した。ebitengine の薄いラッパーである。ebitengine がエビ天から命名されているので、エビ天を拡張するものとして御膳とした。エビ天で御膳というと、蕎麦がついてくる印象がある。エビ天を最後に食べたのはいつだろうか。

RPG「Go Zen」ノベルゲーム「After the Pass」
Go Zenの町・ダンジョン・戦闘・会話のデモGo Zenの町・ダンジョン・戦闘・会話のデモAfter the Passの会話・選択肢・巻き戻し・スキップのデモAfter the Passの会話・選択肢・巻き戻し・スキップのデモ
SLG「Five Banners」
Five Bannersの戦争マップ、出撃画面、軍勢の衝突、王冠の色で示された地域のデモFive Bannersの戦争マップ、出撃画面、軍勢の衝突、王冠の色で示された地域のデモ

gozen は、ゲームエンジンというより、YAML で定義する RPG ツクールに近い。最近は、YAML で定義するのがマイブームだ(N 度目の主張)。LLM フレンドリーであり、デバッグ機能が豊富だ。例えば、自動プレイや戦闘シミュレーションの機能があり、勝率やフロア突破率をデータとしてチェックできる。プレイ中に「ここ、微妙だな」と感じた場面にメモを残せる。LLM にメモを監視させて、LLM が修正した YAML をホットリロードしてプレイを続けられる。現代的だ。

自分用のツールであるため、静止画でやりきれる範囲の機能だけ提供する。3D モデルだなんてとんでもない。ゲームエディタのような GUI を提供しておらず、エンジニアが LLM を介してゲーム開発しやすいように設計している。ユーザーが増えたら、GUI 提供を考え始めるだろう。避けたいのは、gozen の開発に夢中になることだ。完全に偏見だが、エンジニアはゲーム開発よりも、ゲームエンジン開発に熱心になってしまうケースが多いのではなかろうか。

基本的には、gozen はウィザードリィスタイルのダンジョン、戦闘(ドラクエ式、SLG 式)、会話イベントが作れるだけだ。上手に設計すれば、RPG・ADV・SLG の要素をブレンドしたゲームも作れる。サンプルのRPG、ADV、SLG は、ブラウザプレイできるように公開されている。WASM 万歳。モバイル対応もやれば出来る筈だが、そこまで試していない。

会話広場
表情が変わり、まばたきするキャラクターの会話画面表情が変わり、まばたきするキャラクターの会話画面広場を歩き、吹き出しで会話する場面広場を歩き、吹き出しで会話する場面
マップ一人称視点のダンジョン
井戸へ向かうパーティーのマップ画面井戸へ向かうパーティーのマップ画面一人称視点のダンジョン画面一人称視点のダンジョン画面
戦闘カットイン
ダメージ表示のあるボス戦ダメージ表示のあるボス戦オックスのシールドラッシュのカットインオックスのシールドラッシュのカットイン
ショップスキルツリー
ゲーム内ショップの商品一覧ゲーム内ショップの商品一覧インクバーストを選択したスキルツリーインクバーストを選択したスキルツリー
タイトル画面
Go Zenのタイトル画面Go Zenのタイトル画面
巻き戻し(Q、マウスホイール)未読箇所までスキップ(N)
会話と選択肢を巻き戻すノベルゲーム画面会話と選択肢を巻き戻すノベルゲーム画面選択肢を選び直し、未読箇所の手前で止まるスキップ機能選択肢を選び直し、未読箇所の手前で止まるスキップ機能
多言語対応立ち絵の演出(stand、effect)
設定を日本語に切り替えると台詞も日本語になる場面設定を日本語に切り替えると台詞も日本語になる場面キャラクターの登場演出と揺れる立ち絵キャラクターの登場演出と揺れる立ち絵
台詞付きイベント画像
バーで歓声を上げるブレンナと、その下に表示された台詞バーで歓声を上げるブレンナと、その下に表示された台詞
戦争マップ軍勢の衝突
地域の支配色や週、地域情報、将軍を表示したマップ地域の支配色や週、地域情報、将軍を表示したマップ地形上に並ぶ二つの軍勢と将軍のカード地形上に並ぶ二つの軍勢と将軍のカード
地域の配置と支配状況を一枚の地図に表示部隊の兵士数に応じて、戦闘中に兵士の群れが縮小
F5:YAMLの変更を同じ場所に反映F9:画面と状態をメモに保存
YAMLで台詞を編集し、F5で同じ場所の表示を更新YAMLで台詞を編集し、F5で同じ場所の表示を更新F9でメモを開き、コメントを入力して保存F9でメモを開き、コメントを入力して保存
F7:戦闘の勝率F8:状態(フラグ・数値)
敵の編成ごとの勝率を示す画面敵の編成ごとの勝率を示す画面開発パネルに表示されたフラグと選択状態開発パネルに表示されたフラグと選択状態
F8:各イベントのフラグF8:シーン移動
イベントごとに設定・参照するフラグイベントごとに設定・参照するフラグシーン一覧から夜のイベントへ移動シーン一覧から夜のイベントへ移動
F8:YAMLコマンド実行F8:フレーム計測
Commandタブでsetを実行し、Stateタブでフラグを確認Commandタブでsetを実行し、Stateタブでフラグを確認酒場の画面に重ねて表示されたフレーム計測酒場の画面に重ねて表示されたフレーム計測
F6:キャラクター図鑑(プロフィール、表情、関係)
プロフィールや表情、他キャラクターとの関係を表示した図鑑プロフィールや表情、他キャラクターとの関係を表示した図鑑

サンプルゲームに登場するキャラの一部は、公開を考えていた RPG のために作った画像から借用している。この RPG は、2〜3週間作り込んだが、面白くならなかった。私が普段作る OSS よりも開発期間をかけたので、元を取るためにゲームエンジンとして切り出した。v0.1.0 が出来上がる直前まで RPG のキャラをサンプルに使うか迷ったが、有効活用することにした(半分ぐらいは、非公開になっている)。ポシャった RPG は ADV としての機能が半分ぐらい実装されていたので、あと付けで ADV も作れる形に gozen を改変した。SLG は、適当に追加したので完成度がまだ低い。

お試しで作ったゲームの機能が部分的に生き残っている。例えば、「VTuber にチャットして読み上げてもらうゲーム」を思いつき、その名残でチャット機能、単語の検閲機能、キャラが Live2D のように表情を変えながら動く機能がある。他にも、町を擬似 3D 空間で歩くために、マインクラフトじみた空間を作ったりした。安っぽかったので、今は奥行きのある一枚絵上をローポリで歩くに留まっている。開発者的には「ブロックの空間だけど、町を歩けてる〜」と感動するのだが、ユーザー視点ではショボいと判断した。

今後は gozen を育てていくというよりは、ゲーム開発で得た知識・経験を gozen に反映していく形になる。gozen を本格的に宣伝するのは、gozen を利用したゲーム1本が完成したタイミングとなる予定。完全に余談だが、LLM に絵の評価を任せると、高解像度の絵を読み込む時にやたらトークンを消費する。

Claude Max 20x を一日中動かしていたら、3日で Weekly Limit に達した。また、v0.1.0公開前にパブリック API が1200個以上あり、なんて酷い設計をするんだと少々驚いた。ゲーム系の場合は、Claude の生成がやや劣る可能性がある。なお、パブリック API は、150個程度まで減らした。正直、50個ぐらいでも成立するのではないかと疑っている。


Rabbit Run をブラウザ対応した

hajimehoshi/ebiten(Go 製) が WASM 対応しているので、お試しでブラウザ対応した。本格的なテストプレイはしていない。カクツキや音声飛びは修正済み。

Rabbit Run:ウサギを操作するランゲーム

Rabbit Run をブラウザでプレイ / GitHub


ゲーム開発に使うフレームワークgozen(御膳)を整備している

先月の終わりから、ゲーム開発をずっと続けている。平日は LLM に自動開発をさせ、夜か休日にテストプレイしている。

hajimehoshi/ebiten(Go 製) をゲームエンジンとして利用しており、その上で動作するフレームワークとして、nao1215/gozen(当時はプライベート。現在は公開済み)を作り始めた。エビ天に合わせて、mentsuyu(めんつゆ)にしようかと思ったが、既に先客がいた。gozen はツールセットの側面が強いので、御膳から名前を拝借した。エビ天御膳。蕎麦とかついてきそう。偶然だが、御膳には go の文字が入っていて満足である。なお、ebiten(ebitengine) はマルチプラットフォームであり、この点に関しては強くリスペクトしている。

Ebitengine のゲームは様々な環境で動きます。デスクトップ (Windows、macOS、Linux、FreeBSD)、 Web ブラウザ (WebAssembly)、モバイル (Android と iOS) で動きます。さらに、 v2.10 からすべてのデスクトップ向けビルドは Pure Go なので、 C コンパイラなしで開発できます。 Nintendo Switch™ もサポートされています。

Gozen:ゲーム制作フレームワーク

Gozen:ゲーム制作フレームワーク

LLM のおかげで、大学生の頃からの夢だったゲーム開発が実現できるようになった。自分が納得できるゲームを作るまで、暫くは OSS 開発をしない。新しい会社で必要な知識をキャッチアップしつつ、ゲームを作る方針になる。最近は、ゲーム開発の面倒な部分に気づき始めたので、開発の全貌が想像できるようになってきたようだ。ゲームは開発規模が大きく、1週間で雛形すらできない。シナリオ、音楽、ゲームデザインなどの幅広い知識が要求され、仕様変更が激しい。大変だ。

UI に使える画像は ComfyUI に頼るので、作れないジャンルが多い。例えば、アニメーションを多用するゲームは厳しい。実力値が知りたかったので、画像生成に関しては数千枚の画像を生成して一定の知見を得た。消費電力を増やせば、画像生成が高速化されることに気づいた後、私の部屋は GPU の排熱で灼熱になった。冬でも暖房が要らないのではなかろうか。外気温14度なのに、床冷房を付けている。

伝えたいことは、楽しい遊びを見つけました、という一点。


マリンピア日本海の年パス購入を検討して2年経った

マリンピア日本海には、年間パスポートの概念がある。大人3,500円、小中学生1,300円、幼児(4歳から)400円だ。1年に3回以上来るなら、年パスを買った方がお得だ。私は丁度年間3回ぐらいの頻度で訪れている気がする。2025年度収支報告書を見ると、年間入館者数は約54万9,000人、入館料がメインの稼ぎ柱だった。物販で稼いでいるのかと想像していたが、そこまで大きな数値ではなかった。

主な事業収入:

項目年間金額
入館料収入約4億8,098万円
物販などを含む付帯事業約8,516万円
教育・普及啓発などの自主事業約1,764万円

4回、5回と訪れ続け、年パスで浮いたお金で物販のぬいぐるみを買うと、お互いに Win-Win でマリンピア日本海の存続に貢献できるだろう。私は、お金を払わないでサービスを先細りさせるのがあまり好きではない。今回の来訪では、息子がトドとペンギンの食事にご熱心だった。子供向けの遊び場で遊ぶのが、一番テンション高そうに見えた。

ケンカをするトド

ケンカをするトド

新参者のトド

新参者のトド

私は、展示されている魚が変わったのではないかと思いながら眺めていた。イワシに近い種類の大きな魚(名前を失念)がいて、初めて見たなと思った。もう少し前は、浜辺に迷いついたウミガメが居たらしい。ウミガメは私が子供の頃しか飼育されていなかったので、見ておきたかった(日本海にウミガメは居ない、的な理由で居なくなったと昔聞いた。真偽は不明)。

天気が良かったので、食事をしながらイルカショーを観覧している人が多かった。天気が悪いと小さい屋内でショーを見るため、ホットスナックを食べる人を見かけないのだ。私は息子が生まれてから、初めて快晴でショーを見たのかもしれない。

マリンピア日本海で見たイワシの仲間

マリンピア日本海で見たイワシの仲間

マリンピア日本海のイルカショー

マリンピア日本海のイルカショー

魚が飼育されている水族館に刺し身料理の食品サンプルがあり、「食べることしか考えていない民族、日本人」というフレーズが脳裏に浮かんだ。水族館でイカやタコ、海老を見て、「美味しそう」という感想が聞こえてくるのは日本だけではなかろうか。海外の水族館に行ったことないけど。

水族館に展示された食品サンプル

水族館に展示された食品サンプル

水族館に展示されたサーモン丼の食品サンプル

水族館に展示されたサーモン丼の食品サンプル

水族館に展示された海老の刺身の食品サンプル

水族館に展示された海老の刺身の食品サンプル

数億円が手に入ったら、海沿いで住むのも楽しそうだなと考えながら、マリンピア日本海の前にある海を眺めていた。山よりは良い。虫が居ないから。その一方で、塩害に悩まされそうだ。塩害を上回る問題は、数億円が現世で手に入らないことだろう。150億円欲しい。