CycleMakeFood.lua 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  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. local function isRepeatRecord(human, actId, nowFoodIdx)
  51. local actData = getActData(human, actId)
  52. if not actData then
  53. return false
  54. end
  55. for _, recordInfo in ipairs(actData.fiveStarFoodArray or {}) do
  56. if recordInfo[1] == nowFoodIdx then
  57. return true
  58. end
  59. end
  60. return false
  61. end
  62. function isOpen(human, YYInfo, funcConfig)
  63. local state, endTime, startTime = CycleActivityLogic.isStarted(human, funcConfig.funcID)
  64. if not state then return end
  65. return true, endTime, startTime
  66. end
  67. function isActive(human, YYInfo, funcConfig)
  68. return not isOpen(human, YYInfo, funcConfig)
  69. end
  70. function Query(human, actId)
  71. local actData = getActData(human, actId)
  72. if not actData then
  73. return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
  74. end
  75. local nowFoodIdx = actData.nowFoodIdx
  76. if not nowFoodIdx then
  77. nowFoodIdx = randConfig()
  78. updateActData(human, actId, nowFoodIdx)
  79. end
  80. local msgRet = Msg.gc.GC_CYCLMAKEFOOD_QUERY
  81. local foodCfg = makeFoodCfg[nowFoodIdx]
  82. msgRet.tagetFoodName = foodCfg.targetFoodName
  83. Grid.makeItem(msgRet.itemInfo, actVariableCfg.va1[1], actVariableCfg.va1[2])
  84. local foodList = msgRet.foodList
  85. for k,v in ipairs(foodCfg.iconList) do
  86. foodList[0] = k
  87. foodList[k] = v
  88. end
  89. Msg.send(msgRet, human.fd)
  90. end
  91. function MakeFood(human, actId, foodStr)
  92. local actData = getActData(human, actId)
  93. if not actData then
  94. return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
  95. end
  96. local selectFoodVec = Util.split(foodStr, ",", true)
  97. local selectFoodCnt = #selectFoodVec
  98. if selectFoodCnt <= 0 then
  99. return Broadcast.sendErr(human, Lang.MUST_SELECT_ONE)
  100. end
  101. -- 最多选择5个材料
  102. if selectFoodCnt > 5 then
  103. return Broadcast.sendErr(human, Lang.NUM_EXCEED)
  104. end
  105. local rightNum = 0
  106. for _, val in ipairs(selectFoodVec) do
  107. local num = calcSameValCnt(selectFoodVec, val)
  108. if num >= 2 then
  109. return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
  110. end
  111. -- 索引1~5的食材是正确的
  112. if val >= 1 and val <= 5 then
  113. rightNum = rightNum + 1
  114. end
  115. end
  116. -- 消耗道具检测
  117. local itemId, itemCnt = actVariableCfg.va1[1], actVariableCfg.va1[2]
  118. if BagLogic.getItemCnt(human, itemId) < itemCnt then
  119. return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
  120. end
  121. BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
  122. local msgRet = Msg.gc.GC_CYCLMAKEFOOD_MAKEFOOD
  123. msgRet.stars = rightNum
  124. local itemArray = msgRet.itemArray
  125. -- 发放奖励
  126. -- local len = 0
  127. -- local rewardList = {}
  128. local nowFoodIdx = actData.nowFoodIdx
  129. local foodCfg = makeFoodCfg[nowFoodIdx]
  130. -- 五星级食物制作成功则保存记录
  131. if rightNum >= 5 and not isRepeatRecord(human, actId, nowFoodIdx) then
  132. update5StarFoodArray(human, actId, nowFoodIdx, foodStr)
  133. end
  134. rightNum = rightNum + 1 -- 奖励数组中,index为1的是0星奖励, index为6的是5星奖励
  135. itemArray[0] = 0
  136. for idx, itemCfg in ipairs(foodCfg.reward[rightNum] or {}) do
  137. -- len = len + 1
  138. -- rewardList[len] = { itemCfg[1], itemCfg[2] }
  139. BagLogic.addItem(human, itemCfg[1], itemCfg[2], LOGTAG)
  140. itemArray[0] = idx
  141. Grid.makeItem(itemArray[idx], itemCfg[1], itemCfg[2])
  142. end
  143. -- BagLogic.addItemList(human, rewardList, LOGTAG)
  144. -- 通知客户端结果
  145. Msg.send(msgRet, human.fd)
  146. -- 随机出下一轮目标食物
  147. local nextFoodIdx = randConfig()
  148. updateActData(human, actId, nextFoodIdx)
  149. -- 推送最新数据给客户端
  150. -- Query(human, actId)
  151. end
  152. function Get5StarFoodArray(human, actId)
  153. local actData = getActData(human, actId)
  154. if not actData then
  155. return Broadcast.sendErr(human, Lang.YUNYING_ERR_TIME)
  156. end
  157. local msgRet = Msg.gc.GC_CYCLMAKEFOOD_GET_5STARfOODLIST
  158. local foodList = msgRet.foodList
  159. foodList[0] = 0
  160. msgRet.isEnd = 0
  161. local fiveStarFoodArray = actData.fiveStarFoodArray
  162. if not fiveStarFoodArray then
  163. msgRet.isEnd = 1
  164. return Msg.send(msgRet, human.fd)
  165. end
  166. local len = 0
  167. local msgMaxCnt = 50
  168. local nowFoodCnt = #fiveStarFoodArray
  169. for _, foodInfo in ipairs(fiveStarFoodArray) do
  170. len = len + 1
  171. local foodIdx = foodInfo[1]
  172. local foodCfg = makeFoodCfg[foodIdx]
  173. foodList[len].tagetFoodName = foodCfg.targetFoodName
  174. local selectFoodVec = Util.split(foodInfo[2], ",", true)
  175. for l, iconIdx in ipairs(selectFoodVec) do
  176. foodList[len].foodArray[0] = l
  177. foodList[len].foodArray[l] = foodCfg.iconList[iconIdx]
  178. end
  179. if len >= msgMaxCnt then
  180. nowFoodCnt = nowFoodCnt - len
  181. if nowFoodCnt <= 0 then
  182. msgRet.isEnd = 1
  183. end
  184. foodList[0] = len
  185. Msg.send(msgRet, human.fd)
  186. len = 0
  187. end
  188. end
  189. if len > 0 then
  190. msgRet.isEnd = 1
  191. foodList[0] = len
  192. Msg.send(msgRet, human.fd)
  193. end
  194. end