ZhanbuLogic.lua 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573
  1. local ZhanbuExcel = require("excel.zhanbu")
  2. local Msg = require("core.Msg")
  3. local BagLogic = require("bag.BagLogic")
  4. local HeroGrid = require("hero.HeroGrid")
  5. local Util = require("common.Util")
  6. local ObjHuman = require("core.ObjHuman")
  7. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  8. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  9. local Lang = require("common.Lang")
  10. local Broadcast = require("broadcast.Broadcast")
  11. local SysParameter = require("common.SysParameter")
  12. local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
  13. local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
  14. local HeroExcel = require("excel.hero")
  15. local HeroBook = require("hero.HeroBook")
  16. local DropExchangeLogic = require("absAct.DropExchangeLogic")
  17. local HeroGrowUp = require("absAct.HeroGrowUp")
  18. local MengxinLogic = require("present.MengxinLogic")
  19. local AbsZhanbuLunpanLogic = require("absAct.AbsZhanbuLunpanLogic")
  20. local YunYingLogic = require("yunying.YunYingLogic")
  21. --[[
  22. pool 卡池
  23. hand 手牌
  24. handCnt 手牌数量
  25. money 拥有道具数量
  26. lv 卡池等级
  27. refreshCnt 刷新次数
  28. ts 道具回复计时
  29. isGuide 是否新手引导
  30. handMaxCnt 手牌格子
  31. heartHero 心仪英雄
  32. ]]
  33. local CARD_POOL_MAX_CNT = 5 -- 卡池英雄数量
  34. local AUTO_GET_MONEY_MAX = 99 -- 自动回复最大道具数量
  35. local CARD_POOL_REFRESH = 2 -- 刷新卡池所需道具数
  36. local AUTO_GET_MONEY_TS = 300 -- 自动回复道具时间
  37. CARD_POOL = CARD_POOL or {}
  38. function initAfterStart()
  39. for i = 1,#ZhanbuExcel.pool do
  40. local grade = ZhanbuExcel.pool[i].grade
  41. local heroID = ZhanbuExcel.pool[i].heroID
  42. local weight = ZhanbuExcel.pool[i].weight
  43. CARD_POOL[grade] = CARD_POOL[grade] or {}
  44. CARD_POOL[grade].weight = CARD_POOL[grade].weight or 0
  45. CARD_POOL[grade].weight = CARD_POOL[grade].weight + ZhanbuExcel.pool[i].weight
  46. CARD_POOL[grade].pool = CARD_POOL[grade].pool or {}
  47. CARD_POOL[grade].pool[#CARD_POOL[grade].pool + 1] = {heroID,weight,i}
  48. end
  49. end
  50. local function initDB(human)
  51. if human.db.zhanbu == nil then
  52. human.db.zhanbu = {}
  53. local zhanbu = human.db.zhanbu
  54. zhanbu.hand = {}
  55. zhanbu.handCnt = 0
  56. zhanbu.handMaxCnt = 4 -- 最大手牌数为4张
  57. zhanbu.money = AUTO_GET_MONEY_MAX
  58. zhanbu.lv = 1
  59. zhanbu.isGuide = 1
  60. zhanbu.refreshCnt = 0
  61. zhanbu.heartHero = {}
  62. zhanbu.pool = {}
  63. refreshPool(human)
  64. end
  65. -- 老用户没有heartHero
  66. if human.db.zhanbu.heartHero == nil then
  67. human.db.zhanbu.heartHero = {}
  68. end
  69. local cjPrivilege = ChengjiuLogic.checkPrivilege(human, ChengjiuDefine.PRIVILEGE_TYPE_7)
  70. if cjPrivilege then
  71. -- 已激活宝具特权,改为5张
  72. human.db.zhanbu.handMaxCnt = 5
  73. else
  74. if human.db.zhanbu.hand[5] ~= nil then
  75. -- 线上玩家第五张手牌有牌者,默认激活
  76. human.db.zhanbu.handMaxCnt = 5
  77. else
  78. human.db.zhanbu.handMaxCnt = 4
  79. end
  80. end
  81. end
  82. function refreshPool(human)
  83. -- 初始化数据
  84. initDB(human)
  85. local totalWeight = 0
  86. local weightConfig = ZhanbuExcel.poolLv[human.db.zhanbu.lv]
  87. for i = 1,#weightConfig.weight do
  88. totalWeight = totalWeight + weightConfig.weight[i]
  89. end
  90. -- 另存一份
  91. local cardPoolTb = Util.copyTable(CARD_POOL)
  92. for i = 1,#cardPoolTb[3].pool do
  93. if cardPoolTb[3].pool[i][1] == human.db.zhanbu.heartHero[1] or
  94. cardPoolTb[3].pool[i][1] == human.db.zhanbu.heartHero[2] or
  95. cardPoolTb[3].pool[i][1] == human.db.zhanbu.heartHero[3] then
  96. local newWeight = math.floor(cardPoolTb[3].pool[i][2] * 20 / 100)
  97. cardPoolTb[3].weight = cardPoolTb[3].weight + newWeight
  98. cardPoolTb[3].pool[i][2] = cardPoolTb[3].pool[i][2] + newWeight
  99. end
  100. end
  101. -- 卡池五张卡
  102. for i = 1,CARD_POOL_MAX_CNT do
  103. local randomGrade = math.random(1,totalWeight)
  104. -- 抽取级别 R or SR or SSR
  105. for j = 1,#weightConfig.weight do
  106. if randomGrade <= weightConfig.weight[j] then
  107. local randomCard = math.random(1,cardPoolTb[j].weight)
  108. -- 抽取卡
  109. for k = 1,#cardPoolTb[j].pool do
  110. if randomCard <= cardPoolTb[j].pool[k][2] then
  111. human.db.zhanbu.pool[i] = cardPoolTb[j].pool[k][3]
  112. break
  113. end
  114. randomCard = randomCard - cardPoolTb[j].pool[k][2]
  115. end
  116. break
  117. end
  118. randomGrade = randomGrade - weightConfig.weight[j]
  119. end
  120. end
  121. end
  122. function zhanbuQuery(human)
  123. -- 初始化数据
  124. initDB(human)
  125. local msgRet = Msg.gc.GC_ZHANBU_QUERY
  126. local len = 0
  127. for i = 1,CARD_POOL_MAX_CNT do
  128. if human.db.zhanbu.pool[i] ~= nil then
  129. len = len + 1
  130. local index = human.db.zhanbu.pool[i]
  131. local config = ZhanbuExcel.pool[index]
  132. HeroGrid.makeHeroSimpleByID(msgRet.heroPool[len].heroInfo, config.heroID)
  133. msgRet.heroPool[len].price = config.price
  134. msgRet.heroPool[len].index = i
  135. end
  136. end
  137. msgRet.isGuide = human.db.zhanbu.isGuide or 0
  138. -- 新手引导,将配表中数据放到卡池中
  139. if human.db.zhanbu.isGuide == 1 then
  140. len = 0
  141. sysHeroList = SysParameter.getSysParameterTb(SysParameter.PARAMETER_16)
  142. for i = 1,#sysHeroList do
  143. len = len + 1
  144. local index = sysHeroList[i]
  145. local config = ZhanbuExcel.pool[index]
  146. human.db.zhanbu.pool[i] = index
  147. HeroGrid.makeHeroSimpleByID(msgRet.heroPool[len].heroInfo, config.heroID)
  148. msgRet.heroPool[len].price = config.price
  149. msgRet.heroPool[len].index = i
  150. end
  151. human.db.zhanbu.isGuide = 0
  152. end
  153. msgRet.heroPool[0] = len
  154. msgRet.isLock = 1
  155. if human.db.zhanbu.handMaxCnt == 5 then
  156. msgRet.isLock = 0
  157. end
  158. len = 0
  159. for i = 1,human.db.zhanbu.handMaxCnt do
  160. if human.db.zhanbu.hand[i] ~= nil then
  161. len = len + 1
  162. local index = human.db.zhanbu.hand[i]
  163. local config = ZhanbuExcel.pool[index]
  164. HeroGrid.makeHeroSimpleByID(msgRet.hand[len].heroInfo, config.heroID)
  165. msgRet.hand[len].price = config.price
  166. msgRet.hand[len].index = i
  167. end
  168. end
  169. msgRet.hand[0] = len
  170. msgRet.cardRate = Util.copyTable(ZhanbuExcel.poolLv[human.db.zhanbu.lv].weight)
  171. msgRet.cardRate[0] = 3
  172. msgRet.lv = human.db.zhanbu.lv
  173. msgRet.money = human.db.zhanbu.money
  174. msgRet.moneyMax = AUTO_GET_MONEY_MAX
  175. msgRet.moneyCost = 1
  176. msgRet.nextRecover = AUTO_GET_MONEY_TS
  177. msgRet.recoverTs = AUTO_GET_MONEY_TS
  178. if human.db.zhanbu.ts then
  179. local now = os.time()
  180. msgRet.nextRecover = human.db.zhanbu.ts + AUTO_GET_MONEY_TS - now
  181. end
  182. msgRet.hasRed = xinyiDot(human) and 1 or 0
  183. Msg.send(msgRet,human.fd)
  184. end
  185. function buyCard(human,index,heroID)
  186. -- 错误,数据都没有,乱搞
  187. if human.db.zhanbu == nil or human.db.zhanbu.pool == nil then
  188. return
  189. end
  190. local heroIndex = human.db.zhanbu.pool[index]
  191. -- 错误,数据对不上
  192. local config = ZhanbuExcel.pool[heroIndex]
  193. if not config or config.heroID ~= heroID then
  194. return
  195. end
  196. -- 判断是否可合成碎片
  197. local sameCnt = 0
  198. for i = 1,human.db.zhanbu.handMaxCnt do
  199. if human.db.zhanbu.hand[i] ~= nil and
  200. human.db.zhanbu.hand[i] == heroIndex then
  201. sameCnt = sameCnt + 1
  202. end
  203. end
  204. -- 判断消耗是否够
  205. if human.db.zhanbu.money < config.price then
  206. return Broadcast.sendErr(human,Lang.ABS_ITEM_ERR)
  207. end
  208. local msgRet = Msg.gc.GC_ZHANBU_BUY_CARD
  209. -- 可合成碎片
  210. if sameCnt >= 2 then
  211. -- 扣除消耗
  212. human.db.zhanbu.money = human.db.zhanbu.money - config.price
  213. RoleSystemLogic.onDot(human,RoleSystemDefine.ROLE_SYS_ID_502)
  214. -- 自动回复计时
  215. if human.db.zhanbu.money < AUTO_GET_MONEY_MAX then
  216. human.db.zhanbu.ts = human.db.zhanbu.ts or os.time()
  217. end
  218. -- 扣除手牌
  219. for i = 1,human.db.zhanbu.handMaxCnt do
  220. if human.db.zhanbu.hand[i] ~= nil and
  221. human.db.zhanbu.hand[i] == heroIndex then
  222. human.db.zhanbu.hand[i] = nil
  223. human.db.zhanbu.handCnt = human.db.zhanbu.handCnt - 1
  224. end
  225. end
  226. -- 从卡池中删除
  227. human.db.zhanbu.pool[index] = nil
  228. -- 增加碎片
  229. local randomCnt = math.random(config.chipCnt[1],config.chipCnt[2])
  230. local item = {}
  231. item[config.heroID] = randomCnt
  232. BagLogic.addItem(human, config.heroID, randomCnt, "zhanbu")
  233. if config.grade == 3 then
  234. DropExchangeLogic.drawSSR(human, item, 1)
  235. end
  236. local zhanbuActItemID,zhanbuActCnt = AbsZhanbuLunpanLogic.getZhanbuComposeCnt(human, config.grade)
  237. if zhanbuActCnt and zhanbuActCnt > 0 then
  238. item[zhanbuActItemID] = zhanbuActCnt
  239. BagLogic.addItem(human, zhanbuActItemID, zhanbuActCnt, "zhanbu")
  240. end
  241. BagLogic.sendItemGetList(human, item, "zhanbu")
  242. msgRet.index = 0
  243. HeroGrowUp.onCallback(human, HeroGrowUp.TASKTYPE3, 1)
  244. MengxinLogic.onCallBack(human,MengxinLogic.MX_TASK_TYPE_6,1)
  245. else
  246. -- 判断手牌是否已满
  247. if human.db.zhanbu.handCnt >= human.db.zhanbu.handMaxCnt then
  248. return Broadcast.sendErr(human,Lang.ZHANBU_HAND_CARD_FULL)
  249. end
  250. -- 扣除消耗
  251. human.db.zhanbu.money = human.db.zhanbu.money - config.price
  252. RoleSystemLogic.onDot(human,RoleSystemDefine.ROLE_SYS_ID_502)
  253. -- 自动回复计时
  254. if human.db.zhanbu.money < AUTO_GET_MONEY_MAX then
  255. human.db.zhanbu.ts = human.db.zhanbu.ts or os.time()
  256. end
  257. -- 从卡池中删除
  258. human.db.zhanbu.pool[index] = nil
  259. for i = 1,human.db.zhanbu.handMaxCnt do
  260. if human.db.zhanbu.hand[i] == nil then
  261. human.db.zhanbu.handCnt = human.db.zhanbu.handCnt + 1
  262. human.db.zhanbu.hand[i] = heroIndex
  263. msgRet.index = i
  264. break
  265. end
  266. end
  267. end
  268. -- 通知客户端购买成功
  269. Msg.send(msgRet,human.fd)
  270. -- 刷新界面
  271. zhanbuQuery(human)
  272. YunYingLogic.onCallBack(human, "onZhanBuBuyCard", config.price)
  273. end
  274. function sellCard(human,index,heroID)
  275. -- 错误,数据都没有,乱搞
  276. if human.db.zhanbu == nil or human.db.zhanbu.hand == nil then
  277. return
  278. end
  279. -- 校验卡的合法性
  280. local heroIndex = human.db.zhanbu.hand[index]
  281. local config = ZhanbuExcel.pool[heroIndex]
  282. if heroIndex == nil or config == nil then
  283. return
  284. end
  285. -- 删除手牌
  286. human.db.zhanbu.hand[index] = nil
  287. human.db.zhanbu.handCnt = human.db.zhanbu.handCnt - 1
  288. -- 增加道具
  289. human.db.zhanbu.money = human.db.zhanbu.money + config.price
  290. RoleSystemLogic.onDot(human,RoleSystemDefine.ROLE_SYS_ID_502)
  291. -- 自动回复计时
  292. if human.db.zhanbu.money >= AUTO_GET_MONEY_MAX then
  293. human.db.zhanbu.ts = nil
  294. end
  295. -- 通知客户端售出成功
  296. Msg.send(Msg.gc.GC_ZHANBU_SELL_CARD,human.fd)
  297. -- 刷新界面
  298. zhanbuQuery(human)
  299. YunYingLogic.onCallBack(human, "onZhanBuBuyCard", -config.price)
  300. end
  301. function changePos(human,posList)
  302. -- 错误,数据都没有,乱搞
  303. if human.db.zhanbu == nil or human.db.zhanbu.hand == nil then
  304. return
  305. end
  306. -- 检验所有位置是否合法
  307. local tb = Util.split(posList, "|")
  308. -- 长度不对,不合法
  309. if #tb > human.db.zhanbu.handMaxCnt then
  310. return
  311. end
  312. for i = 1,#tb do
  313. -- 不能将卡删除
  314. tb[i] = tonumber(tb[i])
  315. if tb[i] == 0 and human.db.zhanbu.hand[i] ~= nil then
  316. return
  317. end
  318. -- 新位置不合法
  319. if tb[i] > human.db.zhanbu.handMaxCnt then
  320. return
  321. end
  322. end
  323. -- 交换位置
  324. local dataList = Util.copyTable(human.db.zhanbu.hand)
  325. human.db.zhanbu.hand = {}
  326. for i = 1,human.db.zhanbu.handMaxCnt do
  327. if tb[i] ~= 0 then
  328. human.db.zhanbu.hand[tb[i]] = dataList[i]
  329. end
  330. end
  331. zhanbuQuery(human)
  332. end
  333. function refreshCardPool(human)
  334. -- 错误,数据都没有,乱搞
  335. if human.db.zhanbu == nil or human.db.zhanbu.hand == nil then
  336. return
  337. end
  338. -- 校验材料不够
  339. if human.db.zhanbu.money < CARD_POOL_REFRESH then
  340. return Broadcast.sendErr(human,Lang.ABS_ITEM_ERR)
  341. end
  342. -- 扣除材料
  343. human.db.zhanbu.money = human.db.zhanbu.money - CARD_POOL_REFRESH
  344. RoleSystemLogic.onDot(human,RoleSystemDefine.ROLE_SYS_ID_502)
  345. -- 自动回复计时
  346. if human.db.zhanbu.money < AUTO_GET_MONEY_MAX then
  347. human.db.zhanbu.ts = human.db.zhanbu.ts or os.time()
  348. end
  349. -- 刷新
  350. refreshPool(human)
  351. -- 刷新成功,次数+1
  352. onLv(human)
  353. -- 刷新界面
  354. zhanbuQuery(human)
  355. --占卜轮盘活动 刷新后回调
  356. AbsZhanbuLunpanLogic.onZhanbuRefresh(human)
  357. YunYingLogic.onCallBack(human, "onZhanBuBuyCard", CARD_POOL_REFRESH)
  358. end
  359. -- 心仪英雄
  360. function zhanbuHeartHeroQuery(human)
  361. -- 错误,数据都没有,乱搞
  362. if human.db.zhanbu == nil or human.db.zhanbu.hand == nil then
  363. return
  364. end
  365. local msgRet = Msg.gc.GC_ZHANBU_HEART_HERO_QUERY
  366. for i = 1,3 do
  367. local heroID = human.db.zhanbu.heartHero[i]
  368. msgRet.heroInfo[i] = heroID or 0
  369. end
  370. msgRet.heroInfo[0] = 3
  371. local len = 0
  372. for heroID,v in pairs(human.db.heroBook) do
  373. local heroConfig = HeroExcel.hero[heroID]
  374. if heroConfig and heroConfig.grade == 4 then
  375. len = len + 1
  376. msgRet.heroList[len] = heroID
  377. end
  378. end
  379. msgRet.heroList[0] = len
  380. Msg.send(msgRet,human.fd)
  381. end
  382. -- 设置心仪英雄
  383. function setHeartHero(human,heroList)
  384. -- 错误,数据都没有,乱搞
  385. if human.db.zhanbu == nil or human.db.zhanbu.hand == nil then
  386. return
  387. end
  388. -- 检验所有位置是否合法
  389. local tb = Util.split(heroList, "|")
  390. -- 长度不对,不合法
  391. local len = #tb
  392. if len > 3 then
  393. return
  394. end
  395. -- 校验英雄是否是图鉴中,是否是SSR
  396. for i = 1,len do
  397. tb[i] = tonumber(tb[i])
  398. local heroID = tb[i]
  399. if heroID ~= 0 then
  400. local heroConfig = HeroExcel.hero[heroID]
  401. -- 不是已激活图鉴中,返回
  402. if not HeroBook.isGet(human, heroID,heroConfig.star) then
  403. return
  404. end
  405. -- 不是SSR,返回
  406. if heroConfig.grade ~= 4 then
  407. return
  408. end
  409. end
  410. end
  411. -- 保存至玩家数据
  412. human.db.zhanbu.heartHero = {}
  413. for i = 1,len do
  414. if tb[i] ~= 0 then
  415. human.db.zhanbu.heartHero[i] = tb[i]
  416. end
  417. end
  418. -- 刷新心仪英雄数据
  419. zhanbuHeartHeroQuery(human)
  420. end
  421. function onLv(human)
  422. human.db.zhanbu.refreshCnt = human.db.zhanbu.refreshCnt + 1
  423. if human.db.zhanbu.refreshCnt >= ZhanbuExcel.poolLv[human.db.zhanbu.lv].cnt and
  424. human.db.zhanbu.lv < #ZhanbuExcel.poolLv then
  425. human.db.zhanbu.lv = human.db.zhanbu.lv + 1
  426. local msgRet = Msg.gc.GC_ZHANBU_LVUP
  427. msgRet.cardRate = Util.copyTable(ZhanbuExcel.poolLv[human.db.zhanbu.lv].weight)
  428. msgRet.cardRate[0] = 3
  429. msgRet.lv = human.db.zhanbu.lv
  430. Msg.send(msgRet,human.fd)
  431. end
  432. end
  433. function checkRecover()
  434. local now = os.time()
  435. for _,human in pairs(ObjHuman.onlineUuid) do
  436. if human.db.zhanbu and human.db.zhanbu.ts then
  437. local ts = now - human.db.zhanbu.ts
  438. local cnt = math.floor(ts/AUTO_GET_MONEY_TS)
  439. if cnt >= 1 and human.db.zhanbu.money < AUTO_GET_MONEY_MAX then
  440. human.db.zhanbu.money = human.db.zhanbu.money + cnt
  441. human.db.zhanbu.ts = human.db.zhanbu.ts + AUTO_GET_MONEY_TS * cnt
  442. if human.db.zhanbu.money >= AUTO_GET_MONEY_MAX then
  443. human.db.zhanbu.ts = nil
  444. human.db.zhanbu.money = AUTO_GET_MONEY_MAX
  445. end
  446. RoleSystemLogic.onDot(human,RoleSystemDefine.ROLE_SYS_ID_502)
  447. elseif human.db.zhanbu.money >= AUTO_GET_MONEY_MAX then
  448. human.db.zhanbu.ts = nil
  449. end
  450. end
  451. end
  452. end
  453. function isDot(human)
  454. if human.db.lv < 14 then
  455. return
  456. end
  457. initDB(human)
  458. if human.db.zhanbu and human.db.zhanbu.money >= 30 then
  459. return true
  460. end
  461. if xinyiDot(human) then
  462. return true
  463. end
  464. return
  465. end
  466. function updateDaily(human)
  467. if human.db.zhanbu == nil then
  468. return
  469. end
  470. human.db.zhanbu.lv = 1
  471. human.db.zhanbu.refreshCnt = 0
  472. end
  473. function addZhanbuItem(human,cnt)
  474. -- 初始化数据
  475. initDB(human)
  476. human.db.zhanbu.money = human.db.zhanbu.money + cnt
  477. end
  478. function xinyiDot(human)
  479. if human.db.heroBook == nil then return end
  480. local count = 0
  481. for k ,v in pairs(human.db.heroBook) do
  482. if type(k) == "number" then
  483. if HeroExcel.hero[k].grade == 4 then
  484. count = count + 1
  485. end
  486. end
  487. end
  488. local xinyiCount = 0
  489. for i = 1, 3 do
  490. if human.db.zhanbu.heartHero[i] ~= nil then
  491. xinyiCount = xinyiCount + 1
  492. end
  493. end
  494. if xinyiCount < count and xinyiCount < 3 then
  495. return true
  496. end
  497. end