RacialTrialLogic.lua 15 KB

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