RB配置生成机制详解
-
RB到底是怎么一回事?
好问题,这不是三言两语能解释清楚的。这篇帖子会涉及一些可能相当晦涩难懂的技术向内容;不过,我会尽力用所有人都能理解的方式来解释。只要你读完并完全弄懂了这篇帖子,你就能完全理解9代RB有哪些改动是可行的,哪些又是不可行的,并能理解这些改动可能的影响。单打和双打RB使用的生成机制是一样的,你可以从代码中的""isDoubles"来判断它是否属于双打。不过请记住,**你并不一定需要理解这些帖子的内容**才能享受RB,这些只是给好奇宝宝准备的。
代码链接(我会在后文题及时不翻译)
[URL='https://github.com/smogon/pokemon-showdown/blob/master/data/random-battles/gen9/teams.ts']teams.ts[/URL] - 生成机制
[URL='https://github.com/smogon/pokemon-showdown/blob/master/data/random-battles/gen9/sets.json']random-sets.json[/URL] - 可选的招式、特性、定位、等级、太晶属性索引代码中常见用法
! 表示 “否”, 对后文逻辑命题取反。
".includes" 表示“这只宝可梦能获得这个吗?”
".has" 表示“这只宝可梦目前已经在这个配置里有(查找的对象)了吗?”
"===" 表示“是”
"counter.get" 表示我们记录了这个宝可梦是否已经拥有了特定对象,如果有的话,有多少。
"&&" 表示“和”
"||" 表示“或”
"isDoubles" 表示这段代码是专门用在双打RB的。"!isDoubles"表示这段代码是专门用在单打的。如果不说,这段代码默认是两个模式共用的。概述:生成配置的流程
RB在生成配置时会经历以下的固定步骤。每一步都会影响后续生成,而后续步骤绝不会改变之前已经决定好了的内容。**这些步骤顺序严格固定。**因此,任何需要改变这些步骤顺序的建议都不会被采纳。以下每一步都会在这篇帖子里有一个专门章节解释。它们是:决定第一只宝可梦的种类 -> 选择定位 -> 选择太晶属性 -> 选择招式 -> 选择特性 -> 选择道具 -> 如果需要,则调整调整努力/个体值 -> 决定第二只宝可梦的种类,以此类推。
决定宝可梦种类
这一步会选择等同于maxTeamSize(默认为6)数量的宝可梦。洛托姆或藏玛然特等宝可梦的多种形态会平分这只宝可梦出现的概率。举个例子,你遇到藏玛然特-盾之王的概率是遇到陆地水母的一半。生成宝可梦时会根据sets.json中的等级数据来决定它的等级。进行这一步时,如果原先的宝可梦不满足特定条件,系统会重新随机生成新的宝可梦,直到新生成的宝可梦满足条件为止。这一特性能防止同一队伍中出现超过3只宝可梦被任意同一属性克制、超过2只宝可梦是同一属性、或超过1只宝可梦被同一属性4倍克制。
此外,索罗亚克不会生成在6号位,不挠之剑和不屈之盾特性的宝可梦不会出现在1号位。
选择定位/太晶属性
选择定位这一步相当直接;每一只宝可梦都可以从sets.json的1至3种“定位”里选择一种。([URL='https://www.smogon.com/forums/threads/questions-about-how-random-battles-formats-work-read-here.3712694/post-9544298']这篇帖子[/URL]详细解释了每个定位的含义)定位几乎是完全随机选择的,不过如果队伍中已经有了一只定位为_太晶爆发使用者_的宝可梦(或厄诡椪/太乐巴戈斯),系统会排除_太晶爆发使用者_定位(以及厄诡椪/太乐巴戈斯)。这一步决定了后续的许多步骤,尤其是从sets.json中的哪个招式池里选择招式。欲知详情请移步[URL='https://www.smogon.com/forums/threads/questions-about-how-random-battles-formats-work-read-here.3712694/post-9544298']这篇帖子[/URL]。决定太晶属性则更为简单。sets.json中为每一只宝可梦都准备了对应定位的几种可能太晶属性。系统会在可能的太晶属性中随机选择一种。
选择招式
这一步挺关键的。首先,请区分清楚“招式池”和“招式组合”。招式池由给定配置决定的可选招式,能在sets.json里通过查询"movePool"找到。招式组合是玩家在游戏中见到的4招。
招式是逐一从招式池中选择后加进招式组合的。在_强制选择招式_的条件满足之前,系统会优先根据特定条件生成符合条件的招式。在强制条件满足之后,系统会从招式池中尚未被选择的招式里随机选择招式,直到生成一个拥有四招的招式组合。此外,每当一个招式被加进招式组合之后,系统会在招式池里检查_招式兼容性_。不兼容的招式会从招式池中被移除,系统在后续生成中不会继续考虑它们。
强制选择招式(详见teams.ts中约200-250行和约700-1000行)
算法中有许多强制满足的条件。如果有任意强制条件满足,对应的招式就直接被加进招式组合中。每只宝可梦都至少要有一招能享受到属性一致加成,并且这招不能在teams.ts中103行上下的"NO_STAB"列表里。大多数属性还都有自己的特殊规则,详见代码200-250行。有些定位会绑定特定招式:"bulky"(高耐久)定位在有可用的回复招式时会优先选择它们,"setup"(强化)定位会绑定一个强化招式,"bulky attacker"(高耐久打手)定位在有可用的属性一致先制招式时会优先选择它们,除"support"(辅助)外的所有定位都会要求至少两招攻击招式,并且大多数定位都会要求一招对应这只宝可梦太晶属性的攻击招式。此外,毅力特性会在招式池里有硬撑时和它绑定。一小部分宝可梦会优先保证先制招式,而不是非先制的属性一致招式。特定招式搭配会绑定:祈愿+守住,寄生种子+守住,双墙;如果系统选中了其中一个,另一个也会被强制选中。满足所有强制条件后,系统会随机选择剩余的招式。招式兼容性 (详见teams.ts中约490-640行)
每当系统选中一个招式加入招式组合之后,系统会根据几种不兼容条件来筛去招式池中不适配的招式。不需要学过Typescript也应该能看懂teams.ts中大多数的不兼容条件。举个例子,强化招式和钉子不能在同一组合中共存,因此如果系统选中了一个强化招式,所有可用的撒钉招式都会被移出招式池,反之亦然。还有一些不兼容条件是根据队伍决定的:同一队伍中不能有超过1只宝可梦携带隐形岩,不能有超过1只宝可梦携带黏黏网,绝大多数情况下不能有超过1位扫钉手。如果从招式池里移除一招后这只宝可梦凑不够4招了,系统会跳过这一步兼容性检查。也就是说如果一只宝可梦招式池里只有四招,那么就算队里已经有其他宝可梦携带了隐形岩,它也会继续携带隐形岩。8代有什么不同的?
8代的招式选择要乱不少;系统会从招式池里选择招式加进招式组合里,然后根据筛选条件移除不合适的招式并重新随机选择,重复这个步骤直到所有条件都满足。8代的强制条件只是拒收随机选中的招式,直到这只宝可梦获得了它该有的配置。这一机制经常导致部分招式有了极高的权重,并会导致错误、意料之外的配置。只有8代还在使用这一机制,但相当一部分玩家群体觉得这样更好,所以我们短期内不想动它。
选择特性(新!!!)
全新版本!!截止至2014年7月12日,我们全方面翻新了特性生成机制!每个定位都有几种这一配置可选的特性(俗称“特性池”)。绝大多数情况下,一旦招式确定了,系统就会从特性池里随机选择特性。比方说,关东顽皮雷弹会以相同概率随机选择隔音、静电和引爆。但是这只宝可梦的特定特性可能会不在某个定位的特性池里!通常来说,不想要的特性会从所有配置里都移除(译者注:比如发光)。
同一定位下所有可选的特性都享有同等概率,不能更改。
然而,有些特性只在特定条件下才会生成。这些判断条件大抵可以分为两类:
特性不兼容:
根据生成的招式或者队伍成员,部分特性会从特性池里被移除,比如说悠游自如、叶绿素、茂盛、不服输、铁拳。不过如果条件满足,这些特性还是会和特性池里其他特性享有同样的概率。举例来说,如果烈焰猴生成的招式组合里有音速拳,那它就有一半一半的概率是猛火和铁拳。特性不兼容的条件详见teams.ts中1050行上下。但是只有这一种判断也不一定够,所以我们还有第二类!特性绑定:
当特定条件满足时,系统会强制选择一些特性。比如说,铳嘴大鸟并不总是会携带种子机关枪,但当系统生成的招式组合里有它时,系统会强制选择连续攻击特性。特性绑定的条件详见teams.ts中1110行上下。选择道具
道具选择没那么复杂,但也是个挺冗长的过程。teams.ts中约1160-1420行有一长串按序执行的"if"语句来选择道具。这些条件中第一个达成的那条会决定这只宝可梦的道具。高优先级的选项通常是由宝可梦种类决定的,比如皮卡丘绑定电气球,百变怪绑定讲究围巾等。后续的判断条件则会逐渐变得更宽泛。比如有一条判断是“如果这只宝可梦既没有变化招式,也不是Fast Attacker(高速打手)或Wallbreaker(破盾手)定位,给它突击背心”。这条判断会一股脑给所有没带变化招式的宝可梦都套上突击背心,但它的优先级低于讲究道具和其他一些道具,所以实战中它基本被用在双刀手身上。如果什么条件都不满足,我们就给这只宝可梦发个吃剩的东西应付一下。这篇帖子没有足够篇幅来解释每一条判断条件,笔者建议读者自己看一下代码并配合常识理解一下。调整努力/个体值
绝大多数情况下,系统默认每项努力值都为85,满个体,性格无修正。然而,还是有些特殊情况。如果一只宝可梦没有物理攻击招式,它的攻击努力/个体值都会被调到0,其余不变。如果一只宝可梦携带了戏法空间或陀螺球,它的速度努力/个体值都会被调到0,其余不变。前代中,系统会调整特定能力的努力值来让虚吾伊德和铁火辉夜能更好地利用异兽提升。9代理论上也支持这种调整,不过目前还没用上。如果你读完了这些,恭喜你,你现在是RB配置生成专家了!把这条头衔写进你的简历里,这是你应得的。如果你还有别的问题,请尽管问!只是问之前请先确保你已经仔细阅读了全文。