ただ見てるだけのローグライクRPG「探犬∞」は、主人公が@じゃなくて絵文字+漢字。やられたらバッハのレクイエムが自動生成され無限転生(CloseBox)

テクノロジー AI
松尾公也

テクノエッジ編集部 シニアエディター / コミュニティストラテジスト @mazzo

特集

ローグ(Rogue)ライクなロールプレイングゲーム「探犬∞」というのを自作(もちろんAIで)しました。これまで作ってきた音楽自動生成を応用したものです。

ことの発端は、ふとした疑問でした。ローグライクといえば主人公は「@」、犬は小文字の「d」、ドラゴンは大文字の「D」という、1980年のRogue以来のアルファベット記号体系で描かれるものです。では、アルファベットではなく絵文字を使ったローグライクは、もうあるのでしょうか。

ローグができたのは、先日公開した「SFタイムライン」の解説では1980年。ウィザードリーとウルティマ誕生の前年ですね。

で、絵文字を使ったローグライクですが、調べてみたらありました。itch.ioには絵文字ダンジョンものがいくつも転がっていて、7DRL(7日間でローグライクを作るチャレンジ)の作品にも「絵文字世代のためのローグライク」を名乗るものがあります。ZWJシーケンス(絵文字の合字)を使えば、👨🏾‍🦱が大学を出て👨🏾‍🎓になり、就職して👨🏾‍🚀になる、というキャラクターの状態変化まで表示文字そのもので表現できる、という考察記事まで見つかりました。「@」一文字では不可能だった芸当です。

ところが「漢字・ひらがな・カタカナ+絵文字」の組み合わせとなると、これが見事に空白地帯でした。一番近いのは台湾発の『文字遊戯』(すべてが文字でできた世界を「我」の一字で歩くパズルADV。日本語版が2025年に出ています)ですが、あれはローグライクではなく、絵文字も使っていません。

考えてみれば日本語はこの用途に異様に向いています。漢字は一文字で意味が完結する表意文字なので「dは犬」という頭文字暗記が要らない。「犬」はそのまま犬です。ひらがなは弱そうな敵、カタカナは外来の敵、絵文字はアイテム、と文字種そのものがゲーム内のカテゴリ分類として機能する。これは日本語でしか作れないローグライクになるのでは。

「犬」と🐕が切り替わるだけで、生きて見える

最初のアイデアは単純でした。主人公の犬が歩くたびに「犬」⇄🐕とパタパタ切り替わる。たったこれだけの2フレームアニメで、タイル絵を一枚も描かずに「生きて動いている」感じが出ます。文字ベースゲームの最大の弱点だった静止感を、フォントに最初から入っている絵文字で解決するわけです。壁は壁壁壁壁壁壁   壁壁壁壁、といった漢字、いや感じで。

さらに切り替えに意味を持たせました。敵は非警戒時が漢字(鼠・蝠・蛇・狼・鬼・竜)で、こちらに気づくと絵文字(🐀🦇🐍🐺👹🐉)に固定される。漢字=概念としての存在、絵文字=実体として牙を剥いた存在、という書き分けです。「狼」だと思って歩いていたら🐺に変わって振り向く。この「振り向く」も、絵文字形態のときだけCSSのscaleX(-1)で左右反転させることで実現しています。

漢字を反転させると鏡文字になって読めなくなるので、反転するのは絵文字だけ。上下の向きは……絵文字を90度回すと横倒しになって不気味なので、直前の左右向きを保持する仕様にしました。8bit時代のRPGと同じ割り切りです。

偏差機関を「聴く者」から「歩く者」へ

そしてここが今回の本題です。この連載で作ってきた無限音楽機関シリーズ、特にDEVIATION∞には「リスナーシミュレータ」を載せていました。

音楽の反復に対する慣れFと、逸脱による予測誤差Eを追跡し、覚醒度A=0.6E+0.4(1−F)がWundt曲線の心地よい帯域に収まるよう、飽きてきたらMEDIANT(シューベルト的な半音階的三度転調)などの偏差オペレータを発動する仕組みです。

