“Bombercrab” チャレンジ 💥💣🦀

お気に入りのプログラミング言語で、ゲームを開発したりハックしたりした、一夜のお話

こちらの記事はオリジナルの英語記事の翻訳になります。


tonariにはRust好きのエンジニアがたくさんいます。

好きが高じた僕たちは、高スループットのビデオパイプラインを処理する画像処理ソフトウェアから、小さなコントロールパネルやロータリーエンコーダーを駆動するファームウェア開発まで、すべての技術スタックをRustベースで構築しました。 好きな人ができたら、テンションMAXでそれをみんなに言いふらしたくなりますよね?

そこで、僕たちは2022年版のTokyo Rust Game Hackイベントを企画しました! 2019年にも開催したこの集まりは、東京を拠点とするRust開発者と共にピザ、ビールを嗜みながら、ゲームジャムのような、ゲーム大会のような、はたまたどちらでもないような、不思議で楽しい夜を過ごす絶好の口実というわけです。一口で説明するのは難しいので、このイベントがどんなものか、この後お読みいただければと思います。

まもなく、イベント開始!

東京側のスペースは一杯に! 葉山からイベントの様子を覗く友人もいました。

3 年間の沈黙を経て、Rust(※一般的には「錆(さび)」の意)コミュニティのスピリットが完全に錆びていないことは明らかでした(笑)。 Straylight(tonari の開発拠点でもある、非営利のメーカースペース)のドアを開けた時、僕たちは参加者のエネルギーに驚かされました。 蓋を開けてみなければわからないところもありましたが、熱狂的かつ話し好きな参加者たちが世界中から集まってくれたことに本当に感謝しています。

開発環境をイベント中にゼロから構築したツワモノも。

参加者全員のワークフローとキャリアについてひとつの記事が書けちゃうぐらいですが(今回は省略)、 彼らが持ってきたセットアップにはかなり珍しいものがあった、ということはひとまずご報告しておきます。 ひとしきり紹介とカンパイが終わったところで、いよいよ開始!

“Bombercrab” チャレンジ 💥💣🦀

“Bombercrab” チャレンジとは? 冒頭でもちらっと書いたように、これはゲームジャムでもゲーム大会でもなく、その中間に位置するものです。 過去にボンバーマンをプレイしたことがあれば、基本的なルールはそのままです。キャラクターを動かしながら爆弾を配置し、十字型に広がる爆風を利用して他のプレイヤーを倒していくゲームです。今回のルールで特殊な点は、マップ上に特別な「丘」エリアがあり、そこで最も長く生き残ったキャラクターが勝ち、というところ。

Straylightには複数のスクリーンが設置され、参加者はゲームの最新状況をフォローすることができました。

なぜこのゲームがRustフリークにとって魅力的なのかというと、アーケードスティックやコントローラーでキャラクターを操作「できなかった」こと。 その代わりに、キャラクターの頭脳は Rust で記述され、試合中にいつでも新しいプログラムをアップロードすることで、新しい頭脳に置換できました! 事前に用意されたテンプレートを使用すれば、環境を構築するのはほんの数分。nameteam_name メソッドを置き換えるだけで準備完了!

これを実現するために必要な Bevy + WebAssembly の神がかったワザについては、別のブログが書けてしまうので、今回は「非常に興味深い挑戦でした」と言うにとどめておきます。内部の仕組みについては、またの機会に詳しく説明するとして、今日は参加者の創意工夫についてご紹介します。盛りだくさんなので、ご覚悟のほどを!

イベントの始まりの頃は、チームで試行錯誤する参加者が多く見られました。

手探りでのスタート

このチャレンジの興味深い点は、リアルの参加者に限定されていないこと。 ゲームは twitch(録画動画があります)でストリーミングされ、リモートプレイヤーも同じラウンドに参加ができました。 ゲーム開始直後に小さな技術的問題をいくつか解決する必要がありましたが、最初のキャラクターがアリーナに難なく登場して、ほっと胸をなでおろしました。

と、思ったのもつかの間。キャラクターは周囲の非常に限られた視野でやりくりしなければならなかったため、敵の爆弾はもちろんのこと、自分の爆弾の炎を回避するのにすら大苦戦することになります。その結果、かなり長い間、 勝利者ゼロの結果画面が表示されることになります。 ありがたいことに夜はまだ始まったばかりで、ちょうど腹ごしらえのピザも到着し、全員が集中してハッキングに取り掛かり始めた頃でした。

この画面を何度も見ることになりました(涙)

最初に僕たちを驚かせたのは、プレイヤーたちがいかに論理的に課題に挑戦していったかということ。コーディングに直接取り掛かるのではなく、最初の 1 時間をゲームの内部メカニズムを解析することから始める人もいました。このころには、怪しいプレーヤー名のキャラクターが画面上を徘徊したり(おそらく、文字列表示のロバスト性をテストするため)、故意がどうか分かりませんが、ゲームサーバー側に設けた制限に引っかかり自爆するキャラクターもちらほら見かけるようになりました。

プレーヤー名といえば、何人かの熱心な参加者は、プレイヤー名がキャラクターの振る舞いをデバッグする方法として使用できることに気づいたようでした。ゲームの構造により、プレイヤーの意図どおりにキャラクターが作動しない場合にその理由を解明する方法がほとんどありませんでした。その結果、秘密の暗号のような数字や文字がキャラクターの上に表示され始めます。キャラクターの視野範囲を知るのに使う人もいれば、自分の内部変数の値を知るのに使うプレイヤーもいたようでした。

