传奇代码研究 极品机率...

别再跟我说什么砍墙角,别在跟我说什么0-100收拾稳加属性,别在跟我说什么北京时间几点几点容易成。。。。。本人开过f,深知服务器如何设定,但是一下代码部分为一高人赐教。现在发给大家,望有助飞升。
第一讲:
炼武器众所周知,需要两种材料,一个是首饰,一个是黑铁矿,黑铁矿仅仅影响练成武器的持久,和成功几率不相关,所以最关键的变量就是首饰的属性,成功几率的计算相当复杂,我们先考虑首饰只有一种攻击型属性的情况。
成功几率的代码
第一段
nDc := HiWord(StdItem80.DC) + LoWord(StdItem80.DC); 
nSc := HiWord(StdItem80.SC) + LoWord(StdItem80.SC); 
nMc := HiWord(StdItem80.MC) + LoWord(StdItem80.MC);
这段代码表示
NDC为首饰的攻击上限+首饰的攻击下限
if nDcMin < nDc then begin 
nDcMax := nDcMin; 
nDcMin := nDc; 
end else begin 
if nDcMax < nDc then nDcMax := nDc;
这段代码表示,仅仅只有两件上下限之和最高的首饰,影响成功几率
ndcmin=上下限攻击之和最高的首饰的上下限攻击之和
ndcmax=上下限攻击之和次高的首饰的上下限攻击之和
第三段代码
btDc := nDcMin div 5 + nDcMax div 3; 
btSc := nScMin div 5 + nScMax div 3; 
btMc := nMcMin div 5 + nMcMax div 3;

btdc等于dcmax整除3+dcmin整除5

这三段代码的核心就是计算出btdc 这是是影响武器升级成功几率的第一个参数

第四段代码
n90 := _MIN(11, UpgradeInfo.btDc)
计算n90的值,n90为11和btdc两个值中小的一个

第五段代码
n10 := _MIN(85, n90 shl 3 - n90 + 10 + UpgradeInfo.UserItem.btValue[3] - UpgradeInfo.UserItem.btValue[4] + User.m_nBodyLuckLevel);
这段代码是计算n10的值
n10为85和n90*7+10+武器的幸运-武器的诅咒+人物幸运等级 这两个值中小的一个
由这段代码我们可以发现,武器的额外附加的幸运值是影响武器成功几率的一个重要参数!!
所以幸运高的武器成功几率更高!!!
另外,还有一个重要参数User.m_nBodyLuckLevel 这个参数表示人物的幸运等级
这就是传奇的一个隐藏属性,就是人物的幸运值
幸运等级的计算过程
procedure TBaseObject.AddBodyLuck(dLuck: Double); //004BF580
var n: Integer;
begin 
if (dLuck > 0) and (m_dBodyLuck < 5 * BODYLUCKUNIT) then 
begin m_dBodyLuck := m_dBodyLuck + dLuck; 
end; 
if (dLuck < 0) and (m_dBodyLuck > -(5 * BODYLUCKUNIT)) then 
begin m_dBodyLuck := m_dBodyLuck + dLuck; 
end;
n := Trunc(m_dBodyLuck / BODYLUCKUNIT); 
if n > 5 then n := 5; 
if n < -10 then n := -10; 
m_nBodyLuckLevel := n;
end;
影响m_nBodyLuckLevel 即人物的幸运等级有三个参数 dLuck m_dBodyLuck BODYLUCKUNIT
dluck有这么几个过程影响
1.获得经验 dluck= exp*0.002
2.升级 dluck=100
3.死亡 dluck=-人物等级*5
4.杀人 dluck=-500
BODYLUCKUNIT 为服务器设定的固定参数 等于5000
m_dBodyLuck由dluck和BODYLUCKUNIT计算产生
因而,为了获得高的幸运等级,你不能杀人,最好在升级武器之前能够不断的练级,获得经验
幸运等级最高时5,最低是-10

总结一下
这一大段的代码,结合起来武器成功几率的计算函数就是
1.上下限攻击最高的首饰的上下限攻击 我们令为nDCmin 
2.上下限攻击次高的首饰的上下限攻击 我们令为nDCmax
3.人物的幸运等级 m_nBodyLuckLevel 
计算公式
min(85,min(11,dcmin整除5+dcmax整除3)*7+武器额外幸运-武器额外诅咒+人物幸运等级)/引擎设定的升级成功几率

