TaskProc.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. <?php
  2. /*
  3. * To change this license header, choose License Headers in Project Properties.
  4. * To change this template file, choose Tools | Templates
  5. * and open the template in the editor.
  6. */
  7. namespace loyalsoft;
  8. /**
  9. * Description of TaskProc
  10. *
  11. * @author c'y'zhao
  12. */
  13. class TaskProc {
  14. /**
  15. * 逻辑分发
  16. * 所有的Proc中必须有这样一个方法
  17. * @param Req $req
  18. */
  19. public static function procMain($req) {
  20. switch ($req->cmd) {
  21. case CmdCode::cmd_task_getInfo: # 6201
  22. return TaskProc::getTaskInfo();
  23. case CmdCode::cmd_task_getReward: # 6202
  24. return TaskProc::getReward();
  25. case CmdCode::cmd_task_getAchieveReward: # 6203 领取成就奖励
  26. return TaskProc::getAchieveReward();
  27. default:
  28. Err(ErrCode::cmd_err);
  29. }
  30. }
  31. /**
  32. * 6203 领取成就奖励
  33. * @return type
  34. */
  35. public static function getAchieveReward() {
  36. list($typeId) = req()->paras;
  37. $mo = GameConfig::achieve_getItem($typeId);
  38. my_Assert($mo != null, ErrCode::err_const_no);
  39. my_Assert(StlUtil::dictHasProperty(ctx()->task->achieveDic, $typeId), ErrCode::err_const_no);
  40. $achieveDic = ctx()->task->achieveDic->$typeId;
  41. $list = explode(',', $mo->condition);
  42. $length = count($list);
  43. my_Assert($achieveDic->val>= $achieveDic->max, ErrCode::task_CanotPriceReviced);
  44. my_Assert($achieveDic->received < $achieveDic->max, ErrCode::task_PriceRepeatReviced);
  45. $index = 0;
  46. foreach ($list as $k =>$num) {
  47. if($num == $achieveDic->max){
  48. $index = $k;
  49. break;
  50. }
  51. }
  52. //领取奖励
  53. $pList = explode(';', $mo->reward);
  54. StoreProc::AddMultiItemInStore($pList[$index]);
  55. //下一个max
  56. if($index +1 < $length){
  57. $achieveDic->max = $list[$index+1];
  58. }
  59. ctx()->task->achieveDic->$typeId = $achieveDic;
  60. UserProc::updateUserInfo();
  61. return Resp::ok(array(
  62. "achieve"=>ctx()->task->achieveDic,
  63. "cash"=> ctx()->baseInfo->cash,
  64. ));
  65. }
  66. /**
  67. * 初始化成就信息
  68. */
  69. public static function initAchieveData() {
  70. // $dic = GameConfig::achieve_new();
  71. // if($dic == null){
  72. // return;
  73. // }
  74. //
  75. // $achieveDic = ctx()->task->achieveDic;
  76. // if(count((array)$achieveDic) > 0){
  77. // return;
  78. // }
  79. //
  80. // foreach ($dic as $key => $value) {
  81. // $item = new Ins_Achieve();
  82. // $typeId = $value->typeId;
  83. // $item->typeId = $typeId;
  84. // $item->cmd = $value->cmd;
  85. // //$item->max = explode(',', $value->condition)[0];
  86. // $item->max = $value->num;
  87. // $achieveDic->$typeId = $item;
  88. // }
  89. // ctx()->task->achieveDic = $achieveDic;
  90. }
  91. //检测成就条件
  92. public static function CheckAchieveConditions($arg) {
  93. $achieveDic = ctx()->task->achieveDic;
  94. foreach ($achieveDic as $key => $value) {
  95. $achieve = new Ins_Achieve($value);
  96. $tag = false;
  97. if($achieve->cmd == $arg->taskType){
  98. $mo = $achieve->getAchieveMo();
  99. if($mo->paras == $arg->paras[0]){//暂定,若有多个参数,在进行解析
  100. $tag = true;
  101. }
  102. }
  103. if($tag){//找到正确数据
  104. switch ($arg->ope) {
  105. case Enum_PropelType::set:
  106. $achieve->val = $arg->val;
  107. break;
  108. case Enum_PropelType::add:
  109. $achieve->val += $arg->val;
  110. break;
  111. default:
  112. break;
  113. }
  114. }
  115. }
  116. ctx()->task->achieveDic = $achieveDic;
  117. UserProc::updateUserInfo();
  118. }
  119. //-------------------成就条件检测
  120. //单件装备等级达到X级
  121. static function accumulateEquiplevel_one($lv) {
  122. $taskEventArg = new Ins_TaskEventArgs(Enum_AchieveType::equiplevel_one, Enum_PropelType::set,$lv, array());
  123. //self::CheckAchieveConditions($taskEventArg);
  124. }
  125. //累计消耗X钻石
  126. static function accumulateCostCash($num) {
  127. $taskEventArg = new Ins_TaskEventArgs(Enum_AchieveType::accumulateCostCash, Enum_PropelType::add,$num, array());
  128. //self::CheckAchieveConditions($taskEventArg);
  129. }
  130. //------------------------------------------------------
  131. public static function getTaskInfo() {
  132. list($type) = req()->paras;//武器uid
  133. return Resp::ok(array("task"=>ctx()->task,
  134. ));
  135. }
  136. /**
  137. * 领取任务奖励
  138. * @return type
  139. */
  140. public static function ReceiveTaskReward() {
  141. list($type,$uid) = req()->paras;//uid
  142. my_Assert(StlUtil::dictHasProperty(ctx()->task->taskcards, $uid), ErrCode::task_NoExist);
  143. $task = ctx()->task->taskcards->$uid;
  144. $mo = GameConfig::taskcard_getItem($task->taskId);
  145. my_Assert($mo != null, ErrCode::err_const_no);
  146. $taskstepsMo = GameConfig::task_step_getItem($mo->tasksteps);
  147. my_Assert($taskstepsMo != null, ErrCode::err_const_no);
  148. $taskStep = $task->curSteps;
  149. my_Assert($taskStep->cur >= $taskstepsMo->num, ErrCode::task_CanotPriceReviced);
  150. my_Assert($task->state == Enum_TaskCardStateType::finish, ErrCode::task_CanotPriceReviced);
  151. switch ($type) {
  152. case Enum_TaskType::DailyTask:
  153. ctx()->task->dailyTaskAccumulate += $mo->score;
  154. break;
  155. case Enum_TaskType::WeekTask:
  156. ctx()->task->weekTaskAccumulate += $mo->score;
  157. break;
  158. default:
  159. break;
  160. }
  161. $task->state = Enum_TaskCardStateType::drawed;
  162. ctx()->task->taskcards->$uid = $task;
  163. StoreProc::AddMultiItemInStore($mo->reward);
  164. return Resp::ok(array("task"=>ctx()->task,
  165. "store"=> ctx()->store,
  166. ));
  167. }
  168. static function ResetTask() {
  169. self::ResetTask_Daily();
  170. $week = date("w");
  171. if($week == 1){//每周一 第一次登录的时候刷新
  172. self::ResetTask_Week();
  173. }
  174. }
  175. /**
  176. * 每日任务重置
  177. */
  178. static function ResetTask_Daily() {
  179. $dic = GameConfig::taskcard();
  180. $retDic = new \stdClass();
  181. $taskcards = ctx()->task->taskcards;
  182. $dailyCards = array();
  183. foreach ($dic as $id => $mo) {
  184. if($mo->type == 1){
  185. foreach ($taskcards as $uid => $card) {
  186. if($card->typeId == $mo->typeId){
  187. $dailyCards[] = $uid;
  188. }
  189. }
  190. $retDic->$id = $mo;
  191. }
  192. }
  193. foreach ($dailyCards as $uid) {
  194. unset($taskcards->$uid);
  195. }
  196. $retDic = (array) $retDic;
  197. if(count($retDic) <= 0){
  198. return;
  199. }
  200. ksort($retDic);
  201. $index = ctx()->task->taskIndex;
  202. foreach ($retDic as $id => $mo) {
  203. $index += 1;
  204. $task = new Ins_TaskCard($id);
  205. $taskcards->$index = $task;
  206. }
  207. ctx()->task->taskIndex = $index;
  208. ctx()->task->taskcards = $taskcards;
  209. UserProc::updateUserInfo();
  210. }
  211. /**
  212. * 每周任务重置
  213. */
  214. static function ResetTask_Week() {
  215. $dic = GameConfig::taskcard();
  216. $retDic = new \stdClass();
  217. $taskcards = ctx()->task->taskcards;
  218. $dailyCards = array();
  219. foreach ($dic as $id => $mo) {
  220. if($mo->type == 2){
  221. foreach ($taskcards as $uid => $card) {
  222. if($card->typeId == $mo->typeId){
  223. $dailyCards[] = $uid;
  224. }
  225. }
  226. $retDic->$id = $mo;
  227. }
  228. }
  229. foreach ($dailyCards as $uid) {
  230. unset($taskcards->$uid);
  231. }
  232. $retDic = (array) $retDic;
  233. if(count($retDic) <= 0){
  234. return;
  235. }
  236. ksort($retDic);
  237. $index = ctx()->task->taskIndex;
  238. foreach ($retDic as $id => $mo) {
  239. $index += 1;
  240. $task = new Ins_TaskCard($id);
  241. $taskcards->$index = $task;
  242. }
  243. ctx()->task->taskIndex = $index;
  244. ctx()->task->taskcards = $taskcards;
  245. UserProc::updateUserInfo();
  246. }
  247. //---------------------
  248. /**
  249. * 每日登陆
  250. */
  251. static function OnUserLogin() {
  252. $taskEventArg = new Ins_TaskEventArgs(Enum_TaskCmdType::DailyLogin, Enum_PropelType::set, 1, array());
  253. self::CheckTaskCardConditions($taskEventArg); # 检查日常任务
  254. }
  255. /**
  256. * 参与主线关卡X次
  257. */
  258. static function OnChallengeZhuXianGate() {
  259. $taskEventArg = new Ins_TaskEventArgs(Enum_TaskCmdType::ChallengeZhuXianGate, Enum_PropelType::add, 1, array());
  260. self::CheckTaskCardConditions($taskEventArg); # 检查日常任务
  261. }
  262. /**
  263. * 参与日常关卡1次
  264. */
  265. static function OnChallengeDailyGate() {
  266. $taskEventArg = new Ins_TaskEventArgs(Enum_TaskCmdType::ChallengeDailyGate, Enum_PropelType::add, 1, array());
  267. self::CheckTaskCardConditions($taskEventArg); # 检查日常任务
  268. }
  269. /**
  270. * 每日商店购买物品1次
  271. */
  272. static function OnDailyShopBuyNum() {
  273. $taskEventArg = new Ins_TaskEventArgs(Enum_TaskCmdType::DailyShopBuyNum, Enum_PropelType::add, 1, array());
  274. self::CheckTaskCardConditions($taskEventArg); # 检查日常任务
  275. }
  276. static function CheckTaskCardConditions($taskParam) {
  277. $bUpdate = false;
  278. $tasks = ctx()->task->taskcards;
  279. foreach ($tasks as $tid => &$task) {
  280. $task = new Ins_TaskCard($task);
  281. if ($task->state != Enum_TaskCardStateType::ing) {
  282. continue;
  283. }
  284. foreach ($task->curSteps as &$tsp) { # 初期里面只有一个任务
  285. $tsp = new Ins_TaskStep($tsp);
  286. if ($tsp->check_new($taskParam)) {
  287. $bUpdate = true;
  288. $tsp->propel($taskParam);
  289. NormalEventProc::OnTaskCardStep_Process($task->uid, $tsp->typeId); # 任务进度更新
  290. if ($tsp->isFinish()) {
  291. NormalEventProc::OnTaskCardStep_Complete($task->uid, $tsp->typeId); # 广播任务步骤完成事件
  292. // $tsp->doFinishAct();
  293. }
  294. }
  295. }
  296. if ($task->IsFinish()) { # 检查后添加后续任务
  297. $arr = array();
  298. foreach ($task->curSteps as &$tsp) { # 初期里面只有一个任务
  299. $tsp = new Ins_TaskStep($tsp);
  300. if (strlen($tsp->mo()->next) > 0) { # 有后续任务
  301. $arr = array_merge($arr, explode(',', $tsp->mo()->next)); # 累加下一个任务步骤
  302. }
  303. }
  304. foreach ($arr as $stpid) { # 轮询添加后续任务
  305. if ($stpid > 0) {
  306. $task->AddStep($stpid); # 将后续任务追加到任务列表中
  307. }
  308. }
  309. if (count($arr) != 0) {
  310. self::autoRecoverStateMissions($taskParam);
  311. }
  312. }
  313. if ($task->IsFinish()) { # 检查是否任务卡的所有步骤都已完成
  314. $task->state = Enum_TaskCardStateType::finish;
  315. NormalEventProc::OnTaskCard_Finish($task->uid, null); # 广播卡完成事件
  316. }
  317. }
  318. if ($bUpdate) { # 带回数据到客户端
  319. ctx()->task->taskcards = $tasks;
  320. UserProc::updateUserInfo(); # 更新玩家数据
  321. }
  322. return $bUpdate;
  323. }
  324. /**
  325. * 自动修复状态型任务
  326. */
  327. static function autoRecoverStateMissions() {
  328. $tasks = ctx()->task->taskcards;
  329. foreach ($tasks as $tid => &$task) {
  330. $task = new Ins_TaskCard($task);
  331. if ($task->state == Enum_TaskCardStateType::ing // # 进行中的或者已完成的
  332. || $task->state == Enum_TaskCardStateType::finish) {
  333. foreach ($task->curSteps as &$tsp) { # 初期里面只有一个任务
  334. $tsp = new Ins_TaskStep($tsp);
  335. $tsp->autoCalcStatusCur();
  336. }
  337. if ($task->state == Enum_TaskCardStateType::finish) { # 检查是否任务卡的所有步骤都已完成
  338. if (!$task->IsFinish()) {
  339. $task->state = Enum_TaskCardStateType::ing; # 状态回退
  340. }
  341. }
  342. }
  343. }
  344. // Clog::info("更新状态统计类的任务卡!");
  345. ctx()->task->taskcards = $tasks;
  346. }
  347. }