DarkForbiddenAreaLogic.lua 11 KB

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