310 lines
13 KiB
PHP
310 lines
13 KiB
PHP
<?php
|
|
namespace services;
|
|
|
|
require_once('models/BattleSettlement.php');
|
|
require_once('models/Hero.php');
|
|
require_once('models/HashRate.php');
|
|
|
|
require_once('mt/MapMode.php');
|
|
|
|
require_once('services/AwardService.php');
|
|
require_once('services/PropertyChgService.php');
|
|
|
|
use mt;
|
|
use services;
|
|
use phpcommon;
|
|
use phpcommon\SqlHelper;
|
|
use models\BattleSettlement;
|
|
use models\Hero;
|
|
use models\HashRate;
|
|
|
|
class RoomBattleDataService extends BaseService {
|
|
const ROOM_MODE_PVP = 0;
|
|
const ROOM_MODE_PVE = 1;
|
|
const ROOM_MODE_MOBA = 2;
|
|
|
|
|
|
public $mapMode = 0;
|
|
public $inputData = array();
|
|
public $teamData = array();
|
|
public $battleSettlementDb = array();
|
|
public $maxKill = 0;
|
|
public $maxAssist = 0;
|
|
public $maxDamage = 0;
|
|
public $maxRecover= 0;
|
|
public $maxLevel= 0;
|
|
public $maxAlive= 0;
|
|
public $scoreAvg= 0;
|
|
public $logData = array();
|
|
|
|
public function calTotalBattleScore(&$totalScore,&$totalNum){
|
|
foreach ($this->teamData['members'] as $member){
|
|
$battleScore = $this->_calBattleScore($member);
|
|
array_push($this->logData,array(
|
|
'account_id' => getXVal($member, 'account_id', 0),
|
|
'kills' => getXVal($member, 'kills', 0),
|
|
'damage' => getXVal($member, 'damage_out', 0),
|
|
'assist' => getXVal($member, 'pvp_assist', 0),
|
|
'score' => $battleScore,
|
|
));
|
|
$totalScore += $battleScore;
|
|
if ($battleScore>0){
|
|
$totalNum += 1;
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function settlementReward(){
|
|
// $paramMeta = mt\Parameter::getVal('performance_score_range',0);
|
|
// $scoreParam = explode("|",$paramMeta);
|
|
// if (count($paramMeta) < 2){
|
|
// error_log('Parameter table error');
|
|
// return;
|
|
// }
|
|
// $room_mode = getXVal($this->inputData,'room_mode', 0);
|
|
$battleData = emptyReplace(json_decode($this->battleSettlementDb['data'], true), array());
|
|
if ($battleData['settlement_status'] == 1){
|
|
error_log('Cannot be resettled');
|
|
return;
|
|
}
|
|
$propertyChgService = new services\PropertyChgService();
|
|
$awardService = new services\AwardService();
|
|
foreach ($battleData['members'] as &$member){
|
|
// if ($this->maxKill == 0){
|
|
// $killSco = $scoreParam[0];
|
|
// }else{
|
|
// $kill = getXVal($member,'pvp_kill', 0);
|
|
// $killSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxKill - 0) * ($kill - 0) + $scoreParam[0];
|
|
// }
|
|
// if ($this->maxAssist == 0){
|
|
// $assistSco = $scoreParam[0];
|
|
// }else{
|
|
// $assist = getXVal($member,'pvp_assist', 0);
|
|
// $assistSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxAssist - 0) * ($assist - 0) + $scoreParam[0];
|
|
// }
|
|
// if ($this->maxDamage == 0){
|
|
// $damageSco = $scoreParam[0];
|
|
// }else{
|
|
// $damage = getXVal($member,'pvp_damage', 0);
|
|
// $damageSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxDamage - 0) * ($damage - 0) + $scoreParam[0];
|
|
// }
|
|
// if ($this->maxRecover == 0){
|
|
// $recoverSco = $scoreParam[0];
|
|
// }else{
|
|
// $recover = getXVal($member,'pvp_recover', 0);
|
|
// $recoverSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxRecover - 0) * ($recover - 0) + $scoreParam[0];
|
|
// }
|
|
// if ($this->maxLevel == 1){
|
|
// $levelSco = $scoreParam[0];
|
|
// }else{
|
|
// $level = getXVal($member,'hero_lv', 0);
|
|
// $levelSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxLevel - 0) * ($level - 0) + $scoreParam[0];
|
|
// }
|
|
// if ($this->maxAlive == 0){
|
|
// $aliveSco = $scoreParam[0];
|
|
// }else{
|
|
// $alive = getXVal($member,'pvp_survia_time', 0) / 1000;
|
|
// $aliveSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxAlive - 0) * ($alive - 0) + $scoreParam[0];
|
|
// }
|
|
// switch ($room_mode){
|
|
// case self::ROOM_MODE_PVP: {
|
|
// $battleScore = round($killSco + $assistSco + $damageSco + $recoverSco + $aliveSco , 2);
|
|
// }
|
|
// break;
|
|
// case self::ROOM_MODE_MOBA :{
|
|
// $battleScore = round($killSco + $assistSco + $damageSco + $recoverSco + $levelSco , 2);
|
|
// }
|
|
// break;
|
|
// default : {
|
|
// $battleScore = 0;
|
|
// }
|
|
// }
|
|
$battleScore = $this->_calBattleScore($member);
|
|
$member['battle_score'] = $battleScore;
|
|
|
|
// //验证非机器人
|
|
$account = getXVal($member,'account_id', 0);
|
|
if(!myself()->_isAndroidAccountId($account)){
|
|
error_log('Real Account:'.$account);
|
|
myself()->switchAccount($account);
|
|
$userDb = myself()->_getOrmUserInfo();
|
|
$heroDb = Hero::find(getXVal($member,'hero_uniid', 0));
|
|
if ($userDb && $heroDb){
|
|
$this->_getBattleRewards($userDb,$heroDb,$battleScore,$member['reward']);
|
|
myself()->_addItems($member['reward'], $awardService,$propertyChgService);
|
|
}
|
|
|
|
}
|
|
}
|
|
$battleData['settlement_status'] = 1;
|
|
BattleSettlement::addTeam(
|
|
$this->battleSettlementDb['battle_uuid'],
|
|
$this->battleSettlementDb['room_uuid'],
|
|
$battleData
|
|
);
|
|
|
|
}
|
|
|
|
public function _getBattleRewards($userDb,$heroDb,$battleScore,&$reward){
|
|
$mapModeMeta = mt\MapMode::findByMapMode($this->mapMode);
|
|
$teamRank = getXVal($this->teamData,'pvp_team_rank', 0);
|
|
if ($mapModeMeta){
|
|
$baseGold = 0;
|
|
$gold = 0;
|
|
$accountLucky = Hero::getAccountLucky($userDb['address']);
|
|
$rewardMeta = mt\BattleReward::find($mapModeMeta['rewardMode'],$accountLucky);
|
|
if (!$rewardMeta){
|
|
return ;
|
|
}
|
|
$goldModeTimes = myself()->_getDailyV(TN_DAILY_GOLD_MODE_BATTLE_TIMES,0);
|
|
if ($this->mapMode == mt\MapMode::GOLD_MODE){
|
|
myself()->_incDailyV(TN_DAILY_GOLD_MODE_BATTLE_TIMES,0,1);
|
|
}
|
|
//金币模式检验
|
|
if ($this->mapMode == mt\MapMode::GOLD_MODE &&
|
|
(!Hero::verifyValid($heroDb) || $goldModeTimes >= $mapModeMeta['rewards_max_time'] )){
|
|
error_log("金币模式:出战英雄没有打金时间或每日打金场次上限");
|
|
}else{
|
|
if (!empty($rewardMeta['goldLoot'])){
|
|
$items = LootService::dropOutItem($rewardMeta['goldLoot']);
|
|
foreach ($items as $item){
|
|
if ($item['item_id'] = V_ITEM_GOLD){
|
|
$gold = $item['item_num'];
|
|
$baseGold = $item['item_num'];
|
|
}else{
|
|
array_push($reward,$item);
|
|
}
|
|
}
|
|
}
|
|
if ($gold > 0){
|
|
// $strArr = explode("|",$rewardMeta['goldParam']);
|
|
$coefficientArr = explode(";",$rewardMeta['goldParam']);
|
|
$coefficient = isset($coefficientArr[$teamRank-1]) ? $coefficientArr[$teamRank-1] : 0;
|
|
$avg = $this->scoreAvg > 0 ? $battleScore / $this->scoreAvg : 0;
|
|
$gold = $gold * $coefficient * $avg;
|
|
|
|
}
|
|
|
|
//财富值加成
|
|
$wealthK = mt\Parameter::getVal('economy_hero_wealth_K',0);
|
|
$wealthE = mt\Parameter::getVal('economy_hero_wealth_E',0);
|
|
$gold = $gold * (1 + $wealthE * (Hero::getHeroWealth($heroDb) / (Hero::getHeroWealth($heroDb) + $wealthK)));
|
|
|
|
//算力加成
|
|
$currentPeriod= \mt\AchievementsCycle::getCurrentPeriod();
|
|
if ($currentPeriod && myself()->_getNowTime() >= strtotime($currentPeriod['income_start_time'])){
|
|
$lastCompute = HashRate::getTotalByAccount($userDb['account_id'], $currentPeriod['id'] - 1);
|
|
$currentCompute = HashRate::getTotalByAccount($userDb['account_id'], $currentPeriod['id']);
|
|
$s = mt\Parameter::getVal('economy_account_compute_s',0);
|
|
$totalCompute = $currentCompute + $s * $lastCompute;
|
|
$computeParam = mt\Parameter::getVal('economy_account_compute_K',0);
|
|
$computeMaxEffect = mt\Parameter::getVal('economy_account_compute_E',0);
|
|
$gold = $gold * ($totalCompute / ($totalCompute + $computeParam) * $computeMaxEffect + 1);
|
|
}
|
|
if ($userDb['account_id'] == "6513_2006_wzXEMuD5cXc68z0K20yTUIPY1U6GcLJo"){
|
|
error_log("BattleRewardsInfo:".json_encode(array(
|
|
'goldLootIndex' => $rewardMeta['goldLoot'],
|
|
'*baseGold*' => $baseGold,
|
|
'teamRank' => $teamRank,
|
|
'*ranking*' => isset($coefficient) ? $coefficient : '空',
|
|
'battleScore' => $battleScore,
|
|
'roomScoreAvg' => $this->scoreAvg,
|
|
'*score*' => isset($avg) ? $avg : '空',
|
|
'wealthK' => $wealthK,
|
|
'wealthE' => $wealthE,
|
|
'wealthValue' => Hero::getHeroWealth($heroDb),
|
|
'*wealth*' => (1 + $wealthE * (Hero::getHeroWealth($heroDb) / (Hero::getHeroWealth($heroDb) + $wealthK))),
|
|
'lastCompute' => isset($lastCompute) ? $lastCompute : '空',
|
|
'currentCompute' => isset($currentCompute) ? $currentCompute : '空',
|
|
'*compute*' =>$currentPeriod ? $totalCompute / ($totalCompute + $computeParam) * $computeMaxEffect + 1 : '算力系统关闭',
|
|
'finalGold' => floor($gold)
|
|
)));
|
|
}
|
|
if ($gold > 0){
|
|
array_push($reward,array(
|
|
"item_id" => V_ITEM_GOLD,
|
|
"item_num" => floor($gold),
|
|
));
|
|
}
|
|
}
|
|
|
|
//宝箱掉落
|
|
$rand = $rewardMeta['chestLootProb'] * 100;
|
|
$rnd = rand(1,100);
|
|
if ($rnd <= $rand){
|
|
$chestItems = LootService::dropOutItem($rewardMeta['chestLoot']);
|
|
foreach ($chestItems as $item){
|
|
array_push($reward,$item);
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
private function _calBattleScore($battleInfo){
|
|
$paramMeta = mt\Parameter::getVal('performance_score_range',0);
|
|
$scoreParam = explode("|",$paramMeta);
|
|
if (count($scoreParam) < 2){
|
|
error_log('Parameter table error');
|
|
return 0;
|
|
}
|
|
$room_mode = getXVal($this->inputData,'room_mode', 0);
|
|
if ($this->maxKill == 0) {
|
|
$killSco = $scoreParam[0];
|
|
} else {
|
|
$kill = getXVal($battleInfo, 'pvp_kill', 0);
|
|
$killSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxKill - 0) * ($kill - 0) + $scoreParam[0];
|
|
}
|
|
if ($this->maxAssist == 0) {
|
|
$assistSco = $scoreParam[0];
|
|
} else {
|
|
$assist = getXVal($battleInfo, 'pvp_assist', 0);
|
|
$assistSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxAssist - 0) * ($assist - 0) + $scoreParam[0];
|
|
}
|
|
if ($this->maxDamage == 0) {
|
|
$damageSco = $scoreParam[0];
|
|
} else {
|
|
$damage = getXVal($battleInfo, 'pvp_damage', 0);
|
|
$damageSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxDamage - 0) * ($damage - 0) + $scoreParam[0];
|
|
}
|
|
if ($this->maxRecover == 0) {
|
|
$recoverSco = $scoreParam[0];
|
|
} else {
|
|
$recover = getXVal($battleInfo, 'pvp_recover', 0);
|
|
$recoverSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxRecover - 0) * ($recover - 0) + $scoreParam[0];
|
|
}
|
|
if ($this->maxLevel == 1) {
|
|
$levelSco = $scoreParam[0];
|
|
} else {
|
|
$level = getXVal($battleInfo, 'hero_lv', 0);
|
|
$levelSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxLevel - 0) * ($level - 0) + $scoreParam[0];
|
|
}
|
|
if ($this->maxAlive == 0) {
|
|
$aliveSco = $scoreParam[0];
|
|
} else {
|
|
$alive = getXVal($battleInfo, 'pvp_survia_time', 0) / 1000;
|
|
$aliveSco = ($scoreParam[1] - $scoreParam[0]) / ($this->maxAlive - 0) * ($alive - 0) + $scoreParam[0];
|
|
}
|
|
switch ($room_mode){
|
|
case self::ROOM_MODE_PVP: {
|
|
$battleScore = round($killSco + $assistSco + $damageSco + $recoverSco + $aliveSco , 2);
|
|
}
|
|
break;
|
|
case self::ROOM_MODE_MOBA :{
|
|
$battleScore = round($killSco + $assistSco + $damageSco + $recoverSco + $levelSco , 2);
|
|
}
|
|
break;
|
|
default : {
|
|
$battleScore = 0;
|
|
}
|
|
}
|
|
return $battleScore;
|
|
}
|
|
|
|
}
|