我最近游玩了香草社的圣兽之王,除开优秀的美术和上瘾的战略模拟玩法外,我想聊聊其中的编程思维。

游戏采用了全自动回合制战斗,每一次战斗就像一次程序运行,每个角色就是搭载了不同功能的脚本。而玩家要做的就是更改每个角色的行动表:轮到这个角色行动时,会在从上到下的行动表里,执行符合条件的第一项,而这里的条件就要玩家挑选。从敌我双方的血量,人数,到行动顺序。比如友军是否为满血(判断),优先选择血量最低的友方(查找),或敌人整体血量低于75%(计算和判断的复合)

游戏截图

我们来看一个具体案例:牧师斯嘉丽拥有两个行动:治疗一位友方,和对一名敌人造成低伤害。同时她只有一个行动点,意味她只能在一场战斗进行一个行动。作为牧师最优先的肯定是治疗友方,所以我们把治疗放在伤害前面,这时进入战斗。轮到斯嘉丽行动,她治疗了一个血量完全健康的队友。这肯定不是我们想要的,所以我们在治疗前添加条件:1.当友方血量低于75%时 2.优先选择血量最低的友方。

而这时再进入战斗,轮到斯嘉丽行动时,她看到队友血量都很健康,所以她没有治疗,而是对敌人造成了微乎其微的伤害。等到之后敌人把友军打到残血时,她已经没有行动点去治疗了。

我们可以再给攻击加两个条件,检测敌人的血量低于斩杀线,再选中血量最低的。这样牧师虽然前期会完全跳过自己的回合(因为两个条件都不满足),但却能保证每次行动都能发挥最大作用。

这里又多了一个新的问题,如果一场战斗里敌人都被完美斩杀,队友只收到了一点伤害(不低于75%),那么牧师就不会有任何动作。队友会带着这一点伤害进入下一次战斗。这里该怎么优化呢?

答案是没有办法,也没有必要。游戏只给了每个行动两个条件框位,无法进行更复杂的条件检查。我们可以再复制一个治疗动作,把条件改成:1.第三次行动时(一般战斗接近尾声)2.优先选择血量最低的友方。这样一定程度可以达到理想的效果,但还是过于繁琐,角色的行动条数量是有限的,后期还会有多种行动,光给治疗两个栏位就很浪费。

当条件不能满足需求,就要用到妥协的艺术。把治疗触发条件改为”当友方血量低于100%”,这样就能保证触发。毕竟牧师最重要的还是保队友状态。

我在游玩过程中遇到了一个有些棘手的例子,我的某个编队里同时有骑士和剑士。骑士会在队友受攻击前保护队友,替队友承受攻击。而剑士会消耗格斗点,并格挡朝向自己的攻击再加属性。这里的问题是:骑士会保护剑士,结果剑士无法发挥出自己的格挡,浪费掉了行动点和技能。其它队友也无法很好受到骑士的保护。

游戏截图2

相信明眼人都能看出来,不要把这两个职业放一起。但我十分中意这两角色的cp,硬是创造出了这种需求。

我最初采用了三个格挡行动,其中两个条件检测其它两位队友。以及一个格挡检测行动点为0的队友,防止低血量的剑客没有行动点而被攻击。但这实在是太繁琐了,所以我优化成一个格挡行动条件为1:优先选择后排队友 2:行动点小于2的队友。干净地解决了这个问题。

这样的if-else逻辑贯穿了整个战斗系统。随着玩家进一步扩大队伍,装备。能够扩展的可能性会指数级上升。但也不必担心过于刻板。游戏还有暴击率,闪避这种随机变量和战斗外技能,道具作为调剂。

总之,满分玩法,满分剧情。