|
@@ -11,6 +11,14 @@ namespace loyalsoft;
|
|
|
*/
|
|
|
class TaskProc {
|
|
|
|
|
|
+ /**
|
|
|
+ * 任务卡-同时激活数量上限
|
|
|
+ */
|
|
|
+ const TaskCard_ActiveMax = 9;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 任务卡商店-刷新数量
|
|
|
+ */
|
|
|
const TaskCardShop_Refresh_ItemNum = 5;
|
|
|
|
|
|
static function procMain($req) {
|
|
@@ -76,6 +84,7 @@ class TaskProc {
|
|
|
$err = self::Dice($arr, self::TaskCardShop_Refresh_ItemNum, $reward); # 获得随机结果
|
|
|
my_Assert(ErrCode::ok == $err, $err);
|
|
|
$userInfo->taskCardShop->curCards = $reward; # 更新任务卡列表
|
|
|
+ $userInfo->taskCardShop->selled = array();
|
|
|
$req->userInfo->game = $userInfo;
|
|
|
UserProc::updateUserInfo(); # 回写玩家数据
|
|
|
}
|
|
@@ -92,29 +101,32 @@ class TaskProc {
|
|
|
my_Assert(null != $shopItemMo, ErrCode::err_const_no); # 常量异常
|
|
|
my_Assert($num == 1, ErrCode::paras_err); # 数量异常
|
|
|
$userInfo = $req->userInfo->game;
|
|
|
+ $userInfo->taskCardShop = new Info_TaskCard_Shop($userInfo->taskCardShop);
|
|
|
+ my_Assert(!in_array($typeId, $userInfo->taskCardShop->selled, $err), ErrCode::taskCard_selled);
|
|
|
switch ($shopItemMo->pricetype) {
|
|
|
- case 0: # 人民币
|
|
|
+ case 0: # 人民币
|
|
|
Err(ErrCode::err_method_notimplement);
|
|
|
// my_Assert(Data_UserGame::Consume_Cash($userInfo->baseInfo, $shopItemMo->price), ErrCode::notenough_cash_msg); # 扣除费用
|
|
|
break;
|
|
|
- case 1: # 钻石
|
|
|
+ case 1: # 钻石
|
|
|
my_Assert(Data_UserGame::Consume_Cash($userInfo->baseInfo, $shopItemMo->price), ErrCode::notenough_cash_msg); # 扣除费用
|
|
|
break;
|
|
|
- case 2: # 金币
|
|
|
+ case 2: # 金币
|
|
|
my_Assert(Data_UserGame::Consume_Gold($userInfo->baseInfo, $shopItemMo->price), ErrCode::notenough_gold_msg); # 扣除费用
|
|
|
break;
|
|
|
- default:
|
|
|
- Err(ErrCode::pay_m_type_err); # 定价类型异常
|
|
|
+ default: # 其它
|
|
|
+ Err(ErrCode::pay_m_type_err); # 定价类型异常
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
$cid = StoreProc::PutTaskCardInStore($typeId, $req); # 添加任务卡到背包
|
|
|
+ $userInfo->taskCardShop->selled[] = $typeId; # 添加售罄记录
|
|
|
UserProc::updateUserInfo();
|
|
|
NormalEventProc::OnTaskBag_new_Card($cid, $num); # 播放获得任务卡事件
|
|
|
return Resp::ok(array(
|
|
|
'gold' => $req->userInfo->game->baseInfo->gold,
|
|
|
'cash' => $req->userInfo->game->baseInfo->cash,
|
|
|
- 'store' => $req->userInfo->game->store)); # 返回成功
|
|
|
+ 'store' => $req->userInfo->game->store)); # 返回成功
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -130,18 +142,19 @@ class TaskProc {
|
|
|
$arr = (array) GameConfig::taskcard_shop(); # 奖池配置
|
|
|
$arr = self::FilterPrizepool($req, $arr); # 利用玩家等级进行过滤
|
|
|
$reward = ArrayInit();
|
|
|
- $err = self::Dice($arr, self::TaskCardShop_Refresh_ItemNum, $reward); # 获得随机结果
|
|
|
+ $err = self::Dice($arr, self::TaskCardShop_Refresh_ItemNum, $reward); # 获得随机结果
|
|
|
my_Assert(ErrCode::ok == $err, $err);
|
|
|
- if (null == $userInfo->taskCardShop) { # 防御
|
|
|
- $userInfo->taskCardShop = new Info_TaskCard_Shop();
|
|
|
- }
|
|
|
- $userInfo->taskCardShop->curCards = $reward; # 更新任务卡列表
|
|
|
+// if (null == $userInfo->taskCardShop) { # 防御
|
|
|
+ $userInfo->taskCardShop = new Info_TaskCard_Shop($userInfo->taskCardShop);
|
|
|
+// }
|
|
|
+ $userInfo->taskCardShop->curCards = $reward; # 更新任务卡列表
|
|
|
+ $userInfo->taskCardShop->selled = array();
|
|
|
$req->userInfo->game = $userInfo;
|
|
|
UserProc::updateUserInfo(); # 回写玩家数据
|
|
|
return Resp::ok(array(
|
|
|
'gold' => $req->userInfo->game->baseInfo->gold,
|
|
|
'cash' => $req->userInfo->game->baseInfo->cash,
|
|
|
- 'taskCardShop' => $userInfo->taskCardShop)); # 返回最新任务卡列表
|
|
|
+ 'taskCardShop' => $userInfo->taskCardShop)); # 返回最新任务卡列表
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -150,9 +163,8 @@ class TaskProc {
|
|
|
* @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($req->userInfo->game->baseInfo->level >= $value->unlock_level); # 等级限制
|
|
|
});
|
|
|
return $ret;
|
|
|
}
|
|
@@ -168,11 +180,9 @@ class TaskProc {
|
|
|
array_walk($arr, function ($value) use(&$max) {
|
|
|
$max += $value->probability;
|
|
|
});
|
|
|
- if (!$max) { # 配置数据有问题
|
|
|
- return ErrCode::err_const_no;
|
|
|
- }
|
|
|
+ my_Assert($max > 0, ErrCode::err_const_no); # 配置数据有问题
|
|
|
$reward = ArrayInit();
|
|
|
- for ($i = 0; $i < $number; $i++) {
|
|
|
+ for ($i = 0; $i < $number;) {
|
|
|
$rnd = CommUtil::random(1, $max); # 投骰子
|
|
|
$start = 0;
|
|
|
$rew = null;
|
|
@@ -186,9 +196,11 @@ class TaskProc {
|
|
|
if (!$rew) {
|
|
|
return ErrCode::lottery_noselecteditem;
|
|
|
}
|
|
|
- $reward[] = $rew->typeId;
|
|
|
- } # for end
|
|
|
-// $rewardstr = implode(',', $reward);
|
|
|
+ if (!in_array($rew->typeId, $reward)) { # 去除重复卡
|
|
|
+ $reward[] = $rew->typeId;
|
|
|
+ $i++;
|
|
|
+ }
|
|
|
+ } # for end
|
|
|
return ErrCode::ok;
|
|
|
}
|
|
|
|
|
@@ -280,10 +292,21 @@ class TaskProc {
|
|
|
|
|
|
my_Assert($taskCard->state <= Enum_TaskCardStateType::notopen, ErrCode::taskCard_state); # 任务卡状态异常
|
|
|
my_Assert(true != self::FindSameIngCard($taskCard->typeId), ErrCode::taskCard_active_multi); # 不可激活多张任务卡
|
|
|
+ my_Assert(self::FindIngCardCount() <= self::TaskCard_ActiveMax, $err);
|
|
|
$taskCard->state = Enum_TaskCardStateType::ing;
|
|
|
+ NormalEventProc::OnTaskCard_Actived($taskCardUID, null); # 带入事件
|
|
|
+ foreach ($taskCard->curSteps as &$tsp) { # 初期里面只有一个任务
|
|
|
+ $tsp = new Ins_TaskStep($tsp);
|
|
|
+ if ($tsp->isStatusType()) { # 如果是道具收集类的, 扣除所收集道具
|
|
|
+ $tsp->autoCalcStatusCur();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if ($taskCard->IsFinish()) { # 检查是否任务卡的所有步骤都已完成
|
|
|
+ $taskCard->state = Enum_TaskCardStateType::finish;
|
|
|
+ NormalEventProc::OnTaskCard_Finish($taskCard->uid, null); # 广播卡完成事件
|
|
|
+ }
|
|
|
$store->taskcards->$taskCardUID = $taskCard;
|
|
|
UserProc::updateUserInfo(); # 回存玩家数据
|
|
|
- NormalEventProc::OnTaskCard_Actived($taskCardUID, null); # 带入事件
|
|
|
return Resp::ok(array('store' => $req->userInfo->game->store)); # 返回值更新背包
|
|
|
}
|
|
|
|
|
@@ -299,6 +322,18 @@ class TaskProc {
|
|
|
return $find;
|
|
|
}
|
|
|
|
|
|
+ static function FindIngCardCount() {
|
|
|
+ $cardDic = req()->userInfo->game->store->taskcards;
|
|
|
+ $num = 0;
|
|
|
+ array_walk($cardDic, function ($inst) use(&$find) {
|
|
|
+// $inst = new Ins_TaskCard($inst);
|
|
|
+ if ($inst->state == Enum_TaskCardStateType::ing) {
|
|
|
+ $num++;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ return $num;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* [6216] 任务卡 - 领取任务卡奖励
|
|
|
* @param req $req
|
|
@@ -309,12 +344,22 @@ class TaskProc {
|
|
|
$store = $req->userInfo->game->store; # 快速访问store
|
|
|
my_Assert(StlUtil::dictHasProperty($store->taskcards, $taskCardUID), ErrCode::taskCard_no); # 防御找不到实例
|
|
|
$taskCard = new Ins_TaskCard($store->taskcards->$taskCardUID); # 任务卡对象
|
|
|
+
|
|
|
+ foreach ($taskCard->curSteps as &$tsp) { # 初期里面只有一个任务
|
|
|
+ $tsp = new Ins_TaskStep($tsp);
|
|
|
+ if ($tsp->isStatusType()) { # 如果是道具收集类的, 扣除所收集道具
|
|
|
+ $ok = StoreProc::removeItemFromStore($store, $tsp->mo()->paras, $tsp->mo()->num);
|
|
|
+ my_Assert(ErrCode::ok == $ok, ErrCode::taskCard_gainItem_no);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ self::autoRecoverStateMissions(); # 重新更新状态类的任务卡
|
|
|
if (strlen($taskCard->mo()->reward) > 0) { # 防御奖励串为空
|
|
|
StoreProc::AddMultiItemInStore($req, $taskCard->mo()->reward); # 发放奖励
|
|
|
}
|
|
|
$taskCard->state = Enum_TaskCardStateType::drawed;
|
|
|
NormalEventProc::OnTaskCard_Reward($taskCard->mo()->reward, null); # 带入事件
|
|
|
StlUtil::dictRemove($req->userInfo->game->store->taskcards, $taskCardUID); # 移除任务卡
|
|
|
+ $req->userInfo->game->store = $store;
|
|
|
UserProc::updateUserInfo(); # 回存玩家数据
|
|
|
return Resp::ok(array(
|
|
|
'gold' => $req->userInfo->game->baseInfo->gold,
|
|
@@ -713,6 +758,30 @@ class TaskProc {
|
|
|
// <editor-fold defaultstate="collapsed" desc="处理任务卡条件检查">
|
|
|
//
|
|
|
|
|
|
+ /**
|
|
|
+ * 自动修复状态型任务
|
|
|
+ * @param RequestVo $req
|
|
|
+ */
|
|
|
+ static function autoRecoverStateMissions() {
|
|
|
+ $tasks = req()->userInfo->game->store->taskcards;
|
|
|
+ foreach ($tasks as $tid => &$task) {
|
|
|
+ $task = new Ins_TaskCard($task);
|
|
|
+ if ($task->state != Enum_TaskCardStateType::ing // # 进行中的或者已完成的
|
|
|
+ || $task != Enum_TaskCardStateType::finish) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ foreach ($task->curSteps as &$tsp) { # 初期里面只有一个任务
|
|
|
+ $tsp = new Ins_TaskStep($tsp);
|
|
|
+ $tsp->autoCalcStatusCur();
|
|
|
+ }
|
|
|
+ if ($task->state == Enum_TaskCardStateType::finish) { # 检查是否任务卡的所有步骤都已完成
|
|
|
+ if (!$task->IsFinish()) {
|
|
|
+ $task->state = Enum_TaskCardStateType::ing; # 状态回退
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 检查任务卡条件是否达成
|
|
|
* @param Ins_TaskParams $taskParam Description
|
|
@@ -726,18 +795,29 @@ class TaskProc {
|
|
|
if ($task->state != Enum_TaskCardStateType::ing) {
|
|
|
continue;
|
|
|
}
|
|
|
- foreach ($task->curSteps as &$tsp) { # 初期里面只有一个任务
|
|
|
+ foreach ($task->curSteps as &$tsp) { # 初期里面只有一个任务
|
|
|
$tsp = new Ins_TaskStep($tsp);
|
|
|
if ($tsp->check_new($taskParam)) {
|
|
|
$bUpdate = true;
|
|
|
$tsp->propel($taskParam);
|
|
|
NormalEventProc::OnTaskCardStep_Process($task->uid, $tsp->typeId); # 任务进度更新
|
|
|
if ($tsp->isFinish()) {
|
|
|
- $task->state = Enum_TaskCardStateType::finish;
|
|
|
+
|
|
|
+ if (strlen($tsp->mo()->next) > 0) { # 有后续任务
|
|
|
+ $arr = explode(',', $tsp->mo()->next);
|
|
|
+ foreach ($arr as $stpid) {
|
|
|
+ if ($stpid > 0) {
|
|
|
+ $task->AddStep($stpid); # 将后续任务追加到任务列表中
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
NormalEventProc::OnTaskCardStep_Complete($task->uid, $tsp->typeId); # 广播任务步骤完成事件
|
|
|
- NormalEventProc::OnTaskCard_Finish($task->uid, null); # 广播卡完成事件
|
|
|
+ if ($task->IsFinish()) { # 检查是否任务卡的所有步骤都已完成
|
|
|
+ $task->state = Enum_TaskCardStateType::finish;
|
|
|
+ NormalEventProc::OnTaskCard_Finish($task->uid, null); # 广播卡完成事件
|
|
|
+ }
|
|
|
}
|
|
|
- break;
|
|
|
+// break;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -758,9 +838,9 @@ class TaskProc {
|
|
|
* 获得道具
|
|
|
*/
|
|
|
static function OnGainItem($itemId, $num) {
|
|
|
- $taskParam = new Ins_TaskEventArgs(Enum_TaskCmdType::GainItem, Enum_PropelType::add, $num, array($itemId));
|
|
|
- self::CheckTaskCardConditions($taskParam);
|
|
|
+ $taskParam = new Ins_TaskEventArgs(Enum_TaskCmdType::GainItem, Enum_PropelType::stat, $num, array($itemId));
|
|
|
NormalEventProc::OnBag_new_Item($itemId, $num);
|
|
|
+ self::CheckTaskCardConditions($taskParam);
|
|
|
}
|
|
|
|
|
|
static function OnPlotOver($gate_or_npc_id, $stage) {
|