测试doc

This commit is contained in:
hujiabin 2022-08-18 16:31:33 +08:00
parent 7d2b983bbe
commit 7d41bc5bc7
8 changed files with 339 additions and 29 deletions

24
doc/Chip.py Normal file
View File

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
import _common
class Chip(object):
def __init__(self):
self.apis = [
{
'name': 'chipList',
'desc': '获取芯片列表',
'group': 'Bag',
'url': 'webapp/index.php?c=Chip&a=chipList',
'params': [
_common.ReqHead(),
['type', '', '芯片类型1 角色2 枪械'],
],
'response': [
_common.RspHead(),
['!data', [_common.Chip()], '芯片列表']
]
},
]

View File

@ -625,3 +625,35 @@ class Phase3Box(object):
self.fields = [
['box_id', '', '箱子id'],
]
class ChipAttr(object):
def __init__(self):
self.fields = [
['attr_id', 0, '属性id'],
['type', 0, '1: 绝对值 2百分比'],
['val', 0, '综合属性值'],
['chip_type', 0, '1角色芯片 2枪械芯片'],
['attr_num', 0, '成长属性值'],
['attr_pool_num', 0, '固定属性值'],
]
class Chip(object):
def __init__(self):
self.fields = [
['idx', 0, '主键id'],
['token_id', '', 'token id'],
['account_id', '', '账号id'],
['item_id', 0, '道具id'],
['item_num', 0, '道具数量'],
['chip_grade', 0, '芯片等级'],
['chip_type', 0, '芯片类型1 角色2 枪械'],
['state', 0, '芯片添加状态:0 正常;1 选择;-1 锁定'],
['supper_state', 0, '是否锁定0 正常;1 锁住'],
['inlay_state', 0, '镶嵌状态0 未镶嵌;1 镶嵌了'],
['!rand_attr', [ChipAttr()], '属性'],
['lucky_temporary', '', '临时幸运值'],
['lucky_final', '', '最终幸运值'],
['strength', '', '体力值'],
]

View File

