203 lines
8.4 KiB
PHP
203 lines
8.4 KiB
PHP
<?php
|
|
|
|
require_once('mt/Parameter.php');
|
|
require_once('mt/CircuitTime.php');
|
|
require_once('mt/CircuitReward.php');
|
|
require_once('mt/CircuitTask.php');
|
|
require_once('models/Circuit.php');
|
|
require_once('models/User.php');
|
|
require_once('models/Hero.php');
|
|
require_once('models/HeroSkin.php');
|
|
require_once('models/CircuitTask.php');
|
|
require_once('models/UserInvitationCode.php');
|
|
|
|
|
|
use models\Circuit;
|
|
use models\User;
|
|
use models\Hero;
|
|
use models\HeroSkin;
|
|
use models\CircuitTask;
|
|
use models\UserInvitationCode;
|
|
use phpcommon\SqlHelper;
|
|
class CircuitController extends BaseAuthedController {
|
|
private $redis_key_circuit_ranking = 'circuit_ranking';
|
|
private $redis_key_circuit_phase_ranking = 'circuit_phase_ranking';
|
|
|
|
public function _handlePre()
|
|
{
|
|
parent::_handlePre();
|
|
if (!myself()->_switchIsOpen('circuitMatch')) {
|
|
$this->_rspErr(1, 'server error1');
|
|
die;
|
|
}
|
|
if (!(count(CIRCUIT_MATCH_SERVER_LIST) <= 0 || in_array(myself()->_getZid(), CIRCUIT_MATCH_SERVER_LIST))) {
|
|
$this->_rspErr(1, 'server error2');
|
|
die;
|
|
}
|
|
}
|
|
|
|
public function CircuitTaskList(){
|
|
$circuitCircuitMeta = mt\CircuitTime::getCurrentCircuit();
|
|
$nextCircuitMeta = mt\CircuitTime::getNextCircuit();
|
|
$taskList = array();
|
|
if (!$circuitCircuitMeta &&
|
|
$nextCircuitMeta &&
|
|
myself()->_getNowTime() > strtotime($nextCircuitMeta['task_open_time'])
|
|
){
|
|
$metas = \mt\CircuitTask::getListBySeason($nextCircuitMeta['circuit_season']);
|
|
if (count($metas) > 0){
|
|
foreach ($metas as $meta){
|
|
array_push($taskList, array(
|
|
'task_id' => $meta['id'],
|
|
'current' => CircuitTask::getCurrentVal($nextCircuitMeta['circuit_season'],$meta['type']),
|
|
'target' => $meta['target'],
|
|
));
|
|
}
|
|
}
|
|
}
|
|
$this->_rspData(array('list' => $taskList));
|
|
}
|
|
|
|
public function getCurrentStage(){
|
|
$circuitStageMeta = mt\CircuitTime::getCurrentStage();
|
|
if (!$circuitStageMeta){
|
|
$this->_rspErr(1, 'current stage Have not yet started');
|
|
return ;
|
|
}
|
|
$currentCircuitMeta = mt\CircuitTime::getCurrentCircuit();
|
|
$info = array(
|
|
'start_time' => strtotime($circuitStageMeta['start_time']),
|
|
'end_time' => strtotime($circuitStageMeta['end_time']),
|
|
'stage_cec_pool' => $circuitStageMeta['cec_pool'],
|
|
'total_cec_pool' => $currentCircuitMeta['cec_pool']
|
|
);
|
|
$this->_rspData(array('info' => $info));
|
|
}
|
|
|
|
public function getCircuitRanking(){
|
|
$currentCircuitMeta = mt\CircuitTime::getCurrentCircuit();
|
|
if (!$currentCircuitMeta){
|
|
$this->_rspErr(1, 'current stage Have not yet started');
|
|
return ;
|
|
}
|
|
|
|
$redis = $this->_getRedis($this->redis_key_circuit_ranking);
|
|
if (! $redis->exists(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking)){
|
|
$rows = Circuit::getCircuitList($currentCircuitMeta['circuit_season']);
|
|
$sortRows = myself()->arraySort($rows, 'cumulative_score', 'desc');
|
|
$list = $this->_extractRankingInfo($sortRows);
|
|
$redis->set(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking , json_encode($list));
|
|
$redis->pexpire(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking , 10*60*1000);
|
|
}else{
|
|
$listStr = $redis->get(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking);
|
|
$list = emptyReplace(json_decode($listStr, true), array());
|
|
}
|
|
$myRankedInfo = $this->_celMyRankingInfo($list);
|
|
$this->_rspData(array(
|
|
'rank_list' => $list,
|
|
'my_rank' => $myRankedInfo,
|
|
));
|
|
}
|
|
public function getCircuitPhaseRanking(){
|
|
$currentCircuitMeta = mt\CircuitTime::getCurrentCircuit();
|
|
if (!$currentCircuitMeta){
|
|
$this->_rspErr(1, 'current stage Have not yet started');
|
|
return ;
|
|
}
|
|
$currentStageMeta = mt\CircuitTime::getCurrentStage();
|
|
if (!$currentStageMeta){
|
|
$currentStageMeta = mt\CircuitTime::getPrevStage();
|
|
}
|
|
$redis = $this->_getRedis($this->redis_key_circuit_phase_ranking);
|
|
if (! $redis->exists(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_phase_ranking)){
|
|
$rows = Circuit::getCircuitPhaseList($currentStageMeta['circuit_season'],$currentStageMeta['circuit_phase']);
|
|
$sortRows = myself()->arraySort($rows, 'cumulative_score', 'desc');
|
|
$list = $this->_extractRankingInfo($sortRows);
|
|
$redis->set(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_phase_ranking , json_encode($list));
|
|
$redis->pexpire(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_phase_ranking , 10*60*1000);
|
|
}else{
|
|
$listStr = $redis->get(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_phase_ranking);
|
|
$list = emptyReplace(json_decode($listStr, true), array());
|
|
}
|
|
$myRankedInfo = $this->_celMyRankingInfo($list);
|
|
$this->_rspData(array(
|
|
'rank_list' => $list,
|
|
'my_rank' => $myRankedInfo,
|
|
));
|
|
}
|
|
|
|
private function _extractRankingInfo($data){
|
|
$rankingList = array();
|
|
foreach ($data as $k=>$row){
|
|
$userDb = User::find($row['account_id']);
|
|
$heroDb = Hero::findByAccountId($userDb['account_id'],$userDb['hero_id']);
|
|
$skinDb = HeroSkin::find($heroDb['skin_id']);
|
|
$heroId = $heroDb ? $heroDb['hero_id']:0;
|
|
$skinId = $skinDb ? $skinDb['skin_id']:0;
|
|
$ranking = $k+1;
|
|
$rewardWeight = \mt\CircuitReward::getRewardWeight($ranking);
|
|
if ($userDb){
|
|
$info = array(
|
|
'account_id' => $userDb['account_id'],
|
|
'name' => utf8_encode($userDb['name']),
|
|
'head_id' => $userDb['head_id'],
|
|
'head_frame' => $userDb['head_frame'],
|
|
'hero_id' => $heroId,
|
|
'skin_id' => $skinId,
|
|
'ranking' => $ranking,
|
|
'weight' => $rewardWeight,
|
|
'score' => $row['cumulative_score'],
|
|
'score_boost' => $row['score_boost'],
|
|
);
|
|
array_push($rankingList,$info);
|
|
}
|
|
}
|
|
return $rankingList;
|
|
}
|
|
|
|
private function _celMyRankingInfo($list){
|
|
$currentCircuitMeta = mt\CircuitTime::getCurrentCircuit();
|
|
$score = Circuit::getMyScore($currentCircuitMeta['circuit_season']);
|
|
$userDb = User::find(myself()->_getAccountId());
|
|
$codeDb = UserInvitationCode::findMyCode();
|
|
$count = UserInvitationCode::getMyCodeBindCount($codeDb['invitation_code']);
|
|
$boost = min($count * 3 / 100,60 / 100);
|
|
$boostScore = $score * $boost;
|
|
$myRankedInfo = array(
|
|
'ranking' => 0,
|
|
'account_id' => $userDb['account_id'],
|
|
'name' => $userDb['name'],
|
|
'head_id' => $userDb['head_id'],
|
|
'head_frame' => $userDb['head_frame'],
|
|
'score' => $score + $boostScore,
|
|
'score_boost' => $boostScore,
|
|
'cec' => 0,
|
|
);
|
|
|
|
|
|
if (count($list) > 0){
|
|
$totalWeight = 0;
|
|
$rate = \mt\Parameter::getVal('circuit_reward_rate','');
|
|
$count = floor(count($list) * $rate) ;
|
|
foreach ($list as $value){
|
|
if ($value['ranking'] <= $count){
|
|
$totalWeight += $value['weight'];
|
|
}
|
|
}
|
|
$circuitStageMeta = mt\CircuitTime::getCurrentStage();
|
|
$cecPool = $circuitStageMeta ? $circuitStageMeta['cec_pool'] : 0;
|
|
foreach ($list as $value){
|
|
$cec = 0;
|
|
if ($value['ranking'] <= $count){
|
|
$cec = ($value['weight'] / $totalWeight) * $cecPool;
|
|
}
|
|
if ($value['account_id'] == myself()->_getAccountId()){
|
|
$myRankedInfo['ranking'] = $value['ranking'];
|
|
$myRankedInfo['cec'] = $cec;
|
|
}
|
|
}
|
|
}
|
|
return $myRankedInfo;
|
|
}
|
|
}
|