この数字の意味はなんだろう。誰にもわかりません。

フィンランドへの小旅行

このゲームでは、複数のマップを事前に用意し交互にローテーションする仕組みになっていましたが(シンプルな通常マップの後に、より独創的なマップが続く)、マップサイズと難易度の設定について少し甘く見ていたことはすぐに分かりました。 可愛そうなボンバーマン達は、限られた視野の中で協力プレイをすることもままならなかったのです。 最終的には、難しいマップでもポイントをかせぐ参加者が現れ、驚かされることになるのですが、まずは少しでも勝てるゲームにするために急遽解決策を練らなければなりませんでした。

幸いなことにゲームサーバーのロジックをオープンソースしていたおかげで、チーム moimoi が自国(フィンランド)の国旗を模した巧妙なマップを作成してくれました。このマップは、その極端なシンプルさのおかげで、すぐさま最も楽しいアリーナ(そして間違いなく、最も血なまぐさいアリーナ)になりました。

最初の勝者が現れたのは、フィンランドマップの最初のラウンドでした。 sometypes (Twitch 上では wholesometypes) の最初の勝利に乾杯!マップのサイズも十分大きかったので、まぐれではないでしょう。sometypesは、以降のラウンドでも継続して脅威となりました。

この最初の勝利がキッカケとなり、キャラクター達のAIはだんだんと進化していきました。爆弾に直進するかわりに、パワーアップの入手を優先したり、壁に突撃し続けるかわりに「丘」タイルにむかって着実に前進し始めました。勝利するキャラクターが固定化してくる中で、とくにsometypesは最初の平和的な戦略をより積極的な攻撃行動に置き換え、多くのポイントを獲得しました。チーム PolyglatteMark も城マップで素晴らしい籠城箇所を見つけたり、チームReiwaHidari-kunも血まみれのラウンドで最後まだ立っていたキャラクターとして記憶に残っています。

「丘」タイルまで前進し、勝利をもぎ取った参加者の皆さんに拍手!

Ashkanの狂気なるスパイラルラン

ハッキングのイベントでは、みんなの期待を裏切るような「非常識で型破りなアプローチ」ももちろん大歓迎です。他のプレイヤーが自分の AI を着実に改良している間、ほとんど何もアクションを取らない控えめキャラクターがいました。AshkanBshkanCshkan など、微妙に名前を変えながらスポーンを繰り返し、何やら企んでいるなと思ったら案の定、非常にユニークな作戦を練っていたのです。

すでに説明したように、ゲームのルール上、プレイヤーはいつでも新しいキャラクター AI をアップロードすることができます。このルールの意図するところは、参加者が次のラウンドの開始を待たずにロジックの誤りを適時修正できるということ。 Ashkanはそのルールに抜け穴を見つけました。 低頻度でキャラクターAIを更新するのではなく、1ムーブするだけのキャラクターを1ターンごとに連続してアップロードし続けたら、どうなるでしょう?

キャラクターの動きを単純化して一度に 1 つのことを実行だけのコードを作成。そして、キーボードのキーを押すたびに違う動きをするキャラクターをアップロードする、リアルタイムのコントローラーアプリを構築することで、Ashkan は手動でボンバーマンの動きを制御し、AI 駆動の他のキャラクターをすり抜け勝利をもぎとりました。Ashkanの具体的な実装方法をこのブログで語るにはすこしマニアックすぎますが、素の.wasmファイルを16 進エディターで直接弄っていたということだけは言及しておきます。

完全に手動のキャラクターが、これまで攻撃不可能な要塞と思われていたスパイラルマップの中心に向かって、狂ったように走りました。その時、マップを映すディスプレイの前にいた僕たちのテンションはMAXに達しました。絶え間なくプレイヤー名を変えながら、自身の爆弾の炎をなんとかかいくぐりながら、刻々と減っていくカウントダウンの中フィニッシュラインに向かって少しずつ進むのを見て、誰もが歓声を上げたのです。

この勝利は17 ポイントと比較的小さいものでしたが、これはこの夜、最もエキサイティングなシーンのひとつとなりました。スパイラルマップで、プレイヤーが「丘」タイルまで到達した唯一のラウンドでもあります。

ゲームオーバーとその後

イベントが終わった後も、プルリク上でゲームロジックを改善する方法について議論が続きました。一夜のエネルギーが、その後も続いたことには本当に感謝しています。 恩返しの精神こそがオープンソースを存続させるものですし、次のイベントへのモチベーションにも繋がります。ゲームロジックを調整する方法についてはすでに良い考えがあるので、次のイベントに乞うご期待!

このイベントを大成功に導いてくれた皆様に感謝を申し上げます!見逃した方もご安心ください。僕たちは外部の方もイベントに参加できるよう引き続き努力していきます。ご自身でゲームイベントを主催されたい場合、ゲームコードは完全にオープンソースされていますし、プルリクも大歓迎です。

東京の Rust 開発者の方で興味の有る方は、hey@tonari.no までお気軽にメッセージを。 僕たちの次のイベント情報や集まりなどをお知らせいたします。tonari の製品やチームについても、定期的にニュースレターを配信しています。興味の有る方は是非ご購読ください!

それではまた次回のTokyo Rust Game Hackでお会いしましょう!👾

SNSで最新情報をチェック 💙 Facebook: @heytonari Instagram: @heytonari X: @heytonari