BusOneActivityHeroYuanZheng.lua 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. --------------------------------
  2. -- 文件名 : BusOneActivityHeroYuanZheng.lua
  3. -- 文件说明 : 新商业活动-英雄远征
  4. -- 创建时间 : 2025/08/06
  5. -- 创建人 : FC
  6. --------------------------------
  7. local tBusoneActivityConf = require("excel.BusoneActivity")
  8. local Util = require("common.Util")
  9. local Msg = require("core.Msg")
  10. local Grid = require("bag.Grid")
  11. local BagLogic = require("bag.BagLogic")
  12. local CommonDefine = require("common.CommonDefine")
  13. local AbsActLogic = require("absAct.AbsActLogic")
  14. local BuyLogic = require("topup.BuyLogic")
  15. local YunYingLogic = require("yunying.YunYingLogic")
  16. local BusOneActivityTask = require("absAct.BusOneActivityTask")
  17. local BusOneActivityYuanZheng = require("absAct.BusOneActivityYuanZheng")
  18. local BUSONEHEROYUANZHENGABSID = 7204 -- 对应ABS活动ID
  19. local BUSONEHEROYUANZHENGMAXLAYERS = nil -- 最大层数
  20. local BUSONEHEROYUANZHENGMAXROUND = nil -- 最大轮数
  21. local BUSONEHEROYUANZHENGBAOHU = 2 -- 保护抽取
  22. local BUSONEHEROYUANZHENGDGOODID = 1039 -- 物品ID
  23. ----------------------------------------- 内部处理开始 -------------------------------------
  24. -- 获取权重配置
  25. local function BusOneHeroYuanZheng_GetWeightConf()
  26. return tBusoneActivityConf.HeroWeight
  27. end
  28. -- 获取奖励配置
  29. local function BusOneHeroYuanZheng_GetHeroConf()
  30. return tBusoneActivityConf.HeroYuanZheng
  31. end
  32. local function BusOneHeroYuanZheng_GetMaxLayers()
  33. if nil == BUSONEHEROYUANZHENGMAXLAYERS then
  34. BUSONEHEROYUANZHENGMAXLAYERS = 0
  35. for _, v in ipairs(tBusoneActivityConf.HeroYuanZheng) do
  36. if v.nLayers > BUSONEHEROYUANZHENGMAXLAYERS then
  37. BUSONEHEROYUANZHENGMAXLAYERS = v.nLayers
  38. end
  39. end
  40. end
  41. return BUSONEHEROYUANZHENGMAXLAYERS
  42. end
  43. -- 获取最大轮数
  44. local function BusOneHeroYuanZheng_GetMaxRound()
  45. if nil == BUSONEHEROYUANZHENGMAXROUND then
  46. BUSONEHEROYUANZHENGMAXROUND = 0
  47. for _, v in ipairs(tBusoneActivityConf.HeroYuanZheng) do
  48. if v.nRound > BUSONEHEROYUANZHENGMAXROUND then
  49. BUSONEHEROYUANZHENGMAXROUND = v.nRound
  50. end
  51. end
  52. end
  53. return BUSONEHEROYUANZHENGMAXROUND
  54. end
  55. -- 创建DB
  56. local function BusOneHeroYuanZheng_CreatDB(human)
  57. if not human.db.absAct[BUSONEHEROYUANZHENGABSID] then
  58. human.db.absAct[BUSONEHEROYUANZHENGABSID] = {}
  59. end
  60. human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers = {
  61. nRound = 1,
  62. nLayers = -1,
  63. tStatus = {},
  64. }
  65. local nMaxLayers = BusOneHeroYuanZheng_GetMaxLayers()
  66. for i = 0, nMaxLayers, 1 do
  67. human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.tStatus[i] = CommonDefine.COMMON_PRIZE_STATE_NOGET
  68. end
  69. end
  70. -- 重置DB
  71. local function BusOneHeroYuanZheng_CheckAndResetDB(human)
  72. if not human.db.absAct[BUSONEHEROYUANZHENGABSID] or nil == _G.next(human.db.absAct[BUSONEHEROYUANZHENGABSID])
  73. or not human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers then
  74. BusOneHeroYuanZheng_CreatDB(human)
  75. end
  76. end
  77. -- 获取当前远征轮数
  78. local function BusOneHeroYuanZheng_GetRound(human)
  79. return human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.nRound
  80. end
  81. -- 设置远征轮数
  82. local function BusOneHeroYuanZheng_SetRound(human, nValue)
  83. human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.nRound = nValue
  84. end
  85. -- 获取当前远征层数
  86. local function BusOneHeroYuanZheng_GetLayers(human)
  87. return human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.nLayers
  88. end
  89. -- 设置远征层数
  90. local function BusOneHeroYuanZheng_SetLayers(human, nValue)
  91. human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.nLayers = nValue
  92. end
  93. -- 获取当前远征状态
  94. local function BusOneHeroYuanZheng_GetStatus(human, nID)
  95. return human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.tStatus[nID]
  96. end
  97. -- 设置远征状态
  98. local function BusOneHeroYuanZheng_SetStatus(human, nID, nValue)
  99. human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.tStatus[nID] = nValue
  100. end
  101. -- 进行对应轮数
  102. local function BusOneHeroYuanZheng_EnterRound(human, nRound)
  103. local nMaxRound = BusOneHeroYuanZheng_GetMaxRound()
  104. if nMaxRound < nRound then
  105. return
  106. end
  107. BusOneHeroYuanZheng_SetRound(human, nRound)
  108. BusOneHeroYuanZheng_SetLayers(human, -1)
  109. local nMaxLayers = BusOneHeroYuanZheng_GetMaxLayers()
  110. for i = 0, nMaxLayers, 1 do
  111. human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.tStatus[i] = CommonDefine.COMMON_PRIZE_STATE_NOGET
  112. end
  113. end
  114. -----------------------------------客户端请求-----------------------------
  115. -- 请求英雄远征
  116. function BusOneHeroYuanZheng_Query(human)
  117. BusOneHeroYuanZheng_CheckAndResetDB(human)
  118. local tMsgData = Msg.gc.GC_NEW_BUSONEACT_HERO_QUERY
  119. local tWeightConf = BusOneHeroYuanZheng_GetWeightConf()
  120. tMsgData.tFenShu[0] = #tWeightConf
  121. for i, v in ipairs(tWeightConf) do
  122. tMsgData.tFenShu[i] = v.nWeight
  123. end
  124. tMsgData.nRound = BusOneHeroYuanZheng_GetRound(human)
  125. tMsgData.nLayers = BusOneHeroYuanZheng_GetLayers(human)
  126. local tConf = BusOneHeroYuanZheng_GetHeroConf()
  127. tMsgData.tLayersInfo[0] = 0
  128. for _, v in ipairs(tConf) do
  129. if v.nRound == tMsgData.nRound then
  130. local nLayers = v.nLayers
  131. tMsgData.tLayersInfo[0] = tMsgData.tLayersInfo[0] + 1
  132. local tData = tMsgData.tLayersInfo[tMsgData.tLayersInfo[0]]
  133. tData.nLayers = nLayers
  134. tData.nStatus = BusOneHeroYuanZheng_GetStatus(human, nLayers)
  135. tData.tPrize[0] = #v.tPrize
  136. for i, tItem in ipairs(v.tPrize) do
  137. local nGoodsID = tItem[1]
  138. local nGoodsNum = tItem[2]
  139. Grid.makeItem(tData.tPrize[i], nGoodsID, nGoodsNum)
  140. end
  141. end
  142. end
  143. Msg.send(tMsgData, human.fd)
  144. end
  145. -- 请求参与
  146. function BusOneHeroYuanZheng_Join(human)
  147. BusOneHeroYuanZheng_CheckAndResetDB(human)
  148. local nGoodsNum = BagLogic.getItemCnt(human, BUSONEHEROYUANZHENGDGOODID)
  149. if 0 >= nGoodsNum then
  150. print("[BusOneHeroYuanZheng_Join] 物品不足 nGoodsNum = "..nGoodsNum)
  151. return
  152. end
  153. local nNowLayers = BusOneHeroYuanZheng_GetLayers(human)
  154. if nNowLayers ~= -1 then
  155. print("[BusOneHeroYuanZheng_Join] 当前层数不正确 nNowLayers = "..nNowLayers)
  156. return
  157. end
  158. local tWeightConf = BusOneHeroYuanZheng_GetWeightConf()
  159. local nAllWeight = 0
  160. local tWeight = {}
  161. for _, v in ipairs(tWeightConf) do
  162. if v.nWeight >= 0 then
  163. nAllWeight = nAllWeight + v.nLayers
  164. table.insert(tWeight, {nWeight = nAllWeight, nFenShu = v.nWeight})
  165. end
  166. end
  167. local nRandWeight = math.random(1, nAllWeight)
  168. local nFenShu = nil
  169. for _, v in ipairs(tWeight) do
  170. if v.nWeight >= nRandWeight then
  171. nFenShu = v.nFenShu
  172. break
  173. end
  174. end
  175. local nNewLayers = nNowLayers + nFenShu
  176. BusOneHeroYuanZheng_SetLayers(human, nNewLayers)
  177. BusOneHeroYuanZheng_SetStatus(human, nNewLayers, CommonDefine.COMMON_PRIZE_STATE_CANGET)
  178. local nRound = BusOneHeroYuanZheng_GetRound(human)
  179. local tConf = BusOneHeroYuanZheng_GetHeroConf()
  180. local tMsgData = Msg.gc.GC_NEW_BUSONEACT_HERO_JOIN
  181. tMsgData.nFenShu = nFenShu
  182. tMsgData.nLayers = nNewLayers
  183. tMsgData.tLayersInfo[0] = 0
  184. for _, v in ipairs(tConf) do
  185. if v.nRound == nRound then
  186. local nLayers = v.nLayers
  187. tMsgData.tLayersInfo[0] = tMsgData.tLayersInfo[0] + 1
  188. local tData = tMsgData.tLayersInfo[tMsgData.tLayersInfo[0]]
  189. tData.nLayers = nLayers
  190. tData.nStatus = BusOneHeroYuanZheng_GetStatus(human, nLayers)
  191. tData.tPrize[0] = #v.tPrize
  192. for i, tItem in ipairs(v.tPrize) do
  193. local nGoodsID = tItem[1]
  194. local nGoodsNum = tItem[2]
  195. Grid.makeItem(tData.tPrize[i], nGoodsID, nGoodsNum)
  196. end
  197. end
  198. end
  199. BagLogic.delItem(human, BUSONEHEROYUANZHENGBAOHU, 1, "BusOneHeroYuanZheng")
  200. Msg.send(tMsgData, human.fd)
  201. print("[BusOneHeroYuanZheng_Join] 发送数据完成")
  202. BusOneActivityYuanZheng.BusOneYuanZheng_NumChange(human, 1)
  203. BusOneActivityTask.BusOneTask_SendRed(human)
  204. end
  205. -- 请求抽取
  206. function BusOneHeroYuanZheng_Do(human, nOperate)
  207. local nDelNum = nOperate == BUSONEHEROYUANZHENGBAOHU and 1 or 0
  208. local nGoodsNum = BagLogic.getItemCnt(human, BUSONEHEROYUANZHENGDGOODID)
  209. if nGoodsNum < nDelNum then
  210. print("[BusOneHeroYuanZheng_Do] 进行抽取 当前的可抽取的数量不正确 nGoodsNum = "..nGoodsNum.." nDelNum = "..nDelNum)
  211. return
  212. end
  213. local tWeightConf = BusOneHeroYuanZheng_GetWeightConf()
  214. local nAllWeight = 0
  215. local tWeight = {}
  216. for _, v in ipairs(tWeightConf) do
  217. if v.nWeight >= 0 then
  218. nAllWeight = nAllWeight + v.nLayers
  219. table.insert(tWeight, {nWeight = nAllWeight, nFenShu = v.nWeight})
  220. else
  221. if nOperate ~= BUSONEHEROYUANZHENGBAOHU then
  222. nAllWeight = nAllWeight + v.nLayers
  223. table.insert(tWeight, {nWeight = nAllWeight, nFenShu = v.nWeight})
  224. end
  225. end
  226. end
  227. local nRandWeight = math.random(1, nAllWeight)
  228. local nFenShu = nil
  229. for _, v in ipairs(tWeight) do
  230. if v.nWeight >= nRandWeight then
  231. nFenShu = v.nFenShu
  232. break
  233. end
  234. end
  235. local nNowLayers = BusOneHeroYuanZheng_GetLayers(human)
  236. local nMaxLayers = BusOneHeroYuanZheng_GetMaxLayers()
  237. local nNextLayer = nNowLayers + nFenShu
  238. if nNextLayer > 0 then
  239. nNextLayer = nNextLayer > nMaxLayers and nMaxLayers or nNextLayer
  240. BusOneHeroYuanZheng_SetStatus(human, nNowLayers, CommonDefine.COMMON_PRIZE_STATE_NOGET)
  241. BusOneHeroYuanZheng_SetLayers(human, nNextLayer)
  242. BusOneHeroYuanZheng_SetStatus(human, nNextLayer, CommonDefine.COMMON_PRIZE_STATE_CANGET)
  243. else
  244. if nNextLayer < 0 then
  245. nNextLayer = -1
  246. -- 重置为第一轮
  247. BusOneHeroYuanZheng_EnterRound(human, 1)
  248. else
  249. BusOneHeroYuanZheng_SetStatus(human, nNowLayers, CommonDefine.COMMON_PRIZE_STATE_NOGET)
  250. BusOneHeroYuanZheng_SetLayers(human, nNextLayer)
  251. BusOneHeroYuanZheng_SetStatus(human, nNextLayer, CommonDefine.COMMON_PRIZE_STATE_CANGET)
  252. end
  253. end
  254. local tMsgData = Msg.gc.GC_NEW_BUSONEACT_HERO_DO
  255. tMsgData.nFenShu = nFenShu
  256. tMsgData.nLayers = nNextLayer
  257. tMsgData.nRound = BusOneHeroYuanZheng_GetRound(human)
  258. tMsgData.tLayersInfo[0] = 0
  259. local tConf = BusOneHeroYuanZheng_GetHeroConf()
  260. for _, v in ipairs(tConf) do
  261. if v.nRound == tMsgData.nRound then
  262. local nLayers = v.nLayers
  263. tMsgData.tLayersInfo[0] = tMsgData.tLayersInfo[0] + 1
  264. local tData = tMsgData.tLayersInfo[tMsgData.tLayersInfo[0]]
  265. tData.nLayers = nLayers
  266. tData.nStatus = BusOneHeroYuanZheng_GetStatus(human, nLayers)
  267. tData.tPrize[0] = #v.tPrize
  268. for i, tItem in ipairs(v.tPrize) do
  269. local nGoodsID = tItem[1]
  270. local nGoodsNum = tItem[2]
  271. Grid.makeItem(tData.tPrize[i], nGoodsID, nGoodsNum)
  272. end
  273. end
  274. end
  275. if nDelNum > 0 then
  276. BagLogic.delItem(human, BUSONEHEROYUANZHENGBAOHU, nDelNum, "BusOneHeroYuanZheng")
  277. end
  278. BusOneActivityYuanZheng.BusOneYuanZheng_NumChange(human, 1)
  279. BusOneActivityTask.BusOneTask_SendRed(human)
  280. Msg.send(tMsgData, human.fd)
  281. end
  282. -- 请求领取奖励
  283. function BusOneHeroYuanZheng_Get(human, nLayers, nIndex)
  284. local nRound = BusOneHeroYuanZheng_GetRound(human)
  285. local nNowLayers = BusOneHeroYuanZheng_GetLayers(human)
  286. if nLayers ~= nNowLayers then
  287. print("[BusOneHeroYuanZheng_Get] 请求领取奖励的层数和记录的不一致 nLayers = "..nLayers.." nNowLayers = "..nNowLayers)
  288. return
  289. end
  290. local tItem = {}
  291. local tConf = BusOneHeroYuanZheng_GetHeroConf()
  292. for _, v in ipairs(tConf) do
  293. if v.nRound == nRound and v.nLayers == nNowLayers then
  294. BusOneHeroYuanZheng_SetStatus(human, nNowLayers, CommonDefine.COMMON_PRIZE_STATE_GET)
  295. for i, value in ipairs(v.tPrize) do
  296. if i == nIndex then
  297. table.insert(tItem, {value[1], value[2]})
  298. break
  299. end
  300. end
  301. end
  302. end
  303. if nil ~= _G.next(tItem) then
  304. BagLogic.addItemList(human, tItem, "BusOneHeroYuanZheng")
  305. local nNextRound = nRound + 1
  306. local nMaxRound = BusOneHeroYuanZheng_GetMaxRound()
  307. local nMaxLayers = BusOneHeroYuanZheng_GetMaxLayers()
  308. print("[BusOneHeroYuanZheng_Get] 当前轮数 nRound = "..nRound.." nNextRound = "..nNextRound.." nMaxRound = "..nMaxRound)
  309. if nNextRound <= nMaxRound and nNowLayers == nMaxLayers then
  310. print("[BusOneHeroYuanZheng_Get] 进入下一轮")
  311. BusOneHeroYuanZheng_EnterRound(human, nNextRound)
  312. else
  313. print("[BusOneHeroYuanZheng_Get] 重置为第一轮")
  314. BusOneHeroYuanZheng_EnterRound(human, 1)
  315. end
  316. BusOneHeroYuanZheng_Query(human)
  317. BusOneActivityTask.BusOneTask_SendRed(human)
  318. else
  319. print("[BusOneHeroYuanZheng_Get] 不存在对应的奖励 nLayers = "..nLayers.." nIndex = "..nIndex)
  320. end
  321. end
  322. -----------------------------------外部调用-----------------------------
  323. function isOpen(human, YYInfo, funcConfig)
  324. print("[BusOneHeroYuanZheng_isOpen] 进入判断")
  325. local state, endTime, startTime = AbsActLogic.isStarted(human, funcConfig and funcConfig.funcID or BUSONEHEROYUANZHENGABSID)
  326. if not state then
  327. print("[BusOneHeroYuanZheng_isOpen] 当前活动未开启")
  328. return
  329. end
  330. print("[BusOneHeroYuanZheng_isOpen] 进入判断 endTime = "..endTime.." startTime = "..startTime)
  331. return true, endTime, startTime
  332. end
  333. function isActive(human, YYInfo, funcConfig)
  334. return not isOpen(human, YYInfo, funcConfig)
  335. end
  336. function isRed(human, YYInfo, absActConfig)
  337. BusOneHeroYuanZheng_CheckAndResetDB(human)
  338. local tConf = BusOneHeroYuanZheng_GetHeroConf()
  339. local nRound = BusOneHeroYuanZheng_GetRound(human)
  340. for _, v in ipairs(tConf) do
  341. if v.nRound == nRound then
  342. local nStatus = BusOneHeroYuanZheng_GetStatus(human, v.nLayers)
  343. if nStatus == CommonDefine.COMMON_PRIZE_STATE_CANGET then
  344. return true
  345. end
  346. end
  347. end
  348. return false
  349. end