首 页   |   新闻焦点  |   技术园地   |   速查资料   |   暗黑文学   |   下载中心   |   论 坛
论坛用户名 论坛密码  

|  新闻焦点  |   |  技术园地  |   |  速查资料  |   |  暗黑文学  |  
|  技术园地>>>一般技术>有关D2X的随机系统 打印
有关D2X的随机系统
www.D2CN.com   2003-6-24



原作:ONLYER


发信人: onlyer (I dream and I will), 信区: D2Tech
标 题: 有关D2X的随机系统
发信站: BBS 大话西游站 (Wed May 22 10:38:53 2002)

有关D2X的随机系统
Author: Onlyer
Last update: 2002-05-22

D2X中大量使用到了随机数, 各个Game都一个独立的随机数序列,
序列中的每个成员都为一个LARGE_INTEGER(即LONGLONG)数值,对于每个
Game的建立最初将按照如下方式建立初始随机数:
(对于Game的随机数我们称为该Game的全局随机数)

LARGE_INTEGER InitRand;
LARGE_INTEGER pc;

InitRand.HighPart = 0x29A;
QueryPerformanceCounter(&pc);
InitRand.LowPart = pc.LowPart + time(NULL) + GetTickCount();
InitRand.LowPart *= 0x2F490A95;
InitRand.LowPart -= 0x2E330917;
InitRand.LowPart &= 0x7FFFFFFF;
ptGame->HRand = InitRand;

之后,对于该Game中的任何Unit, 在其创建时都将更新该随机数,
方式如下:

DWORD __fastcall update_random(LARGE_INTEGER * ptr)
{
ptr->QuadPart = (LONGLONG)((LONGLONG)ptr->LowPart * 0x6AC690C5L)
+ ptr->HighPart;
return ptr->LowPart;
}
NewGameUnit(...)
{
....
update_random(&ptGame->hRand);
if (ptUnit->dwUnitType == UNIT_ITEM) {
ptUnit->HInitRand.LowPart = update_random(&ptGame->hRand);
ptUnit->hInitRand.HighPart = 0x29A;
ptUnit->hRand = ptUnit->hInitRand;
}
}
这里所提到的Unit包括了Game中的几乎任何东西, 比如Player, Chest, Monster,
NPC,Shrine, Missile, Item等等. Unit的创建与摧毁更新是相当频繁的,举个简单的例
子, Sor的一次Frozen Orb就将生成上十个Missile Unit, 一次Fire wall也与之类似.
同时, 对于新建立的任何Item Unit, 其本身也包含了一个随机数序列,这个随
机数序列将以该Item创建时当前的Game随机数进行初始化, 之后在任何对Item进行
属性修改时都将利用该Item的随机数参与运算并且以类似Game随机数序列的方式
进行更新. 比如Item的种类,包含的属性等等. 这里举一个比较简单而且结果可见的
例子:
Act5 Quest1的Socket任务, 其操作过程如下:
1. 首先对当前需要Socket的Item进行备份(这也是以前一些相关Dupe漏洞的出处之一),
然后对新生成的Item进行Socket尝试, 这里既然是新生成的Item, 其初始随机数就
只与当前Game中的当前全局随机数有关, 且HighPart必定为0x29A.

2. 对于Magic item其应该Socket一孔或者两孔的判断依据是
ptUnit->hRand.LowPart * 0x6AC690C5 + ptUnit->hRand.HighPart的运算结果.
如果该结果为偶数,则1 Socket, 否则为2 Sockets.
由1可以得知, HighPart必定为0x29A(偶数), 所以2 Socket则必须是
ptUnit->hRand.LowPart为奇数.

3. 同样的由1可以得知, 因为Socket时当前Game的全局随机数将决定该Item的初始随机
数.(两次更新后的结果), ptUnit->HRand.LowPart实际上将由该Game的当前全局随机数
决定.而Game的全局随机数只要能够获得其随机序列中的任何一个, 按照其更新法则,
则理论上是可以得出整个序列并且加以控制的. (不过我想这种内部关键数据应该是
不会发给客户端的, 而且里面的关联因素相当复杂,以前的一些MF工具基本上都
是在随意猜测)

4. 角色的RP之类的, 也都是谣传而已, 不过Game创建的初始随机数的确能够决定该
Game的整个随机数序列,不过仍然都是一个随机关系, 控制的决定性仍然在于你的MF
率等相关因素.在对象趋向无穷时,如果随机系统设计无误的话, 应该是能满足所设
定的关系的.

5. 同时其他的一些相关测试结果也表明Monster或者Chest Drop Item的种类不是在其
创建最初决定的,而是Drop时候进行判断决定. 这里的种类包括基本种类以及属性
等所有因子.

=====================
韬光晦影的一些评论:

根据这个帖子(且不讨论本贴的正确性),可以有以下结论:
1. 所谓RP(比如什么不能翻箱子,不能杀女鬼……),纯粹是无稽之谈;
2. 按照ONLYER的这个理论,对于喜欢K BOSS前换装备的人来说是个好消息:MF是计算对BOSS的最后一击,而非首击;
3. 再次证明了老咸鱼教授的统计学计算的正确性:打孔出1孔和2孔的几率相同,无论是在NORMAL还是在HELL。(在此对咸鱼教授的敬业精神表示崇高的敬意!)
4. D2X的乱数(随机)系统虽然理论有可能有规律,但实际破解的可能几乎为0。


原作者:ONLYER
来 源:ZIXIA BBS
共有3959位读者阅读过此文

告诉好友

  • 上篇文章:最强のPk Pally 闪亮登场
  • 下篇文章:有关item的表格,MF必看
  • □- 本周热门文章 □- 相关文章
    Countess掉Rune的属性(转)
    [转帖]七大人物套装的背景知识
    用我的实践告诉你 如何 得到 暗金 SC,基本正确!!
    PET 伤害
    双扔bar的橙色武器合成
    3PG配方。
    MF终极详解

    返回首页 加入收藏夹 返回页首 关闭窗口

    经典网络GAME的中心

    parkdown.cn
    魔兽工具下载

    点击申请

    点击申请

    点击申请

    点击申请

    本站LOGO

     

    | 广告服务 | 联系方式 | 版权申明| 管理登录 | 
    版权所有 Copyright © 2003  D2CN.com
    陕ICP备05006600号