game2006api/webapp/services/FormulaService.php
hujiabin a1482b9c0e 1
2023-09-01 10:52:32 +08:00

883 lines
48 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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(队伍排名) = round1-(队伍排名-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);
}
}