这个选择并不是我最近才解决的问题,我在五月到八月间一直思考它,最终有了个不太完善的方法,但总之是解决了。
在最近,我回顾日志时,才发现我并没有写这一段,于是,在这里补上,作为对我失去的脑细胞的纪念。
以炉石举例,炉石的选择其实是有大的弊病的。在炉石中,在很长一段岁月里,你只能选择一个目标。
这大概从炉石开服2012年开始,一直持续了七八年的铁律。
而且,选择这个行为,只能在战吼中出现,无法在亡语/回合结束/荣誉击杀等情况出现选择。


以沃金为例,很多版本的沃金,都实际只能选择一个目标。
而且,只能选择场上随从。
直到很多年后,在换了无数波程序员后,后续的程序员才总算解决了选择多个目标的问题。

从选择一个到选择多个,炉石花了很多年。
至于为什么会这样,我认为是是炉石的代码在很早就写死了,是硬编码。
例如战吼这个设定,有非常多不一致的情况,战吼时,这张牌在手中吗?还是在场上?它的优先级大于法术吗?还是弱于其他情况?而选择则是和战吼锁死了,只有战吼才能触发选择,而导演,牙尖爪利都只能随机选择。
另一方面,选择和很多其他游戏事件不同,选择需要玩家的参与,需要玩家鼠标在一堆UI中,点击某一个UI,然后选择事件才会完成,选择一个随从造成三点伤害,和随机对一个随从造成三点伤害,这非常不同,可以说是两个世界的差距那么大。
大家都知道,炉石的数据是在数据库中运算的,玩家只负责发送命令,例如导演这种很复杂的牌,可能会连续使用几十个法术,而对于服务器,它只需要一瞬间就能运算出这几十个法术的使用结果,但对于选择,服务器需要暂时挂起,等待玩家后续选择,然后才会继续后面的其他运算。
于是,在我的卡牌游戏中,我也遇到了同样的问题。
在五月份开发完游戏后,试玩过程中,我就遇到不断有人在问,为什么只能随机,不能玩家选择。
我当时以为,啊,只是两个字的差别,或许不大。
但是,从五月一直到八月末,我才算终于完成了选择,让玩家可以选择卡牌,而不是随机了。
和上面的一样,我即使写了几十个其他关键词,例如弃牌/回费,场上牌回手,创造新牌,复制牌,等等,但没有一个关键词需要等待玩家选择。
在原来的系统中,这个回合制卡牌系统,只有一种情况会等待:选择哪张卡打出,打出后系统运算结果,显示结果,然后继续等待玩家打出哪张牌。
但现在不同,系统还要再等待玩家进行选择,这是第二种等待的情况。
而且在选择时,你还要改变场景,让其他事情变黑,让可以选择的对象变亮发光等,提示你的选择范围。这又是更改画面显示。
这太不同了。
于是,我思考选择该怎么写,就花了好几周,重构了几次,最后总算做了个勉强能跑的代码出来(但是很难拓展,容易散架)
炉石真是个很神奇的游戏,它在七八年内都无法做出选择两个目标的同时,还出了一张神奇的牌:市长,让你的所有选择变成随机。这太神奇了,对于同一个关键词,同时出现代码债务和神级代码?!

我采用了炉石这一特点,在做出选择动作后,我把所有其他随机动作也合并到了选择里,毕竟,随机只是在所有可选目标里,随机选择,但它依然有可选择目标范围这个概念。
在随机和玩家选择之间,我的代码中只有一个IsRandomSelect
另外,这个随机动作也是我写的所有关键词中最复杂的,我仔细列举下它有这些属性:
产生动作的来源:可能有卡牌,玩家,某些未来新增对象,例如武器装备,在炉石中,这只能由战吼触发。
选择卡牌的范围:手牌?场上?弃牌堆?我的手牌?对方的手牌?
选择卡牌时,过滤条件:只选择0费?只选择某个种族?只选择某个稀有度?满足某些条件不能选择?
选择多少次:如炉石,炉石只能选择一次,在很久后才开放选择多次。
选择多次这个还有个情况,就是在使用的时候,触发多个一次选择事件,和触发一个多次选择事件,区别并不大,很容易弄混,我也没能避免。
哪一方玩家进行选择:
我没有完成这件事。在检查了代码后,我发现哪一方玩家进行选择,被绑定在了动作来源上。也就是,谁打出的牌,谁就要选择。但是,如果我打出了一张牌,但是要让对方选择呢?这该怎么办?
我将来要补完哪一方玩家进行选择这个属性。
选择时的价值判断:这是为AI写的,我要为每个选择事件写一个AI的判断逻辑。有好的选择,例如:选择一张牌,复制并置入手牌。这时,要选择价值最高的牌。但是,选择一张手牌,弃掉它。这时,要选择价值最低的,弃掉反而更好的牌。
选择后会发生的动作:例如,选择一张牌弃掉,在我选择了是哪张牌后,我肯定要将这张牌的数据传输给弃牌事件,才能触发对吧?所以,我还要确定选择后触发的动作,并写完在两个动作间传输数据的代码。
涉及选择多个牌的互动:如上图的沃金,要选择两个随从,交换它们的属性。在函数中,这就意味着,你不能只传入选择的单张卡,需要传入多张卡,例如是一个List<basicCard>,而且还会涉及一些更复杂的运算,就不只是触发某个动作了。
当前选择事件的提示词:玩家的确可以选,但是选了会发生什么,玩家知道吗?在炉石中,所有选择都和卡牌战吼绑定,例如沃金这张牌卡面写着选择后,会交换双方血量。但是,如果要继续拓展解耦呢?如果一次战吼触发不止一个选择,而且不写在卡面上,例如神沃金:选择三次随从,每次选择,随机触发一个沃金的效果。
所以,需要一个提示词,不然玩家光看着可以选牌,并不知道选择后会发生什么。
这一点,炉石起了反面教材。

如上面条幅所述,我只是选择吗?这是哪张牌做出的选择?在选择后,会发生什么?金鱼只有七秒的记忆,在我打出这张牌后,我就忘记了我打了哪张,是什么效果。别笑,这是很容易会发生的事情。

下面是答案:这个选择是这张牌触发的:
因为在选择界面打开时没有提示,所以,玩家在选择前,需要记住这次选择什么:选择弃牌有收益的牌,或者费用低,可以打出,不会留在手中的牌。
这就是选择事件的主要属性,写完后,我才发现居然有这么多,也是很佩服当时的我了,居然在这么多天熬夜后,把选择搞定了。之前的我,觉得我永远也做不到这点,之后的我,也绝不会再碰这个屎山了。


暂无关于此日志的评论。