DarkForbiddenAreaLogic.lua 12 KB

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