HuanjingTowerLogic.lua 37 KB

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