diff --git a/doc/Circuit.py b/doc/Circuit.py index 6d86b0a7..520c4c01 100644 --- a/doc/Circuit.py +++ b/doc/Circuit.py @@ -84,6 +84,7 @@ class rankingInfo(object): ['skin_id', 0, '皮肤ItemId'], ['ranking', 0, '排名'], ['score', 0, '积分'], + ['score_boost', 0, '加成的积分'], ['cec', 0, 'cec(个人榜信息才有)'], ] diff --git a/sql/gamedb2006_migrate_240924_01.sql b/sql/archived/gamedb2006_migrate_240924_01.sql similarity index 100% rename from sql/gamedb2006_migrate_240924_01.sql rename to sql/archived/gamedb2006_migrate_240924_01.sql diff --git a/sql/gamedb2006_migrate_241001_01.sql b/sql/archived/gamedb2006_migrate_241001_01.sql similarity index 100% rename from sql/gamedb2006_migrate_241001_01.sql rename to sql/archived/gamedb2006_migrate_241001_01.sql diff --git a/webapp/controller/BaseController.class.php b/webapp/controller/BaseController.class.php index 4fcae8a9..97811605 100644 --- a/webapp/controller/BaseController.class.php +++ b/webapp/controller/BaseController.class.php @@ -479,4 +479,17 @@ class BaseController { } return $finalItems; } + + function arraySort($arr, $keys, $type = 'asc') { + $keys_value = $new_array = array(); + foreach ($arr as $k => $v){ + $keys_value[$k] = $v[$keys]; + } + $type == 'asc' ? asort($keys_value) : arsort($keys_value); + reset($keys_value); + foreach ($keys_value as $k => $v) { + $new_array[$k] = $arr[$k]; + } + return $new_array; + } } diff --git a/webapp/controller/CircuitController.class.php b/webapp/controller/CircuitController.class.php index 66915ca2..41d2e9d3 100644 --- a/webapp/controller/CircuitController.class.php +++ b/webapp/controller/CircuitController.class.php @@ -9,6 +9,7 @@ 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; @@ -16,6 +17,7 @@ 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'; @@ -81,8 +83,9 @@ class CircuitController extends BaseAuthedController { $redis = $this->_getRedis($this->redis_key_circuit_ranking); if (! $redis->exists(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_ranking)){ - $rows = Circuit::getRankingList($currentCircuitMeta['circuit_season']); - $list = $this->_extractRankingInfo($rows); + $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{ @@ -107,8 +110,9 @@ class CircuitController extends BaseAuthedController { } $redis = $this->_getRedis($this->redis_key_circuit_phase_ranking); if (! $redis->exists(CIRCUIT_RANKING_KEY.$this->redis_key_circuit_phase_ranking)){ - $rows = Circuit::getPhaseRankingList($currentStageMeta['circuit_season'],$currentStageMeta['circuit_phase']); - $list = $this->_extractRankingInfo($rows); + $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{ @@ -143,6 +147,7 @@ class CircuitController extends BaseAuthedController { 'ranking' => $ranking, 'weight' => $rewardWeight, 'score' => $row['cumulative_score'], + 'score_boost' => $row['score_boost'], ); array_push($rankingList,$info); } @@ -152,14 +157,20 @@ class CircuitController extends BaseAuthedController { 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' => Circuit::getMyScore($currentCircuitMeta['circuit_season']), + 'score' => $score + $boostScore, + 'score_boost' => $boostScore, 'cec' => 0, ); diff --git a/webapp/controller/OutAppCircuitController.class.php b/webapp/controller/OutAppCircuitController.class.php index 9037eba0..92015ae5 100644 --- a/webapp/controller/OutAppCircuitController.class.php +++ b/webapp/controller/OutAppCircuitController.class.php @@ -57,12 +57,13 @@ class OutAppCircuitController extends BaseController { $prevStageMeta && $prevStageMeta['is_reward'] > 0 && !CircuitReward::_verifySettlement($prevStageMeta['circuit_season'],$prevStageMeta['circuit_phase'])){ - $rows = Circuit::getRankingList($prevStageMeta['circuit_season']); - if (count($rows) > 0){ + $rows = Circuit::getCircuitList($prevStageMeta['circuit_season']); + $sortRows = myself()->arraySort($rows, 'cumulative_score', 'desc'); + if (count($sortRows) > 0){ $totalWeight = 0; $rate = \mt\Parameter::getVal('circuit_reward_rate',''); - $count = floor(count($rows) * $rate) ; - foreach ($rows as $k=>$value){ + $count = floor(count($sortRows) * $rate) ; + foreach ($sortRows as $k=>$value){ $ranking = $k+1; $rewardWeight = \mt\CircuitReward::getRewardWeight($ranking); if ($ranking <= $count){ @@ -70,7 +71,7 @@ class OutAppCircuitController extends BaseController { } } $cecPool = $prevStageMeta['cec_pool']; - foreach ($rows as $k=>$value){ + foreach ($sortRows as $k=>$value){ $cec = 0; $ranking = $k+1; $rewardWeight = \mt\CircuitReward::getRewardWeight($ranking); diff --git a/webapp/models/Circuit.php b/webapp/models/Circuit.php index 49224eae..4a71645a 100644 --- a/webapp/models/Circuit.php +++ b/webapp/models/Circuit.php @@ -91,6 +91,25 @@ class Circuit extends BaseModel return $rows; } + public static function getCircuitList($season){ + $rows = SqlHelper::ormSelect( + myself()->_getSelfMysql(), + 't_circuit_battle', + array( + 'season' => $season + ) + ); + foreach ($rows as &$row){ + $codeDb = UserInvitationCode::findCodeByAccount($row['account_id']); + $count = UserInvitationCode::getMyCodeBindCount($codeDb['invitation_code']); + $boost = min($count * 3 / 100,60 / 100); + $boostScore = $row['cumulative_score'] * $boost; + $row['score_boost'] = $boostScore; + $row['cumulative_score'] += $boostScore; + } + return $rows; + } + public static function getPhaseRankingList($season,$phase){ $sql = "select * from t_circuit_battle_phase where season=:season and phase=:phase order by cumulative_score desc,modifytime asc"; $whereKv = array( @@ -104,6 +123,26 @@ class Circuit extends BaseModel return $rows; } + public static function getCircuitPhaseList($season,$phase){ + $rows = SqlHelper::ormSelect( + myself()->_getSelfMysql(), + 't_circuit_battle_phase', + array( + 'season' => $season, + 'phase' => $phase, + ) + ); + foreach ($rows as &$row){ + $codeDb = UserInvitationCode::findCodeByAccount($row['account_id']); + $count = UserInvitationCode::getMyCodeBindCount($codeDb['invitation_code']); + $boost = min($count * 3 / 100,60 / 100); + $boostScore = $row['cumulative_score'] * $boost; + $row['score_boost'] = $boostScore; + $row['cumulative_score'] += $boostScore; + } + return $rows; + } + public static function getCurrentMyScore(){ $circuitMeta = myself()->_callMtStatic('CircuitTime', 'getCurrentCircuit'); diff --git a/webapp/models/UserInvitationCode.php b/webapp/models/UserInvitationCode.php index cbd396f6..b1bb5ffb 100644 --- a/webapp/models/UserInvitationCode.php +++ b/webapp/models/UserInvitationCode.php @@ -18,6 +18,17 @@ class UserInvitationCode extends BaseModel return $row; } + public static function findCodeByAccount($account){ + $row = SqlHelper::ormSelectOne( + myself()->_getSelfMysql(), + 't_user_invitation_code', + array( + 'account_id' => $account, + ) + ); + return $row; + } + public static function generateCode(){ $user = myself()->_getOrmUserInfo(); SqlHelper::upsert( diff --git a/webapp/services/RoomBattleDataService.php b/webapp/services/RoomBattleDataService.php index 39c7ffad..4c28554f 100644 --- a/webapp/services/RoomBattleDataService.php +++ b/webapp/services/RoomBattleDataService.php @@ -141,8 +141,8 @@ class RoomBattleDataService extends BaseService { $circuitScore = $battleScore * $multConstant + $shiftConstant; $myScore = Circuit::getMyScore($circuitMeta['circuit_season']); $myPhaseScore = Circuit::getMyPhaseScore($circuitStageMeta['circuit_season'],$circuitStageMeta['circuit_phase']); - $finalScore = max($minScore, $myScore+$circuitScore); - $finalPhaseScore = max($minScore, $myPhaseScore+$circuitScore); + $finalScore = floor(max($minScore, $myScore+$circuitScore)) ; + $finalPhaseScore = floor(max($minScore, $myPhaseScore+$circuitScore)); Circuit::updateScore($circuitMeta['circuit_season'],$finalScore); Circuit::updatePhaseScore($circuitStageMeta['circuit_season'],$circuitStageMeta['circuit_phase'],$finalPhaseScore); $member['new_circuit_score'] = $finalScore;