DrillDB.lua 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. ---------------------------------------------------
  2. -- 过关斩将/圣树试炼 db
  3. -- 战斗对象
  4. -- drillObj = {_id,lv,head,headFrame,name,unionUuid,zhandouli,svrIndex,heroList,pet}
  5. -- 活动数据(进度等)
  6. -- drillData = {_id,drillId,drillObjs,heroStatus,buff,oper}
  7. ---------------------------------------------------
  8. local Config = require("Config")
  9. local DrillExcel = require("excel.drill")
  10. local LuaMongo = _G.lua_mongo
  11. local DB = require("common.DB")
  12. local Util = require("common.Util")
  13. local CommonDB = require("common.CommonDB")
  14. local CombatLogic = require("combat.CombatLogic")
  15. local CombatDefine = require("combat.CombatDefine")
  16. local CreateRole = require("role.CreateRole")
  17. local RoleLogic = require("role.RoleLogic")
  18. local BillboardDefine = require("billboard.BillboardDefine")
  19. local BillboardDB = require("billboard.BillboardDB")
  20. local FieldsRandom = {uuid = 1, zhandouli = 1}
  21. FieldsDot = {drillId = 1, heroStatus = 1}
  22. FieldsHelpInfo = {helpInfo = 1}
  23. QueryByUuid = {_id = nil}
  24. local QueryDrillByRandom = {zhandouli = {["$gte"] = 0, ["$lte"] = 0}, uuid = {["$nin"] = {}}}
  25. MONSTER_OBJLIST = MONSTER_OBJLIST or {} --
  26. local DRILL_DATA = {}
  27. function isUuidExistInDB(uuid)
  28. QueryByUuid._id = uuid
  29. LuaMongo.find(DB.db_drill, QueryByUuid, FieldName)
  30. return LuaMongo.next(DRILL_DATA) and DRILL_DATA
  31. end
  32. -- (本服)创建玩家对战信息
  33. function createDrillData(human, drillId)
  34. local heroList, helpList, rolebase , formation, jiban, elfList = CombatLogic.getHumanObjList(human, CombatDefine.COMBAT_TYPE1)
  35. if not heroList or not next(heroList) then return end -- 没有上阵
  36. local drillData = {}
  37. drillData._id = human.db._id
  38. drillData.uuid = human.db._id
  39. drillData.drillId = drillId -- 当前关卡id 1-16,16表示已通关
  40. drillData.drillObjs = {} -- 关卡对象列表[drillId] = drillObj
  41. drillData.heroList = heroList
  42. drillData.helpList = helpList
  43. drillData.elfList = elfList
  44. drillData.jiban = jiban
  45. drillData.formation = formation
  46. drillData.heroStatus = nil -- 英雄状态 [heroUuid] = hpRate
  47. drillData.helpUuids = nil -- 雇佣的助战英雄
  48. drillData.buff = nil -- 已获得buffer [id] = cnt
  49. drillData.oper = nil -- 操作次数 [optype] = cnt
  50. drillData.zhandouli = rolebase.zhandouli
  51. return drillData
  52. end
  53. -- (本服)获取数据
  54. function getDrillDataByUuid(uuid, fields)
  55. if _G.is_middle then return end
  56. if not uuid then return end -- 不能是空哦
  57. QueryByUuid._id = uuid
  58. LuaMongo.find(DB.db_drill, QueryByUuid, fields)
  59. local drillData = {}
  60. if not LuaMongo.next(drillData) then
  61. return
  62. end
  63. return drillData.drillId and drillData
  64. end
  65. -- (本服)更新
  66. function updateDrillData(drillData)
  67. if _G.is_middle then return end
  68. if not drillData._id then return end
  69. if not drillData.drillId then return end
  70. local uuid = drillData._id
  71. if isUuidExistInDB(uuid) then
  72. QueryByUuid._id = uuid
  73. LuaMongo.update(DB.db_drill, QueryByUuid, drillData)
  74. else
  75. LuaMongo.insert(DB.db_drill, drillData)
  76. end
  77. end
  78. -- (本服)检查是否需要重置
  79. function checkDrillReset()
  80. if _G.is_middle then return end
  81. local drill = CommonDB.getValueByKey(CommonDB.KEY_DRILL)
  82. if not drill or not Util.isSameDay(drill.time) then
  83. reset()
  84. drill = {}
  85. drill.time = os.time()
  86. CommonDB.updateValue(CommonDB.KEY_DRILL, drill)
  87. end
  88. end
  89. -- (本服)创建对象数据(怪物)
  90. function createDrillMonster(uuid, monsterOutID, zhandouli)
  91. if not uuid then return end
  92. local heroList, helpList, rolebase, formation = CombatLogic.getMonsterObjList(monsterOutID)
  93. if not rolebase then return end
  94. local drillObj = {}
  95. RoleLogic.makeRoleBase(rolebase, drillObj, true) -- 先初始角色基础信息
  96. drillObj.uuid = uuid
  97. drillObj.svrIndex = 1
  98. drillObj.svrName = Config.SVR_NAME
  99. drillObj.heroList = heroList
  100. drillObj.helpList = helpList
  101. drillObj.elfList = elfList
  102. drillObj.formation = formation
  103. drillObj.monsterOutID = monsterOutID -- 怪物额外字段
  104. drillObj.objStatus = nil -- 英雄状态 [index] = hpRate
  105. -- 重新设置某些基础信息
  106. drillObj.name = CreateRole.getRandomName()
  107. drillObj.head = CreateRole.getRandomHead()
  108. drillObj.zhandouli = zhandouli
  109. return drillObj
  110. end
  111. -- (本服)每次重启都重新生成怪物数据
  112. local MONSTER_RANDOM_CNT = 15 -- 每个区间生成怪物数量
  113. function createMonsterDrillObj()
  114. MONSTER_OBJLIST = {}
  115. for i = 1, #DrillExcel.npc do
  116. local config = DrillExcel.npc[i]
  117. for j = 1, MONSTER_RANDOM_CNT do
  118. local zhandouli = math.random(config.zhandouli[1], config.zhandouli[2])
  119. local r = math.random(1, #config.monsterOutID)
  120. local monsterOutID = config.monsterOutID[r]
  121. local monsterUuid = "npc-" .. i .. "-" .. j
  122. local drillObj = createDrillMonster(monsterUuid, monsterOutID, zhandouli)
  123. MONSTER_OBJLIST[#MONSTER_OBJLIST + 1] = drillObj
  124. end
  125. end
  126. end
  127. -- 创建对象数据(人物)
  128. function createDrillObj(uuid)
  129. local fakeHuman = CombatLogic.createCombatFakeHuman(uuid)
  130. if not fakeHuman then return end
  131. local objList, helpList, rolebase, formation, jiban, elfList = CombatLogic.getHumanObjList(fakeHuman, CombatDefine.COMBAT_TYPE1)
  132. if not objList or not next(objList) then return end -- 没有上阵
  133. local drillObj = {}
  134. RoleLogic.makeRoleBase(rolebase, drillObj, true) -- 先初始角色基础信息
  135. drillObj._id = fakeHuman.db._id
  136. drillObj.uuid = nil
  137. drillObj.heroList = objList
  138. drillObj.helpList = helpList
  139. drillObj.elfList = elfList
  140. drillObj.formation = formation
  141. drillObj.jiban = jiban
  142. drillObj.objStatus = nil -- 英雄状态 [index] = hpRate
  143. return drillObj
  144. end
  145. -- (本服)随机一个战斗对象
  146. local RANDOM_LIST = {}
  147. function randomDrillObj(zdlMin, zdlMax, ninTb, isMonster)
  148. local cnt = 0
  149. local without = {}
  150. for _, uuid in pairs(ninTb) do
  151. without[uuid] = true
  152. end
  153. if isMonster then
  154. RANDOM_LIST = {}
  155. for _, drillObj in ipairs(MONSTER_OBJLIST) do
  156. if drillObj.zhandouli >= zdlMin and
  157. drillObj.zhandouli <= zdlMax and
  158. not without[drillObj.uuid] then
  159. cnt = cnt + 1
  160. RANDOM_LIST[cnt]= drillObj
  161. end
  162. end
  163. if cnt < 1 then return end
  164. local r = math.random(1, cnt)
  165. return RANDOM_LIST[r]
  166. else
  167. RANDOM_LIST = {}
  168. local board = BillboardDB.getBoard(BillboardDefine.TYPE_ZHANDOULI)
  169. local boardLen = board and #board.rank2data or 0
  170. for i = 1, boardLen do
  171. local rankData = board.rank2data[i]
  172. if zdlMin <= rankData.value1 and
  173. rankData.value1 <= zdlMax and
  174. not without[rankData.uuid] then
  175. cnt = cnt + 1
  176. RANDOM_LIST[cnt] = rankData.uuid
  177. end
  178. end
  179. if cnt < 1 then return end
  180. local r = math.random(1, cnt)
  181. local uuid = RANDOM_LIST[r]
  182. return createDrillObj(uuid)
  183. end
  184. end
  185. function reset()
  186. LuaMongo.remove(DB.db_drill)
  187. createMonsterDrillObj()
  188. end
  189. function initAfterStart()
  190. createMonsterDrillObj()
  191. checkDrillReset()
  192. end