比如 我们令引擎设定的升级成功几率为100
升级用的首饰为2个绿色项链
人物的幸运等级为0
武器的额外幸运为0
额外诅咒为0
那么升级的成功几率就是
1.dcmin=2+5=7
2.dcmax=2+5=7
3.dcmin整除5+dcmax整除3=1+2=3
4.min(11,3)=3
5.3*7+0-0+0=21
6.min(85,21)=21
7.21/100=21%就是武器的成功几率!!!!!!

在这段公式中我们可以发现什么??
1.在M2中,我们可以设定的参数仅仅只有一个就是
看图

就是成功几率 这个值影响成功几率的分母 设置100的话就是原始的升级难度 设置50就是50%的升级难度
2.在成功几率默认为100的情况下,升级武器的成功几率最高位85
3.武器附加的幸运和诅咒值将影响成功几率 影响效果为额外增加值*(100/成功几率)
,如果成功几率默认为100 ,那么一点额外的幸运奖附加1%的成功几率,如果为50
则附加2%,所以升级武器,武器的幸运越高越好
4.人物的幸运等级也影响成功几率,由于重启服务器之后,人物的幸运等级为0,所以一定要在升级武器之前获得足够的幸运等级,可以通过获得经验的方式来增加幸运等级,根据上文的公式,1点经验将增加0.002点nluck 获得满值的幸运等级需要获得 500*5*5000 1250千万的经验!!!浩大的工程,而且,你还不能死亡,不能杀人,幸运等级影响的最高几率为5%
5.升级武器最关键的还是两件首饰,只有两件,多用首饰都是无用的,而且这两件首饰的属性并不是越高越好,
比如在76服中
法师升级 如果是2个铃铛 那么8整除5+8整除3=5 贡献5*7%=35%的成功几率
法师升级 如果是2个生命 那么6整除5+6整除3=3 贡献3*7%=21%的成功几率
一个生命一个铃铛 那么8整除5+6整除3=4 贡献4*7%=28%的成功几率
这个贡献值最高位11 即最高实现77%的成功几率的贡献
武器升级的首饰相对属性不好 2个记忆的话 效果相当于2个生命 2个绿色的话 也仅仅相当于2个生命 只有两个圣战 效果才相当于两个铃铛,道士也一样 
因为在76服中,武器升级,法师有很大的优势

第二部分, 跳点的计算
跳点的实现min(85,min(11,dcmin整除5+dcmax整除3)*7+武器额外幸运-武器额外诅咒+人物幸运等级)这段计算过程相关
如果这个值>63 并且Random(g_Config.nUpgradeWeaponMCTwoPointRate) = 0 那么挑2点
如果这个值>79 并且Random(g_Config.nUpgradeWeaponMCThreePointRate) = 0 那么挑3点
g_Config.nUpgradeWeaponMCTwoPointRate和g_Config.nUpgradeWeaponMCThreePointRate
是在M2上设定的

就是这两个数值
如果你能理解前面的推算过程,那么明确的说,跳点的实现实在是太难了,基本不可能不仅仅是几率的问题,更重要的是,你基本没有办法实现63 79的成功参数

总结来说
影响武器升级成功几率的参数
1.幸运 + 额外幸运点数*(100/成功几率(M2设定的))%
2.诅咒 - 额外诅咒点数*(100/成功几率(M2设定的))%
3.幸运等级 最高+5% 最低-10%
4.首饰的属性函数 n90值 

min(85,min(11,dcmin整除5+dcmax整除3)*7+武器额外幸运-武器额外诅咒+人物幸运等级)/引擎设定的升级成功几率 这个是成功几率的公式

别再跟我说什么赤月恶魔能暴极品,别在跟我说什么祖玛教主才出极品,别在跟我说北京时间几点几点出极品,别再跟我说什么服务器重启出极品。
第二讲:
传奇极品装备的生成原理
传奇M2里可以设置装备极品属性的概率,那么这个概率和具体增加的属性点数是怎么计算的呢?
为了让大家能够更好的理解,我尽量不适用专业术语,大拿勿扰!!
影响装备极品属性的参数有两类,一类是可以再M2设置的,一类是引擎内部固定的
以hero引擎为例 武器 有3个参数影响 戒指 手镯 项链 铠甲 头盔 有4个参数影响 
靴子 腰带 宝石 勋章 不产生极品属性


