typeId); my_Assert(null != $mo, ErrCode::err_const_no); return $mo; } /** * @return int 计数最大值 */ public function max() { return $this->mo()->num; } /** * @return string[] 参数数组 */ private function paras() { return explode(',', $this->mo()->paras); } /** * @return float 当前进度 */ public function progress() { return $this->cur / $this->max(); } /** * 是否完成 * @return bool */ public function isFinish() { return $this->cur >= $this->max(); } /** * 构造函数 * @param type $args */ public function __construct($args) { if (isInt($args)) { $this->typeId = $args; } else { parent::__construct($args); } } /** * 是否状态型任务 * @param type $cmd */ function isStatusType() { return $this->mo()->cmd == Enum_TaskCmdType::GainItem; } /** * 自动对齐可能出现统计失误的状态型任务计数 * @return boolean 是否有修改 */ function autoCalcStatusCur() { if ($this->isStatusType()) { $mo = $this->mo(); if ($mo != null) { $cur = $this->calcStatusCur(); if ($cur > $this->max()) { $cur = $this->max(); } if ($this->cur != $cur) { $this->cur = $cur; return true; } } } return false; } /** * @return int 计算状态类的进度 */ function calcStatusCur() { $mo = $this->mo(); $paras = $this->paras(); $para0 = ""; $para1 = ""; $para2 = ""; if (count($paras) >= 1) { $para0 = $paras[0]; } if (count($paras) >= 2) { $para1 = $paras[1]; } if (count($paras) >= 3) { $para2 = $paras[2]; } switch ($mo->cmd) { case Enum_TaskCmdType::GainItem: # 收集道具 $store = new Info_Store(req()->userInfo->game->store); return $store->GetItemCount($para0); } return 0; } /** * 检查任务条件(与petmini采用相同的参数和判定方法2020年12月12日11:38:02) * @param Ins_TaskEventArgs $taskCardEvent * @return bool */ public function check_new($taskCardEvent) { // var_dump($taskCardEvent); if ($taskCardEvent->taskType != $this->mo()->cmd) { # 事件类型匹配 return false; } if ($this->isStatusType()) { # 状态检查类任务 return $this->autoCalcStatusCur(); } if ($this->isFinish()) { return true; } if (strlen($this->mo()->paras) <= 0) { # 无参数 return true; } $paras = $this->paras(); $index = 0; foreach ($taskCardEvent->paras as $para) { # 其他任务, 执行参数判定 if ($index < count($paras)) { if (strpos($para, "|") !== false) { # 某个条件是"或"的关系, 即有多重可能值, 满足其一即可 $paraList = explode("|", $para); foreach ($paraList as $paraItem) { if ($paraItem == $paras[$index]) { continue; # 满足某一个即可, 继续判断下一个条件. } } } else { # only one, 不存在"或"的判定 if ($paras[$index] != 0 && $para != $paras[$index]) { # 直接匹配 return false; # 一但没匹配上, 直接返回false就好了. } } } # 参数中多余的数据就直接跳过,不比较了(因为自己不需要判断那么多参数) $index++; } return true; # 走到最后则判定满足条件. } /** * 推进任务进度(采用和petmini相同的推进算法,2020年12月12日11:38:22) * @param Ins_TaskEventArgs $taskParam */ public function propel($taskParam) { // var_dump($taskParam); switch ($taskParam->ope) { case Enum_PropelType::set: $this->cur = $taskParam->val; break; case Enum_PropelType::add: $this->cur += $taskParam->val; break; case Enum_PropelType::inc: $this->cur += 1; break; case Enum_PropelType::max: if ($taskParam->val > $this->cur) { $this->cur = $taskParam->val; } break; } } }