diff --git a/doc/Battle.py b/doc/Battle.py index 6722b5e8..0d61cdd1 100644 --- a/doc/Battle.py +++ b/doc/Battle.py @@ -72,9 +72,9 @@ class Battle(object): ] }, { - 'desc': '获取战斗数据(客户端不用处理)getBattleData', + 'desc': '获取战斗数据(客户端不用处理)getBattleDataNew', 'group': 'Battle', - 'url': 'webapp/index.php?c=Battle&a=getBattleData', + 'url': 'webapp/index.php?c=Battle&a=getBattleDataNew', 'params': [ _common.ReqHead(), diff --git a/doc/Hero.py b/doc/Hero.py index 26dfe214..864f436c 100644 --- a/doc/Hero.py +++ b/doc/Hero.py @@ -71,7 +71,6 @@ class Hero(object): _common.ReqHead(), ['hero_uniid', 0, '英雄唯一id'], ['slot_id', 0, '槽id(0-1)'], - ['cost_item_id', 0, '支付方式'], ], 'response': [ _common.RspHead(), diff --git a/webapp/controller/BattleController.class.php b/webapp/controller/BattleController.class.php index 5d63067f..e7b306aa 100644 --- a/webapp/controller/BattleController.class.php +++ b/webapp/controller/BattleController.class.php @@ -2,11 +2,13 @@ require_once('models/Hero.php'); require_once('models/Gun.php'); +require_once('models/Chip.php'); require_once('services/BattleDataService.php'); use phpcommon\SqlHelper; use models\Hero; use models\Gun; +use models\Chip; class BattleController extends BaseAuthedController { @@ -97,4 +99,59 @@ class BattleController extends BaseAuthedController { myself()->_rspData($data); } + public function getBattleDataNew() + { + $members = json_decode(getReqVal('members', ''), true); + $data = array( + 'members' => array() + ); + foreach ($members as $member) { + $info = array( + 'account_id' => $member['account_id'], + 'session_id' => $member['session_id'], + 'hero_uniid' => $member['hero_uniid'], + 'weapon_uniid1' => $member['weapon_uniid1'], + 'weapon_uniid2' => $member['weapon_uniid2'], + 'battle_uuid' => $member['battle_uuid'], + 'hero_dto' => '', + 'weapon_dto1' => '', + 'weapon_dto2' => '', + + 'is_valid_battle' => 0, + 'payload' => json_encode($member['cmjoin']), + 'errcode' => 0, + 'errmsg' => '', + ); + if (!phpcommon\isValidSessionId($member['account_id'], $member['session_id'])) { + $info['errcode'] = 50; + $info['errmsg'] = 'invalid session_id'; + }else{ + { + $heroDb = Hero::findByAccountId($member['account_id'], + $member['hero_uniid']); + if ($heroDb) { + $info['is_valid_battle'] = 1; + $info['hero_dto'] = Hero::toDto($heroDb); + } else { + $info['errcode'] = 51; + $info['errmsg'] = 'paramater error'; + } + } + { + for ($i = 1; $i <= 2; ++$i) { + $gunDb = Gun::findByAccountId($member['account_id'], + $member['weapon_uniid' . $i]); + if ($gunDb) { + $info['weapon_dto' . $i] = Gun::toDto($gunDb); + } + } + } + } + array_push($data['members'], $info); + + } +// $attr = Hero::getChipAttr($info['hero_dto']['chip_ids']); + myself()->_rspData($data); + } + } diff --git a/webapp/controller/ChipController.class.php b/webapp/controller/ChipController.class.php index f03eba56..06131cfd 100644 --- a/webapp/controller/ChipController.class.php +++ b/webapp/controller/ChipController.class.php @@ -6,6 +6,7 @@ require_once('models/Gun.php'); require_once('models/User.php'); require_once('mt/ChipAttr.php'); require_once('services/FormulaService.php'); +require_once('phpcommon/tglog.php'); use models\Chip; @@ -14,6 +15,7 @@ use models\Gun; use models\User; use services\NftService; use phpcommon\SqlHelper; +use phpcommon\TGLog; class ChipController extends BaseAuthedController { @@ -103,17 +105,13 @@ class ChipController extends BaseAuthedController if (! $this->_doInlayHero($unique_id,$token_id)){ return; } - $hero = $this->_inLayNewAttr($unique_id); - $chip_core = $this->_chipCore($unique_id,$type); - $hero['chip_core'] = $chip_core; + $hero = Hero::toDto(Hero::find($unique_id)); $this->_rspData(['data'=>$hero]); }else{ if (! $this->_doInlayGun($unique_id,$token_id)){ return; } - $gun = $this->_inLayNewAttrGun($unique_id); - $chip_core = $this->_chipCore($unique_id,$type); - $gun['chip_core'] = $chip_core; + $gun = Gun::toDto(Gun::find($unique_id)); $this->_rspData(['data'=>$gun]); } @@ -131,17 +129,13 @@ class ChipController extends BaseAuthedController if (!$this->_doDemount($unique_id,$token_id)){ return; } - $hero = $this->_inLayNewAttr($unique_id); - $chip_core = $this->_chipCore($unique_id,$type); - $hero['chip_core'] = $chip_core; + $hero = Hero::toDto(Hero::find($unique_id)); $this->_rspData(['data'=>$hero]); }else{ if (! $this->_doDemountGun($unique_id,$token_id)){ return; } - $gun = $this->_inLayNewAttrGun($unique_id); - $chip_core = $this->_chipCore($unique_id,$type); - $gun['chip_core'] = $chip_core; + $gun = Gun::toDto(Gun::find($unique_id)); $this->_rspData(['data'=>$gun]); } @@ -163,9 +157,7 @@ class ChipController extends BaseAuthedController if (! $this->_doInlayHero($unique_id,$token_id_new)){ return; } - $hero = $this->_inLayNewAttr($unique_id); - $chip_core = $this->_chipCore($unique_id,$type); - $hero['chip_core'] = $chip_core; + $hero = Hero::toDto(Hero::find($unique_id)); $this->_rspData(['data'=>$hero]); }else{ if (! $this->_doDemountGun($unique_id,$token_id_old)){ @@ -174,9 +166,7 @@ class ChipController extends BaseAuthedController if (! $this->_doInlayGun($unique_id,$token_id_new)){ return; } - $gun = $this->_inLayNewAttrGun($unique_id); - $chip_core = $this->_chipCore($unique_id,$type); - $gun['chip_core'] = $chip_core; + $gun = Gun::toDto(Gun::find($unique_id)); $this->_rspData(['data'=>$gun]); } @@ -232,17 +222,13 @@ class ChipController extends BaseAuthedController foreach ($res as $val){ $this->_doInlayHero($unique_id,$val['token_id']); } - $hero_new = $this->_inLayNewAttr($unique_id); - $chip_core = $this->_chipCore($unique_id,$type); - $hero_new['chip_core'] = $chip_core; + $hero_new = Hero::toDto(Hero::find($unique_id)); $this->_rspData(['data'=>$hero_new]); }else{ foreach ($res as $val){ $this->_doInlayGun($unique_id,$val['token_id']); } - $gun_new = $this->_inLayNewAttrGun($unique_id); - $chip_core = $this->_chipCore($unique_id,$type); - $gun_new['chip_core'] = $chip_core; + $gun_new = Gun::toDto(Gun::find($unique_id)); $this->_rspData(['data'=>$gun_new]); } } @@ -479,6 +465,7 @@ class ChipController extends BaseAuthedController // 'token_type' =>3, // ) // ); +// print_r($nft_active);die; // foreach ($nft_active as $item){ // $chip = Chip::getChipByTokenId($item['token_id']); // if ($chip['chip_type'] == 1){ @@ -490,6 +477,8 @@ class ChipController extends BaseAuthedController // Chip::update($chip['token_id'],['strength'=>$tili]); // } // $this->_rspOk(); + + } diff --git a/webapp/controller/GunController.class.php b/webapp/controller/GunController.class.php index d6794596..ed7badf6 100644 --- a/webapp/controller/GunController.class.php +++ b/webapp/controller/GunController.class.php @@ -54,44 +54,6 @@ class GunController extends BaseAuthedController { return; } $gun = Gun::toDto($gunDb); - $chipAttr = []; - $chipIdsArr = explode('|',$gun['chip_ids']); - foreach ($chipIdsArr as $val){ - $chip = Chip::toDto(Chip::getChipByIdx($val)); - foreach ($chip['rand_attr'] as $v){ - array_push($chipAttr,$v); - } - } - $item = []; - foreach ($chipAttr as $k=>$v){ - if (!isset($item[$v['attr_id']])){ - $item[$v['attr_id']] = $v; - }else{ - $item[$v['attr_id']]['val']+= $v['val']; - } - } - - $gun['attr_chip'] = $item;//芯片属性 - $chipCore = []; - if (count($chipIdsArr) == 4){ - $min = 15; - foreach ($chipIdsArr as $val){ - $chip = Chip::getChipByIdx($val); - if ($chip['chip_grade']<$min){ - $min = $chip['chip_grade']; - } - } - $chipCoreList = getMetaTable('chipCore@chipCore.php'); - foreach ($chipCoreList as $val){ - if ($val['chip_core_type']==2 && $val['chip_core_lv']<=$min){ - array_push($chipCore,$val); - } - } - $gun['chip_core'] = $chipCore; - }else{ - $gun['chip_core'] = []; - } - $this->_rspData(array( 'data' => $gun )); diff --git a/webapp/controller/HeroController.class.php b/webapp/controller/HeroController.class.php index a6ed9b99..18b1e674 100644 --- a/webapp/controller/HeroController.class.php +++ b/webapp/controller/HeroController.class.php @@ -53,44 +53,8 @@ class HeroController extends BaseAuthedController { $this->_rspErr(1, "You don't have the hero yet"); return; } - $chipAttr = []; - $hero = Hero::toDto($heroDb); - $chipIdsArr = explode('|',$hero['chip_ids']); - foreach ($chipIdsArr as $val){ - $chip = Chip::toDto(Chip::getChipByIdx($val)); - foreach ($chip['rand_attr'] as $v){ - array_push($chipAttr,$v); - } - } - $item = []; - foreach ($chipAttr as $k=>$v){ - if (!isset($item[$v['attr_id']])){ - $item[$v['attr_id']] = $v; - }else{ - $item[$v['attr_id']]['val']+= $v['val']; - } - } - $hero['attr_chip'] = $item;//芯片属性 - $chipCore = []; - if (count($chipIdsArr) == 4){ - $min = 15; - foreach ($chipIdsArr as $val){ - $chip = Chip::getChipByIdx($val); - if ($chip['chip_grade']<$min){ - $min = $chip['chip_grade']; - } - } - $chipCoreList = getMetaTable('chipCore@chipCore.php'); - foreach ($chipCoreList as $val){ - if ($val['chip_core_type']==1 && $val['chip_core_lv']<=$min){ - array_push($chipCore,$val); - } - } - $hero['chip_core'] = $chipCore; - }else{ - $hero['chip_core'] = []; - } + $hero = Hero::toDto($heroDb); $this->_rspData(array( 'data' => $hero )); @@ -274,6 +238,7 @@ class HeroController extends BaseAuthedController { $this->_rspErr(1, 'Countdown is not over'); return; } + $oldHero = $heroDto; $newHero = $heroDto; switch ($type) { @@ -289,6 +254,7 @@ class HeroController extends BaseAuthedController { break; } } + if (!$found) { $this->_rspErr(1, 'hero does not exist2'); return; @@ -298,20 +264,36 @@ class HeroController extends BaseAuthedController { $propertyChgService->addHeroChg(); $propertyChgService->addBagChg(); $propertyChgService->addUserChg(); - $currLevelMeta = mt\HeroLevel::getByLevel($heroDb['hero_lv']); - if ($currLevelMeta) { - $nextLevelMeta = mt\HeroLevel::getByLevel($heroDb['hero_lv'] + 1); - $attrs = $heroDto['attr']; - mt\HeroLevelAttr::addRandAttr($heroDb['hero_lv'] + 1, $attrs); +// $currLevelMeta = mt\HeroLevelAttr::getByLevel($heroDb['hero_lv']); +// if ($currLevelMeta) { + $nextLevelMeta = null; + $nextLevelMeta = mt\HeroLevelAttr::getByLevel($heroDb['hero_lv'] + 1); + $attrs = mt\HeroLevelAttr::addRandAttrNew($heroDb); if ($nextLevelMeta) { - Hero::update($heroUniId, - array( - 'hero_lv' => $heroDb['hero_lv'] + 1, - 'rand_attr' => json_encode($attrs), - 'lock_type' => 0, - 'unlock_time' => 0, - ) + + $where = array( + 'hero_lv' => $heroDb['hero_lv'] + 1, + 'rand_attr' => json_encode($attrs), + 'lock_type' => 0, + 'unlock_time' => 0, + 'skill_points' => $heroDb['skill_points']+$nextLevelMeta['skill_point'] ); + //免费英雄到底15级后生成NFT +// if ($heroDb['hero_lv'] + 1 == 15 && !$heroDb['token_id']){ +// $token_id = myself()->_getNowTime(); +// if(!\services\NftService::addNft($heroDb['hero_id'],$token_id)){ +// return ; +// } +// $where = array( +// 'hero_lv' => $heroDb['hero_lv'] + 1, +// 'token_id'=> $token_id, +// 'rand_attr' => json_encode($attrs), +// 'lock_type' => 0, +// 'unlock_time' => 0, +// 'skill_points' => $heroDb['skill_points']+$nextLevelMeta['skill_point'] +// ); +// } + Hero::update($heroUniId, $where); if ($heroDb['hero_lv'] + 1 > myself()->_getV(TN_HERO_MAX_LEVEL, 0)) { myself()->_setV(TN_HERO_MAX_LEVEL, 0, $heroDb['hero_lv'] + 1); } @@ -320,7 +302,7 @@ class HeroController extends BaseAuthedController { $rankActivityService = new services\RankActivityService(); $rankActivityService->heroUpgradeLevel($heroDb['hero_lv'] + 1); } - } +// } $this->_rspData(array( 'property_chg' => $propertyChgService->toDto(), 'old_hero' => $oldHero, @@ -351,14 +333,14 @@ class HeroController extends BaseAuthedController { $propertyChgService->addHeroChg(); $propertyChgService->addBagChg(); $propertyChgService->addUserChg(); - $currQualityMeta = mt\HeroQuality::getByQuality($heroDb['quality']); +// $currQualityMeta = mt\HeroQuality::getByQuality($heroDb['quality']); $nextQualityMeta = null; - if ($currQualityMeta) { +// if ($currQualityMeta) { $nextQualityMeta = mt\HeroQuality::getByQuality($heroDb['quality'] + 1); if ($nextQualityMeta) { $rnd = rand(1, 100); - //$rnd = 1000; - if ($rnd > $nextQualityMeta['success_rate']) { + $probability = \services\FormulaService::Hero_Advanced_Probability($heroDb['quality'] + 1)*100; + if ($rnd > $probability) { Hero::update($costHeroUniId, array( 'lock_type' => 0, @@ -385,8 +367,12 @@ class HeroController extends BaseAuthedController { )); return; } + $heroLucky = \services\FormulaService::Hero_Advanced_Lucky_Value($heroDb['quality'] + 1); + $heroTili = \services\FormulaService::Hero_NFT_Maximum_Physical_Strength($heroDb['quality'] + 1,$heroLucky); Hero::update($heroUniId, array( + 'hero_tili' => $heroTili, + 'skill_points' => $heroDb['skill_points'] + $nextQualityMeta['skill_point'], 'quality' => $heroDb['quality'] + 1, 'advanced_count' => $heroDb['advanced_count'] + 1, 'lock_type' => 0, @@ -412,7 +398,7 @@ class HeroController extends BaseAuthedController { $rankActivityService = new services\RankActivityService(); $rankActivityService->heroUpgradeQuality($heroDb['quality'] + 1); } - } +// } if (!$nextQualityMeta) { $this->_rspErr(1, 'quality is full'); return; @@ -436,7 +422,6 @@ class HeroController extends BaseAuthedController { public function upgradeLevel() { - $costItemId = getReqVal('cost_item_id', 0); $heroUniId = getReqVal('hero_uniid', 0); $slotId = getReqVal('slot_id', 0); $heroDb = Hero::find($heroUniId); @@ -455,14 +440,7 @@ class HeroController extends BaseAuthedController { $this->_rspErr(1, 'hero does not exist'); return; } - if ($heroDb['state'] != Hero::GETED_STATE) { - $this->_rspErr(3, 'Trial hero cannot operate'); - return; - } - if ($heroDb['unlock_time'] > $this->_getNowTime()) { - $this->_rspErr(2, 'Cannot operate during locking'); - return; - } + if ($heroDb['unlock_trade_time'] > $this->_getNowTime()) { $this->_rspErr(2, 'Cannot operate during locking'); return; @@ -472,57 +450,48 @@ class HeroController extends BaseAuthedController { $this->_rspErr(100, 'server internal error'); return; } - $currLevelMeta = mt\HeroLevel::getByLevel($heroDb['hero_lv']); - if (!$currLevelMeta) { - $this->_rspErr(100, 'server internal error'); - return; - } - $nextLevelMeta = mt\HeroLevel::getByLevel($heroDb['hero_lv'] + 1); +// $currLevelMeta = mt\HeroLevelAttr::getByLevel($heroDb['hero_lv']); +// if (!$currLevelMeta) { +// $this->_rspErr(100, 'server internal error'); +// return; +// } + $nextLevelMeta = mt\HeroLevelAttr::getByLevel($heroDb['hero_lv'] + 1); if (!$nextLevelMeta) { $this->_rspErr(5, "It's already the highest level"); return; } - $costItems = array(); - switch ($costItemId) { - case V_ITEM_GOLD: - { + if ($heroDb['hero_lv']+1 <15){ $costItems = array( array( - 'item_id' => $costItemId, - 'item_num' => $nextLevelMeta['gold'] + 'item_id' => V_ITEM_GOLD, + 'item_num' => \services\FormulaService::Hero_Upgrade_CEG_Expend($heroDb['hero_lv']+1) + ) + ); + }else{ + $costItems = array( + array( + 'item_id' => V_ITEM_GOLD, + 'item_num' => \services\FormulaService::Hero_Upgrade_CEG_Expend($heroDb['hero_lv']+1) + ), + array( + 'item_id' => V_ITEM_DIAMOND, + 'item_num' => \services\FormulaService::Hero_Upgrade_CEC_Expend($heroDb['hero_lv']+1) ) ); } - break; - case V_ITEM_DIAMOND: - { - $costItems = array( - array( - 'item_id' => $costItemId, - 'item_num' => $nextLevelMeta['diamond'] - ) - ); - } - break; - default: - { - $this->_rspErr(2, 'Payment method not supported'); - return; - } - break; - } + $lackItem = null; if (!$this->_hasEnoughItems($costItems, $lackItem)) { $this->_rspErr(3, $this->_getLackItemErrMsg($lackItem)); return; } + $this->_decItems($costItems); { Hero::update( $heroUniId, array( - 'lock_type' => Hero::LEVEL_LOCK, - 'unlock_time' => $this->_getNowTime() + $nextLevelMeta['time'], + 'lock_type' => Hero::LEVEL_LOCK ) ); } @@ -538,7 +507,6 @@ class HeroController extends BaseAuthedController { public function upgradeQuality() { - $costItemId = getReqVal('cost_item_id', 0); $costHeroUniId = getReqVal('cost_hero_uniid', 0); $heroUniId = getReqVal('hero_uniid', 0); $slotId = getReqVal('slot_id', 0); @@ -547,6 +515,11 @@ class HeroController extends BaseAuthedController { $this->_rspErr(1, 'slot_id parameter error'); return; } + if (!$heroDb['token_id']){ + $this->_rspErr(100, 'Free heroes cannot quality up'); + return; + } + $costHeroDb = Hero::find($costHeroUniId); if (!$costHeroDb) { $this->_rspErr(1, 'cost hero parameter error'); @@ -604,50 +577,32 @@ class HeroController extends BaseAuthedController { $this->_rspErr(100, 'server internal error'); return; } - $currQualityMeta = mt\HeroQuality::getByQuality($heroDb['quality']); - if (!$currQualityMeta) { - $this->_rspErr(100, 'server internal error'); - return; - } +// $currQualityMeta = mt\HeroQuality::getByQuality($heroDb['quality']); +// if (!$currQualityMeta) { +// $this->_rspErr(100, 'server internal error'); +// return; +// } $nextQualityMeta = mt\HeroQuality::getByQuality($heroDb['quality'] + 1); if (!$nextQualityMeta) { - $this->_rspErr(5, "It's already the highest level1"); + $this->_rspErr(5, "It's already the highest quality"); return; } - $nextLevelMeta = mt\HeroLevel::getByLevel($heroDb['hero_lv']); - if (!$nextLevelMeta) { - $this->_rspErr(5, "It's already the highest level2"); - return; - } - $costItems = array(); - switch ($costItemId) { - case V_ITEM_GOLD: - { - $costItems = array( - array( - 'item_id' => $costItemId, - 'item_num' => $nextQualityMeta['gold'] - ) - ); - } - break; - case V_ITEM_DIAMOND: - { - $costItems = array( - array( - 'item_id' => $costItemId, - 'item_num' => $nextQualityMeta['diamond'] - ) - ); - } - break; - default: - { - $this->_rspErr(2, 'Payment method not supported'); - return; - } - break; - } +// $nextLevelMeta = mt\HeroLevel::getByLevel($heroDb['hero_lv']); +// if (!$nextLevelMeta) { +// $this->_rspErr(5, "It's already the highest level2"); +// return; +// } + $costItems = array( + array( + 'item_id' => V_ITEM_GOLD, + 'item_num' => \services\FormulaService::Hero_Advanced_CEG_Expend($heroDb['hero_lv']+1) + ), + array( + 'item_id' => V_ITEM_DIAMOND, + 'item_num' => \services\FormulaService::Hero_Advanced_CEC_Expend($heroDb['hero_lv']+1) + ) + ); + $lackItem = null; if (!$this->_hasEnoughItems($costItems, $lackItem)) { $this->_rspErr(3, $this->_getLackItemErrMsg($lackItem)); @@ -680,31 +635,37 @@ class HeroController extends BaseAuthedController { public function upgradeQualityPreview() { $heroUniId = getReqVal('hero_uniid', 0); + $costHeroUniId = getReqVal('cost_hero_uniid', 0); $heroDb = Hero::find($heroUniId); - if (!$heroDb) { + $costHeroDb = Hero::find($costHeroUniId); + if (!$heroDb || !$costHeroDb) { $this->_rspErr(100, 'server internal error'); return; } + if (!$heroDb['token_id']){ + $this->_rspErr(100, 'Free heroes cannot quality up'); + return; + } + + if ($heroDb['hero_id'] != $costHeroDb['hero_id']){ + $this->_rspErr(100, 'You need the same kind of hero'); + return; + } + if ($costHeroDb['quality']>1){ + $this->_rspErr(100, 'Material hero quality too high'); + return; + } $heroMeta = mt\Hero::get($heroDb['hero_id']); if (!$heroMeta) { $this->_rspErr(100, 'server internal error'); return; } - $currQualityMeta = mt\HeroQuality::getByQuality($heroDb['quality']); - if (!$currQualityMeta) { - $this->_rspErr(100, 'server internal error'); - return; - } $nextQualityMeta = mt\HeroQuality::getByQuality($heroDb['quality'] + 1); if (!$nextQualityMeta) { $this->_rspErr(5, "It's already the highest level1"); return; } - $nextLevelMeta = mt\HeroLevel::getByLevel($heroDb['hero_lv']); - if (!$nextLevelMeta) { - $this->_rspErr(5, "It's already the highest level2"); - return; - } + $newHeroDb = $heroDb; $newHeroDb['quality'] += 1; $heroDto = Hero::toDto($heroDb); @@ -716,4 +677,5 @@ class HeroController extends BaseAuthedController { )); } + } diff --git a/webapp/models/Chip.php b/webapp/models/Chip.php index 870cdca9..ebbc9c0d 100644 --- a/webapp/models/Chip.php +++ b/webapp/models/Chip.php @@ -220,4 +220,49 @@ class Chip extends BaseModel self::update($chip['token_id'],$fieldsKv); } + public static function getChipAttr($chip_ids){ + $data = ['attr_chip'=>[],'chip_core'=>[]]; + if (! $chip_ids) { + return $data; + } + + $chipAttr = []; + $chipIdsArr = explode('|',$chip_ids); + foreach ($chipIdsArr as $val){ + $chip = self::toDto(self::getChipByIdx($val)); + foreach ($chip['rand_attr'] as $v){ + array_push($chipAttr,$v); + } + } + $item = []; + foreach ($chipAttr as $k=>$v){ + if (!isset($item[$v['attr_id']])){ + $item[$v['attr_id']] = $v; + }else{ + $item[$v['attr_id']]['val']+= $v['val']; + } + } + $data['attr_chip'] = $item; + $chipCore = []; + if (count($chipIdsArr) == 4){ + $min = 15; + foreach ($chipIdsArr as $val){ + $chip = self::getChipByIdx($val); + if ($chip['chip_grade']<$min){ + $min = $chip['chip_grade']; + } + } + $chipCoreList = getMetaTable('chipCore@chipCore.php'); + foreach ($chipCoreList as $val){ + if ($val['chip_core_type']==1 && $val['chip_core_lv']<=$min){ + array_push($chipCore,$val); + } + } + $data['chip_core'] = $chipCore; + }else{ + $data['chip_core'] = []; + } + return $data; + } + } \ No newline at end of file diff --git a/webapp/models/Gun.php b/webapp/models/Gun.php index 38db6b01..cf870e48 100644 --- a/webapp/models/Gun.php +++ b/webapp/models/Gun.php @@ -168,6 +168,8 @@ class Gun extends BaseModel { 'raw_pve_ceg_uplimit' => 0, 'attr_base' => $baseAttr, 'attr_pro' => $attr, + 'attr_chip' => Chip::getChipAttr($row['chip_ids'])['attr_chip'], + 'chip_core' => Chip::getChipAttr($row['chip_ids'])['chip_core'], 'try_count' => $row['try_count'], 'today_get_gold' => $todayGetGold, 'last_get_gold_time' => $lastGetGoldTime, diff --git a/webapp/models/Hero.php b/webapp/models/Hero.php index d685656a..8e4e0a98 100644 --- a/webapp/models/Hero.php +++ b/webapp/models/Hero.php @@ -3,7 +3,7 @@ namespace models; require_once('mt/Hero.php'); -require_once('mt/HeroLevel.php'); +require_once('mt/HeroLevelAttr.php'); require_once('mt/HeroQuality.php'); require_once('mt/AttrHelper.php'); require_once('mt/Item.php'); @@ -12,12 +12,14 @@ require_once('models/HeroSkin.php'); require_once('services/NftService.php'); require_once('services/FormulaService.php'); + use mt; use phpcommon; use phpcommon\SqlHelper; use services\NftService; use services\FormulaService; + class Hero extends BaseModel { const GETED_STATE = 0; @@ -123,6 +125,7 @@ class Hero extends BaseModel { public static function toDto($row) { $attr = emptyReplace(json_decode($row['rand_attr'], true), array()); + $lockType = 0; $unlockTime = 0; /*if ($row['lock_type'] != 0 && $row['unlock_time'] - myself()->_getNowTime() > 0) { @@ -146,10 +149,21 @@ class Hero extends BaseModel { $todayPveGetCeg = 0; } $baseAttr=[]; + $attrPro=[]; $heroMeta = mt\Hero::get($row['hero_id']); if ($heroMeta) { $baseAttr = mt\Hero::getHeroAttr($heroMeta); + $attrPro1=[]; + if ($row['hero_lv']>1){ + $attrPro1 = self::getAttrProByLevel($row,$baseAttr,$attr); + } + $attrPro2=[]; + if ($row['quality']>1){ + $attrPro2 = self::getAttrProByQuality($row,$baseAttr); + } + $attrPro = self::mergeAttrPro($baseAttr,$attrPro1,$attrPro2); } + $skill_common = explode("|",$row['skill_common']); $attr_skill = []; foreach ($skill_common as $val){ @@ -158,7 +172,7 @@ class Hero extends BaseModel { array_push($attr_skill,$item); } } - $heroLucky = $qualityMeta ? $qualityMeta['lucky'] : 0; + $heroLucky = \services\FormulaService::Hero_Advanced_Lucky_Value($row['quality']); $dto = array( 'token_id' => $row['token_id'], 'hero_uniid' => $row['idx'], @@ -174,8 +188,10 @@ class Hero extends BaseModel { 'pve_ceg_uplimit' => 0, 'raw_pve_ceg_uplimit' => 0, 'attr_base' => $baseAttr, - 'attr_pro' => $attr, + 'attr_pro' => $attrPro, 'attr_skill' => $attr_skill, + 'attr_chip' => Chip::getChipAttr($row['chip_ids'])['attr_chip'], + 'chip_core' => Chip::getChipAttr($row['chip_ids'])['chip_core'], 'try_count' => $row['try_count'], 'lock_type' => $lockType, 'unlock_time' => $unlockTime, @@ -430,4 +446,78 @@ class Hero extends BaseModel { return $locking; } + private static function mergeAttrPro($baseAttr,$attrPro1,$attrPro2){ + $newAttr = []; + $newAttrPro = []; + if ($attrPro1 && !$attrPro2){ + $newAttrPro = $attrPro1; + } + if (!$attrPro1 && $attrPro2){ + $newAttrPro = $attrPro2; + } + if ($attrPro1 && $attrPro2){ + foreach ($attrPro1 as $value){ + foreach ($attrPro2 as $val){ + if ($value['attr_id'] == $val['attr_id']){ + array_push($newAttr, + [ + 'attr_id' => $value['attr_id'], + 'type' => $value['type'], + 'val' => $value['val']+$val['val'], + ]); + } + } + } + if ($newAttr){ + foreach ($baseAttr as $value){ + foreach ($newAttr as $val){ + if ($value['attr_id'] == $val['attr_id']){ + array_push($newAttrPro, + [ + 'attr_id' => $value['attr_id'], + 'type' => $value['type'], + 'val' => $val['val']-$value['val'], + ]); + } + } + } + } + } + return $newAttrPro; + } + + private static function getAttrProByLevel($row,$baseAttr,$attr){ + $attrPro1 = []; + $coefficient_level = mt\HeroLevelAttr::getCoefficientByLevel($row['hero_lv'],$row['hero_id']); + foreach ($baseAttr as $val){ + $coef_level = mt\HeroLevelAttr::getByCoefficient($coefficient_level,$val['attr_id']); + foreach ($attr as $v){ + if ($val['attr_id'] == $v['attr_id']){ + array_push($attrPro1,[ + 'attr_id' => $val['attr_id'], + 'type'=> $val['type'], + 'val' => $val['val']*pow($v['val'],$coef_level['val']), + ]); + } + } + } + return $attrPro1; + } + + private static function getAttrProByQuality($row,$baseAttr){ + $attrPro2 = []; + $qualityMeta = mt\HeroQuality::getByQuality($row['quality']); + $coefficient_quality = mt\HeroQuality::getCoefficientByQuality($row['quality'],$row['hero_id']); + foreach ($baseAttr as $val){ + $coef_quality = mt\HeroQuality::getByCoefficient($coefficient_quality,$val['attr_id']); + array_push($attrPro2,[ + 'attr_id' => $val['attr_id'], + 'type'=> $val['type'], + 'val' => $val['val']*pow(1+$qualityMeta['promote']/100,$coef_quality['val']), + ]); + } + return $attrPro2; + } + + } diff --git a/webapp/mt/HeroLevelAttr.php b/webapp/mt/HeroLevelAttr.php index 38fc8f28..777bc47c 100644 --- a/webapp/mt/HeroLevelAttr.php +++ b/webapp/mt/HeroLevelAttr.php @@ -4,16 +4,109 @@ namespace mt; require_once('mt/StrHelper.php'); require_once('mt/AttrHelper.php'); +require_once('mt/Hero.php'); use phpcommon; class HeroLevelAttr { + private static $BASE_ATTR = [kHAT_Hp,kHAT_Atk,kHAT_Def,kHAT_Critical,kHAT_CriDamage,kHAT_Dodge,kHAT_Ruduce]; public static function get($id) { return getXVal(self::getMetaList(), $id); } + public static function getByLevel($level) + { + self::mustBeLevelHash(); + return getXVal(self::$levelHash, $level, null); + } + + public static function getByCoefficient($data,$index) + { + self::mustBeCoefficientHash($data); + return getXVal(self::$coefficientHash, $index, null); + } + + public static function getCoefficientByLevel($level,$hero_id){ + $meta = self::getByLevel($level); + return [ + [ + 'attr_id'=>kHAT_Hp, + 'val' => self::_getCoefficient($meta,$hero_id,'hp_rate') + ], [ + 'attr_id'=>kHAT_Atk, + 'val' => self::_getCoefficient($meta,$hero_id,'atk_rate') + ], [ + 'attr_id'=>kHAT_Def, + 'val' => self::_getCoefficient($meta,$hero_id,'def_rate') + ], [ + 'attr_id'=>kHAT_Critical, + 'val' => self::_getCoefficient($meta,$hero_id,'crit_atk_rate') + ], [ + 'attr_id'=>kHAT_CriDamage, + 'val' => self::_getCoefficient($meta,$hero_id,'damage_rate') + ], [ + 'attr_id'=>kHAT_Dodge, + 'val' => self::_getCoefficient($meta,$hero_id,'miss_rate') + ], [ + 'attr_id'=>kHAT_Ruduce, + 'val' => self::_getCoefficient($meta,$hero_id,'ruduce_rate') + ], + ]; + } + + private static function _getCoefficient($meta,$hero_id,$title){ + if ($meta[$title.'2']){ + $item = explode('|',$meta[$title.'2']); + foreach ($item as $val){ + $item_1 = explode(':',$val); + if ($item_1[0] == $hero_id){ + return $item_1[1]; + } + } + return $meta[$title]; + } + return $meta[$title]; + } + + public static function addRandAttrNew($heroDb){ + $heroMeta = Hero::get($heroDb['hero_id']); + $newAttrs = array(); + if ($heroMeta) { + $meta = self::getByLevel($heroDb['hero_lv']+1); + foreach (self::$BASE_ATTR as $item){ + $val = self::getAttrValue($meta); + array_push( + $newAttrs, + [ + 'attr_id' => $item, + 'val' => $val, + ]); + } + } + $rand_attr = $attr = emptyReplace(json_decode($heroDb['rand_attr'], true), array()); + if (!$rand_attr){ + foreach ($newAttrs as $item){ + array_push( + $rand_attr, + [ + 'attr_id' => $item['attr_id'], + 'val' => 1+$item['val'], + ]); + } + }else{ + foreach ($rand_attr as &$item){ + foreach ($newAttrs as $v){ + if ($item['attr_id'] == $v['attr_id']){ + $item['val'] = $item['val']*(1+$v['val']); + } + } + } + } + return $rand_attr; + } + public static function addRandAttr($level, &$dbAttrs) { $newAttrs = array(); @@ -39,6 +132,7 @@ class HeroLevelAttr { } } } + AttrHelper::mergeAttr($dbAttrs, $newAttrs); return true; } @@ -80,6 +174,29 @@ class HeroLevelAttr { return self::$metaList; } + protected static function mustBeLevelHash() + { + if (!self::$levelHash) { + self::$levelHash = array(); + foreach (self::getMetaList() as $meta) { + self::$levelHash[$meta['level']] = $meta; + } + } + } + + protected static function mustBeCoefficientHash($list) + { + if (!self::$coefficientHash) { + self::$coefficientHash = array(); + foreach ($list as $val) { + self::$coefficientHash[$val['attr_id']] = $val; + } + } + } + + protected static $metaList; + protected static $levelHash; + protected static $coefficientHash; } diff --git a/webapp/mt/HeroQuality.php b/webapp/mt/HeroQuality.php index 1baf80a0..93ae4fc4 100644 --- a/webapp/mt/HeroQuality.php +++ b/webapp/mt/HeroQuality.php @@ -17,6 +17,40 @@ class HeroQuality { return getXVal(self::$qualityHash, $quality, null); } + public static function getByCoefficient($data,$index) + { + self::mustBeCoefficientHash($data); + return getXVal(self::$coefficientHash, $index, null); + } + + public static function getCoefficientByQuality($quality,$hero_id){ + $meta = self::getByQuality($quality); + return [ + [ + 'attr_id'=>kHAT_Hp, + 'val' => self::_getCoefficient($meta,$hero_id,'hp_rate') + ], [ + 'attr_id'=>kHAT_Atk, + 'val' => self::_getCoefficient($meta,$hero_id,'atk_rate') + ], [ + 'attr_id'=>kHAT_Def, + 'val' => self::_getCoefficient($meta,$hero_id,'def_rate') + ], [ + 'attr_id'=>kHAT_Critical, + 'val' => self::_getCoefficient($meta,$hero_id,'crit_atk_rate') + ], [ + 'attr_id'=>kHAT_CriDamage, + 'val' => self::_getCoefficient($meta,$hero_id,'damage_rate') + ], [ + 'attr_id'=>kHAT_Dodge, + 'val' => self::_getCoefficient($meta,$hero_id,'miss_rate') + ], [ + 'attr_id'=>kHAT_Ruduce, + 'val' => self::_getCoefficient($meta,$hero_id,'ruduce_rate') + ], + ]; + } + public static function getRandAttr($qualityMeta) { $nums = explode(':', $qualityMeta['rand_attrs_num']); @@ -38,6 +72,19 @@ class HeroQuality { } return $result; } + private static function _getCoefficient($meta,$hero_id,$title){ + if ($meta[$title.'2']){ + $item = explode('|',$meta[$title.'2']); + foreach ($item as $val){ + $item_1 = explode(':',$val); + if ($item_1[0] == $hero_id){ + return $item_1[1]; + } + } + return $meta[$title]; + } + return $meta[$title]; + } protected static function getMetaList() { @@ -57,7 +104,18 @@ class HeroQuality { } } + protected static function mustBeCoefficientHash($list) + { + if (!self::$coefficientHash) { + self::$coefficientHash = array(); + foreach ($list as $val) { + self::$coefficientHash[$val['attr_id']] = $val; + } + } + } + protected static $metaList; protected static $qualityHash; + protected static $coefficientHash; } diff --git a/webapp/services/FormulaService.php b/webapp/services/FormulaService.php index 1d802d0e..b99251b5 100644 --- a/webapp/services/FormulaService.php +++ b/webapp/services/FormulaService.php @@ -277,6 +277,12 @@ class FormulaService extends BaseService { return 1; } + //CEC折扣比率 + public static function CEC_Discount_Rate(){ + //CEC_Discount_Rate=ROUND(CEC_Dynamic_Index /( CEC_Dynamic_Price / CEC_Base_Price),3) + return 1; + } + //英雄芯片劳力值 public static function Hero_Chip_Labor_Value(){ return 1; @@ -353,5 +359,52 @@ class FormulaService extends BaseService { return round($tili*10*self::CEG_Discount_Rate()); } + //英雄NFT每次升级的CEG消耗公式 + public static function Hero_Upgrade_CEG_Expend($grand){ + //ROUND(43*ROUND(0.08*当前英雄等级^2+0.08*当前英雄等级+1,0)*CEG_Discount_Rate,0) + return round(43*round(0.08*pow($grand,2)+0.08*$grand+1,0)*self::CEG_Discount_Rate(),0); + } + + //英雄NFT每次升级的CEC消耗公式 + public static function Hero_Upgrade_CEC_Expend($grand){ + //ROUND (ROUND(0.09*单次CEG消耗,0)*SIGN(当前英雄等级>14)*CEC_Discount_Rate,2) +// return round(round(0.09*self::Hero_Upgrade_CEG_Expend($grand),0)*($grand>14?1:0)*self::CEC_Discount_Rate(),2); + + //ROUND(ROUND(0.036*43*ROUND(0.08*当前英雄等级^2+0.08*当前英雄等级+1,0),0)*SIGN(player等级>14)*CEC_Discount_Rate,2) + return round(round(0.036*43*round(0.08*pow($grand,2)+0.08*$grand+1,0),0)*($grand>14?1:0)*self::CEC_Discount_Rate(),2); + } + + //英雄NFT每次进阶的CEG消耗公式 + public static function Hero_Advanced_CEG_Expend($quality){ + //ROUND((ROUND(0.08*当前英雄阶数^2+0.08*当前英雄阶数+1,0)*10+100)*CEG_Discount_Rate,0) + return round((round(0.08*pow($quality,2)+0.08*$quality+1,0)*10+100)*self::CEG_Discount_Rate(),0); + } + + //英雄NFT每次进阶的CEC消耗公式 + public static function Hero_Advanced_CEC_Expend($quality){ + //ROUND((ROUND(0.08*当前英雄阶数^2+0.08*当前英雄阶数+1,0)*1.5+10)*CEC_Discount_Rate,2) +// return round((round(0.08*pow($quality,2)+0.08*$quality+1,0)*1.5+10)*self::CEC_Discount_Rate(),2); + + //ROUND((ROUND(0.08*player阶数^2+0.08*player阶数+1,0)*0.6+4)*CEC_Discount_Rate,2) + return round((round(0.08*pow($quality,2)+0.08*$quality+1,0)*0.6+4)*self::CEC_Discount_Rate(),2); + } + + //英雄NFT每次进阶成功的概率公式 + public static function Hero_Advanced_Probability($quality){ + //SIGN(当前英雄阶数>9.5)*ROUND(0.0043*当前英雄阶数^2-0.144*当前英雄阶数+1.2629,2)+SIGN(当前英雄阶数<9.5)*ROUND(1.2-0.1*当前英雄阶数,2) + return ($quality>9.5?1:0)*round(0.0043*pow($quality,2)-0.144*$quality+1.2629,2)+($quality<9.5?1:0)*round(1.2-0.1*$quality,2); + } + + //英雄NFT幸运值 + public static function Hero_Advanced_Lucky_Value($quality){ + //ROUND((0.0354*英雄NFT阶数^5-0.8464*英雄NFT阶数^4+10.907*英雄NFT阶数^3 -48.868*英雄NFT阶数^2+312.18*英雄NFT阶数-80)/10,1)*10 + return round((0.0354*pow($quality,5)-0.8464*pow($quality,4)+10.907*pow($quality,3)-48.868*pow($quality,2)+312.18*$quality-80)/10,1)*10; + } + + //英雄NFT最大体力值 + public static function Hero_NFT_Maximum_Physical_Strength($quality,$lucky){ + //英雄NFT幸运值*ROUND(1.1714+0.0286*当前英雄NFT阶数,3) + return $lucky*round(1.1714+0.0286*$quality,3); + } } diff --git a/webapp/services/NftService.php b/webapp/services/NftService.php index e46d47fa..120fce52 100644 --- a/webapp/services/NftService.php +++ b/webapp/services/NftService.php @@ -3,8 +3,11 @@ namespace services; require_once('models/Nft.php'); +require_once('mt/Item.php'); +use phpcommon\SqlHelper; use models\Nft; +use mt\Item; class NftService extends BaseService { @@ -76,4 +79,33 @@ class NftService extends BaseService { } } + public static function addNft($itemId,$token_id){ + $itemMeta = Item::get($itemId); + if ($itemMeta) { + $tokenType = Nft::getTokenType($itemMeta); + if ($tokenType == Nft::NONE_TYPE) { + myself()->_rspErr(1, 'param item_id error'); + return false; + } else { + SqlHelper::insert( + myself()->_getMarketMysql(), + 't_nft', + array( + 'token_id' => $token_id, + 'token_type' => $tokenType, + 'game_id' => 2006, + 'item_id' => $itemId, + 'owner_address' => myself()->_getOpenId(), + 'createtime' => myself()->_getNowTime(), + 'modifytime' => myself()->_getNowTime(), + ) + ); + return true; + } + } else { + myself()->_rspErr(1, 'param item_id error'); + return false; + } + } + }