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

别再跟我说什么砍墙角,别在跟我说什么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; 

转载于:https://www.cnblogs.com/plug/p/4557181.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值