阅读视图

发现新文章,点击刷新页面。

卡牌构筑类桌游核心规则之二

上篇提到的 Dominion 和 Ascension 都没有使用传统 TCG 中打出卡片的费用设定。TCG 游戏中给卡片设定不同的费用很好理解:在游戏前自由组卡的游戏,如果不给卡片设定打出限制,玩家只需要尽可能的选择强力卡片放在卡组里,游戏过程中先抽到的人就会占据优势,这就变成了一种运气游戏。

卡牌构筑游戏更多的是用购买卡牌的费用来做限制,让强力牌是逐步加入战场的。玩家不能一开始就购入强力卡片,即使到可以购买的中期,卡片也会先进入弃牌堆,相当于等待一段 CD 时间才能抽回手上。但只有这还不够,必须考虑游戏中后期的平衡:在牌组构筑成型后,一套强力组合若能轻易打出,也会让游戏一边倒。所以,还是需要对打出功能卡做出一些限制。

Dominion 的做法很简单,默认每个回合,玩家只能打出一张行动卡。如果需要打出多张行动卡,就需要配合加行动次数的行动卡。而且加一行动的卡片只能让自己加入当回合的行动链中,只有加二以上行动的卡片才能拓展行动选择。同时,购买牌的次数也被限制了,必须通过行动卡扩展。

Ascension 不一样,它即不限制每个回合打牌的数量,也不限制购买数量。所以几乎每个回合,玩家都会打出手上的所有牌,变化只在于打牌的次序。那么,平衡是怎样实现的呢?这个游戏我玩的不多,只能谈一下粗浅的理解。

Ascension 提供了两种得分手段:用符文购买牌时,除了新牌加入牌组增强实力外,还额外附带了 VP ;使用力量杀怪,直接获得 VP token 。玩家很难在构筑时同时考虑两方面:增强符文能力(更容易买到新牌)以及增强力量(更容易杀怪)。而中间公共市场列是随机抽出来的,每去掉一张牌,无论是购入私人牌组,还是杀掉怪进入虚空区,都随机出现一张新卡。即使在后期玩家牌组能力够强,同一回合有超强的买牌能力(符文充足),也会造成市场列出现全是怪打不动的情况;反之亦然,怪一下子杀的太多,中间就没有怪了。

所以,即使有强力的手牌组合,也很难全部发挥它们的能力兑换成同价值的 VP 。公共市场区的随机性造成了一定的制约。再者,Ascension 公共市场的竞争远较 Dominion 的市场高,玩家更不容易组出心目中的理想卡组。

我比较关注游戏还会用什么规则去限制手牌打出。毕竟游戏必须给予玩家不同的有意义的选择,如果每次拿到手牌就无脑全部打出也太无趣了。只有在限制下,玩家才需要决策打哪张更好。在传统卡牌战斗游戏中,传统的方案是给行动卡加上费用,强卡费用高一些,弱卡低一些。但大多数 DBG 都没有这个设定。我认为这是因为其成本在购牌时已经区分过一次了。当然也一定有游戏采用这种经典机制,比如我非常喜欢的 Core Worlds (2011) ,后续我会详谈。

卡牌的游戏过程,能够产生的变化(玩家的选择)主要可围绕三个方面:打牌、弃牌、构筑。可以把效果和限制分别加在这些行为之上,让玩家去选择针对哪张卡片实施何种动作,以及这些动作的执行次序就是规则的设计空间。

Nightfall (2011) 夜幕降临 是一个打牌机制非常独特的卡牌构筑游戏。只要玩一盘就能感受到和 Dominion 的游戏感受非常不同。

这是一个以玩家之间混战为主题的游戏。和 Dominion 一样,计分也是做成卡牌会混入玩家卡组的。但和 Dominion 的玩家尽力购买高分卡片不同,Nightfall 的计分卡片可以视为负分。玩家应该避免把它加入卡组。它把玩家所受到的伤害做成卡片,一旦玩家被攻击成功,就需要加入伤害卡到自己的卡组。当公共卡池的所有伤害卡耗尽,游戏结束。私人牌组里伤害卡最少的玩家获胜。

伤害卡没有实际功能,在常规 DBG 中,这类卡会降低卡组质量。为了避免让领先玩家形成正反馈,所以游戏加入一条规则,只要手牌中有伤害卡,每张都可以再抽两张手牌。但每个回合只能执行一次,即用这个能力新抽出来的伤害卡不可以继续额外抽牌。

夜幕降临打出卡片采用了一个独特的六色轮系统。每张卡片属于六色之一,并有一到两种后续关联颜色。玩家每个回合需要按颜色连锁出牌。例如,一张卡片的颜色是红色,连锁色是蓝色和绿色,那么打出这张卡后,可以再打一张蓝色卡或绿色卡,而不能打出其它颜色的卡片。每张卡片上还有激活颜色,如果符合上一张打出卡片的颜色就可以获得额外的能力。一套连锁打出后,连锁效果以反向次序结算,即最后打出的卡片最先结算。另外,游戏对连锁机制还做了一个巧妙的设计:当一个玩家无法进一步连锁出牌,其它玩家可以在该玩家的回合内加入连锁。也就是可以在对手回合出牌。

连锁机制在传统 TCG (万智牌)中非常常见,而在 DBG 里比较少见。这恐怕是因为 DBG 比较注重构筑过程,所以一般游戏会设计一些资源卡用来实现从市场买牌的构筑过程。这种发展过程在 TCG 中是比较弱化的,且预先组好的卡片也更容易实现玩家的连锁目标。如果在 DBG 里实现同样的效果,就需要让更多的卡片参与战斗功能,卡片的能力之间也不要差距太大,方便玩家构筑套路。

夜幕降临去掉了纯粹的资源卡。每个回合都直接给玩家两点费用用于购牌。额外的费用除了放在部分卡牌本身的功能上,也允许玩家通过弃手牌的方式换得更多资源。用手牌做费用的方式我最早在银河竞逐中见到,这是一种不错的设计,能提供给玩家更多决策空间:是在当回合打更多牌出来,还是留一部分牌用于发展(购买新卡)。

夜幕降临玩起来非常激烈。和传统 TCG 不同,打出的仆从卡在下一个回合必须尽数用掉,只做一次性攻击结算后就进入弃牌堆。这相当于每个回合把牌打到桌面,固定结算一次连锁效果后,再延迟发挥一次攻击能力,待到轮回到自己行动时,桌面卡片就全部退场,玩家重新部署新的卡片。玩家每个回合都需要选择铺场,节奏很快。

值得一提的是,夜幕降临除了后续扩展包扩展规则外,在 2024 年以这个核心规则重置了一款新游戏 Unchained (2024) 。虽然是重置,但还是改变了不少细节。我觉得最值得一提的是市场机制从类 Dominion 的固定市场改为了像 Ascension 那样的随机市场,但并不是简单的只是从一个市场牌堆中随机抽出排成一列。

老的 Nightfall 的市场是以玩家一开始轮抽的方式决定 8 种公共市场牌堆和 2 种私有市场牌堆。除了私有市场的设定相比 Dominion 增加了一些变化外(放置玩家之间模仿别人的构筑方法),基本还是考验玩家以对卡牌的理解在开局时做出的策略规划。

而 Unchained 改用了 3x3 矩阵方式的市场,从洗乱的市场堆中铺满 9 张卡片供玩家选购。卡片的费用被简化为两级,普通卡和稀有卡。玩家必须先花一点费用从任一行或任一列中购买一张普通卡,然后才能再花两点费用从同一行(列)中购买第二张卡。只有第二张卡才能选择稀有卡,第一张不行。另外,游戏加入第二种资源 Talent 天赋点用来购买额外的卡片(不限制在同一行)。购卡费用还可以用来刷新市场,每点费用可以用来刷一行或一列,只要费用足够,可以无限执行。当市场卡堆耗尽,会洗牌重建。

据说这个设定来源于奥法之战 Res Arcana (2019) 的一个玩家变体。btw, Res Arcana 是我最喜欢的卡牌游戏银河竞逐作者的新作,虽然不属于 DBG ,但也是一个得分引擎构筑游戏。其玩法也值得一书。留到以后再记录。

Unchained 还放弃了固有的起始手牌设定。在 Nightfall 中,起始手牌用过一次后都会销毁,作者本就不打算让玩家在游戏过程中依靠它们,只做游戏初期启动使用。Unchained 干脆去掉了起始牌组,让每个玩家从普通市场卡堆中随机抽 5 张的方式作为起始手牌。这应该也是因为这个游戏重在卡片组合,Unchained 重新调整过平衡后,单张卡片强度差别不大,所以不必过于强调起始牌组的对称性。同时也进一步加快了游戏节奏:第一回合就可以打出丰富的行动。

还有几个小改动值得称道。

Unchained 的所有卡片都去掉了文字,只使用符号。这说明游戏不需要设计一些特殊卡片能力来平衡游戏。

每次玩家抽牌堆耗尽冲洗弃牌堆时会加入一张伤害卡,这应该是为了平衡玩家对卡组极端瘦身,只使用几张卡片循环游戏。

Nightfall 继承了 Dominion 的设计风格,尽可能把一切都设计成卡牌。比如计算卡片伤害就是通过旋转桌面上的卡片来表示的。Unchained 放弃了全部使用卡片这个追求,回归到传统使用不同的 token 来计量伤害和防御,购卡用的两种费用也改用 token ,可以累积。在 Nightfall 中,和传统 DBG 一样,当回合的购牌资源不用即废;而在 Unchained 中则可以通过 token 累积。

卡牌构筑类桌游核心规则之一

现在有非常多的桌面游戏加入了卡牌(卡池)构筑的游戏机制,用来丰富游戏玩法。我想总结一下以卡牌构筑为核心玩法的若干经典桌面游戏的核心规则。要记录的游戏太多,所以我会分成多篇 Blog 来写一个系列。这是第一篇,从历史最为悠久的经典游戏写起。主要谈以卡牌构筑为核心,而没有混杂太多其它机制的游戏,列出其具体的核心规则方便日后参考。

首先是开山鼻祖 Dominion (2008) ,官方译名皇舆争霸,在出中文版之前我常称之为领土。它奠定了此类桌游的基础模式:从一组功能简单的手牌开始,在游戏中不断购买新卡加入自己的卡组,在后续回合中这些更为强力的卡牌可以完成更多行动或积分,玩家尝试比对手获得更多 VP 取得胜利。

Dominion 起始牌组 10 张,7 张价值 1 的钱币和 3 张 1 VP 积分卡。玩家以 5 张手牌开始,在回合结束弃掉所有未用手牌重新摸 5 张手牌。VP 卡只用于终局计分,在游戏过程中没有用处。钱币卡可以用来购买公共市场中的 10 种每局游戏不同的功能卡以及每局游戏必有的价值分别为 1 2 3 的钱币卡,价值为 1 3 6 VP 的计分卡。每回合未用完钱币同样不累积到下一回合。新购买的卡片置入弃牌堆,不能立刻使用。

玩家在回合中默认可以打出一张功能卡并购买一张新卡。单功能卡的效果可能扩展这个能力,允许玩家在一各回合中打出多张功能卡,或购买更多新卡片。回合中打出的卡片不会立刻进入弃牌堆而是停置在桌面,直到回合结束才进入弃牌堆。所以即使玩家的行动让他能够在回合中不断抽卡,也无法无限循环。

游戏在公开市场的部分卡片或 6 VP 卡片购买完毕后结束。结束后以每个玩家牌库中 VP 数量决定谁是胜利者。

Dominion 出了非常多的扩展,这些扩展在核心规则上添加了很多变化。大多数扩展一开始就设计好了,并非逐步发展出来的。把复杂的规则拆分到本体和扩展包中似乎是桌游常见的创作手法。这可以让玩家不要一下接触太多概念,还可以增加整体销量,可谓一举两得。关于 Dominion 的创作过程,推荐作者自己的记录 。里面可以看到一些有趣的东西,比如,把 VP 做成卡片我觉得是神来之笔,因为在此之前我玩过的其它桌游中,VP 都是额外计分的。这种做法可以一定程度抑制领先者的优势(获得更多 VP 的玩家,牌库也会变差,可能摸到无用的手牌);但作者的说法是,这并不是主要的设计目的,而存粹是觉得做一款一切都是卡片的游戏符合他的审美。

Dominion 没有单人玩法,所以规则都是围绕玩家竞争设计。本质上玩家需要根据每局游戏不同的 10 种王国卡(功能牌)构想最佳的得分引擎。但王国卡和 VP 卡的总张数有限,所以针对公开市场种卡片存量这个稀有资源,制造了游戏进程中的竞争关系。通常对手都慢慢发展,你也可以慢慢发展;一旦对手加速,你也必须加速(即使卡组尚未达成最佳构想)。当然游戏中也设计了交互卡,可以干扰对手的行动:基本套路上让对手弃掉手牌或加入诅咒卡(降低卡组品质并减 VP )。

我曾经玩过上百盘 Dominion (以及 2011 年前发行的所有扩展),非常喜欢。它的核心规则非常精巧,可谓增之一分则太长,减之一分则太短。让人觉得这个游戏就应该设计成这样。这是一个考验玩家对王国卡组合的熟悉程度的游戏,很多组合是作者精心设计出来的,但有些也是临时组合在一起发生的化学反应。抽卡的概率让合适的卡片买齐了却组合不到一起,或是以极小的概率形成一次大爆发。

我认为在本质上它和传统 TCG 是共通的。传统 TCG 是用地牌或自增长水晶来推进游戏进程,开局只能打小费用卡片,慢慢可以打出强力卡;玩家可以选择先积累发展用的能力,也可以牺牲发展来获得立即收益。DBG 则是通过从卡池购卡完成这个递进过程的:先用低效卡片购得强力一些的资源卡(比如银币),让获得高费卡片更快一些,也可以更早去抢功能卡。我们可以把 DBG 的市场卡看成是 TCG 中的强力卡片,玩家多了一种控制抽卡概率的能力,可以控制在什么时机点把什么卡片加入后续的抽牌中。DBG 比较依靠卡组循环,打出的卡经过一轮循环又可以重新使用。我觉得这可以看成是行动卡的 CD :因为强卡多半是游戏中后期购入,这时玩家卡组也会比较大,可以视为 CD 更长。而前期卡片循环更快,可以重复使用的次数也就更多。有了这种在游戏过程中的购牌和卡组循环机制后,DBG 就可以去掉 TCG 中常见的卡片打出费用的设定了:因为强力卡及强力 COmbo 在游戏前期玩家无法(购得)打出,后期打出频率降低。


接下来是 Ascension (2010) ,暗杀神。我认为它不是简单的 Dominion Like ,而是做了极大的变化,但依旧还保持着 Dominion 最核心的卡牌构筑机制:在不太长的单局游戏进程中,玩家从公共市场中选择更强力的卡片完成中后期的游戏进程。和 Dominion 一样,我同样认为其本质还是围绕公共市场的牌构成的卡池,玩家控制卡牌出现的时机(购牌)和概率(组卡),看谁能更高效率的得分。

不同点在于,每局游戏 Ascension 的总卡池信息对玩家部分隐藏了,而不像 Dominion 那样 10 张王国卡随机组合后一开始就展示给所有玩家。Ascension 的公共卡池是在游戏进程中逐步展示给玩家的。

暗杀神的 VP 不以单独的卡片呈现,附在功能卡上。但卡片设计还是符合高分卡能力低的规律。它有额外的独立积分 Token 可以累积,不会影响玩家卡组质量。游戏结束条件也设置在总 VP Token 消耗干净的那一刻。

Dominion 只有金钱一种资源用来购卡。虽然 Dominion 在前,但单资源的设定我认为更少见。过去很多桌游中都会设计不只一种资源并加入资源转换的途径,这样可以制造更多变化供玩家选择。Dominion 的作者也提到,设计之初其实是有多种资源的,只是最终的版本看起来更好,至少不会让玩家抽到的手牌中有无用的资源搭配而过于沮丧。

Ascension 则不同,游戏内的基础资源被设定为两个:购买卡片的能量点和打怪用的战斗力。区分出两种不同资源的目的性很强:购买的卡片会进入弃牌堆,延迟发生效果并可多次使用;而战斗力用来杀掉公共市场区的怪物卡片,获得卡片上的一次性收益。这种一次性收益也常包括额外的 VP token ,但区别于被置入牌组的 VP 卡,它不会降低牌组质量,并同时推进游戏进程。

