game2006api/webapp/controller/SeasonController.class.php
2023-05-17 14:07:41 +08:00

382 lines
15 KiB
PHP

<?php
require_once('mt/Parameter.php');
require_once('mt/Rank.php');
require_once('mt/Season.php');
require_once('mt/Drop.php');
require_once('mt/RankSeason.php');
require_once('models/User.php');
require_once('models/Season.php');
require_once('models/Mission.php');
require_once('services/AwardService.php');
require_once('services/PropertyChgService.php');
require_once('services/SeasonService.php');
require_once('services/MissionService.php');
use phpcommon\SqlHelper;
use models\User;
use models\Season;
use models\Mission;
class SeasonController extends BaseAuthedController {
private $propertyChgService = null;
private $awardService = null;
private $userInfo = null;
private $currRankSeasonMeta = null;
private $seasonDb = null;
private $missionService = null;
private $rankingUnid = 'account';
private $TopXunid = 'echelon_TopX_';
private $starshine = 2800;
public function _handlePre()
{
parent::_handlePre();
$this->currRankSeasonMeta = mt\RankSeason::getCurrentSeason();
if (!$this->currRankSeasonMeta) {
$this->_rspErr(10, 'server internal error');
die();
}
$this->propertyChgService = new services\PropertyChgService();
$this->awardService = new services\AwardService();
$this->userInfo = $this->_safeGetOrmUserInfo();
$this->seasonDb = Season::find($this->currRankSeasonMeta['id']);
if (!$this->seasonDb) {
Season::add($this->currRankSeasonMeta['id']);
$this->seasonDb = Season::find($this->currRankSeasonMeta['id']);
}
if (!$this->seasonDb) {
$this->_rspErr(10, 'server internal error');
die();
}
$this->missionService = new services\MissionService();
$this->missionService->init($this->userInfo, $this->seasonDb);
}
public function info()
{
$rankMeta = mt\Rank::get($this->userInfo['rank']);
$this->_rspData(array(
'info' => array(
'season_id' => $this->currSeasonMeta['id'],
'rank' => $this->userInfo['rank'],
'score' => $this->userInfo['score'],
'max_score' => $rankMeta ? $rankMeta['max_score'] : 0,
'noshow_score_bar' => $rankMeta ? $rankMeta['noshow_score_bar'] : 1,
'mission' => $this->getMissionInfo()
)
));
}
public function infoNew()
{
// $data = User::getListByRank(2);
// print_r($data);die;
$rankMeta = mt\Rank::getRankById($this->userInfo['rank']);
$nextRankMeta = mt\Rank::getNextRankById($this->userInfo['rank']);
if (!$nextRankMeta){
$nextRankMeta = mt\Rank::getMaxRank();
}
$info = array(
'season_name' => $this->currRankSeasonMeta['name'],
'rank' => $this->userInfo['rank'],
'rank_name' => $rankMeta['rank_name'],
'score' => $this->userInfo['score'],
'next_score' => $nextRankMeta['rank_score'],
'season_end_time' => strtotime($this->currRankSeasonMeta['end_time']),
'season_reward' => Season::seasonReward($rankMeta)
);
$r = $this->_getRedis($this->rankingUnid);
$list = array();
if ($r->exists(RANKING_KEY.$this->rankingUnid)){
$users = User::getListByRank($this->userInfo['rank']);
foreach ($users as $user){
$user['ranking'] = $r->hget(RANKING_KEY.$this->rankingUnid,$user['account_id']);
$userDto = $this->_getRewardByRanking($user);
array_push($list,$userDto);
}
}
$info['season_rank'] = $list;
$this->_rspData(['info'=>$info]);
}
public function getRankingInfo(){
$rank_param = getReqVal('rank',0);
if (!$rank_param){
$this->_rspErr(1, 'params rank error');
die();
}
$r = $this->_getRedis($this->rankingUnid);
$list = array();
if ($r->exists(RANKING_KEY.$this->rankingUnid)){
$users = User::getListByRank($rank_param);
foreach ($users as $user){
$user['ranking'] = $r->hget(RANKING_KEY.$this->rankingUnid,$user['account_id']);
$userDto = $this->_getRewardByRanking($user);
array_push($list,$userDto);
}
}
$this->_rspData(['info'=>$list]);
}
public function getDataInfo(){
$seasonDb = Season::find($this->currRankSeasonMeta['id']);
$currRankSeasonHistory = array();
if ($seasonDb){
$battleData = json_decode($seasonDb['battle_data'], true);
$seasonBattleData = isset($battleData) ? getXVal($battleData, 'season_data', array()) : array();
$gameTimes = getXVal($seasonBattleData, 'total_battle_times', 0);
$winTimes = getXVal($seasonBattleData, 'total_win_times', 0);
$topTenTimes = getXVal($seasonBattleData, 'total_top_ten_times', 0);
$totalKills = getXVal($seasonBattleData, 'total_kills_times', 0);
$temp = $gameTimes-$winTimes ? $gameTimes-$winTimes:0;
if (! $temp){
$kill_killed = 0;
}else{
$kill_killed = round($totalKills/$temp,2);
}
$currRankSeasonHistory= array(
'season_id' => $seasonDb['season_id'],
// 'total_kills' => $totalKills,
'game_times' => $gameTimes,
'win_times' => $winTimes,
'top_ten_times' => $topTenTimes,
'kill_killed' => $kill_killed,
);
}
if (!$currRankSeasonHistory){
$currRankSeasonHistory = array(
'season_id' => $this->currRankSeasonMeta['id'],
// 'total_kills' => $totalKills,
'game_times' => 0,
'win_times' => 0,
'top_ten_times' => 0,
'kill_killed' => 0,
);
}
$this->_rspData(['info'=>$currRankSeasonHistory]);
}
public function getHeroInfo(){
$seasonDb = Season::find($this->currRankSeasonMeta['id']);
$currHeroSeasonHistory = array();
if ($seasonDb) {
$battleData = json_decode($seasonDb['battle_data'], true);
$seasonBattleData = isset($battleData) ? getXVal($battleData, 'season_data', array()) : array();
$seasonHeroInfo = isset($seasonBattleData) ? getXVal($seasonBattleData, 'hero_info', array()) : array();
$heroSort = array();
foreach ($seasonHeroInfo as $key=>$heroInfo){
$heroSort[$key]['use_times'] = isset($heroInfo['use_times']) ? $heroInfo['use_times'] : 0;
$heroSort[$key]['weapon'] = isset($heroInfo['weapon']) ? $heroInfo['weapon'] : array();
$heroSort[$key]['win_times'] = isset($heroInfo['win_times']) ? $heroInfo['win_times'] : 0;
$heroSort[$key]['top_ten_times'] = isset($heroInfo['top_ten_times']) ? $heroInfo['top_ten_times'] : 0;
$heroSort[$key]['hero'] = $key;
arsort($heroSort[$key]['weapon']);
$heroSort[$key]['weapon'] = array_keys($heroSort[$key]['weapon']);
$heroSort[$key]['weapon'] = implode('|',array_slice($heroSort[$key]['weapon'],0,2));
}
arsort($heroSort);
$heroSort = array_slice($heroSort,0,3);
foreach ($heroSort as &$value){
$value['season_id'] = $seasonDb['season_id'];
$value['win_rate'] = round($value['win_times']/$value['use_times'],2);
$value['top_ten_rate'] = round($value['top_ten_times']/$value['use_times'],2);
}
$currHeroSeasonHistory = $heroSort;
}
// if (!$currHeroSeasonHistory){
// array_push($currHeroSeasonHistory,
// array(
// 'season_id' => $this->currRankSeasonMeta['id'],
// 'use_times' => 0,
// 'weapon' => 0,
// 'win_times' => 0,
// 'top_ten_times' => 0,
// 'hero_id' => 0,
// 'win_rate' => 0,
// 'top_ten_rate' => 0,
// ));
// }
$this->_rspData(['info'=>$currHeroSeasonHistory]);
}
public function getMissionReward()
{
$mission = $this->getMissionInfo();
if (!$mission || $mission['state'] != Mission::RECEIVEABLE_STATE) {
$this->_rspErr(1, 'Can not receive');
return;
}
$missionMeta = mt\Task::get($this->currSeasonMeta['task_id']);
$missionId = $this->currSeasonMeta['task_id'];
if (!$missionMeta) {
$this->_rspErr(10, 'server internal error');
return;
}
$dropMeta = mt\Drop::get($missionMeta['reward']);
if (!$dropMeta) {
$this->_rspErr(10, 'server internal error');
return;
}
$this->_scatterDrop('mission:' . $missionId, $dropMeta, $this->awardService, $this->propertyChgService);
Mission::add($missionId);
$missionDb = Mission::find($missionId);
$missionDto = $this->missionService->getMissionDto(
$this->userInfo,
$this->seasonDb,
$missionDb,
$missionMeta);
$this->_rspData(array(
'award' => $this->awardService->toDto(),
'property_chg' => $this->propertyChgService->toDto(),
));
}
private function getMissionInfo()
{
$info = array(
'state' => Mission::NOT_FINISHED_STATE,
'current' => 0,
'target' => 0,
'target_rank' => 0
);
$missionMeta = mt\Task::get($this->currSeasonMeta['task_id']);
if ($missionMeta) {
$info['target_rank'] = $missionMeta['param1'];
$info['target'] = $missionMeta['target'];
$missionDb = Mission::find($missionMeta['id']);
$missionDto = $this->missionService->getMissionDto(
$this->userInfo, $this->seasonDb, $missionDb, $missionMeta);
if ($missionDto) {
$info['state'] = $missionDto['state'];
$info['current'] = $missionDto['current'];
$info['target'] = $missionDto['target'];
}
}
return $info;
}
private function _getRewardByRanking($user){
if (!$user){
return ;
}
$rewardParamMeta = \mt\Parameter::getByName('rank_ring_reward');
$rewardParamMetaValue = $rewardParamMeta ? $rewardParamMeta['param_value'] : '';
$rewardList = explode('|',$rewardParamMetaValue);
$userDto = User::getUserByRankMess($user);
$userDto['ranking'] = $user['ranking'];
if ($userDto['score'] >= $this->starshine){
$userDto['echelonTopX'] = \services\FormulaService::echelonTopX($user['ranking']);
$userDto['standardTopX'] = \services\FormulaService::standardTopX($user['ranking'],$userDto['echelonTopX']);
switch ($user['ranking']){
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;
}
}else{
$userDto['ring_item_id'] = 0;
}
//当月排位赛最大分配金额
$maxSum = \services\FormulaService::calcCECMaxSum();
//排位赛预计分配额
$expected_CEC_Sum = 0;
$kingCount = User::getKingCount($this->starshine);
for ($i=1;$i<=$kingCount;$i++){
$echelonTopX = \services\FormulaService::echelonTopX($i);
$expected_CEC_Sum += \services\FormulaService::calcCECTopXSum($i,$echelonTopX,$kingCount);
}
//排位赛金额%
$rankAmountPre = min($maxSum/($expected_CEC_Sum+1),1); //MIN(当月排位赛最大分配额/(排位赛预计分配额+1),1)
if ($userDto['score'] >= $this->starshine &&
$userDto['ranking'] <= 10000 ){
$userDto['rewardCEC'] = $userDto['standardTopX']*$rankAmountPre;
}else{
$userDto['rewardCEC'] = 0;
}
return $userDto;
}
private function checkRankingList($users){
$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'] = \services\FormulaService::echelonTopX($userDto['rank_sort']);
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;
}
}else{
$userDto['ring_item_id'] = 0;
}
array_push($rankList,$userDto);
}
//当月排位赛最大分配金额
$maxSum = \services\FormulaService::calcCECMaxSum();
//排位赛参与分配人数
// $PeopleCapita = $this->calcPeopleCapita($KingCount);
//排位赛人数%
// $PeopleCapitaPer = $this->calcPeopleCapitaPer($KingCount);
//排位赛预计分配额
$expected_CEC_Sum = 0;
foreach ($rankList as $k=>$value){
if ($value['score'] >= $this->starshine){
$rankList[$k]['standardTopX'] = \services\FormulaService::standardTopX($value['rank_sort'],$value['echelonTopX']);
$expected_CEC_Sum += \services\FormulaService::calcCECTopXSum($value['rank_sort'],$value['echelonTopX'],$KingCount);
}
}
//排位赛金额%
$rankAmountPre = min($maxSum/($expected_CEC_Sum+1),1); //MIN(当月排位赛最大分配额/(排位赛预计分配额+1),1)
foreach ($rankList as $k=>$value){
if ($value['score'] >= $this->starshine &&
$value['rank_sort'] <= 10000 ){
$rankList[$k]['rewardCEC'] = $value['standardTopX']*$rankAmountPre;
}else{
$rankList[$k]['rewardCEC'] = 0;
}
}
}
return $rankList;
}
private function readRankingList($r,$rankUnid)
{
$list = $r->get(RANKING_KEY.$rankUnid);
if (empty($list)) {
return array();
}
$list = json_decode($list, true);
return $list;
}
private function saveRankingList($r,$rankUnid ,$list)
{
$r->set(RANKING_KEY.$rankUnid , json_encode($list));
$r->pexpire(RANKING_KEY.$rankUnid , 3*60*60*1000);
}
}