diff --git a/sql/gamedb.sql b/sql/gamedb.sql index 45c6fb5..29f9ee0 100644 --- a/sql/gamedb.sql +++ b/sql/gamedb.sql @@ -456,6 +456,7 @@ CREATE TABLE `solo` ( `lastoffline` int(11) NOT NULL DEFAULT '0' COMMENT '上次计算离线收益时间戳', `offline` int(11) NOT NULL DEFAULT '0' COMMENT '已计算离线时长(小时)', `gamelevel` mediumblob NOT NULL COMMENT '关卡信息', + `funds` mediumblob NOT NULL COMMENT '基金', `create_time` int(11) NOT NULL DEFAULT '0' COMMENT '创建时间', `modify_time` int(11) NOT NULL DEFAULT '0' COMMENT '修改时间', PRIMARY KEY (`idx`), diff --git a/webapp/controller/RechargeController.class.php b/webapp/controller/RechargeController.class.php index 04eda13..487166c 100644 --- a/webapp/controller/RechargeController.class.php +++ b/webapp/controller/RechargeController.class.php @@ -852,6 +852,105 @@ class RechargeController ) ); } + } else { + //等级基金,关卡基金,体力基金 + $solorow = $conn->execQueryOne( + 'SELECT funds FROM solo WHERE accountid=:accountid;', + array( + ':accountid' => $account_id + ) + ); + + $funds = array(); + $fundsname = 'shop_' . $goodsid; + if (!$solorow || is_null($solorow['funds']) || empty($solorow['funds'])) { + $funds = array( + "playerlevel" => array( + "hit" => 0, + "details" => array( + "free" => array(), + ), + ), + "gamelevel" => array( + "hit" => 0, + "details" => array( + "free" => array(), + ), + ), + "medalcost" => array( + "hit" => 0, + "sum" => 0, + "details" => array( + "free" => array(), + ), + ), + ); + switch ($shopgoods['type']) { + case 5; + $funds['playerlevel']['details'][$fundsname] = array(); + break; + case 7; + $funds['gamelevel']['details'][$fundsname] = array(); + break; + case 8; + $funds['medalcost']['details'][$fundsname] = array(); + break; + } + } else { + $funds = json_decode($solorow['funds'], true); + switch ($shopgoods['type']) { + case 5; + for ($id = 1; $id <= $funds['playerlevel']['hit']; $id++) { + $funds['playerlevel']['details'][$fundsname][] = $id; + } + break; + case 7; + for ($id = 1; $id <= $funds['gamelevel']['hit']; $id++) { + $funds['gamelevel']['details'][$fundsname][] = $id; + } + break; + case 8; + for ($id = 1; $id <= $funds['medalcost']['hit']; $id++) { + $funds['medalcost']['details'][$fundsname][] = $id; + } + break; + } + } + + if (!$solorow) { + $privilege = new classes\Privilege(); + $medals = metatable\getParameterById(MEDAL_LIMIT) + $privilege->getMedalLimitPlus($account_id); + $gamelevel = array( + 'curlevel' => 1, + 'curwave' => 0, + 'levelinfo' => array(), + ); + $ret = $conn->execScript( + 'INSERT INTO solo(accountid, level, exp, medals, lastredeem, lastoffline, gamelevel, funds, create_time, modify_time) ' . + ' VALUES(:account_id, 1, 0, :medals, :lastredeem, :lastoffline, :gamelevel, :funds, :create_time, :modify_time) ' . + ' ON DUPLICATE KEY UPDATE accountid=:account_id, level=1, exp=0, medals=:medals, lastredeem=:lastredeem, lastoffline=:lastoffline, gamelevel=:gamelevel, funds=:funds, modify_time=:modify_time;', + array( + ':account_id' => $account_id, + ':medals' => $medals, + ':lastredeem' => $nowtime, + ':lastoffline' => $nowtime, + ':gamelevel' => json_encode($gamelevel), + ':funds' => json_encode($funds), + ':create_time' => $nowtime, + ':modify_time' => $nowtime + ) + ); + } else { + $ret = $conn->execScript( + 'UPDATE solo SET funds=:funds, modify_time=:modify_time' . + ' WHERE accountid=:accountid;', + array( + ':accountid' => $account_id, + ':funds' => json_encode($funds), + ':modify_time' => time() + ) + ); + } } echo json_encode(array( diff --git a/webapp/controller/SoloController.class.php b/webapp/controller/SoloController.class.php index 1fc9343..fcec062 100644 --- a/webapp/controller/SoloController.class.php +++ b/webapp/controller/SoloController.class.php @@ -44,6 +44,24 @@ class SoloController return array_key_exists($level, $conf) ? $conf[$level] : null; } + protected function getPlayerLevelFundInfo() + { + $conf = require('../res/levelfund@levelfundaccount.php'); + return $conf; + } + + protected function getGameLevelFundInfo() + { + $conf = require('../res/levelfund@levelfundgame.php'); + return $conf; + } + + protected function getMedalCostFundInfo() + { + $conf = require('../res/levelfund@levelfundstamina.php'); + return $conf; + } + public function soloInfo() { $account_id = $_REQUEST['account_id']; @@ -78,18 +96,41 @@ class SoloController 'curwave' => 0, 'levelinfo' => array(), ); + $funds = array( + "playerlevel" => array( + "hit" => 0, + "details" => array( + "free" => array(), + ), + ), + "gamelevel" => array( + "hit" => 0, + "details" => array( + "free" => array(), + ), + ), + "medalcost" => array( + "hit" => 0, + "sum" => 0, + "details" => array( + "free" => array(), + ), + ), + ); $offlinehours = 0; if (!$solorow) { $medals = $medalsgrowlimit; $ret = $conn->execScript( - 'INSERT INTO solo(accountid, level, exp, medals, lastredeem, lastoffline, create_time, modify_time) ' . - ' VALUES(:account_id, 1, 0, :medals, :lastredeem, :lastoffline, :create_time, :modify_time) ' . - ' ON DUPLICATE KEY UPDATE accountid=:account_id, level=:level, exp=:exp, medals=:medals, lastredeem=:lastredeem, lastoffline=:lastoffline, modify_time=:modify_time;', + 'INSERT INTO solo(accountid, level, exp, medals, lastredeem, lastoffline, gamelevel, funds, create_time, modify_time) ' . + ' VALUES(:account_id, 1, 0, :medals, :lastredeem, :lastoffline, :gamelevel, :funds, :create_time, :modify_time) ' . + ' ON DUPLICATE KEY UPDATE accountid=:account_id, level=1, exp=0, medals=:medals, lastredeem=:lastredeem, lastoffline=:lastoffline, gamelevel=:gamelevel, funds=:funds, modify_time=:modify_time;', array( ':account_id' => $account_id, ':medals' => $medals, ':lastredeem' => $lastredeem, ':lastoffline' => $nowtime, + ':gamelevel' => json_encode($gamelevel), + ':funds' => json_encode($funds), ':create_time' => $nowtime, ':modify_time' => $nowtime ) @@ -143,6 +184,10 @@ class SoloController if (!is_null($solorow['gamelevel']) && !empty($solorow['gamelevel'])) { $gamelevel = json_decode($solorow['gamelevel']); } + + if (!is_null($solorow['funds']) && !empty($solorow['funds'])) { + $funds = json_decode($solorow['funds']); + } } $upexp = 0; @@ -161,7 +206,8 @@ class SoloController 'medal_limit' => $medalsgrowlimit, 'lastredeem' => $lastredeem, 'offlinehours' => $offlinehours, - 'gamelevel' => $gamelevel + 'gamelevel' => $gamelevel, + 'funds' => $funds, )); } @@ -362,16 +408,16 @@ class SoloController } $awardarr = explode($waveawardarr[$key], ';'); - foreach($awardarr as $awarditem) { + foreach ($awardarr as $awarditem) { $strs = explode($awarditem, ':'); if (count($strs) < 2) { continue; } - $item_list[]=array( + $item_list[] = array( 'item_id' => $strs[0], 'item_num' => $strs[1], - "time" => 0, + "time" => 0, ); } @@ -437,6 +483,158 @@ class SoloController { $this->levelaward(false); } + // 基金奖励 + public function fundsAward() + { + $account_id = $_REQUEST['account_id']; + //登录校验 + $login = loginVerify($account_id, $_REQUEST['session_id']); + if (!$login) { + phpcommon\sendError(ERR_USER_BASE + 1, 'session无效'); + return; + } + $conn = $this->getMysql($account_id); + if (!$conn) { + phpcommon\sendError(ERR_USER_BASE + 1, '没有这个玩家'); + return; + } + + $fundstype = $_REQUEST['type']; + $fundsname = $_REQUEST['name']; + $fundsid = $_REQUEST['id']; + if ($fundstype < 1 || $fundstype > 3) { + phpcommon\sendError(ERR_USER_BASE + 1, '基金不存在'); + return; + } + + $solorow = $conn->execQueryOne( + 'SELECT * FROM solo WHERE accountid=:accountid;', + array( + ':accountid' => $account_id + ) + ); + + if (!$solorow) { + phpcommon\sendError(ERR_USER_BASE + 1, '没有这个玩家 1'); + return; + } + + if (is_null($solorow['funds']) || empty($solorow['funds'])) { + phpcommon\sendError(ERR_USER_BASE + 1, '基金不存在 1'); + return; + } + + $funds = json_decode($solorow['funds'], true); + $details = array(); + $fundscfg = array(); + switch ($fundstype) { + case 1: + $details = &$funds['playerlevel']['details']; + $fundscfg = $this->getPlayerLevelFundInfo(); + break; + case 2: + $details = &$funds['gamelevel']['details']; + $fundscfg = $this->getGameLevelFundInfo(); + break; + case 3: + $details = &$funds['medalcost']['details']; + $fundscfg = $this->getMedalCostFundInfo(); + break; + } + + if (!array_key_exists($fundsname, $details)) { + phpcommon\sendError(ERR_USER_BASE + 1, '基金不存在 2'); + return; + } + + $found = false; + foreach ($details[$fundsname] as &$id) { + if ($id == $fundsid) { + $found = true; + unset($id); + break; + } + } + + if (!$found) { + phpcommon\sendError(ERR_USER_BASE + 1, '基金不存在 3'); + return; + } + + if (!array_key_exists($fundsid, $fundscfg)) { + phpcommon\sendError(ERR_USER_BASE + 1, '基金不存在 4'); + return; + } + + if (!array_key_exists($fundsname, $fundscfg[$fundsid])) { + phpcommon\sendError(ERR_USER_BASE + 1, '基金不存在 5'); + return; + } + + $ret = $conn->execScript( + 'UPDATE solo SET funds=:funds, modify_time=:modify_time' . + ' WHERE accountid=:accountid;', + array( + ':accountid' => $account_id, + ':funds' => json_encode($funds), + ':modify_time' => time() + ) + ); + + if (!$ret) { + phpcommon\sendError(ERR_RETRY + 1, '系统繁忙'); + return; + } + + $awardstrs = explode($fundscfg[$fundsid][$fundsname], '|'); + $item_list = array(); + foreach($awardstrs as $awarditem) { + $strs = explode($awarditem, ':'); + if (count($strs) < 2) { + continue; + } + + $item_list[] = array( + 'item_id' => $strs[0], + 'item_num' => $strs[1], + "time" => 0, + ); + } + + $addreward = new classes\AddReward(); + $all_item_list = array(); + foreach ($item_list as $itemaward) { + $items = $addreward->addReward($itemaward['item_id'], $itemaward['item_num'], $account_id, 0, 0); + foreach ($items as $i) { + array_push($all_item_list, array( + 'item_id' => $i['item_id'], + 'item_num' => $i['item_num'], + 'time' => 0, + )); + } + } + + $coin_num = $addreward->getCoinNum($account_id); + $diamond_num = $addreward->getDiamondNum($account_id); + $adfree = $addreward->getAdfree($account_id); + $medals = $addreward->getMedals($account_id); + + $response = array( + 'errcode' => 0, + 'errmsg' => '', + 'type' => $fundstype, + 'name' => $fundsname, + 'id' => $fundsid, + 'coin_nums' => $coin_num, + 'diamond_nums' => $diamond_num, + 'adfree' => $adfree, + 'medals' => $medals, + 'item_list' => $item_list, + 'all_item_list' => $all_item_list, + ); + + echo json_encode($response); + } protected function levelaward($isbattle) { @@ -508,7 +706,8 @@ class SoloController return; } - if ($reqlevelcfg['medal_cost'] > $solorow['medals']) { + $medalcost = $reqlevelcfg['medal_cost']; + if ($medalcost > $solorow['medals']) { phpcommon\sendError(ERR_USER_BASE + 2, '体力不足'); return; } @@ -577,7 +776,7 @@ class SoloController } // cost medals, add exp - $curexp = $solorow['exp'] + $reqlevelcfg['medal_cost']; + $curexp = $solorow['exp'] + $medalcost; $curlv = $solorow['level']; $curlvcfg = $this->getPlayerLevelInfo($curlv); $uplv_item_list = array(); @@ -601,7 +800,7 @@ class SoloController } } - $curmedals = $solorow['medals'] - $reqlevelcfg['medal_cost']; + $curmedals = $solorow['medals'] - $medalcost; $lastredeem = $solorow['lastredeem']; $privilege = new classes\Privilege(); $medalsgrowlimit = metatable\getParameterById(MEDAL_LIMIT) + $privilege->getMedalLimitPlus($account_id); @@ -609,8 +808,10 @@ class SoloController $lastredeem = time(); } + $funds = json_decode($solorow['funds'], true); + $this->updateFunds($curlv, $level, $medalcost, $funds); $ret = $conn->execScript( - 'UPDATE solo SET medals=:medals, lastredeem=:lastredeem, level=:level, exp=:exp, gamelevel=:gamelevel, modify_time=:modify_time' . + 'UPDATE solo SET medals=:medals, lastredeem=:lastredeem, level=:level, exp=:exp, gamelevel=:gamelevel, funds=:funds, modify_time=:modify_time' . ' WHERE accountid=:accountid;', array( ':accountid' => $account_id, @@ -619,6 +820,7 @@ class SoloController ':level' => $curlv, ':exp' => $curexp, ':gamelevel' => json_encode($gamelevel), + ':funds' => $funds, ':modify_time' => time() ) ); @@ -678,4 +880,69 @@ class SoloController } echo json_encode($response); } + + protected function updateFunds($playerlevel, $gamelevel, $medalcost, &$funds) + { + $accountfundcfg = $this->getPlayerLevelFundInfo(); + foreach ($accountfundcfg as $cfgitem) { + $newhit = $cfgitem['id']; + if ($newhit <= $funds['playerlevel']['hit']) { + continue; + } + + if ($cfgitem['level'] > $playerlevel) { + break; + } + + if ($newhit > $funds['playerlevel']['hit']) { + $funds['playerlevel']['hit'] = $newhit; + } + + foreach ($funds['playerlevel']['details'] as $key => $fundsitem) { + $funds['playerlevel']['details'][$key][] = $newhit; + } + } + + $gamefundcfg = $this->getGameLevelFundInfo(); + foreach ($gamefundcfg as $cfgitem) { + $newhit = $cfgitem['id']; + if ($newhit <= $funds['gamelevel']['hit']) { + continue; + } + + if ($cfgitem['level'] > $gamelevel) { + break; + } + + if ($newhit > $funds['gamelevel']['hit']) { + $funds['gamelevel']['hit'] = $newhit; + } + + foreach ($funds['gamelevel']['details'] as $key => $fundsitem) { + $funds['gamelevel']['details'][$key][] = $newhit; + } + } + + $medalcostfundcfg = $this->getMedalCostFundInfo(); + $cursum = $funds['medalcost']['sum'] + $medalcost; + $funds['medalcost']['sum'] = $cursum; + foreach ($medalcostfundcfg as $cfgitem) { + $newhit = $cfgitem['id']; + if ($newhit <= $funds['medalcost']['hit']) { + continue; + } + + if ($cfgitem['stamina'] > $cursum) { + break; + } + + if ($newhit > $funds['medalcost']['hit']) { + $funds['medalcost']['hit'] = $newhit; + } + + foreach ($funds['medalcost']['details'] as $key => $fundsitem) { + $funds['medalcost']['details'][$key][] = $newhit; + } + } + } }