因为公共市场区是随机推进的,需要玩家主动消耗掉一张,才会抽出一张新卡,通过杀怪来刷新市场也是游戏中常见的 Combo 。

买牌获得延迟循环收益还是通过杀怪获得一次性收益,这提供给玩家明显的不同选择。另外,Ascension 的核心规则中还加入了建筑卡。建筑卡和其它卡片一样通过购买获得,但之后打出可以停留在桌面,为玩家提供后续的永久每回合收益。建筑卡可以避免抽卡的随机性影响,还能解决游戏后期卡组过大导致强力卡片能生效次数不足的问题。同时也在玩家交互中发挥作用,

Ascension 的卡片组合是预设的,一开始就被分为四组。同组卡片设计时就留有套路。到每局游戏中,随机性则体现在它们出现在公共市场中的时机并不确定。游戏也提供了固定可以购买的卡片:3 点能量购买的加 2 能量的卡(相当于 Dominion 中的银币);2 点能量获得 2 点战力;以及 2 点战力可以获得 1VP 的小怪。起始牌组为 8 张 1 点能量卡以及 2 张 1 点战力卡。

Ascension 在之后的十多年中也出了大量的扩展,添加了很多玩法。作为一个历史悠久,一直在发展的游戏,平衡性公认做得不错。我没有和人玩过实体版本,但玩过电子版多盘(steam 上有),感觉很不错。我想给它的核心规则一个高分,和 Dominion 一样,属于规则简洁没有冗余。

