RacialTrialLogic.lua 17 KB

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