DrillDB.lua 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  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 = 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.jiban = jiban
  44. drillData.formation = formation
  45. drillData.heroStatus = nil -- 英雄状态 [heroUuid] = hpRate
  46. drillData.helpUuids = nil -- 雇佣的助战英雄
  47. drillData.buff = nil -- 已获得buffer [id] = cnt
  48. drillData.oper = nil -- 操作次数 [optype] = cnt
  49. drillData.zhandouli = rolebase.zhandouli
  50. return drillData
  51. end
  52. -- (本服)获取数据
  53. function getDrillDataByUuid(uuid, fields)
  54. if _G.is_middle then return end
  55. if not uuid then return end -- 不能是空哦
  56. QueryByUuid._id = uuid
  57. LuaMongo.find(DB.db_drill, QueryByUuid, fields)
  58. local drillData = {}
  59. if not LuaMongo.next(drillData) then
  60. return
  61. end
  62. return drillData.drillId and drillData
  63. end
  64. -- (本服)更新
  65. function updateDrillData(drillData)
  66. if _G.is_middle then return end
  67. if not drillData._id then return end
  68. if not drillData.drillId then return end
  69. local uuid = drillData._id
  70. if isUuidExistInDB(uuid) then
  71. QueryByUuid._id = uuid
  72. LuaMongo.update(DB.db_drill, QueryByUuid, drillData)
  73. else
  74. LuaMongo.insert(DB.db_drill, drillData)
  75. end
  76. end
  77. -- (本服)检查是否需要重置
  78. function checkDrillReset()
  79. if _G.is_middle then return end
  80. local drill = CommonDB.getValueByKey(CommonDB.KEY_DRILL)
  81. if not drill or not Util.isSameDay(drill.time) then
  82. reset()
  83. drill = {}
  84. drill.time = os.time()
  85. CommonDB.updateValue(CommonDB.KEY_DRILL, drill)
  86. end
  87. end
  88. -- (本服)创建对象数据(怪物)
  89. function createDrillMonster(uuid, monsterOutID, zhandouli)
  90. if not uuid then return end
  91. local heroList, helpList, rolebase, formation = CombatLogic.getMonsterObjList(monsterOutID)
  92. if not rolebase then return end
  93. local drillObj = {}
  94. RoleLogic.makeRoleBase(rolebase, drillObj, true) -- 先初始角色基础信息
  95. drillObj.uuid = uuid
  96. drillObj.svrIndex = 1
  97. drillObj.svrName = Config.SVR_NAME
  98. drillObj.heroList = heroList
  99. drillObj.helpList = helpList
  100. drillObj.formation = formation
  101. drillObj.monsterOutID = monsterOutID -- 怪物额外字段
  102. drillObj.objStatus = nil -- 英雄状态 [index] = hpRate
  103. -- 重新设置某些基础信息
  104. drillObj.name = CreateRole.getRandomName()
  105. drillObj.head = CreateRole.getRandomHead()
  106. drillObj.zhandouli = zhandouli
  107. return drillObj
  108. end
  109. -- (本服)每次重启都重新生成怪物数据
  110. local MONSTER_RANDOM_CNT = 15 -- 每个区间生成怪物数量
  111. function createMonsterDrillObj()
  112. MONSTER_OBJLIST = {}
  113. for i = 1, #DrillExcel.npc do
  114. local config = DrillExcel.npc[i]
  115. for j = 1, MONSTER_RANDOM_CNT do
  116. local zhandouli = math.random(config.zhandouli[1], config.zhandouli[2])
  117. local r = math.random(1, #config.monsterOutID)
  118. local monsterOutID = config.monsterOutID[r]
  119. local monsterUuid = "npc-" .. i .. "-" .. j
  120. local drillObj = createDrillMonster(monsterUuid, monsterOutID, zhandouli)
  121. MONSTER_OBJLIST[#MONSTER_OBJLIST + 1] = drillObj
  122. end
  123. end
  124. end
  125. -- 创建对象数据(人物)
  126. function createDrillObj(uuid)
  127. local fakeHuman = CombatLogic.createCombatFakeHuman(uuid)
  128. if not fakeHuman then return end
  129. local objList, helpList, rolebase, formation, jiban = CombatLogic.getHumanObjList(fakeHuman, CombatDefine.COMBAT_TYPE1)
  130. if not objList or not next(objList) then return end -- 没有上阵
  131. local drillObj = {}
  132. RoleLogic.makeRoleBase(rolebase, drillObj, true) -- 先初始角色基础信息
  133. drillObj._id = fakeHuman.db._id
  134. drillObj.uuid = nil
  135. drillObj.heroList = objList
  136. drillObj.helpList = helpList
  137. drillObj.formation = formation
  138. drillObj.jiban = jiban
  139. drillObj.objStatus = nil -- 英雄状态 [index] = hpRate
  140. return drillObj
  141. end
  142. -- (本服)随机一个战斗对象
  143. local RANDOM_LIST = {}
  144. function randomDrillObj(zdlMin, zdlMax, ninTb, isMonster)
  145. local cnt = 0
  146. local without = {}
  147. for _, uuid in pairs(ninTb) do
  148. without[uuid] = true
  149. end
  150. if isMonster then
  151. RANDOM_LIST = {}
  152. for _, drillObj in ipairs(MONSTER_OBJLIST) do
  153. if drillObj.zhandouli >= zdlMin and
  154. drillObj.zhandouli <= zdlMax and
  155. not without[drillObj.uuid] then
  156. cnt = cnt + 1
  157. RANDOM_LIST[cnt]= drillObj
  158. end
  159. end
  160. if cnt < 1 then return end
  161. local r = math.random(1, cnt)
  162. return RANDOM_LIST[r]
  163. else
  164. RANDOM_LIST = {}
  165. local board = BillboardDB.getBoard(BillboardDefine.TYPE_ZHANDOULI)
  166. local boardLen = board and #board.rank2data or 0
  167. for i = 1, boardLen do
  168. local rankData = board.rank2data[i]
  169. if zdlMin <= rankData.value1 and
  170. rankData.value1 <= zdlMax and
  171. not without[rankData.uuid] then
  172. cnt = cnt + 1
  173. RANDOM_LIST[cnt] = rankData.uuid
  174. end
  175. end
  176. if cnt < 1 then return end
  177. local r = math.random(1, cnt)
  178. local uuid = RANDOM_LIST[r]
  179. return createDrillObj(uuid)
  180. end
  181. end
  182. function reset()
  183. LuaMongo.remove(DB.db_drill)
  184. createMonsterDrillObj()
  185. end
  186. function initAfterStart()
  187. createMonsterDrillObj()
  188. checkDrillReset()
  189. end