这4个参数是 1.极品属性出现几率 2.最高点数 3.点数几率 4.属性几率(属性几率武器没有)

具体的代码为 
1.武器极品属性生成过程

procedure TItem.RandomUpgradeItem(UserItem: pTUserItem);
var nUpgrade, nIncp, nVal: Integer;
begin 
case ItemType of 
ITEM_WEAPON: 
begin 
nUpgrade := GetRandomRange(g_Config.nWeaponDCAddValueMaxLimit {12}, g_Config.nWeaponDCAddValueRate {15}); 
if Random(15) = 0 then UserItem.btValue[0] := nUpgrade + 1;


这段代码是生成武器极品攻击属性的过程的一部分,
GetRandomRange 这个函数是产生装备极品属性的核心函数
比如 在这个过程中 GetRandomRange的两个参数是 
1.g_Config.nWeaponDCAddValueMaxLimit {12} 这个就是最高点数
2.g_Config.nWeaponDCAddValueRate {15} 这个是点数几率
这个函数的过程是
function TItemUnit.GetRandomRange(nCount, nRate: Integer): Integer;
var I: Integer;
begin 
Result := 0; 
for I := 0 to nCount - 1 do 
if Random(nRate) = 0 then Inc(Result);
end;
具体来算 如果最高点数是 10 点数几率是15的话
那么产生N点极品属性的概率是 (1/15+1)^(N-1)
比如 如果N=1 则概率=1 N=2 概率=1/16 N=3 概率=(1/16)^2
所以 点数几率这个参数是最最影响极品属性的产生几率的!!!它和产生极品属性的点数成指数关系
在hero的引擎中,武器和戒指没有属性几率的参数,引擎固定的是15,也就是if Random(15) = 0 这一段 就是说 在我们刚才设置的 10 15参数的基础上 武器获得一点攻击的极品属性的概率是 1/16*1/极品属性出现几率

如果我们令 产生某项属性的点数为 N
那么 概率=(1/极品属性出现几率)*(1/属性几率)*(1/点数几率+1)^(N-1)
最高点数影响 N的最大值

其他装备各项属性的参数 持久不做考虑 铠甲 手镯 项链 所有参数都可以再M2设定
装备 属性 极品属性出现几率 属性几率 点数几率 最高点数 备注
武器 准确 M2设定 24 15 12 

戒指这个装备很特殊 调整属性几率 需要在!setup.txt修改 M2上不可以直接调整,默认值为30
这也就解释了,为什么HERO引擎的服,为什么戒指的几率实行概率为什么这么低....

总结来说 就是这么个公式
可以帮助大家计算极品属性出现的概率
概率=(1/极品属性出现几率)*(1/属性几率)*(1/点数几率+1)^(N-1)

宝宝相关
1。诱惑之光的几率
在M2我们可以设置的参数是
怪物等级 g_Config.nMagTammingTargetLevel 默认是10
怪物血量 g_Config.nMagTammingHPRate 默认是100

第一段代码 诱惑人物 诱惑他人宝宝时的过程
if (TargeTActorObject.m_btRaceServer <> RC_PLAYOBJECT) and (TargeTActorObject.m_btRaceServer <> RC_HEROOBJECT) and ((Random(4 - nMagicLevel) = 0)) then 
begin TargeTActorObject.m_TargetCret := nil; 
if TargeTActorObject.m_Master = BaseObject then 
begin TargeTActorObject.OpenHolySeizeMode((nMagicLevel * 5 + 10) * 1000); 
Result := True;

这段代码解释
如果 目标不是人物 不是英雄 随机(4-诱惑之光等级)=0 那么设定目标怪物的m_TargetCret=nil
如果 目标怪物存在主人,则宝宝变黄 这段代码就是诱惑他人的宝宝 然后宝宝会变黄

第二段 代码 诱惑怪物的判断

