HuanjingTowerLogic.lua 35 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145
  1. --
  2. -- human.db.tower.tili
  3. -- human.db.tower.ts
  4. -- human.db.tower.rewards
  5. -- human.db.tower.lv
  6. -- human.db.tower.usetime
  7. local Lang = require("common.Lang")
  8. local Util = require("common.Util")
  9. local Msg = require("core.Msg")
  10. local LuaMongo = _G.lua_mongo
  11. local DB = require("common.DB")
  12. local ObjHuman = require("core.ObjHuman")
  13. local HuanjingTowerExcel = require("excel.huanjingTower")
  14. local MonsterExcel = require("excel.monster")
  15. local Broadcast = require("broadcast.Broadcast")
  16. local CombatDefine = require("combat.CombatDefine")
  17. local CombatLogic = require("combat.CombatLogic")
  18. local CombatVideo = require("combat.CombatVideo")
  19. local BagLogic = require("bag.BagLogic")
  20. local Grid = require("bag.Grid")
  21. local ItemDefine = require("bag.ItemDefine")
  22. local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
  23. local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
  24. local BattleLogic = require("battle.BattleLogic")
  25. local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
  26. local RoleLogic = require("role.RoleLogic")
  27. local BRoleLogic = require("billboard.BRoleLogic")
  28. local BillboardDefine = require("billboard.BillboardDefine")
  29. local Log = require("common.Log")
  30. local TuiSongLiBao = require("present.TuiSongLiBao")
  31. local HuanjingTowerDB = require("huanjingTower.HuanjingTowerDB")
  32. local VipLogic = require("vip.VipLogic")
  33. local DailyTaskLogic = require("dailyTask.DailyTaskLogic")
  34. local LiLianLogic = require("dailyTask.LiLianLogic")
  35. local HeroGrid = require("hero.HeroGrid")
  36. local BillboardDB = require("billboard.BillboardDB")
  37. local BillboardDefine = require("billboard.BillboardDefine")
  38. local BuyLogic = require("topup.BuyLogic")
  39. local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
  40. local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
  41. local JibanLogic = require("combat.JibanLogic")
  42. local RoleDBLogic = require("role.RoleDBLogic")
  43. local MengxinLogic = require("present.MengxinLogic")
  44. local YunYingLogic = require("yunying.YunYingLogic")
  45. local GiftLogic = require("topup.GiftLogic")
  46. local WarOrder = require("shop.WarOrder")
  47. local TriggerLogic = require("trigger.TriggerLogic")
  48. local TriggerDefine = require("trigger.TriggerDefine")
  49. local TalismanLogic = require("talisman.TalismanLogic")
  50. TOWER_LV_HEAD_MAX = 15 -- 每层 储存 玩家头像数据
  51. TILI_MAX_CNT = 10 -- 最大体力
  52. BUY_TILI_ITEM_ID = 102 -- 购买体力花费的物品ID
  53. BUY_TILI_ITEM_CNT = 20 -- 购买一次体力所需的钻石
  54. TILI_RECOVER_TIME = 1800 -- 体力恢复时间
  55. BUY_TILI_BUY_ZUANSHI = {20, 30, 40}
  56. TILI_FREE = 2 -- 每天最大 免费次数
  57. -- 用于弹窗触发类型 @ma 是否需要同意定义枚举
  58. local EVAL_TOWER_EVENT = 2
  59. local DEVIL_ORDER_TYPE = 2
  60. -- 奖励状态
  61. REWARD_STATUS_NONE = 0 -- 不可领
  62. REWARD_STATUS_GET = 1 -- 可领
  63. REWARD_STATUS_HADGET = 2 -- 已领
  64. TOWER_TONGGUAN_TYPE = 1 -- 通关奖励
  65. TOWER_KING_TYPE = 2 -- 通关王者奖励
  66. --秘宝加成
  67. local function HJ_GetTalismanAdd(human)
  68. local dailyFreeTimes = TalismanLogic.getTalismanAdd(human, TalismanLogic.OTHER_EFFECT_TBL.HJ_DAILY_Free) or 0
  69. return dailyFreeTimes
  70. end
  71. function initSeverTower(nowLv)
  72. local towerDB = HuanjingTowerDB.query(#HuanjingTowerExcel.huanjingTower)
  73. if towerDB then
  74. return
  75. end
  76. local msg = {}
  77. nowLv = nowLv or 1
  78. for i = nowLv, #HuanjingTowerExcel.huanjingTower do
  79. local config = HuanjingTowerExcel.huanjingTower[i]
  80. if config then
  81. msg = {}
  82. msg.lv = i
  83. msg.combatVideo = {}
  84. msg.headNum = 0
  85. msg.headList = {}
  86. msg.roleNum = 0
  87. HuanjingTowerDB.addTower(msg)
  88. else
  89. break
  90. end
  91. end
  92. end
  93. -- 玩家修改 头像 后续处理
  94. function changeHeadAfter(human)
  95. if not human.db.tower or not human.db.tower.lv then
  96. return
  97. end
  98. local data = HuanjingTowerDB.query(human.db.tower.lv)
  99. if checkTowerDBHaveByUuid(human.db._id, data) then
  100. local new = data.headList[human.db._id]
  101. new.head = human.db.head
  102. new.headFrame = human.db.headFrame
  103. HuanjingTowerDB.updateDB(data)
  104. end
  105. end
  106. -- 幻境之塔查询
  107. function query(human)
  108. local flag, config = RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_1203)
  109. if flag ~= true then
  110. --return Broadcast.sendErr(human, Lang.HUANJINGTOWER_OPEN_NEED_LV)
  111. return Broadcast.sendErr(human, Util.format(Lang.COMMON_NEED_LEVEL, config.lv))
  112. end
  113. local msgRet = Msg.gc.GC_HUANGJINGTOWER_QUERY
  114. local buyCnt = getBuyCnt(human)
  115. msgRet.buyCost = BUY_TILI_BUY_ZUANSHI[buyCnt + 1] or BUY_TILI_BUY_ZUANSHI[1]
  116. msgRet.cnt = getCurCnt(human)
  117. msgRet.cntMax = getMaxCnt(human)
  118. local nowLv = 1
  119. if human.db.tower and human.db.tower.lv then
  120. nowLv = human.db.tower.lv + 1
  121. end
  122. msgRet.bEnd = 0
  123. local nConfLv = #HuanjingTowerExcel.huanjingTower
  124. if nConfLv < nowLv then
  125. msgRet.bEnd = 1
  126. end
  127. nowLv = math.min(nowLv, nConfLv)
  128. msgRet.mylv = nowLv
  129. local thisTowerConfig = HuanjingTowerExcel.huanjingTower[nowLv]
  130. if not thisTowerConfig then
  131. return
  132. end
  133. --- 等排行榜写完 读取前三
  134. msgRet.rank[0] = 0
  135. local board = BillboardDB.getBoard(BillboardDefine.TYPE_TOWER)
  136. if board then
  137. for k = 1, 3 do
  138. local rankData = board.rank2data[k]
  139. if rankData then
  140. msgRet.rank[0] = msgRet.rank[0] + 1
  141. local net = msgRet.rank[msgRet.rank[0]]
  142. if rankData and rankData.roleBase then
  143. RoleLogic.makeRoleBase(rankData.roleBase, net.roleBase)
  144. else
  145. local roleUuid = rankData and rankData.uuid or ""
  146. RoleLogic.getRoleBaseByUuid(roleUuid, net.roleBase)
  147. end
  148. net.lv = rankData and rankData.value1 or 0
  149. end
  150. end
  151. end
  152. local cnt = 0
  153. local thisMax = nowLv + 28
  154. local thisMin = nowLv - 1
  155. if thisMin <= 0 then
  156. thisMin = 1
  157. thisMax = thisMin + 29
  158. elseif thisMax > #HuanjingTowerExcel.huanjingTower then
  159. thisMax = #HuanjingTowerExcel.huanjingTower
  160. thisMin = thisMax - 29
  161. end
  162. msgRet.canBuy = math.max(VipLogic.getPowerArgs(human, VipLogic.VIP_POWER3) - getBuyCnt(human), 0)
  163. msgRet.maxLv = #HuanjingTowerExcel.huanjingTower
  164. for i = thisMin, thisMax do
  165. local config = HuanjingTowerExcel.huanjingTower[i]
  166. cnt = cnt + 1
  167. msgRet.list[cnt].lv = i
  168. msgRet.list[cnt].head[0] = 0
  169. msgRet.list[cnt].reward[0] = 0
  170. msgRet.list[cnt].body = HeroGrid.getMonsterOutIDBody(config.monsterOutID)
  171. local data = HuanjingTowerDB.query(i)
  172. local have = data.roleNum
  173. have = have > 0 and have or 0
  174. have = have < 3 and have or 3
  175. for _, v in pairs(data.headList) do
  176. local head = v.head
  177. msgRet.list[cnt].head[0] = msgRet.list[cnt].head[0] + 1
  178. msgRet.list[cnt].head[msgRet.list[cnt].head[0]] = head
  179. end
  180. local len = 0
  181. if nowLv <= i then
  182. for j, h in ipairs(config.firstReward) do
  183. len = len + 1
  184. Grid.makeItem(msgRet.list[cnt].reward[len], h[1], h[2])
  185. msgRet.list[cnt].reward[0] = len
  186. end
  187. end
  188. end
  189. msgRet.list[0] = cnt
  190. msgRet.hasReward = isDotReward(human) and 1 or 0
  191. -- Msg.trace(msgRet)
  192. Msg.send(msgRet, human.fd)
  193. end
  194. function getRewardStatus(human, type, id, needLv)
  195. local lv = human.db.tower and human.db.tower.lv or 0
  196. if type == TOWER_KING_TYPE and (not human.db.tower or not human.db.tower.vip) then
  197. return REWARD_STATUS_NONE
  198. end
  199. if needLv > lv then
  200. return REWARD_STATUS_NONE
  201. end
  202. if isGetReward(human, type, id) then
  203. return isGetReward(human, type, id)
  204. end
  205. return REWARD_STATUS_NONE
  206. end
  207. -- 通关奖励查询 or 冲塔王者 查询
  208. function sendRewardQuery(human, type)
  209. local lv = human.db.tower and human.db.tower.lv or 0
  210. local msgRet = Msg.gc.GC_HUANGJINGTOWER_REWARD_QUERY
  211. msgRet.type = type
  212. msgRet.state = 1
  213. msgRet.kingNeed = HuanjingTowerExcel.towerKing[1].tower
  214. local config = HuanjingTowerExcel.tongGuan
  215. if type == 2 then
  216. config = HuanjingTowerExcel.towerKing
  217. msgRet.state = human.db.tower.vip and 1 or 0
  218. end
  219. msgRet.isEnd = 0
  220. msgRet.lvMax = 0
  221. msgRet.hasRed[0] = 0
  222. local len = 0
  223. for k, v in ipairs(config) do
  224. len = len + 1
  225. local net = msgRet.list[len]
  226. net.id = k
  227. net.status = getRewardStatus(human, type, k, v.tower)
  228. net.needLv = v.tower
  229. net.reward[0] = 0
  230. for j, h in ipairs(v.reward) do
  231. net.reward[0] = net.reward[0] + 1
  232. Grid.makeItem(net.reward[net.reward[0]], h[1], h[2])
  233. end
  234. if len >= 30 then
  235. msgRet.list[0] = len
  236. Msg.send(msgRet, human.fd)
  237. len = 0
  238. end
  239. end
  240. msgRet.list[0] = len
  241. msgRet.hasRed[0] = 0
  242. for i = 1, 2 do
  243. local isRed = isDotByType(human, i)
  244. if isRed then
  245. msgRet.hasRed[0] = msgRet.hasRed[0] + 1
  246. msgRet.hasRed[msgRet.hasRed[0]] = i
  247. end
  248. end
  249. msgRet.isEnd = 1
  250. msgRet.lvMax = lv
  251. --Msg.trace(msgRet)
  252. Msg.send(msgRet, human.fd)
  253. end
  254. -- 获取 奖励
  255. function getReward(human, type, id)
  256. -- local config = HuanjingTowerExcel.tongGuan[id]
  257. -- local logStr = "tower_reward"
  258. -- if type == 2 then
  259. -- config = HuanjingTowerExcel.towerKing[id]
  260. -- logStr = "tower_king_reward"
  261. -- end
  262. local config = HuanjingTowerExcel.tongGuan
  263. local logStr = "tower_reward"
  264. if type == 2 then
  265. config = HuanjingTowerExcel.towerKing
  266. logStr = "tower_king_reward"
  267. end
  268. if not config then
  269. return
  270. end
  271. local tItem = {}
  272. for nID, v in ipairs(config) do
  273. local status = getRewardStatus(human, type, nID, v.tower)
  274. if REWARD_STATUS_GET == status then
  275. setGetReward(human, type, nID)
  276. for _, value in ipairs(v.reward) do
  277. if not tItem[value[1]] then
  278. tItem[value[1]] = 0
  279. end
  280. tItem[value[1]] = tItem[value[1]] + value[2]
  281. end
  282. end
  283. end
  284. if nil == _G.next(tItem) then
  285. return
  286. end
  287. local tGoods = {}
  288. for nID, nNum in pairs(tItem) do
  289. table.insert(tGoods, {nID, nNum})
  290. end
  291. BagLogic.addItemList(human, tGoods, logStr)
  292. -- local status = getRewardStatus(human, type, id, config.tower)
  293. -- if status == REWARD_STATUS_NONE then
  294. -- return Broadcast.sendErr(human, Lang.YUNYING_GET_ERR_CONDITION)
  295. -- end
  296. -- if status == REWARD_STATUS_HADGET then
  297. -- return Broadcast.sendErr(human, Lang.YUNYING_GET_ERR_HADGET)
  298. -- end
  299. -- setGetReward(human, type, id)
  300. -- BagLogic.addItemList(human, config.reward, logStr)
  301. --- 此处 后续优化 不发送 sendRewardQuery
  302. --- GC_HUANGJINGTOWER_REWARD_GET 新增 type id 客户端 做处理更新界面 等客户端 有时间了改
  303. --sendRewardQuery(human, type)
  304. local msgRet = Msg.gc.GC_HUANGJINGTOWER_REWARD_GET
  305. msgRet.hasReward = isDotReward(human) and 1 or 0
  306. Msg.send(msgRet, human.fd)
  307. sendRewardQuery(human, type)
  308. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1203)
  309. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1201)
  310. end
  311. TOWER_KING_ALL_REWARD = nil
  312. function unlockTowerKingQuery(human)
  313. if not human.db.tower then
  314. return
  315. end
  316. if human.db.tower.vip and human.db.tower.vip == 1 then
  317. return
  318. end
  319. local msgRet = Msg.gc.GC_HUANGJINGTOWER_KING_REWARD
  320. local config = HuanjingTowerExcel.towerKing[1]
  321. msgRet.reward[0] = config.activeReward
  322. for k, v in ipairs(config.activeReward) do
  323. Grid.makeItem(msgRet.reward[k], v[1], v[2])
  324. end
  325. if not TOWER_KING_ALL_REWARD then
  326. TOWER_KING_ALL_REWARD = {}
  327. local have = {}
  328. for k, v in ipairs(HuanjingTowerExcel.towerKing) do
  329. if have[v[1]] then
  330. local index = have[v[1]]
  331. TOWER_KING_ALL_REWARD[index].itemCnt = TOWER_KING_ALL_REWARD[index].itemCnt + v[2]
  332. else
  333. local tolal = TOWER_KING_ALL_REWARD[0] + 1
  334. TOWER_KING_ALL_REWARD[tolal] = {}
  335. TOWER_KING_ALL_REWARD[tolal].itemID = v[1]
  336. TOWER_KING_ALL_REWARD[tolal].itemCnt = v[2]
  337. TOWER_KING_ALL_REWARD[0] = tolal
  338. have[v[1]] = tolal
  339. end
  340. end
  341. end
  342. msgRet.allItem[0] = #TOWER_KING_ALL_REWARD
  343. for k, v in ipairs(TOWER_KING_ALL_REWARD) do
  344. Grid.makeItem(msgRet.allItem[k], v.itemID, v.itemCnt)
  345. end
  346. BuyLogic.fontBuyItem(human, msgRet.buyItem, config.buyID)
  347. Msg.send(msgRet, human.fd)
  348. end
  349. -- 解锁通关王者
  350. function unlockTowerKing(human)
  351. if not human.db.tower then
  352. return
  353. end
  354. local config = HuanjingTowerExcel.towerKing[1]
  355. local kingNeed = config.tower
  356. if human.db.tower.lv < kingNeed then
  357. return
  358. end
  359. human.db.tower.vip = 1
  360. BagLogic.addItemList(human, config.activeReward, "tower_king_unlock")
  361. sendRewardQuery(human, TOWER_KING_TYPE)
  362. end
  363. function getSaoDangState(human, lv)
  364. local nowLv = 1
  365. if human.db.tower and human.db.tower.lv then
  366. nowLv = human.db.tower.lv + 1
  367. end
  368. if nowLv > lv then
  369. return 1
  370. end
  371. return 0
  372. end
  373. -- 战斗查询
  374. function fightQuery(human, lv)
  375. local huanjingTowerConfig = HuanjingTowerExcel.huanjingTower[lv]
  376. if not huanjingTowerConfig then
  377. return
  378. end
  379. local buyCnt = getBuyCnt(human)
  380. local msgRet = Msg.gc.GC_HUANGJINGTOWER_FIGHT_QUERY
  381. msgRet.lv = lv
  382. msgRet.zhandouli = huanjingTowerConfig.zhandouli
  383. msgRet.isSaoDang = getSaoDangState(human, lv)
  384. msgRet.buyCost = BUY_TILI_BUY_ZUANSHI[buyCnt + 1] or BUY_TILI_BUY_ZUANSHI[1]
  385. msgRet.canBuy = math.max(VipLogic.getPowerArgs(human, VipLogic.VIP_POWER3) - getBuyCnt(human), 0)
  386. local monsterOutID = huanjingTowerConfig.monsterOutID
  387. local monsterOutConfig = MonsterExcel.monsterOut[monsterOutID]
  388. if not monsterOutConfig then
  389. assert()
  390. end
  391. local cnt = 0
  392. for key, member in ipairs(monsterOutConfig.member) do
  393. local value = member[1]
  394. if value ~= 0 then
  395. cnt = cnt + 1
  396. local tempMonsterConfig = MonsterExcel.monster[value]
  397. if not tempMonsterConfig then
  398. assert()
  399. end
  400. local other = {}
  401. other.lv = member[2]
  402. HeroGrid.makeHeroSimpleByMonsterID(msgRet.monsterList[cnt], value, other)
  403. end
  404. end
  405. msgRet.monsterList[0] = cnt
  406. for key, value in ipairs(huanjingTowerConfig.reward) do
  407. Grid.makeItem(msgRet.rewardList[key], value[1], value[2])
  408. end
  409. msgRet.rewardList[0] = #huanjingTowerConfig.reward
  410. msgRet.fristReward[0] = 0
  411. local myLv = human.db.tower and human.db.tower.lv or 0
  412. if myLv < lv then
  413. for j, h in ipairs(huanjingTowerConfig.firstReward) do
  414. Grid.makeItem(msgRet.fristReward[j], h[1], h[2])
  415. end
  416. msgRet.fristReward[0] = #huanjingTowerConfig.firstReward
  417. end
  418. Msg.send(msgRet, human.fd)
  419. end
  420. -- 扫荡挑战
  421. function saodangDO(human, lv)
  422. local cnt = getCurCnt(human)
  423. if cnt < 1 then
  424. buyTiliDo(human)
  425. cnt = getCurCnt(human)
  426. if cnt < 1 then
  427. return
  428. end
  429. end
  430. local config = HuanjingTowerExcel.huanjingTower[lv]
  431. if not config then
  432. return
  433. end
  434. local myLv = human.db.tower and human.db.tower.lv or 0
  435. if myLv < lv then
  436. return
  437. end
  438. -- 增加次数
  439. addTili(human, 1)
  440. -- 发放奖励
  441. BagLogic.addItemList(human, config.reward, "tower_win_reward")
  442. DailyTaskLogic.recordDailyTaskFinishCnt(human, DailyTaskLogic.DAILY_TASK_ID_5, 1)
  443. YunYingLogic.onCallBack(human, "onHuangjingTower",1)
  444. query(human)
  445. fightQuery(human, lv)
  446. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1203)
  447. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1201)
  448. end
  449. -- 一键扫荡
  450. function oneClickSaodang(human)
  451. local cnt = getCurCnt(human)
  452. local buyCnt = getBuyCnt(human)
  453. local maxBuyCnt = VipLogic.getPowerArgs(human, VipLogic.VIP_POWER3)
  454. if cnt < 1 and buyCnt >= maxBuyCnt then
  455. return
  456. end
  457. local myLv = human.db.tower and human.db.tower.lv or 0
  458. if myLv < 1 then
  459. return
  460. end
  461. local config = HuanjingTowerExcel.huanjingTower[myLv]
  462. if not config then
  463. return
  464. end
  465. -- 先买次数
  466. local nCanBuyNum = maxBuyCnt - buyCnt
  467. if nCanBuyNum > 0 then
  468. local needZuanshi, nBuyCnt = 0, buyCnt
  469. for i = 1, nCanBuyNum, 1 do
  470. needZuanshi = needZuanshi + BUY_TILI_ITEM_CNT + nBuyCnt * 10
  471. nBuyCnt = nBuyCnt + 1
  472. end
  473. print("[oneClickSaodang] nCanBuyNum = "..nCanBuyNum..", needZuanshi = "..needZuanshi)
  474. if not ObjHuman.checkRMB(human, needZuanshi) then
  475. return Broadcast.sendErr(human, Lang.COMMON_NO_ZUANSHI)
  476. end
  477. ObjHuman.decZuanshi(human, -needZuanshi, "tower_buy_liti")
  478. addBuyCnt(human, nCanBuyNum)
  479. end
  480. local nNowCnt = getCurCnt(human)
  481. local tItem = {}
  482. for _, v in ipairs(config.reward) do
  483. local nGoodID = v[1]
  484. local nGoodNum = v[2] * nNowCnt
  485. table.insert(tItem, {nGoodID, nGoodNum})
  486. end
  487. if nil ~= _G.next(tItem) then
  488. addTili(human, nNowCnt)
  489. BagLogic.addItemList(human, tItem, "tower_win_reward")
  490. DailyTaskLogic.recordDailyTaskFinishCnt(human, DailyTaskLogic.DAILY_TASK_ID_5, nNowCnt)
  491. YunYingLogic.onCallBack(human, "onHuangjingTower",nNowCnt)
  492. query(human)
  493. fightQuery(human, myLv)
  494. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1203)
  495. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1201)
  496. end
  497. end
  498. -- 挑战
  499. function fight(human, args)
  500. local changeLv = tonumber(args[1] or 0)
  501. if changeLv > #HuanjingTowerExcel.huanjingTower then
  502. return
  503. end
  504. local isok, lv, config, count = checkCombatPos(human, args)
  505. if not isok then
  506. return
  507. end
  508. -- 调用战斗接口
  509. CombatLogic.combatBegin(human, config.mapID, args, CombatDefine.COMBAT_TYPE6, lv)
  510. end
  511. -- 获取当前地图ID
  512. function getMapID(human, args)
  513. local isok, lv, config = checkCombatPos(human, args)
  514. if not isok then
  515. return
  516. end
  517. return config.mapID
  518. end
  519. -- 检查 战斗录像是否需要保存
  520. function checkUpdeType(db, combatTime, zhandouli)
  521. local timeUp = combatTime
  522. local zhanliUp = zhandouli
  523. if db.combatVideo and db.combatVideo[1] and combatTime >= db.combatVideo[1].time then
  524. timeUp = 0
  525. end
  526. if db.combatVideo and db.combatVideo[2] and zhandouli >= db.combatVideo[2].zhandouli then
  527. zhanliUp = 0
  528. end
  529. return timeUp, zhanliUp
  530. end
  531. -- 挑战结束
  532. function onFightEnd(human, result, fightTypeID, param, combatInfo, args)
  533. local rewardItem = combatInfo.rewardItem
  534. if fightTypeID ~= CombatDefine.COMBAT_TYPE6 then
  535. return
  536. end
  537. local huanjingTowerConfig = HuanjingTowerExcel.huanjingTower[param]
  538. if not huanjingTowerConfig then
  539. return
  540. end
  541. local oldLv = human.db.tower and human.db.tower.lv or 0
  542. -- 改db
  543. updateResult(human, result, combatInfo, param)
  544. local count = tonumber(args[2] or 0)
  545. combatInfo.endParam = tostring(count)
  546. -- 给奖励
  547. if CombatDefine.RESULT_WIN == result then
  548. local rewardList = {}
  549. for _, value in ipairs(huanjingTowerConfig.reward) do
  550. local itemID = value[1]
  551. local itemCnt = value[2]
  552. rewardList[itemID] = rewardList[itemID] or 0
  553. rewardList[itemID] = rewardList[itemID] + itemCnt
  554. BagLogic.addItem(human, itemID, itemCnt, "tower_win_reward")
  555. combatInfo.rewardItem[#combatInfo.rewardItem + 1] = {itemID, itemCnt}
  556. end
  557. oldLv = oldLv or 0
  558. if oldLv < param then
  559. for _, value in ipairs(huanjingTowerConfig.firstReward) do
  560. local itemID = value[1]
  561. local itemCnt = value[2]
  562. rewardList[itemID] = rewardList[itemID] or 0
  563. rewardList[itemID] = rewardList[itemID] + itemCnt
  564. BagLogic.addItem(human, itemID, itemCnt, "tower_win_reward")
  565. combatInfo.rewardItem[#combatInfo.rewardItem + 1] = {itemID, itemCnt}
  566. end
  567. GiftLogic.trigger(human,EVAL_TOWER_EVENT,{id = param})
  568. WarOrder.trigger(human,DEVIL_ORDER_TYPE)
  569. end
  570. --TODO:记录恶魔之塔
  571. --Log.write(Log.LOGID_OSS_BATTLE_DEMONTOWER, human.db._id, human.db.account, human.db.name, human.db.tower.lv)
  572. Log.write(Log.LOGID_OSS_BATTLE_DEMONTOWER, human.db._id, human.db.newUniqueTag, human.db.name, human.db.tower.lv)
  573. -- 挑战成功,则保存战斗信息
  574. combatInfo.defender.name = Util.format(Lang.COMBAT_TOWER_NAME, param)
  575. ChengjiuLogic.onCallback(human, ChengjiuDefine.CJ_TASK_TYPE_9, param)
  576. MengxinLogic.onCallBack(human, MengxinLogic.MX_TASK_TYPE_2, param)
  577. JibanLogic.onCallback(human, 3, param)
  578. DailyTaskLogic.recordDailyTaskFinishCnt(human, DailyTaskLogic.DAILY_TASK_ID_5, 1)
  579. YunYingLogic.onCallBack(human, "onHuangjingTower",1)
  580. end
  581. LiLianLogic.onCallbackByCombat(human, combatInfo)
  582. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1203)
  583. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1201)
  584. end
  585. -- 获取该层 已存的 玩家头像数据条数
  586. function getHeadNum(data)
  587. local len = 0
  588. if data.headList then
  589. for _, _ in pairs(data.headList) do
  590. len = len + 1
  591. end
  592. end
  593. return len
  594. end
  595. -- 检查该玩家在 该层塔 有 头像数据
  596. function checkTowerDBHaveByUuid(uuid, data)
  597. if data.headList and data.headList[uuid] then
  598. return true
  599. end
  600. return false
  601. end
  602. -- 更新层数 头像
  603. function towerHeadChange(human, oldLv, lv)
  604. if lv <= 1 then
  605. return
  606. end
  607. local data = HuanjingTowerDB.query(lv)
  608. local have = getHeadNum(data)
  609. if have < TOWER_LV_HEAD_MAX and not data.headList[human.db._id] then
  610. data.headList[human.db._id] = {}
  611. local new = data.headList[human.db._id]
  612. new.head = human.db.head
  613. new.headFrame = human.db.headFrame
  614. new.time = os.time()
  615. HuanjingTowerDB.updateDB(data)
  616. end
  617. if oldLv > 1 then
  618. local oldData = HuanjingTowerDB.query(oldLv)
  619. if checkTowerDBHaveByUuid(human.db._id, oldData) then
  620. oldData.headList[human.db._id] = nil
  621. HuanjingTowerDB.updateDB(oldData)
  622. end
  623. end
  624. end
  625. function queryFightData(human, towerId)
  626. local data = HuanjingTowerDB.query(towerId)
  627. if not data then
  628. return
  629. end
  630. local msgRet = Msg.gc.GC_HUANGJINGTOWER_QUERY_FIGHT_DATA
  631. msgRet.lv = towerId
  632. local len = 0
  633. for k, v in ipairs(data.combatVideo) do
  634. len = len + 1
  635. local net = msgRet.list[len]
  636. net.index = k
  637. net.zhanli = v.zhandouli
  638. net.time = v.time
  639. net.useTime = v.combatTime
  640. RoleLogic.getRoleBaseByUuid(v.uuid, net.roleBase)
  641. end
  642. msgRet.list[0] = len
  643. Msg.send(msgRet, human.fd)
  644. end
  645. function readFightVideo(human, towerId, index)
  646. local data = HuanjingTowerDB.query(towerId)
  647. if not data then
  648. return
  649. end
  650. if data.combatVideo and data.combatVideo[index] then
  651. local combatInfo = data.combatVideo[index].combatVideo
  652. combatInfo.isVideo = true
  653. -- combatInfo.videoUuid = videoUuid
  654. -- combatInfo.lookType = lookType
  655. human.combat = combatInfo
  656. CombatLogic.sendCombatData(human, combatInfo)
  657. CombatLogic.sendCombatFinish(human, combatInfo)
  658. end
  659. end
  660. -- 幻境之塔购买体力查询
  661. function buyTiliQuery(human)
  662. local msgRet = Msg.gc.GC_HUANGJINGTOWER_BUY_TILI_QUERY
  663. local buyCnt = getBuyCnt(human)
  664. msgRet.needItemID = BUY_TILI_ITEM_ID
  665. msgRet.needItemCnt = BUY_TILI_ITEM_CNT + buyCnt * 10
  666. Msg.send(msgRet, human.fd)
  667. end
  668. -- 幻境之塔购买体力
  669. function buyTiliDo(human, buyCnt)
  670. local buyCnt = getBuyCnt(human)
  671. local maxBuyCnt = VipLogic.getPowerArgs(human, VipLogic.VIP_POWER3)
  672. if buyCnt >= maxBuyCnt then
  673. return
  674. end
  675. local needZuanshi = BUY_TILI_ITEM_CNT + buyCnt * 10
  676. if not ObjHuman.checkRMB(human, needZuanshi) then
  677. return Broadcast.sendErr(human, Lang.COMMON_NO_ZUANSHI)
  678. end
  679. ObjHuman.decZuanshi(human, -needZuanshi, "tower_buy_liti")
  680. addBuyCnt(human, 1)
  681. local msgRet = Msg.gc.GC_HUANGJINGTOWER_BUY_TILI_DO
  682. local buyCnt = getBuyCnt(human)
  683. msgRet.buyCost = BUY_TILI_BUY_ZUANSHI[buyCnt + 1] or BUY_TILI_BUY_ZUANSHI[1]
  684. msgRet.cnt = getCurCnt(human)
  685. msgRet.canBuy = math.max(VipLogic.getPowerArgs(human, VipLogic.VIP_POWER3) - getBuyCnt(human), 0)
  686. Msg.send(msgRet, human.fd)
  687. -- query(human)
  688. end
  689. -- 挑战结果
  690. function updateResult(human, result, combatInfo, param)
  691. -- 当前胜利关卡已通关
  692. if human.db.tower and human.db.tower.lv and human.db.tower.lv >= param then
  693. -- 增加挑战次数
  694. addTili(human, 1)
  695. end
  696. if result == CombatDefine.RESULT_WIN then
  697. human.db.tower = human.db.tower or {}
  698. human.db.tower.lv = human.db.tower.lv or 0
  699. local oldLv = human.db.tower.lv
  700. -- 当前胜利关卡未通关
  701. if oldLv < param then
  702. human.db.tower.lv = human.db.tower.lv + 1
  703. towerHeadChange(human, oldLv, human.db.tower.lv)
  704. TriggerLogic.PublishEvent(TriggerDefine.HUANJINGTOWER_PASS, human.db._id, 1)
  705. end
  706. human.db.tower.usetime = CombatLogic.getCombatUseTime(combatInfo)
  707. local data = HuanjingTowerDB.query(human.db.tower.lv)
  708. local zhandouli = combatInfo.attacker.zhandouli
  709. local timeUp, zhanliUp = checkUpdeType(data, human.db.tower.usetime, zhandouli) -- combatTime , zhandouli
  710. local combatVideo = Util.copyTable(combatInfo)
  711. HuanjingTowerDB.addVideoToTower(
  712. data,
  713. human.db._id,
  714. os.time(),
  715. timeUp,
  716. zhanliUp,
  717. human.db.tower.usetime,
  718. zhandouli,
  719. combatVideo
  720. )
  721. HuanjingTowerDB.updateDB(data)
  722. -- 更新爬塔榜
  723. BRoleLogic.updateData(BillboardDefine.TYPE_TOWER, human.db)
  724. end
  725. end
  726. -- 更新动态数据
  727. function updateDaily(human)
  728. if human.db.tower then
  729. human.db.tower.tili = 0
  730. human.db.tower.buyCnt = 0
  731. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1203)
  732. RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1201)
  733. end
  734. end
  735. --处理无法完成新成就任务问题
  736. function onLogin(human)
  737. if human.db.tower and human.db.tower.lv and human.db.tower.lv > 0 then
  738. ChengjiuLogic.onCallback(human, ChengjiuDefine.CJ_TASK_TYPE_9, human.db.tower.lv)
  739. end
  740. end
  741. function addBuyCnt(human, add)
  742. human.db.tower = human.db.tower or {}
  743. human.db.tower.buyCnt = human.db.tower.buyCnt or 0
  744. human.db.tower.buyCnt = human.db.tower.buyCnt + add
  745. end
  746. function addTili(human, add)
  747. human.db.tower = human.db.tower or {}
  748. human.db.tower.tili = human.db.tower.tili or 0
  749. human.db.tower.tili = human.db.tower.tili + add
  750. end
  751. -- 获取当前挑战次数
  752. function getTili(human)
  753. if human.db.tower == nil or human.db.tower.tili == nil then
  754. return 0
  755. end
  756. return human.db.tower.tili
  757. end
  758. -- 获取购买次数
  759. function getBuyCnt(human)
  760. if human.db.tower == nil or human.db.tower.buyCnt == nil then
  761. return 0
  762. end
  763. return human.db.tower.buyCnt
  764. end
  765. function getMaxCnt(human)
  766. local buyCnt = getBuyCnt(human)
  767. local dailyFreeTimes = HJ_GetTalismanAdd(human)
  768. return TILI_FREE + buyCnt + dailyFreeTimes
  769. end
  770. -- 获取剩余可挑战或者扫荡次数
  771. function getCurCnt(human)
  772. local tili = getTili(human)
  773. local max = getMaxCnt(human)
  774. return max - tili
  775. end
  776. -- 读取 刷新玩家领取记录
  777. function readUpdateGetDb(human, type)
  778. local db
  779. local getList
  780. if type == TOWER_TONGGUAN_TYPE and not human.towerTongGet then
  781. db = human.db.tower.tongGet
  782. human.towerTongGet = {}
  783. getList = human.towerTongGet
  784. elseif type == TOWER_KING_TYPE and not human.towerKingGet then
  785. db = human.db.tower.kingGet
  786. human.towerKingGet = {}
  787. getList = human.towerKingGet
  788. end
  789. if not db or db == "" then
  790. return
  791. end
  792. local list = Util.split(db, "|")
  793. for _, key in ipairs(list) do
  794. getList[tonumber(key)] = 1
  795. end
  796. end
  797. function isGetReward(human, type, id)
  798. if not human.db.tower then
  799. return
  800. end
  801. readUpdateGetDb(human, type)
  802. local db = {}
  803. if type == TOWER_TONGGUAN_TYPE then
  804. db = human.towerTongGet
  805. elseif type == TOWER_KING_TYPE then
  806. db = human.towerKingGet
  807. end
  808. if db and db[id] then
  809. return REWARD_STATUS_HADGET
  810. else
  811. return REWARD_STATUS_GET
  812. end
  813. end
  814. -- 领取奖励 存db
  815. function setGetReward(human, type, id)
  816. human.db.tower = human.db.tower or {}
  817. readUpdateGetDb(human, type)
  818. if type == TOWER_TONGGUAN_TYPE then
  819. human.db.tower.tongGet = human.db.tower.tongGet or ""
  820. human.db.tower.tongGet = human.db.tower.tongGet .. id .. "|"
  821. human.towerTongGet[id] = 1
  822. elseif type == TOWER_KING_TYPE then
  823. human.db.tower.kingGet = human.db.tower.kingGet or ""
  824. human.db.tower.kingGet = human.db.tower.kingGet .. id .. "|"
  825. human.towerKingGet[id] = 1
  826. end
  827. end
  828. -- 检查是否有奖励可以领取
  829. function checkHaveCanGetReward(human, type)
  830. if not human.db.tower or not human.db.tower.lv then
  831. return
  832. end
  833. local lv = human.db.tower.lv
  834. readUpdateGetDb(human, type)
  835. for k, config in ipairs(HuanjingTowerExcel.tongGuan) do
  836. if lv < config.tower then
  837. return
  838. end
  839. if isGetReward(human, type, k) == REWARD_STATUS_GET then
  840. return true, k
  841. end
  842. end
  843. end
  844. -- GM
  845. function setTowerByGm(human, lv)
  846. if not lv or lv < 0 then
  847. return
  848. end
  849. local towerConfig = HuanjingTowerExcel.huanjingTower[lv]
  850. if not towerConfig then
  851. return
  852. end
  853. human.db.tower = human.db.tower or {}
  854. local oldLv = human.db.tower.lv or 0
  855. human.db.tower.lv = lv
  856. towerHeadChange(human, oldLv, lv)
  857. ChengjiuLogic.onCallback(human, ChengjiuDefine.CJ_TASK_TYPE_9, lv)
  858. end
  859. function isDot(human)
  860. if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_1203) then
  861. return
  862. end
  863. if getCurCnt(human) > 0 then
  864. return true
  865. end
  866. if not human.db.tower then
  867. return
  868. end
  869. local lv = human.db.tower.lv
  870. if not lv then
  871. return
  872. end
  873. if checkHaveCanGetReward(human, TOWER_TONGGUAN_TYPE) then
  874. return true
  875. end
  876. --[[ if human.db.tower.vip and human.db.tower.vip == 1 then
  877. local kingGetId = human.db.tower.kingGet or 0
  878. local config = HuanjingTowerExcel.towerKing[kingGetId + 1]
  879. if config and lv >= config.tower then
  880. return true
  881. end
  882. end
  883. ]]
  884. --
  885. end
  886. function isDotReward(human)
  887. if not human.db.tower then
  888. return
  889. end
  890. local lv = human.db.tower.lv
  891. if not lv then
  892. return
  893. end
  894. if checkHaveCanGetReward(human, TOWER_TONGGUAN_TYPE) then
  895. return true
  896. end
  897. --[[ if human.db.tower.vip and human.db.tower.vip == 1 then
  898. local kingGetId = human.db.tower.kingGet or 0
  899. local config = HuanjingTowerExcel.towerKing[kingGetId + 1]
  900. if config and lv >= config.tower then
  901. return true
  902. end
  903. end
  904. ]]
  905. --
  906. end
  907. function isDotByType(human, type)
  908. if not human.db.tower then
  909. return
  910. end
  911. local lv = human.db.tower.lv
  912. if not lv then
  913. return
  914. end
  915. if type == TOWER_TONGGUAN_TYPE then
  916. if checkHaveCanGetReward(human, TOWER_TONGGUAN_TYPE) then
  917. return true
  918. end
  919. elseif type == TOWER_KING_TYPE then
  920. if checkHaveCanGetReward(human, TOWER_KING_TYPE) then
  921. return true
  922. end
  923. end
  924. end
  925. local QueryRoleByTower = {}
  926. function getAllHumanByLv(human, lv)
  927. local data = HuanjingTowerDB.query(lv)
  928. if not data then
  929. return
  930. end
  931. local msgRet = Msg.gc.GC_HUANGJINGTOWER_LV_ALLHUMAN
  932. local len = 0
  933. for uuid, _ in pairs(data.headList) do
  934. if len >= 10 then
  935. break
  936. end
  937. local db = RoleDBLogic.getDb(uuid, RoleLogic.FieldRoleBase)
  938. if db then
  939. len = len + 1
  940. RoleLogic.makeRoleBase(db, msgRet.role[len])
  941. end
  942. end
  943. msgRet.role[0] = len
  944. Msg.send(msgRet, human.fd)
  945. end
  946. --对外接口, 获取当前层数
  947. function getTowerLevel(human)
  948. local lv = 0
  949. if human.db.tower then
  950. lv = human.db.tower.lv or 0
  951. end
  952. return lv
  953. end
  954. --------------------------------------------- combat ----------------------------------------------
  955. function getCombatMonsterOutID(human, side, args)
  956. if side ~= CombatDefine.DEFEND_SIDE then
  957. return
  958. end
  959. local lv = tonumber(args[1] or 0)
  960. -- local lv = (human.db.tower and human.db.tower.lv or 0) + 1
  961. local config = HuanjingTowerExcel.huanjingTower[lv]
  962. if not config then
  963. return
  964. end
  965. return config.monsterOutID, config.zhandouli
  966. end
  967. function checkCombatPos(human, args)
  968. local lv = tonumber(args[1] or 0)
  969. local count = tonumber(args[2] or 0)
  970. local config = HuanjingTowerExcel.huanjingTower[lv]
  971. if not config then
  972. return
  973. end
  974. -- 判断挑战等级 不可越级挑战
  975. if lv > (human.db.tower and human.db.tower.lv or 0) + 1 then
  976. return Broadcast.sendErr(human, Lang.COPY_FIGHT_ERR_PREID)
  977. end
  978. -- 判断是否为 挑战已经通关的等级 已通关的关卡需要消耗次数
  979. if lv < (human.db.tower and human.db.tower.lv or 0) + 1 then
  980. local cnt = getCurCnt(human)
  981. if cnt < 1 then
  982. buyTiliDo(human)
  983. cnt = getCurCnt(human)
  984. if cnt < 1 then
  985. return Broadcast.sendErr(human, Lang.HUANJINGTOWER_NO_TILI_CNT)
  986. end
  987. end
  988. end
  989. -- 挑战不消耗次数
  990. -- if getCurCnt(human) < 1 then
  991. -- return Broadcast.sendErr(human, Lang.HUANJINGTOWER_NO_TILI_CNT)
  992. -- end
  993. return true, lv, config, count
  994. end