diff --git a/sql/gamedb.sql b/sql/gamedb.sql index 54b11ba3..984811ca 100644 --- a/sql/gamedb.sql +++ b/sql/gamedb.sql @@ -165,6 +165,7 @@ CREATE TABLE `t_hero` ( `chip_ids` varchar(100) NOT NULL DEFAULT '' COMMENT '已镶嵌的芯片idx组', `skill_common` varchar(255) NOT NULL DEFAULT '100100|100120|100140|100160|100180|100200|100220|100240|100260|100280' COMMENT '通用技能', `skill_points` int(11) NOT NULL DEFAULT '0' COMMENT '技能点', + `labour` int(11) NOT NULL DEFAULT '0' COMMENT '劳力值', PRIMARY KEY (`idx`), UNIQUE KEY `token_id` (`token_id`), KEY `account_id` (`account_id`) @@ -266,6 +267,7 @@ CREATE TABLE `t_chip` ( `strength` varchar(10) NOT NULL DEFAULT '0' COMMENT '前一天体力值', `createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间', `modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间', + `labour` int(11) NOT NULL DEFAULT '0' COMMENT '劳力值', PRIMARY KEY (`idx`), UNIQUE KEY `token_id` (`token_id`), KEY `item_id` (`item_id`), @@ -303,6 +305,7 @@ CREATE TABLE `t_gun` ( `createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间', `modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间', `chip_ids` varchar(100) NOT NULL DEFAULT '' COMMENT '已镶嵌的芯片idx组', + `labour` int(11) NOT NULL DEFAULT '0' COMMENT '劳力值', PRIMARY KEY (`idx`), UNIQUE KEY `token_id` (`token_id`), KEY `account_id` (`account_id`) diff --git a/webapp/controller/SeasonController.class.php b/webapp/controller/SeasonController.class.php index ee244a19..3ce04d46 100644 --- a/webapp/controller/SeasonController.class.php +++ b/webapp/controller/SeasonController.class.php @@ -25,18 +25,17 @@ class SeasonController extends BaseAuthedController { private $propertyChgService = null; private $awardService = null; private $userInfo = null; - private $seasonService = null; - private $currSeasonMeta = null; private $currRankSeasonMeta = null; private $seasonDb = null; private $missionService = null; private $rankingUnid = 'game_2006_rank'; + private $TopXunid = 'echelon_TopX_'; + private $starshine = 2800; public function _handlePre() { parent::_handlePre(); $this->currRankSeasonMeta = mt\RankSeason::getCurrentSeason(); -// $this->currSeasonMeta = mt\Season::getCurrentSeason(); if (!$this->currRankSeasonMeta) { $this->_rspErr(10, 'server internal error'); die(); @@ -44,11 +43,6 @@ class SeasonController extends BaseAuthedController { $this->propertyChgService = new services\PropertyChgService(); $this->awardService = new services\AwardService(); $this->userInfo = $this->_safeGetOrmUserInfo(); -// $this->seasonService = new services\SeasonService(); -// if (!$this->seasonService->checkSeason($this->userInfo)) { -// $this->userInfo = $this->_safeGetOrmUserInfo(); -// $this->propertyChgService->addUserChg(); -// } $this->seasonDb = Season::find($this->currRankSeasonMeta['id']); if (!$this->seasonDb) { Season::add($this->currRankSeasonMeta['id']); @@ -79,7 +73,11 @@ class SeasonController extends BaseAuthedController { public function infoNew() { - +// $r = $this->_getRedis($this->TopXunid.'4'); +// $TopX_List = $this->readRankingList($r,$this->TopXunid.'5'); +// $XX = $TopX_List ? $TopX_List[0]["rank_sort"]:10001; +// print_r($XX); +// die; $rankMeta = mt\Rank::getRankById($this->userInfo['rank']); $nextRankMeta = mt\Rank::getNextRankById($this->userInfo['rank']); if (!$nextRankMeta){ @@ -99,31 +97,7 @@ class SeasonController extends BaseAuthedController { $rankList = $this->readRankingList($r,$this->rankingUnid); $list = array(); if (!$rankList){ - $users = User::orderBy(User::allUser()); - $rewardParamMeta = \mt\Parameter::getByName('rank_ring_reward'); - $rewardParamMetaValue = $rewardParamMeta ? $rewardParamMeta['param_value'] : ''; - $rewardList = explode('|',$rewardParamMetaValue); - if (count($users)>0){ - foreach ($users as $k=>$user){ - $userDto = User::getUserByRankMess($user); - $userDto['rank_sort'] = $k+1; - switch ($userDto['rank_sort']){ - case 1:$userDto['ring_item_id'] = $rewardList[0];break; - case 2:$userDto['ring_item_id'] = $rewardList[1];break; - case 3:$userDto['ring_item_id'] = $rewardList[2];break; - default : $userDto['ring_item_id'] = 0; - } - array_push($rankList,$userDto); - } - foreach ($rankList as $k=>$value){ - if ($value['rank_sort'] <= 200){ - $cec = 999; - $rankList[$k]['rewardCEC'] = $cec; - }else{ - $rankList[$k]['rewardCEC'] = 0; - } - } - } + $rankList = $this->checkRankingList(); $this->saveRankingList($r,$this->rankingUnid,$rankList); } foreach ($rankList as $v){ @@ -131,20 +105,8 @@ class SeasonController extends BaseAuthedController { array_push($list,$v); } } -// $users = User::orderBy(User::getUserByRank($this->userInfo['rank'])); -// $season_rank = array(); -// if (count($users)>0){ -// foreach ($users as $k=>$user){ -// if ($k<20){ -// $userDto = User::getUserByRankMess($user); -// $userDto['rank_sort'] = $k+1; -// array_push($season_rank,$userDto); -// } -// } -// } - $info['season_rank'] = $list; + $info['season_rank'] = $rankList; $this->_rspData(['info'=>$info]); -// print_r($info); } public function getRankingInfo(){ @@ -157,31 +119,7 @@ class SeasonController extends BaseAuthedController { $rankList = $this->readRankingList($r,$this->rankingUnid); $list = array(); if (!$rankList){ - $users = User::orderBy(User::allUser()); - $rewardParamMeta = \mt\Parameter::getByName('rank_ring_reward'); - $rewardParamMetaValue = $rewardParamMeta ? $rewardParamMeta['param_value'] : ''; - $rewardList = explode('|',$rewardParamMetaValue); - if (count($users)>0){ - foreach ($users as $k=>$user){ - $userDto = User::getUserByRankMess($user); - $userDto['rank_sort'] = $k+1; - switch ($userDto['rank_sort']){ - case 1:$userDto['ring_item_id'] = $rewardList[0];break; - case 2:$userDto['ring_item_id'] = $rewardList[1];break; - case 3:$userDto['ring_item_id'] = $rewardList[2];break; - default : $userDto['ring_item_id'] = 0; - } - array_push($rankList,$userDto); - } - foreach ($rankList as $k=>$value){ - if ($value['rank_sort'] <= 200){ - $cec = 999; - $rankList[$k]['rewardCEC'] = $cec; - }else{ - $rankList[$k]['rewardCEC'] = 0; - } - } - } + $rankList = $this->checkRankingList(); $this->saveRankingList($r,$this->rankingUnid,$rankList); } @@ -325,6 +263,129 @@ class SeasonController extends BaseAuthedController { return $info; } + private function checkRankingList(){ + $rankList = array(); + $users = User::orderBy(User::allUser()); + $rewardParamMeta = \mt\Parameter::getByName('rank_ring_reward'); + $rewardParamMetaValue = $rewardParamMeta ? $rewardParamMeta['param_value'] : ''; + $rewardList = explode('|',$rewardParamMetaValue); + if (count($users)>0){ + $KingCount = 0; + foreach ($users as $k=>$user){ + $userDto = User::getUserByRankMess($user); + $userDto['rank_sort'] = $k+1; + if ($userDto['score'] >= $this->starshine){ + $KingCount += 1; + $userDto['echelonTopX'] = $this->echelonTopX($userDto['rank_sort']); + $r = $this->_getRedis($this->TopXunid.$userDto['echelonTopX']); + $TopX_List = $this->readRankingList($r,$this->TopXunid.$userDto['echelonTopX']); + array_push($TopX_List,$userDto); + $this->saveRankingList($r,$this->TopXunid.$userDto['echelonTopX'],$TopX_List); + } + switch ($userDto['rank_sort']){ + case 1:$userDto['ring_item_id'] = $rewardList[0];break; + case 2:$userDto['ring_item_id'] = $rewardList[1];break; + case 3:$userDto['ring_item_id'] = $rewardList[2];break; + default : $userDto['ring_item_id'] = 0; + } + array_push($rankList,$userDto); + } + + //当月排位赛最大分配金额 + $maxSum = $this->calcCECMaxSum(); + //排位赛参与分配人数 +// $PeopleCapita = $this->calcPeopleCapita($KingCount); + //排位赛人数% +// $PeopleCapitaPer = $this->calcPeopleCapitaPer($KingCount); + //排位赛预计分配额 + $expected_CEC_Sum = 0; + foreach ($rankList as $k=>$value){ + $r = $this->_getRedis($this->TopXunid.($value['echelonTopX']+1)); + $TopX_List = $this->readRankingList($r,$this->TopXunid.($value['echelonTopX']+1)); + $XX = $TopX_List ? $TopX_List[0]["rank_sort"]:10001; + $rankList[$k]['standardTopX'] = $this->standardTopX($value['rank_sort'],$XX); + $expected_CEC_Sum += $this->calcCECTopXSum($value['rank_sort'],$KingCount,$XX); + } + //排位赛金额% + $rankAmountPre = min($maxSum/($expected_CEC_Sum+1),1); //MIN(当月排位赛最大分配额/(排位赛预计分配额+1),1) + + foreach ($rankList as $k=>$value){ +// $rankList[$k]['rewardCEC'] = $value['standardTopX']*$rankAmountPre; + if ($value['score'] >= $this->starshine){ + $rankList[$k]['rewardCEC'] = $value['standardTopX']*$rankAmountPre; + }else{ + $rankList[$k]['rewardCEC'] = 0; + } + } + } + return $rankList; + } + + //排位赛最大分配金额 + private function calcCECMaxSum(){ + //当月排位赛最大分配金额=ROUND(40000000/(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)*70% + $month = date('m',$this->_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; + } + //排位赛参与分配人数 + private function calcPeopleCapita($kingCount){ + //MIN(当月王者及以上用户数,ROUND(LOG10(当月王者及以上用户数+2)^3*1.5,1)*100) + return min($kingCount,round(pow(log10($kingCount+2),3)*1.5,1)*100); + } + //排位赛人数% + private 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); + } + //TopX梯队 + private 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开始值 + private function startTopX($top){ + //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 ($this->echelonTopX($top)==1?1:0)*1+($this->echelonTopX($top)==2?1:0)*4+($this->echelonTopX($top)==3?1:0)*11+($this->echelonTopX($top)==4?1:0)*51 + +($this->echelonTopX($top)==5?1:0)*101+($this->echelonTopX($top)==6?1:0)*501+($this->echelonTopX($top)==7?1:0)*1001 + +($this->echelonTopX($top)==8?1:0)*2001+($this->echelonTopX($top)==9?1:0)*5001+($this->echelonTopX($top)==10?1:0)*10001; + } + //TopX梯队最高值 + private function maxTopX($top){ + //TopX梯队最高值=ROUND(2000*0.6^(TopX梯队-1)*0.9^(TopX梯队-1),0) + return round(2000*pow(0.6,$this->echelonTopX($top)-1)*pow(0.9,$this->echelonTopX($top)-1),0); + + } + //TopX梯队最低值 + private function minTopX($top){ + //TopX梯队最低值=ROUND(2000*0.6^(TopX梯队)*0.9^(TopX梯队-1),0) + return round(2000*pow(0.6,$this->echelonTopX($top))*pow(0.9,$this->echelonTopX($top)-1),0); + } + //TopX排位赛标准分配额 + private function standardTopX($top,$XX){ + //TopX排位赛标准分配额=MAX(ROUND(TopX梯队最高值-(TopX梯队最高值-TopX梯队最低值)/(TopX梯队开始值(TopX梯队+1)-TopX梯队开始值-1)*(TopX-TopX梯队开始值),2),TopX梯队最低值) + return max(round($this->maxTopX($top)-($this->maxTopX($top)-$this->minTopX($top))/($XX-$this->startTopX($top)-1)*($top-$this->startTopX($top)),2),$this->minTopX($top)); + } + //TopX排位赛预计分配额 + private function calcCECTopXSum($top,$kingCount,$XX){ + //TopX排位赛标准分配额*排位赛人数% + return $this->standardTopX($top,$XX)*$this->calcPeopleCapitaPer($kingCount); + + } + //排位赛金额% + private function rankAmountPre(){ + //MIN(当月排位赛最大分配额/(排位赛预计分配额+1),1) + } + + private function readRankingList($r,$rankUnid) { $list = $r->get(RANKING_KEY.$rankUnid); diff --git a/webapp/models/Hero.php b/webapp/models/Hero.php index 9324183f..8eedb0a4 100644 --- a/webapp/models/Hero.php +++ b/webapp/models/Hero.php @@ -10,6 +10,7 @@ require_once('mt/Item.php'); require_once('mt/SkillCommon.php'); require_once('models/HeroSkin.php'); require_once('models/Chip.php'); +require_once('models/User.php'); require_once('services/NftService.php'); require_once('services/FormulaService.php'); @@ -21,6 +22,7 @@ use services\NftService; use services\FormulaService; + class Hero extends BaseModel { const GETED_STATE = 0; @@ -116,6 +118,7 @@ class Hero extends BaseModel { 'token_id' => $nftDb['token_id'], ) ); + User::upsertHeadList($itemMeta); } } if ($row) { @@ -272,7 +275,6 @@ class Hero extends BaseModel { } if ($tokenId) { $fieldsKv['token_id'] = $tokenId; - User::upsertHeadList($heroMeta); } SqlHelper::insert( diff --git a/webapp/models/SeasonHistory.php b/webapp/models/SeasonHistory.php index 1b0587d3..f5fda737 100644 --- a/webapp/models/SeasonHistory.php +++ b/webapp/models/SeasonHistory.php @@ -1,10 +1,33 @@ _getSelfMysql(), + 't_season_history', + array( + 'account_id' => myself()->_getAccountId(), + 'season' => $data['season'], + ), + array(), + $data + ); + } + + public static function getDataBySeasonId($seasonId){ + return SqlHelper::ormSelect( + myself()->_getSelfMysql(), + 't_season_history', + array( + 'season' => $seasonId, + ) + ); + } } \ No newline at end of file diff --git a/webapp/models/UserSeasonRing.php b/webapp/models/UserSeasonRing.php index 47583004..97821aaf 100644 --- a/webapp/models/UserSeasonRing.php +++ b/webapp/models/UserSeasonRing.php @@ -3,8 +3,10 @@ namespace models; +use mt; +use phpcommon\SqlHelper; -class UserSeasonRing +class UserSeasonRing extends BaseModel { } \ No newline at end of file diff --git a/webapp/services/FormulaService.php b/webapp/services/FormulaService.php index 6cdac994..ecb3626e 100644 --- a/webapp/services/FormulaService.php +++ b/webapp/services/FormulaService.php @@ -788,4 +788,63 @@ class FormulaService extends BaseService { return min($bceg,$bceg_max)*$param*self::CEG_Dynamic_Price(); } + //排位赛最大分配金额 + public static function calcCECMaxSum(){ + //当月排位赛最大分配金额=ROUND(40000000/(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)*70% + $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; + } + //排位赛参与分配人数 + private function calcPeopleCapita($kingCount){ + //MIN(当月王者及以上用户数,ROUND(LOG10(当月王者及以上用户数+2)^3*1.5,1)*100) + return min($kingCount,round(pow(log10($kingCount+2),3)*1.5,1)*100); + } + //排位赛人数% + 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); + } + //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开始值 + private static function startTopX($top){ + //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 (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($top){ + //TopX梯队最高值=ROUND(2000*0.6^(TopX梯队-1)*0.9^(TopX梯队-1),0) + return round(2000*pow(0.6,self::echelonTopX($top)-1)*pow(0.9,self::echelonTopX($top)-1),0); + + } + //TopX梯队最低值 + private static function minTopX($top){ + //TopX梯队最低值=ROUND(2000*0.6^(TopX梯队)*0.9^(TopX梯队-1),0) + return round(2000*pow(0.6,self::echelonTopX($top))*pow(0.9,self::echelonTopX($top)-1),0); + } + //TopX排位赛标准分配额 + public static function standardTopX($top,$XX){ + //TopX排位赛标准分配额=MAX(ROUND(TopX梯队最高值-(TopX梯队最高值-TopX梯队最低值)/(TopX梯队开始值(TopX梯队+1)-TopX梯队开始值-1)*(TopX-TopX梯队开始值),2),TopX梯队最低值) + return max(round(self::maxTopX($top)-(self::maxTopX($top)-self::minTopX($top))/($XX-self::startTopX($top)-1)*($top-self::startTopX($top)),2),self::minTopX($top)); + } + //TopX排位赛预计分配额 + public static function calcCECTopXSum($top,$kingCount,$XX){ + //TopX排位赛标准分配额*排位赛人数% + return self::standardTopX($top,$XX)*self::calcPeopleCapitaPer($kingCount); + + } }