DarkForbiddenAreaLogic.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. -----------------------------------------------------------------
  2. -- 文件名 : DarkForbiddenAreaLogic.lua
  3. -- 文件说明 : 幽暗禁地
  4. -- 创建时间 : 2025/07/11
  5. -- 创建人 : FC
  6. -----------------------------------------------------------
  7. local Msg = require("core.Msg")
  8. local Util = require("common.Util")
  9. local Grid = require("bag.Grid")
  10. local BagLogic = require("bag.BagLogic")
  11. local DarkConf = require("excel.darkForbiddenara")
  12. local CombatDefine = require("combat.CombatDefine")
  13. local CombatLogic = require("combat.CombatLogic")
  14. local DARKFORBIDDENAREA_OPEN_LV = 100 -- 可参与活动等级
  15. local DARKFORBIDDENAREA_BIT = 30 -- 2进制位
  16. local DARKFORBIDDENAREA_NO_SAODANG = 0 -- 不可扫荡
  17. local DARKFORBIDDENAREA_SAODANG = 1 -- 可扫荡
  18. ---------------------------------- 内部调用 ----------------------------------------------
  19. -- 获取怪物配置
  20. local function DarkForbiddenArea_GetMonsterConf()
  21. return DarkConf.darkenemy
  22. end
  23. -- 获取奖励配置
  24. local function DarkForbiddenArea_GetPrizeConf()
  25. return DarkConf.darkprize
  26. end
  27. -- 创建DB数据
  28. local function DarkForbiddenArea_CreateDB(human)
  29. local tConfig = DarkForbiddenArea_GetMonsterConf()
  30. human.db.DarkForArea = {}
  31. for nID, v in pairs(tConfig) do
  32. local nIndex = math.ceil(nID / DARKFORBIDDENAREA_BIT)
  33. if not human.db.DarkForArea[nIndex] then
  34. human.db.DarkForArea[nIndex] = DARKFORBIDDENAREA_NO_SAODANG
  35. end
  36. end
  37. end
  38. -- 设置DB数据
  39. local function DarkForbiddenArea_SetDB(human, nID)
  40. if not human.db.DarkForArea then
  41. DarkForbiddenArea_CreateDB(human)
  42. end
  43. local nIndex = math.ceil(nID / DARKFORBIDDENAREA_BIT)
  44. local byteIndex = nID % DARKFORBIDDENAREA_BIT
  45. human.db.DarkForArea[nIndex] = Util.setBit(human.db.DarkForArea[nIndex], byteIndex)
  46. end
  47. -- 获取DB数据
  48. local function DarkForbiddenArea_GetDB(human, nID)
  49. if not human.db.DarkForArea then
  50. DarkForbiddenArea_CreateDB(human)
  51. end
  52. local nIndex = math.ceil(nID / DARKFORBIDDENAREA_BIT)
  53. local byteIndex = nID % DARKFORBIDDENAREA_BIT
  54. return Util.getBit(human.db.DarkForArea[nIndex], byteIndex) > 0 and DARKFORBIDDENAREA_SAODANG or DARKFORBIDDENAREA_NO_SAODANG
  55. end
  56. -- 获取奖励
  57. local function DarkForbiddenArea_GetPrize(nPrizeID, nRandPrizeNum)
  58. local tPrizeConf = DarkForbiddenArea_GetPrizeConf()
  59. local tPrizeInfo, nAllWeight = {}, 0
  60. for nID, v in ipairs(tPrizeConf) do
  61. if v.nPrizeID == nPrizeID then
  62. nAllWeight = nAllWeight + v.nWeight
  63. table.insert(tPrizeInfo, {nWeight = nAllWeight, tPrize = v.tPrize})
  64. end
  65. end
  66. if nil == _G.next(tPrizeInfo) then
  67. return nil
  68. end
  69. local tItem = {}
  70. for i = 1, nRandPrizeNum, 1 do
  71. local nRandWeight = math.random(1, nAllWeight)
  72. for _, v in pairs(tPrizeInfo) do
  73. if nRandWeight <= v.nWeight then
  74. local nGoodsID = v.tPrize[1]
  75. local nGoodsNum = v.tPrize[2]
  76. if not tItem[nGoodsID] then
  77. tItem[nGoodsID] = 0
  78. end
  79. tItem[nGoodsID] = tItem[nGoodsID] + nGoodsNum
  80. break
  81. end
  82. end
  83. end
  84. if nil == _G.next(tItem) then
  85. return nil
  86. end
  87. local tGoods = {}
  88. for nGoodsID, nGoodsNum in pairs(tItem) do
  89. table.insert(tGoods, {nGoodsID, nGoodsNum})
  90. end
  91. return tGoods
  92. end
  93. ---------------------------------- 客户端请求 ----------------------------------------------
  94. -- 请求幽暗禁地信息
  95. function DarkForAreaLogic_Query(human, nType)
  96. if not human.db.DarkForArea then
  97. DarkForbiddenArea_CreateDB(human)
  98. end
  99. local tMsgData = Msg.gc.GC_DARK_FORBIDDEN_AREA_QUEY
  100. local bFillUse, bFillHave = false, false
  101. local nAllLen, nSendLen = 0, 0
  102. local tMonstConf = DarkForbiddenArea_GetMonsterConf()
  103. for nID, v in pairs(tMonstConf) do
  104. if v.nDifficulty == nType then
  105. nAllLen = nAllLen + 1
  106. end
  107. end
  108. tMsgData.tMonster[0] = 0
  109. tMsgData.bEnd = 0
  110. for nID, v in pairs(tMonstConf) do
  111. if v.nDifficulty == nType then
  112. nSendLen = nSendLen + 1
  113. tMsgData.tMonster[0] = tMsgData.tMonster[0] + 1
  114. local tData = tMsgData.tMonster[tMsgData.tMonster[0]]
  115. tData.nID = nID
  116. tData.szName = v.szMonsterName
  117. tData.nMonsterShowID = v.nMonsterStyling
  118. tData.nMonsterLv = v.nMonsterLv
  119. tData.bSaoDang = DarkForbiddenArea_GetDB(human, nID)
  120. -- 奖励配置
  121. local tPrizeData = tData.tPrize
  122. tPrizeData[0] = 0
  123. local nPrizeID = v.nPrizeID
  124. local tPrizeConf = DarkForbiddenArea_GetPrizeConf()
  125. for _, value in ipairs(tPrizeConf) do
  126. if value.nPrizeID == nPrizeID and value.tShow and value.tShow == 1 then
  127. tPrizeData[0] = tPrizeData[0] + 1
  128. Grid.makeItem(tPrizeData[tPrizeData[0]], value.tPrize[1], value.tPrize[2])
  129. end
  130. end
  131. if false == bFillUse then
  132. Grid.makeItem(tMsgData.tUseGoods, v.nUseGood, v.nUseNum)
  133. bFillUse = true
  134. end
  135. if false == bFillHave then
  136. tMsgData.nHaveNum = BagLogic.getItemCnt(human, v.nUseGood)
  137. bFillHave = true
  138. end
  139. if tMsgData.tMonster[0] >= 5 then
  140. tMsgData.bEnd = nSendLen == nAllLen and 1 or 0
  141. Msg.send(tMsgData, human.fd)
  142. tMsgData.tMonster[0] = 0
  143. end
  144. end
  145. end
  146. if tMsgData.tMonster[0] > 0 and tMsgData.bEnd == 0 then
  147. tMsgData.bEnd = 1
  148. Msg.send(tMsgData, human.fd)
  149. end
  150. print("[DarkForAreaLogic_Query] 下发协议结束")
  151. end
  152. -- 请求扫荡
  153. function DarkForAreaLogic_SaoDang(human, nID)
  154. local tConfig = DarkForbiddenArea_GetMonsterConf()
  155. if not tConfig or not tConfig[nID] then
  156. return
  157. end
  158. local bSaoDang = DarkForbiddenArea_GetDB(human, nID)
  159. if DARKFORBIDDENAREA_NO_SAODANG == bSaoDang then
  160. print("[CG_DARK_FORBIDDEN_AREA_SAODANG] 当前没有解锁扫荡")
  161. return
  162. end
  163. local tMonsterConf = tConfig[nID]
  164. local nNowGoodsNum = BagLogic.getItemCnt(human, tMonsterConf.nUseGood)
  165. if tMonsterConf.nUseNum > nNowGoodsNum then
  166. print("[CG_DARK_FORBIDDEN_AREA_SAODANG] 当前扫荡物品不足")
  167. return
  168. end
  169. local tItem = DarkForbiddenArea_GetPrize(tMonsterConf.nPrizeID, tMonsterConf.nRandPrizeNum)
  170. if nil ~= tItem and nil ~= _G.next(tItem) then
  171. BagLogic.delItem(human, tMonsterConf.nUseGood, tMonsterConf.nUseNum, "darkforarea")
  172. BagLogic.addItemList(human, tItem, "darkforarea")
  173. --DarkForAreaLogic_Query(human, tMonsterConf.nDifficulty)
  174. end
  175. end
  176. ---------------------------------- 战斗相关 ----------------------------------------------
  177. -- 调用开始战斗
  178. function fight(human, args, combatType)
  179. if not human or combatType ~= CombatDefine.COMBAT_TYPE31 then
  180. print("[arkForbiddenAreaLogic_fight] 不正确的参数 combatType = "..combatType)
  181. return
  182. end
  183. if not args[1] or not args[2] then
  184. print("[arkForbiddenAreaLogic_fight] 不存在对应的 args 参数")
  185. return
  186. end
  187. local nID = tonumber(args[2])
  188. local tMonsterConf = DarkForbiddenArea_GetMonsterConf()
  189. print("[arkForbiddenAreaLogic_fight] args1 = "..args[1].." args2 = "..args[2])
  190. if not nID then
  191. print("[DarkForbiddenAreaLogic_fight] 参数不正确没有传递正确的对应对战的怪物ID ")
  192. return
  193. end
  194. if not tMonsterConf[nID] then
  195. print("[DarkForbiddenAreaLogic_fight]不存在对应配置 ")
  196. return
  197. end
  198. if not nID or not tMonsterConf[nID] then
  199. print("[DarkForbiddenAreaLogic_fight] 参数不正确没有传递正确的对应对战的怪物ID ")
  200. return
  201. end
  202. local nUseGood, nUseNum = tMonsterConf[nID].nUseGood, tMonsterConf[nID].nUseNum
  203. local nNowGoodsNum = BagLogic.getItemCnt(human, nUseGood)
  204. if nNowGoodsNum < nUseNum then
  205. print("[DarkForbiddenAreaLogic_fight] 挑战消耗的物品不足 nNowGoodsNum = "..nNowGoodsNum.." nUseNum = "..nUseNum)
  206. return
  207. end
  208. -- 删除挑战消耗物品
  209. BagLogic.delItem(human, nUseGood, nUseNum, "darkforarea")
  210. print("[arkForbiddenAreaLogic_fight] 开始进入战斗")
  211. CombatLogic.combatBegin(human, 1001, args, CombatDefine.COMBAT_TYPE31, nID)
  212. end
  213. -- 获取人物对战列表
  214. function getCombatObjList(human, side, args)
  215. if side ~= CombatDefine.ATTACK_SIDE then
  216. return
  217. end
  218. -- local uuid = args[1]
  219. -- if not uuid then return end
  220. -- local fakeHuman = CombatLogic.createCombatFakeHuman(uuid)
  221. -- if not fakeHuman then return end
  222. return CombatLogic.getHumanObjList(human, CombatDefine.COMBAT_TYPE1)
  223. end
  224. -- 获取机器人对应战斗ID
  225. function getCombatMonsterOutID(human, side, args)
  226. if side ~= CombatDefine.DEFEND_SIDE then
  227. return
  228. end
  229. local nID = tonumber(args[2])
  230. local tMonsterConf = DarkForbiddenArea_GetMonsterConf()
  231. if not nID or not tMonsterConf[nID] then
  232. print("[DarkForbiddenAreaLogic_getCombatMonsterOutID] 参数不正确没有传递正确的对应对战的怪物ID ")
  233. return
  234. end
  235. local nMonsterOutID = tMonsterConf[nID].nMonsterID
  236. if not nMonsterOutID then
  237. print("[DarkForbiddenAreaLogic_getCombatMonsterOutID] 配置中没有配置正确的怪物ID")
  238. return
  239. end
  240. return nMonsterOutID
  241. end
  242. -- 挑战结束
  243. function onFightEnd(human, result, combatType, nIndexID, combatInfo)
  244. if CombatDefine.COMBAT_TYPE31 ~= combatType then
  245. return
  246. end
  247. local nID = tonumber(nIndexID)
  248. if CombatDefine.RESULT_WIN == result then
  249. local tMonsterConf = DarkForbiddenArea_GetMonsterConf()
  250. if not tMonsterConf[nID] then
  251. print("[DarkForbiddenAreaLogic_onFightEnd] 挑战结束, 但是获取不到对应的怪物配置 nID = "..nID)
  252. return
  253. end
  254. local tItem = DarkForbiddenArea_GetPrize(tMonsterConf[nID].nPrizeID, tMonsterConf[nID].nRandPrizeNum)
  255. if nil ~= tItem and nil ~= _G.next(tItem) then
  256. combatInfo.rewardItem = combatInfo.rewardItem or {}
  257. for i, v in pairs(tItem) do
  258. BagLogic.addItem(human, v[1], v[2], "darkforarea")
  259. combatInfo.rewardItem[i] = combatInfo.rewardItem[i] or { }
  260. combatInfo.rewardItem[i] = {v[1], v[2]}
  261. end
  262. -- BagLogic.addItemList(human, tItem, "darkforarea")
  263. end
  264. DarkForbiddenArea_SetDB(human, nID)
  265. end
  266. end