@ -150,6 +150,7 @@ CREATE TABLE `t_hero` (
`last_pve_get_ceg_time` bigint NOT NULL DEFAULT '0' COMMENT '最后pve获取金币的时间',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
`chip_ids` varchar(100) NOT NULL DEFAULT '0' COMMENT '已镶嵌的芯片idx组',
PRIMARY KEY (`idx`),
UNIQUE KEY `token_id` (`token_id`),
KEY `account_id` (`account_id`)
@ -225,6 +226,9 @@ CREATE TABLE `t_chip` (
`rand_attr` mediumblob COMMENT '随机属性',
`today_get_gold` bigint NOT NULL DEFAULT '0' COMMENT '金币',
`last_get_gold_time` int(11) NOT NULL DEFAULT '0' COMMENT '最后获取金币的时间',
`lucky_temporary` varchar(10) NOT NULL DEFAULT '0' COMMENT '临时幸运值',
`lucky_final` varchar(10) NOT NULL DEFAULT '0' COMMENT '最终幸运值',
`strength` varchar(10) NOT NULL DEFAULT '0' COMMENT '体力值',
`createtime` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间',
`modifytime` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间',
PRIMARY KEY (`idx`),

View File

@ -4,6 +4,7 @@ require_once('models/Chip.php');
require_once('models/Hero.php');
require_once('mt/ChipAttr.php');
require_once('mt/AttrHelper.php');
require_once('services/FormulaService.php');
use models\Chip;
use models\Hero;
@ -29,6 +30,24 @@ class ChipController extends BaseAuthedController
));
}
public function chipOrder(){
$type = getReqVal('type','');
if (! $type){
$this->_rspErr(1,'Please enter instructions');
return ;
}
$order = getReqVal('order','asc');
$chipList = Chip::all($type);
$chipDtoList = array();
foreach ($chipList as $item) {
array_push($chipDtoList, Chip::toDto($item));
}
$data = $this->_orderByChip($chipDtoList,$order);
$this->_rspData(array(
'data' => $data,
));
}
public function beforeInlay(){
$type = getReqVal('type','');
if (! $type){
@ -126,7 +145,7 @@ class ChipController extends BaseAuthedController
}
}
$res = $this->_orderByChipDesc($usable,$limit);
$res = $this->_getHignGradeLimit($usable,$limit);
if (! $res){
$this->_rspErr(1, 'The chip slot is full');
return;
@ -141,8 +160,136 @@ class ChipController extends BaseAuthedController
}
public function test(){
public function beforeSynthetic(){
$token_id = trim(getReqVal('token_id', 0));
if (! $token_id) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
$chip = Chip::getChipByTokenId($token_id);
if ($chip['supper_state'] == 1 || $chip['inlay_state'] == 1 || $chip['state'] == -1){
$this->_rspErr(1, "The chip can't synthetic");
return;
}
if ($chip['chip_grade'] == 15){
$this->_rspErr(1, "Chip level upper limit");
return;
}
$chip = Chip::toDto($chip);
foreach ($chip['rand_attr'] as $k=>$val){
$attr = \mt\ChipAttr::getAttrById($val['attr_id'],$val['chip_type']);
$chip['rand_attr_after'][$k] =[
'attr_id'=>$val['attr_id'],
'type'=>$val['type'],
'val'=>$attr['lv'.($chip['chip_grade']+1)]*$val['attr_pool_num'],
'chip_type'=>$val['chip_type']
];
}
$chip['upgrade_cost']=\services\FormulaService::getChipUpgradeCost($chip['chip_grade']+1);
$this->_rspData(['data'=>$chip]);
}
public function selectChip(){
$token_id = trim(getReqVal('token_id', 0));
$token_ids = explode(' ',$token_id);
if (count($token_ids)<0){
$this->_rspErr(1, 'Please enter instructions');
return;
}
$chip_main = Chip::getChipByTokenId($token_ids[0]);
$chip_param = Chip::getChipByTokenId($token_ids[1]);
if ($chip_param['supper_state'] == 1 || $chip_param['inlay_state'] == 1 || $chip_param['state'] == -1){
$this->_rspErr(1, "The chip can't select");
return;
}
if ($chip_param['chip_grade']>$chip_main['chip_grade']){
$this->_rspErr(1, "The selected material is too high grade");
return;
}
if ($chip_param['state']){
Chip::update($token_ids[1],['state'=>0]);
$cost = 0;
}else{
Chip::update($token_ids[1],['state'=>1]);
$cost = \services\FormulaService::getChipCumulativeCost($chip_param['chip_grade']);
}
$this->_rspData(['data'=>$cost]);
}
public function syntheticChip(){
$token_id_main = trim(getReqVal('token_id_main', 0));
$token_id_param = getReqVal('token_id_param', 0);
if (! $token_id_main || ! $token_id_param) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
$chip_main = Chip::getChipByTokenId($token_id_main);
$upgrade_cost = \services\FormulaService::getChipUpgradeCost($chip_main['chip_grade']+1);
if ($upgrade_cost==0){
$this->_rspErr(1, 'Error in calculation formula');
return;
}
$cumulative_cost = 0;
foreach ($token_id_param as $val){
$chip_param = Chip::getChipByTokenId($val);
$cumulative_cost += \services\FormulaService::getChipCumulativeCost($chip_param['chip_grade']);
Chip::deleteChip(['token_id'=>$val]);
}
$num = round(round(($cumulative_cost/$upgrade_cost),5)*10000);
if ($num<rand(1,10000)){
//合成失败
$this->_rspErr(1, 'The chip Upgrade failed');
return;
}else{
//合成成功
$this->_upgraded($chip_main);
$chip_new = Chip::toDto(Chip::getChipByTokenId($token_id_main));
$chip_new['strength_temporary'] = \services\FormulaService::getChipPhysicalStrengthValue($chip_new['chip_grade'],$chip_new['lucky_final']+$chip_new['lucky_temporary']);
$this->_rspData(['data'=>$chip_new]);
}
}
public function isNeedLucky(){
$token_id = trim(getReqVal('token_id', 0));
if (! $token_id) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
$chip = Chip::getChipByTokenId($token_id);
$fieldsKv = [
'lucky_final'=>$chip['lucky_final']+$chip['lucky_temporary'],
'lucky_temporary'=>0,
'strength' => \services\FormulaService::getChipPhysicalStrengthValue($chip['chip_grade'],$chip['lucky_final']+$chip['lucky_temporary'])
];
Chip::update($chip['token_id'],$fieldsKv);
$this->_rspOk();
}
public function isNotNeedLucky(){
$token_id = trim(getReqVal('token_id', 0));
if (! $token_id) {
$this->_rspErr(1, 'Please enter instructions');
return;
}
$chip = Chip::getChipByTokenId($token_id);
$fieldsKv = [
'lucky_temporary'=>0,
];
Chip::update($chip['token_id'],$fieldsKv);
$this->_rspOk();
}
public function aKeySynthetic(){
}
public function test(){
$chip = Chip::getChipByTokenId(1660629360);
print_r($chip);
}
private function _doInlay($hero_id,$token_id){
@ -244,7 +391,7 @@ class ChipController extends BaseAuthedController
}
}
private function _orderByChipDesc($data,$limit){
private function _getHignGradeLimit($data,$limit){
$len = count($data);
if ($len<=1 || $len<=$limit){
return $data;
@ -259,7 +406,45 @@ class ChipController extends BaseAuthedController
}
}
return array_slice($data,0,$limit);
}
private function _orderByChip($data,$order){
$len = count($data);
if ($len<=1){
return $data;
}
if ($order == 'desc'){
for ($i = 0; $i < $len - 1; $i++) {
for ($j = $i + 1; $j < $len; $j++) {
if ($data[$i]['chip_grade'] < $data[$j]['chip_grade']) {
$tmp = $data[$i];
$data[$i] = $data[$j];
$data[$j] = $tmp;
}
}
}
}else{
for ($i = 0; $i < $len - 1; $i++) {
for ($j = $i + 1; $j < $len; $j++) {
if ($data[$i]['chip_grade'] > $data[$j]['chip_grade']) {
$tmp = $data[$i];
$data[$i] = $data[$j];
$data[$j] = $tmp;
}
}
}
}
return $data;
}
private function _upgraded($chip){
$new_grade = $chip['chip_grade']+1;
if ($new_grade == 3 || $new_grade == 5){
Chip::updateRandAttr($chip);
}
$lucky = \services\FormulaService::getChipLuckyValue($chip['chip_grade']);
$lucky_pro = \services\FormulaService::getChipLuckyValue($new_grade);
Chip::update($chip['token_id'],['lucky_temporary'=>$lucky_pro-$lucky, 'chip_grade'=>$new_grade]);
}
}

