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