CycleMakeFood.lua 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237
  1. -- 新商业化活动2—— 烹饪嘉年华
  2. -- 玩法: 从配置中随机一条配置,让玩家消耗特定道具后, 选择材料进行合成食物, 只有索引未1~5的材料才是正确的,玩家选对多少个材料就得到几星奖励
  3. --db
  4. --[=[
  5. human.db.absAct[id] = {
  6. nowFoodIdx = nil,
  7. fiveStarFoodArray = nil, { {配置idx, 玩家选择的食材(字符串)} } -- 玩家合成的五星级食物列表,活动结束也不删除
  8. }
  9. ]=]--
  10. local Msg = require("core.Msg")
  11. local Grid = require("bag.Grid")
  12. local Util = require("common.Util")
  13. local Lang = require("common.Lang")
  14. local BagLogic = require("bag.BagLogic")
  15. local Broadcast = require("broadcast.Broadcast")
  16. local CycleActivityLogic = require("yunying.CycleActivity")
  17. local actVariableCfg = require("excel.commercializationActivity").variable[4]
  18. local makeFoodCfg = require("excel.commercializationActivity").makeFood
  19. -- 本活动日志标识
  20. local LOGTAG = "cycleAct_makeFood"
  21. local function getActData(human, actId)
  22. return human.db.absAct[actId]
  23. end
  24. local function updateActData(human, actId, newIdx)
  25. local actData = getActData(human, actId)
  26. actData.nowFoodIdx = newIdx
  27. end
  28. local function update5StarFoodArray(human, actId, foodIdx, foodStr)
  29. local actData = getActData(human, actId)
  30. actData.fiveStarFoodArray = actData.fiveStarFoodArray or {}
  31. actData.fiveStarFoodArray[#actData.fiveStarFoodArray+1] = {foodIdx, foodStr}
  32. end
  33. -- 随机出一条配置
  34. local function randConfig()
  35. return math.random(1, #makeFoodCfg)
  36. end
  37. -- 计算一个table中有多少个值与给定值相同
  38. local function calcSameValCnt(t, val)
  39. if not t or not val then
  40. return 0
  41. end
  42. local cnt = 0
  43. for _, v in pairs(t) do
  44. if v == val then
  45. cnt = cnt + 1
  46. end
  47. end
  48. return cnt
  49. end
  50. function isOpen(human, YYInfo, funcConfig)
  51. local state, endTime, startTime = CycleActivityLogic.isStarted(human, funcConfig.funcID)
  52. if not state then return end
  53. return true, endTime, startTime
  54. end
  55. function isActive(human, YYInfo, funcConfig)
  56. return not isOpen(human, YYInfo, funcConfig)
  57. end
  58. function Query(human, actId)
  59. local actData = getActData(human, actId)
  60. if not actData then
  61. return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
  62. end
  63. local nowFoodIdx = actData.nowFoodIdx
  64. if not nowFoodIdx then
  65. nowFoodIdx = randConfig()
  66. updateActData(human, actId, nowFoodIdx)
  67. end
  68. local msgRet = Msg.gc.GC_CYCLMAKEFOOD_QUERY
  69. local foodCfg = makeFoodCfg[nowFoodIdx]
  70. msgRet.tagetFoodName = foodCfg.targetFoodName
  71. Grid.makeItem(msgRet.itemInfo, actVariableCfg.va1[1], actVariableCfg.va1[2])
  72. local foodList = msgRet.foodList
  73. for k,v in ipairs(foodCfg.iconList) do
  74. foodList[0] = k
  75. foodList[k] = v
  76. end
  77. Msg.send(msgRet, human.fd)
  78. end
  79. function MakeFood(human, actId, foodStr)
  80. local actData = getActData(human, actId)
  81. if not actData then
  82. return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
  83. end
  84. local selectFoodVec = Util.split(foodStr, ",", true)
  85. local selectFoodCnt = #selectFoodVec
  86. if selectFoodCnt <= 0 then
  87. return Broadcast.sendErr(human, Lang.MUST_SELECT_ONE)
  88. end
  89. -- 最多选择5个材料
  90. if selectFoodCnt > 5 then
  91. return Broadcast.sendErr(human, Lang.NUM_EXCEED)
  92. end
  93. local rightNum = 0
  94. for _, val in ipairs(selectFoodVec) do
  95. local num = calcSameValCnt(selectFoodVec, val)
  96. if num >= 2 then
  97. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  98. end
  99. -- 索引1~5的食材是正确的
  100. if val >= 1 and val <= 5 then
  101. rightNum = rightNum + 1
  102. end
  103. end
  104. -- 消耗道具检测
  105. local itemId, itemCnt = actVariableCfg.va1[1], actVariableCfg.va1[2]
  106. if BagLogic.getItemCnt(human, itemId) < itemCnt then
  107. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  108. end
  109. BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
  110. local msgRet = Msg.gc.GC_CYCLMAKEFOOD_MAKEFOOD
  111. msgRet.stars = rightNum
  112. local itemArray = msgRet.itemArray
  113. -- 发放奖励
  114. -- local len = 0
  115. -- local rewardList = {}
  116. local nowFoodIdx = actData.nowFoodIdx
  117. local foodCfg = makeFoodCfg[nowFoodIdx]
  118. -- 五星级食物制作成功则保存记录
  119. if rightNum >= 5 then
  120. update5StarFoodArray(human, actId, nowFoodIdx, foodStr)
  121. end
  122. rightNum = rightNum + 1 -- 奖励数组中,index为1的是0星奖励, index为6的是5星奖励
  123. itemArray[0] = 0
  124. for idx, itemCfg in ipairs(foodCfg.reward[rightNum] or {}) do
  125. -- len = len + 1
  126. -- rewardList[len] = { itemCfg[1], itemCfg[2] }
  127. BagLogic.addItem(human, itemCfg[1], itemCfg[2], LOGTAG)
  128. itemArray[0] = idx
  129. Grid.makeItem(itemArray[idx], itemCfg[1], itemCfg[2])
  130. end
  131. -- BagLogic.addItemList(human, rewardList, LOGTAG)
  132. -- 通知客户端结果
  133. Msg.send(msgRet, human.fd)
  134. -- 随机出下一轮目标食物
  135. local nextFoodIdx = randConfig()
  136. updateActData(human, actId, nextFoodIdx)
  137. -- 推送最新数据给客户端
  138. -- Query(human, actId)
  139. end
  140. function Get5StarFoodArray(human, actId)
  141. local actData = getActData(human, actId)
  142. if not actData then
  143. return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
  144. end
  145. local msgRet = Msg.gc.GC_CYCLMAKEFOOD_GET_5STARfOODLIST
  146. local foodList = msgRet.foodList
  147. foodList[0] = 0
  148. msgRet.isEnd = 0
  149. local fiveStarFoodArray = actData.fiveStarFoodArray
  150. if not fiveStarFoodArray then
  151. msgRet.isEnd = 1
  152. return Msg.send(msgRet, human.fd)
  153. end
  154. local len = 0
  155. local msgMaxCnt = 50
  156. local nowFoodCnt = #fiveStarFoodArray
  157. for _, foodInfo in ipairs(fiveStarFoodArray) do
  158. len = len + 1
  159. local foodIdx = foodInfo[1]
  160. local foodCfg = makeFoodCfg[foodIdx]
  161. foodList[len].tagetFoodName = foodCfg.targetFoodName
  162. local selectFoodVec = Util.split(foodInfo[2], ",", true)
  163. for l, iconIdx in ipairs(selectFoodVec) do
  164. foodList[len].foodArray[0] = l
  165. foodList[len].foodArray[l] = foodCfg.iconList[iconIdx]
  166. end
  167. if len >= msgMaxCnt then
  168. nowFoodCnt = nowFoodCnt - len
  169. if nowFoodCnt <= 0 then
  170. msgRet.isEnd = 1
  171. end
  172. foodList[0] = len
  173. Msg.send(msgRet, human.fd)
  174. len = 0
  175. end
  176. end
  177. if len > 0 then
  178. msgRet.isEnd = 1
  179. foodList[0] = len
  180. Msg.send(msgRet, human.fd)
  181. end
  182. end