|
@@ -11,6 +11,8 @@ namespace loyalsoft;
|
|
|
*/
|
|
|
class TaskProc {
|
|
|
|
|
|
+ const TaskCardShop_Refresh_ItemNum = 5;
|
|
|
+
|
|
|
static function procMain($req) {
|
|
|
switch ($req->cmd) {
|
|
|
case CmdCode::cmd_task_getInfo: # 6201 刷新任务状态
|
|
@@ -38,14 +40,137 @@ class TaskProc {
|
|
|
return self::OnKillMonsterEvent($req);
|
|
|
|
|
|
case CmdCode::cmd_taskCard_active: # 6215 激活任务卡
|
|
|
-
|
|
|
+ return self::OnTaskCard_active($req);
|
|
|
case CmdCode::cmd_taskCard_reward: # 6216 领取任务卡奖励
|
|
|
-
|
|
|
+ return self::OnTaskCard_reward($req);
|
|
|
+// -------------- 任务卡商城 -----------------------------
|
|
|
+ case CmdCode::cmd_taskcard_shop_open: # 6231 任务卡商店 - 开启
|
|
|
+ return self::OnTaskCardShopOpen($req);
|
|
|
+ case CmdCode::cmd_taskcard_shop_buy: # 6232 任务卡商店 - 购买
|
|
|
+ return self::OnTaskCardShopBuy($req);
|
|
|
+ case CmdCode::cmd_taskcard_shop_refresh: # 6233 任务卡商店 - 手动刷新
|
|
|
+ return self::OnTaskCardShopRefresh($req);
|
|
|
default:
|
|
|
return Err(ErrCode::cmd_err);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // <editor-fold defaultstate="collapsed" desc=" 任务卡商店">
|
|
|
+
|
|
|
+ /**
|
|
|
+ * [6231] 任务卡商店 - 开启
|
|
|
+ * @param req $req
|
|
|
+ */
|
|
|
+ static function OnTaskCardShopOpen($req) {
|
|
|
+ $userInfo = $req->userInfo->game;
|
|
|
+ if (null == $userInfo->taskCardShop) { # 防御
|
|
|
+ $userInfo->taskCardShop = new Info_TaskCard_Shop();
|
|
|
+ }
|
|
|
+ $nextTs = $userInfo->taskCardShop->lastRefreshTs + GameConfig::globalsettings()->TaskCardShop_Refresh_TS;
|
|
|
+ if ($nextTs <= now()) { # 已经到达刷新时间, 刷新任务卡
|
|
|
+ $arr = (array) GameConfig::taskcard_shop(); # 奖池配置
|
|
|
+ $arr = self::FilterPrizepool($req, $arr); # 利用玩家等级进行过滤
|
|
|
+ $rewardStr = "";
|
|
|
+ $err = self::Dice($arr, self::TaskCardShop_Refresh_ItemNum, $rewardStr); # 获得随机结果
|
|
|
+ my_Assert(ErrCode::ok == $err, $err);
|
|
|
+
|
|
|
+ $userInfo->taskCardShop->curCards = $rewardStr; # 更新任务卡列表
|
|
|
+ $req->userInfo->game = $userInfo;
|
|
|
+ UserProc::updateUserInfo(); # 回写玩家数据
|
|
|
+ }
|
|
|
+ return \Resp::ok(array('taskCardShop' => $userInfo->taskCardShop)); # 返回最新任务卡列表
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * [6232] 任务卡商店 - 购买
|
|
|
+ * @param req $req
|
|
|
+ */
|
|
|
+ static function OnTaskCardShopBuy($req) {
|
|
|
+ list($typeId, $num) = $req->paras; # 提取参数: 任务卡类型ID,数量(暂时默认为1)
|
|
|
+ $shopItemMo = GameConfig::taskcard_shop_getItem($typeId);
|
|
|
+ my_Assert(null != $shopItemMo, ErrCode::err_const_no); # 常量异常
|
|
|
+ my_Assert($num == 1, ErrCode::paras_err); # 数量异常
|
|
|
+ my_Assert($shopItemMo->pricetype == 1, ErrCode::pay_m_type_err); # 定价类型异常
|
|
|
+ $userInfo = $req->userInfo->game;
|
|
|
+ my_Assert($userInfo->Consume_Cash($userInfo, $shopItemMo->price), ErrCode::notenough_cash_msg); # 扣除费用
|
|
|
+ $cid = StoreProc::PutTaskCardInStore($typeId, $req); # 添加任务卡到背包
|
|
|
+ NormalEventProc::OnTaskBag_new_Card($cid, $num); # 播放获得任务卡事件
|
|
|
+ return Resp::ok(array('store' => $req->userInfo->game->store)); # 返回成功
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * [6233] 任务卡商店 - 手动刷新
|
|
|
+ * @param req $req
|
|
|
+ */
|
|
|
+ public static function OnTaskCardShopRefresh($req) {
|
|
|
+ $cost = GameConfig::globalsettings()->TaskCardShop_Refresh_Cash; # 消耗
|
|
|
+ $userInfo = $req->userInfo->game;
|
|
|
+ my_Assert($userInfo->Consume_Cash($userInfo, $cost), ErrCode::notenough_cash_msg); # 扣除费用
|
|
|
+ // 刷新任务卡
|
|
|
+ $arr = (array) GameConfig::taskcard_shop(); # 奖池配置
|
|
|
+ $arr = self::FilterPrizepool($req, $arr); # 利用玩家等级进行过滤
|
|
|
+ $rewardStr = "";
|
|
|
+ $err = self::Dice($arr, self::TaskCardShop_Refresh_ItemNum, $rewardStr); # 获得随机结果
|
|
|
+ my_Assert(ErrCode::ok == $err, $err);
|
|
|
+ if (null == $userInfo->taskCardShop) { # 防御
|
|
|
+ $userInfo->taskCardShop = new Info_TaskCard_Shop();
|
|
|
+ }
|
|
|
+ $userInfo->taskCardShop->curCards = $rewardStr; # 更新任务卡列表
|
|
|
+ $req->userInfo->game = $userInfo;
|
|
|
+ UserProc::updateUserInfo(); # 回写玩家数据
|
|
|
+ return \Resp::ok(array('taskCardShop' => $userInfo->taskCardShop)); # 返回最新任务卡列表
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 过滤奖池
|
|
|
+ * @param Req $req
|
|
|
+ * @param array $arr 奖池
|
|
|
+ */
|
|
|
+ static function FilterPrizepool($req, $arr) {
|
|
|
+ # 等级限制
|
|
|
+ $ret = array_filter($arr, function ($value) use($req) {
|
|
|
+ return($req->userInfo->game->baseInfo->level >= $value->unlock_level);
|
|
|
+ });
|
|
|
+ return $ret;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 投骰子
|
|
|
+ * @param assoc_array $arr 抽奖物品概率
|
|
|
+ * @param int $number 连抽次数
|
|
|
+ * @return string itemid,num;itemid,num;...
|
|
|
+ */
|
|
|
+ static function Dice($arr, $number, &$rewardstr) {
|
|
|
+ $max = 0; # 计算物品权重总和
|
|
|
+ array_walk($arr, function ($value) use(&$max) {
|
|
|
+ $max += $value->probability;
|
|
|
+ });
|
|
|
+ if (!$max) { # 配置数据有问题
|
|
|
+ return ErrCode::err_const_no;
|
|
|
+ }
|
|
|
+ $reward = ArrayInit();
|
|
|
+ for ($i = 0; $i < $number; $i++) {
|
|
|
+ $rnd = CommUtil::random(1, $max); # 投骰子
|
|
|
+ $start = 0;
|
|
|
+ $rew = null;
|
|
|
+ foreach ($arr as $item) { # 循环判断落入那个物品上
|
|
|
+ if ($start < $rnd && $rnd <= $start + $item->probability) { # 落入区间
|
|
|
+ $rew = $item; # 记录物品
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ $start += $item->probability; # 继续判断是否落入下一物品的区间
|
|
|
+ } # foreach end
|
|
|
+ if (!$rew) {
|
|
|
+ return ErrCode::lottery_noselecteditem;
|
|
|
+ }
|
|
|
+ $reward[] = $rew->typeId;
|
|
|
+ } # for end
|
|
|
+ $rewardstr = implode(',', $reward);
|
|
|
+ return ErrCode::ok;
|
|
|
+ }
|
|
|
+
|
|
|
+ //
|
|
|
+// </editor-fold>
|
|
|
// <editor-fold defaultstate="collapsed" desc=" 任务卡接口">
|
|
|
//
|
|
|
|