From 744a00f000539412fa3e597d7150d68ce56381e0 Mon Sep 17 00:00:00 2001 From: hujiabin <519660157@qq.com> Date: Wed, 24 Jul 2024 18:04:27 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8A=AF=E7=89=87=E5=8A=9F=E8=83=BD=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/Chip.py | 34 +++- doc/Fragment.py | 16 -- webapp/controller/ChipController.class.php | 188 ++++++++++++++---- .../controller/FragmentController.class.php | 1 + webapp/models/Chip.php | 7 +- webapp/models/Hero.php | 8 +- webapp/models/HeroSkin.php | 2 +- webapp/mt/BattleRandAttribute.php | 22 +- webapp/mt/Manufacture.php | 25 +-- 9 files changed, 219 insertions(+), 84 deletions(-) diff --git a/doc/Chip.py b/doc/Chip.py index 88b6fce7..abdae5bf 100644 --- a/doc/Chip.py +++ b/doc/Chip.py @@ -38,10 +38,42 @@ class Chip(object): 'url': 'webapp/index.php?c=Chip&a=upgradeQuality', 'params': [ _common.ReqHead(), - ['chip_uniid', '', '芯片唯一id'], + ['chip_uniid', '', '升阶芯片唯一id'], + ['consume_uniids', '', '材料芯片唯一id,用“|”隔开'], ], 'response': [ _common.RspHead(), + ['status', 0, '0=失败 1=成功'], + ['property_chg', _common.PropertyChg(), '属性变更'], + ] + }, + { + 'name': 'synChip', + 'desc': '芯片合成', + 'group': 'Chip', + 'url': 'webapp/index.php?c=Chip&a=synChip', + 'params': [ + _common.ReqHead(), + ['item_id', '', '材料item_id'], + ], + 'response': [ + _common.RspHead(), + ['award', _common.AwardItem(), '合成芯片奖励'], + ['property_chg', _common.PropertyChg(), '属性变更'], + ] + }, + { + 'name': 'resolveChip', + 'desc': '分解芯片', + 'group': 'Chip', + 'url': 'webapp/index.php?c=Chip&a=resolveChip', + 'params': [ + _common.ReqHead(), + ['chip_uniids', '', '芯片uniid 多个用“|”隔开'], + ], + 'response': [ + _common.RspHead(), + ['award', _common.AwardItem(), '分解所得材料'], ['property_chg', _common.PropertyChg(), '属性变更'], ] }, diff --git a/doc/Fragment.py b/doc/Fragment.py index e22f5d8c..f76b256a 100644 --- a/doc/Fragment.py +++ b/doc/Fragment.py @@ -35,22 +35,6 @@ class Fragment(object): ['status', 0, '1:成功 0:失败'], ['property_chg', _common.PropertyChg(), '属性变更'], ] - },{ - 'name': 'synChip', - 'desc': '芯片合成', - 'group': 'Fragment', - 'url': 'webapp/index.php?c=Fragment&a=synChip', - 'params': [ - _common.ReqHead(), - ['item_id', '', 'item_id'], - ['item_num', '', 'item_num'], - ], - 'response': [ - _common.RspHead(), - ['item_id', 0, '芯片item_id'], - ['status', 0, '1:成功 0:失败'], - ['property_chg', _common.PropertyChg(), '属性变更'], - ] }, ] \ No newline at end of file diff --git a/webapp/controller/ChipController.class.php b/webapp/controller/ChipController.class.php index 29d5ba60..ded512f7 100644 --- a/webapp/controller/ChipController.class.php +++ b/webapp/controller/ChipController.class.php @@ -2,12 +2,17 @@ require_once('models/Chip.php'); -require_once('mt/QualityUpMapRule.php'); + require_once('mt/ChipAttribute.php'); +require_once('mt/BattleRandAttribute.php'); require_once('mt/EconomyAttribute.php'); require_once('mt/Manufacture.php'); +require_once('mt/Parameter.php'); require_once('services/PropertyChgService.php'); +require_once('services/AwardService.php'); +require_once('services/LootService.php'); +require_once('services/LogService.php'); use models\Chip; @@ -63,42 +68,101 @@ class ChipController extends BaseAuthedController } public function upgradeQuality(){ - return ; $chipUniId = getReqVal('chip_uniid', 0); - $itemId = getReqVal('item_id',0); - $itemNum = getReqVal('item_num',0); - if ($itemNum < 1){ - $this->_rspErr(1, "item_num not enough"); - return; - } + $consumeUniIds = getReqVal('consume_uniids',0); $chipDb = Chip::find($chipUniId); if (!$chipDb) { - $this->_rspErr(100, 'param hero_uniid error '); + $this->_rspErr(100, 'param chip_uniid error '); return; } - if ($chipDb['quality'] == \mt\QualityUpMapRule::MAX_QUALITY){ + if ($chipDb['quality'] == Chip::CHIP_QUALITY_MAX){ $this->_rspErr(5, "It's already the highest level"); return; } - $heroQualityMeta = \mt\QualityUpMapRule::getByQuality($chipDb['item_id'],$chipDb['quality']+1); - if (!$heroQualityMeta || $heroQualityMeta['needItem'] != $itemId){ - $this->_rspErr(100, 'param item_id error '); + $chipAttrMeta = \mt\ChipAttribute::get($chipDb['item_id']); + if (!$chipAttrMeta){ + $this->_rspErr(100, 'mt error '); return; } - $manufactureMeta = \mt\Manufacture::findChipAction(\mt\Manufacture::UP_ACTION,$chipDb['quality']+1); + $consumeUniIdArr = explode("|",$consumeUniIds); + foreach ($consumeUniIdArr as $uniid){ + $consumeChipDb = Chip::find($uniid); + if (!$consumeChipDb || $consumeChipDb['quality'] != $chipDb['quality'] || $chipDb['inlay_state'] == 1) { + $this->_rspErr(100, 'param consume error '); + return; + } + } + $manufactureMeta = \mt\Manufacture::getByInvoke($chipAttrMeta['manufacture'],$chipDb['quality']+1); if (!$manufactureMeta){ - $this->_rspErr(1, "Error operation"); + $this->_rspErr(1, "mt error"); + return; + } + if (count($consumeUniIdArr) != $manufactureMeta['needItem']){ + $this->_rspErr(100, ' consume number error '); + return; + } + + //消耗材料 + $costItems = array(); + foreach ($consumeUniIdArr as $uniid){ + $consumeChipDb = Chip::find($uniid); + array_push($costItems, $consumeChipDb); + Chip::update2($uniid,array( + 'account_id' => myself()->_getAccountId() . '!!!', + 'modifytime' => myself()->_getNowTime(), + )); + } + $propertyChgService = new services\PropertyChgService(); + $propertyChgService->addChip(); + $hashChance = \mt\Manufacture::hashChance($manufactureMeta['chance']); + $weight = $hashChance[0]; + $rnd = rand(1,100); + $status = 0; + if ($rnd <= $weight*100){ + $status = 1; + $attr = emptyReplace(json_decode($chipDb['rand_attr'], true), array()); + $attribute = \mt\EconomyAttribute::getAttribute($chipAttrMeta['economyAttribute'],$chipDb['quality'] + 1); + $randMeta = mt\BattleRandAttribute::getByWeight($chipAttrMeta['battleAttribute'],$chipDb['quality'] + 1); + $randAttr = mt\BattleRandAttribute::getRandAttr($randMeta); + $newAttr = mt\BattleRandAttribute::mergeAttr($attr,$randAttr); + Chip::update2($chipUniId, array( + 'quality' => $chipDb['quality'] + 1, + 'rand_attr' => json_encode($newAttr), + 'wealth_attr' => json_encode($attribute), + 'modifytime' => myself()->_getNowTime() + )); + $chipDb['quality'] += 1; + $chipDb['rand_attr'] = $newAttr; + $chipDb['wealth_attr'] = $attribute; + } + $event = array( + 'ID' => 'chip', + 'SUB_ID' => 'advanced', + 'SUB_KEY' => 'chip_advanced', + 'cost_chip' => $costItems, + 'chance' => $weight, + 'result' => $status, + 'outcome_chip' =>$chipDb, + ); + \services\LogService::burialPointEvent($event); + $this->_rspData(array( + 'status' => $status, + 'property_chg' => $propertyChgService->toDto(), + )); + } + + public function synChip(){ + $itemId = getReqVal('item_id',0); + $needItem = \mt\Parameter::getVal('chip_craft_need_item',0); + $needItemNum = \mt\Parameter::getVal('chip_craft_need_item_number',50); + if ($itemId != $needItem){ + $this->_rspErr(1, "item_id error"); return; } - $itemNum = min($itemNum,$manufactureMeta['numTop']); $costItems = array( - array( - 'item_id' => V_ITEM_GOLD, - 'item_num' => $manufactureMeta['gold'] - ), array( 'item_id' => $itemId, - 'item_num' => $itemNum + 'item_num' => $needItemNum ), ); $lackItem = null; @@ -106,28 +170,78 @@ class ChipController extends BaseAuthedController $this->_rspErr(3, $this->_getLackItemErrMsg($lackItem)); return; } - //消耗材料 +// 消耗材料 $this->_decItems($costItems); $propertyChgService = new services\PropertyChgService(); + $awardService = new services\AwardService(); $propertyChgService->addBagChg(); - $hashChance = \mt\Manufacture::hashChance($manufactureMeta['chance']); - $weight = isset($hashChance[$itemNum]) ? $hashChance[$itemNum] : 0; - $rnd = rand(1,100); - $status = 0; - if ($rnd <= $weight*100){ - $status = 1; - $chipAttrMeta = \mt\ChipAttribute::get($chipDb['item_id']); - $attribute = \mt\EconomyAttribute::getAttribute($chipAttrMeta['economyAttribute'],$chipDb['quality'] + 1); - Chip::update2($chipUniId, array( - 'quality' => $chipDb['quality'] + 1, - 'wealth_attr' => json_encode($attribute), - )); - $propertyChgService->addHeroChg(); - } + + $synLoot = \mt\Parameter::getVal('chip_craft_product_loot',''); + $items = \services\LootService::dropOutItem($synLoot); + $this->_addItems($items,$awardService,$propertyChgService); + $propertyChgService->addChip(); + $event = array( + 'ID' => 'chip', + 'SUB_ID' => 'synthesis', + 'SUB_KEY' => 'chip_synthesis', + 'cost_item' => array( + 'item_id' => $itemId, + 'item_num' => $needItemNum + ), + 'outcome_chip' => $items[0], + ); + \services\LogService::burialPointEvent($event); $this->_rspData(array( - 'status' => $status, + 'award' => $awardService->toDto(), + 'property_chg' => $propertyChgService->toDto(), + )); + + } + + public function resolveChip(){ + $chip_uniids = getReqVal('chip_uniids',0); + $uniidArr = explode('|',$chip_uniids); + foreach ($uniidArr as $uniid){ + $chipDb = Chip::find($uniid); + if (!$chipDb || $chipDb['inlay_state'] == 1){ + $this->_rspErr(1, "the chip don't operation"); + return; + } + } + $decLoot = \mt\Parameter::getVal('chip_craft_decompose_loot',0); + $lootArr = explode("|",$decLoot); + $propertyChgService = new services\PropertyChgService(); + $awardService = new services\AwardService(); + $cost_item = array(); + $outcome_item = array(); + foreach ($uniidArr as $uniid){ + $chipDb = Chip::find($uniid); + array_push($cost_item,$chipDb['item_id']); + $lootId = $lootArr[$chipDb['quality'] - 1 ]; + $items = \services\LootService::dropOutItem($lootId); + array_push($outcome_item,$items[0]); + Chip::update2($uniid,array( + 'account_id' => myself()->_getAccountId() . '!!!', + 'modifytime' => myself()->_getNowTime(), + )); + $this->_addItems($items,$awardService,$propertyChgService); + } + $propertyChgService->addChip(); + $propertyChgService->addBagChg(); + $event = array( + 'ID' => 'chip', + 'SUB_ID' => 'resolve', + 'SUB_KEY' => 'chip_resolve', + 'cost_item' => $cost_item, + 'outcome_item' => $outcome_item, + ); + \services\LogService::burialPointEvent($event); + $this->_rspData(array( + 'award' => $awardService->toDto(), 'property_chg' => $propertyChgService->toDto(), )); } + + } diff --git a/webapp/controller/FragmentController.class.php b/webapp/controller/FragmentController.class.php index b5de1b67..49d573b6 100644 --- a/webapp/controller/FragmentController.class.php +++ b/webapp/controller/FragmentController.class.php @@ -114,6 +114,7 @@ class FragmentController extends BaseAuthedController } public function synChip(){ + return $itemId = getReqVal('item_id',0); $itemNum = getReqVal('item_num',0); $itemMeta = \mt\Item::get($itemId); diff --git a/webapp/models/Chip.php b/webapp/models/Chip.php index af69e285..9b8cea06 100644 --- a/webapp/models/Chip.php +++ b/webapp/models/Chip.php @@ -24,6 +24,7 @@ class Chip extends BaseModel const FREE_STATE = 1; const CHIP_LV_MAX = 3; + const CHIP_QUALITY_MAX = 5; public static function find($chipUniId) { @@ -37,9 +38,9 @@ class Chip extends BaseModel if ($row) { $row['chip_uniid'] = $row['idx']; if ($row['account_id'] != myself()->_getAccountId()) { - if (NftService::isChipOwner(myself()->_getAddress(), $row['token_id']) <= 0) { +// if (NftService::isChipOwner(myself()->_getAddress(), $row['token_id']) <= 0) { $row = null; - } +// } } } return $row; @@ -258,7 +259,7 @@ class Chip extends BaseModel $attribute = \mt\EconomyAttribute::getAttribute($chipAttrMeta['economyAttribute'],$quality); { $randAttr = array(); - $randMeta = mt\BattleRandAttribute::getByWeight($chipAttrMeta['battleAttribute']); + $randMeta = mt\BattleRandAttribute::getByWeight($chipAttrMeta['battleAttribute'],$quality); if ($randMeta){ $randAttr = mt\BattleRandAttribute::getRandAttr($randMeta); } diff --git a/webapp/models/Hero.php b/webapp/models/Hero.php index 3e0a8407..b0c70180 100644 --- a/webapp/models/Hero.php +++ b/webapp/models/Hero.php @@ -245,7 +245,7 @@ class Hero extends BaseModel { { $attr = emptyReplace(json_decode($row['rand_attr'], true), array()); if (!$attr){ - $attr = self::getRandAttr($row['hero_id']); + $attr = self::getRandAttr($row['hero_id'],$row['quality']); self::update($row['idx'],array( 'rand_attr'=>json_encode($attr) )); @@ -610,7 +610,7 @@ class Hero extends BaseModel { public static function internalAddHero($conn, $heroMeta, $accountId, $tokenId,$quality = 1) { - $randAttr = self::getRandAttr($heroMeta['id']) ; + $randAttr = self::getRandAttr($heroMeta['id'],$quality) ; $attribute = \mt\EconomyAttribute::getAttribute($heroMeta['relationship'], $quality); $seal_type = 0; $unseal_time = 0; @@ -662,11 +662,11 @@ class Hero extends BaseModel { - private static function getRandAttr($heroId){ + private static function getRandAttr($heroId,$quality){ $attr = array(); $basicMeta = mt\BattleBasicAttribute::get($heroId); if ($basicMeta) { - $randMeta = mt\BattleRandAttribute::getByWeight($basicMeta['randomAttribute_Default']); + $randMeta = mt\BattleRandAttribute::getByWeight($basicMeta['randomAttribute_Default'],$quality); if ($randMeta) { $attr = mt\BattleRandAttribute::getRandAttr($randMeta); } diff --git a/webapp/models/HeroSkin.php b/webapp/models/HeroSkin.php index 942378b0..b9d6df03 100644 --- a/webapp/models/HeroSkin.php +++ b/webapp/models/HeroSkin.php @@ -100,7 +100,7 @@ class HeroSkin extends BaseModel { $wealth_attr = array(); $dressMeta = mt\DressAttribute::get($itemMeta['id']); if ($dressMeta) { - $randMeta = mt\BattleRandAttribute::getByWeight($dressMeta['battleAttribute']); + $randMeta = mt\BattleRandAttribute::getByWeight($dressMeta['battleAttribute'],1); $rand_attr = mt\BattleRandAttribute::getRandAttr($randMeta); $wealth_attr = \mt\EconomyAttribute::getAttribute($dressMeta['economyAttribute'], 1); } diff --git a/webapp/mt/BattleRandAttribute.php b/webapp/mt/BattleRandAttribute.php index 5f973f1b..1d6e3bb7 100644 --- a/webapp/mt/BattleRandAttribute.php +++ b/webapp/mt/BattleRandAttribute.php @@ -13,8 +13,8 @@ class BattleRandAttribute { - public static function getByWeight($invoke){ - $metaList = self::getByInvoke($invoke); + public static function getByWeight($invoke,$quality){ + $metaList = self::getByInvoke($invoke,$quality); $totalWeight = 0; $randMeta = array(); if ($metaList){ @@ -49,10 +49,24 @@ class BattleRandAttribute { return $attrArray; } - protected static function getByInvoke($invoke){ + public static function mergeAttr($attr1 , $attr2){ + $mergedAttr = array_merge($attr1, $attr2); + $newAttr = array(); + foreach ($mergedAttr as $attr){ + if (isset($newAttr[$attr['attr_id']])){ + $newAttr[$attr['attr_id']]['val'] += $attr['val']; + }else{ + $newAttr[$attr['attr_id']] = $attr; + } + } + return array_values($newAttr); + } + + protected static function getByInvoke($invoke,$quality){ $metaList = array(); foreach (self::getMetaList() as $meta){ - if ($meta['invoke'] == $invoke){ + $rateNeed = explode('|', $meta['rareNeed']); + if ($meta['invoke'] == $invoke && in_array($quality,$rateNeed)){ array_push($metaList,$meta); } } diff --git a/webapp/mt/Manufacture.php b/webapp/mt/Manufacture.php index 76d65a64..ede72118 100644 --- a/webapp/mt/Manufacture.php +++ b/webapp/mt/Manufacture.php @@ -22,16 +22,6 @@ class Manufacture { return array(); } - public static function findChipAction($action,$quality){ - foreach (self::getChipList() as $meta){ - if ($meta['action'] == $action && $meta['rank'] == $quality){ - - return $meta; - } - } - return array(); - } - public static function hashChance($chance){ if (!$chance){ return array(); @@ -57,18 +47,17 @@ class Manufacture { return self::$heroList; } - protected static function getChipList(){ - if (!self::$chipList) { - self::$chipList = array(); - foreach (self::getMetaList() as $meta){ - if ($meta['type'] == 2){ - array_push(self::$chipList , $meta); - } + + public static function getByInvoke($invoke,$quality){ + foreach (self::getMetaList() as $meta){ + if ($meta['invoke'] == $invoke && $meta['rank'] == $quality){ + return $meta; } } - return self::$chipList; + return array(); } + protected static function getMetaList() { if (!self::$metaList) {