CycleMakeFood.lua 7.6 KB

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