if Random(2) = 0 then begin 
if TargeTActorObject.m_Abil.Level <= BaseObject.m_Abil.Level + 2 then begin if Random(3) = 0 then begin 
if Random((BaseObject.m_Abil.Level + 20) + (nMagicLevel * 5)) > (TargeTActorObject.m_Abil.Level + g_Config.nMagTammingTargetLevel {10}) then begin
if not (TargeTActorObject.bo2C1) and 
(TargeTActorObject.m_btLifeAttrib = 0) and 
(TargeTActorObject.m_Abil.Level < g_Config.nMagTammingLevel {50}) and 
(BaseObject.m_SlaveList.Count < g_Config.nMagTammingCount {(nMagicLevel + 2)}) then begin 
这一系列的条件就是
1.诱惑的宝宝等级小于人物等级+2
2.怪物是不死系怪物
3.怪物的等级小于M2中设置的允许召唤怪物的最高等级
4.自身的宝宝数量小于允许召唤的宝宝最高数量
5.诱惑的成功几率1=(目标怪物等级+怪物等级(M2设定参数))/自身等级+20+诱惑之光等级*5

第三段代码 实现诱惑

if g_Config.nMagTammingHPRate <= 0 then g_Config.nMagTammingHPRate := 100; n14 := TargeTActorObject.m_WAbil.MaxHP div g_Config.nMagTammingHPRate {100} if n14 <= 2 then n14 := 2 
else Inc(n14, n14); 
if (TargeTActorObject.m_Master <> BaseObject) and (Random(n14) = 0) then begin TargeTActorObject.BreakCrazyMode()
if TargeTActorObject.m_Master <> nil then begin
TargeTActorObject.m_WAbil.HP := TargeTActorObject.m_WAbil.HP div 10
end; 

解释 1.第一行 如果 g_Config.nMagTammingHPRate参数小于等于0的话 初始化这个参数为100
2.第2-4行 诱惑成功几率n14=目标怪物的最高血量 整除 g_Config.nMagTammingHPRate参数
如果N14小于等于2 那么N14=2
否则 N14=N14*2
这段计算中 N14是关键 最低值为 2 几率为 1/(目标怪物最高血量 整除 怪物血量(M2设定的参数))

3.接下来的过程的意思是 如果诱惑的是别人的宝宝的话 那么诱惑成功之后 宝宝的血量仅为最高血量的10%

为了方便大家理解 不考虑宝宝红名的过程 这段代码有点长 就不考虑了

那么从上面的分析中,我们可以发现,影响诱惑之光成功的概率的参数为
1.人物自身的等级
2.目标怪物的等级
3.M2设定的两个参数 怪物等级 怪物血量
4.诱惑之光的等级

具体诱惑成功的几率为 1/6*(目标怪物等级+怪物等级(M2设定参数))/(自身等级+20+诱惑之光等级*5)*1/(2*(目标怪物最高血量 整除 怪物血量(M2设定)))

这样大家可能理解较难 还是举例说明
比如 在M2设定都是默认值的情况下 30级 3级诱惑之光的法师诱惑26级多多的几率就是
1/6*(26+10)/(30+20+15)*1/(2*(900 整除 100))
=1/6*36/55*1/18
=0.6%。。。。。
真够低的了
千分之6 百分之1都不到 按1秒1个诱惑的话 大约平均需要3分钟左右才能诱惑成功一个多多

宝宝升级属性加成

代码