Ascension 也是为多人竞争而设计的规则。因为公共卡池随机刷卡,同时展现的卡片种类有限,具有时效性。所以玩家抢夺公共卡池更为激烈。相较而言, Dominion 更提倡玩家提前规划,玩起来也更容易自闭(自嗨)。但 Ascension 更容易设计出系统对手,只要以一个固定规则销卡和得分,压迫玩家尽快完成游戏即可。官方规则书上提供了一个单人玩法,也有社区玩家设计的更复杂的单人游戏变种(MO's REALMS SOLO VARIANT)。

Ascension 提供的新设计思路不错:让玩家在获得一次性收益还是持久循环收益上做选择。卡池的组合提前设计好,但是否能在游戏局内达成则受卡池抽牌的随机性影响。市场的短期时效性增进了玩家的竞争。杀怪产生的一次性效果也多了一类 Combo 路线。


Star Realms (2014) 星域奇航 明显受到了 Ascension 的影响。

它把游戏改为了两人对决(变体可以扩展到多人游戏),胜利条件转为了战斗,攻击对手的 HP 。这让游戏玩法更接近传统 TCG :铺下仆从,攻击对手,尽可能减少对手 HP 。

游戏以 8 张 1 块钱卡片和 2 张 1 点攻击力卡片作为起始卡组,这和 Ascension 完全一致。固定市场被简化为 2 块钱(废弃时 2 点攻击)的一种卡片。而游戏的公共市场设定基本和 Ascension 一样,但因为它不再是杀怪得分了,所以市场上没有了怪物这种获得一次性收益的卡片,全部是可购买后续使用的手牌。建筑卡变成了传统 TCG 中的仆从卡,可以用来攻防。但持久收益和一次性收益的选择被保留下来,卡片可以选择打出发动效果回到弃牌堆循环使用,或是废弃卡片获得额外的一次性收益。

星域奇航以攻击目标 HP 为目的的胜利条件很容易改造出单人玩法。我玩过扩展包中的几种单人任务,感觉还不错:设定一个 BOSS 和一种攻击方式,就可以用一种不对称规则来以打败 Boss 为目的进行游戏了。


Clank! (2016) 我认为在卡牌构筑部分的核心规则也是 Ascension 的变体:在一列随机不断抽出的公共市场列中,玩家选择购买强力卡片后续使用,或是获得即时的一次性效果。

但 Clank! 添加了不少版图移动玩法,不是一个存粹的卡牌构筑游戏。我也只读过说明书没实际玩过,所以这里不多做介绍。

Clank! 把重心从玩家间对抗转移到了对抗系统,我认为这个方向很适合向单人或协作型游戏的。

之所以每每强调单人玩法,是因为我做此记录的动机在于给我自己在设计的电子游戏做参考,而单机电子游戏很少考虑玩家间对抗规则。而桌游玩家反而多考虑多人竞争的游戏模式。事实上 Clank! 已出了以玩家协作为主,有传承机制的版本 Legacy: Acquisitions Incorporated (2019) 。


Shards of Infinity (2018) 继承了 Star Realms 的玩法,并有一些变化。

多了一种雇佣军卡片。雇佣军可以选择在买的时候立刻生效而不是先进入弃牌堆等后面抽到,但代价是用完后在回合结束时放回卡池底部而不进入玩家弃牌堆,且以后不可以再使用或购买。

增加了一种资源 Mastery ,可以视为经验点。Mastery 在游戏过程中累积,但并不会花出去。部分卡片在玩家拥有更高数量的 Mastery 后,可以发挥更高效力。比如每个玩家起始牌中都有一张卡片根据 Mastery 决定攻击力,当玩家累积到 Mastery 上限 30 后,这张卡的攻击力为无限大,也就是一旦玩家有 30 点 Mastery 并抽到这张卡就可以直接击败对手。

玩家手牌中如果具有盾牌标记可以用来展示防御(消减)对手的攻击。


下一篇我想谈 Nightfall 和 Legendary 系列。

卡牌构筑类游戏小结

这个月玩了许多游戏,有电子游戏也有桌游。主要是想更好的理解卡牌构筑类游戏的设计点,回答我自己在设计过程中的一些疑问。今天写一篇关于卡牌构筑类游戏的总结。

卡牌构筑类的电子游戏引爆于 2017 年的 Slay the Spire 杀戮尖塔(它或许受到了 2014 年 iOS 上 Dream Quest 的启发),启发了数以千计的类似游戏诞生。追其源头,是从更早的桌游开始。所以,我对这个类型的桌游做了一些研究。对于有兴趣的同学,我推荐 Youtube 上的 How to design a DECK BUILDING board game ,它做了非常不错的总结。我也是在看完这个视频后了解到一些过去没玩过的桌游。

桌游中的卡牌构筑机制,始于 2007 年的星际争霸。这是当年我最喜欢的桌游之一,曾经几个周末都和朋友玩它。它的缺点是需要特别大的桌面空间,还有几个肯花一下午时间玩上一盘游戏的朋友聚在一起。如今,大场地易得,玩友却几乎无法筹齐了。当时在玩的时候,尚未意识到其中的战斗卡牌玩法开创了一个新机制,只是觉得有趣:在游戏中,随着科技升级,可以从卡池中购买一些新的高级的战斗卡放到自己的牌库中,增加或增强自己战斗获胜的几率。这似乎是一个比扔骰子更好的随机方案,在此之前,同样需要花一整天玩的桌游 Axis & Allies ,就需要反复在骰子塔中哗啦啦的扔骰子。

真正第一个围绕这个游戏机制设计的桌游是 2008 年的 Dominion 领土。在领土之前,也有诸多用不同卡牌构筑成一个玩家自己的牌库的游戏。例如经典的万智牌和游戏王。但它们最大的区别是,万智牌这样的玩家牌堆构筑过程是在游戏开始之前,而领土这样的游戏是以固定几张基础牌组成的牌库开始,在游戏过程中逐步完善自己的牌库。这给了玩家全新的体验:不仅需要用精心组合的卡牌击败对手,还要选择合理的成长线路。在 BoardGameGeek 网站上,把万智牌的组卡机制称为 Deck Construction ,而将领土的机制归为 Deck, Bag, and Pool Building 。本文讨论的是后者,在这个机制分类中,构筑的是卡堆中的卡片还是黑布包里的指示物并不重要。它们都是把玩家每次选择的可能性放在一个黑箱中抽取,玩家可以自主的在游戏过程中改变这些选择的可能性:购买新的卡片、升级、销毁已有的卡片。btw, 玩万智牌的同学跟我说,万智牌玩家也不总是提前组好自己的牌去和别人玩,临时开包轮抽组卡也是一个特别流行的玩法。这个轮抽机制在 BGG 上被列为 Closed Drafting ,和它差不多的机制还有把卡片公开摆放在桌面上,玩家轮流选择,被称为 Open Drafting 。

Dominion 于桌游就像 Slay the Spire 于电子游戏一样,卡牌构筑机制迅速的启发了大量的新游戏,各种细节被不断的打磨、和其它游戏机制整合在一起。现在打着这个标签的桌游超过了 4000 个。为什么这个机制如此吸引玩家?我觉得卡牌构筑机制就像 RPG 游戏的升级过程,不同的是,成长的不是玩家操作的角色的各项数值,而是一组卡牌。玩家可以在短短的几十分钟内就能享受到这种成长过程。卡片又是一个极好的游戏规则载体:它可以把不同新奇的游戏元素写在卡片上,减少了玩家一次性学习全部游戏规则的成本。同时,抽取卡牌的机制让玩家同一时间面对的选择变少:玩家只能从手牌中的行动中做选择,而游戏本身却可以设计更多的玩法,却不需要一下全扔给玩家。相比传统的扔骰子制造的随机性,牌堆的管理给了玩家更好的掌控感:概率是不断变化的,可以随游戏进程被玩家操控控制。


卡牌构筑游戏发展的这十多年,围绕游戏过程中,玩家卡组如何升级,不断有游戏做出不同的尝试。

市场,就是玩家在游戏进程中可以获得更强力卡片的地方。最早的领土采用静态市场,游戏一开始就把 10 叠王国卡放在桌面,每叠都是完全相同的卡片。游戏的核心玩法之一就是每个玩家从这个市场购买卡片完善自己的卡组。静态市场的优点是增强了策略性。玩家在游戏一开始就可以考虑如何构建自己的得分引擎,每盘游戏都是在贯彻这个策略。这同样也可能是缺点:单局游戏内的变化不足。

马上就有很多游戏尝试使用完全动态的卡组:洗混一组各不相同的卡片,在桌上拍成一列,玩家可以自由选择购买。一旦一张卡片被买下来,就会从卡堆中再翻出一张新卡进入市场。通常,这个设计还会伴随着市场上卡片的动态成本:一般会让新翻出来的卡片成本较高,随着卡片被买走,大家不要的卡片会移动到低价区,甚至放上一些游戏内的资源在卡片上作为购买额外奖励。

完全随机的市场提升了游戏的多样性,也降低了策略性。尤其是单人模式下,很容易让赢得游戏变成看脸。所以,又有游戏尝试改进,混合静态市场和动态市场的设计:部分卡片是固定出现在市场上的,部分随机;或者把卡片分级分到不同牌堆里洗混;还有把市场上的卡片变成若干小组,只有一小组买空,才从未来市场由玩家自主选择新的一组卡片,等等。

购买卡片,从市场上摆放的明牌选择,也有游戏尝试变成在一个小范围暗抽。对于多人游戏,还可以设计为竞拍;或是针对不同玩家安排完全独立而不同的商店,这会强制玩家在同一局游戏中有不同的发展路线。每个玩家拥有独立的商店,也让玩家对战时,攻击对方商店中的卡牌成为一种玩法。

购买新的卡片在传统上会进入玩家的弃牌堆,需要玩家在用完当前的抽牌堆后才有可能使用。但也有游戏尝试购买卡后直接放在抽牌堆顶部,下个回合就可以使用,甚至直接进入手牌。为卡牌设计一个购买时触发一次性能力也是一个选项。由于桌游不同于电子游戏,需要玩家在完全熟悉规则后手动做所有的操作,所以设计更复杂的机制并不常见。在电子游戏中常见卡牌升级桌游中比较少见。但也有桌游会使用替换手牌的形式升级卡牌。

在卡牌构筑游戏中通常会设计一种货币用于购买新卡。领土采用的形式是金币卡,这种卡片除了购买新卡没有别的功能。金币不可跨回合累积,玩家可以购买单张面额更大的金币卡提升自己的购买力。也有游戏把货币变成 token ,允许玩家累积。在这种设计下,常见的是设计多种货币,并辅以某种兑换规则。规则一般不会让玩家累积太多 token ,策略点会设计在玩家需要更有效的积攒不同的 token 达成目标,兑换很多时候是低效的方案,让玩家不至于卡死。货币可以视为游戏中的不同维度的可以积攒的数值点。多种货币也可以让不同的牌组发展方向分散在不同点上,例如,买新卡使用一种货币、升级卡片用另一种、把弱卡移除游戏又是一种、战斗力、生命值都可以是不同的货币。在单人游戏 Legacy of Yu 大禹治水以及同一作者的 Shipwrights of the North Sea: Redux 中都有不错的设计。

也有不使用额外货币用于买牌的游戏。买牌的费用可以使用行动点或多余的手牌支付。这样,玩家在每个回合行动时就需要权衡是否需要减少本回合的行动去购买更强的卡为未来计划;或是需要扔掉未来机会和可能用到的卡片来支付购牌成本。

也有不通过商店购卡来改变卡组的游戏。比如 Coffee Roaster 咖啡烘培师,每个回合不断的从袋子里抽出 token ,可以合成、分解、保留代表咖啡豆的 token ,并在每轮结束时对本轮的 token 统一升值。当玩家自己决定结束这个过程后,再在最后一轮依次抽出 token 组成最终的组合计算得分。btw, 这种赌下一次抽牌会保持好运气的游戏机制被称为 press your luck ,过去在骰子游戏中用的较多,咖啡烘培师把它用在构筑类游戏中非常成功。同样成功的以 press your luck 为核心机制的电子游戏当属今年的最佳独立游戏小丑牌了,玩家需要通过有限次的弃牌出牌,尽可能的让牌型组成基础高分。


打牌环节也并非千篇一律。

典型的游戏会选择一张张卡片打出,每张卡片对应一个行动。多张卡牌及它们的次序往往会形成一个 combo ,获得比单张卡片效果更大的收益。但也有不少游戏设计成直接把一把手牌一次全部打出,根据其组合兑现效果。小丑牌就是典型。桌游中这两年评价很高的沙丘,也是会在回合结束时一次结算未打出的卡片上的整体效果。

对于单张牌的效果上,除了设计打出产生效果外,还可以把弃牌也设计一个效果。即,每张牌都可以有两个不同的效果(同时列在卡片上),玩家可以选择弃掉这张卡(不效果行动点)获得其中一效果,或是打出这张卡(消耗行动点或其它费用)获得另一个效果。这种多效果的设计,比较多见于有多种货币/资源设定的游戏中。玩家通常可以弃掉一些打不出的卡牌来换取一些不同的资源。

有些游戏还会设计超过两种使用卡片的方式:例如,打出并同时销毁卡片可以相比普通打出后回到弃牌堆的方式,多获得一些收益,可以让玩家杀鸡取卵来应对眼下的危机;支付一些费用把卡片打到桌面,让这张卡片在以后的游戏进程中持续发挥功能,或是在未来回合再使用它的一次性功能。

把卡片先打在桌面,之后再发挥卡片作用,这个点子比卡牌构筑游戏出现的更早。像万智牌和炉石传说等游戏,都需要玩家把随从牌先打在场上,再发挥作用。一些卡牌构筑类游戏继承了这个机制,但通常会做一些简化。这是因为,卡牌构筑类游戏,卡组是在单局游戏过程中进化的,把卡片一直留在桌面不太合适。Core worlds 就是典型,战斗部队卡需要消耗费用打在战区(桌面),之后在占领星球卡时可做一次性使用。但玩家不必在当回合使用,而可以选择保留在未来任意时机。在 Aeon's End 中,这个规则增加了变化。打在桌面的法术卡,可以选择放在 open 区一直保留到需要时使用,也可以用较小成本使用专注能力施法,但强制在下个回合结算,无法保留。

对于打出发生效果的卡片,传统的规则处理方式是暂留在桌面,待整个回合结束后同所有手牌一起置入弃牌堆,然后从抽牌堆补充固定数量的手牌。如果抽牌堆抽空,则重洗弃牌堆,形成新的抽牌堆。这里的每个细节都可以改变,尝试新的规则变体。例如:打出的卡片可以立刻回到抽牌堆,这样就让玩家在小牌组的基础上尝试更长的 combo ,同一个回合把牌组里的单张卡使用多次。还有许多游戏并不把抽牌堆重置为新的抽牌堆,而是把抽牌堆抽空作为推进游戏进程的一种方式,或是让玩家在抽空牌堆时直接失败。

还有像 Aeon's End 这样的游戏,完全不洗牌,需要完整决定每张弃牌的次序,待抽牌堆抽空时,直接把弃牌堆翻过来形成新抽牌堆使用。这虽然减少了洗牌带来的随机变化,但增加了玩家的策略深度:玩家需要一边打当回合的牌,一边为未来回合的手牌做规划。

传统游戏规则倾向于让每个回合相对独立,所以回合结束会弃掉所有手牌,下个回合再抽新卡。但也有许多游戏选择保留手牌,玩家需要做手牌管理。亦或是两者混用:玩家可以选择花掉一些费用保留部分手牌。有些卡片打出会有延迟效应,其效果是在下一回合发生。影响下回合的行动点、购买新卡的能力、抽牌数量等等。这样让回合之间构成更多的联系,玩家需要做较为长期的规划。


卡牌构筑游戏中,通常会设计一些对游戏进程没有好处,甚至是有负面作用的卡片,塞入玩家的卡组。以领土为例,得分卡只在终局积分时才有意义,打牌过程抽到卡组里的积分卡,纯粹是占据手牌位置,降低当回合玩家的能力。但得分又是游戏目的,玩家不得不购入计分卡。这种对游戏目标有高价值,但游戏功能为零或是很弱甚至负面效果的卡片,对游戏领先玩家有制衡作用。玩家可以是主动购入的,也会因为玩家间的交互行为被动加入(如领土中的诅咒卡)。在单人游戏中,也常见系统规则为玩家牌组添加许多这种负面卡片。

围绕这种负面卡片机制,很多后续游戏也设计出新花样。Heat: Pedal to the Metal 热力狂飙中的热量卡设计就非常有趣。这里推荐作者的设计笔记 ,值得一读。Heat 中的热量卡在回合结束后是不可弃掉的,需要特定的冷却行动才可以主动弃掉。所以,玩家在游戏过程中,累积了太多热量卡在手牌中,有可能面临整手牌没有行动卡可打(赛车过热),造成失控。同时,热量卡又是其它一些行动的费用,完全没有热量卡也无法让赛车跑得更快。这个设计真的是非常巧妙。


玩炉石传说的玩家都知道,并不是组足够多的强力卡片在卡组里就更强。反而强力卡组往往是牌的总数越少越好。所以炉石这类游戏会限制构成牌组的卡牌总数下限,而不对上限做限制。这是因为,卡组数量越少,手牌抽到计划内组合的概率就越大。但卡牌构筑游戏的单局游戏中,玩家卡组是不断变化的,通常以很少量的恒定基础卡组开始(传统上是 10 张),玩家需要不断的加入效能更高的卡牌,但又有一个渐进的发展过程。卡组瘦身 Deck thinning 是需要设计的玩法。大部分卡牌构筑游戏,玩家裁剪自己的卡组都是提升卡组质量的总要途径。

比较简单粗暴的方式是用购买新卡相同的资源去掉初期的弱卡,例如杀戮尖塔的核心规则里,就可以在商店花钱去掉不要的卡。把删除卡片的功能放在中后期的强力卡片功能上也是一种方法,或者放在游戏进程的阶段性奖励上。另一种方式是把裁剪牌组和得分结合起来,Dale of Merchants 商人谷里面玩家可以通过把一套组合集齐在手中 (Set Collection)然后移出游戏的过程即得了分,又对卡组瘦身。

并不是所有游戏都把 deck thinning 当作增强卡组的手段而鼓励玩家不断删除自己卡组里的卡片。比如在大禹治水中,更快的抽空牌堆意味着游戏进程加快,导致玩家没有足够多的行动次数来完成游戏。即使用不上商店中新卡片的功能,玩家也不得不持续购买新卡保持自己的卡组大小。同时,游戏规则也让玩家更轻易的永久移除卡片(获得临时的收益加成)。

毁掉卡片获得一次性收益这点,在单局时间较短的游戏中比较常见。这种游戏玩家往往洗不了几次牌,比如 Star Realms 中,每张卡片打出是选择进入弃牌堆还是移出游戏就是非常重要的决策点。


因为卡牌构筑这种机制非常受欢迎,所以慢慢的,出现了许多并非单纯围绕卡牌构筑机制的游戏。对于桌游来说,引入版图、棋子、这种混合机制的游戏就越来越多。基于版图的区域控制、走格子的竞速、工人放置都可以很好的结合起来。对于传统的领土类游戏,游戏目标通常是获得更多积分。但结合其它游戏机制后,游戏目标就多种多样了。

对于单人游戏(或多人协作)以及双人对战游戏,一种更常见的游戏目标是通过战斗击败对手。而战斗计量值是用 HP 衡量的。尤其是电子化以后,卡牌构筑类电子游戏大多数以战斗为主。使用不断成长的卡组,不断的击败一个又一个的 boss ,最终抵达终点,俗称爬塔。但也不乏星际孤儿和小丑牌这样桌游向规则的电子游戏。

同样是卡牌构筑机制,桌游和电子游戏有很多相似之处,却因为载体不同有很大区别。

我个人认为最大的差异是,玩桌游需要玩家先明白完整的游戏规则才可以开始玩,而电子游戏是逐步将游戏规则铺开的。这会带来很多设计上的不同。电子游戏会倾向于设计更多变化的规则,可以包含许多特例,因为它不必一次向玩家交代清楚。这些多半是为了增加玩家的沉浸感而设,也为了增加游戏时间。电子游戏玩家会更早更快的接触到游戏的核心规则,而主动忽略枝节问题,留待体验核心玩法的的过程种,同时慢慢学习新内容(如果游戏能持续吸引他)。过于简单缺少足够变化的游戏机制会让玩家提前流失。

桌游和电子游戏在交互上有很大不同。总的来说,电子游戏容易实现得比桌游对玩家更友好。程序会阻止玩家做不符合规则的行动,可以在玩家操作的过程中时刻给予反馈和提示。玩家能通过电脑的反馈来学习游戏规则(而不需要啃说明书)。但有些方面电子游戏也相对较弱,导致一些桌游电子化后反而体验下降。

例如,当同一时刻,玩家可以有多种选择时,玩实体桌游时,选择仅仅是玩家脑子里的一个念头,玩家很快就能决定哪一种生效。而电子化后,这些选择过程会变得非常繁琐。又比如,对于对战类卡牌,卡牌经常需要指定作用对象,在桌面玩的时候,选择过程非常自然,但在电脑上就会相当麻烦。对比炉石传说和万智牌,就能察觉到两个本质上相似的游戏,在规则细节的不同。

电子游戏的强项在于可以用程序辅助记录更多游戏信息。大多数细节玩家并不需要时刻关心,但需要时又可以随时关注。这些游戏状态信息背后的机制可以很复杂,但展现出来可以非常简洁。而在桌游中,任何游戏状态的变化都需要玩家主动跟踪。过于复杂的状态变化会极大增加游戏成本,还非常容易出错。

电子游戏还能非常自然的做单局游戏间的玩家成长,让玩家持续玩同一个游戏有不断的新体验。早期的桌游是通过设计不同的游戏难度来适应玩家的成长,而近年来传承类桌游部分解决了这个问题。这种桌游会额外提供一个剧本和若干传承道具。玩家每进行一局游戏,无论成功还是失败,都可以通过剧本推进游戏进度,逐个取出道具改变游戏规则,升级自己的角色。

一个卡牌构筑游戏的构想

这个月我一直在做具体的游戏设计。因为以前从来没有真正独立设计过游戏,比我预想的难很多。

上次提到 ,我想做一个基于卡牌构筑( deck building )玩法的 Roguelike 游戏,但并非杀戮尖塔这样的卡牌战斗 (card battler )游戏,而更接近缺氧这种生存建造为主的玩法。游戏的题材还是 之前的构想 :维护一艘太空飞船在银河中探索。

经过一长段时间的思考,在扔掉了成打的点子,本子上涂写了半本手稿后,我感觉在这个游戏的设计上又推进了一点,现在有了一些更具体的玩法设计。今天总结记录一下:

这是一份核心玩法的草稿:

在有限回合内,通过组合手牌中的配方卡和物资卡,进行物资转换,最终获取需要的推进点通关。同时需要生成食物点维持游戏不败(生存元素),并获取科技点升级卡组(卡牌构筑)。

游戏里有如下概念使用数字而不是卡片表示:

  • 食物:每天扣除,一旦归零,游戏失败。
  • 热量:控制一天(一个大回合)能执行的行动次序。超过这个次数会导致飞船过热,强制结束一天。
  • 能量:控制一天能执行的弃牌次数。
  • 推进:一个关卡需要的进度指数。
  • 科技:用来完善卡组,获得更高的效能。

游戏进程以关卡形式进行。每个关卡分为大轮(天),每天分为若干小轮。游戏过程比较接近小丑牌,大轮相当于小丑牌中的一小局,小轮相当于小丑牌中的一次出牌或弃牌行动。

在每个关卡开始时,系统会产生一些事件卡放入环境。事件卡是一种特殊的配方卡(后面会介绍),在使用掉之前,不会自动销毁。事件卡是游戏随机性和可重玩性的主要来源,玩家需要每局游戏面对的事件卡来做不同的决策。

进入关卡后,游戏进程为细分为天,每天会按以下步骤依次执行:

  1. 发电和冷却(后面会涉及电力和热量概念)。

  2. 生成玩家卡堆:

    • 依据飞船上已经安装的设施,生成若干配方卡。每台机器对应一张或多张配方卡。
    • 飞船上仓库中的物资提取为物资卡。
    • 讲配方卡、物资卡以及当前环境的事件卡放在一起洗混,生成这一天玩家可用的抽牌堆。
  3. 玩家以小轮打牌,每个小轮可做下列事情,不断重复,直到无法行动或主动结束一天。

    • 自动补牌到手牌上限。
    • 玩家选择若干张卡片。
    • 玩家可以选择弃掉这些卡片,同时补足手牌。所弃掉的配方卡销毁;物资卡回到仓库;事件卡回到环境。
    • 如果选出的卡片组合形成一个合理的配方(通常由一张配方卡和若干物资卡组合而成),则执行一次配方转换。事件卡、配方卡和物资卡销毁,配方结果对应的物资进入仓库。有些配方不产生物资,但产生推进点、科技点或食物,这些累加进数值条。
    • 对于每个弃牌操作,扣除一点电力;对于配方操作,增加一点热量。当电力为零时,玩家不可再执行弃牌操作,当热量达到上限,飞船过热,结束这一天。玩家也会有手段提前结束一天。
  4. 当一天结束,系统做一次结算:

    • 所有没用完的配方卡销毁,没用掉的物资卡回到仓库,但超过仓储上限,额外的物资会被销毁。
    • 扣除食物点,当食物到零时会输掉游戏。
    • 如果累计的推进点达到要求,进入下一关。
    • 玩家可以利用科技点制造新的设施。

这个游戏的核心玩法是资源转换。资源的原始来源是环境的事件卡提供的。执行事件卡上的配方(往往不需要原料),就可以获得一些原始资源矿石。飞船的设施提供了不同的资源转换能力。根据抽到的手牌,玩家可以选择和筛选要执行的转换公式。但因为原料是有限的,所以无法无限生产。

在默认规则下,一次物资转换的结果需要第二天生效(生成的新卡片不会立刻进入抽牌堆),所以玩家必须通过几个回合才能达到阶段目标。

玩家的转换目标分为三个方向:其一、维持游戏不输的食物点;其二、推进游戏进程的推进点;其三、用来更迭升级能力的科技点。玩家应该妥善分配这些原料,在不输掉游戏的前提下,尽快提高自己的转换效率,最近得到足够的推进点赢得游戏。

换句话说,这是一个基于卡牌玩法的资源转换游戏。游戏过程有点接近小丑牌(打牌,弃牌,寻找合适组合的部分);但目标并不是积分,而是通过高效的资源转换达成游戏目标。从这个角度上看,又有点类似香料这个桌游游戏。

玩家在短期行为上,和小丑牌一样,有累积卡牌获得更好的牌组和兑现现在的手牌,稳定当下的收益,这两个选择;在长期行为上,要决定是把资源分配在生存、还是发展、又或是推进游戏进程三个方面上。

我认为从这个角度看,核心规则是成立的,它符合席德梅尔所述:游戏是一系列有意义的选择。当然,是不是有趣,还需要做出来看看。


在这个核心规则下,有可能扩展一些周边系统,丰富游戏的玩法。例如:

  • 增加船员的设定,每个船员对应一些能力,矿工可以做更高效的矿石转换,机械师可以让不同原料相互替换,飞行员可以更高效的获得推进点,等等。船组的构成决定了食物的消耗。
  • 每张配方卡上有多组配方,玩家可以用单张配方卡搭配不同的物资卡组合,产生不同的转换效果。
  • 关卡条件更为丰富,不仅仅计算单一推进点数,而是需要更多生产出来的物资组合。
  • 事件卡兼顾战斗玩法。例如消除一张事件卡需要对应的弹药和武器;不消除的事件卡会对飞船造成破坏。

卡片的设计围绕配方设计来做。初期可能会参考异星工厂新资料片的太空设定,只有三种基础矿石:金属质矿石、碳质矿石、冰质矿石;从三种矿石中可以产生非常丰富的物资卡。矿石之间也可以通过配方相互转换。但受飞船设施槽位的限制以及仓库的容量限制,每天玩家的抽牌堆不可能太多,但是不同天之间的抽牌堆是不同的。玩家在每天完成一个小目标(比如冶炼矿石、直接中间件等等)。继而完成关卡的大目标。最终赢得游戏。

这会是一个有重玩价值的 Roguelike 游戏。一局游戏时长希望不超过 2 小时,最好可以在 40 分钟完成。反过来估算的话,大约是 100 个小回合左右。玩家在局内发展轨迹除了受随机的事件卡影响(事件卡可能会带来一些新奇的设施),还有一个规模不大的科技树。每局游戏玩家不能爬完整个科技树,但可以自主选择科技树的一部分设施发展路线。如何选择是由当局玩家碰到的事件及事件带来的不同收益决定的。


我知道设计好玩的游戏是件非常困难的事,这个游戏做下去很可能和上述玩法截然不同。不过没关系,就当是个开始吧。基于卡牌的游戏好处是不需要写复杂的程序实现,可以先动手做一张真正的卡片玩一下试试。

最近我读了一些关于桌游设计的文章和讲桌游设计的视频,非常有启发。下一篇 blog 会谈谈它们。

痛风

十月底的周末带娃去岩馆抱石时就觉得不太对。左脚的大拇指根部隐隐作痛,爬了几条线就歇着了。第二天自己去爬高墙,好像更严重了点,干脆回家休息。

这几年体检查出来尿酸过高(500+)。医嘱是注意饮食,已经没再喝酒,也不吃海鲜和动物内脏这些高嘌呤食物了,虽然我挺喜欢吃的。这次不算是第一次疼,去年疼过一天就好了。但这次比较严重。感觉和那几天有朋友从江苏快递了几只大闸蟹有点关系。接下来几天左脚明显肿了,几乎无法走路。脚很疼,不过尚在可以忍受的范围内,比不了那次尿道结石 的痛苦。我乐得在家打游戏,反正出门是不用想了。

果然和网上说的一样,大约 3 天就消肿,5 天左右就不是很疼了。走路时还能感觉到没完全好,但不影响出门散步。中间去岩馆了两次,爬些不太难的线路问题不大,但如果动作过于依赖左脚时,一发力还是有点疼。

上周末赵青约我去英西野攀,我估计问题不大。这周二出发。英西今年三月出了一起安全事故,一个商业团体阻止小孩攀岩时,落石砸死了下面的一个小孩。在餐馆吃饭时听老板八卦,事后带团的、学校、以及当地政府等几方一起一共赔偿了三百万,然后政府便禁止了野攀活动。最著名的大庙岩场被封了起来,运动攀线路上的挂片也拆掉。这事过了快一年,据说现在政策有所松动,明年或许能恢复。现在一些过去不常去的岩场也逐步恢复了。

我们依旧住在纹图石。周二只有我们两个住客,原计划上燕子岩的,老板 BoBo 推荐我们去小庙,她最近修复了那里的线路。小庙有五条线,5.9 到 5.12 ,线路比较简单比较适合我。下午她和我们一同去的。依稀记得十多年前来过一次,那时云豆还没出生,老婆还是女朋友,便在这里爬过。那天太阳很晒,我仰着头看着岩友磕那条 12 的线。而这次天气很好,没有太阳直射,甚至有点冷。我先爬了那条最简单的 5.9 线路,手指都是僵硬的,摸着石头完全没有知觉。下来后感觉身体热起来了,便试着右边难一点的。再爬之时,左脚一发力就感觉坏事,突然又感觉到那种钻心般的疼,左腿小腿一下就软了。线路没完成,下来就瘸了。

原以为休息一晚就能好。晚上九点就睡了,三点醒了喝了口水一觉睡到八点半。好消息是这次脚没肿,坏消息是脚趾似乎更疼了。周三我们上了燕子岩,Bobo 带的路,还借了把登山杖给我。我过去有一根,但不太喜欢用。这次发现有把登山杖真的能轻松很多。上燕子岩的山路颇有几分野趣,比上六盘山的牛鼻洞轻松很多,大约只有 5 分钟的山路。但不少地方需要手脚并用,爬起来兴致盎然。这天有珠海的四个岩友,两男两女,是岩馆的教练。带队的比赵青水平略高,这次来磕一条 13 的线;另外两人比我的水平好一些,他们头一天在磕那条 5.11b 的狼人,快挂都还挂在岩壁上。我试了一下,起步颇有难度,差不多是抱石馆里 V3+ 的线路动作。我左脚完全废掉,一点都吃不上力。只有这个时候才发现,平时虽然脚法不行,都没感觉到攀岩用到多少脚趾的力气,但真的少了个脚步支点,差别真的巨大。靠拉快挂,一步步几乎全程引体的方式顶绳分完了线路。琢磨了许多奇怪的动作,只用到右脚发力,或是用左脚挂脚。Bobo 在下面笑谈,如果我这样能爬完这条狼人,这条线可以考虑换个名字叫通风。

后来又试了一下右边略微简单一点(5.11a)的千里走单骑,少了左脚尖发力还是不太行。不过试了许多动作,很有启发。想起 2005 年在杭州时,岩友小 D 脚受伤了两个月,结果反而指力大涨。不少动态跳跃的动作都改为锁定完成。

一共在英西爬了三天。在左脚无法使用的状态下,还是顶绳摸了不少线路,完全超出了预期。希望下个月能康复,再去一次吧。

异星工厂太空时代游戏总结

在马山攀岩的最后一天,异星工厂的太空时代扩展包发售了。回到家中就开始玩,肝了 300 个小时,前天晚上终于通关了。准确说是系统告诉我赢得了游戏,但我知道后面还有很多事情要做。和原版一样,虽然发火箭名义上赢得了游戏,但白瓶科技是在火箭之后才有的;这次抵达了星系边缘就告诉我赢得了游戏,但钷素科技包(黑瓶)的原料都没见到。不过,我得暂时放一放,最近在这个游戏上花掉了所有时间,都没做别的事情。先写一篇总结,最近的体验太多,需要记录一下。不然热乎劲过了就忘了。

虽然太空时代最精彩的部分在五个风格迥异的星球,让玩家体验不同的方式玩这个游戏。但我想先谈谈 2.0 在基础系统上所做的工作。


去年我们做 Red Frontier 时,我就想去掉玩家操控的角色,以上帝视角来玩游戏。

虽然过去异星工厂也有 Brave New World 这样的 Mod ,去掉了玩家角色,但所有的操作都是通过无人机完成的。我试过一下,相比有玩家角色,它的操作并不舒服。虽然在游戏初期,操作一个 Player 在地图上跑来跑去有点烦,但真去掉了这个 Player 反而不知道游戏该怎么玩了。我觉得是因为通过无人机下达指令,反馈不够即时,这有点像 RimWorld 或缺氧那样控制工人间接完成任务,玩起来总有点别扭。而操控 Player 虽然有跑路的烦恼,但同时也限制了同一地点能做的事情。在同一时间,玩家的选择变少了,精力可以聚焦在有限的选择上。

其实在原版异星工厂中,通过雷达(开启远程地图上的视野)、布置无人机平台和维修无人机(用来代替玩家的建造操作),再放几个黄箱(用来做物流中转),玩家几乎可以做任何远程操作。再有只机器蜘蛛,几乎不需要 Player 到场。但实际上我玩的时候,还是需要指挥小人去到每个场地(尤其是在太空探索 Mod 中)工作。这次的 Space Age 这个扩展包专门为太空平台设计了专门的远程操作模式,很好的回答了该如何设计无角色模式该怎么交互。

我觉得这个模式的创新玩法在于禁用了无人机,同时没有了箱子作为物流中转,整个基地(太空平台)只有一个大的枢纽(唯一储物箱)。这个枢纽就像是 Player 的背包,在手操时,玩家有且只有它做中转地。这就极大的减少了手动控制上的选择:

  • 枢纽(以及所有箱子)中的物品都是自动合并,自动排序,不再支持手动指定每个格子。
  • 点击有物品的物品格,就可以把物品转移到枢纽中。
  • 选择面板上的物品图标,再点击目标格,就可以把对应物品从枢纽移到对应位置。
  • 拆掉建筑时,建筑及其建筑的附属物品回到枢纽中。
  • 如果操作会向枢纽转移物品,这时若枢纽空间满,这个操作会被挂起(界面显示一个红叉),直到有足够空间才会继续。
  • 某些物品,例如矿石,设定了间接转移时直接销毁属性。即,如果一个操作本应间接导致这个物品应该回到枢纽,就销毁它。这防止了拆除一条装满矿石的传送带因为枢纽空间不够而拆不掉。

一开始玩的时候可能还不太适应,但熟悉了以后还是挺方便的。或许这个模式还不够好,但我看来(尤其是自己设计过一版)已经尽最大可能把各个方面都照顾到了。我曾经想在我的游戏中设计一个类似的东西,改了三四版都不太满意。


液体在原版中我觉得有缺憾,尤其是太空探索这样的 Mod 大大增加了液体的总类数量,在太空平台上经常报告因为会连接不同液体而禁止修建一节管道或带液口的机器,烦不胜烦。而实际上因为有多种液口的机器在修建后是允许旋转的,事实上又可以把多种液体管道混接在一起,一不小心就让水管中充满了油。我在自己的游戏中也尝试改良过几版液体管道的交互,最终也不算满意。

我对异星工厂 1.0 的流体系统有过深入研究 ,自己实现过一次,知道这个问题不太好解决。

这次太空时代给出的答卷是,去掉修建时检查不同液体连接的限制,让玩家自己处理液体混道的问题。同时在水泵上增加了过滤器,帮助玩家处理这个问题。我试了一下在太空平台上利用两条主管道(一进一出)联通平台东西两区的三种液体,加了很少的信号控制就可以完美工作。这让人感觉,2.0 简化了流体规则 是有意义的。我认为最大的意义就在于此:把 1.0 中难以预测(但看起来更真实)的流体行为变得更加确定,玩家可以在确定性上自己解决复杂的流体混道,实际上扩展了玩法。这次的混道控制其实在 1.0 中也是可以通过信号控制完成的,但不够确定(尤其是用水泵抽干管道中的液体方便引入新液体无法准确控制)所以事实上没人会如此操作。


2.0 这次极大的增强了信号控制。作为老玩家,迟早会用信号控制来实现复杂的自动化。我一开始就按 1.0 的思路去做信号控制,玩着玩着才发现 2.0 提供了更多便捷。

信号线以及电线不再需要消耗实体物品,这在搭建信号网络时少了很多烦心事。

新增了选择运算器可以直接对信号排序,筛选出指定信号,这个在实现回转寿司带时简直是神器,再也不用连一大堆比较运算器了。原本有蓝图支持,设计好一些控制模块也不是难事,但在太空平台上寸土寸金,能用一个原件就解决问题简直是太棒了。而传送带也可以以整条为单位读取信号,再也不用一节节的连接信号线。过去要摆上一大摊才能把多种物品混装在同一条传送带上,现在只需要两三个元件,简洁了很多。

回转寿司带的要点在于不用装满、每种物品都有一点,这样才能让不同机器都可以共享物流。多用于制造效率要求不高,但种类很多的场合。太空平台上使用它可以让布局紧凑美观。因为太空平台上禁用了无人机,而箱子只有唯一枢纽,最多就 32 个口。如果想扩展储存空间还需要占用 2 个。做个复杂工厂需要仔细计算枢纽的每个出入口的使用。过去用两个长抓可以从一个出口分出两种物品,而 2.0 中可以直接通过信号控制爪子的筛选器,方便了很多。理论上可以通过信号控制从一个出口拉出任意种类的物品,用过信号后,我在游戏中几乎不再直接设置爪子的信号条件了(直接把条件放在外面,控制爪子的过滤器更有弹性)。

这次可以从机器读到更多信号:包括爪子的抓取物、机器的储存箱、核电站的温度等等,大大简化了过去需要通过间接控制去构造的复杂机构。例如以前想节约使用核燃料棒(不烧过头)何其麻烦,现在直接读取核电站的温度和储备燃料数量就够了。

同时,2.0 又可以用信号控制更多事情,而不仅仅是开启和禁用机器。生产机器甚至可以用信号去换配方,可以实现在太空平台上用几个机器生产多种类物品。由于更换配方也变成了自动化的一部分,这次的机器的基础设定也完善了。过去每个机器只有燃料箱、输入箱和输出箱,分别储存燃料、原料和产品。这次增加了第四个回收箱,用来保存由于更换配方导致的多余不用的物品。回收箱我在设计自己的游戏中也有类似设定,但没有异星工厂 2.0 中的规则完善。


以上是我对 2.0 核心系统的改进印象最为深刻的部分。其实还有很多交互上的小细节(QOL),大大提升了游戏体验。例如物流在视觉上的呈现,地下管、液管的连接都可以一目了然;蓝图提供了参数化控制;火车可以远程驾驶;无人机建造过程增加了强制替换指令等等。数不胜数,无法尽数列出。

下面再谈谈太空时代增加的新玩法。


品质系统准确说并不是 2.0 的核心系统,准确说是作为一个 Mod 的形式引入的。品质系统有人爱也有人恨,总的来说我是很喜欢的。

  • 通过品质插件,有概率得到高品质的产品。
  • 全部用同一品质的原料可以制造出相同品质的产品。但配方必须准确指定品质。
  • 液体没有品质。
  • 高品质物品能扩展某种特有属性,比较有用的有电线杆,可以通过提高品质增加覆盖范围与连接距离。在太空探索 Mod 中,远距离大范围电线杆深得我的钟爱,这次通过提高品质实现了。个人装备的品质提升增加了我的不少游戏时间:武器可以提升射程、无人机平台可以增加直接控制的无人机数量等等。

和大多数游戏的相同物品升阶系统不同。很多游戏可以通过巨量低阶物品合成相同的高阶物品,但品质系统的品质提升是在生产环节中进行的。对喜欢大规模自动化产线的爱好者来说,品质插件就是毒药。因为原本生产线最难处理的就是副产品,而品质插件的引入相当于给每个环节都增加了相当多种类的副产品:虽然手动操作时,低概率产出的高阶产品是个欣喜,但高阶原料是不能在低阶配方中使用的,掺进一个就会堵住产线。这是自动化线最不想要的。

而稳定生产特定品质的产品需要一致品质的原料。由于高品质原料的产出不确定(概率决定),所以规模化下难以计算。

流体无品质的设定是神来之笔。因为在生产链上只要有一个纯流体原料的产品,就无法靠输入稳定品质的原料得到稳定产出。例如钬板只靠钬溶液生产,而钬溶液通过钬矿石熔炼。这就导致了高品质钬矿石其实对生产高品质钬板毫无作用,反而需要大批化工厂分门别类的熔炼钬矿石(每种品质矿石处理需要针对品质的配方)。

品质系统很好的为游戏提供了“多种有意义的选择”。

玩家可以通过漫长的生产链,在每个环节上增加品质插件,各个环节都有机会提升下一级产品的品质,但增加了产线的不确定性导致设计产线的难度;也可以先批量生产固定品质的原料,再用稳定的方式合成同品质的下一级物品。

加入回收机的设计,即可以逆转大多数配方,以 1/4 的概率返还原料,为玩家设计超长产线提供了可能。玩家可以无限次的生产、分解物品,在这个过程中缓慢提高品质,同时不产生太多低品质副产品;也可以通过扩大低品质产品的生产规模,精选出其中高品质产品,这个过程需要的产能小得多,但需要额外考虑低品质产品如何消耗以适应自动化生产。

在游戏过程中,明显可以感受到获得不同物品的高品质版本的方法不同。不是简单的想办法得到一批高品质原料、如传说级铁板、铜板、石料就可以加工出一切传说级物品的。前面提高用钬溶液阻断钬矿石和钬板之间的品质生产链就是一种手段。

而像制造生物实验室的异虫卵、制造蜘蛛的鲜鱼、制造装甲的核燃料,获得这些原料的高品质版本都非常困难。以至于有个成就是“吃下一条传说级的鱼”目前几乎没看到有人达成。


太空时代本质上是建立在核心系统上的官方 Mod ,这和玩家 Mod 并无区别。让核心系统围绕 Mod API 进化而不是不断在核心上增加新的游戏内容,是异星工厂最为独特的地方。

玩家一砖一瓦搭飞船去不同星球探险,这个主题并不新鲜。太空探索这个 Mod 把这点实现的相当好。迷上异星工厂,我就是从太空探索 Mod 开始的。但这次官方的太空时代并不是太空探索的重复。太空时代想提供给玩家的,我认为是:对于不同的基础条件的环境,应该如何建立起可以加入太空物流的自动化产线,把这个环境下的独特产品输送出去。

相比太空探索,太空时代完善了飞船运力设定。没有太空探索中的轨道物流,一切只能靠火箭。计算太空物流成本贯穿游戏始终。这也为不同星球不同环境的经营奠定了基础。如果物流太廉价,不同环境就没有了区别。

太空时代提供了五个截然不同的环境。

新地星就是原版的环境,有无限的水,无限的地盘,生产会导致污染引来虫子的进攻。玩家需要以铁、铜、石、油四种原料为基础建立起产线。但为了加快玩家融入核心玩法的速度,太空时代大幅度的简化了新地的科技树。现在只需要研究到第三种科技瓶蓝瓶,即开采了原油后就可以发火箭上天了。配方上也大大的简化。但同时把高效的防御手段(重炮),改造地形的能力(悬崖炸弹)从前火箭时期去掉,移到了太空时期。

原本的 1.0 里,不加 Mod ,不做千瓶工厂,原版的生产线就不难搭建。而这次太空时代中,初期在新地游戏,更是轻松了许多。

新地星的发展最重要的是解决两个问题:电是怎样来的,怎么平衡污染导致的虫子进攻强度。电的问题大体上有两个方案:用大量地皮铺设太阳能板和开发核电站。玩家在这里可以做出截然不同的选择,占地面积大导致需要防守区域更大;核电站的设计有很多乐趣和变化,但不如太阳能农场易维护。尤其在太空时代里,太阳能版和电池的生产配方简化了不少,量产非常容易。而发展核电的难度则相比 1.0 并没有简单太多。

雷神星、祝融星、句芒星三者是并行开放的,玩家可以自由选择次序。先开发哪一个,都可以对另外两个的开荒有额外帮助。这比线性选择好得多。从这点上,看得出来受太空探索的设计思路影响很深。但太空时代为不同星球提供了完全不同的游戏环境。

在雷神星,电力几乎是无限的,而水变成了珍惜资源。取代水的是无限的重油。这让游玩思路发生巨大的变化。更重要的是,生产线倒了过来。在这里引入和回收机,用来逆向所有的生产配方,当铁板是从齿轮逆向出来、铜板来自于铜丝、蓝片和红片变得廉价,绿片变成了生产链的末端,一切都不一样了。

雷神星的游戏主题是副产品处理。矿产原料一下就给了 12 种,如果在生产链的前端加入品质插件,那是海量种类的原料。处理多种原始矿产这个主题,我在太空探索的地核钻机中玩过。如何消耗干净所有的矿产是个很有挑战的玩法。

祝融星也缺水,但铁铜石这些原料变成了几乎无限。从岩浆提取出铁水和铜水,同时副产品产出石头。基于流体原料搭建产线很不一样。这个思路可以一路延申到太空平台上:太空平台只有枢纽一个储物空间(但后期增加了传送带的堆叠上限后,也可以看成是箱子的等价物),但液体可以分门别类用不同的管子储藏。而锻造机本身也可以作为一个大型容器使用,在太空平台上,使用铁板的产线可以围绕一个生产铁板的锻造机建设,而铁板锻造机之间则可以用管道联通。

祝融星开荒最大的挑战是撼地虫。这个概念明显来源于沙丘。在开荒初期,玩家开着车跑去矿区,蓝图一铺开始采矿;人得照看着,虫子一来,赶紧拆掉矿机跑路。这个时候,连背景音都是咚咚咚的沙锤声。

干掉掘地虫同样有很多不同的选择。它的电击抗性比较低,如果先完成了句芒开荒造出特斯拉武器会简单一点。但我的选择是从新地运来铀矿石合成原子弹,一发致命。在原版游戏中,我几乎没有制造过核武器,这次终于派上用场了。

句芒星加入的变质系统是三个星球中(我认为)最有趣的。简单说就是句芒的大部分本地原料和产品都是有时效的,过期不用就会变成另一种东西。这带来的产线设计思路上很大的不同。过去简单的把原料往传送带上一堵,只考虑带子和爪子这些物流元素的带宽已经行不通了。需要仔细计算物流时间。

大多数东西是越新鲜越好,需要防止变质。不新鲜的东西制造出来的东西也不新鲜,生产链一长,最终的产品科技瓶的保质期就会大有不同。再加上太空物流时间,抵达新地科研时的效能会大打折扣。像虫卵这样的东西,变质后变成虫子会更加麻烦。句芒和新地不同,虫子几乎是不会主动骚扰你的,变质产生的威胁才是主要需解决的问题。而另一些东西又需要变质产物,比如铜矿和铁矿,就是细菌变质来的,还需要专门用一个容器等待它变质。

从空间到时间的产线搭建思路是个巨大的转换,带来的游戏体验非常不一样。在游戏的中后期,跨星系工厂的整体自动化运转,最需要玩家关心,不断检查的就是句芒星这个环节。

另外,在句芒星开荒时,电力非常有限。农业产能却是无限,不需要考虑其它环境中矿采光了需要开新矿的问题。大部分的机器都是靠额外的营养素而不是电力驱动的。这有点像原版中前电力时期的燃烧机。这种不依赖电网的玩法过去在一些 Mod 中很流行。著名的工业时代就是用管道蒸汽驱动蒸汽时代的。而用传送带输送营养质,同时考虑营养质变质问题比管道蒸汽更有挑战也更有趣。

最后的玄冥星开荒,我玩的时候最为容易。主要是有先玩的玩家告诉我很难,我做了非常充分的准备,反而很轻松的渡过了开荒期。

前几个星球开荒,如果飞船从外部做一些补充可以跳过很多难的部分;但什么都不带,从降落开始从零开始建设也是可以挑战一下的。但玄冥星必须从飞船上空投资源。尤其是轨道上不自产石头,基建必须的混凝土只能通过星际物流补充。

玄冥星的主题是热能处理。在原版中,只有研究核电站建设时才会好好研究热能传导的机制。或者像我这样像做一个类似的游戏,动手实现一次才知道热传导和液体物流有很大的不同。尤其是热管没有地下管道,必须在地面格连接起来,其它物流系统都需要为它让路。玩过玄冥星后,相比前段时间玩过的 Frost Punk 2 ,这才是真冰气时代嘛。一切机器都需要挨着热管,否则就会冻结而停工。

热管要需要发热塔保温,温度随着时间流失,所以热管面积越大流失越快。而发热塔要填燃料,本地燃料来自于炼油,但炼油需要电。发热塔需要把温度升到 500 度才能开始发电。整个循环依赖链条一不小心就断了。带一个核电站和足够的核燃料以及一套火箭发射平台去开荒会容易很多。但我自己玩的时候忘记了,等到空投到玄冥星已经回不去了。就此体验了一把基地冷启动的过程。靠太空船上空投的一点点碳(还需要留一些造炸药防御轨道上的陨石)把发热塔烧到 500 度是很有技巧的,必须让燃烧速度大于热量散失速度。先烧 165 度用普通锅炉蒸汽发电或许是一个选择,但制造锅炉用的石料很难记得带上。

玄冥星的体验很奇妙。在开荒期,电用起来要精打细算。运营个无人机平台都是奢侈之举。因为机器和传送带管道都必须紧挨热管保温的设定,平时很少用的长抓一下子就变得有用起来。物流布局方案也变得很大的不同:一切都围绕着保温(更少的热管面积)来设计。而到了核聚变科技出现,电又变得异常廉价,整个基地都值得重新设计。


总的来说,这次太空时代给我的体验就是官方主导着往精巧的小工厂设计上发展,而非不断扩大规模在不同层面实现自动化。这恰巧对上了我的胃口,所以 300 小时的通关过程一直充满了乐趣。

太空时代很好的解答了在太空探索中提出的问题:

玩家为什么要在多个地方经营多个工厂?因为每个地方都又独特的产品,高昂的星际物流成本导致基础产品必须本地生产。

怎样避免建立多个工厂的体验重复?提供截然不同的环境和独立的规则,给出不同的挑战。

随着不同地点的数量增多,不断增加玩家的心智负担如何解决?每个环境最终都可以达成完全自动化,只要不需扩大生产规模,就可以稳定运营下去。任何自动化工厂都会有纰漏,玩家只需要低频率维护,每次找到影响自动化的点即可。像新地控制污染防守虫子这样的玩法就不必扩展到其它星球,污染不需要是核心玩法规则的一部分,它只是一个特有环境玩法。

完善远程控制的交互,这样玩家就不需要在游戏世界里不断奔波。


虽然太空时代只是原版的一个 Mod ,它是官方出品,其实和一众玩家 Mod 地位并无太大区别。但不愧是做了几年,最终带给我太多乐趣。非常期待玩家社区受它的启发制作出更多好玩的 Mod 。

一些进展

最近去了一趟南宁马山县。攀岩一周,身体很累,心里很舒服。这周除了爬石头,什么都没想,脑子全部放空了。

“一款好游戏,胜过两款伟大游戏”…… 这世上最容易做的就是“多”,如果我们不小心,就可能会把三四款游戏都塞进一个游戏里。有时候,决定什么内容不该加到游戏里,比决定什么内容该加进入更加总要。―― 《席德梅尔的回忆录》

这几天,读了本书《席德梅尔的回忆录》:《文明》是在陪产假中诞生的,它一开始更像是《铁路大亨》的延续,一个全球规模的《模拟城市》,一个实时模拟游戏。它开发了很久都没有找到正确的方向,一度项目被搁置。而重新继续这个项目后,经过了搁置期的思考,才试着将其改为回合制游戏。

席德还有款失败的作品《恐龙游戏》,他从 1991 年开始鼓捣这款游戏的原型,到 2000 年第 6 届 E3 展后彻底放弃。一开始几个版本像是恐龙版文明,核心玩法是基因衍化,但随机基因突变并不好玩;其后简化了复杂的规则,却变得很无聊。“好像不是你在玩计算机,而是计算机在玩你。如果游戏要一下子表达太多东西,那简化游戏设计会有帮助;但如果你在一款回合制游戏上投入了足够多的时间,你就会希望能够控制所有有趣的决策”。

回合制走不通,游戏原型转为了即时制。席德之前就有一款成功的即时制游戏《葛底斯堡战役》。但这个《恐龙争霸》却因为恐龙题材难以嫁接足够多的远程武器以至于无法平衡。

然后,这款恐龙游戏又演化成了口袋妖怪,或是更接近恐龙万智牌。平平无奇的“借鉴”让这款游戏毫无新意。卡牌形式很好玩,但是“这些卡牌的互动方式与《万智牌》太像了。如果你能加入自己的想法,那借鉴一点创意是可以的,但我从来不觉得恐龙游戏有足够多的新元素可自证清白。”席德忍受不了这一点,最终彻底放弃了这个项目。


当我重新拾起自己项目的思路,我觉得我希望它还是一款以策略(而非成长)为主的游戏。我希望单局游戏时间不长,而玩家会面对多种有意义的选择,没有最优解,而是在风险收益间权衡,为长期做规划,同时应对短期挑战(控制损失在可接受范围内)。游戏会有很多随机元素,随机意味着不确定行,玩家一定程度上是在做风险管理。这让想到《Rogue's Tale》,虽然从 steam 评价上看是毁誉参半,但我非常喜欢它。

如果投骰子产生的随机数难以把握,靠自己构筑卡组,以抽卡形式来控制随机性或许更容易接受一些。我很喜欢桌面游戏《Dominion》,所以第一次看到卡牌构筑形式的《杀戮尖塔》时就立刻爱不释手。我想可以考虑一下这种形式的策略游戏。在 steam 上用关键词搜索时,看见了《星际孤儿》。正好,它也是一款以太空船为主题的生存游戏。玩了一百多个小时后,我觉得非常对我的胃口。它也是一款卡牌构筑游戏。steam 评价不算太好,但我不赞同多数差评的意见:它其实不是一款看脸的游戏,虽然看起来系统会刷出一些难解的事件、商店里买不到需要的牌,但这恰恰是玩家需要做“风险管理”的部分。会玩之后,默认难度其实非常简单。真正的难度是从第四级难度开始,需要精心策划每张出牌。

它绝对不是又一个“杀戮尖塔”,其创新点在于“需要玩家持续规划几个回合出牌次序和组合”。而把规划周期拖长看,随机性的影响是微不足道的。玩家要做的是留足备用方案应对不同的可能,并用各种手段消除随机性增加确定性。同时,某个时候不打某一张牌这个决策的重要性就提升了。这在杀戮尖塔类游戏中是比较少见的。

我很喜欢这个游戏策略性带来的感觉,当然,我也不想换个皮再做一个,更不是再来一个杀戮尖塔。只是想到用卡牌形式来玩游戏比较有趣。


初步的想法是设计一些足够简单的卡片,用卡片组合的方式来触发游戏中的行动。把卡片分成几类:房间卡、行动卡、物品卡、船员卡。大致对应地点、行动主体、行动对象和动作。打出一串卡片来完成各种操作。例如,在空房间安装一台机器,需要指定位置的房间卡,安装这个行动,需要的机器卡;而机器则是通过(装有生产机器的)房间卡,操作行动,蓝图和材料卡片可以创造出机器卡放入卡组……

而系统扮演的是一个不对称规则的对手,由设计者实现设计好一个个情景的卡组,洗乱后以机械规则一次打出。玩家就可以看到系统发出的陨石、磁暴等等危机以卡片形式打出。

在游玩过程中,玩家还是在指挥着船员在太空船上进行建造、科研、制造、休整、战斗这些工作,只不过以打牌的形式表达。因为行动被拆解为简单元素,类似 RTS 那样点选一个单位,选择行动及其目标被拆解为多张卡片;每张卡片只有一些基本元素,但组合能表达的行动会很丰富,这样卡组不用太大,避免了巨量卡片组成的卡组不可控,而抽卡机制又保留了一些随机因素。多张卡片的组合使得玩家需要规则几个回合的操作:保留哪张,丢掉哪些,筹齐想要做的事情。

卡牌形式的一个优势是可以先做一套实体卡来试试玩法。现在有《Tabletop Simulator 》这样的神器,根本不需要剪刀和画笔。

btw, 似乎卡牌游戏用不到 3d 场景。接下来我还想找个时间好好为 Ant 实现一套 2D 管线,或者直接从里面抽出需要的代码来,重新做一个简单的 2D 引擎。

我对电子游戏的分类

“首先,设计师创建了一些游戏机制。然后,他们把这些游戏机制用一些具有代表性的虚构元素包装起来。在游戏过程中,这些机制之间会产生一系列事件。这些事件会触动玩家潜意识中的触发器,从而激发出情感。最后,这些情感交织到一起,变成了一种综合的体验。” ―― Tynan Sylvester 《Designing Games: A Guide to Enginerring Experiences》

我非常认同 Rimworld 作者 Tynan 对电子游戏的定义:游戏是一种制造体验的人工系统。游戏用一种工程手段制造体验,目的是激发人类的情感。在《体验引擎》的书中论述,追踪情感的真正源头非常困难,因为情感的触发由大脑的潜意识处理,自动表达的。即使不知道为什么会产生某种情感,我们的理性还是会想当然的为之安排一个原因。这些想当然的原因往往是错的。这种现象被称为情感错位,因为情感错位的存在,想要了解游戏如何影响我们是十分困难的事情。

我最近把游戏开发工作中的具体实现停了下来。因为我意识到,游戏核心固然是设计一些机制,程序实现可以把这些机制做出来并加以测试,但游戏机制只是手段而不是目的。我对游戏设计的理解还不够,所以还需要继续以设计游戏的角度去挖掘游戏深层次的东西。以游戏爱好者的角度去玩那些好评如潮的游戏体会游戏带来的乐趣是不够的,还需要多玩一些毁誉参半但制作者有自己想法的作品。当然,还需要回避一些仅仅是把已有游戏换一个虚构层做出来的仿冒品。

成为好的 Designer 之前,必须做一个更好的 Gamer 。我相信自己比之前是一个更好游戏玩家。因为相比之前,我可以更快的学习游戏规则,忽略游戏的表象,直接去感知作者想表达的东西。玩一些 steam 上只有几个评价且好评率不高的游戏,即使是半成品,对我来说也不算是太难的事了。具体游戏的评价,我大多直接写在 steam 上,而这里,我想记录一些最近想到的比较形而上的总结。

对于非社交属性的单人游戏,我认为有三个设计方向:目标、挑战、沙盒。

第一,设计者设计了一件步骤繁多的事情,让玩家在游戏规则(机制)内,一步一步的完成这件事。玩家在游戏过程中获得的长期体验,很大程度来源于有一个预设的目标,一步步抵达终点。

我过去非常喜爱的 JPRG 类型就是典型。近两年玩的比较多的 Factorio ,尤其是星际探索 Mod 也是如此。完成游戏目标这个过程,虽然主干是设计者设计的,但整个路线则可以让出一些不确定的部分让玩家自己填充。另外,我花的时间很多的(数值成长)放置类游戏更是如此。在游戏过程中,游戏者在意的是我在推进游戏进程,最终有一个完结。往这条路线设计的游戏,通常不具备重玩价值,但可以把单次游戏时间设计的很长。例如异星工厂的星际探索 Mod ,我就玩了 1000 小时以上。虽然像 JRPG 几乎都设计了二周目,甚至多周目玩法,但并非真正的重玩,而是为喜欢这个游戏过程的玩家额外设计的延长线。

在这个思路下,是否有战斗系统,战斗系统偏重策略性还是操作性;是基于故事线的角色扮演,还是上帝视角的基地建设,或是自动化工厂…… 这些不同的游戏机制都是为其(玩家一步步推进游戏进程直到完结)服务的。所以,在游戏机制设计的同时,同时设计好在这个机制下玩什么同等重要。后者就是所谓的关卡设计工作。

我在很多年前制作过一款(网络)卡牌对战游戏。游戏规则几乎照搬的卡片召唤师(CULDCEPT)。一开始的想法是,卡片召唤师是一个非常有趣的卡牌对战游戏,如果我们搬到网络上让玩家有一个平台玩应该是很有趣的。为了方便玩家学习复杂的游戏规则,我们制作了对规则逐步深入的多场和系统对战的教学关。当时让我费解的是,大部分(70%)注册用户在玩完长达几个小时的教学关后就离开了游戏,甚至没有尝试和人对战过一次。如果说游戏不好玩吧,这些玩家大多又没有在教学关之间流失。这些教学关设计得并没有太大挑战,在我看来只是体验流畅,并不生硬的传达了教学任务,但并不好玩。花上几个小时,好不容易学会了一个不算太简单的卡牌游戏规则,为什么不想和人玩上一盘呢?我现在的回答是:这个教学任务本身就是一个目标感很强的游戏,哪怕它不好玩,但完成目标这件事都足以驱使玩家完成它。至于后面的人和人的对战,那是完全不同的另一类游戏体验了。

第二,设计者设计了一套规则,并辅以随机性元素生产关卡,让玩家完成一个个挑战。因为随机性元素的存在,玩家需要根据自己对规则的理解,每次都需要重新判断如何应对。玩家在游戏过程中获得的体验,以学习和能力成长为主。获得信息,有所领悟。应对挑战,由失败而激发斗志。

最近几年流行的 Roguelike 元素游戏都可以归为此类。也包括各种生存类游戏。这类游戏的单局时间不会太长,玩家把单局游戏看成是一次短期的挑战任务,随机性元素或精心设计的关卡让玩家检验自己对游戏机制的理解。如果可以引导玩家进入心流状态,单局时间拉得很长也没关系。例如著名的再来一回合文明系列。

这类游戏通常更注重重玩价值。随机性在这里是一个非常重要的元素。这里的随机性指的是游戏机制中的变量,它其实未必是用随机算法任意组合出的东西。只是表示游戏机制中有许多变量参数可供组合变化,玩家需要充分理解机制,才能应对挑战。所以像 baba is you 这样的 puzzle game ,我也把它归为此类。它的关卡并不是随机产生,都是作者精心设计的。我花大量时间玩这种 puzzle game ,并不是为了通关,而是想尝试不同的挑战。

这种游戏对玩家的终点是彻底理解了游戏机制。但设计者如果长期开发的话,可以通过不断扩展和完善游戏机制让玩家一直保持游戏乐趣。

第三,游戏只是一个沙盒,在一套自洽规则下的模拟。在过去,我无法理解像 Townscape 这样仅仅只是随便搭几个房子的模拟器为啥能被称为游戏,且好评如潮。而像 minecraft 这样火爆全球的游戏,很多玩家仅仅只是在里面搭搭积木。玩家自己随意的规划目标,然后自己完成这些目标。游戏本身仅仅充当了一个沙盒模拟装置。

我对此类游戏提不起太大的兴趣,但似乎又无法将其归于上面两类之中。但想想我在异星工厂中曾花掉几十小时就是为了设计一个全自动生产并方便扩建的工厂,似乎也很符合这类游戏提供给玩家的体验。


这三类游戏的设计方向并非互斥。好的游戏往往可以同时提供不同方向上的体验,只是有所偏重。我现在分析游戏设计时,倾向于把它作为最高层次的分类标准,然后再给游戏贴上诸如银河城、平台跳跃、基地建设、自动化、RPG 等等标签。

最近玩的几个游戏

这个月没有写什么程序。月初停下手头的开发工作,花了一周时间,作为 Indieplay 评委试玩了 200 多个参选游戏中的 100 多个。这个工作暂停之后,我就对前两个月对自己想做的游戏产生了许多疑惑。虽然写了不少代码,但仅限于基础玩法的外在功能:我实现了一整套类似边缘世界和缺氧里的工人系统,让小人可以在场景中活动起来,采集物资,建设建筑。让机器可以通上电运转起来,把原料加工为成品。但这些似乎只是一种模拟过程,而并非游戏。

我感觉自己对游戏到底想展现怎样的游戏体验没有清晰的认识。虽然在这篇采访中 也提到,(缺氧的最初设计是)“希望整个游戏运行在一个开放的(虽然简单的)模拟之上”。但我觉得模拟毕竟不是游戏,难以给玩家提供丰富的游戏体验。或者说,至少对于我这样的玩家,没有清晰的游戏目标和挑战是不行的。而且,实现一个丰富的游戏环境模拟面临的挑战我现在还无法评估,至少在当下,这不是我优先想做的东西。

我给游戏定下的基调是基地建设加生存挑战类型,或许应该有一些资源管理和 Roguelike 元素。工人管理或自动化元素是我比较喜欢的,但玩过几千小时类似游戏后,我感觉这些元素只是给予玩家体验的一种手段,并非目的。单独玩某个特定玩法,或许也能有趣,但体验却会大相径庭。

比如,我这个月花了不少时间玩 Shapez 2 。这是一个把自动化做到极限的游戏。玩家不再需要考虑能源、制造成本等问题,也没有敌对势力,只需要专心铺工厂,研究如何把工厂规模扩大并保持生产效率最大化。看起来, Factorio 关掉虫子后,也是在干这个事,但我玩下来体验其实是不同的。如果单纯想玩自动化规划,Shapes 显然更轻松有趣;但从游戏性上来说,我更喜欢 Factorio 一点。

我还玩了几天 The Crust 。这个游戏在我的愿望单里放了很久,一发布就开始玩了。我想这是一个 Factorio 和 Rimworld 的混合体。前半部分有很大的 Factorio 成分,玩到十几小时之后,又掺入了殖民地管理和工人分配的玩法。目前它处于 EA 阶段,感觉很多东西还不太成熟。仅就现在完成部分来说,我不是特别喜欢。它的自动化部分略显粗糙,殖民地管理部分又似乎不太完善。关键是交互体验非常糟糕(需要打磨),科技树的平衡更是一言难尽。而它又不像 Factorio 那样有一个坚实的游戏内核,可以通过 Mod 不断扩展玩法;玩起来的体验更依赖于设计好的场景来推动。

最近另一个让我略微失望的游戏是 Frostpunk 2 。一代是我最喜爱的游戏之一,这次 2 的豪华版可以提前 3 天玩游戏,我迫不及待就下单了。用了一天时间快速通关。玩这个游戏,有很大成分是我最近在思考生存类的基地建设游戏该怎样设计。如果没有一代珠玉在前,这也算是不错了。可惜玩过一,核心体验非常雷同。这是一个标准的由预设关卡驱动的基地建设游戏,无尽模式比较无趣。挑战预设剧本是我获得乐趣的主要来源。失败再挑战的循环,让我在一代中花了几十上百小时。但一旦理解了核心规则,抛开“通过玩家抉择来叙事”这个独特的体验,专心考虑如何提高各种数值,游戏不算太难:和一代一样,只需要快速发展科技,回避那些看起来符合短期利益的选择,不采用激进方案,就能达到最优解。这次的二代场面变得宏大,去掉了一代修房子安排工人的微观管理,让游戏体验变成了类似 Excel 表单中的各种进度条。这让我感觉体验不如一代。

和前面提到的 The Crust 一样,这个游戏也有超出同类游戏平均水平的画面质量。这类游戏拥有的高画质反而让我在玩之前就倒扣了期待分,我的这个直觉几乎每次都是对的。如果游戏画面无法帮助玩家更好的理解游戏内涵,那就毫无意义。比如 Frostpunk 2 ,玩家根本不需要关注里面的建筑细节,那么游戏画面精细的刻画建筑就是在浪费开发成本。玩家更关注每个区域的状态和功能,真不如直接给每个区块标记上颜色就够了。而现在默认的画面,看上去场景就是白茫茫一片,关键建筑,即使按住 Alt 凸显出来,还是没有区分度。甚至于,如果有个文本表单都比现在的华丽画面强(不至于让玩家找不到北)。

我最近几年对 Minimalist 极简游戏特别有好感。没有画面加成,极简风的游戏会把注意力放在游戏设计上。一旦核心玩法出众,就很难被掩盖。极简画风也不容易在游戏过程中分心,画面更注重表达游戏规则,学习成本通常更低。例如,我前几天完了一堆塔防游戏,发现最近的新作中,还是极简塔防 最为有趣。

最近玩的比较多的另一个有塔防元素的游戏是 Drill Core 。我感觉它受到了 Dome Keeper 的启发,但青出于蓝。目前在 steam 的评价中,有许多负面评价集中在挖掘过程里随机性带来的损失对体验的伤害。但我一口气玩了数十小时候,反而觉得那些是设计好的玩法,是游戏特点之一。例如挖掘过程中遇到的落石、喷火块、烦人的地龙,都可以通过合理的规划而避开。游戏似乎故意设计成无法具体对单个工人下指令,必须通过布置任务和设置优先级的方式这种间接的方式控制工人的行为。在充分了解规则后,这反而是一种挑战。只不过现在这种交互方式过于隐晦,而规则又不明确,导致有时体验比较糟糕。在微观管理为主的游戏中,玩家需要的其实是确定性规则,过于智能的 AI 未必是好事。这点我是在去年设计工厂类游戏中学到的:因为想为手机设计的缘故,局限于手机的不便交互,我们去掉了传送带,而使用更智能的无人机运营物流。智能规则导致了物流中的许多不确定性,反而没有传送带这种确定规则好玩了。

随机性带来的不确定性也未必是坏事。但围绕随机性的游戏体验应该是教会玩家做风险管理。例如我最喜欢的 Roguelike Rogue's Tale 就是这样一个风险管理游戏。我最近还发现了另一个被玩家批评随机性太强的游戏叫做 Derelict_Void 。我还没怎么玩,暂时不予评价。关注它是因为这个游戏似乎包含了我目前想做的游戏的各种元素:太空生存、基地建设、资源管理…… 看起来它受到更早的一个游戏 OutThere 启发:基于非常有限的资源探索宇宙,尽可能的活动下一个目的地。玩家需要非常小心的平衡氧气、水、有机物、燃料的使用,尽量养活合适数量的船员。没有和敌对势力的战斗(像 FTL 那样),但依然有极大的生存压力。

Ant 引擎的一些改进计划

我独自开发游戏已经有三个月了。这三个月里,我是 Ant Engine 唯一活跃用户,这是一个很好的机会来挖掘对于一个独立游戏开发者来说,引擎哪些地方有缺失。现阶段,我还是希望把精力放在游戏开发上多一些,所以引擎方面恰恰够用就好。虽然,完善引擎这件事做起来会更愉快,因为这些工作对于我比较顺畅,容易想清楚,游刃有余;而一个人开发游戏,更多的时候是手跟不上心而产生的烦闷。

我还是想挑战一下自己,把游戏设计好,实现好。引擎方面的事情,把想到的东西先记录一下。或许完成手头的游戏项目,沉淀更多,再回头做引擎,愉悦感更强一些。

首先,可视化编辑器 对我来说不重要。所以暂时就不维护了。我更需要的是一些快速验证眼下游戏设计中想法的功能,这些就在游戏 demo 中顺带实现就好,看起来没必要放在编辑器里。这和现阶段没有美术参与也有关系。因为对我自己做独立游戏来说,我不在乎开发进度,先做美术还是后做美术,区别不是很大。本来我自己就喜欢传统 roguelike ,几个 ascii 字符就能脑补所有的美术表现。我想,游戏原型阶段就不需要美术在编辑器里做创作了,用一些几何体就够用。这也是为什么我在三个月前最先完善的就是 Ant 引擎中预制几何体 这个功能的原因。

我在使用 Ant 引擎的时候,发现因为缺乏具体 API 文档而只能不断的阅读源代码(毕竟有很多模块不是我自己动手写的,无法全部了然于心)。而且并非每个模块的设计都满意,这让我经常有修改引擎的冲动。做了一段时间后,我找到一个方法来解决这个开发问题。我可以额外再做一个精简版的框架,按目前开发游戏的需求,从最基本的功能做起,逐步完善。这样就能隔绝引擎已经做好的部分:好用的模块直接做一些浅封装,有问题的部分可以多花些精力做不侵入(破坏老代码)的改进。

本来根据游戏类型的不同,使用引擎的方式就会有很大差异。我希望可以有不同的这样的框架针对具体类型游戏做二次封装。这样,在二次封装上写游戏的花,后面就可以更放心的裁剪底层实现。我更希望让 ECS 框架还原成更原始的设计:面向数据,避免添加太多的辅助模块。

最近还有许多工作是在 UI 上。我对 RmlUI 的方案还是比较满意的。毕竟类 web 的开发有极大的用户基础,各种边角被人打磨过。不过目前的一些实现细节,尤其是 UI 层和游戏层的消息通讯部分存在设计问题。

现在 UI 层和游戏渲染(以及逻辑)处于两个隔离的 Lua VM 中,跑在不同线程上,依赖消息通讯交换数据。引擎简单的封装了消息通讯过程,提供了 RPC 方法。但从游戏逻辑倒 UI 阻塞 RPC 调用,直接使用的话必定产生死锁。这是因为游戏逻辑通常放在 ECS 的一个 system stage 中执行,而处理 UI 层的 RPC 请求在另一个 stage 。为了回避这个死锁问题,需要小心的利用 ltask 的一些异步功能。我做了一些简单的封装后,情况好了一点。这个封装抽象出一个 model 对象,自动在两个层之间做数据同步(只同步差异部分)。在游戏逻辑这边设置 model 的状态,就可以直接在 UI 上展示出来。这个封装还很粗糙,需要我自己多做一些 UI 模块后再改进。

由此,我猜想 ECS 里面可能还需要提供一个 async 的 stage 可能好点。现在的 stage 里如果调用了 ltask.call ,就完全塞死当前帧了。加一个 async 的 stage ,让这里 yield 出去的流程,在下一帧回来这个stage 继续做。这样也可以取代 instance 创建的 onready callback 。只需要把一些消息处理过程放在 async stage 就可以更自然的写。前几个月就做过一点类似的尝试 ,感觉还没想好,暂时不打算把这个特性加到引擎中。


动画模块 是目前引擎比较欠缺的部分。只是我在做游戏原型时还用不上。如果未来做动作向的游戏,这方面的需求就更大了。这个的开发优先级比较低,等实际用起来再解决。

材质系统 看起来更值得改进。尤其是我在开发过程中,遇到一个简单的需求:运行时把一个对象改为半透明渲染,折腾了我好几天。最后我还是采用了去年开发游戏过程中使用的方案,为编辑器做好的预制件数据打上 patch ,为每个预制件预生成一个半透明材质的方式。然后在运行时根据需要,在不透明和半透明预制件中做选择(因为现在引擎不支持运行时给对象赋予完全不同的材质)。

说起这个半透明材质问题,我认为本质上还是性能优化问题导致的。理论上,我们可以让所有的对象都是半透明材质,把透明度调为 1.0 ,它就呈现出不透明的状态。调成 0 就消失了。但是,对于渲染来说,不透明和半透明(以及不显示)性能上有本质差别,这会导致不透明的 3d 物体和半透明 3d 物体底层渲染管线都有极大的差别,远非改个材质参数这么简单。或许在 2D 引擎中,这个差别并不大,但对开发者来说,最好不管是 2D 管线还是 3D 管线,都不必在意实现的困难,用起来设置个参数就可以了。这也是引擎要极力解决的问题。在这个(半透明)问题上,我和引擎开发团队的同学讨论了两个晚上,有了一些新的想法。以后有时间我想重构(并简化)相关底层代码。

目前,我不打算在手机平台上开发游戏。这存粹是个人对游戏体验的喜好:我对在触摸屏手机上玩游戏完全失去了兴趣。那么 Ant Engine 的最大努力:直接在开发机上对手机设备上的游戏损失调试,看起来意义就不大了。未来我想把为了实现这个特性而给引擎带来的复杂度做一些简化。尤其是远程调试、VFS 同步、触摸屏支持等。同时,可以增强许多 PC 开发上的体验:尤其是美术资源自动编译这块。我希望可以尽量减少额外的编译环节,让引擎能直接加载更多的通用格式的文件(图片、模型等)。

尤其是材质编译模块,是目前引擎中最为复杂的模块之一。我认为设计也是有问题的(不应该如此复杂)。这一块在上个月开发团队里做了一个晚上的讨论,改进方向下次专门写一篇 blog 介绍。

另外,还有一个大块的计划是重新用 Vulkan 编写 gfx 层,而不再使用 bgfx 这种跨平台方案。这也是后话了。相较用 Vulkan 实现新的 gfx 层,我更希望有机会好好做一套 2D 管线(以及独立的 2D gfx 层)。毕竟 2D 的 gfx 层要简单的多,可以把重心放在如何提供更好的(独立)游戏开发体验上。

想做的事情太多,一件件来吧。

Just for fun

一个简单的 C 模块管理器

我在用 C 构建项目,尤其是和 Lua 混合使用时,一直很头疼 C 没有一个统一的模块管理器。Lua 的模块管理虽然简单,但毕竟有且够用。一种方法是把 C 模块封装成一个个 Lua 模块,让 Lua 帮助管理,每个 C 模块是独立的,相互不可见。

但当 C 模块之间发生关系时,就比较麻烦。当然,简单的方法是通过链接器把它们都链接在一起,通过函数名前缀以区分。或是利用操作系统的动态库加载器来管理模块。

最近有了一点有趣的想法,觉得一个最简的模块管理器其实复杂度并不高。花了半天功夫实现了一下,感觉还不错。

https://github.com/cloudwu/cmod/

我在设计时,刻意回避了使用 macro 魔法,让它的接口保持原始的 C 风格。而且,实现上也不依赖任何内存分配函数,整个管理器需要的内存是一开始由调用者分配好一大块传入的。

这个管理器只管理函数指针,刻意没有去管理其它状态(比如类似事务、COM 管理的就不只是函数接口,还保留对象实例),但还是为每个管理器实例留有一个 userdata 指针,供使用者扩展。


其中的 import 函数,也就是通过字符串查找对应的模块,使用的是简单的 O(n) 遍历所有已注册模块的算法。如果接下来有性能需要的话,我会再加一个 hash 表做一些简单的 cache 。

32 位 handle 的一种生成方法

我倾向于在 C 程序里使用整数 handle ,而不是指针。尤其是需要做弱引用的时候。

我认为,一个好的 handle 生成算法,应该满足:

  1. 即使 handle 被销毁了,它这个数字也应该被保留,不应该被新的 handle 复用。posix api 里的文件 id 就不符合这一点。
  2. 提供一个 api 可以判断一个 handle 是否有效,其时间复杂度为 O(1) 。
  3. 从 handle 对应为对象的内存地址的时间复杂度应该为 O(1) ,不应该比指针有明显的性能问题。虽然 hash 表理论上可以满足 O(1) 的时间复杂度,但在糟糕的场景(hash 碰撞发生时)并不能保证这一点。
  4. 构造 handle 时间复杂度也为 O(1) 。
  5. handle 的数字位宽最好不要超过 32 bit 。

如是长期运行的程序,第一和第四个需求不能同时成立。但对于非长期程序,理论上 32bit 的数字应该是够用了。

比较简单的实现方案是用一个自增 id ,然后用一张 hash 表来保存 id 到指针的映射。但 hash 表不是严格的 O(1) 复杂度。在 skynet 中,我使用了一个简单的方法:自增 id 后,如果发现 hash 冲突,就再加一,直到不冲突为止。这个方法不能满足第 4 点需求。

当然,同时满足 5 点需求未必有多大的意义,但我最近想到一个有趣的方案,稍微实现了一下,感觉可以做到。

前提是:为了让 32bit 数字就够用,同时有效的 handle 不能太多(大多数场景是这样的)或是在同时有效的 handle 很多时,不要过于频繁销毁和创建很少的几个 handle 。

我们用一个固定 size 为 2^n 的整数数组来管理所有的 handle 。handle 对 size 取模,就是它在这个数组所在的 slot 。然后,我们只需要维护一个完美 hash 表,所有分配出去有效的 handle 都不在这张 hash 表中发生碰撞。这是可以用 O(1) 时间做到的:方法是,每次回收 handle ,都把该 slot 的高 (32-n) bits 加一,这个新的待分配的 id 绝对不会和已分配过的 id 重复。

和简单的循环自增 id 检查冲突的算法相比较,不仅仅是时间上更稳定。最主要的好处是,这个算法更难耗尽 32bit 的空间(发生回绕)。尤其在有效 handle 数量较多时,一旦发生碰撞,自增 id 的方式一下子就会跳过很多数字,而这些数字中大部分是从来没有使用过,本可以安全的分配出去的。

在 handle 销毁(回收时),同时把 handle 串在该数组里的 free list 即可保证下次 O(1) 时间就能完成新 handle 的分配。

举个例子:

如果我们限制最大有效 handle 数为 4 ,如果把 0 保留为无效 id ,那么分配四次后,handle 分别为 1 2 3 4 。

这时,如果我们把 2 销毁,重新分配的话,新的 handle 是 6 而不是 5 (因为 5 和 1 会发生 hash 碰撞)。这时,再销毁 6 然后分配一个新 handle ,这个新的 handle 会是 6+4 = 10 。

在这个算法中,是不是之后所有新增 handle 都比 10 大呢?并不是。如果销毁 1 ,再分配的话,会得到 5 ,5 比 10 小。

这个算法获得的 handle 的数值并非单调递增的,它比自增方案更节省全部的数字空间。


如果这个数组满了怎么办?一般我们不用考虑这种情况,应该一开始规划好上限(例如 posix 的同时打开文件数就有上限)。但若是想解决,也可以倍增 size 。只不过 rehash 的过程比较复杂:不光是要把已有的有效 handle 重新填在新数组中,还需要额外标记那些可能用过的 slots 。

我写了一个简单的实现:https://gist.github.com/cloudwu/dcbf583f7034ef6c0f8adec3f76860f0

借助这个数据结构,我们就可以把同类对象分配在一个大数组中,然后用 handle 索引它们,和指针相比,几乎没有额外的开销。并且有如下好处:

  1. 可以简单的判断一个 handle 是否有效(指针无法安全的做到这点),容易写出健壮的代码。
  2. 方便做持久化。
  3. handle 可以用于 C/S 同步。

基地建设(工厂)类游戏的玩家体验

这两天思考了一下,基于工厂生产的基地建设类游戏给玩家提供的核心体验到底是什么?以及,我们去年被取消的游戏到底还差点什么。接下来我要制作的游戏的注重点应该在哪里。

我玩的时间比较长的两个基地建设类游戏:异星工厂和缺氧,它们的玩法其实差异很大,但却给人一些近似的体验。对于这个问题,我想过很多次,得出的结论是,它们的确有一些共通之处:

玩家在玩这两个游戏时的情感体验过程非常类似,大致是这样的:

  1. 玩家开始了解基本规则。对于异星工厂来说,就是采集原料,生产加工,生产科技瓶,推进科研发展;对于缺氧来说,是建造设施用来提供小人的各种生存所需,不要让他们死掉。

  2. 让玩家了解游戏的终极目标。这通常是建设一项宏伟的工程。异星工厂和缺氧的原版目标,不约而同的都选择了制作并发射火箭逃离所在星球。

  3. 玩家根据完结游戏的目标和已经了解的游戏规则,在心里做出通关(或是解决阶段性目标)的计划。

  4. 玩家在实施计划的过程中遇到挫折。这通常是发生了一些未曾预料的意外。这个意外并不是系统额外强加进来的,反而是在已透露给玩家的规则下合理发生的。所以,玩家会觉得是自己对规则理解的不够,而不是来源于设计者的恶意。

  5. 玩家修正自己的计划,重新理解游戏系统。如果挫折时由游戏规则内在随机性带来的(缺氧中略微多见),玩家学会应对这些随机性,随之增强自己对抗游戏的自信;而异星工厂(尤其是关闭战斗后)是一个无危机的游戏。但还是会随着自己管理的工厂规模变大,需要更新物流方案,不然生产效率会逐步降低。

  6. 游戏适时介绍一些新系统。在缺氧中变现为一些未曾预料的挑战(比如温度控制在初期没有表现),同时引入新的应对策略;在异星工厂里表现为新的物流方式(火车、无人机等),可以用来提升效率,但这些对玩家是可选的。

  7. 玩家根据新系统迭代自己的计划。


结论:

这类游戏不能将规则简化到一眼望穿,一定要避免变成一个放置游戏,需要提供足够的细节。这些细节的作用是:虽然核心规则可以让玩家做出计划,预测目标该如何完成,但在微观上很难准确预测,细微的偏差会产生混沌效应。即,小小的行为偏差会引起结果的巨变。

一定要给玩家提供一个 "为了结束游戏” 而建立 "长期计划图景" 的舞台。如果缺少这一点,无论是异星工厂的传送带玩法,缺氧的生存玩法,都不足以吸引玩家长期玩下去。

也就是说,微观玩法是帮助玩家建立核心体验的手段,而玩家的核心体验并不在玩这些玩法的游戏过程,而在做出规划然后实施规划上。

gameplay 框架设计总结

游戏行业从业 20 多年,一直在做底层开发,即使是帮助其他团队写上层游戏逻辑,也都是实现某些特定的功能模块。直到最近,我想单独开发游戏,才好好想想架子该怎么搭。

从最初的原始 demo 开始,由于缺乏经验,写着写着经常有失控的感觉。好在一个人做,重构的心理负担不大。想改的时候,停下来花上两三天全部重写也不太所谓。最近总算顺畅了一点,感觉需要整理一下思路,所以写一篇 blog 记录一下。

任何复杂的软件问题,都可以通过拆分为若干子问题减少复杂度。

我认为,游戏的上层逻辑,即 gameplay 部分,主要分为三块:数据模型、外在表现和人机交互。

“数据模型”是 gameplay 的核心部分,即把游戏的画面等外在表现以及图形界面、操作控制(鼠标键盘控制器等)等剥离后的东西。如何判断一个模块是否属于数据模型,是否有不属于它的部分没有拆分出去,最简单的方法是看它是否有直接调用游戏引擎的代码。拆分干净后,这块不应该包含任何与图形、界面、时钟、控制输入有关的接口。除了一些必要的文件 IO 接口(主要是用来读取 gameplay 相关的策划数据,写 log ,做数据持久化等),也不应该涉及任何 OS 的 API 。

这样,我们就可以方便的对它进行整体或局部的测试。必要时还可以更换游戏引擎,甚至从文本 roguelike 换到 3D 表现都不会受影响。

“外在表现”当然是指游戏的画面表现、声音声效等等,通常这由游戏引擎实现,但还会有大量的代码存在于 gameplay 的实现中。这一块代码也会维护大量的状态,但不会涉及数据持久化。简单的判断方法是:如果游戏保存进度时,所有这里的所有状态都可以舍弃,下次读取进度后,这些状态又能被重建,而玩家不会感觉丢失了任何数据。

“人机交互”是游戏软件必要的部分,如果没有“人”的存在,游戏也就没有意义了。这块分为两个部分:图形界面用于展示游戏的数据给人看,同时接收一些来至界面的间接输入;控制器(包括并不限于手柄鼠标键盘触摸屏等)对游戏的直接控制。

对于联网游戏,还应包括第四大块:“网络输入”。这篇 blog 仅讨论非联网游戏。


对于“数据模型”这块,我在编码时,把这个起名为 gameplay 。可以进一步的分为两大类:被动对象 Object 和 自治体 Actor 。

Object 我认为应按类别分类,每类对象聚合在一起管理。它们可以是场景上的物件、游戏角色等这种会在表现层上找到对应物的东西,也可以是任务清单这种不在表现层呈现的东西(可能会在界面上呈现)。在实现 Object 时,应该理清它的数据和操作这些数据的方法。

对于数据部分,应该在早期就考虑如何持久化,即游戏的 Load Save 该如何实现:通常就是对每类对象的每个个体单独做持久化。为了实现持久化,每个 Object 都应用 id 管理,id 和 typename 是它们的共有属性。

其它数据应该尽量保持相互独立,避免相互引用。如非必要,不提供额外的数据控制的方法。因为一旦要提供特定的方法操作数据,往往是因为多项数据相互关联,必须用单个方法去控制它们来保持一致性。基于这个原则,Object 不应该提供像 update 这样的方法。所以,Object 是静态数据集合,它是被动的。

那么,游戏是怎么运转起来的呢?我们可以再实现一系列的自治体 Actor 。每个 Actor 对应了游戏世界中的一个实体,它可以关联一个或多个 Object ,通过读写 Object 的数据控制它们。大多数游戏在 gameplay 层面不会遇到太大的性能问题,所以这里不考虑并行处理。虽然 Actor 逻辑上是各自独立的,但串行处理可以避免考虑并发读写 Object 的问题。

Actor 使用消息驱动。不同类的 actor 有不同的 update 函数来处理每个 tick 的行为,可以处理消息。游戏世界接收外界输入只能通过向 actor 发送消息完成。actor 通常实现为一个状态机,这样可以让游戏世界中的虚拟角色在不同状态下有不同的行为。actor 需要维护许多的数据中间状态,同时也要考虑持久化问题,但大部分内部状态不应该持久化。大多数情况下,应保证只持久化状态机当前状态的名字就够了。其余运行时状态应当可以根据它重建。

例如:游戏中一个工人,接收了一个任务订单,需要从 A 处拿取一个货物送到 B 处。

  • 订单是一个 Object ,数据内容有起点和终点的位置,货物的总类和数量等信息。
  • 工人是一个 Object ,数据内容有它的当前位置、携带物、订单号等。
  • 有一个 Actor 作为工人的控制器,它用于控制工人的行为,比如申请订单、接收订单、执行订单等。

而执行订单的过程,又可以分成若干步骤:

  1. 确定去 A 点的路径
  2. 移动到 A 点
  3. 获取物品
  4. 确定去 B 点的路径
  5. 移动到 B 点
  6. 放置物品

这些步骤,有些是可以立刻完成的,有些则需要若干 tick 。对于需要很多 tick 才能执行完的过程,必定存在一些中间状态,这些状态不必参与持久化。这些运行时的临时状态应当可以被重建。比如,在“移动”这个步骤,一旦外界环境发生变化(例如场景变化了,路程可能被封堵),actor 收到消息,就会把状态机切换到“寻路”这个步骤,之前“移动”步骤的执行过程所创建的中间状态就不需要了。

设计持久化方案是一个优先级很高的事情。因为在考虑持久化时,就会认真设计数据模型。修改数据模型,如果同时考虑不破坏持久化功能,也会更谨慎一些。

不要简单的将 持久化 等同于把 Object 和 Actor 的运行期内存数据结构简单的序列化。持久化更像是把运行时的对象还原为一系列的构造参数,下次加载时可以通过这些参数重新构造运行时结构;而运行时结构往往会考虑性能因素构造成更复杂的数据结构,数据结构中存在一些复杂的相互引用关系。

例如:订单系统的运行时结构可能是 id 到 订单的映射表,这样方便从订单 id 查询到订单。但在做持久化时,把订单保存在一个顺序列表中更好。


如何把数据模型表现出来呢?这要看引擎是用什么模式工作。

一般会有两种模式:立即模式(Immediate Mode)和保留模式(Retained Mode)。引擎也可能根据渲染不同类型的东西混合提供两种模式。

如果是立即模式,那么每帧画面由“表现层”(代码中,命名为 visual )遍历“数据层”的 Object 取出其状态,提交渲染即可。

如果是保留模式,一般我会在表现层为数据模型里的 Object 建立对应的 visual object 。对应关系可以是 1:1 ,也可以是 1:n 即一个数据 object 对应多个 visual object 。而数据层记录每个 tick 的状态变化,最后用消息队列的方式仅把变化传递到表现层。根据这个状态变化消息,修改 visual object 的状态,同步给引擎渲染。

无论是什么模式,都不会在数据模型中直接调用渲染引擎的 API ,数据模型也不会直接持有 visual object 的引用。

渲染层一般不会直接给数据模型中的 Actor 发送消息,而只会读取(不会改变) Object 的状态数据。但如果表现层有额外的反馈设计,比如有物理系统,让物理系统可以对游戏世界发生反馈,一些属于纯表现的,就在表现层自己消化。另一些会影响数据模型的,就会变成一个消息源,向 Actor 发送消息。可以把它们看成是交互层的一部分。


交互层通常分为 HUD 、GUI、Controller 。大部分用户输入来至于 Controller :手柄、鼠标、键盘等。需要对这些设备的原始输入根据场合做一些转换,避免直接处理诸如鼠标按下、手柄摇杆向左这样的消息,而应该转换为更高阶对 gameplay 有意义的消息:例如变成发起攻击、跳跃,向左行走等。还有一些输入来自于 HUD 或 GUI ,更应当避免在 GUI 的代码中直接访问数据模型,更不要直接控制表现层的 visual object ,而应该先转换成 gameplay 的消息。

例如:“存盘”就应该是一条消息,而不应该是直接的函数调用。保存进度和读取进度在消息处理过程中应该只做一个标记,而在每个 tick 末尾再检查这个标记做对应操作(通常是先 save 再 load )。这样才能更简单的保证数据一致性。

最终在每个 tick ,这些交互层产生的消息会分发发到数据模型中的 actor 。actor 的 update 驱动了整个 gameplay 的状态变化。

工人任务分配系统

在矮人要塞 like 的游戏中,都有一套基于工人的任务分发系统。玩家通常不能像 RTS 中那样直接操作工人去工作,而是对要做的事情下达任务,等着工人自主去完成。

由于任务数量通常远多于工人数量,这个任务分发系统中大多配有优先级设置,可以让诸多任务有条不紊的进行。调整优先级变成玩家主动操控的渠道。初玩这类游戏,会有点不习惯:感觉难以在微观层面直接做自己像做的事情。像捡块石头放进指定仓库这件事,无法像玩 RTS 游戏那样,先点选工人,再针对石头发出拾取指令…… 但习惯之后,恐怕又回不去了。比如我在玩 Ratopia 时,就对操控鼠王直接干活烦躁不已。

这类游戏,我玩的时间比较长的有三个,按时长排序为:缺氧 (ONI) 、边缘世界 (Rimworld)、矮人要塞 (DF)。其它如 Songs of Syx 、Prison Architect 等很多也有所涉猎。其实,这些游戏在设计工人任务系统的细节上也有所不同。

以我游戏时长最长的缺氧和边缘世界相比较,同样是提供玩家主动操控的能力:Rimworld 可以给工人的任务队列直接下达指令(这更接近 RTS 的玩法),而 ONI 则是通过给单个任务本身排优先级实现的。ONI 设计了警报级任务,可以越过一切优先级设定,强制立刻完成。虽然 ONI 也保留了指挥单个小人移动到指定位置,但实际游戏中几乎没什么用。

对于拾取物品,Rimworld 可以封禁、解禁单个物品,而 ONI 没有这个设计。ONI 的工人几乎不会主动把地上的东西搬入仓库,除非下达清扫指令。

这些细节的不同,可能来源于作者设计时的思维轨迹,很大程度上也取决于游戏的其他玩法。例如 Rimworld 偏重手控成分很重的战斗,而 ONI 没有战斗成分。Rimworld 强调人物之间的情感联系,ONI 里的都是工具人。

我比较喜欢 ONI 的系统,打算用这个规则打底设计自己的游戏。下面是设计的草稿:

  1. 游戏场景中代做的事情全部被视为任务,任务需要由工人完成。

  2. 任务构成要素主要由对象和行为构成。对象大多为场景中的建筑,也可以是其它一些活动角色,例如某个工人或敌人。

  3. 行为决定了任务的类型,而每种任务类型有一个预设的“类型权重”;玩家可以对任务所属对象设置一个“对象权重”。

  4. 每个工人有自己的任务队列。工人可以设置对任务类型的“偏好权重”,任务对象在场景中的位置和工人之间的距离决定了任务的“位置权重”。将每个任务的所有权重相乘,得到任务分配给每个工人的最终权重。同一个任务会分别进入每个工人的任务队列中。

  5. 有些任务是分配给特定工人的。例如,工人需要周期进食,氧气不足时会就近补充氧气,等等。也会排入对应的任务队列。

  6. 各个任务队列定期刷新,将归属的任务以权重排序。工人从高到低依次完成任务。因为一个任务可以被分配到多个队列中,所以,可以出现工人当前任务被取消的情况。如果扩展战斗系统,而攻击敌人也属于任务的话,同一个任务也可以被并行执行。

比较特殊的是搬运任务,它通常是建造任务的一个环节,即给建造任务提供原料。它需要把原料从一个地点搬运到建造蓝图的地方。这种搬运任务有两个地点。但给建造蓝图供料时,原料可以有很多候选。我想到两种实现方法:

第一,当一个建造任务被发布后,所有可用的原料均被发布一个供应的子任务,根据和原料和建造任务的距离,给予不同的权重。这样,工人再根据自身的位置,如果开始就近执行一个搬运任务,就立刻把其它搬运任务取消。第二,不考虑不同原料的位置,只要原料可达,就发布一个供应任务,每个工人在考量建造任务权重时,只考虑自己和建造工地的距离。

看起来,第一个方案看起来会有更聪明的表现。因为会倾向于让离原料近的工人就近拿到原料开始搬运。但从实现上看,第二个方案更简单。因为它没有把搬运任务做特殊处理。只在工人执行任务时,再寻找原料。寻早原料变成执行任务的过程,而不在计算权重和分配任务阶段进行。


关于寻路

昨天我实现了基本的寻路模块。一开始,我认为需要的基本功能是:标记出场景中从 A 点到 B 点的路径。由于场景是玩家一点点搭建起来,随时变化,所以很难对场景做充分的预处理。这样一个寻路模块的时间及空间复杂度都不会太低,而在游戏中恐怕不会太低频使用它。我实现了两版都不是很满意,所以又回头来回顾需求。

结合任务系统来考虑,我突然发现,其实真正需要的不是找到任务 A B 两点间的通行路径,而是找到从同一个点出发,到场景中很多点的路径。因为,任务本身是有位置属性的,这个位置属性决定了它在每个工人的队列中的不同权重;或者从工人角度看,他同时会面对多个不同位置的任务,需要根据距离远近排序。所以,更合理的基础功能应该是:针对每个工人的当前位置,计算出距离可达区域每个位置的行动路线,这用几行代码就可以生成。同理,如果像找到一个建筑任务的所有原料供应点的远近,也可以使用相同的算法。

工人只在开始准备一个新任务时,才需要做一次计算。而一旦他处在执行一个任务的过程中,就不再需要实时计算距离其它任务地的路径。

飞船建设部分的设计草案

像异星工厂、缺氧、边缘世界都有大量的 mod 。可以通过大改游戏机制,把本体游戏改造成完全体验不同的游戏。这些好玩的 mod 几乎都是一个人完成的。所以我觉得,固然游戏的外层玩法决定了整体体验,但其实开发的总工作量并不大。而且,一旦玩法不满意,也容易修改。

我的游戏开发计划是先完成一些底层基础系统,再考虑完整游戏的全貌。没有上层玩法支撑,光有底层系统玩起来一定寡淡无味,但我认为它们是设计和开发中最重要的一环。

在进一步实现 demo 之前,我设计了一下飞船的建造系统。

游戏世界中的物质分为三种:建筑,零件,原料。

摆放在场景中(飞船)的是建筑,墙体、门、机器、家具这些属于建筑,一旦修建出来就不可任意移动位置。建筑是由零件构成,拆毁建筑会 100% 返还零件。建筑修建是可逆的。

零件是由原料在机器中合成出来,这部分和异星工厂相同。并不一定存在逆向的合成配方。例如,铁板可以合成铁丝,但铁丝并不一定存在变回铁板的方法。所以和建筑不同,加工零件可能是一个不可逆的过程。

飞船(场景)是由四边形网格构成。每个格子永远只能容纳一种物质,要么是建筑的一部分,要么是一种零件。而原料无法直接存在于场景格中,它们必须存在于容器里。建筑和工人都可以是容器。

工人可以在场景格的过道中移动,工人之间不设阻挡。没有建筑的格天然称为过道,部分建筑会占据场景格,成为障碍物。有些建筑将所占据的部分场景格保留为过道。例如门。

每种零件在同一场景格内有一堆叠上限,超过上限就无法容纳在同一格内。有些建筑拥有容器格,容器格和场景格相同,但不存在于场景中(只附属于建筑或工人)。容器还可以存放原料。

每次建设建筑的时候:

  1. 把所占场景格清空。
  2. 把所需零件堆在所占用的场景格上。
  3. 工人在建组所占格的建设邻接位(每个格子有 8 个建设邻接位)工作。
  4. 工人必须通过过道接近建筑蓝图,工人在过道中只能以四个邻接向移动。

注:由多种零件构成的建筑,所占格的数量必须大于等于零件种类。换句话说,如果一格建筑是 1x1 格大小,它就只可能由一种零件构成。

当拆建筑时,也需要工人站在建筑所占格的建设邻接位工作。建筑拆卸后,完全返还零件,置于所占空地。

有些建筑带有不只一格的容器,例如货架,这类建筑会扩展场景的收纳能力。但,拆卸这种建筑必须先排空容器,才能进入拆卸环节。一旦建筑损坏,容器内的物品就不可取出。

加工机器通常带有几格容器,用于保存原料和产品。

工人可以在场景中移动,工人身上带有一或多个容器格。用于建设建筑和安装配件。配件是一种特殊的建筑,存在于工人行动层之外,例如电线和管道,它们可以和建筑同个场景格,拆卸不会回到场景格内,而是进入工人身上的容器中。


游戏的建设部分会类似异星工厂和边缘世界的混合体。和异星工厂不同,建设需要把零件运送到场景格上,并由工人消耗工时修建。一旦修好,不可以在场景上移动位置,但可以无损拆卸。零件加工又比较像异星工厂的加工机制,由合成配方决定了生产过程。但又不允许原料直接放在地板上。

我的设计思路是:游戏里的东西尽量具象化,每个东西就是一个视觉上可见的东西,而不是表单上的一个数字。自动化像矮人要塞或缺氧那样,由工人的工作系统驱动完成。不排除后面加上传送带和自动装卸机,但可能把传送带机制和流体管道合并成同一机制(类似缺氧)。

室内空气流动模拟

在设计飞船建造的游戏时,我想做一个空气流动的模拟系统。这里有一个初步的方案,不知道好不好,先记录一下:

  1. 空间是由二维的正方形格子构成的,有些格子如墙体会阻止空气流动。每个格子有温度属性及气体质量的记录。不同气体可以同时存在于同一个内,质量单独记录。温度传导系统另外设计。
  2. 每个游戏 tick 对每个格子做一次独立计算,根据温度值给出一个概率,这个概率决定了该格气体向周围扩展的比例。
  3. 温度越高,越可能将更大比例的气体平均扩散到最多邻接的 8 格空间。
  4. 当格子因为建墙而导致空间变化时,把该格内气体全部扩散到临接格,当极端情况下无法做到时,空气锁定在墙体内,不会消失,等待以后满足条件后再扩散出去。

为什么要做基于格子而不是基于舱室的空气模拟?例如, FTL 的氧气气压模拟就是基于房间的。

因为,这个模拟需要结合游戏本身其它玩法的需要。预计之后会做气闸舱,真空室等设定。需要有一个更微观的空气流动模拟,简单的给船舱加上气压的数值是不够的。和 FTL 不同,我希望做一个基地建设风格的游戏,舱室的结构是动态的,难以以房间为单位计算。

目前有气体流动模拟的游戏中,最流行是缺氧。为什么不直接使用缺氧的模拟系统?

缺氧的基本规则是:每个格子只能有一种物质,这种物质可能有三态:固态、液态、气态。物质会因为温度发生三态转换。不同形态的物质属于不同的东西,每一格不能混装。特殊情况下,气体会直接消失。气体倾向于从高压格流向临近的低压格,并受重力影响向下运动。

缺氧的流体系统是和其它游戏系统相结合的:动植物需要在不同的气体环境下生长,小人会对环境气体尤其是有毒气体做出反应。这些玩法我应该不会做。尤其是,我的游戏地图是平面的,和缺氧不同,没有上下之分,所以不考虑气体重力分层。

对于缺氧来说,它的核心玩法之一是治理无序的自然空间。在玩家拓展空间时,必须考虑原有空间的环境。配合这个设定,才有衍生玩法。而我暂时不想在我的游戏中设计这些。我需要和气体模拟相配合的玩法主要是,根据环境气压影响人物或动植物的状态。

我希望模拟系统简单、准确、符合直觉。

简单:每个格子可以单独运算,不涉及复杂的公式。

直观:尽可能符合玩家的预期。例如,空气从高温区流向低温区,从高气压处流向低气压处,直到平衡。如果空气中混入一点毒气,也会缓慢的随时间扩展,稀释。

准确:规则上可以保证,不会因为模拟计算的误差而出现气体总量的变换。


下面还有一些对玩法的初步想法,尚未推敲细节:

  1. 飞船内需要部署制氧机。制氧机只能通过管道和其它设备连接,不直接向环境排放气体。
  2. 氧气需要通过特定设备输入通风管道,通风管道需要通过排气口向环境排放。
  3. 船舱中可部署一些氧气面罩供应点,它们由管道供气。
  4. 角色随身携带一格氧气面罩,当环境气压在阈值附近变化时自动戴上或取下。氧气消耗完毕后,会自动寻找临近的面罩更换。

角色动画系统

Ant 引擎的角色动画系统还需要完善。

之前我们用 Ant 引擎开发的游戏以机械装置为主,所以并不需要人型角色动画。对于人物角色动作的动画控制,最好有更多的引擎支持。

通常,角色逻辑上的属性和动画表现存在一个映射关系。一个角色,它逻辑上的基本属性可能只有在空间中的坐标。我们编写代码控制它时,只关心它在哪里。但是,在做画面表现时,则需要根据空间坐标这组简单属性,转换为动画播放:如果角色静止不动,就播放 idle 动画,如果正在运动,就播放 walk 动画。

在引擎底层,每帧只通过坐标这个属性来计算角色该播放哪个动画以及怎样播放,信息是不够的。通常还需要结合过去时间线上的状态变化来推算出当前状态;或是通过几个独立的逻辑属性的组合,得到动画需要的信息。

例如,可以通过空间坐标的变化过程计算出速度;根据是否处于战斗状态决定是警戒行动还是自由行动……

这种从逻辑属性数据到表现用数据的映射关系,一般使用状态机来实现。Unity 文档对此有一个很好的描述。通过这个状态机,可以生成动画系统底层每帧需要的数据,而开发者只需要简单修改逻辑上的基本属性即可。

动画系统底层看到的是 Entity 当前状态下用于动画渲染的基础数据:一个动画片段的当前帧,或是几个动画片段的加权混合。而状态机只用运行当前帧的当前状态关联的转换逻辑去加工那些基本属性输入。

因为状态机永远处于单一状态,但对于动画来说,从一种状态到另一种状态通常有一个表现过程,所以,状态机中的状态和表现上的状态是有区别的。Unity 把两者区分开,idle ,walk 这种叫 state ,从 idle 到 walk 的过渡期叫 state transition 。从状态机的实现角度看,其实它们都是状态机的节点 node 。

对于非帧动画来说,处于 state 时,通常只有一个动画片段;在 state transition 阶段,则为它连接的两个 state 的动画片段的混合。state 可以触发特定的行为 behaviour ,开发者可以围绕每个特定的 state 来编写逻辑;而 state transition 通常由几个参数控制,对开发者是透明的。

动画状态机的 transition 和动画表现上的多个动画片段混合,是不同的两个东西。

从走路到跑步的过渡阶段可以直接切换两个做好的动画片段,如果是帧动画,动画片段有若干帧构成,通常几个可以衔接在一起的片段,每个片段的最后一帧可以和第一帧衔接在一起,保证循环播放,不同动画片段的第一帧是相同的,允许片段间切换。那么,状态机的 transition 要做的工作一般是,保持上一个状态的动画片段序列播放到最后一帧,可以顺利切换到下一个状态。

以走路过度到跑步为例,状态机在更新时,如果处于走路状态,一旦发现移动速度超过跑步的阈值,就可以切换到 walk to run 这个 transition ,在这个新的 node 中,状态机会继续保持走路的帧动画片段提供给动画底层,直到一个片段周期结束,然后切换到 run 这个新 state ,新的 state 会使用跑步的动画片段从头播放。

对于骨骼动画,往往不受单一动画片段的限制。它可以将多个动画片段混合在一起。在 transition 中,可以逐帧调整多个动画片段的混合权重。

关于人物运动怎样用多个动画片段混合,这里有一篇论文 做了非常详细的解释。

如果是简单的两组动画混合,例如运动方向不变的走路到跑步的过度,使用一维的混合即可。即逐步降低前一个动画片段的权重,同时增加目标动画的权重。

而如果要考虑人物在移动过程中转向,则需要二维的插值。通常使用 Gradient Band Interpolation 。当需要考虑速度变化时,把插值放在极坐标系下效果更好。虽然这需要 O(n2) 的算法复杂度,但通过一张预运算的表,就可以减少到常数时间。

btw, 即使是在 state 中,也可以用到动画的混合。比如,负伤走路的角色和正常走路的角色表现不一样。负伤走路的动画可以是由负伤动画和行走动画叠加混合而来。

❌