ActiveProc.php 42 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006
  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 ActiveProc
  10. *
  11. * @author c'y'zhao
  12. */
  13. class ActiveProc {
  14. const tab_token_gift = "tab_token_gift";
  15. /**
  16. * 逻辑分发
  17. * 所有的Proc中必须有这样一个方法
  18. * @param Req $req
  19. */
  20. public static function procMain($req) {
  21. switch ($req->cmd) {
  22. case CmdCode::cmd_active_day7_drawreward: # 6101 签到
  23. return ActiveProc::Day7_DrawReward();
  24. case CmdCode::cmd_active_drawPackageByCode: # 6102 兑换码礼包
  25. return ActiveProc::drawPackageByCode();
  26. case CmdCode::cmd_active_lottery_Tree: # 6103 转盘抽奖
  27. return ActiveProc::lottery_Tree();
  28. case CmdCode::cmd_active_lottery_Tree_cashExchange: # 6104 元宝兑换抽奖券
  29. return ActiveProc::lottery_Tree_cashExchange();
  30. case CmdCode::cmd_active_lotteryNumBox_RewardReceived: # 6105 抽奖宝箱奖励领取
  31. return ActiveProc::lotteryNumBox_RewardReceived();
  32. case CmdCode::cmd_active_LotteryExchangeItem: # 6106 兑换
  33. return ActiveProc::LotteryExchangeItem();
  34. case CmdCode::cmd_active_day7_accumulateDrawreward: # 6107 7日签到 累计天数宝箱奖励领取
  35. return ActiveProc::Day7_AccumulateDrawreward();
  36. case CmdCode::cmd_active_limitTsBuy: # 6108 限时贩售
  37. return ActiveProc::LimitTsBuy_Drawreward();
  38. case CmdCode::cmd_active_battlePassDrawReward: # 6109 战令奖励领取
  39. return ActiveProc::BattlePassDrawReward();
  40. case CmdCode::cmd_active_day7_drawreward_newPlayer: # 6110 新手7日签到领取奖励
  41. return ActiveProc::Day7_Drawreward_NewPlayer();
  42. case CmdCode::cmd_active_getTodayOnlineInfos: # 6111 查询当天在线时长信息
  43. return self::GetTodayOnlineInfos();
  44. case CmdCode::cmd_active_draw_onlinegift: # 6112 领取在线(时长)礼包
  45. return self::DrawOnlineGift();
  46. case CmdCode::cmd_active_YanBaoBuyItemActive_drawReward:
  47. return self::YanBaoBuyItemActive_drawReward();
  48. case CmdCode::active_FlipCardLottery_DrawCardReward: # 6114 金蛇献瑞抽奖
  49. return self::FlipCardLottery_DrawReward();
  50. case CmdCode::active_FlipCardLottery_BuyTickets: # 6115 金蛇献瑞购买抽奖券
  51. return self::FlipCardLottery_BuyTickets();
  52. case CmdCode::active_FlipCardLottery_DrawGrandReward: # 6116 领取大奖信息
  53. return self::FlipCardLottery_DrawGrandReward();
  54. default:
  55. Err(ErrCode::cmd_err);
  56. }
  57. }
  58. /**
  59. * 每日重置数据
  60. */
  61. public static function ResetActiveInfos() {
  62. ctx()->privateState->flipCardNum_daily = 0;
  63. ActiveProc::DailyResetDay7Task();
  64. self::ClearOnlineGiftTs();
  65. ActiveProc::ClearYanBaoBuyItemActive_drawReward();
  66. }
  67. /**
  68. * 重置金蛇数据
  69. */
  70. public static function ClearFlipCardInfo() {
  71. //活动结束
  72. $mo = GameConfig::subfun_unlock_getItem(Enum_SubFunType::FlipCardLottery);
  73. if (now() >= $mo->startTs && now() < $mo->endTs && $mo->endTs != ctx()->privateState->flipCardLottery_endTs) {//当活动重启再次开启的时候再重置数据
  74. ctx()->privateState->flipCardLottery_endTs = $mo->endTs;
  75. ctx()->privateState->flipCardNum_all = 0;
  76. //初始化大奖
  77. ctx()->privateState->flipCard_RewardRecord = array();
  78. ctx()->privateData(true)->flipCard_randGrandReward = self::RandGrandReward();
  79. }
  80. }
  81. /**
  82. * 6116 领取大奖信息
  83. * @return type
  84. */
  85. public static function FlipCardLottery_DrawGrandReward() {
  86. //list() = req()->paras; # 提取参数
  87. $lineArr = array();
  88. $list = ctx()->privateState->flipCard_randGrandReward;
  89. $index = 0;
  90. foreach ($list as $id) {
  91. $mo = GameConfig::activity_flipCardLottery_lineIds_getItem($index);
  92. $s = explode(',', $mo->cardIds);
  93. $tag = true;
  94. foreach ($s as $cId) {
  95. if (!self::isExistCard($cId)) {
  96. $tag = false;
  97. break;
  98. }
  99. }
  100. if($tag){
  101. $lineArr[] = $id;
  102. }
  103. $index += 1;
  104. }
  105. if (count($lineArr) >= GameConfig::glc2()->FlipCardLottery_ResetNum) {
  106. ctx()->privateState->flipCard_RewardRecord = array();
  107. ctx()->privateData(true)->flipCard_randGrandReward = self::RandGrandReward();
  108. }
  109. return Resp::ok(array(
  110. 'gold' => ctx()->baseInfo->gold,
  111. 'cash' => ctx()->baseInfo->cash,
  112. 'store' => ctx()->store,
  113. 'heros' => ctx()->heros,
  114. 'privateState' => ctx()->privateState,
  115. 'reward_equip'=> StoreProc::$reward_equip,
  116. 'reward_Gem'=> StoreProc::$reward_Gem,
  117. 'reward'=> StoreProc::$reward,
  118. ));
  119. }
  120. /*
  121. * 6114 金蛇献瑞抽奖
  122. */
  123. public static function FlipCardLottery_DrawReward() {
  124. //list() = req()->paras; # 提取参数
  125. //my_Assert(!in_array($id, ctx()->privateState->flipCard_RewardRecord) , ErrCode::active_hasgetted);
  126. my_Assert(ctx()->privateState->flipCardNum_daily < GameConfig::glc2()->FlipCardLotteryNum_Daily, ErrCode::active_lotteryNumLimit);
  127. $cardId = self::RandCardReward();
  128. $rewards = GameConfig::glc2()->FlipCardLottery_CardRewards;
  129. $str = explode(';', $rewards);
  130. $per = 0;
  131. foreach ($str as $key => $value) {
  132. $s = explode(',', $value);
  133. $per += $s[2];
  134. }
  135. $randNum = rand(1, $per);
  136. $start = 0;
  137. $end = 0;
  138. $rewardStr = "";
  139. foreach ($str as $key => $value) {
  140. $s = explode(',', $value);
  141. $end += $s[2];
  142. if ($randNum >= $start && $randNum < $end) {
  143. $rewardStr = $cardId . "-" . $s[0] . "-" . $s[1];
  144. StoreProc::AddMultiItemInStore($s[0] . "," . $s[1]);
  145. break;
  146. }
  147. $start = $end;
  148. }
  149. ctx()->privateData(true)->flipCard_RewardRecord[] = $rewardStr;
  150. ctx()->privateData(true)->flipCardNum_daily += 1;
  151. ctx()->privateData(true)->flipCardNum_all += 1;
  152. $dic = GameConfig::activity_flipCardLottery_lineIds();
  153. $lineList = array();
  154. $curUnlockLine = 999;
  155. foreach ($dic as $id => $mo) {
  156. $s = explode(',', $mo->cardIds);
  157. $tag = true;
  158. foreach ($s as $cId) {
  159. if (!self::isExistCard($cId)) {
  160. $tag = false;
  161. break;
  162. }
  163. }
  164. if ($tag) {
  165. $lineList[] = $id;
  166. if (in_array($cardId, $s)) {
  167. $curUnlockLine = $id;
  168. }
  169. }
  170. }
  171. //$grandReward = array();
  172. return Resp::ok(array(
  173. 'gold' => ctx()->baseInfo->gold,
  174. 'cash' => ctx()->baseInfo->cash,
  175. 'store' => ctx()->store,
  176. 'heros' => ctx()->heros,
  177. 'privateState' => ctx()->privateState,
  178. 'cardReward' => $rewardStr,
  179. //'grandReward' => $grandReward,
  180. 'curUnlockLine'=> $curUnlockLine,
  181. // 'reward_equip'=> StoreProc::$reward_equip,
  182. 'cardId' => $cardId,
  183. ));
  184. }
  185. public static function isExistCard($id) {
  186. foreach (ctx()->privateData(true)->flipCard_RewardRecord as $key => $value) {
  187. $arr = explode('-', $value);
  188. if ($arr[0] == $id) {
  189. return true;
  190. }
  191. }
  192. return false;
  193. }
  194. /**
  195. * 初始化大奖信息 12个大奖在数组的位置对应了 界面上 0-12个位置
  196. * @return type
  197. */
  198. public static function RandGrandReward() {
  199. $lineList = array();
  200. $dic = GameConfig::activity_flipcardlottery_grandreward();
  201. foreach ($dic as $id => $mo) {
  202. $lineList[] = $id;
  203. }
  204. $typeIdArr = array();
  205. $num = count($lineList);
  206. for ($i = 0; $i < $num; $i++) {
  207. $rand = rand(0, count($lineList) - 1);
  208. $typeIdArr[] = $lineList[$rand];
  209. StlUtil::arrayRemoveAt($lineList, $rand);
  210. }
  211. return $typeIdArr;
  212. }
  213. /**
  214. * 随机抽取一个卡牌
  215. * @return int
  216. */
  217. public static function RandCardReward() {
  218. $randGrandReward = ctx()->privateState->flipCard_randGrandReward;
  219. $cId = 0;
  220. while (true) {
  221. $perNum = 0; //大奖总概率
  222. foreach ($randGrandReward as $id) {
  223. $perNum += GameConfig::activity_flipcardlottery_grandreward_getItem($id)->per;
  224. }
  225. $rand = rand(1, $perNum);
  226. $start = 0;
  227. $end = 0;
  228. $lineId = null;
  229. $grandId = null;
  230. $index = 0;
  231. foreach ($randGrandReward as $id) {
  232. $mo = GameConfig::activity_flipcardlottery_grandreward_getItem($id);
  233. $end += $mo->per;
  234. if ($rand >= $start && $rand < $end) {
  235. $lineId = $index;
  236. $grandId = $id;
  237. break;
  238. }
  239. $start = $end;
  240. $index += 1;
  241. }
  242. if ($lineId != null && $grandId != null) {
  243. $lineMo = GameConfig::activity_flipCardLottery_lineIds_getItem($lineId);
  244. $str = explode(',', $lineMo->cardIds);
  245. $cardArr = array();
  246. $isExistNoFlip = false;
  247. foreach ($str as $cardId) {
  248. if (!self::isExistCard($cardId)) {
  249. $cardArr[] = $cardId;
  250. $isExistNoFlip = true;
  251. }
  252. }
  253. if ($isExistNoFlip) {
  254. $n = rand(0, count($cardArr) - 1);
  255. $cId = $cardArr[$n];
  256. break;
  257. } else {
  258. StlUtil::arrayRemove($randGrandReward, $grandId);
  259. }
  260. } else {
  261. break;
  262. }
  263. }
  264. return $cId;
  265. }
  266. /*
  267. * 6115 金蛇献瑞购买抽奖券
  268. */
  269. public static function FlipCardLottery_BuyTickets() {
  270. list($num) = req()->paras; # 提取参数
  271. my_Assert($num <= GameConfig::glc2()->FlipCardLottery_BuyTickets_MaxNumLimit, ErrCode::active_flipCardLotteru_buyNumLimit);
  272. $cash = $num * GameConfig::glc2()->FlipCardLottery_Yuanbao_BuyOneTickets;
  273. my_Assert($cash >= ctx()->baseInfo->cash, ErrCode::notenough_cash_msg);
  274. ctx()->base(true)->Consume_Cash($cash);
  275. $str = '802,' . $num;
  276. StoreProc::AddMultiItemInStore($str);
  277. return Resp::ok(array(
  278. 'cash' => ctx()->baseInfo->cash,
  279. 'store' => ctx()->store,
  280. 'reward' => StoreProc::$reward,
  281. ));
  282. }
  283. /**
  284. * [6112] 领取连续在线礼包
  285. */
  286. static function YanBaoBuyItemActive_drawReward() {
  287. list($typeId) = req()->paras; # 提取参数: 礼包的编号
  288. $Mo = GameConfig::activity_cashmall_getItem($typeId); # 常量数据
  289. my_Assert(null != $Mo, ErrCode::err_const_no); # 防御找不到配置数据
  290. my_Assert(ctx()->baseInfo->cash >= explode(',', $Mo->cost)[1], ErrCode::notenough_cash_msg);
  291. ctx()->baseInfo->Consume_Cash(explode(',', $Mo->cost)[1]);
  292. $rewardArr = ctx()->privateState->YuanbaoBuy_RewardRecord;
  293. $count = array_count_values($rewardArr)[$typeId];
  294. my_Assert($count < $Mo->limitNum, ErrCode::user_shop_LimitNum);
  295. // my_Assert(!in_array($typeId, ctx()->privateData()->YuanbaoBuy_RewardRecord), # # 判断礼包ID是否已经领取
  296. // ErrCode::active_hasgetted);
  297. $err = StoreProc::AddMultiItemInStore($Mo->reward); # 发放奖励
  298. my_Assert(ErrCode::ok == $err, $err); # 发放奖励失败
  299. ctx()->privateData(true)->YuanbaoBuy_RewardRecord[] = $typeId; # 记录已领礼包ID
  300. UserProc::updateUserInfo(); # 回写用户数据
  301. return Resp::ok(array(
  302. "reward" => StoreProc::$reward,
  303. "reward_Gem" => StoreProc::$reward_Gem,
  304. "reward_equip" => StoreProc::$reward_equip,
  305. 'gold' => ctx()->base()->gold,
  306. 'cash' => ctx()->base()->cash,
  307. 'store' => ctx()->store(),
  308. 'heros' => ctx()->heros()
  309. )); # 设置返回值
  310. }
  311. public static function GetTodayOnlineInfos() {
  312. return Resp::ok(array(
  313. 'onlineGiftts' => ctx()->privateState->onlineGiftts,
  314. 'onlineGiftIDs' => ctx()->privateState->onlineGiftIDs,
  315. ));
  316. }
  317. /**
  318. * 清理/重置 在线礼包时间戳
  319. */
  320. public static function ClearOnlineGiftTs() {
  321. ctx()->privateState->onlineGiftts = 1;
  322. ctx()->privateState->onlineGiftIDs = array();
  323. ctx()->privateState->flipCardNum_daily = 0;
  324. }
  325. /**
  326. * 清理/重置 元宝商城购买记录
  327. */
  328. public static function ClearYanBaoBuyItemActive_drawReward() {
  329. ctx()->privateState->YuanbaoBuy_RewardRecord = array();
  330. }
  331. /**
  332. * [6112] 领取连续在线礼包
  333. */
  334. static function DrawOnlineGift() {
  335. list($giftid) = req()->paras; # 提取参数: 礼包的编号
  336. $giftData = GameConfig::activity_onlinegift_getItem($giftid); # 在线礼包常量数据
  337. my_Assert(null != $giftData, ErrCode::onlinegift_constno_err); # 防御找不到配置数据
  338. // my_Assert($privateState->onlineGiftts + 30 >= $giftData->onlineSec, # # 时间未到,不可以领取
  339. // ErrCode::onlinegift_timenotenough);
  340. my_Assert(ctx()->privateState->onlineGiftts >= $giftData->onlineSec, #
  341. ErrCode::active_day7_expired);
  342. my_default_Arr(ctx()->privateData()->onlineGiftIDs); # 防御未初始化领取记录
  343. my_Assert(!in_array($giftid, ctx()->privateData()->onlineGiftIDs), # # 判断礼包ID是否已经领取
  344. ErrCode::active_hasgetted);
  345. $err = StoreProc::AddMultiItemInStore($giftData->rewardstr); # 发放奖励
  346. my_Assert(ErrCode::ok == $err, $err); # 发放奖励失败
  347. ctx()->privateData(true)->onlineGiftIDs[] = $giftid; # 记录已领礼包ID
  348. //$privateState->onlineGiftts = 0; #每次领取奖励则时间重新计算
  349. UserProc::updateUserInfo(); # 回写用户数据
  350. return Resp::ok(array(
  351. 'onlineGiftts' => ctx()->privateState->onlineGiftts,
  352. 'onlineGiftIDs' => ctx()->privateState->onlineGiftIDs,
  353. "reward" => StoreProc::$reward,
  354. "reward_Gem" => StoreProc::$reward_Gem,
  355. "reward_equip" => StoreProc::$reward_equip,
  356. 'gold' => ctx()->base()->gold,
  357. 'cash' => ctx()->base()->cash,
  358. 'tili' => ctx()->base()->tili,
  359. 'tili_ts' => ctx()->base()->tili_ts,
  360. 'store' => ctx()->store(),
  361. 'heros' => ctx()->heros()
  362. )); # 设置返回值
  363. }
  364. /**
  365. * 6106 抽奖里面的兑换
  366. * @return type
  367. */
  368. public static function LotteryExchangeItem() {
  369. list($id) = req()->paras;
  370. $arr = array_count_values(ctx()->privateState->lotteryExchange);
  371. $num = $arr[$id];
  372. $mo = GameConfig::activity_lotteryitem_exchange_getItem($id);
  373. my_Assert($mo != null, ErrCode::err_const_no);
  374. my_Assert($num < $mo->exchangeNum, ErrCode::active_lotteryExchangeNumLimit);
  375. $itemNum = 0;
  376. $cost = explode(',', $mo->cost);
  377. $costId = $cost[0];
  378. if (StlUtil::dictHasProperty(ctx()->store->items, $costId)) {
  379. $itemNum = ctx()->store->items->$costId;
  380. }
  381. my_Assert($itemNum >= $cost[1], ErrCode::notenough_item);
  382. ctx()->store->removeItem($costId, $cost[1]);
  383. StoreProc::AddMultiItemInStore($mo->reward);
  384. ctx()->privateState->lotteryExchange[] = $id;
  385. UserProc::updateUserInfo();
  386. return Resp::ok(array(
  387. "store" => ctx()->store,
  388. 'cash' => ctx()->baseInfo->cash,
  389. 'gold' => ctx()->baseInfo->gold,
  390. 'reward' => StoreProc::$reward,
  391. 'reward_Gem' => StoreProc::$reward_Gem,
  392. 'reward_equip' => StoreProc::$reward_equip,
  393. ));
  394. }
  395. /**
  396. * 6105 抽奖宝箱奖励领取
  397. * @return type
  398. */
  399. public static function lotteryNumBox_RewardReceived() {
  400. list($id) = req()->paras;
  401. $mo = GameConfig::activity_lotterynum_accumulate_getItem($id);
  402. my_Assert($mo != null, ErrCode::err_const_no);
  403. my_Assert(ctx()->privateState->lotteryNum >= $id, ErrCode::active_lotteryNumNotEnough);
  404. my_Assert(!in_array($id, ctx()->privateState->lotteryNumRewardReceived), ErrCode::active_hasgetted);
  405. StoreProc::AddMultiItemInStore($mo->reward);
  406. ctx()->privateState->lotteryNumRewardReceived[] = $id;
  407. UserProc::updateUserInfo();
  408. return Resp::ok(array(
  409. "store" => ctx()->store,
  410. 'cash' => ctx()->baseInfo->cash,
  411. 'reward' => StoreProc::$reward,
  412. 'reward_Gem' => StoreProc::$reward_Gem,
  413. 'reward_equip' => StoreProc::$reward_equip,
  414. ));
  415. }
  416. /**
  417. * 6103 转盘抽奖
  418. */
  419. public static function lottery_Tree() {
  420. list($num) = req()->paras; //抽奖次数 1 10
  421. $arr = array(1, 10);
  422. my_Assert(in_array($num, $arr), ErrCode::active_lotteryNumErr);
  423. my_Assert(ctx()->privateState->lotteryNum + $num <= glc()->activity_lottery_allNum, ErrCode::active_lotteryNumLimit);
  424. $costTag = true;
  425. if ($num == 1 && ctx()->privateState->lotteryNum_free < GameConfig::glc2()->activity_lottery_FreeNum + GameConfig::glc2()->activity_lottery_GuanggaoNum) {
  426. $costTag = false;
  427. }
  428. if ($num == 1) {
  429. ctx()->privateState->lotteryNum_free += 1;
  430. }
  431. if ($costTag) {
  432. $cost = "";
  433. if ($num == 1) {
  434. $cost = glc()->activity_lottery_tree_one_cost;
  435. } else {
  436. $cost = glc()->activity_lottery_tree_ten_cost;
  437. }
  438. my_Assert($cost != "", ErrCode::active_lotteryCostErr);
  439. $costArr = explode(',', $cost);
  440. $item = ctx()->store->items;
  441. $costId = $costArr[0];
  442. $costNum = $costArr[1];
  443. my_Assert(StlUtil::dictHasProperty($item, $costId) && $item->$costId >= $costNum, ErrCode::notenough_item);
  444. ctx()->store->removeItem($costId, $costNum);
  445. }
  446. if (ctx()->privateState->lotteryNum_free > GameConfig::glc2()->activity_lottery_FreeNum && ctx()->privateState->lotteryNum_free <= GameConfig::glc2()->activity_lottery_FreeNum + GameConfig::glc2()->activity_lottery_GuanggaoNum) {
  447. my_Assert(now() - ctx()->privateData(true)->activity_lottery_guanggaoTs >= GameConfig::glc2()->activity_lottery_GuanggaoDownTs, ErrCode::user_shop_DownTsLimit);
  448. ctx()->privateData(true)->activity_lottery_guanggaoTs = now();
  449. TaskProc::OnLookGuanggao();
  450. }
  451. if (ctx()->privateState->lotteryNum < glc()->activity_lottery_allNum) {
  452. ctx()->privateState->lotteryNum += $num;
  453. }
  454. $rewardList = array();
  455. $dic = GameConfig::activity_lottery_tree();
  456. for ($i = 0; $i < $num; $i++) {
  457. $randNum = random_int(1, 10000);
  458. $start = 0;
  459. $end = 0;
  460. foreach ($dic as $id => $mo) {
  461. $end += $mo->per * 10000;
  462. if ($randNum > $start && $randNum <= $end) {
  463. $rewardList[] = $id;
  464. StoreProc::AddMultiItemInStore($mo->reward);
  465. $prize = explode(',', $mo->reward);
  466. if (GameConfig::item_getItem($prize[0])->itemType == 201 && GameConfig::item_getItem($prize[0])->quality >= 4 && ctx()->privateState->lottery_qualGem_4 == 0) {
  467. ctx()->privateState->lottery_qualGem_4 = 1;
  468. }
  469. break;
  470. }
  471. $start = $end;
  472. }
  473. }
  474. UserProc::updateUserInfo();
  475. return Resp::ok(array(
  476. "store" => ctx()->store,
  477. 'reward' => StoreProc::$reward,
  478. 'reward_Gem' => StoreProc::$reward_Gem,
  479. 'reward_equip' => StoreProc::$reward_equip,
  480. 'gold' => ctx()->baseInfo->gold,
  481. 'cash' => ctx()->baseInfo->cash,
  482. 'privateState' => ctx()->privateState,
  483. 'indexReward' => $rewardList,
  484. 'heros' => ctx()->heros,
  485. ));
  486. }
  487. /**
  488. * 元宝兑换寻宝券
  489. * @return type
  490. */
  491. public static function lottery_Tree_cashExchange() {
  492. list($num) = req()->paras; //抽奖次数 1 10
  493. $cost = "";
  494. if ($num == 1) {
  495. $cost = glc()->activity_lottery_tree_one_cost;
  496. } else {
  497. $cost = glc()->activity_lottery_tree_ten_cost;
  498. }
  499. my_Assert($cost != "", ErrCode::active_lotteryCostErr);
  500. $costArr = explode(',', $cost);
  501. $item = ctx()->store->items;
  502. $costId = $costArr[0];
  503. $costNum = $costArr[1];
  504. $selfNum = 0;
  505. if (StlUtil::dictHasProperty($item, $costId)) {
  506. $selfNum = $item->$costId;
  507. }
  508. my_Assert($selfNum < $costNum, ErrCode::active_lottery_unwantedExchange);
  509. $costNum -= $selfNum;
  510. $cash = glc()->activity_lottery_oneCost_cash * $costNum;
  511. my_Assert(ctx()->baseInfo->cash >= $cash, ErrCode::notenough_cash_msg);
  512. ctx()->baseInfo->Consume_Cash($cash);
  513. StoreProc::AddMultiItemInStore($costId . ',' . $costNum);
  514. UserProc::updateUserInfo();
  515. return Resp::ok(array(
  516. "store" => ctx()->store,
  517. 'cash' => ctx()->baseInfo->cash,
  518. ));
  519. }
  520. /**
  521. * 6102 兑换码礼包
  522. */
  523. static function drawPackageByCode() {
  524. list($activeId, $codestring) = req()->paras; # 取参数 活动id, 兑换码
  525. $codePlatStr = "";
  526. $packageID = 0;
  527. if (self::PublicTokenCodeCheck($codestring)) {
  528. $packageInfo = GameConfig::token_PublicGift_getItem($codestring);
  529. my_Assert($packageInfo->expirets >= now() && $packageInfo->startTs <= now(),
  530. ErrCode::active_activecode_outtime);
  531. my_Assert(!in_array($packageInfo->id, ctx()->privateState->usedTokens), ErrCode::active_hasgetted); # 已经领取过该礼包了
  532. $packageID = $packageInfo->id;
  533. //$err = StoreProc::AddMultiItemInStore($packageInfo->reward); # 发放礼包
  534. EmailProc::SendPackageByCodeMail(req()->zoneid, req()->uid, $packageInfo->reward);
  535. my_Assert(ErrCode::ok == $err, $err);
  536. } else {
  537. $active = GameConfig::activity_getItem($activeId); # 活动数据
  538. my_Assert(null != $active, ErrCode::active_const_no_err);
  539. my_Assert($active->startts <= now() && $active->endts >= now(), ErrCode::active_time); # 校验开放时间
  540. my_Assert(preg_match("/^[a-kmnp-z2-9]{10}$/", $codestring), ErrCode::active_activecode_format); # 基础格式校验(10个特定字符)
  541. $activeCode = CipheredBase32::Decode($codestring); # 解码
  542. $codePlatStr = GameConstants::GetPlatStringByActivteCode($activeCode); # platstr
  543. my_Assert(GameConstants::AllPlatStr == $codePlatStr # # 忽略全平台礼包
  544. || req()->getPlatStr() == $codePlatStr, # # 平台字符串必须相符
  545. ErrCode::active_activecode_plat); # # 平台错误
  546. my_Assert(is_int($activeCode->number) # # 编号为int值
  547. && $activeCode->number >= 1 && $activeCode->number <= 50000, # # 检查 兑换码的编号范围0~50000
  548. ErrCode::active_activecode_format);
  549. $packageID = $activeCode->package; # 礼包id
  550. $packageInfo = GameConfig::token_gift_getItem($packageID); # 礼包常量数据
  551. my_Assert(null != $packageInfo, ErrCode::err_const_no); # 防御
  552. CLog::err(json_encode($packageInfo));
  553. my_Assert($packageInfo->expirets >= now() && $packageInfo->startTs <= now(),
  554. ErrCode::active_activecode_outtime); # 激活码已经失效,或者礼包尚未开启
  555. $privateState = new Info_PrivateState(ctx()->privateState); # 快速访问
  556. my_Assert(!in_array($packageID, $privateState->usedTokens), ErrCode::active_hasgetted); # 已经领取过该礼包了
  557. my_Assert(!self::checkActiveCodeIsUsed($activeCode), ErrCode::active_activecode_used); # 检查 该激活码是否别人已经使用过了
  558. $err = StoreProc::AddMultiItemInStore($packageInfo->reward); # 发放礼包
  559. EmailProc::SendPackageByCodeMail(req()->zoneid, req()->uid, $packageInfo->reward);
  560. // my_Assert(ErrCode::ok == $err, $err); # 防御发放礼包过程出错
  561. $ok = self::setActiveCodeUserRecord($activeCode, req()->uid); # 插入数据库
  562. my_Assert($ok, ErrCode::err_db); # 数据库操作失败- 重试
  563. }
  564. ctx()->privateState->usedTokens[] = $packageID;
  565. UserProc::updateUserInfo(); # 回存玩家数据
  566. $ret = array(# # 返回值
  567. "plat" => $codePlatStr,
  568. "packageId" => $packageID,
  569. "reward" => $packageInfo->reward,
  570. 'gold' => ctx()->base()->gold,
  571. 'cash' => ctx()->base()->cash,
  572. //'tili' => ctx()->base()->tili,
  573. 'store' => ctx()->store,
  574. //'hero' => ctx()->heros,
  575. );
  576. return Resp::ok($ret); # 返回成功信息
  577. }
  578. public static function PublicTokenCodeCheck($codestring) {
  579. $dic = GameConfig::token_PublicGift();
  580. if (StlUtil::dictHasProperty($dic, $codestring)) {
  581. return true;
  582. }
  583. return false;
  584. }
  585. /**
  586. * 检查兑换码是否已经使用过了
  587. * @param ActiveCode $activeCode
  588. * @return boolean true : 已经用过了, false : 激活码尚未使用过.
  589. */
  590. static function checkActiveCodeIsUsed($activeCode) {
  591. $sql = sprintf("`plat`='%d' and `package`='%d' and `number`='%d'", # # where 子句
  592. $activeCode->plat, $activeCode->package, $activeCode->number);
  593. $rows = daoInst()
  594. ->select()
  595. ->from(self::tab_token_gift) # 表名
  596. ->where($sql)
  597. ->count();
  598. return $rows > 0;
  599. }
  600. /**
  601. * 将兑换码添加到使用记录中
  602. * @param ActiveCode $actvieCode
  603. * @param string $uid
  604. * @return boolean true: 操作成功, false: 操作失败
  605. */
  606. static function setActiveCodeUserRecord($actvieCode, $uid) {
  607. $actvieCode->uid = $uid; # 添加uid
  608. $ret = daoInst()
  609. ->insert(self::tab_token_gift) # 表名
  610. ->data($actvieCode)
  611. ->exec();
  612. return $ret > 0;
  613. }
  614. /**
  615. * 7日签到 数据更新
  616. */
  617. public static function DailyResetDay7Task($unlock = false) {
  618. if (!$unlock && !FightProc::isFunUnlock(5)) {//之所以这有两个判断是因为这个 活动解锁的代码监测位置问题,fightProc 里解锁监测代码在 $gateInfo->tz_state = $index;之前了 这个位置没有办法解锁
  619. return;
  620. }
  621. if (count(ctx()->privateState->LoginDays) >= 7) {
  622. ctx()->privateState->LoginDays = array();
  623. ctx()->privateState->day7_drawed = array();
  624. }
  625. $index = count(ctx()->privateState->LoginDays) + 1;
  626. ctx()->privateState->LoginDays[] = $index;
  627. ctx()->privateState->day7_accumulate += 1;
  628. }
  629. /**
  630. * 6101 签到
  631. * @return type
  632. */
  633. public static function Day7_DrawReward() {
  634. list($day) = req()->paras; # 参数: 领取第x天的奖励
  635. my_Assert(in_array($day, ctx()->privateState->LoginDays), ErrCode::active_day7_expired);
  636. my_Assert(!in_array($day, ctx()->privateState->day7_drawed), ErrCode::active_hasgetted);
  637. $day_rwd = GameConfig::activity_day7_getItem($day); # 查询奖励数据
  638. my_Assert(null != $day_rwd, ErrCode::err_const_no); # 防御找不到配置
  639. StoreProc::AddMultiItemInStore($day_rwd->reward); # 发放奖励
  640. ctx()->privateState->day7_drawed[] = $day; # 添加领取记录
  641. UserProc::updateUserInfo(); # 回存
  642. return Resp::ok(array('gold' => ctx()->baseInfo->gold,
  643. 'cash' => ctx()->baseInfo->cash,
  644. 'store' => ctx()->store,
  645. 'heros' => ctx()->heros,
  646. 'reward' => StoreProc::$reward,
  647. 'reward_Gem' => StoreProc::$reward_Gem,
  648. 'reward_equip' => StoreProc::$reward_equip,
  649. ));
  650. }
  651. /**
  652. * 6107 7日签到 累计天数宝箱奖励领取
  653. * @return type
  654. */
  655. public static function Day7_AccumulateDrawreward() {
  656. list($day) = req()->paras; # 参数: 领取第x天的奖励
  657. $yushu = $day % 10;
  658. if ($yushu == 0) {
  659. $num = $day / 10;
  660. if ($num > 6) {
  661. $n = $num % 6;
  662. $typeId = $n * 10;
  663. } else {
  664. $typeId = $day;
  665. }
  666. } else {
  667. $typeId = $yushu;
  668. }
  669. my_Assert(ctx()->privateState->day7_accumulate >= $day, ErrCode::active_day7_expired);
  670. my_Assert(!in_array($day, ctx()->privateState->day7_accumulateDrawed), ErrCode::active_hasgetted);
  671. $day_rwd = GameConfig::active_day7_accumulate_getItem($typeId); # 查询奖励数据
  672. my_Assert(null != $day_rwd, ErrCode::err_const_no); # 防御找不到配置
  673. StoreProc::AddMultiItemInStore($day_rwd->reward); # 发放奖励
  674. ctx()->privateState->day7_accumulateDrawed[] = $day;
  675. $baseArr = array(2, 4, 6, 8, 10);
  676. $tag = true;
  677. $loopNum = ctx()->privateState->day7_accumulate_loopNum;
  678. foreach ($baseArr as $id) {//查看当前这组天奖励是否全部被领取
  679. $id += ($loopNum - 1) * 10;
  680. // if(ctx()->privateState->day7_accumulate < $id){
  681. // $tag = false;
  682. // break;
  683. // }
  684. if (!in_array($id, ctx()->privateState->day7_accumulateDrawed)) {
  685. $tag = false;
  686. }
  687. }
  688. if ($tag) {//$typeId % 10 == 0
  689. ctx()->privateState->day7_accumulate_loopNum += 1;
  690. }
  691. UserProc::updateUserInfo(); # 回存
  692. return Resp::ok(array('gold' => ctx()->baseInfo->gold,
  693. 'cash' => ctx()->baseInfo->cash,
  694. 'store' => ctx()->store,
  695. 'privateState' => ctx()->privateState,
  696. 'reward' => StoreProc::$reward,
  697. 'reward_Gem' => StoreProc::$reward_Gem,
  698. 'reward_equip' => StoreProc::$reward_equip,
  699. ));
  700. }
  701. /**
  702. * 限时贩卖 2天一刷
  703. */
  704. public static function ResetLimitTsBuy() {
  705. ctx()->privateState->limitTsBuy_RewardRecord = array();
  706. $mo = GameConfig::subfun_unlock_getItem(Enum_SubFunType::LimitTsSale);
  707. $day = $mo->ts;
  708. $startDay = TimeUtil::totalDays($mo->startTs);
  709. $nextDay = TimeUtil::totalDays();
  710. $num = $nextDay - $startDay;
  711. $refershType = $num % $day; //day 2天一刷新 余数只会是0 或 1; 0:两天后在刷新,1就是已经过了一天了,在过一天就刷新,当前时间减一天
  712. ctx()->privateState->nextDayLogin = now() - 86400 * $refershType;
  713. // if ($refershType == 1) {
  714. // ctx()->privateState->nextDayLogin = now() - 86400;
  715. // }
  716. $val = intval($num / $day);
  717. $yushu = $val % glc()->activity_limitTsBuy_giftTypeNum;
  718. $type = $yushu + 1;
  719. $arr = GameConfig::activity_promopackinfo_type_getItemArray($type);
  720. $count = count($arr);
  721. $ret = array();
  722. if ($count == 6) {
  723. $ret = $arr;
  724. } else {
  725. for ($i = 0; $i < 6; $i++) {
  726. $count = count($arr);
  727. $rand = rand(0, $count - 1);
  728. $ret[] = $arr[$rand];
  729. StlUtil::arrayRemoveAt($arr, $rand);
  730. if (count($arr) == 0) {
  731. break;
  732. }
  733. }
  734. }
  735. ctx()->privateState->limitTsBuy_RandIds = array();
  736. foreach ($ret as $mo) {
  737. ctx()->privateState->limitTsBuy_RandIds[] = $mo->typeId;
  738. }
  739. }
  740. /**
  741. * 6108 限时贩售
  742. */
  743. public static function LimitTsBuy_Drawreward() {
  744. list($typeId) = req()->paras; # 参数: 领取第x天的奖励
  745. my_Assert(in_array($typeId, ctx()->privateState->limitTsBuy_RandIds), ErrCode::active_const_no_err);
  746. $mo = GameConfig::activity_promopackinfo_getItem($typeId); # 查询奖励数据
  747. my_Assert(null != $mo, ErrCode::err_const_no); # 防御找不到配置
  748. my_Assert(ctx()->baseInfo->cash >= explode(',', $mo->cost)[1], ErrCode::notenough_cash_msg);
  749. ctx()->baseInfo->Consume_Cash(explode(',', $mo->cost)[1]);
  750. $rewardArr = ctx()->privateState->limitTsBuy_RewardRecord;
  751. $count = array_count_values($rewardArr)[$typeId];
  752. my_Assert($count < $mo->limitNum, ErrCode::user_shop_LimitNum);
  753. StoreProc::AddMultiItemInStore($mo->reward); # 发放奖励
  754. ctx()->privateState->limitTsBuy_RewardRecord[] = $typeId;
  755. UserProc::updateUserInfo(); # 回存
  756. return Resp::ok(array('gold' => ctx()->baseInfo->gold,
  757. 'cash' => ctx()->baseInfo->cash,
  758. 'store' => ctx()->store,
  759. 'heros' => ctx()->heros,
  760. 'privateState' => ctx()->privateState,
  761. 'reward' => StoreProc::$reward,
  762. 'reward_Gem' => StoreProc::$reward_Gem,
  763. 'reward_equip' => StoreProc::$reward_equip,
  764. ));
  765. }
  766. /**
  767. * 6109 战令奖励领取
  768. */
  769. public static function BattlePassDrawReward() {
  770. list($id) = req()->paras;
  771. $mo = GameConfig::activity_battlepass_getItem($id); # 查询奖励数据
  772. my_Assert(null != $mo, ErrCode::err_const_no); # 防御找不到配置
  773. $subFunType = $mo->type;
  774. $typeId = $mo->typeId;
  775. $str_1 = $subFunType . '-1-' . $typeId;
  776. $str_2 = $subFunType . '-2-' . $typeId;
  777. $isHasBuy_high = false;
  778. switch ($subFunType) {
  779. case Enum_SubFunType::ActivePoint_BattlePass:
  780. $point = ctx()->privateState->battlePass_taskPoint;
  781. my_Assert($point >= $typeId, ErrCode::active_pointNotEnough);
  782. if (ctx()->privateState->battlePass_activePoint_cost_ts > 0 && now() < ctx()->privateState->battlePass_activePoint_cost_ts + 30 * 24 * 60 * 60) {
  783. $isHasBuy_high = true;
  784. }
  785. break;
  786. case Enum_SubFunType::Tili_BattleBass:
  787. my_Assert(ctx()->privateData()->battlePass_tili >= $typeId, ErrCode::active_costTiliNotEnough);
  788. if (ctx()->privateState->battlePass_tili_cost_ts > 0 && now() < ctx()->privateState->battlePass_tili_cost_ts + 30 * 24 * 60 * 60) {
  789. $isHasBuy_high = true;
  790. }
  791. break;
  792. case Enum_SubFunType::Gate_BattleBass:
  793. my_Assert(StlUtil::dictHasProperty(ctx()->gates->GateList, $typeId), ErrCode::gate_GateNoUnlock);
  794. my_Assert(ctx()->gates->GateList->$typeId->pass > 0, ErrCode::evolve_GateNoPass);
  795. if (ctx()->privateState->battlePass_gate_cost_ts > 0 && now() < ctx()->privateState->battlePass_gate_cost_ts + 30 * 24 * 60 * 60) {
  796. $isHasBuy_high = true;
  797. }
  798. break;
  799. default:
  800. break;
  801. }
  802. if (!in_array($str_1, ctx()->privateState->battlePassRewardReceived)) {
  803. StoreProc::AddMultiItemInStore($mo->rewards_1); # 发放奖励
  804. ctx()->privateData(true)->battlePassRewardReceived[] = $str_1;
  805. }
  806. //my_Assert(!in_array($str_1, ctx()->privateState->battlePassRewardReceived), ErrCode::active_hasgetted);
  807. if ($isHasBuy_high && !in_array($str_2, ctx()->privateState->battlePassRewardReceived)) {
  808. StoreProc::AddMultiItemInStore($mo->rewards_2); # 发放奖励
  809. ctx()->privateData(true)->battlePassRewardReceived[] = $str_2;
  810. }
  811. UserProc::updateUserInfo(); # 回存
  812. return Resp::ok(array('gold' => ctx()->baseInfo->gold,
  813. 'cash' => ctx()->baseInfo->cash,
  814. 'store' => ctx()->store,
  815. 'heros' => ctx()->heros,
  816. 'privateState' => ctx()->privateState,
  817. 'reward' => StoreProc::$reward,
  818. 'reward_Gem' => StoreProc::$reward_Gem,
  819. 'reward_equip' => StoreProc::$reward_equip,
  820. "tili" => ctx()->baseInfo->tili,
  821. "tili_ts" => ctx()->baseInfo->tili_ts,
  822. ));
  823. }
  824. /**
  825. * 重置战令奖励信息 一个月一清理但是不同战令 开始时间不同所以 清理时间也不同
  826. * @param type $type
  827. */
  828. public static function ResetBattlePassReward($type) {
  829. $list = ctx()->privateState->battlePassRewardReceived;
  830. $rmArr = array();
  831. foreach ($list as $str) {
  832. $arr = explode('-', $str);
  833. if ($arr[0] == $type) {
  834. $rmArr[] = $str;
  835. }
  836. }
  837. foreach ($rmArr as $k) {
  838. StlUtil::arrayRemove(ctx()->privateData(true)->battlePassRewardReceived, $k);
  839. }
  840. }
  841. /**
  842. * 7日签到 数据更新
  843. */
  844. public static function InitDay7_Sign_NewPlayer($unlock = false) {
  845. if (!$unlock && !FightProc::isFunUnlock(21)) {//之所以这有两个判断是因为这个 活动解锁的代码监测位置问题,fightProc 里解锁监测代码在 $gateInfo->tz_state = $index;之前了 这个位置没有办法解锁
  846. return;
  847. }
  848. $index = count(ctx()->privateState->day7_drawed_newPlayer_LoginDays) + 1;
  849. if (count(ctx()->privateState->day7_drawed_newPlayer_LoginDays) < 7) {
  850. ctx()->privateState->day7_drawed_newPlayer_LoginDays[] = $index;
  851. }
  852. }
  853. /**
  854. * 6110 新手7日签到
  855. * @return type
  856. */
  857. public static function Day7_Drawreward_NewPlayer() {
  858. list($day) = req()->paras; # 参数: 领取第x天的奖励
  859. my_Assert(in_array($day, ctx()->privateState->day7_drawed_newPlayer_LoginDays), ErrCode::active_day7_expired);
  860. my_Assert(!in_array($day, ctx()->privateState->day7_drawed_newPlayer), ErrCode::active_hasgetted);
  861. $day_rwd = GameConfig::activity_day7sign_newplayer_getItem($day); # 查询奖励数据
  862. my_Assert(null != $day_rwd, ErrCode::err_const_no); # 防御找不到配置
  863. StoreProc::AddMultiItemInStore($day_rwd->reward); # 发放奖励
  864. ctx()->privateState->day7_drawed_newPlayer[] = $day; # 添加领取记录
  865. UserProc::updateUserInfo(); # 回存
  866. return Resp::ok(array('gold' => ctx()->baseInfo->gold,
  867. 'cash' => ctx()->baseInfo->cash,
  868. 'store' => ctx()->store,
  869. 'heros' => ctx()->heros,
  870. 'reward' => StoreProc::$reward,
  871. 'reward_Gem' => StoreProc::$reward_Gem,
  872. 'reward_equip' => StoreProc::$reward_equip,
  873. ));
  874. }
  875. }