今回はこの偏差コアを、音楽生成とゲームエージェントの両方から共有させました。つまり「音楽に飽きる」と「フロアに飽きる」が同じ変数なのです。

慣れFが閾値を超えると、音楽側では旋律が逸脱し、行動側では階段への効用が上昇して、犬は転調とともに次の階へ降りていく。逆に未踏の床を踏んだりアイテムを拾うと予測誤差Eが微増して、機関の逸脱欲求が抑えられる。飽きた犬が深部へ潜り、潜った先の新奇さが音楽を落ち着かせる。一つの美学理論が音と行動を同時に駆動する、双方向の結合です。

エージェント自体は空腹・HP・物欲・好奇心の効用計算+BFS経路探索という古典的な作りで、プレイヤーは何も操作しません。開始ボタンを押したら、あとは見ているだけ。ゲームループはTone.jsのTransportそのもので、8分音符ごとに一歩、4分音符ごとに画面中の文字が明滅します。

戦闘時は拡大表示、死んだら昇天

俯瞰マップでは1マスの絵文字がぶつかっているだけなので、接敵すると画面中央に戦闘拡大窓が開くようにしました。🐕と🐺が「対」の字を挟んで向かい合い、攻撃側が突進、被弾側がシェイクして、ダメージは漢数字(−三)で浮かび上がる。倒すと💥。俯瞰は記号、接写は演出、という二層構造です。

なお、iOSとAndroidでは絵文字が異なる(他のOSも)ので、拡大画像は特に、だいぶ違ってきます。Androidのワンちゃんはかわいいですね。

主人公は犬のほか猫、人、そして「人と犬」の二人旅も選べるようにしました。@とdのように。

二人旅では相棒の犬がリーダーの軌跡を追従して戦闘にも参加し、先頭が倒れると相棒が歩みを継ぎます。そして片方が倒れた瞬間、画面中央に大写しの絵文字が金色の天使の輪を頂いて現れ、ゆっくり昇天していく。「人は光に包まれ、昇っていった。犬が歩みを継ぐ」というナレーションとともに。

このナレーションはWeb Speech APIで実際に読み上げられます。階層突入、戦闘の開始と終了、そして偏差機関の内部状態がそのまま地の文になる仕組みで、慣れFが0.7を超えると「旋律が逸れはじめる。この階に飽きたのだ」と語り出す。MacとiOSのKyokoで検証したら、けっこう読み間違いがあったので補正辞書も入れました。この辞書で、AndroidのTTSもちゃんと動作しているみたいです。音声はこっちの方がいいなあ。

バッハは死をどう奏でるか

音楽スタイルは4種類にしました。起動時だけでなく、プレイ途中でも切り替えられます。

ミニマルテクノで潜る「和」、四つ打ちの「EDM」、そして無限バッハ機関の知見を注ぎ込んだ「弦楽」と「オルガン」です。ただし、音源は簡易版。キャラクターが1マス進むと1拍が進むという、なかなか気持ちのいいBGM。どの音源でもこれはきっちり守っています。

弦楽はfatsawtoothにコーラス(最初はデプスを深くしすぎて酔いそうになったので1/3に減らしました)、オルガンは倍音加算で8'+4'+2⅔'+2'のプリンシパル合奏を一つの波形に焼き込み、コーラスなしで大聖堂リバーブに直結しています。当初リードにディレイをかけていたら山彦にしか聞こえなかったので、経路をコンボリューションリバーブ基幹に組み直したのも反省点です。

そして死。当初は全滅すると鎮魂歌であるグレゴリオ聖歌「怒りの日」が流れる仕様でしたが、弦楽とオルガンについては「バッハ自身のレクイエムの自動生成版が聴きたい」と欲が出ました。

