|
|

楼主 |
发表于 2021-11-1 15:21:02
|
显示全部楼层
应求放一个代码说明,其实一开始就想放在脚本注释中来着,结果发现注释中有中文会造成脚本运行错误
DiffMult := 5.0;
//难度系数
PCLevel := 81;
//原游戏PC能达到的最高等级(忽略传奇技能)
iOldLevel := GetElementNativeValues(e, 'ACBS\Level');
//获取该NPC原等级
//**************************对原版固定等级NPC进行预处理***************************************//
iPLM := GetElementNativeValues(e, 'ACBS\Flags\PC Level Mult');
//该NPC是否随PC提升等级,1为是,0为否
if (iPLM = '0') then
SetElementNativeValues(e, 'ACBS\Flags', GetElementNativeValues(e, 'ACBS\Flags') or 128);
if (iPLM = '0') then
SetElementNativeValues(e, 'ACBS\Calc min level', (iOldLevel));
if (iPLM = '0') then
SetElementNativeValues(e, 'ACBS\Calc max level', (iOldLevel));
if (iPLM = '0') then
SetElementNativeValues(e, 'ACBS\level Mult', 1000);
//如iPLM为0则为其添加“PC Level Mult”的flag,并将原等级作为新最小、最大等级,level Mult设为1000(1000即与PC等级比为1:1)
//**************************对原版固定等级NPC预处理完毕***************************************//
iLevelMult := GetElementNativeValues(e, 'ACBS\Level Mult');
iMinLevel := GetElementNativeValues(e, 'ACBS\Calc min level');
iMaxLevel := GetElementNativeValues(e, 'ACBS\Calc max level');
//对处理完毕后均已随PC等级提升的NPC,获取原等级比率、最小、最大等级
if (iMaxLevel = '0') then
SetElementNativeValues(e, 'ACBS\Calc max level', 81 * iLevelMult / 1000);
//一个特例,对原版最大等级设为0的NPC,将“81 * iLevelMult / 1000”设为他的最大等级,即原版该NPC理论上可以升到的最大等级
iMaxLevel := GetElementNativeValues(e, 'ACBS\Calc max level');
//重新获取最大等级
//**************************开始计算最大等级***************************************//
iNewMaxLevel := iMaxLevel * ( ( Power(0.99,iMaxLevel) ) * ( DiffMult - 1 ) + 1 );
//按照公式计算新的最大等级(注:“Power(a,b)”即a的b次方 )
//该公式中,系数“ ( Power(0.99,iMaxLevel) ) * ( DiffMult - 1 ) + 1”随着iMaxLevel增大而无限趋近于1,即,原最大等级越大,计算出的新最大等级越接近于原最大等级
//这是因为一些mod中的boss原本的等级就已经足够高(如警戒者),这样做可以有效平衡NPC之间的强弱
if (iNewMaxLevel < iMaxLevel) then
iNewMaxLevel := iMaxLevel;
//限制条件,计算出的新最大等级不能比原最大等级小,否则不做改变
if (iNewMaxLevel > 65535) then
iNewMaxLevel := 65535;
//限制条件,计算出的新最大等级不能超过65535,否则等于65535
SetElementNativeValues(e, 'ACBS\Calc max level', (iNewMaxLevel));
//**************************最大等级计算完毕***************************************//
//**************************开始计算等级比率***************************************//
//iNewLevelMult := ( iNewMaxLevel / PCLevel ) * iLevelMult;
//通过将该NPC最大等级与PCLevel作比得出新等级比率,简单粗暴,已弃用,放在这里只是方便理解下面的公式
iNewLevelMult := ( ( -1 * iNewMaxLevel / ( PCLevel * Power ( iMaxLevel , 2 ) ) ) * Power( iMinLevel , 2 ) + ( 2 * iNewMaxLevel / ( iMaxLevel * PCLevel ) ) * iMinLevel ) * iLevelMult;
//按照公式计算出新的等级比率,该公式将NPC原始的最小等级(iMinLevel)、最大等级(iMaxLevel)作为参数引入。
//该公式的特征为:
//1. 结果随原等级比率(iLevelMult)递增,使其可以反映NPC原始设定强度;
//2. iMinLevel与iMaxLevel越接近,结果越趋近于“iNewMaxLevel / PCLevel”,这使得最大等级相同的NPC,最小等级越大,等级比率越高,但它们最终达到的等级依然一致,可以较好地保留原始设定中,NPC之间一定时期内的相对强弱。
//为了实现特征2,该公式的系数(“iLevelMult”前面的部分)实际上是一个关于iMinLevel,以(iMaxLevel,iNewMaxLevel / PCLevel)为最高点的二次函数(将iMinLevel视作X,结果视作Y)
if (iNewLevelMult < iLevelMult) then
iNewLevelMult := iLevelMult;
//限制条件,计算出的新等级比率不能比原版小,否则不做改变
if (iNewLevelMult > 32767) then
iNewLevelMult := 32767;
//限制条件,计算出的新等级比率不能超过32767,否则等于32767
SetElementNativeValues(e, 'ACBS\level Mult', (iNewLevelMult));
//**************************等级比率计算完毕***************************************//
|
|