View File

@ -31,7 +31,8 @@ class Chip extends BaseModel
't_nft',
array(
'owner_address' => myself()->_getOpenId(),
'token_type' =>3
'token_type' =>3,
'deleted' => 0
)
);
foreach ($nft as $nftDb) {
@ -78,9 +79,9 @@ class Chip extends BaseModel
'type' => 2,
'val' => $attr['lv'.$row['chip_grade']]*$val['attr_pool_number'],
// 'chip_name' => $attr['chip_name'],
// 'chip_type' => $attr['chip_type'],
// 'attr_num' => $attr['lv'.$row['chip_grade']],
// 'attr_pool_num' => $val['attr_pool_number'],
'chip_type' => $attr['chip_type'],
'attr_num' => $attr['lv'.$row['chip_grade']],
'attr_pool_num' => $val['attr_pool_number'],
];
array_push($attrs,$newAttr);
}
@ -166,6 +167,17 @@ class Chip extends BaseModel
}
public static function update($token_id, $fieldsKv){
SqlHelper::update
(myself()->_getSelfMysql(),
't_chip',
array(
'token_id' => $token_id,
),
$fieldsKv
);
}
public static function updateChipInlayState($token_id,$state){
return SqlHelper::update(
myself()->_getSelfMysql(),
@ -186,4 +198,25 @@ class Chip extends BaseModel
)
);
}
public static function deleteChip($whereKv){
SqlHelper::update(
myself()->_getMarketMysql(),
't_nft',
$whereKv,
['deleted'=>1]
);
}
public static function updateRandAttr($chip){
$attr_pool = mt\ChipAttr::generateOneAttr($chip['chip_type']);
$rand_attr = emptyReplace(json_decode($chip['rand_attr'], true), array());
array_push($rand_attr,$attr_pool);
$fieldsKv = [
'chip_grade'=>$chip['chip_grade']+1,
'rand_attr'=>json_encode($rand_attr)
];
self::update($chip['token_id'],$fieldsKv);
}
}