バッハはレクイエムを書いていませんが、死の音楽の様式文法なら持っています。ロ短調ミサ「Crucifixus」の半音階下行ラメント・バス(passus duriusculus)です。この下行バスをオスティナートとして踏み続け、その上で掛留→解決の連鎖(7-6/4-3型サスペンション)をアルゴリズムで紡ぐ。解決音と予備音は確率的に選ばれるので、死ぬたびに違う挽歌が生成されます。

様式だけを規則化し、音は毎回生成する。リバーブは死の瞬間にwet 0.78まで増量され、大伽藍の残響の中で不協和が溶けていきます。

さらに転生時には、復活祭オラトリオBWV249のシンフォニアを範とした生成ファンファーレ。長三和音の上行ラッパ音型が付点リズムで駆け上がり、ティンパニ相当のキックが打たれ、金色の光の中に「生」の一字が浮かんで新しい命が地下1階に降り立ちます。受難のクルツィフィクススから復活祭オラトリオへ。バッハの教会暦がそのままゲームの死生観になりました。

そして恒例のiOSで音が出ない問題

もちろん、すんなりとは動きません。iPhoneで試すと音が出ないどころか、犬が一歩も歩かない。このゲームはTransportがゲームループそのものなので、AudioContextが解錠されないと世界の時間が止まるのです。原因は、ナレーションのTTSがTone.start()より先に発話していたこと。iOSではTTSがオーディオセッションを先取りしてWebAudioを無音化します。解錠シーケンス(Tone.start→rawContext.resume→無音バッファ再生)をタップ直下の最優先に置き、TTS終了時とタブ復帰時にresumeし、それでも駄目な場合に備えて「Transportの拍が途絶えたら通常タイマーがゲームを代行する」ウォッチドッグまで入れました。音が死んでも世界は歩き続け、次のタップで音が追いつく。オーディオの生存とゲームの生存を切り離す、という設計に落ち着きました。

録画して公開

仕上げに録画機能です。画面外のcanvasにゲーム画面一式をミラー描画し、canvas.captureStream()の映像とTone.jsのマスター出力を合成してMediaRecorderへ。「始動と同時に録画」を予約しておけば、冒頭の口上「これは、音楽に導かれて迷宮を歩む、小さな命の記録である」から昇天、鎮魂歌、復活祭ファンファーレまで、まるごとMP4になります。唯一、語りのTTSだけはOS側で鳴るため録画に入らないという制約が残っていますが、これは仕様です。

macOSではQuickTimeの画面収録機能でシステムオーディオをオンにして、iOSではOSの画面収録で録画すれば、TTS音声も入ります。

最後にVite構成のリポジトリにまとめ、GitHub Actionsのワークフローを添えてGitHub Pagesへデプロイしました。mainにpushするたびに自動でビルドと公開が走ります。

・ゲームプレイ:https://matsuo-koya.github.io/tanken-infinity/

・GitHub:https://github.com/matsuo-koya/tanken-infinity

一連の開発はいつものようにClaudeとの対話で進めました。「絵文字ローグってある?」という雑談から始まって、気づけば偏差理論で歩く犬がバッハ様式の挽歌で弔われ、復活祭の調べとともに生まれ直すゲームになっていた。生成音楽シリーズの一つの到達点として、そして「日本語でしか作れないローグライク」の最初の一歩として、しばらくこの迷宮を眺めて暮らそうと思います。放置しておくだけで、死と再生の音楽が延々と紡がれていくのです。

それでもプレイしたくなったら、どうしましょう。課金すれば自分で動けるようにするとか(笑)

※この記事は筆者とClaudeとの対話をもとに、Claudeが記事を執筆し、それに筆者が整理・加筆したものです。

《松尾公也》

Amazon売れ筋ランキング

松尾公也

テクノエッジ編集部 シニアエディター / コミュニティストラテジスト @mazzo

特集

BECOME A MEMBER

『テクノエッジ アルファ』会員募集中

最新テック・ガジェット情報コミュニティ『テクノエッジ アルファ』を開設しました。会員専用Discrodサーバ参加権やイベント招待、会員限定コンテンツなど特典多数です。