procedure TActorObject.MonsterRecalcAbilitys;//宝宝升级获得属性的过程
var n8: Integer;
begin m_WAbil.DC := MakeLong(LoWord(m_WAbil.DC), HiWord(m_Abil.DC)); //初始化宝宝的攻击
n8 := 0; 
if (m_btRaceServer = 100) or (m_btRaceServer = 113) or (m_btRaceServer = 114) then begin//检测是不是骷髅 神兽 月灵
// 下面一段是宝宝升级之后攻击的变化
//公式 增加的攻击=(宝宝等级*0.1+0.3)*3*宝宝等级=0.9lv+0.1*lv^2
//如果是7级神兽的话 攻击增加 6.3+4.9=11.2=11点攻击上限
//宝宝升级后仅仅增加攻击上限,不是很高
m_WAbil.DC := MakeLong(LoWord(m_WAbil.DC), _MIN(MAXHUMPOWER, Round((m_btSlaveExpLevel * {1.0e-1} 0.1 + {3.0000000000000000001e-1} 0.3) * {3.0} 3.0 * m_btSlaveExpLevel + HiWord(m_WAbil.DC)))); 
//下面是血量的增加
//公式 每级的血量=宝宝等级*0.1+0.3)*宝宝初始血量*宝宝等级+宝宝初始血量
//必须3级狗 血量=3*0.1+0.3)*300*3+300=840点HP
n8 := n8 + Round((m_btSlaveExpLevel * {1.0e-1} 0.1 + {3.0000000000000000001e-1} 0.3) * m_Abil.MaxHP) * m_btSlaveExpLevel; 
n8 := n8 + m_Abil.MaxHP; 
if m_btSlaveExpLevel > 0 then m_WAbil.MaxHP := n8 
else m_WAbil.MaxHP := m_Abil.MaxHP; 
end else 
//其他类型怪物的属性升级
//这段升级相对好理解的多
//1.HP增加,每级增加60点
//2.攻击上限增加 等级*2
begin 
n8 := m_Abil.MaxHP; 
m_WAbil.DC := MakeLong(LoWord(m_WAbil.DC), _MIN(MAXHUMPOWER, Round(m_btSlaveExpLevel * 2 + HiWord(m_WAbil.DC)))); 
n8 := n8 + Round(m_Abil.MaxHP * {1.5000000000000000001e-1} 0.15) * m_btSlaveExpLevel; 
m_WAbil.MaxHP := MinLong(Round(m_Abil.MaxHP + m_btSlaveExpLevel * 60), n8); 


总计 
重要 需要理解两个lv
1.m_btSlaveExpLevel 宝宝等级 即0-7级
2.m_Abil.Level 宝宝自身的等级
启示
1.宝宝升级的速度和宝宝自身的等级(DB库中设定的等级) 成反比 等级越高的宝宝越难升级
2.神兽类宝宝升级之后 血量加成较多,而攻击加成较少
3.其他类型的宝宝 血量加成为固定的60点 攻击加成为宝宝等级*2
4.由此可见 在最初传奇的设计中,道士宝宝耐*,法师宝宝攻高

传奇中的其他属性
传奇中还是有很多属性的,总结起来有,
幸运 诅咒 这个很多人都是了解的 暂时不表
神圣 一个奇怪的 属性
生命恢复
魔法恢复
毒物躲避
中毒恢复
攻击速度
我们一个个说
先说幸运和诅咒
幸运和诅咒对攻击力的影响函数是这样的 幸运和诅咒都用nluck代表 正就是幸运 负就是诅咒
我手上的这套代码比较老,不能设置多少点幸运实现最大伤害,我们假设9点幸运能够实现最大伤害0
if m_nLuck > 0 //如果NLUCK大于0 就是附加幸运
then begin 
if Random(10 - _MIN(9, m_nLuck)) = 0 
//这个是核心计算公式
//如果 你自身的幸运点数为 X (0 < X < 10)
//那么1/(10-X)的几率能够实现最大的攻击 即 攻击上限加攻击下限
//这段代码的最大作用是揭示了运9和运8质的不同 如果是运9的话 那么实现最大攻击的概率是100% 而运8 只有1/2 运7是 1/3...
then Result := nBasePower + nPower 
else Result := nBasePower + Random(nPower + 1); 
end 
else begin 
Result := nBasePower + Random(nPower + 1); 
if m_nLuck < 0 then begin 
if Random(10 - _MAX(0, -m_nLuck)) = 0 then Result := nBasePower; 
end;
//诅咒的计算可以参考幸运的计算
那么 我们令人物的攻击为 a-b a为攻击下限 b为攻击上限 幸运点数为x
那么 平均攻击力=b*(1/(10-x))+(a+b)/2*(1-(1/(10-x)))
化简 power=(a+b)-(b-a)/(10-x)


