开发日志

我们是怎么做出音乐节巡回赛的(以及什么坏掉了)

Oct 27, 20265 分钟阅读

一篇关于音乐节巡回赛设计的开发日志:四个级别、贯穿整个赛季的种子排名、让一位玩家丢掉名额的时区错误,以及我们后来做的改动。

我们跑出来的第一场顶级决赛,根本没有结算。它就那样停在那里,过了午夜还是不动,对阵表上本该有冠军的位置空着一个洞。

发布新东西,诚实的版本就是这样。所以这里是开发日志:我们的音乐节巡回赛设计是怎么成形的,第一个正式赛季里哪些地方做对了,以及真实乐队一上手几个小时内就坏掉的三件事。

为什么是巡回赛,而不只是更大的演出

每周的演出是这个游戏的心跳。它们也是刻意设计的重复劳动。你订场、你演出、你摸清一个场地会对歌单做什么,然后数字一点点往上爬。

我们缺的是一个高峰。真实的音乐年份是有形状的:你在冬天里艰难前行,到了七月,有人把你放到一片田野中央、下午四点的舞台上。

我们想要那个形状。在赛季里面再放一个音乐节季。

我们最后定下来的音乐节巡回赛设计

四个级别,从本地舞台一直到顶级大棚。赛季进行到一半时巡回赛开启,参赛是自动的,这是刻意的选择:我们不希望一个音乐节名额落到恰好在那一分钟在线的人手上。

其余部分是这样运作的。

  • •巡回赛积分整个赛季都在累积,来自你的演出和发行活动,所以排名反映的是几个月的努力,而不是走运的一周。
  • •种子排名来自这些积分,也就是说你落在哪个级别是挣来的,不是挑来的。
  • •对阵表在赛季中的几周里进行,一轮一轮推进,由驱动其他一切的同一个每周结算来处理。
  • •奖励是话题度和声望,不是钱。这是故意的。我们不希望巡回赛变成最快赚钱的路子,只希望它是最快出名的路子。

最后这一点让我们在自己的笔记里吵了差不多一周。现金奖励是最直接的杠杆。它也是把一个荣誉赛事变成刷收益路线的最短路径,而一旦变成那样,就再没人记得谁赢过什么了。

设计真正活着的地方是种子排名

对阵表上所有有意思的事情,都发生在第一场比赛之前。种子排得不好,你要么默认把奖杯送给最大的那支乐队,要么造出一片让人觉得毫无道理的混乱。

我们的做法是上面严格排种子,下面配对宽松一些。强势的乐队应该在最后几轮碰到其他强势乐队。但一支第一次参加巡回赛的乐队,也应该打上一场真正的比赛,而不是一场仪式性的处决。

麻烦的是奇数。对阵表想要2的幂次,而实际参赛数量绝对不肯配合。轮空可以解决这个问题,而轮空也正是我们埋下最严重那个错误的地方。

第一次正式运行时坏掉的三件事

第一个安静又要命:我们读取的积分来源什么也没返回。所有乐队的种子都是零,也就是说对阵表基本是随机的。它看起来在工作。它没有在工作。

第二个是那场空的决赛。我们最高级别安排在赛季计划中的最后一周进行,而结算一轮比赛的代码默认后面永远还有一周。并没有。于是决赛一直没有收尾,赛季切换的时候还顺手带走了一部分音乐节数据。

第三个是轮空。我们只在第一轮正确处理了轮空,之后再也没有,所以在后面几轮里没有对手而晋级的乐队,就悄无声息地不再前进了。

让某人丢掉名额的时区问题

还有一个到现在想起来还难受。报名在固定时刻截止,但这个截止判断用的是服务器本地时间,而玩家看到的倒计时用的是他自己的时间。对世界上大多数人来说,这点差别没有影响。对一位玩家来说是一个小时,他在一个自己根本无法正确看到的截止时间之后一小时确认了报名。

他什么都做对了。他还是错过了巡回赛。

我们用最无聊的方式修好了它:所有截止时间都以UTC存储和比较,界面显示的是实时倒计时而不是某个钟点,报名窗口现在会带着可见的提醒关闭,而不是悄悄关掉。我们还把结算逻辑改成幂等的,这样跑了一半的一轮可以重新跑,而不会产生重复结果。

完整机制可以在游戏内指南的音乐节章节里读到,如果你比起了解它怎么接线更想直接上手玩,还有一篇战术篇如何赢下一场音乐节。最初的上线说明在音乐节来了。

我们从中学到的

一个赛季只跑一次的系统最难测试,因为你每个赛季只有一次当众犯错的机会。解法不是更聪明的写法,而是做出一套能在别人看到之前把整个音乐节周期快进一遍的办法。

巡回赛现在已经上线,而且做到了我们期待的事:赛季中段有了一座山。乐队会为它做规划,这正是我们想要的行为。

如果你想从里面看看这套东西,免费组一支乐队,朝着下一次巡回赛去玩。它在浏览器里运行,不花一分钱,你的第一场演出大约五分钟就能订好。

#dev-diary