883 lines
48 KiB
PHP
883 lines
48 KiB
PHP
<?php
|
||
|
||
namespace services;
|
||
|
||
require_once('mt/AttrHelper.php');
|
||
require_once('mt/Item.php');
|
||
require_once('mt/FormulaPvp.php');
|
||
require_once('mt/HeroQuality.php');
|
||
require_once('mt/GunQuality.php');
|
||
require_once('mt/Parameter.php');
|
||
require_once('models/RealtimeData.php');
|
||
|
||
use models\Chip;
|
||
use models\Gun;
|
||
use models\Hero;
|
||
use models\RealtimeData;
|
||
use mt;
|
||
|
||
class FormulaService extends BaseService {
|
||
|
||
public static function calcHeroPvpGold($heroDto, $params,$rank)
|
||
{
|
||
// f(队伍排名) = round(1-(队伍排名-1)/10 ,1)
|
||
$teamRank = getXVal($params, 'pvp_team_rank');
|
||
$f = round(1-($teamRank-1)/10,1);
|
||
// g(队伍击杀数)= Min(队伍击杀数*0.1 ,2)
|
||
$teamKills = getXVal($params, 'pvp_team_kills');
|
||
$g = min($teamKills*0.1,2);
|
||
// GOLD = Min(英雄每天gold上限*10%,标准值) * (f(队伍排名) + g(队伍击杀数))
|
||
$rankMeta = mt\Rank::getRankById($rank);
|
||
$base = $rankMeta?$rankMeta['gold_base']:10;
|
||
return min($heroDto['gold_uplimit']*0.1,$base) * ($f+$g);
|
||
}
|
||
|
||
public static function calcHeroPvpCeg($heroDto, $params)
|
||
{
|
||
//每局实际收益=10%PVP收益*5*(50%*[每局排名TopX%对应比例]+25%*[每局PK人数排名TopX%对应比例]+15%*[每局英雄属性排名TopX%对应比例]+5%*[每局武器属性排名TopX%对应比例]+5%*[每局存活时间排名TopX%对应比例])
|
||
$upLimit = $heroDto['gold_uplimit'];
|
||
$ranked = getXVal($params, 'ranked');
|
||
$kills = getXVal($params, 'kills');
|
||
$aliveTime = getXVal($params, 'alive_time');
|
||
|
||
$rankedTopX = getXVal($params, 'ranked_topx');
|
||
$killsTopX = getXVal($params, 'kills_topx');
|
||
$heroTopX = getXVal($params, 'hero_topx');
|
||
$weaponTopX = getXVal($params, 'weapon_topx');
|
||
$survivalTopX = getXVal($params, 'survival_topx');
|
||
$meta_rankedTopX = mt\FormulaPvp::getByRanked($rankedTopX)?mt\FormulaPvp::getByRanked($rankedTopX)['ranked_topx']:0;
|
||
$meta_killsTopX = mt\FormulaPvp::getByRanked($killsTopX)?mt\FormulaPvp::getByRanked($killsTopX)['kills_topx']:0;
|
||
$meta_heroTopX = mt\FormulaPvp::getByRanked($heroTopX)?mt\FormulaPvp::getByRanked($heroTopX)['hero_topx']:0;
|
||
$meta_weaponTopX = mt\FormulaPvp::getByRanked($weaponTopX)?mt\FormulaPvp::getByRanked($weaponTopX)['weapon_topx']:0;
|
||
$meta_survivalTopX = mt\FormulaPvp::getByRanked($survivalTopX)?mt\FormulaPvp::getByRanked($survivalTopX)['survival_topx']:0;
|
||
|
||
$ceg = 1/10*$upLimit * 5 *
|
||
(
|
||
(0.5 * $meta_rankedTopX) +
|
||
(0.25 * $meta_killsTopX) +
|
||
(0.15 * $meta_heroTopX) +
|
||
(0.05 * $meta_weaponTopX) +
|
||
(0.05 * $meta_survivalTopX)
|
||
);
|
||
return cegFormat(($ceg));
|
||
}
|
||
|
||
public static function calcHeroPveCeg($heroDto, $instanceLevel, $instanceRank, $bossReward)
|
||
{
|
||
$upLimit = $heroDto['pve_ceg_uplimit'];
|
||
$heroQuality = $heroDto['quality'];
|
||
|
||
$ceg = $upLimit *
|
||
max(1.15 - ($heroQuality - $instanceLevel) * 0.25, 0) *
|
||
(0.8 - ($instanceRank - 1) * 0.25 + $bossReward * 0.2) *
|
||
1/10;
|
||
|
||
error_log(json_encode(array(
|
||
'upLimit' => $upLimit,
|
||
'heroQuality' => $heroQuality,
|
||
'instanceLevel' => $instanceLevel,
|
||
'instanceRank' => $instanceRank,
|
||
'bossReward' => $bossReward,
|
||
'ceg' => $ceg
|
||
)));
|
||
|
||
return cegFormat($ceg);
|
||
}
|
||
|
||
public static function calcWeaponPvpCeg($weaponDto, $params)
|
||
{
|
||
//PVP武器NFT每日获得极限*(50%*[每局排名TopX%对应比例]+25%*[每局PK人数排名TopX%对应比例]+15%*[每局英雄属性排名TopX%对应比例]+5%*[每局武器属性排名TopX%对应比例]+5%*[每局存活时间排名TopX%对应比例])
|
||
$upLimit = $weaponDto['pvp_ceg_uplimit'];
|
||
$ranked= getXVal($params, 'ranked');
|
||
$kills = getXVal($params, 'kills');
|
||
$aliveTime = getXVal($params, 'alive_time');
|
||
|
||
$rankedTopX= getXVal($params, 'ranked_topx');
|
||
$killsTopX = getXVal($params, 'kills_topx');
|
||
$heroTopX = getXVal($params, 'hero_topx');
|
||
$weaponTopX = getXVal($params, 'weapon_topx');
|
||
$survivalTopX = getXVal($params, 'survival_topx');
|
||
$meta_rankedTopX = mt\FormulaPvp::getByRanked($rankedTopX)?mt\FormulaPvp::getByRanked($rankedTopX)['ranked_topx']:0;
|
||
$meta_killsTopX = mt\FormulaPvp::getByRanked($killsTopX)?mt\FormulaPvp::getByRanked($killsTopX)['kills_topx']:0;
|
||
$meta_heroTopX = mt\FormulaPvp::getByRanked($heroTopX)?mt\FormulaPvp::getByRanked($heroTopX)['hero_topx']:0;
|
||
$meta_weaponTopX = mt\FormulaPvp::getByRanked($weaponTopX)?mt\FormulaPvp::getByRanked($weaponTopX)['weapon_topx']:0;
|
||
$meta_survivalTopX = mt\FormulaPvp::getByRanked($survivalTopX)?mt\FormulaPvp::getByRanked($survivalTopX)['survival_topx']:0;
|
||
|
||
$ceg = 1/10*$upLimit * 5 *
|
||
(
|
||
(0.5 * $meta_rankedTopX) +
|
||
(0.25 * $meta_killsTopX) +
|
||
(0.15 * $meta_heroTopX) +
|
||
(0.05 * $meta_weaponTopX) +
|
||
(0.05 * $meta_survivalTopX)
|
||
) ;
|
||
return cegFormat(($ceg));
|
||
}
|
||
|
||
public static function calcWeaponPveCeg($weaponDto, $instanceLevel, $instanceRank, $bossReward)
|
||
{
|
||
$upLimit = $weaponDto['pve_ceg_uplimit'];
|
||
$weaponQuality = $weaponDto['quality'];
|
||
|
||
$ceg = $upLimit *
|
||
max(1.15 - ($weaponQuality - $instanceLevel) * 0.25, 0) *
|
||
(0.8 - ($instanceRank - 1) * 0.25 + $bossReward * 0.2) *
|
||
1/10;
|
||
|
||
return cegFormat($ceg);
|
||
}
|
||
|
||
public static function calcHeroFragmentProbabilityPvp($params,
|
||
$onlineNum,
|
||
$heroFragmentNum,
|
||
$todayPvpBattleTimes)
|
||
{
|
||
$rankedTopX = getXVal($params, 'ranked_topx');
|
||
$killsTopX = getXVal($params, 'kills_topx');
|
||
$heroTopX = getXVal($params, 'hero_topx');
|
||
$weaponTopX = getXVal($params, 'weapon_topx');
|
||
$survivalTopX = getXVal($params, 'survival_topx');
|
||
|
||
$meta_rankedTopX = mt\FormulaPvp::getByRanked($rankedTopX)?mt\FormulaPvp::getByRanked($rankedTopX)['ranked_topx']:0;
|
||
$meta_killsTopX = mt\FormulaPvp::getByRanked($killsTopX)?mt\FormulaPvp::getByRanked($killsTopX)['kills_topx']:0;
|
||
$meta_heroTopX = mt\FormulaPvp::getByRanked($heroTopX)?mt\FormulaPvp::getByRanked($heroTopX)['hero_topx']:0;
|
||
$meta_weaponTopX = mt\FormulaPvp::getByRanked($weaponTopX)?mt\FormulaPvp::getByRanked($weaponTopX)['weapon_topx']:0;
|
||
$meta_survivalTopX = mt\FormulaPvp::getByRanked($survivalTopX)?mt\FormulaPvp::getByRanked($survivalTopX)['survival_topx']:0;
|
||
$heroProbability = min($heroFragmentNum / $onlineNum *
|
||
5 *
|
||
(
|
||
0.5 * $meta_rankedTopX +
|
||
0.25 * $meta_killsTopX +
|
||
0.15 * $meta_heroTopX +
|
||
0.05 * $meta_weaponTopX +
|
||
0.05 * $meta_survivalTopX
|
||
) *
|
||
pow(2, ($todayPvpBattleTimes % 10) - 1), 1);
|
||
return max(0, $heroProbability);
|
||
}
|
||
|
||
public static function calcWeaponFragmentProbabilityPvp($params,
|
||
$onlineNum,
|
||
$weaponFragmentNum,
|
||
$todayPvpBattleTimes)
|
||
{
|
||
$rankedTopX = getXVal($params, 'ranked_topx');
|
||
$killsTopX = getXVal($params, 'kills_topx');
|
||
$heroTopX = getXVal($params, 'hero_topx');
|
||
$weaponTopX = getXVal($params, 'weapon_topx');
|
||
$survivalTopX = getXVal($params, 'survival_topx');
|
||
$meta_rankedTopX = mt\FormulaPvp::getByRanked($rankedTopX)?mt\FormulaPvp::getByRanked($rankedTopX)['ranked_topx']:0;
|
||
$meta_killsTopX = mt\FormulaPvp::getByRanked($killsTopX)?mt\FormulaPvp::getByRanked($killsTopX)['kills_topx']:0;
|
||
$meta_heroTopX = mt\FormulaPvp::getByRanked($heroTopX)?mt\FormulaPvp::getByRanked($heroTopX)['hero_topx']:0;
|
||
$meta_weaponTopX = mt\FormulaPvp::getByRanked($weaponTopX)?mt\FormulaPvp::getByRanked($weaponTopX)['weapon_topx']:0;
|
||
$meta_survivalTopX = mt\FormulaPvp::getByRanked($survivalTopX)?mt\FormulaPvp::getByRanked($survivalTopX)['survival_topx']:0;
|
||
$weaponProbability = min($weaponFragmentNum / $onlineNum *
|
||
5 *
|
||
(
|
||
0.5 * $meta_rankedTopX +
|
||
0.25 * $meta_killsTopX +
|
||
0.15 * $meta_heroTopX +
|
||
0.05 * $meta_weaponTopX +
|
||
0.05 * $meta_survivalTopX
|
||
) *
|
||
pow(2, ($todayPvpBattleTimes % 10) - 1), 1);
|
||
return max(0, $weaponProbability);
|
||
}
|
||
|
||
public static function calcHeroFragmentProbabilityPve($heroQuality,
|
||
$onlineNum,
|
||
$heroFragmentNum,
|
||
$todayPveBattleTimes,
|
||
$instanceLevel,
|
||
$instanceRank,
|
||
$instanceRankRate,
|
||
$bossReward,
|
||
$todayPveLastGetFragmentBattle
|
||
)
|
||
{
|
||
$dropRate = max(1.15 - ($heroQuality - $instanceLevel) * 0.25, 0);
|
||
$dropMul = 0.8 - ($instanceRank - 1) * 0.25 + $bossReward * 0.2;
|
||
|
||
$heroProbability = min($heroFragmentNum / $onlineNum *
|
||
$dropRate * ($instanceRankRate + $bossReward*0.2) *
|
||
pow(2, $todayPveBattleTimes - $todayPveLastGetFragmentBattle - 1), 1);
|
||
error_log('calcHeroFragmentProbabilityPve:' . $heroProbability . ' dropRate:' . $dropRate);
|
||
error_log(json_encode(func_get_args()));
|
||
return max(0, $heroProbability);
|
||
}
|
||
|
||
public static function calcWeaponFragmentProbabilityPve($heroQuality,
|
||
$onlineNum,
|
||
$gunFragmentNum,
|
||
$todayPveBattleTimes,
|
||
$instanceLevel,
|
||
$instanceRank,
|
||
$instanceRankRate,
|
||
$bossReward,
|
||
$todayPveLastGetFragmentBattle
|
||
)
|
||
{
|
||
$dropRate = max(1.15 - ($heroQuality - $instanceLevel) * 0.25, 0);
|
||
$dropMul = 0.8 - ($instanceRank - 1) * 0.25 + $bossReward * 0.2;
|
||
|
||
$gunProbability = min($gunFragmentNum / $onlineNum *
|
||
$dropRate * ($instanceRankRate + $bossReward*0.2) *
|
||
pow(2, $todayPveBattleTimes - $todayPveLastGetFragmentBattle - 1), 1);
|
||
error_log(json_encode(func_get_args()));
|
||
return max(0, $gunProbability);
|
||
}
|
||
|
||
public static function getHeroPvpTiliTotalValue($heroDb)
|
||
{
|
||
//ROUND((0.0241*角色NFT阶数^3-0.5675*角色NFT阶数^2+7.1798*角色NFT阶数+2.4114)+(0.0161*角色幸运值^3-1.2943*角色幸运值^2+36.5664*角色幸运值-336.144),0)+系统参数
|
||
$sysParam = 0;
|
||
$lucky = 0;
|
||
$upLimit = round(
|
||
(
|
||
0.0241*pow($heroDb['quality'],3) -
|
||
0.5675*pow($heroDb['quality'],2) +
|
||
7.1798*$heroDb['quality'] +
|
||
2.4114
|
||
) +
|
||
(
|
||
0.0161*pow($lucky, 3) -
|
||
1.2943*pow($lucky, 2) +
|
||
36.5664*$lucky -
|
||
336.144
|
||
)
|
||
) + $sysParam;
|
||
return $upLimit;
|
||
}
|
||
|
||
public static function getHeroPveTiliTotalValue($heroDb)
|
||
{
|
||
//ROUND((0.0563*角色NFT阶数^3-1.3243*角色NFT阶数^2+16.753*角色NFT阶数+5.6266)+(0.0375*角色幸运值^3-3.02*角色幸运值^2+85.3217*角色幸运值-784.3361),0)+系统参数
|
||
$sysParam = 0;
|
||
$lucky = 0;
|
||
$upLimit = round(
|
||
(
|
||
0.0563*pow($heroDb['quality'],3) -
|
||
1.3243*pow($heroDb['quality'],2) +
|
||
16.753*$heroDb['quality'] +
|
||
5.6266
|
||
) +
|
||
(
|
||
0.0375*pow($lucky, 3) -
|
||
3.02*pow($lucky, 2) +
|
||
85.3217*$lucky -
|
||
784.3361
|
||
)
|
||
) + $sysParam;
|
||
return $upLimit;
|
||
}
|
||
|
||
public static function getWeaponPvpDurabilityTotalValue($weaponDb)
|
||
{
|
||
//ROUND((0.0067*武器NFT阶数^3-0.1558*武器NFT阶数^2+1.9758*武器NFT阶数+0.8033)+(0.0044*武器幸运值^3-0.3564*武器幸运值^2+10.0625*武器幸运值-92.3784),0)+系统参数
|
||
$sysParam = 0;
|
||
$lucky = 0;
|
||
$upLimit = round(
|
||
(
|
||
0.0067*pow($heroDb['quality'],3) -
|
||
0.1558*pow($heroDb['quality'],2) +
|
||
1.9758*$heroDb['quality'] +
|
||
0.8033
|
||
) +
|
||
(
|
||
0.0044*pow($lucky, 3) -
|
||
0.3564*pow($lucky, 2) +
|
||
10.0625*$lucky -
|
||
92.3784
|
||
)
|
||
) + $sysParam;
|
||
return $upLimit;
|
||
}
|
||
|
||
public static function getWeaponPveDurabilityTotalValue($weaponDb)
|
||
{
|
||
//ROUND((0.0155*武器NFT阶数^3-0.3637*武器NFT阶数^2+4.6102*武器NFT阶数+1.8745)+(0.0104*武器幸运值^3-0.8315*武器幸运值^2+23.4792*武器幸运值-215.5496),0)+系统参数
|
||
$sysParam = 0;
|
||
$lucky = 0;
|
||
$upLimit = round(
|
||
(
|
||
0.0155*pow($heroDb['quality'],3) -
|
||
0.3637*pow($heroDb['quality'],2) +
|
||
4.6102*$heroDb['quality'] +
|
||
1.8745
|
||
) +
|
||
(
|
||
0.0104*pow($lucky, 3) -
|
||
0.8315*pow($lucky, 2) +
|
||
23.4792*$lucky -
|
||
215.5496
|
||
)
|
||
) + $sysParam;
|
||
return $upLimit;
|
||
}
|
||
|
||
public static function calcHeroPvpTiliConsume($heroDb)
|
||
{
|
||
//ROUND((最大角色体力值-当前剩余体力值)*(PVP角色体力总价值+PVE角色体力总价值)/最大角色体力值,0)
|
||
$heroMeta = mt\Item::get($heroDb['hero_id']);
|
||
if (!$heroMeta) {
|
||
return 0;
|
||
}
|
||
$cost = round(
|
||
($heroMeta['init_tili'] - $heroDb['hero_tili']) *
|
||
(1) /
|
||
$heroMeta['init_tili']
|
||
);
|
||
return $cost;
|
||
}
|
||
|
||
public static function calcWeaponPvpDurabilityConsume($weaponDb)
|
||
{
|
||
//ROUND((最大武器耐久度-当前剩余耐久度)*(PVP武器耐久度总价值+PVE武器耐久度总价值)/最大武器耐久度,0)
|
||
return 0;
|
||
}
|
||
|
||
public static function calcBattleAfterRankScore($userDb,$params,$winningPro){
|
||
/**一个玩家的赛后积分 = 赛前积分+K/2*(MAX(胜负率-总胜率,0))+K*(表现分-段位要求的及格分)*/
|
||
//胜负率=1-(排名-1)/(最大排名-1)
|
||
$ranked = getXVal($params, 'pvp_personal_rank');
|
||
$teamRank = min(getXVal($params, 'pvp_team_rank'),10);
|
||
$maxRanked = mt\Parameter::getVal('rank_order_max',40); //************** parameter 参数表获取 ************
|
||
$winRate = 1-($ranked-1)/($maxRanked-1);
|
||
//总胜率=70%*P(个人ELO值-敌队平均ELO值)+30%*P(己队平均ELO值-敌队平均ELO值) --> P(D)=1/(1+10^(-D/400))
|
||
$winRateSum = $winningPro;
|
||
//表现分=f(个人存活时间排名TopX/4)*50%+f(队伍排名TopY)*50% f(TopX) = ROUND(1-(X-1)/9,2)
|
||
$expreScore = (ROUND(1-($ranked/4-1)/9,2))*0.5+ROUND(1-($teamRank-1)/9,2)*0.5;
|
||
|
||
$rankMeta = mt\Rank::getRankById($userDb['rank']);
|
||
//不同段位的及格分 = ROUND(1-(大段位排名-1)/(MAX(10)-1),2)
|
||
$topRanking = $rankMeta['rank_order']; //************** rankRank 参数表获取 ************
|
||
$rankPint = mt\Parameter::getVal('rank_pass_point',0); //************** parameter 参数表获取 ************
|
||
$rankPintArr = explode('|',$rankPint);
|
||
$askedScore = $rankPintArr[$topRanking-1];
|
||
//一个玩家的赛后积分 = 赛前积分+K*(胜负率-总胜率)+2K*(表现分-段位要求的及格分)
|
||
//一个玩家的赛后积分 = 赛前积分+K/2*(MAX(胜负率-总胜率,0))+K*(表现分-段位要求的及格分)
|
||
//一个玩家的赛后积分 = 赛前积分+K/2*(MAX(胜负率-0.5,0))+K/2*(表现分-段位要求的及格分) 新
|
||
$kArr = explode('|',mt\Parameter::getVal('rank_k',0)); //************** parameter 参数表获取 ************
|
||
$K = $kArr[$rankMeta['rank_order2']-1];
|
||
$battleAfterScore = $userDb['score'] + $K/2 * max(($winRate-0.5),0) + ($K/2) * ($expreScore-$askedScore);
|
||
return round($battleAfterScore);
|
||
}
|
||
|
||
public static function calcUserEloValue($userDb,$params,$winningPro){
|
||
/**一个玩家的赛后ELO值 = MAX(赛前ELO值+K*(胜负率-总胜率),150)*/
|
||
//胜负率=1-(排名-1)/(最大排名-1)
|
||
$ranked = getXVal($params, 'pvp_personal_rank');
|
||
$maxRanked = mt\Parameter::getVal('rank_order_max',40); //************** parameter 参数表获取 ************
|
||
$winRate = 1-($ranked-1)/($maxRanked-1);
|
||
//总胜率=70%*P(个人ELO值-敌队平均ELO值)+30%*P(己队平均ELO值-敌队平均ELO值) --> P(D)=1/(1+10^(-D/400))
|
||
$winRateSum = $winningPro;
|
||
$rankMeta = mt\Rank::getRankById($userDb['rank']);
|
||
$kArr = explode('|',mt\Parameter::getVal('rank_k',0)); //************** parameter 参数表获取 ************
|
||
$K = $kArr[$rankMeta['rank_order2']-1];
|
||
return round(max($userDb['elo']+$K*($winRate-$winRateSum),150));
|
||
}
|
||
|
||
/**
|
||
-------------------------------------------------新公式-----------------------------------------------------------
|
||
*/
|
||
|
||
|
||
//每天英雄NFT获得CEG上限值
|
||
public static function Hero_Max_CEG($heroDb){
|
||
//Hero_Max_CEG=((SIGN(英雄NFT阶数=1)*Hero_NFT_Maximum_Physical_Strength+SIGN(英雄NFT阶数>1)*Hero_Fixed_Physical_Strength)*Hero_PSA_Value*GAC_PS_Value+Hero_Chip_NFT_Maximum_Physical_Strength*Hero_Chip_PSA_Value*Hero_Chip_GAC_PS_Value)*10*CEG_Discount_Rate
|
||
return ((($heroDb['quality']==1?1:0)*self::Hero_NFT_Maximum_Physical_Strength($heroDb['quality'],$heroDb['lucky'])+($heroDb['quality']>1?1:0)*$heroDb['hero_tili'])*self::Hero_PSA_Value($heroDb)*self::GAC_PS_Value($heroDb['quality'])+$heroDb['chip_strength_sum'])*10*self::CEG_Discount_Rate();
|
||
}
|
||
|
||
//英雄PVP收益上限
|
||
public static function getHeroPvpDailyCegUpLimit($heroDb)
|
||
{
|
||
//Hero_Max_CEG *60%
|
||
return self::Hero_Max_CEG($heroDb)*0.6;
|
||
}
|
||
|
||
//英雄PVE收益上限
|
||
public static function getHeroPveDailyCegUpLimit($heroDb)
|
||
{
|
||
//Hero_Max_CEG *35%
|
||
return self::Hero_Max_CEG($heroDb)*0.35;
|
||
}
|
||
|
||
//英雄悬赏收益上限
|
||
public static function getHeroMissionDailyCegUpLimit($heroDb)
|
||
{
|
||
//Hero_Max_CEG *05%
|
||
return self::Hero_Max_CEG($heroDb)*0.05;
|
||
}
|
||
|
||
//悬赏加速所需CEG
|
||
public static function calcBoostMissionCeg($ceg,$time,$timeSum){
|
||
//悬赏加速所需CEG=MAX(ROUND(10%*当次悬赏任务获得CEG*当次已悬赏时间/当次悬赏所需时间,2),0.01)
|
||
return max(round(0.1*$ceg*$time/$timeSum,2),0.01);
|
||
}
|
||
|
||
//每天枪械NFT获得CEG上限值
|
||
public static function Weapon_Max_CEG($weaponDb){
|
||
//Weapon_Max_CEG=((SIGN(武器NFT阶数=1)*Weapon_NFT_Maximum_Durability+SIGN(武器NFT阶数>1)*Weapon_Fixed_Durability)*Weapon_DA_Value*GAC_D_Value+Weapon_NFT_Maximum_Durability*Weapon_Chip_DA_Value*Weapon_Chip_GAC_PS_Value)*10*CEG_Discount_Rate
|
||
return ((($weaponDb['quality']==1?1:0)*self::Weapon_NFT_Maximum_Durability($weaponDb['quality'],$weaponDb['lucky'])+($weaponDb['quality']>1?1:0)*$weaponDb['durability'])*self::Weapon_DA_Value($weaponDb)*self::GAC_D_Value($weaponDb['quality'])+$weaponDb['chip_strength_sum'])*10*self::CEG_Discount_Rate();
|
||
|
||
}
|
||
|
||
//枪械PVP收益上限
|
||
public static function getWeaponPvpDailyCegUpLimit($weaponDb)
|
||
{
|
||
//Weapon_Max_CEG *60%
|
||
return self::Weapon_Max_CEG($weaponDb)*0.6;
|
||
}
|
||
|
||
//枪械PVE收益上限
|
||
public static function getWeaponPveDailyCegUpLimit($weaponDb)
|
||
{
|
||
//Weapon_Max_CEG *35%
|
||
return self::Weapon_Max_CEG($weaponDb)*0.35;
|
||
}
|
||
|
||
//枪械悬赏收益上限
|
||
public static function getWeaponMissionDailyCegUpLimit($weaponDb)
|
||
{
|
||
//Weapon_Max_CEG *5%
|
||
return self::Weapon_Max_CEG($weaponDb)*0.05;
|
||
}
|
||
|
||
//CEG动态指数定义公式:
|
||
public static function CEG_Dynamic_Index(){
|
||
//CEG_Dynamic_Index=ROUND(2/(1+EXP(-(CEG_Dynamic_Price/CEG_Base_Price)* CEG_Parameter+ CEG_Parameter)),2)
|
||
return round(2/(1+exp(-(self::CEG_Dynamic_Price()/self::CEG_Base_Price())*self::CEG_Parameter()+self::CEG_Parameter())),2);
|
||
}
|
||
|
||
//CEG动态价格
|
||
public static function CEG_Dynamic_Price(){
|
||
return 0.1;
|
||
}
|
||
|
||
//CEG调整系数
|
||
public static function CEG_Parameter(){
|
||
$meta = mt\Parameter::getByName('CEG_Parameter');
|
||
return $meta ? $meta['param_value'] : 0.5;
|
||
}
|
||
|
||
//CEG 默认基础价格,配置在全局表中
|
||
public static function CEG_Base_Price(){
|
||
$meta = mt\Parameter::getByName('CEG_Base_Price');
|
||
return $meta ? $meta['param_value'] : 0.1;
|
||
}
|
||
|
||
//CEG折扣比率
|
||
public static function CEG_Discount_Rate(){
|
||
//CEG_Discount_Rate=ROUND(CEG_Dynamic_Index /( CEG_Dynamic_Price / CEG_Base_Price),3)
|
||
return round(self::CEG_Dynamic_Index()/(self::CEG_Dynamic_Price()/self::CEG_Base_Price()),3);
|
||
}
|
||
|
||
//CEC动态指数定义公式:
|
||
public static function CEC_Dynamic_Index(){
|
||
//CEC_Dynamic_Index=ROUND(2/(1+EXP(-(CEC_Dynamic_Price/ CEC_Base_Price)* CEC_Parameter + CEC_Parameter)),2)
|
||
return round(2/(1+exp(-(self::CEC_Dynamic_Price()/self::CEC_Base_Price())*self::CEC_Parameter()+self::CEC_Parameter())),2);
|
||
}
|
||
|
||
//CEC动态价格
|
||
public static function CEC_Dynamic_Price(){
|
||
return 0.5;
|
||
}
|
||
|
||
//CEC调整系数
|
||
public static function CEC_Parameter(){
|
||
$meta = mt\Parameter::getByName('CEC_Parameter');
|
||
return $meta ? $meta['param_value'] : 1.5;
|
||
}
|
||
|
||
//CEC 默认基础价格,配置在全局表中
|
||
public static function CEC_Base_Price(){
|
||
$meta = mt\Parameter::getByName('CEC_Base_Price');
|
||
return $meta ? $meta['param_value'] : 0.5;
|
||
}
|
||
|
||
//CEC折扣比率
|
||
public static function CEC_Discount_Rate(){
|
||
//CEC_Discount_Rate=ROUND(CEC_Dynamic_Index /( CEC_Dynamic_Price / CEC_Base_Price),3)
|
||
return round(self::CEC_Dynamic_Index()/(self::CEC_Dynamic_Price()/self::CEC_Base_Price()),3);
|
||
}
|
||
|
||
//CEC锚定U的价格
|
||
public static function CEC_Anchor_Price(){
|
||
//CEC_Anchor_Price=ROUND(CEC_Dynamic_Price * CEC_Discount_Rate,3)
|
||
return round(self::CEC_Dynamic_Price()*self::CEC_Discount_Rate(),3);
|
||
}
|
||
|
||
//英雄劳力值
|
||
public static function Hero_Labor_Value($heroDb){
|
||
if (!isset($heroDb['labour'])){
|
||
error_log('JAMES TEST LOG REQUEST INFO--------'.json_encode($_REQUEST));
|
||
error_log('JAMES TEST LOG HERO INFO--------'.json_encode($heroDb));
|
||
}
|
||
return $heroDb['labour'];
|
||
}
|
||
|
||
//武器劳力值
|
||
public static function Weapon_Labor_Value($weaponDb){
|
||
if (!isset($weaponDb['labour'])){
|
||
error_log('JAMES TEST LOG REQUEST INFO--------'.json_encode($_REQUEST));
|
||
error_log('JAMES TEST LOG WEAPON INFO--------'.json_encode($weaponDb));
|
||
}
|
||
return $weaponDb['labour'];
|
||
}
|
||
|
||
//英雄芯片劳力值
|
||
public static function Hero_Chip_Labor_Value($chip){
|
||
if (!isset($chip['labour'])){
|
||
error_log('JAMES TEST LOG REQUEST INFO--------'.json_encode($_REQUEST));
|
||
error_log('JAMES TEST LOG CHIP INFO--------'.json_encode($chip));
|
||
}
|
||
return $chip['labour'];
|
||
}
|
||
|
||
//武器芯片劳力值
|
||
public static function Weapon_Chip_Labor_Value($chip){
|
||
// return 1;
|
||
return $chip['labour'];
|
||
}
|
||
|
||
//芯片升星累计成本
|
||
public static function getChipCumulativeCost($grade){
|
||
//( SIGN(0<芯片星级<6)*(15*芯片星级*(芯片星级-1)+10)+SIGN(芯片星级>5)*SIGN(芯片星级<10)*(80*(芯片星级-4)*( 芯片星级-3)+50) +SIGN(芯片星级>9)*SIGN(芯片星级<14)*(370*(芯片星级-8)*( 芯片星级-7)*(2*芯片星级-15)/6+80*(芯片星级-8)+2100) +SIGN(芯片星级>13)*SIGN(芯片星级<16)*(600*(芯片星级-8)*(芯片星级-7)*(2*芯片星级-15)/6-14000)) *CEG_Discount_Rate
|
||
return (($grade>0?1:0)*($grade<6?1:0)*(15*$grade*($grade-1)+10)+($grade>5?1:0)*($grade<10?1:0)*(80*($grade-4)*( $grade-3)+50) +($grade>9?1:0)*($grade<14?1:0)*(370*($grade-8)*( $grade-7)*(2*$grade-15)/6+80*($grade-8)+2100) +($grade>13?1:0)*($grade<16?1:0)*(600*($grade-8)*($grade-7)*(2*$grade-15)/6-14000)) *self::CEG_Discount_Rate();
|
||
|
||
//( SIGN(芯片星级<6)*((15*芯片星级+10)*(芯片星级-1)+10)+SIGN(芯片星级>5)*SIGN(芯片星级<10)*(80*(芯片星级-4)*( 芯片星级-3)+90) +SIGN(芯片星级>9)*SIGN(芯片星级<14)*(370*(芯片星级-8)*( 芯片星级-7)*(2*芯片星级-15)/6+80*(芯片星级-8)+2140) +SIGN(芯片星级>13)*SIGN(芯片星级<16)*(600*(芯片星级-8)*(芯片星级-7)*(2*芯片星级-15)/6-13960)) *CEG_Discount_Rate
|
||
// return (($grade<6?1:0)*((15*$grade+10)*($grade-1)+10)+($grade>5?1:0)*($grade<10?1:0)*(80*($grade-4)*($grade-3)+90)+($grade>9?1:0)*($grade<14?1:0)*(370*($grade-8)*($grade-7)*(2*$grade-15)/6+80*($grade-8)+2140)+($grade>13?1:0)*($grade<16?1:0)*(600*($grade-8)*($grade-7)*(2*$grade-15)/6-13960))*self::CEG_Discount_Rate();
|
||
|
||
}
|
||
|
||
//芯片升星成本
|
||
public static function getChipUpgradeCost($grade){
|
||
//(SIGN(芯片星级=1)*10+SIGN(芯片星级<6)*SIGN(芯片星级>1)*(30*(芯片星级-1))+SIGN(芯片星级>5)*SIGN(芯片星级<10)*(160*(芯片星级-4))-SIGN(芯片星级=6)*100+SIGN(芯片星级>9)*SIGN(芯片星级<14)*(370*(芯片星级-8)^2+80)+SIGN(芯片星级=10)*100 +SIGN(芯片星级>13)*SIGN(芯片星级<16)*(600*(芯片星级-8)^2)-SIGN(芯片星级=14)*3850) *CEG_Discount_Rate
|
||
return (($grade==1?1:0)*10+($grade<6?1:0)*($grade>1?1:0)*(30*($grade-1))+($grade>5?1:0)*($grade<10?1:0)*(160*($grade-4))-($grade==6?1:0)*100+($grade>9?1:0)*($grade<14?1:0)*(370*($grade-8)*($grade-8)+80)+($grade==10?1:0)*100+($grade>13?1:0)*($grade<16?1:0)*(600*($grade-8)*($grade-8))-($grade==14?1:0)*3850)*self::CEG_Discount_Rate();
|
||
|
||
}
|
||
|
||
//芯片幸运值
|
||
public static function getChipLuckyValue($grade){
|
||
//芯片幸运值=SIGN(芯片星数>4)*ROUND( 0.00419*芯片星数^5-0.0705*芯片星数^4 +0.24*芯片星数^3 +8.5*芯片星数^2-39.9*芯片星数+38,1)
|
||
return ($grade>4?1:0)*round(0.00419*pow($grade,5)-0.0705*pow($grade,4)+0.24*pow($grade,3)+8.5*pow($grade,2)-39.9*$grade+38,1);
|
||
}
|
||
|
||
//芯片体力值(英雄芯片和枪械芯片一样的)
|
||
public static function Hero_Chip_NFT_Maximum_Physical_Strength($grade,$lucky){
|
||
//芯片体力值(命名:Hero_Chip_NFT_Maximum_Physical_Strength) = SIGN(英雄芯片NFT星数>4)*( 英雄芯片NFT幸运值*ROUND(1+0.04*英雄芯片NFT星数,3))
|
||
return ($grade>4?1:0)*($lucky*round(1+0.04*$grade,3));
|
||
}
|
||
|
||
//芯片回本周期(参数单位:天)
|
||
public static function Chip_Payback_Period($grade){
|
||
//ROUND( -0.0095*芯片星数^3+0.0942*芯片星数^2+5.8425*芯片星数+24.7,0)
|
||
return round(-0.0095*pow($grade,3)+0.0942*pow($grade,2)+5.8425*$grade+24.7,0);
|
||
}
|
||
|
||
//芯片衰减参数
|
||
public static function Chip_Attenuation_Parameter($grade){
|
||
//ROUND(-0.0000507*芯片星数^3+0.0024*芯片星数^2-0.0512*芯片星数+0.785,4)
|
||
return round(-0.0000507*pow($grade,3)+0.0024*pow($grade,2)-0.0512*$grade+0.785,4);
|
||
}
|
||
|
||
//每日英雄芯片体力值衰减百分比
|
||
public static function Hero_Chip_PSA_Value($chip){
|
||
//Hero_Chip_PSA_Value=MAX(0,ROUND((Chip_Payback_Period-Chip_Attenuation_Parameter* Hero_Chip_Labor_Value)/((1-Chip_Attenuation_Parameter /2)* Chip_Payback_Period ^2)/ROUND(1+0.04*英雄芯片星数,3),4))*(1+0.1*ROUND(SIN(Hero_Chip_Labor_Value),2))
|
||
$num = max(0,round((self::Chip_Payback_Period($chip['chip_grade'])-self::Chip_Attenuation_Parameter($chip['chip_grade'])*self::Hero_Chip_Labor_Value($chip))/((1-self::Chip_Attenuation_Parameter($chip['chip_grade'])/2)*pow(self::Chip_Payback_Period($chip['chip_grade']),2))/round(1+0.04*$chip['chip_grade'],3),4))*(1+0.1*round(sin(self::Hero_Chip_Labor_Value($chip)),2));
|
||
return round($num,5);
|
||
}
|
||
|
||
//每日枪械芯片体力值衰减百分比
|
||
public static function Weapon_Chip_DA_Value($chip){
|
||
//Weapon_Chip_DA_Value=MAX(0,ROUND((Chip_Payback_Period-Chip_Attenuation_Parameter*Weapon_Chip_Labor_Value)/((1-Chip_Attenuation_Parameter/2)* Chip_Payback_Period^2)/ROUND(1+0.04*武器芯片星数,3),4))*(1+0.1*ROUND(SIN(Weapon_Chip_Labor_Value),2))
|
||
$num = max(0,round((self::Chip_Payback_Period($chip['chip_grade'])-self::Chip_Attenuation_Parameter($chip['chip_grade'])*self::Weapon_Chip_Labor_Value($chip))/((1-self::Chip_Attenuation_Parameter($chip['chip_grade'])/2)*pow(self::Chip_Payback_Period($chip['chip_grade']),2))/round(1+0.04*$chip['chip_grade'],3),4))*(1+0.1*round(sin(self::Weapon_Chip_Labor_Value($chip)),2));
|
||
return round($num,5);
|
||
}
|
||
|
||
//芯片升级MINT费用
|
||
public static function Chip_Need_Mint_Cost($grand){
|
||
// 芯片升星累计MINT成本=(SIGN(chip星级>=5)*SIGN(chip星级<=10)*ROUND(91*chip星级*(chip星级-6.06)/100+1000/100,0)*100+SIGN(chip星级>=11)*SIGN(chip星级<=15)*ROUND(364.29*chip星级*(chip星级-17.847)/100+33446/100,0)*100)*CEG_Discount_Rate
|
||
return (($grand>=5?1:0)*($grand<=10?1:0)*round(91*$grand*($grand-6.06)/100+1000/100,0)*100+($grand>=11?1:0)*($grand<=15?1:0)*round(364.29*$grand*($grand-17.847)/100+33446/100,0)*100)*self::CEG_Discount_Rate();
|
||
}
|
||
|
||
//芯片镶嵌MINT费用
|
||
public static function Chip_Inlay_Mint($grand){
|
||
//SIGN(芯片等级 >= 5) * ROUND((10+7*(芯片星级-1))*CEG_Discount_Rate,2)
|
||
return ($grand>=5?1:0)*round((10+7*($grand-1))*self::CEG_Discount_Rate(),2);
|
||
}
|
||
|
||
//芯片NFT拆卸MINT费用
|
||
public static function Chip_Demount_Mint($tili){
|
||
return round($tili*10*self::CEG_Discount_Rate());
|
||
}
|
||
|
||
//英雄NFT每次升级的CEG消耗公式
|
||
public static function Hero_Upgrade_CEG_Expend($grand){
|
||
//ROUND(43*ROUND(0.08*当前英雄等级^2+0.08*当前英雄等级+1,0)*CEG_Discount_Rate,0)
|
||
return round(43*round(0.08*pow($grand,2)+0.08*$grand+1,0)*self::CEG_Discount_Rate(),0);
|
||
}
|
||
|
||
//英雄NFT每次升级的CEC消耗公式
|
||
public static function Hero_Upgrade_CEC_Expend($grand){
|
||
//ROUND (ROUND(0.09*单次CEG消耗,0)*SIGN(当前英雄等级>14)*CEC_Discount_Rate,2)
|
||
// return round(round(0.09*self::Hero_Upgrade_CEG_Expend($grand),0)*($grand>14?1:0)*self::CEC_Discount_Rate(),2);
|
||
|
||
//ROUND(ROUND(0.036*43*ROUND(0.08*当前英雄等级^2+0.08*当前英雄等级+1,0),0)*SIGN(player等级>14)*CEC_Discount_Rate,2)
|
||
return round(round(0.036*43*round(0.08*pow($grand,2)+0.08*$grand+1,0),0)*($grand>14?1:0)*self::CEC_Discount_Rate(),2);
|
||
}
|
||
|
||
//英雄NFT每次进阶的CEG消耗公式
|
||
public static function Hero_Advanced_CEG_Expend($quality){
|
||
//ROUND((ROUND(0.08*当前英雄阶数^2+0.08*当前英雄阶数+1,0)*10+100)*CEG_Discount_Rate,0)
|
||
return round((round(0.08*pow($quality,2)+0.08*$quality+1,0)*10+100)*self::CEG_Discount_Rate(),0);
|
||
}
|
||
|
||
//英雄NFT每次进阶的CEC消耗公式
|
||
public static function Hero_Advanced_CEC_Expend($quality){
|
||
//ROUND((ROUND(0.08*当前英雄阶数^2+0.08*当前英雄阶数+1,0)*1.5+10)*CEC_Discount_Rate,2)
|
||
// return round((round(0.08*pow($quality,2)+0.08*$quality+1,0)*1.5+10)*self::CEC_Discount_Rate(),2);
|
||
|
||
//ROUND((ROUND(0.08*player阶数^2+0.08*player阶数+1,0)*0.6+4)*CEC_Discount_Rate,2)
|
||
return round((round(0.08*pow($quality,2)+0.08*$quality+1,0)*0.6+4)*self::CEC_Discount_Rate(),2);
|
||
}
|
||
|
||
//英雄NFT每次进阶成功的概率公式
|
||
public static function Hero_Advanced_Probability($quality){
|
||
//SIGN(当前英雄阶数>9.5)*ROUND(0.0043*当前英雄阶数^2-0.144*当前英雄阶数+1.2629,2)+SIGN(当前英雄阶数<9.5)*ROUND(1.2-0.1*当前英雄阶数,2)
|
||
return ($quality>9.5?1:0)*round(0.0043*pow($quality,2)-0.144*$quality+1.2629,2)+($quality<9.5?1:0)*round(1.2-0.1*$quality,2);
|
||
}
|
||
|
||
//英雄NFT幸运值
|
||
public static function Hero_Advanced_Lucky_Value($quality){
|
||
//ROUND((0.0354*英雄NFT阶数^5-0.8464*英雄NFT阶数^4+10.907*英雄NFT阶数^3 -48.868*英雄NFT阶数^2+312.18*英雄NFT阶数-80)/10,1)*10
|
||
return round((0.0354*pow($quality,5)-0.8464*pow($quality,4)+10.907*pow($quality,3)-48.868*pow($quality,2)+312.18*$quality-80)/10,1)*10;
|
||
}
|
||
|
||
//英雄NFT最大体力值
|
||
public static function Hero_NFT_Maximum_Physical_Strength($quality,$lucky){
|
||
//英雄NFT幸运值*ROUND(1.1714+0.0286*当前英雄NFT阶数,3)
|
||
return $lucky*round(1.1714+0.0286*$quality,3);
|
||
}
|
||
|
||
//枪械NFT每次升级的CEG消耗公式
|
||
public static function Weapon_Upgrade_CEG_Expend($grand){
|
||
//ROUND(ROUND(25.8*ROUND(0.08*当前枪械等级^2+0.08*当前枪械等级等级+1,0),0)*CEG_Discount_Rate,0)
|
||
return round(round(25.8*round(0.08*pow($grand,2)+0.08*$grand+1,0),0)*self::CEG_Discount_Rate(),0);
|
||
}
|
||
|
||
//枪械NFT每次升级的CEC消耗公式
|
||
public static function Weapon_Upgrade_CEC_Expend($grand){
|
||
//ROUND(ROUND(0.036*ROUND(25.8*ROUND(0.08*当前枪械等级^2+0.08*当前枪械等级等级+1,0),0)*SIGN(equip等级>14)*CEC_Discount_Rate,2)
|
||
return round(round(0.036*round(25.8*round(0.08*pow($grand,2)+0.08*$grand+1,0),0)*($grand>14?1:0)*self::CEC_Discount_Rate(),2));
|
||
}
|
||
|
||
//枪械NFT每次进阶的CEG消耗公式
|
||
public static function Weapon_Advanced_CEG_Expend($quality){
|
||
//ROUND((ROUND(0.08*枪械NFT阶数^2+0.08*枪械NFT阶数+1,0)*3+30)*CEG_Discount_Rate,0)
|
||
return round((round(0.08*pow($quality,2)+0.08*$quality+1,0)*3+30)*self::CEG_Discount_Rate(),0);
|
||
}
|
||
|
||
//枪械NFT每次进阶的CEC消耗公式
|
||
public static function Weapon_Advanced_CEC_Expend($quality){
|
||
//ROUND(ROUND(ROUND(0.08*equip阶数^2+0.08*equip阶数+1,0)*0.3+2,0)*CEC_Discount_Rate,2)
|
||
return round(round(round(0.08*pow($quality,2)+0.08*$quality+1,0)*0.3+2,0)*self::CEC_Discount_Rate(),2);
|
||
}
|
||
|
||
//枪械NFT每次进阶成功的概率公式
|
||
public static function Weapon_Advanced_Probability($quality){
|
||
//SIGN(当前枪械阶数>9.5)*ROUND(0.0043*当前枪械阶数^2-0.144*当前枪械阶数+1.2629,2)+SIGN(当前枪械阶数<9.5)*ROUND(1.2-0.1*当前枪械阶数,2)
|
||
return ($quality>9.5?1:0)*round(0.0043*pow($quality,2)-0.144*$quality+1.2629,2)+($quality<9.5?1:0)*round(1.2-0.1*$quality,2);
|
||
}
|
||
|
||
//枪械NFT幸运值
|
||
public static function Weapon_Advanced_Lucky_Value($quality){
|
||
//ROUND((0.0354*枪械NFT阶数^5-0.8464*枪械NFT阶数^4+10.907*枪械NFT阶数^3 -48.868*枪械NFT阶数^2+312.18*枪械NFT阶数-80)/10,1)*3
|
||
return round((0.0354*pow($quality,5)-0.8464*pow($quality,4)+10.907*pow($quality,3)-48.868*pow($quality,2)+312.18*$quality-80)/10,1)*3;
|
||
}
|
||
|
||
//枪械NFT最大耐久度
|
||
public static function Weapon_NFT_Maximum_Durability($quality,$lucky){
|
||
//枪械NFT幸运值*ROUND(1.1714+0.0286*当前枪械NFT阶数,3)
|
||
return $lucky*round(1.1714+0.0286*$quality,3);
|
||
}
|
||
|
||
//英雄NFT碎片合成费用
|
||
public static function Hero_Parts_Synthetic_Cost(){
|
||
// //ROUND(每日新增1阶英雄NFT数量(前1天官方商城正价购买)*6%,0)*30%*2000*CEG折扣比率
|
||
// return round($hero_count*0.06,0)*0.3*2000*self::CEG_Discount_Rate();
|
||
//player碎片合成MINT费用=50%*2000*CEC_Anchor_Price
|
||
return 0.5*2000*self::CEC_Anchor_Price();
|
||
}
|
||
|
||
//枪械NFT碎片合成费用
|
||
public static function Weapon_Parts_Synthetic_Cost(){
|
||
// //ROUND(每日新增1阶枪械NFT数量(前1天官方商城正价购买)*6%,0)*30%*600*CEG折扣比率
|
||
// return round($gun_count*0.06,0)*0.3*600*self::CEG_Discount_Rate();
|
||
|
||
//equip碎片合成MINT费用=50%*600*CEC_Anchor_Price
|
||
return 0.5*600*self::CEC_Anchor_Price();
|
||
}
|
||
|
||
//每日英雄体力值衰减百分比
|
||
public static function Hero_PSA_Value($heroDb){
|
||
//MAX(0,ROUND((Hero_Payback_Period-Hero_Attenuation_Parameter* Hero_Labor_Value)/((1-Hero_Attenuation_Parameter/2)* Hero_Payback_Period^2)/ROUND(1.1714+0.0286*英雄阶数,3),4))*(1+0.1*ROUND(SIN(Hero_Labor_Value),2))
|
||
return max(0,round((self::Hero_Payback_Period($heroDb['quality'])-self::Hero_Attenuation_Parameter($heroDb['quality'])*self::Hero_Labor_Value($heroDb))/((1-self::Hero_Attenuation_Parameter($heroDb['quality'])/2)*pow(self::Hero_Payback_Period($heroDb['quality']),2))/round(1.1714+0.0286*$heroDb['quality'],3),4))*(1+0.1*round(sin(self::Hero_Labor_Value($heroDb)),2));
|
||
}
|
||
|
||
//每日武器耐久度衰减百分比
|
||
public static function Weapon_DA_Value($weaponDb){
|
||
//MAX(0,ROUND((Weapon_Payback_Period-Weapon_Attenuation_Parameter* Weapon_Labor_Value)/((1-Weapon_Attenuation_Parameter/2)* Weapon_Payback_Period ^2)/ROUND(1.1714+0.0286*武器阶数,3),4))*(1+0.1*ROUND(SIN(Weapon_Labor_Value),2))
|
||
return max(0,round((self::Weapon_Payback_Period($weaponDb['quality'])-self::Weapon_Attenuation_Parameter($weaponDb['quality'])*self::Weapon_Labor_Value($weaponDb))/((1-self::Weapon_Attenuation_Parameter($weaponDb['quality'])/2)*pow(self::Weapon_Payback_Period($weaponDb['quality']),2))/round(1.1714+0.0286*$weaponDb['quality'],3),4))*(1+0.1*round(sin(self::Weapon_Labor_Value($weaponDb)),2));
|
||
}
|
||
|
||
//英雄回本周期(参数单位:天)
|
||
public static function Hero_Payback_Period($quality){
|
||
//ROUND(-0.019*英雄阶数^3+0.1884*英雄阶数^2+11.685*英雄阶数+48.765,0)
|
||
return round(-0.019*pow($quality,3)+0.1884*pow($quality,2)+11.685*$quality+48.765,0);
|
||
}
|
||
|
||
//英雄衰减参数
|
||
public static function Hero_Attenuation_Parameter($quality){
|
||
//ROUND(-0.000015*英雄阶数^3+0.0008*英雄阶数^2-0.02325*英雄阶数+0.606,3)
|
||
return round(-0.000015*pow($quality,3)+0.0008*pow($quality,2)-0.02325*$quality+0.606,3);
|
||
}
|
||
|
||
//枪械回本周期(参数单位:天)
|
||
public static function Weapon_Payback_Period($quality){
|
||
//ROUND(-0.019*武器阶数^3+0.1884*武器阶数^2+11.685*武器阶数+48.765,0)
|
||
return round(-0.019*pow($quality,3)+0.1884*pow($quality,2)+11.685*$quality+48.765,0);
|
||
}
|
||
|
||
//枪械衰减参数
|
||
public static function Weapon_Attenuation_Parameter($quality){
|
||
//ROUND(-0.000015*武器阶数^3+0.0008*武器阶数^2-0.02325*武器阶数+0.606,3)
|
||
return round(-0.000015*pow($quality,3)+0.0008*pow($quality,2)-0.02325*$quality+0.606,3);
|
||
}
|
||
|
||
//英雄体力值全局衰减系数
|
||
public static function GAC_PS_Value($quality){
|
||
//GAC_PS_Value=ROUND(MAX(ROUND(2-0.2/30*服务器自然天数,3)/ROUND(1.2+0.0286*(英雄NFT阶数-1),3),1)*MAX(SIGN(服务器自然天数<=180)*1+SIGN(服务器自然天数>180)*99.87%^(服务器自然天数-180),90%),3)
|
||
$day = RealtimeData::getServerDays();
|
||
return round(max(round(2-0.2/30*$day,3)/round(1.2+0.0286*($quality-1),3),1)*max(($day<=180?1:0)*1+($day>180?1:0)*pow(0.9987,$day-180),0.9),3);
|
||
}
|
||
|
||
//武器耐久度全局衰减系数
|
||
public static function GAC_D_Value($quality){
|
||
//GAC_D_Value=ROUND(MAX(ROUND(2-0.2/30*服务器自然天数,3)/ROUND(1.2+0.0286*(枪械NFT阶数-1),3),1)*MAX(SIGN(服务器自然天数<=180)*1+SIGN(服务器自然天数>180)*99.87%^(服务器自然天数-180),90%),3)
|
||
$day = RealtimeData::getServerDays();
|
||
return round(max(round(2-0.2/30*$day,3)/round(1.2+0.0286*($quality-1),3),1)*max(($day<=180?1:0)*1+($day>180?1:0)*pow(0.9987,$day-180),0.9),3);
|
||
}
|
||
|
||
//英雄芯片体力值全局衰减系数
|
||
public static function Hero_Chip_GAC_PS_Value($grand){
|
||
//Hero_Chip_GAC_PS_Value=ROUND(MAX(ROUND(2-0.2/30*服务器自然天数,3)/ROUND(1+0.04*芯片星级,3),1)*MAX(SIGN(服务器自然天数<=180)*1+SIGN(服务器自然天数>180)*99.87%^(服务器自然天数-180),90%),3)
|
||
$day = RealtimeData::getServerDays();
|
||
return round(max(round(2-0.2/30*$day,3)/round(1+0.04*$grand,3),1)*max(($day<=180?1:0)*1+($day>180?1:0)*pow(0.9987,$day-180),0.9),3);
|
||
}
|
||
|
||
//武器芯片体力值全局衰减系数
|
||
public static function Weapon_Chip_GAC_PS_Value($grand){
|
||
//Weapon_Chip_GAC_PS_Value=ROUND(MAX(ROUND(2-0.2/30*服务器自然天数,3)/ROUND(1+0.04*芯片星级,3),1)*MAX(SIGN(服务器自然天数<=180)*1+SIGN(服务器自然天数>180)*99.87%^(服务器自然天数-180),90%),3)
|
||
$day = RealtimeData::getServerDays();
|
||
return round(max(round(2-0.2/30*$day,3)/round(1+0.04*$grand,3),1)*max(($day<=180?1:0)*1+($day>180?1:0)*pow(0.9987,$day-180),0.9),3);
|
||
}
|
||
|
||
//CEG锚定U的价格
|
||
public static function CEG_Anchor_Price(){
|
||
//ROUND(CEG_Dynamic_Price * CEG_Discount_Rate,3)
|
||
return round(self::CEG_Dynamic_Price()*self::CEG_Discount_Rate(),3);
|
||
}
|
||
|
||
//英雄NFT转化公式:(以U为计价单位)
|
||
public static function Calc_Hero_Convert_Cost($hero){
|
||
//英雄NFT手续费=[200*( CEG_Anchor_Price)+43*ROUND(0.08*英雄阶数*(英雄阶数+1)*(英雄阶数+2)/3+(英雄阶数-2)+SIGN(英雄阶数=4),0)*0.1*50%]
|
||
return 200*(self::CEG_Anchor_Price())+43*round(0.08*$hero['hero_lv']*($hero['hero_lv']+1)*($hero['hero_lv']+2)/3+($hero['hero_lv']-2)+($hero['hero_lv']==4?1:0),0)*0.1*0.5;
|
||
}
|
||
//枪械NFT转化公式:(以U为计价单位)
|
||
public static function Calc_Weapon_Convert_Cost($gun){
|
||
//枪械NFT手续费=[60*(CEG_Anchor_Price)+ROUND(43*0.6*ROUND(0.08*枪械阶数*(枪械阶数+1)*( 枪械阶数+2)/3+(枪械阶数-2)+SIGN(枪械阶数=4),0),0)*0.1*50%]
|
||
return 60*(self::CEG_Anchor_Price())+round(43*0.6*round(0.08*$gun['gun_lv']*($gun['gun_lv']+1)*($gun['gun_lv']+2)/3+($gun['gun_lv']-2)+($gun['gun_lv']==4?1:0),0),0)*0.1*0.5;
|
||
}
|
||
//BCEG转化CEG公式(以U为计价单位)
|
||
public static function Calc_BCEG_Convert_Cost($bceg){
|
||
//BCEG手续费=MIN(BCEG数量,3720)* CEG_Conversion_Percentage * CEG_Dynamic_Price
|
||
$paramMeta1 = mt\Parameter::getByName('bceg_max');
|
||
$bceg_max = $paramMeta1 ? $paramMeta1['param_value'] : 3720;
|
||
$paramMeta2 = mt\Parameter::getByName('CEG_Conversion_Percentage');
|
||
$param = $paramMeta2 ? $paramMeta2['param_value'] : 0.3;
|
||
return min($bceg,$bceg_max)*$param*self::CEG_Dynamic_Price();
|
||
}
|
||
|
||
//排位赛最大分配金额
|
||
public static function calcCECMaxSum(){
|
||
//当月排位赛最大分配金额=ROUND(4*10000*10000/(12*(1+0.7^1+0.7^2+0.7^3+0.7^4+0.7^5+0.7^6+0.7^7))*0.7^(CEILING(月份数/12-0.01,1)-1),0)*MAX(71%-N*1%,50%)
|
||
$month = date('m',myself()->_getNowTime());
|
||
//return round(40000000/(12*(1+pow(0.7,1)+pow(0.7,2)+pow(0.7,3)+pow(0.7,4)
|
||
// +pow(0.7,5)+pow(0.7,6)+pow(0.7,7)))*pow(0.7,ceil($month/12-0.01)-1),0)*0.7;
|
||
return round(4*10000*10000/(12*(1+pow(0.7,1)+pow(0.7,2)+pow(0.7,3)+pow(0.7,4)
|
||
+pow(0.7,5)+pow(0.7,6)+pow(0.7,7)))*pow(0.7,ceil($month/12-0.01)-1),0)
|
||
*max(0.71-$month*0.01,0.5);
|
||
}
|
||
//排位赛参与分配人数
|
||
private function calcPeopleCapita($kingCount){
|
||
//赛季总榜分配人数=ROUND(当赛季大师及以上人数*10%,0)
|
||
// return min($kingCount,round(pow(log10($kingCount+2),3)*1.5,1)*100);
|
||
return round($kingCount*0.1,0);
|
||
}
|
||
//排位赛人数%
|
||
private static function calcPeopleCapitaPer($kingCount){
|
||
//MIN(ROUND(0.31*MIN(当月王者及以上用户数,ROUND(LOG10(当月王者及以上用户数+1)^3*1.5,2)*100)^0.226,2),2)
|
||
//return min(round(0.31*pow(min($kingCount,round(pow(log10($kingCount+1),3)*1.5,2)*100),0.226),2),2);
|
||
//排位赛人数%=MAX(ROUND(5.8-0.85*(1+MIN(当月王者用户数,ROUND(LOG10(当月王者用户数+1)^3*1.5,0)*100))^0.2,2),2)
|
||
return max(round(5.8-0.85*pow(1+min($kingCount,round(pow(log10($kingCount+1),3)*1.5,0)*100),0.2),2),2);
|
||
}
|
||
//TopX梯队
|
||
public static function echelonTopX($top){
|
||
//TopX梯队=SIGN(TopX<=3)*1+SIGN(TopX>3)*SIGN(TopX<=10)*2+SIGN(TopX>10)*SIGN(TopX<=50)*3
|
||
//+SIGN(TopX>50)*SIGN(TopX<=100)*4+SIGN(TopX>100)*SIGN(TopX<=500)*5+SIGN(TopX>500)*SIGN(TopX<=1000)*6
|
||
//+SIGN(TopX>1000)*SIGN(TopX<=2000)*7+SIGN(TopX>2000)*SIGN(TopX<=5000)*8
|
||
//+SIGN(TopX>5000)*SIGN(TopX<=10000)*9+SIGN(TopX>10000)*10
|
||
return ($top<=3?1:0)*1+($top>3?1:0)*($top<=10?1:0)*2+($top>10?1:0)*($top<=50?1:0)*3
|
||
+($top>50?1:0)*($top<=100?1:0)*4+($top>100?1:0)*($top<=500?1:0)*5+($top>500?1:0)*($top<=1000?1:0)*6
|
||
+($top>1000?1:0)*($top<=2000?1:0)*7+($top>2000?1:0)*($top<=5000?1:0)*8
|
||
+($top>5000?1:0)*($top<=10000?1:0)*9+($top>10000?1:0)*10;
|
||
}
|
||
//TopX开始值
|
||
public static function startTopX($topTd){
|
||
//TopX开始值=SIGN(TopX梯队=1)*1+SIGN(TopX梯队=2)*4+SIGN(TopX梯队=3)*11+SIGN(TopX梯队=4)*51
|
||
//+SIGN(TopX梯队=5)*101+SIGN(TopX梯队=6)*501+SIGN(TopX梯队=7)*1001
|
||
//+SIGN(TopX梯队=8)*2001+SIGN(TopX梯队=9)*5001+SIGN(TopX梯队=10)*10001
|
||
return ($topTd==1?1:0)*1+($topTd==2?1:0)*4+($topTd==3?1:0)*11+($topTd==4?1:0)*51
|
||
+($topTd==5?1:0)*101+($topTd==6?1:0)*501+($topTd==7?1:0)*1001
|
||
+($topTd==8?1:0)*2001+($topTd==9?1:0)*5001+($topTd==10?1:0)*10001;
|
||
// return (self::echelonTopX($top)==1?1:0)*1+(self::echelonTopX($top)==2?1:0)*4+(self::echelonTopX($top)==3?1:0)*11+(self::echelonTopX($top)==4?1:0)*51
|
||
// +(self::echelonTopX($top)==5?1:0)*101+(self::echelonTopX($top)==6?1:0)*501+(self::echelonTopX($top)==7?1:0)*1001
|
||
// +(self::echelonTopX($top)==8?1:0)*2001+(self::echelonTopX($top)==9?1:0)*5001+(self::echelonTopX($top)==10?1:0)*10001;
|
||
}
|
||
//TopX梯队最高值
|
||
private static function maxTopX($topTd){
|
||
//TopX梯队最高值=ROUND(20000*0.6^(TopX梯队-1)*0.8*0.9^(TopX梯队-1),0)
|
||
// return round(2000*pow(0.6,$topTd-1)*pow(0.9,$topTd-1),0);
|
||
return round(20000*pow(0.6,$topTd-1) * 0.8 * pow(0.9,$topTd-1),0);
|
||
|
||
}
|
||
//TopX梯队最低值
|
||
private static function minTopX($topTd){
|
||
//TopX梯队最低值=ROUND(20000*0.6^(TopX梯队)*0.8*0.9^(TopX梯队-1),0)
|
||
return round(20000*pow(0.6,$topTd) * 0.8 * pow(0.9,$topTd-1),0);
|
||
}
|
||
//TopX排位赛标准分配额
|
||
public static function standardTopX($top,$topTd){
|
||
//TopX排位赛标准分配额=MAX(ROUND(TopX梯队最高值-(TopX梯队最高值-TopX梯队最低值)/(TopX梯队开始值(TopX梯队+1)-TopX梯队开始值-1)*(TopX-TopX梯队开始值),2),TopX梯队最低值)
|
||
$XX = self::startTopX($topTd+1)?self::startTopX($topTd+1):10001;
|
||
return max(round(self::maxTopX($topTd)-(self::maxTopX($topTd)-self::minTopX($topTd))/($XX-self::startTopX($topTd)-1)*($top-self::startTopX($topTd)),2),self::minTopX($topTd));
|
||
}
|
||
//TopX排位赛预计分配额
|
||
public static function calcCECTopXSum($top,$topTd,$kingCount){
|
||
//TopX排位赛标准分配额*排位赛人数%
|
||
return self::standardTopX($top,$topTd)*self::calcPeopleCapitaPer($kingCount);
|
||
|
||
}
|
||
}
|