神圣
神圣这个属性的作用其实非常简单
它作为人物的属性 代码是 bt1DF
在两段代码中出现
第一段
function TActorObject.GetHitStruckDamage(Target: TActorObject; nDamage: Integer): Integer; 
.....//中间省略N段..
if (m_btLifeAttrib = LA_UNDEAD) and (Target <> nil) //如果是不死怪物 并且 目标确实存在
then begin 
Inc(nDamage, Target.m_AddAbil.bt1DF);//增加伤害bt1DF 点
第二段
function TActorObject.GetMagStruckDamage(BaseObject: TActorObject; nDamage: Integer): Integer 
.....//中间省略N段..
if (m_btLifeAttrib = LA_UNDEAD) and (Target <> nil) //如果是不死怪物 并且 目标确实存在
then begin 
Inc(nDamage, Target.m_AddAbil.bt1DF);//增加伤害bt1DF 点


这两段代码就是获取对方物理和魔法防御力 
由此可见 神圣就是增加对不死怪物的伤害 无论是物理还是魔法伤害 而且忽视防御 这个属性还是很厉害的


生命恢复和魔法恢复
真正的假属性 我研究的所有源码 sky05年的 飞尔 361 包括最老的传奇源码 都没有真正的作用......第一冒牌属性!!!!

毒物躲避和中毒恢复
1.毒物躲避 这里涉及到什么是毒物 只有两种 主要是防止麻痹的概率
被麻痹的概率= 1/(M2设定的概率+毒物躲避点数(每10%1点))
那么毒物躲避100%的话 并不是100%防麻痹 麻痹的概率是 1/(M2+10)

2.中毒恢复 无用属性 冒牌货.....

吸血属性
这个属性也有意思的
吸血有两种情况
1种是虹魔类首饰 anicount 为吸血参数
1种是吸血武器 重量是吸血参数

虹魔类
if m_nHongMoSuite > 0 
then 
begin 
m_db3B0 := nPower / 100 * m_nHongMoSuite; 
if m_db3B0 >= 2.0 
then 
begin 
n20 := Trunc(m_db3B0); 
m_db3B0 := n20; 
DamageHealth(-n20); 
end; 
end;
npower为 攻击对方时能够伤害的点数

也就是说 如果你能够对对方造成100点伤害的时候 你佩戴了5件虹膜首饰
那么 你能吸血的点数是
100/100*25=25点血.......还是很可怜的
所以虹魔吸血和攻击力有非常大的关系!!!

武器类吸血 同样 不同的是 重量增加m_nHongMoSuite值 这个是吸血的重要属性
如果重新定义下吸血的作用的话就是
百分比 anicount=5 就是伤害值5%的吸血量
武器 weight=100 就是伤害值100%的吸血量

procedure TBaseObject.AddBodyLuck(dLuck: Double); //004BF580
var n: Integer;
begin 
if (dLuck > 0) and (m_dBodyLuck < 5 * BODYLUCKUNIT) then 
如果dluck大于0并且m_dBodyLuck小于25000,那么m_dBodyLuck =m_dBodyLuck +dluck也就是说m_dBodyLuck 最大值不超过25000 25000/0。002=1250W的经验,也就是说如果在不死的情况下能练1250W经验不死的话,m_dBodyLuck就可以达到最大值了是么。我有个问题请教楼主,如果下线或服务器重启的话,m_dBodyLuck 的值会清零么?盼赐教。
begin m_dBodyLuck := m_dBodyLuck + dLuck; 
end; 
if (dLuck < 0) and (m_dBodyLuck > -(5 * BODYLUCKUNIT)) then 
begin m_dBodyLuck := m_dBodyLuck + dLuck; 
end;
n := Trunc(m_dBodyLuck / BODYLUCKUNIT); 
这一段是m_dBodyLuck /BODYLUCKUNIT,因为最大的m_dBodyLuck 值为25000,所以除以BODYLUCKUNIT 一般在5左右。也就是说最有参与武器升级的m_nBodyLuckLevel 也就是n最大值不过超过5,那么练级的1250W经验就要分成5份来练。每250万为一个等级,如果练了490,
m_nBodyLuckLevel 仍然是1是么?

if n > 5 then n := 5; 
if n < -10 then n := -10; 
m_nBodyLuckLevel := n;
end;

 

posted @ 2015-06-06 19:51  大龙软件工作室  阅读(7707)  评论(0编辑  收藏  举报