RacialTrialLogic.lua 17 KB

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