图:螃蟹亲自说明的暴击压制。
NGA转载蓝贴总是挑一些大家感兴趣的内容,橙色多彩宝石对各职业专精的触发率因数因为涉及专精间比较会引起关注,而这种诸如“MoP首领护甲为24835”的无聊蓝贴从来都没人去翻译转载。而恰好这些蓝贴是重建魔兽世界机制的绝佳的、不可或缺的信息源。
所以如果你希望重建魔兽世界的机制,你必须对任何蓝贴蓝推保持高度敏感。国外某些网站有专门的蓝贴追踪而国内没有,推特需要翻墙这一点非常不方便,加上语言障碍,这其实是我们在这一领域落后于欧美人的一大原因。
如果某些数字你实在得不到,亲自去问天龙吧,这比做几千几万次木桩概率实验成本低得多。
木桩实验
并不是所有搜集得到的机制都是正确的。第三方网站给出的机制如此,暴雪亲自说的机制也如此。暴雪脑子里设计的机制和游戏中实现的不一样,这通常称为“BUG”。但良性BUG通常不会得到修复。
无论如何,你需要木桩实验。
图:灰谷的一千次裸暴嗜血,风焰的一千次满暴冰枪,确认MoP暴击压制机制的两次重要实验。
购买一些NPC出售的低等级白色品质武器,对着木桩砍吧,如果你得到的伤害数字与通过待测机制计算得到的数字完全相符,那就是正确的。
DBC拆解
你知道每个版本的属性战斗等级值是怎么得来的吗?比如85级时179.28暴击等级=1%暴击,90级时600暴击等级=1%暴击?
在初期,这些数据是通过穿上一件装备、再脱下一件装备,通过两点差商计算得到的。我想现在让大多数人来做都会选择这么做。
而实际上,这样不可能得到准确的数值。比如那时曾有一个流传甚广的“精确值”179.2799,那么它到底精确与否?
通过拆解客户端的misc.mpq(及后续Build补丁MPQ,如果有覆盖的情况),可以得到一个DBC文件叫做“gtCombatRating.dbc”。DBC文件顾名思义,是魔兽世界的客户端数据库(DataBase Client),是由非常紧凑的数据结构写下的列表文件。
我们使用一个小工具将它转化为常规的csv格式表格,然后用Excel打开查看,发现85级时暴击等级的战斗等级准确值为179.280045(单精度浮点数),90级的准确值为600。
图:DBC拆解演示,战斗等级精确值的拆解。
涉及到魔兽世界客户端的拆解,你可能需要一些特殊组织的帮助,其中大多数是服务端仿真器的制作社区。服务端仿真器也就是我们俗话说的“私服”。只有他们对魔兽世界的客户端运作机制最了解。
制作和研究服务端仿真器(Server Emulator)并不违反任何规则和许可条例,但运营私服是非法的。这些技术社区是合法的,而拿他们的产品架设私服供人连接进行游戏的人是非法的。
所以我只会给你提供一些制作者社区的名字,而不会给你提供私服运营者的名字。它们有:MaNGoS、ArcEmu、TrinityCore、ArkCore,等等,你可以在它们的社区上找到很多客户端拆解的技术支持,其中包括大量的各版本DBC文件数据结构的文档。
Code (c):
struct dbc_header
{
uint32_t magic; // always "WDBC'
uint32_t record_count; // records per file
uint32_t field_count; // fields per record
uint32_t record_size; // sum (sizeof (field_type_i)) | 0 <= i < field_count. field_type_i is NOT defined in the files.
uint32_t string_block_size;
};
template<typename record_type>
struct dbc_file
{
dbc_header header;
// static_assert (header.record_size == sizeof (record_type));
record_type records[header.record_count];
char string_block[header.string_block_size];
};
代码:DBC文件数据结构例。
SimC有自己的完善的DBC自动拆解工具,使用Python编写,可以一键批量拆解所需的数据为inc文件,直接包含到源代码中,免除了人工录入数据的步骤及其可能产生的错误。这个工具需要随着魔兽世界每一个Build的发布进行更新。