BusOneActivityHeroYuanZheng.lua 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449
  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. bCanDo = true
  65. }
  66. local nMaxLayers = BusOneHeroYuanZheng_GetMaxLayers()
  67. for i = 0, nMaxLayers, 1 do
  68. human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.tStatus[i] = CommonDefine.COMMON_PRIZE_STATE_NOGET
  69. end
  70. end
  71. -- 重置DB
  72. local function BusOneHeroYuanZheng_CheckAndResetDB(human)
  73. if not human.db.absAct[BUSONEHEROYUANZHENGABSID] or nil == _G.next(human.db.absAct[BUSONEHEROYUANZHENGABSID])
  74. or not human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers then
  75. BusOneHeroYuanZheng_CreatDB(human)
  76. end
  77. end
  78. -- 获取当前远征轮数
  79. local function BusOneHeroYuanZheng_GetRound(human)
  80. return human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.nRound
  81. end
  82. -- 设置远征轮数
  83. local function BusOneHeroYuanZheng_SetRound(human, nValue)
  84. human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.nRound = nValue
  85. end
  86. -- 获取当前远征层数
  87. local function BusOneHeroYuanZheng_GetLayers(human)
  88. return human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.nLayers
  89. end
  90. -- 设置远征层数
  91. local function BusOneHeroYuanZheng_SetLayers(human, nValue)
  92. human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.nLayers = nValue
  93. end
  94. -- 获取当前远征状态
  95. local function BusOneHeroYuanZheng_GetStatus(human, nID)
  96. return human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.tStatus[nID]
  97. end
  98. -- 设置远征状态
  99. local function BusOneHeroYuanZheng_SetStatus(human, nID, nValue)
  100. human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.tStatus[nID] = nValue
  101. end
  102. -- 获取能否继续抽取
  103. local function BusOneHeroYuanZheng_GetCanDo(human)
  104. return human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.bCanDo
  105. end
  106. -- 设置能否继续抽取
  107. local function BusOneHeroYuanZheng_SetCanDo(human, nValue)
  108. human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.bCanDo = nValue
  109. end
  110. -- 进行对应轮数
  111. local function BusOneHeroYuanZheng_EnterRound(human, nRound)
  112. local nMaxRound = BusOneHeroYuanZheng_GetMaxRound()
  113. if nMaxRound < nRound then
  114. return
  115. end
  116. BusOneHeroYuanZheng_SetRound(human, nRound)
  117. BusOneHeroYuanZheng_SetLayers(human, -1)
  118. BusOneHeroYuanZheng_SetCanDo(human, true)
  119. local nMaxLayers = BusOneHeroYuanZheng_GetMaxLayers()
  120. for i = 0, nMaxLayers, 1 do
  121. human.db.absAct[BUSONEHEROYUANZHENGABSID].tLayers.tStatus[i] = CommonDefine.COMMON_PRIZE_STATE_NOGET
  122. end
  123. end
  124. -----------------------------------客户端请求-----------------------------
  125. -- 请求英雄远征
  126. function BusOneHeroYuanZheng_Query(human)
  127. BusOneHeroYuanZheng_CheckAndResetDB(human)
  128. local tMsgData = Msg.gc.GC_NEW_BUSONEACT_HERO_QUERY
  129. local tWeightConf = BusOneHeroYuanZheng_GetWeightConf()
  130. tMsgData.tFenShu[0] = #tWeightConf
  131. for i, v in ipairs(tWeightConf) do
  132. tMsgData.tFenShu[i] = v.nWeight
  133. end
  134. tMsgData.bCanDo = BusOneHeroYuanZheng_GetCanDo(human) == true and 1 or 0
  135. tMsgData.nRound = BusOneHeroYuanZheng_GetRound(human)
  136. tMsgData.nLayers = BusOneHeroYuanZheng_GetLayers(human)
  137. local tConf = BusOneHeroYuanZheng_GetHeroConf()
  138. tMsgData.tLayersInfo[0] = 0
  139. for _, v in ipairs(tConf) do
  140. if v.nRound == tMsgData.nRound then
  141. local nLayers = v.nLayers
  142. tMsgData.tLayersInfo[0] = tMsgData.tLayersInfo[0] + 1
  143. local tData = tMsgData.tLayersInfo[tMsgData.tLayersInfo[0]]
  144. tData.nLayers = nLayers
  145. tData.nStatus = BusOneHeroYuanZheng_GetStatus(human, nLayers)
  146. tData.tPrize[0] = #v.tPrize
  147. for i, tItem in ipairs(v.tPrize) do
  148. local nGoodsID = tItem[1]
  149. local nGoodsNum = tItem[2]
  150. Grid.makeItem(tData.tPrize[i], nGoodsID, nGoodsNum)
  151. end
  152. end
  153. end
  154. Msg.send(tMsgData, human.fd)
  155. end
  156. -- 请求参与
  157. function BusOneHeroYuanZheng_Join(human)
  158. BusOneHeroYuanZheng_CheckAndResetDB(human)
  159. local nGoodsNum = BagLogic.getItemCnt(human, BUSONEHEROYUANZHENGDGOODID)
  160. if 0 >= nGoodsNum then
  161. print("[BusOneHeroYuanZheng_Join] 物品不足 nGoodsNum = "..nGoodsNum)
  162. return
  163. end
  164. local nNowLayers = BusOneHeroYuanZheng_GetLayers(human)
  165. if nNowLayers ~= -1 then
  166. print("[BusOneHeroYuanZheng_Join] 当前层数不正确 nNowLayers = "..nNowLayers)
  167. return
  168. end
  169. local tWeightConf = BusOneHeroYuanZheng_GetWeightConf()
  170. local nAllWeight = 0
  171. local tWeight = {}
  172. for _, v in ipairs(tWeightConf) do
  173. if v.nWeight >= 0 then
  174. nAllWeight = nAllWeight + v.nLayers
  175. table.insert(tWeight, {nWeight = nAllWeight, nFenShu = v.nWeight})
  176. end
  177. end
  178. local nRandWeight = math.random(1, nAllWeight)
  179. local nFenShu = nil
  180. for _, v in ipairs(tWeight) do
  181. if v.nWeight >= nRandWeight then
  182. nFenShu = v.nFenShu
  183. break
  184. end
  185. end
  186. local nNewLayers = nNowLayers + nFenShu
  187. BusOneHeroYuanZheng_SetLayers(human, nNewLayers)
  188. BusOneHeroYuanZheng_SetStatus(human, nNewLayers, CommonDefine.COMMON_PRIZE_STATE_CANGET)
  189. local nRound = BusOneHeroYuanZheng_GetRound(human)
  190. local tConf = BusOneHeroYuanZheng_GetHeroConf()
  191. local tMsgData = Msg.gc.GC_NEW_BUSONEACT_HERO_JOIN
  192. tMsgData.nFenShu = nFenShu
  193. tMsgData.nLayers = nNewLayers
  194. tMsgData.tLayersInfo[0] = 0
  195. for _, v in ipairs(tConf) do
  196. if v.nRound == nRound then
  197. local nLayers = v.nLayers
  198. tMsgData.tLayersInfo[0] = tMsgData.tLayersInfo[0] + 1
  199. local tData = tMsgData.tLayersInfo[tMsgData.tLayersInfo[0]]
  200. tData.nLayers = nLayers
  201. tData.nStatus = BusOneHeroYuanZheng_GetStatus(human, nLayers)
  202. tData.tPrize[0] = #v.tPrize
  203. for i, tItem in ipairs(v.tPrize) do
  204. local nGoodsID = tItem[1]
  205. local nGoodsNum = tItem[2]
  206. Grid.makeItem(tData.tPrize[i], nGoodsID, nGoodsNum)
  207. end
  208. end
  209. end
  210. BagLogic.delItem(human, BUSONEHEROYUANZHENGDGOODID, 1, "BusOneHeroYuanZheng")
  211. Msg.send(tMsgData, human.fd)
  212. print("[BusOneHeroYuanZheng_Join] 发送数据完成")
  213. BusOneActivityYuanZheng.BusOneYuanZheng_NumChange(human, 1)
  214. BusOneActivityTask.BusOneTask_SendRed(human)
  215. end
  216. -- 请求抽取
  217. function BusOneHeroYuanZheng_Do(human, nOperate)
  218. local nDelNum = nOperate == BUSONEHEROYUANZHENGBAOHU and 1 or 0
  219. local nGoodsNum = BagLogic.getItemCnt(human, BUSONEHEROYUANZHENGDGOODID)
  220. if nGoodsNum < nDelNum then
  221. print("[BusOneHeroYuanZheng_Do] 进行抽取 当前的可抽取的数量不正确 nGoodsNum = "..nGoodsNum.." nDelNum = "..nDelNum)
  222. return
  223. end
  224. local bCanDO = BusOneHeroYuanZheng_GetCanDo(human)
  225. if false == bCanDO then
  226. print("[BusOneHeroYuanZheng_Do] 进行抽取, 当前不能进行抽取")
  227. return
  228. end
  229. local tWeightConf = BusOneHeroYuanZheng_GetWeightConf()
  230. local nAllWeight = 0
  231. local tWeight = {}
  232. for _, v in ipairs(tWeightConf) do
  233. if v.nWeight >= 0 then
  234. nAllWeight = nAllWeight + v.nLayers
  235. table.insert(tWeight, {nWeight = nAllWeight, nFenShu = v.nWeight})
  236. else
  237. -- if nOperate ~= BUSONEHEROYUANZHENGBAOHU then
  238. nAllWeight = nAllWeight + v.nLayers
  239. table.insert(tWeight, {nWeight = nAllWeight, nFenShu = v.nWeight})
  240. -- end
  241. end
  242. end
  243. local nRandWeight = math.random(1, nAllWeight)
  244. local nFenShu = nil
  245. for _, v in ipairs(tWeight) do
  246. if v.nWeight >= nRandWeight then
  247. nFenShu = v.nFenShu
  248. break
  249. end
  250. end
  251. local nAddFenShu = nFenShu
  252. if 0 > nFenShu then
  253. nAddFenShu = nOperate == BUSONEHEROYUANZHENGBAOHU and 0 or nFenShu
  254. end
  255. local bCanNext = true
  256. if nAddFenShu < 0 then
  257. bCanNext = false
  258. end
  259. BusOneHeroYuanZheng_SetCanDo(human, bCanNext)
  260. local nNowLayers = BusOneHeroYuanZheng_GetLayers(human)
  261. local nMaxLayers = BusOneHeroYuanZheng_GetMaxLayers()
  262. local nNextLayer = nNowLayers + nAddFenShu
  263. if nNextLayer > 0 then
  264. nNextLayer = nNextLayer > nMaxLayers and nMaxLayers or nNextLayer
  265. BusOneHeroYuanZheng_SetStatus(human, nNowLayers, CommonDefine.COMMON_PRIZE_STATE_NOGET)
  266. BusOneHeroYuanZheng_SetLayers(human, nNextLayer)
  267. BusOneHeroYuanZheng_SetStatus(human, nNextLayer, CommonDefine.COMMON_PRIZE_STATE_CANGET)
  268. if nNextLayer == nMaxLayers then
  269. BusOneHeroYuanZheng_SetCanDo(human, false)
  270. end
  271. else
  272. nNextLayer = nNextLayer < 0 and 0 or nNextLayer
  273. BusOneHeroYuanZheng_SetStatus(human, nNowLayers, CommonDefine.COMMON_PRIZE_STATE_NOGET)
  274. BusOneHeroYuanZheng_SetLayers(human, nNextLayer)
  275. BusOneHeroYuanZheng_SetStatus(human, nNextLayer, CommonDefine.COMMON_PRIZE_STATE_CANGET)
  276. end
  277. local tMsgData = Msg.gc.GC_NEW_BUSONEACT_HERO_DO
  278. tMsgData.nOperate = nOperate
  279. tMsgData.bCanDo = BusOneHeroYuanZheng_GetCanDo(human) == true and 1 or 0
  280. tMsgData.nFenShu = nFenShu
  281. tMsgData.nLayers = nNextLayer
  282. tMsgData.nRound = BusOneHeroYuanZheng_GetRound(human)
  283. tMsgData.tLayersInfo[0] = 0
  284. local tConf = BusOneHeroYuanZheng_GetHeroConf()
  285. for _, v in ipairs(tConf) do
  286. if v.nRound == tMsgData.nRound then
  287. local nLayers = v.nLayers
  288. tMsgData.tLayersInfo[0] = tMsgData.tLayersInfo[0] + 1
  289. local tData = tMsgData.tLayersInfo[tMsgData.tLayersInfo[0]]
  290. tData.nLayers = nLayers
  291. tData.nStatus = BusOneHeroYuanZheng_GetStatus(human, nLayers)
  292. tData.tPrize[0] = #v.tPrize
  293. for i, tItem in ipairs(v.tPrize) do
  294. local nGoodsID = tItem[1]
  295. local nGoodsNum = tItem[2]
  296. Grid.makeItem(tData.tPrize[i], nGoodsID, nGoodsNum)
  297. end
  298. end
  299. end
  300. if nDelNum > 0 then
  301. BagLogic.delItem(human, BUSONEHEROYUANZHENGDGOODID, nDelNum, "BusOneHeroYuanZheng")
  302. end
  303. BusOneActivityYuanZheng.BusOneYuanZheng_NumChange(human, 1)
  304. BusOneActivityTask.BusOneTask_SendRed(human)
  305. Msg.send(tMsgData, human.fd)
  306. end
  307. -- 请求领取奖励
  308. function BusOneHeroYuanZheng_Get(human, nLayers, nIndex)
  309. local nRound = BusOneHeroYuanZheng_GetRound(human)
  310. local nNowLayers = BusOneHeroYuanZheng_GetLayers(human)
  311. if nLayers ~= nNowLayers then
  312. print("[BusOneHeroYuanZheng_Get] 请求领取奖励的层数和记录的不一致 nLayers = "..nLayers.." nNowLayers = "..nNowLayers)
  313. return
  314. end
  315. local tItem = {}
  316. local tConf = BusOneHeroYuanZheng_GetHeroConf()
  317. for _, v in ipairs(tConf) do
  318. if v.nRound == nRound and v.nLayers == nNowLayers then
  319. BusOneHeroYuanZheng_SetStatus(human, nNowLayers, CommonDefine.COMMON_PRIZE_STATE_GET)
  320. for i, value in ipairs(v.tPrize) do
  321. if i == nIndex then
  322. table.insert(tItem, {value[1], value[2]})
  323. break
  324. end
  325. end
  326. end
  327. end
  328. if nil ~= _G.next(tItem) then
  329. BagLogic.addItemList(human, tItem, "BusOneHeroYuanZheng")
  330. local nNextRound = nRound + 1
  331. local nMaxRound = BusOneHeroYuanZheng_GetMaxRound()
  332. local nMaxLayers = BusOneHeroYuanZheng_GetMaxLayers()
  333. print("[BusOneHeroYuanZheng_Get] 当前轮数 nRound = "..nRound.." nNextRound = "..nNextRound.." nMaxRound = "..nMaxRound)
  334. if nNextRound <= nMaxRound and nNowLayers == nMaxLayers then
  335. print("[BusOneHeroYuanZheng_Get] 进入下一轮")
  336. BusOneHeroYuanZheng_EnterRound(human, nNextRound)
  337. else
  338. print("[BusOneHeroYuanZheng_Get] 重置为第一轮")
  339. BusOneHeroYuanZheng_EnterRound(human, 1)
  340. end
  341. BusOneHeroYuanZheng_Query(human)
  342. YunYingLogic.sendBanner(human)
  343. BusOneActivityTask.BusOneTask_SendRed(human)
  344. else
  345. print("[BusOneHeroYuanZheng_Get] 不存在对应的奖励 nLayers = "..nLayers.." nIndex = "..nIndex)
  346. end
  347. end
  348. -----------------------------------外部调用-----------------------------
  349. function isOpen(human, YYInfo, funcConfig)
  350. print("[BusOneHeroYuanZheng_isOpen] 进入判断")
  351. local state, endTime, startTime = AbsActLogic.isStarted(human, funcConfig and funcConfig.funcID or BUSONEHEROYUANZHENGABSID)
  352. if not state then
  353. print("[BusOneHeroYuanZheng_isOpen] 当前活动未开启")
  354. return
  355. end
  356. print("[BusOneHeroYuanZheng_isOpen] 进入判断 endTime = "..endTime.." startTime = "..startTime)
  357. return true, endTime, startTime
  358. end
  359. function isActive(human, YYInfo, funcConfig)
  360. return not isOpen(human, YYInfo, funcConfig)
  361. end
  362. function isRed(human, YYInfo, absActConfig)
  363. BusOneHeroYuanZheng_CheckAndResetDB(human)
  364. local tConf = BusOneHeroYuanZheng_GetHeroConf()
  365. local nRound = BusOneHeroYuanZheng_GetRound(human)
  366. for _, v in ipairs(tConf) do
  367. if v.nRound == nRound then
  368. local nStatus = BusOneHeroYuanZheng_GetStatus(human, v.nLayers)
  369. if nStatus == CommonDefine.COMMON_PRIZE_STATE_CANGET then
  370. return true
  371. end
  372. end
  373. end
  374. return false
  375. end