RacialTrialLogic.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. --种族试炼
  2. --db
  3. --[=[
  4. key 为种族类型
  5. human.db.RacialTrial = {
  6. [1] = {
  7. lv = nil, --已经通关的层数
  8. dailyAwardCnt = nil, --每日可领取奖励次数/每日可通关次数
  9. },
  10. [2] = {
  11. lv = nil,
  12. dailyAwardCnt = nil,
  13. }
  14. }
  15. ]=]--
  16. local Msg = require("core.Msg")
  17. local Util = require("common.Util")
  18. local BagLogic = require("bag.BagLogic")
  19. local CombatDefine = require("combat.CombatDefine")
  20. local CombatLogic = require("combat.CombatLogic")
  21. local HeroLogic = require("hero.HeroLogic")
  22. local HeroConfig = require("excel.hero")
  23. local MonsterCfg = require("excel.monster")
  24. local Grid = require("bag.Grid")
  25. local MonsterGrid = require("monster.MonsterGrid")
  26. local Broadcast = require("broadcast.Broadcast")
  27. --开启玩法的等级要求
  28. local openCondLevel = 0
  29. --每日最多可领奖次数
  30. local dailyAwardTimes = 0
  31. --种族试炼关卡数据,key为种族,value为该种族的关卡配置
  32. local racialCfg = {
  33. --[camp] = {},
  34. --[camp] = {},
  35. }
  36. --日志Tag
  37. local RACIALTRIALLOG = "racialTrial"
  38. --种族 - 关卡开启时间映射表
  39. --1-妖族, 2-人族, 3-兽族,4-仙、魔族
  40. local RACIAL_OPENTIME = {
  41. [1] = {1,5,7},
  42. [2] = {2,5,7},
  43. [3] = {3,6,7},
  44. [4] = {4,6,7},
  45. }
  46. --战斗类型 - 种族映射表
  47. local COMBATTYPE_CAMP = {
  48. [CombatDefine.COMBAT_TYPE25] = 1,
  49. [CombatDefine.COMBAT_TYPE26] = 2,
  50. [CombatDefine.COMBAT_TYPE27] = 3,
  51. [CombatDefine.COMBAT_TYPE28] = {4,5},
  52. }
  53. local function updateCondValue()
  54. local cfg = require("excel.shilianTower")
  55. if not cfg then
  56. return
  57. end
  58. local condCfg = cfg.main[1]
  59. openCondLevel = condCfg.openlv
  60. dailyAwardTimes = condCfg.maxrewardnum
  61. end
  62. --生成配置
  63. local function generateCfg()
  64. local cfg = require("excel.shilianTower")
  65. if not cfg then
  66. return
  67. end
  68. local stageCfg = cfg.shilianTower
  69. racialCfg = { [1] = {}, [2] = {}, [3] = {}, [4] = {}}
  70. local n1,n2,n3,n4 = 0,0,0,0
  71. for _, v in ipairs(stageCfg) do
  72. if v.raceID == 101 then
  73. n1 = n1 + 1
  74. racialCfg[1][n1] = v
  75. elseif v.raceID == 102 then
  76. n2 = n2 + 1
  77. racialCfg[2][n2] = v
  78. elseif v.raceID == 103 then
  79. n3 = n3 + 1
  80. racialCfg[3][n3] = v
  81. elseif v.raceID == 104 then
  82. n4 = n4 + 1
  83. racialCfg[4][n4] = v
  84. end
  85. end
  86. end
  87. --初始化数据
  88. local function initData(human, camp)
  89. human.db.RacialTrial = human.db.RacialTrial or {}
  90. human.db.RacialTrial[camp] = {
  91. lv = 0,
  92. dailyAwardCnt = dailyAwardTimes
  93. }
  94. end
  95. --检测上阵英雄
  96. function checkUpdatePos(human, msg)
  97. local combatType = msg.type
  98. local condi_camp = COMBATTYPE_CAMP[combatType]
  99. if not condi_camp then
  100. return false
  101. end
  102. local heroList = Util.split(msg.heroList, ",")
  103. for i = 1, CombatDefine.COMBAT_HERO_CNT do
  104. local uuid = heroList[i] or ""
  105. if uuid ~= "0" and uuid ~= "" then
  106. local heroGrid = HeroLogic.getHeroGridByUuid(human, uuid)
  107. if not heroGrid then
  108. return false
  109. end
  110. --种族检测
  111. local heroCfg = HeroConfig.hero[heroGrid.id]
  112. if type(condi_camp) == "table" then
  113. local bl = false
  114. for _, camp in ipairs(condi_camp) do
  115. if camp == heroCfg.camp then
  116. bl = true
  117. break
  118. end
  119. end
  120. if not bl then
  121. return false
  122. end
  123. else
  124. if condi_camp ~= heroCfg.camp then
  125. return false
  126. end
  127. end
  128. end
  129. end
  130. return true
  131. end
  132. --红点检测
  133. function isDot(human,config)
  134. if human.db.lv < config.dotLv then
  135. return false
  136. end
  137. local wday = Util.getWeekDay()
  138. --转成大家熟悉的表示法
  139. if wday == 1 then
  140. wday = 7
  141. else
  142. wday = wday - 1
  143. end
  144. --入口的红点
  145. if config.id == 1210 then
  146. --如果当天一个试炼都没有开启,则入口也不显示红点
  147. local bl = false
  148. for _, v in ipairs(RACIAL_OPENTIME) do
  149. for _, v2 in ipairs(v) do
  150. if v2 == wday then
  151. bl = true
  152. break
  153. end
  154. end
  155. if bl then
  156. break
  157. end
  158. end
  159. if not bl then
  160. return false
  161. end
  162. if human.db.RacialTrial then
  163. local num = 0
  164. for camp, v in pairs(human.db.RacialTrial) do
  165. local campCfg = racialCfg[camp]
  166. if v.dailyAwardCnt <= 0 or v.lv >= #campCfg then
  167. num = num + 1
  168. end
  169. end
  170. if num >= #RACIAL_OPENTIME then
  171. return false
  172. end
  173. end
  174. else
  175. --具体某个种族关卡的红点
  176. local camp = 0
  177. if config.id == 1211 then
  178. camp = 1
  179. elseif config.id == 1212 then
  180. camp = 2
  181. elseif config.id == 1213 then
  182. camp = 3
  183. elseif config.id == 1214 then
  184. camp = 4
  185. else
  186. return false
  187. end
  188. --开启判断
  189. local bl = false
  190. local openDays = RACIAL_OPENTIME[camp]
  191. for _, v in ipairs(openDays) do
  192. if v == wday then
  193. bl = true
  194. break
  195. end
  196. end
  197. if not bl then
  198. return false
  199. end
  200. --当日奖励次数和最大关卡判断
  201. if human.db.RacialTrial and human.db.RacialTrial[camp] then
  202. local dailyAwardCnt = human.db.RacialTrial[camp].dailyAwardCnt
  203. local lv = human.db.RacialTrial[camp].lv
  204. local campCfg = racialCfg[camp]
  205. if dailyAwardCnt <= 0 or lv >= #campCfg then
  206. return false
  207. end
  208. end
  209. end
  210. return true
  211. end
  212. --0点更新
  213. function updateDaily(human)
  214. updateCondValue()
  215. if human.db.lv < openCondLevel then
  216. return
  217. end
  218. if not next(racialCfg) then
  219. generateCfg()
  220. end
  221. --重置每日领奖次数/每日通关次数
  222. if human.db and human.db.RacialTrial then
  223. for _, v in pairs(human.db.RacialTrial) do
  224. v.dailyAwardCnt = dailyAwardTimes
  225. end
  226. end
  227. end
  228. function onLogin(human)
  229. updateCondValue()
  230. if human.db.lv < openCondLevel then
  231. return
  232. end
  233. if not next(racialCfg) then
  234. generateCfg()
  235. end
  236. end
  237. --GM 修改某个种族的关卡, levelCnt表示要往前/后打多少关,但是不增加每日领奖次数
  238. function GmSetlevel(human, camp, levelCnt)
  239. if not camp or not levelCnt then
  240. return
  241. end
  242. local singleRacialCfg = racialCfg[camp]
  243. if not singleRacialCfg then
  244. return
  245. end
  246. if not human.db.RacialTrial or not human.db.RacialTrial[camp] then
  247. initData(human, camp)
  248. end
  249. local racialTrialData = human.db.RacialTrial[camp]
  250. if levelCnt > 0 then
  251. local startIdx = racialTrialData.lv
  252. if startIdx + levelCnt > #singleRacialCfg then
  253. levelCnt = #singleRacialCfg - startIdx
  254. end
  255. local endIdx = startIdx + levelCnt
  256. for i= startIdx+1, endIdx do
  257. local rewardCfg = singleRacialCfg[i].reward
  258. for _,v in ipairs(rewardCfg) do
  259. BagLogic.addItem(human, v[1], v[2], RACIALTRIALLOG)
  260. end
  261. end
  262. end
  263. racialTrialData.lv = math.max(racialTrialData.lv + levelCnt, 0)
  264. end
  265. --GM 开启某个种族的试炼
  266. function GmOpenTrial(human, camp)
  267. if not camp then
  268. return
  269. end
  270. local wdDays = RACIAL_OPENTIME[camp]
  271. if not wdDays then
  272. return
  273. end
  274. local wday = Util.getWeekDay()
  275. if wday == 1 then
  276. wday = 7
  277. else
  278. wday = wday - 1
  279. end
  280. wdDays[#wdDays+1] = wday
  281. end
  282. --增加某个种族试炼关卡的每次奖励次数/通关数
  283. function GmAddDailyAwardCnt(human, camp, num)
  284. if not camp or not num then
  285. return
  286. end
  287. if not human.db.RacialTrial or not human.db.RacialTrial[camp] then
  288. initData(human, camp)
  289. end
  290. local racialTrialData = human.db.RacialTrial[camp]
  291. racialTrialData.dailyAwardCnt = math.max(racialTrialData.dailyAwardCnt + num, 0)
  292. end
  293. --------------------------------------------------战斗相关------------------------------------
  294. function getCombatMonsterOutID(human, side, args, combatType)
  295. if side ~= CombatDefine.DEFEND_SIDE then
  296. return
  297. end
  298. local camp = COMBATTYPE_CAMP[combatType]
  299. if type(camp) == "table" then
  300. camp = camp[1]
  301. end
  302. if not camp then
  303. return
  304. end
  305. local nowLelvel = 0
  306. if human.db.RacialTrial and human.db.RacialTrial[camp] then
  307. nowLelvel = human.db.RacialTrial[camp].lv
  308. end
  309. local config = racialCfg[camp][nowLelvel+1]
  310. if not config then
  311. return
  312. end
  313. return config.monsterOutID, config.zhandouli
  314. end
  315. function fight(human, args, combatType)
  316. local camp = COMBATTYPE_CAMP[combatType]
  317. if type(camp) == "table" then
  318. camp = camp[1]
  319. end
  320. if not camp then
  321. return
  322. end
  323. if human.db.RacialTrial and human.db.RacialTrial[camp] then
  324. local data = human.db.RacialTrial[camp]
  325. --当日没有挑战次数了
  326. if data.dailyAwardCnt and data.dailyAwardCnt <= 0 then
  327. return
  328. end
  329. --已经到最高层
  330. local campCfg = racialCfg[camp]
  331. if data.lv and data.lv >= #campCfg then
  332. return
  333. end
  334. end
  335. CombatLogic.combatBegin(human, nil, nil, combatType)
  336. end
  337. --战斗结束,未将战斗数据下发客户端前的处理
  338. function onFightEnd(human, result, combatType, param1, combatInfo)
  339. --没赢就不需要处理
  340. if CombatDefine.RESULT_WIN ~= result then
  341. return
  342. end
  343. local camp = COMBATTYPE_CAMP[combatType]
  344. if type(camp) == "table" then
  345. camp = camp[1]
  346. end
  347. if not camp then
  348. return
  349. end
  350. if not human.db.RacialTrial or not human.db.RacialTrial[camp] then
  351. --胜利才更新数据
  352. initData(human, camp)
  353. end
  354. local data = human.db.RacialTrial[camp]
  355. data.lv = data.lv + 1
  356. data.dailyAwardCnt = data.dailyAwardCnt - 1
  357. local singleRacialCfg = racialCfg[camp]
  358. local rewardCfg = singleRacialCfg[data.lv].reward
  359. if not rewardCfg then
  360. return
  361. end
  362. --已经到最高层或者当日可挑战次数已用完则不能继续挑战
  363. combatInfo.endParam = "1"
  364. if data.lv >= #singleRacialCfg or data.dailyAwardCnt <= 0 then
  365. combatInfo.endParam = "0"
  366. end
  367. --发放奖励
  368. combatInfo.rewardItem = {}
  369. for i=1, #rewardCfg do
  370. local itemID = rewardCfg[i][1]
  371. local itemCnt = rewardCfg[i][2]
  372. combatInfo.rewardItem[i] = combatInfo.rewardItem[i] or {}
  373. combatInfo.rewardItem[i] = {itemID, itemCnt}
  374. BagLogic.addItem(human, itemID, itemCnt, RACIALTRIALLOG)
  375. end
  376. end
  377. --------------------------------------------------Respone------------------------------------
  378. --入口查询
  379. function entranceQuery(human)
  380. if human.db.lv < openCondLevel then
  381. return
  382. end
  383. local wday = Util.getWeekDay()
  384. --转成大家熟悉的表示法
  385. if wday == 1 then
  386. wday = 7
  387. else
  388. wday = wday - 1
  389. end
  390. local msgRet = Msg.gc.GC_RACIALTRIAL_ENTRANCE_QUERY
  391. msgRet.list[0] = #RACIAL_OPENTIME
  392. for k,v in ipairs(RACIAL_OPENTIME) do
  393. msgRet.list[k].isOpen = 0
  394. msgRet.list[k].camp = k
  395. for _, day in ipairs(v) do
  396. if wday == day then
  397. msgRet.list[k].isOpen = 1
  398. msgRet.list[k].openWdays[0] = 0
  399. break
  400. end
  401. end
  402. if msgRet.list[k].isOpen == 0 then
  403. msgRet.list[k].openWdays[0] = #v
  404. for idx, val in ipairs(v) do
  405. msgRet.list[k].openWdays[idx] = val
  406. end
  407. end
  408. end
  409. Msg.send(msgRet, human.fd)
  410. end
  411. --单个种族关卡数据查询
  412. function stageQuery(human, camp_m)
  413. if not camp_m then
  414. Broadcast.sendErr(human, string.format( "参数错误",camp_m))
  415. return
  416. end
  417. if human.db.lv < openCondLevel then
  418. Broadcast.sendErr(human, string.format( "等级不够",human.db.lv))
  419. return
  420. end
  421. local nowLv = 0
  422. local dailyAwardCnt = dailyAwardTimes
  423. if human.db.RacialTrial and human.db.RacialTrial[camp_m] then
  424. nowLv = human.db.RacialTrial[camp_m].lv
  425. dailyAwardCnt = human.db.RacialTrial[camp_m].dailyAwardCnt
  426. end
  427. local msgRet = Msg.gc.GC_RACIALTRIAL_LEVEL_QUERY
  428. msgRet.data.dailyAwardCnt = dailyAwardCnt
  429. --正常显示(当前关卡-1 ~ 当前关卡+5) 的关卡
  430. local startIdx = nowLv - 1
  431. local endIdx = nowLv + 5
  432. --0层和第一层的的处理
  433. if nowLv <= 0 or nowLv == 1 then
  434. startIdx = 1
  435. endIdx = startIdx + 5
  436. end
  437. local singleRecailCfg = racialCfg[camp_m]
  438. local levelMaxCnt = #singleRecailCfg
  439. --已经打到最高层的处理
  440. if nowLv >= levelMaxCnt then
  441. startIdx = nowLv - 5
  442. endIdx = nowLv
  443. end
  444. --当前关卡前面不够5层的处理
  445. if levelMaxCnt - nowLv < 5 then
  446. local subLevel = levelMaxCnt - nowLv
  447. startIdx = startIdx - subLevel + 1
  448. endIdx = levelMaxCnt
  449. end
  450. local stageData = msgRet.data.stageData
  451. stageData[0] = 0
  452. local cnt = 0
  453. for i = startIdx, endIdx do
  454. local singleCfg = singleRecailCfg[i]
  455. if not singleCfg then
  456. Broadcast.sendErr(human, string.format( "怪物配置错误",i))
  457. return
  458. end
  459. cnt = cnt + 1
  460. if i <= nowLv then
  461. stageData[cnt].isPass = 1
  462. elseif i == nowLv + 1 and dailyAwardCnt > 0 then --只能一关一关的挑战
  463. stageData[cnt].isPass = 2
  464. elseif i == nowLv + 1 and dailyAwardCnt <= 0 then --当日没有奖励次数了,但是还是需要显示挑战button
  465. stageData[cnt].isPass = 3
  466. else
  467. stageData[cnt].isPass = 0
  468. end
  469. stageData[cnt].power = 0
  470. stageData[cnt].levelIdex = i
  471. --奖励
  472. stageData[cnt].reward[0] = #singleCfg.reward
  473. for k, v in ipairs(singleCfg.reward) do
  474. Grid.makeItem(stageData[cnt].reward[k], v[1], v[2])
  475. end
  476. --怪物数据
  477. local objList = MonsterGrid.createMonsterObjListByMonsterOutID(singleCfg.monsterOutID)
  478. if not objList then
  479. Broadcast.sendErr(human, string.format( "怪物配置错误",singleCfg.monsterOutID))
  480. return
  481. end
  482. stageData[cnt].monsterData[0] = #objList
  483. local power = 0
  484. for idx, monster in ipairs(objList) do
  485. stageData[cnt].monsterData[idx] = {
  486. lv = monster.lv,
  487. body = monster.body,
  488. camp = monster.camp,
  489. }
  490. power = power + (monster.power or 0)
  491. end
  492. stageData[cnt].power = power
  493. end
  494. stageData[0] = cnt
  495. Msg.send(msgRet, human.fd)
  496. end