楼主您好:
既然您喜欢用计算机理论,那我也试图用计算机理论回答。我没做过反编译暗黑的事情,基本上借助普通技术,也不可能做到的。
一、首先,编写暗黑的高级语言肯定是C++,也会有部分汇编程序做成的模块,不可能是其他的语言,尤其不可能是VB
大量的专业研究文献表明,C++的语言效率是所有高级语言中最高的,大约是VB的15~20倍。尤其,暗黑2是采用了三维技术的,涉及到DirectX。DirectX开发包本身是C++的,我想您一定没用过C++以外的语言编写像暗黑这样复杂度的DirectX的程序。我想告诉您,那是地狱难度的。
(不要和我说Framework时代以后的事情,因为暗黑2出品的年代还没有framework)
另外一个侧证,就是魔兽争霸和星际争霸的语言是C++
二、从MF值的算法角度讨论,绝对不可能使用整数值来设置MF值,理由如下:
理由1、MF的概念是什么?——捡到魔法物品的概率。那么好,学过数学的都知道概率是个百分比数字。既然是百分比,那么假定好比暗黑共有10000种物品,那么出现格力风之眼的比例,一定小于1%吧?即便你说这是随机数,好,但是当选择数超过100,那就会出现乘除法,那么一定就有小数。所以,不是整数值。
理由2、简单的算法讨论,就能否定您的命题。我相信这里每个人都能看懂下面的论述。
继续使用上述假定。怪物掉出物品,最直接的算法是什么呢?很简单,想象一条很长很长的火车。这火车共有10000节车厢。(就是每个车厢代表一种物品)。然后用这辆货车代表暗黑所有物品的“集合”,然后从最垃圾的微小血瓶,到最高级的什么什么,依次排列,并且事先对车厢进行编组,前5000节是白色物品,后2000节蓝色,2000节绿色,1000节暗金。(当然都是假定数字)(上述陈述表示了最基本的一维数组概念)那么,怪物每次掉出物品,只需要如下算法即可:取一个随机数,判断属于哪节车厢即可。这就是“均匀概率”,或者叫做“完全随机数”。
如果加入了MF值,就表示“随机数”不随机。更加倾向于取到“靠后”的车厢,即魔法物品或更高。修正算法的最直接办法是什么?很简单,一种就是你把火车“变长”,原来一个车厢装格力风之眼的,现在2个车厢装,火车也变长了一截,这是改变数组的办法。反过来,另一种就是增加一个变量,去影响选中后面车厢的可能性。原来每次选中每个车厢的概率是1万分之一,现在不是,先选“在火车的哪一段”,然后再选“具体哪一节”。相当于把一万节车厢的火车拆成白色段、绿色段、蓝色缎、暗金段等等。每段长度根据物品种类来,总长不变。但是选择时,我先考虑“上哪一段”,比如我有3/6的概率上白色段,1/6暗金段等等。等我选择了“哪一段”,然后再使用均分概率选择哪节车厢。MF影响的是“哪一段”这个选择项,高MF值倾向于选择有色段。至于暗金装备中,为啥暗视之盔到处都是,而格力风很少,其实就是再次运用这个概念,拆分“暗金段”的车厢集合。
站在每一个车厢的角度看,其实式子就是 1/10000 + x%,这个x%就是MF值带来的“各段选择倾向”带来的综合优势。白色物品的这个x%是负数,有色的是正数。
实际的MF值模型就类同上述,叫做“骰子模型”,网上能找到实际模型,当然要比这个模型复杂很多。
如此看来,多重概率组合的结果是MF不可能带来整数型的影响。
三、您的理论本身存在缺陷。您一定是借用了00-FF这个十六进制数来表示一个BYTE的内存变量值吧。FF就是255,FE就是254这没错。而你又给出了254-508的等式,也就是说,你认为00-FF是一个概率的闭合区间,如果加倍往上翻,只不过是在这个区间内循环往复,对吧?
但是,254=508这个等式不对。十六进制中,如果在255以上就要用2个BYTE。表达同样区间往复的方法,00 FE = 01 FE才是正确的。
很不幸的是,01 FE这个数字,是511而不是508,因为中间有 00 FF (255),01 00(256)两个数字,从01 01开始才是257 - 511的循环(相当于你的第一个区间1~254),在高级语言里减去一个FF才是区间循环,可以用数位运算来做。(不可能用if语句等低级形式,因为太慢了)
所以254=508这个等式本身不成立。
最后,你的INT变量(整数变量)拼错了,应该是Integer,不是Interger
引用:
原帖由 帅哥哥啊 于 2010-7-26 14:16 发表
以下是我转载的一个
但准确性有待研究
本文章为本人玩暗黑的经验之谈,虽玩暗黑算不上高手,但是我始终相信MF不是越大越好,而是254理论最好!
杀老M的MF的最佳状态=254,杀BEAL等没试过,但估计254杀BEAL或其他任何怪物 ...