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); } } /** * 是否状态型任务---2022-7-29最新备注:add类型的只能动作触发-不能在这里添加类型 ;set类型只动作触发不添加在这,要是满足条件就完成任务就添加在这 * @param type $cmd */ function isStatusType() { return false; // return $this->mo()->cmd == Enum_TaskCmdType::GainItem # 获取道具 // || $this->mo()->cmd == Enum_TaskCmdType::HeroLevelUpTo; # 唤灵师等级达到x级 //|| $this->mo()->cmd == Enum_TaskCmdType::UpgradeXYanlingToNStar;#言灵突破升星 } /** * 自动对齐可能出现统计失误的状态型任务计数 * @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::passEndlessCarbonN: # 通关无尽塔X层 //// isEditor() and $hero = new Ins_UserHero(); // $num = ctx()->privateState->endlessTower - 1; // return $num; // default: // break; // } return 0; } /** * 检查任务条件(与petmini采用相同的参数和判定方法2020年12月12日11:38:02) * @param Ins_TaskEventArgs $taskCardEvent * @return bool */ public function check_new($taskCardEvent) { if ($taskCardEvent->taskType != $this->mo()->cmd) { # 事件类型匹配 return false; } if ($this->isStatusType()) { # 状态检查类任务 return $this->autoCalcStatusCur(); } if ($this->isFinish()) { return false; } 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 ($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; case Enum_PropelType::stat: break; } } }