Commit ed322ed236b8d4e4a901889198835e653a8ce539
1 parent
3847ba2d
餐厅 顾客 系统
Showing
3 changed files
with
220 additions
and
15 deletions
Show diff stats
src/ProtocolCode.lua
src/actions/DinerAction.lua
... | ... | @@ -74,6 +74,37 @@ function _M.addSellRpc( agent, data ) |
74 | 74 | sells[slot].level = dishLevel |
75 | 75 | sells[slot].count = count |
76 | 76 | sells[slot].time = skynet.timex() - calSell.deltaTime |
77 | + | |
78 | + -- 检查解锁的顾客 | |
79 | + local had = {} | |
80 | + for _, sell in pairs(sells) do | |
81 | + if sell.dish then | |
82 | + had[sell.dish] = sell.level | |
83 | + end | |
84 | + end | |
85 | + | |
86 | + local customer = self.dinerData:getProperty("customer") | |
87 | + local change = false | |
88 | + for cId, cData in pairs(csvdb["diner_customerCsv"]) do | |
89 | + if not customer[cId] then | |
90 | + local unlock = true | |
91 | + for needId, lv in pairs(cData.unlock:toNumMap()) do | |
92 | + if not had[needId] or had[needId] < lv then | |
93 | + unlock = false | |
94 | + break | |
95 | + end | |
96 | + end | |
97 | + if unlock then | |
98 | + change = true | |
99 | + customer[cId] = 0 | |
100 | + end | |
101 | + end | |
102 | + end | |
103 | + | |
104 | + if change then | |
105 | + role.dinerData:updateProperty({field = "customer", value = customer}) | |
106 | + end | |
107 | + | |
77 | 108 | role.dinerData:updateProperty({field = "sells", value = json.encode(sells)}) |
78 | 109 | SendPacket(actionCodes.Diner_addSellRpc, "") |
79 | 110 | return true |
... | ... | @@ -713,5 +744,94 @@ function _M.rankRpc(agent , data) |
713 | 744 | return true |
714 | 745 | end |
715 | 746 | |
747 | +function _M.entrustRpc(agent , data) | |
748 | + local role = agent.role | |
749 | + local msg = MsgPack.unpack(data) | |
750 | + | |
751 | + local ctype = msg.ctype | |
752 | + | |
753 | + local entrust = role.dinerData:getProperty("entrust") | |
754 | + if not entrust[1] then return end | |
755 | + | |
756 | + local reward | |
757 | + if ctype == 1 then -- 完成 | |
758 | + local curData = csvdb["diner_missionCsv"][entrust[1]] | |
759 | + if not curData then return end | |
760 | + | |
761 | + if curData.type == 1 then | |
762 | + local cost = curData.condition:toNumMap() | |
763 | + if not role:checkItemEnough(cost) then return end | |
764 | + role:costItems(cost) | |
765 | + elseif curData.type == 2 then | |
766 | + -- todo 数据校验 | |
767 | + else | |
768 | + return | |
769 | + end | |
770 | + | |
771 | + reward = role:award(curData.reward) | |
772 | + elseif ctype == 2 then -- 放弃 | |
773 | + table.remove(entrust, 1) | |
774 | + else | |
775 | + return | |
776 | + end | |
777 | + role.dinerData:updateProperty({field = "entrust", value = entrust}) | |
778 | + | |
779 | + SendPacket(actionCodes.Diner_entrustRpc, MsgPack.pack({reward = reward})) | |
780 | + return true | |
781 | +end | |
782 | + | |
783 | +function _M.collectRpc(agent , data) | |
784 | + local role = agent.role | |
785 | + local msg = MsgPack.unpack(data) | |
786 | + | |
787 | + local id = msg.id | |
788 | + if not id or not csvdb["diner_customerCsv"][id] then return end | |
789 | + local customer = role.dinerData:getProperty("customer") | |
790 | + if customer[id] ~= 0 then | |
791 | + return | |
792 | + end | |
793 | + | |
794 | + -- 完成前更新一波 后面 加成可能不一样 | |
795 | + local sells = json.decode(role.dinerData:getProperty("sells")) | |
796 | + for slot, _ in pairs(sells) do | |
797 | + role.dinerData:updateSell(slot) | |
798 | + end | |
799 | + | |
800 | + customer[id] = 1 | |
801 | + role.dinerData:updateProperty({field = "customer", value = customer}) -- 解锁了 | |
802 | + | |
803 | + SendPacket(actionCodes.Diner_collectRpc, '') | |
804 | + return true | |
805 | +end | |
806 | + | |
807 | +function _M.comboRewardRpc(agent , data) | |
808 | + local role = agent.role | |
809 | + local msg = MsgPack.unpack(data) | |
810 | + | |
811 | + local id = msg.id | |
812 | + | |
813 | + local comboData = csvdb["diner_customer_comboCsv"][id] | |
814 | + if not id or not comboData then return end | |
815 | + local comboStatus = role.dinerData:getProperty("comboStatus") | |
816 | + if comboStatus[id] == -1 then return end | |
817 | + | |
818 | + local customer = role.dinerData:getProperty("customer") | |
819 | + | |
820 | + for _, nId in ipairs(comboData.customer:toArray(true, "=")) do | |
821 | + if customer[nId] ~= 1 then | |
822 | + return | |
823 | + end | |
824 | + end | |
825 | + | |
826 | + comboStatus[id] = 1 | |
827 | + role:award(comboData.reward) | |
828 | + | |
829 | + role.dinerData:updateProperty({field = "comboStatus", value = comboStatus}) -- 解锁了 | |
830 | + | |
831 | + SendPacket(actionCodes.Diner_comboRewardRpc, '') | |
832 | + return true | |
833 | +end | |
834 | + | |
835 | + | |
716 | 836 | |
717 | 837 | return _M |
718 | 838 | \ No newline at end of file | ... | ... |
src/models/Diner.lua
... | ... | @@ -14,6 +14,10 @@ Diner.schema = { |
14 | 14 | expedite = {"number",1}, --每日加速次数 |
15 | 15 | gfood = {"table", {}}, -- 愿望食材 {{id = 123, st = 1232144},} |
16 | 16 | task = {"table", {}}, -- 任务刷新 {et = 消失时间 id = 任务id, refuse = 0} |
17 | + entrustB = {"table", {}}, -- 委托完成过的记录 {id = 1} | |
18 | + entrust = {"table", {}}, -- 委托 {id, id, id} | |
19 | + customer = {"table", {}}, -- 解锁的顾客 {id = 1} -- 1 (已解锁) 0(达成条件 可解锁 服务器用) | |
20 | + comboStatus = {"table", {}}, -- 组合领取奖励状态 {id = -1} --有表示已经领取奖励 | |
17 | 21 | } |
18 | 22 | |
19 | 23 | function Diner:rankResetData(notify) |
... | ... | @@ -21,9 +25,55 @@ function Diner:rankResetData(notify) |
21 | 25 | end |
22 | 26 | |
23 | 27 | function Diner:refreshDailyData(notify) |
28 | + | |
29 | + -- 委托 | |
30 | + local entrust = self:getProperty("entrust") | |
31 | + local hangPass = self.owner:getProperty("hangPass") | |
32 | + local entrustB = self:getProperty("entrustB") | |
33 | + local had = {} | |
34 | + local pool = {} | |
35 | + local change = false | |
36 | + for i = 1, 3 do | |
37 | + if not entrust[i] then | |
38 | + if not next(pool) then | |
39 | + for id, data in pairs(csvdb["diner_missionCsv"]) do | |
40 | + local show = true | |
41 | + if data.show ~= "" then | |
42 | + -- 不填=默认刷出,1=达成前置任务,2=通关关卡 | |
43 | + local showC = data.show:toArray(true, "=") | |
44 | + if showC[1] == 1 then | |
45 | + if not hangPass[showC[2]] then | |
46 | + show = false | |
47 | + end | |
48 | + elseif showC[1] == 2 then | |
49 | + if not entrustB[showC[2]] then | |
50 | + show = false | |
51 | + end | |
52 | + end | |
53 | + end | |
54 | + if show then | |
55 | + table.insert(pool, id) | |
56 | + end | |
57 | + end | |
58 | + end | |
59 | + | |
60 | + if #pool > 0 then | |
61 | + local idx = math.randomInt(1, #pool) | |
62 | + entrust[i] = pool[idx] | |
63 | + change = true | |
64 | + table.remove(pool, idx) | |
65 | + end | |
66 | + if not next(pool) then | |
67 | + break | |
68 | + end | |
69 | + else | |
70 | + had[entrust[i]] = 1 | |
71 | + end | |
72 | + end | |
73 | + self:updateProperty({field = "entrust", value = entrust, notNotify = not notify}) | |
74 | + | |
24 | 75 | -- 每日加速次数 |
25 | 76 | self:updateProperty({field = "expedite", value = 1, notNotify = not notify}) |
26 | - self:setProperty("expedite", 1) | |
27 | 77 | -- 特殊订单 |
28 | 78 | local orders = json.decode(self:getProperty("order")) |
29 | 79 | local hadTask = {} |
... | ... | @@ -118,32 +168,52 @@ function Diner:calSellReward(sell, delta, dishData) |
118 | 168 | if delta <= 0 then |
119 | 169 | return reward, popular |
120 | 170 | end |
171 | + local addReward = {} | |
121 | 172 | for key, value in pairs(dishData.item_normal:toNumMap()) do |
122 | - reward = reward:incrv(key, value * delta) | |
173 | + addReward[key] = (addReward[key] or 0) + value * delta | |
123 | 174 | end |
124 | - popular = popular + dishData.famous_normal * delta | |
125 | 175 | |
176 | + popular = dishData.famous_normal * delta | |
177 | + | |
178 | + local upValue = {} | |
179 | + -- 建筑加成 | |
126 | 180 | for buildType = 1, 6 do |
127 | 181 | local level = self:getProperty("buildL"):getv(buildType, 1) |
128 | 182 | local buildData = csvdb["diner_buildingCsv"][buildType][level] |
129 | 183 | if buildData.gold_up > 0 then |
130 | - local value = reward:getv(ItemId.Gold, 0) | |
131 | - value = math.floor(value * (100 + buildData.gold_up) / 100) | |
132 | - if value > 0 then | |
133 | - reward = reward:setv(ItemId.Gold, value) | |
134 | - end | |
184 | + upValue[ItemId.Gold] = (upValue[ItemId.Gold] or 0) + buildData.gold_up | |
135 | 185 | end |
136 | 186 | if buildData.item_up > 0 then |
137 | - local value = reward:getv(ItemId.DinerCoin, 0) | |
138 | - value = math.floor(value * (100 + buildData.item_up) / 100) | |
139 | - if value > 0 then | |
140 | - reward = reward:setv(ItemId.DinerCoin, value) | |
141 | - end | |
187 | + upValue[ItemId.DinerCoin] = (upValue[ItemId.DinerCoin] or 0) + buildData.gold_up | |
142 | 188 | end |
143 | 189 | if buildData and buildData.famous_up > 0 then |
144 | - popular = math.floor(popular * (100 + buildData.famous_up) / 100) | |
190 | + upValue[-1] = (upValue[-1] or 0) + buildData.famous_up | |
191 | + end | |
192 | + end | |
193 | + | |
194 | + -- 收集加成 | |
195 | + local collectCount = 0 | |
196 | + for _id , status in pairs(self:getProperty("customer")) do | |
197 | + if status == 1 then | |
198 | + collectCount = collectCount + 1 | |
145 | 199 | end |
146 | 200 | end |
201 | + local collectAdd = 0 | |
202 | + for _, collectData in ipairs(csvdb["diner_customer_collectCsv"]) do | |
203 | + if collectData.num <= collectCount then | |
204 | + collectAdd = collectData.bonus | |
205 | + else | |
206 | + break | |
207 | + end | |
208 | + end | |
209 | + upValue[-1] = (upValue[-1] or 0) + collectAdd | |
210 | + | |
211 | + for id, count in pairs(addReward) do | |
212 | + addReward[id] = math.floor(count * (1 + (upValue[id] or 0) / 100)) | |
213 | + reward = reward:incrv(id, addReward[id]) | |
214 | + end | |
215 | + popular = math.floor(popular * (1 + (upValue[-1] or 0) / 100)) | |
216 | + | |
147 | 217 | return reward, popular |
148 | 218 | end |
149 | 219 | |
... | ... | @@ -293,7 +363,20 @@ function Diner:getPopularRank() |
293 | 363 | end |
294 | 364 | |
295 | 365 | function Diner:data() |
296 | - local properties = {"buildL", "order", "sells", "dishTree", "skillTree","popular","expedite","gfood", "task"} | |
366 | + local properties = { | |
367 | + "buildL", | |
368 | + "order", | |
369 | + "sells", | |
370 | + "dishTree", | |
371 | + "skillTree", | |
372 | + "popular", | |
373 | + "expedite", | |
374 | + "gfood", | |
375 | + "task", | |
376 | + "entrust", | |
377 | + "customer", | |
378 | + "comboStatus", | |
379 | + } | |
297 | 380 | local data = self:getProperties(properties) |
298 | 381 | return data |
299 | 382 | end | ... | ... |