View File

@ -5,6 +5,7 @@ namespace mt;
require_once('mt/AttrHelper.php');
require_once('mt/StrHelper.php');
require_once('mt/Item.php');
use phpcommon;
@ -83,27 +84,26 @@ class ChipAttr {
}
}
// public static function getChipValue($grade){
//// (self::_SIGN($grade,6,"<"))*(15*$grade*($grade-1)+10)
//
// }
//
// private static function _SIGN($grade,$n,$symbol){
// if ($symbol == '>'){
// if ($grade>$n){
// return 1;
// }else{
// return 0;
// }
// }
// if ($symbol == '<'){
// if ($grade<$n){
// return 1;
// }else{
// return 0;
// }
// }
// }
public static function generateOneAttr($type){
// $itemMeta = Item::get($item_id);
// return self::getAttrPool(self::getAttrByItemId($itemMeta['id']));
// $attr_pool = self::getAttrPool(self::getAttrByItemId($itemMeta['id']));
// $attr = emptyReplace(json_decode($chip['rand_attr'], true), array());
// array_push($attr,$attr_pool);
// return $attr;
if ($type == self::ROLE_CHIP_SUBTYPE){
$chip = self::getNodeChip();
$attr = $chip[ array_rand($chip)];
return self::getAttrPool($attr);
}
if ($type == self::GUN_CHIP_SUBTYPE){
$chip = self::getGunChip();
$attr = $chip[ array_rand($chip)];
return self::getAttrPool($attr);
}
return array();
}
private static function _randomNum($itemMeta,$chip_grade,$chipList){
$attr_pool = array();

View File

@ -15,7 +15,7 @@ class StrHelper {
return $values;
}
private function parse($data, $separators, $i, &$arr) {
private static function parse($data, $separators, $i, &$arr) {
$strs = explode($separators[$i], $data);
foreach ($strs as $str) {
if ($i + 1 < count($separators)) {

View File

@ -271,4 +271,36 @@ class FormulaService extends BaseService {
return 0;
}
public static function getCegDiscountRate(){
//CEG_Discount_Rate=ROUND(CEG_Dynamic_Index /( CEG_Dynamic_Price / CEG_Base_Price),3)
return 1;
}
//芯片升星累计成本
public static function getChipCumulativeCost($grade){
//( SIGN(芯片星级<6)*(15*芯片星级*(芯片星级-1)+10)+SIGN(芯片星级>5)*SIGN(芯片星级<10)*(80*(芯片星级-4)*( 芯片星级-3)+50) +SIGN(芯片星级>9)*SIGN(芯片星级<14)*(370*(芯片星级-8)*( 芯片星级-7)*(2*芯片星级-15)/6+80*(芯片星级-8)+2100) +SIGN(芯片星级>13)*SIGN(芯片星级<16)*(600*(芯片星级-8)*(芯片星级-7)*(2*芯片星级-15)/6-14000)) *CEG_Discount_Rate
return (($grade<6?1:0)*(15*$grade*($grade-1)+10)+($grade>5?1:0)*($grade<10?1:0)*(80*($grade-4)*( $grade-3)+50) +($grade>9?1:0)*($grade<14?1:0)*(370*($grade-8)*( $grade-7)*(2*$grade-15)/6+80*($grade-8)+2100) +($grade>13?1:0)*($grade<16?1:0)*(600*($grade-8)*($grade-7)*(2*$grade-15)/6-14000)) *1;
//( SIGN(芯片星级<6)*((15*芯片星级+10)*(芯片星级-1)+10)+SIGN(芯片星级>5)*SIGN(芯片星级<10)*(80*(芯片星级-4)*( 芯片星级-3)+90) +SIGN(芯片星级>9)*SIGN(芯片星级<14)*(370*(芯片星级-8)*( 芯片星级-7)*(2*芯片星级-15)/6+80*(芯片星级-8)+2140) +SIGN(芯片星级>13)*SIGN(芯片星级<16)*(600*(芯片星级-8)*(芯片星级-7)*(2*芯片星级-15)/6-13960)) *CEG_Discount_Rate
/* return (($grade<6?1:0)*((15*$grade+10)*($grade-1)+10)+($grade>5?1:0)*($grade<10?1:0)*(80*($grade-4)*($grade-3)+90)+($grade>9?1:0)*($grade<14?1:0)*(370*($grade-8)*($grade-7)*(2*$grade-15)/6+80*($grade-8)+2140)+($grade>13?1:0)*($grade<16?1:0)*(600*($grade-8)*($grade-7)*(2*$grade-15)/6-13960))*self::getCegDiscountRate();*/
}
//芯片升星成本
public static function getChipUpgradeCost($grade){
//(SIGN(芯片星级=1)*10+SIGN(芯片星级<6)*SIGN(芯片星级>1)*(30*(芯片星级-1))+SIGN(芯片星级>5)*SIGN(芯片星级<10)*(160*(芯片星级-4))-SIGN(芯片星级=6)*100+SIGN(芯片星级>9)*SIGN(芯片星级<14)*(370*(芯片星级-8)^2+80)+SIGN(芯片星级=10)*100 +SIGN(芯片星级>13)*SIGN(芯片星级<16)*(600*(芯片星级-8)^2)-SIGN(芯片星级=14)*3850) *CEG_Discount_Rate
return (($grade==1?1:0)*10+($grade<6?1:0)*($grade>1?1:0)*(30*($grade-1))+($grade>5?1:0)*($grade<10?1:0)*(160*($grade-4))-($grade==6?1:0)*100+($grade>9?1:0)*($grade<14?1:0)*(370*($grade-8)*($grade-8)+80)+($grade==10?1:0)*100+($grade>13?1:0)*($grade<16?1:0)*(600*($grade-8)*($grade-8))-($grade==14?1:0)*3850)*self::getCegDiscountRate();
}
public static function getChipLuckyValue($grade){
//芯片幸运值=SIGN(芯片星数>4)*ROUND( 0.00419*芯片星数^5-0.0705*芯片星数^4 +0.24*芯片星数^3 +8.5*芯片星数^2-39.9*芯片星数+38,1)
return ($grade>4?1:0)*round(0.00419*pow($grade,5)-0.0705*pow($grade,4)+0.24*pow($grade,3)+8.5*pow($grade,2)-39.9*$grade+38,1);
}
public static function getChipPhysicalStrengthValue($grade,$lucky){
//芯片体力值命名Hero_Chip_NFT_Maximum_Physical_Strength = SIGN(英雄芯片NFT星数>4)*( 英雄芯片NFT幸运值*ROUND(1+0.04*英雄芯片NFT星数,3))
return ($grade>4?1:0)*($lucky*round(1+0.04*$grade,3));
}
}