当前位置:首页>>攻略文章>>正文
魔兽科普:模拟器组成原理(一)
2013-12-27 23:50:41 作者:fhsvengetta 来源: 浏览次数:0
摘要:我会把我所知道的重点尽可能地写出来。由于这个系统非常庞杂,不可能事无巨细全都写出来,但在你读懂这篇内容之后,加上少许编程功底,应该就能够达到自制DPS模拟器的水平。
导航:
 蒙特卡洛法重识SimC反向工程时间驱动和事件驱动表达式解析面向对象的模拟器设计机器不掷骰子|

反向工程
反向工程是DPS模拟器的基石。
要制作DPS模拟器,你必须首先能够在脱离客户端的情况下进行DPS机制的重现。
所有的数字、公式,都是暴雪一手敲定的,而且暴雪并不会详细地列举出来告诉玩家。有些机制非常繁杂,甚至还有些机制是根本不透明的。
你要得到这些机制和数字,必然涉及信息搜集和反向工程。如果你搞不定反向工程,摸不准所有机制和准确数据,制作DPS模拟器就是妄想。
信息搜集
蓝贴是主要的信息源。很多数字是由螃蟹亲口说出来的,例如MoP版本的首领暴击压制为3%——原帖链接可能已经失效了,否则我真的希望给你们贴出来看看。
\

                                                                                                 图:螃蟹亲自说明的暴击压制。
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的发布进行更新。



相关报道:

[关闭] [返回顶部]


  返回首页 | 最新资讯 | 资源下载 | 魔兽图片 | 单机文档 | 技术攻略 | 玩家视频
备案号:蜀ICP备2024062380号-1
免责声明:本网站为热爱怀旧WOW的玩家们建立的魔兽世界资料网站,仅供交流和学习使用,非盈利和商用.如有侵权之处,请联系我们,我们会在24小时内确认删除侵权内容,谢谢合作。
Copyright © 2024 - 2024 WOWAII.COM Corporation, All Rights Reserved

机器人国度