開発日記

フェスティバルサーキットを作った話(そして壊れたもの)

Oct 27, 20265分で読める

フェスティバルサーキットの設計についての開発日誌。4つのティア、シーズン全体を通したシード、あるプレイヤーの出場枠を奪ったタイムゾーンのバグ、そしてその後に変えたこと。

最初に走らせたプレミアの決勝は、最後まで決着しませんでした。深夜を過ぎてもそのまま止まっていて、王者が入るはずの場所がぽっかり空いたブラケットだけが残っていました。

新しいものを出すというのは、正直に言えばそういうことです。というわけで開発日誌です。フェスティバルサーキットの設計がどうやってまとまったのか、最初のライブシーズンで何がうまくいったのか、そして実際のバンドが触りはじめてから数時間で壊れた三つのことについて書きます。

なぜ大きなライブではなくサーキットなのか

週ごとのライブはこのゲームの心臓です。そして意図的に、地道な繰り返しでもあります。ブッキングして、演奏して、会場がセットリストに何をするのかを学び、数字が少しずつ伸びていきます。

足りなかったのはピークです。現実の音楽の一年には形があります。冬のあいだは泥のように進み、七月には誰かが野原の真ん中の午後四時のステージに立たせてくれる。

その形が欲しかった。シーズンの中にもうひとつ、フェスのシーズンを作ることにしました。

たどり着いたフェスティバルサーキットの設計

ローカルステージからプレミアのテントまで、四つのティア。シーズンの途中でサーキットが開くと同時に自動でエントリーされます。これは意識して選んだ形です。ちょうどその瞬間にログインしていた人がフェスの枠を取る、という形にはしたくありませんでした。

残りはこう動きます。

  • •サーキットポイントはライブとリリースの活動からシーズンを通して積み上がります。だから順位は運のいい一週間ではなく、数か月の積み重ねを映します。
  • •シードはそのポイントから決まります。つまり、どのティアに入るかは選ぶものではなく勝ち取るものです。
  • •ブラケットはシーズンのうち数週間かけて、一回戦ずつ進みます。処理するのは、ほかのすべてを回しているのと同じ週次ティックです。
  • •報酬は話題と評判であって、お金ではありません。これは意図的です。サーキットを、最速で金持ちになる手段ではなく、最速で名前を知られる手段にしたかったからです。

最後の点については、自分たちのメモの中で一週間ほど言い争いになりました。現金報酬はいちばんわかりやすいレバーです。同時に、権威あるイベントを稼ぎのルートに変える最短の道でもあります。そうなったら、誰が何に勝ったかなんて誰も覚えていません。

設計が本当に生きているのはシードの部分

ブラケットで面白いことは、最初の一戦が始まる前に全部起きています。シードを間違えれば、いちばん大きなバンドに自動でトロフィーを渡すことになるか、理不尽に感じる混乱を生むかのどちらかです。

上位はしっかりシードし、下位はゆるくマッチングする形にしました。強いバンドどうしは終盤で当たるべきです。でも、はじめてサーキットに出るバンドにも、儀式的な処刑ではなく本当の勝負をしてほしい。

厄介だったのは奇数です。ブラケットは2のべき乗を欲しがりますが、実際の参加数は絶対にそうなってくれません。不戦勝で埋めれば解決しますし、その不戦勝こそ、私たちが最悪のバグを仕込んだ場所でもありました。

最初の本番で壊れた三つのこと

一つ目は静かで、そして最悪でした。読みにいっていたポイントの取得元が何も返していなかったのです。すべてのバンドがゼロでシードされ、ブラケットは事実上ランダムでした。動いているように見えました。動いていませんでした。

二つ目は空っぽの決勝です。最上位ティアは予定された最終週に行われるのに、ラウンドを処理するコードは、その次の週が必ずあるという前提で書かれていました。ありませんでした。決勝は閉じられないまま、シーズンが切り替わるときにフェス関連のデータの一部を道連れにしていきました。

三つ目は不戦勝です。一回戦の不戦勝だけは正しく扱えていて、それ以降はまったく扱えていませんでした。そのため、後のラウンドで対戦相手なしに勝ち上がったバンドは、何も言わずにそこで止まっていました。

誰かの出場枠を奪ったタイムゾーンのバグ

そして、いまだに刺さっているのがこれです。エントリーは決まった時刻に締め切られるのですが、その締め切り判定はサーバーのローカル時間で計算され、プレイヤーが見ていたカウントダウンは各自の時間で表示されていました。世界の大半にとっては差は問題になりませんでした。あるプレイヤーにとっては一時間で、彼は正しく見えるはずのない締め切りの一時間後にエントリーを確定してしまいました。

彼は何ひとつ間違えていません。それでもサーキットに乗れませんでした。

直し方は退屈な方法でした。締め切りはすべてUTCで保存して比較する。画面には時計の時刻ではなくリアルタイムのカウントダウンを出す。エントリー期間は黙って閉じるのではなく、見えるかたちの警告とともに閉じる。あわせて処理側を冪等にしたので、途中まで走ったラウンドを、結果を二重にせずに再実行できます。

仕組みの詳細はゲーム内ガイドのフェスティバルの章で読めます。配線のことより実際に遊びたいという人には、フェスティバルで勝つ方法という戦術編もあります。公開当時のノートはフェスティバル、始まりましたにあります。

ここから学んだこと

シーズンに一度しか走らない仕組みは、いちばんテストしづらいものです。人前で間違えるチャンスがシーズンにつき一回しかないからです。答えは、より賢い書き方ではありませんでした。誰の目にも触れる前に、フェスの一サイクルを丸ごと早送りできる仕組みを作ることでした。

サーキットはいま稼働していて、期待どおりのことをしてくれています。シーズンの真ん中に山ができました。バンドはそこに向けて計画を立てます。まさに私たちが望んでいた動きです。

中から見てみたいなら、無料でバンドを始めて、次のサーキットを目指して遊んでみてください。ブラウザで動いて、費用はかからず、最初のライブは五分ほどでブッキングできます。

#dev-diary