Commit 36204e3cf3a6005f1d45c66caf74292ce325888a
1 parent
21419c7b
贩卖逻辑
Showing
6 changed files
with
100 additions
and
20 deletions
Show diff stats
src/actions/DinerAction.lua
... | ... | @@ -14,19 +14,62 @@ function _M.addSellRpc( agent, data ) |
14 | 14 | if math.illegalNum(slot, 1, role.dinerData:getMaxSlots()) then |
15 | 15 | return |
16 | 16 | end |
17 | - if slot > role.dinerData:getMaxSlots() then | |
18 | - return | |
19 | - end | |
17 | + slot = tostring(slot) | |
18 | + | |
20 | 19 | local dish = msg.dish |
21 | 20 | local dishSet = csvdb["diner_dishCsv"][dish] |
22 | 21 | if not dishSet then |
23 | 22 | return |
24 | 23 | end |
24 | + local dishLevel = role.dinerData:getProperty("dishTree"):getv(dish, 0) | |
25 | + if dishLevel == 0 then | |
26 | + return | |
27 | + end | |
28 | + local dishData = dishSet[dishLevel] | |
29 | + if not dishData then | |
30 | + return | |
31 | + end | |
32 | + | |
33 | + local calSell = role.dinerData:updateSell(slot, true) or { | |
34 | + deltaCount = 0, | |
35 | + deltaTime = 0, | |
36 | + lastCount = 0, | |
37 | + } | |
25 | 38 | local count = msg.count |
26 | - if math.illegalNum(count, 1, role.dinerData:getMaxDishs()) then | |
39 | + local maxDishCount = role.dinerData:getMaxDishs() | |
40 | + if math.illegalNum(count + calSell.lastCount, 1, maxDishCount) then | |
27 | 41 | return |
28 | 42 | end |
29 | 43 | |
44 | + local cost = dishData.material:toNumMap() | |
45 | + for _, n in pairs(cost) do | |
46 | + n = n * count | |
47 | + end | |
48 | + if not role:checkItemEnough(cost) then | |
49 | + return | |
50 | + end | |
51 | + | |
52 | + role:costItems(cost) | |
53 | + role.dinerData:updateSell(slot) | |
54 | + | |
55 | + local sells = json.decode(role.dinerData:getProperty("sells")) | |
56 | + if not sells[slot] then | |
57 | + sells[slot] = { | |
58 | + dish = dish, | |
59 | + level = dishLevel, | |
60 | + reward = "", | |
61 | + count = 0, | |
62 | + } | |
63 | + end | |
64 | + local sell = sells[slot] | |
65 | + sell.count = sell.count + count | |
66 | + sell.time = skynet.timex() - calSell.deltaTime | |
67 | + sell.hot = role.dinerData:getProperty("hot"):getv(sell.dish, 0) | |
68 | + | |
69 | + role.dinerData:updateProperty({field = "sells", value = json.encode(sells)}) | |
70 | + SendPacket(actionCodes.Diner_addSellRpc, "") | |
71 | + | |
72 | + return true | |
30 | 73 | end |
31 | 74 | |
32 | 75 | function _M.getSellRewardRpc( agent, data ) |
... | ... | @@ -54,7 +97,7 @@ function _M.levelUpRpc( agent, data ) |
54 | 97 | return |
55 | 98 | end |
56 | 99 | |
57 | - role:costItems(cost, {}) | |
100 | + role:costItems(cost) | |
58 | 101 | role.dinerData:updateProperty({field = "level", value = buildL:setv(index, curLevel + 1)}) |
59 | 102 | |
60 | 103 | SendPacket(actionCodes.Diner_levelUpRpc, '') | ... | ... |
src/actions/HangAction.lua
... | ... | @@ -289,7 +289,7 @@ function _M.quickRpc(agent , data) |
289 | 289 | if not costs[curCount] then return end |
290 | 290 | if costs[curCount] > 0 then |
291 | 291 | if not role:checkItemEnough({[ItemId.Diamond] = costs[curCount]}) then return end |
292 | - role:costItems({[ItemId.Diamond] = costs[curCount]}, {}) | |
292 | + role:costItems({[ItemId.Diamond] = costs[curCount]}) | |
293 | 293 | end |
294 | 294 | |
295 | 295 | role.dailyData:updateProperty({field = "hangQC", value = curCount}) | ... | ... |
src/actions/HeroAction.lua
... | ... | @@ -25,7 +25,7 @@ function _M.levelUpRpc( agent, data ) |
25 | 25 | local curData = csvdb["unit_expCsv"][hero:getProperty("level")] |
26 | 26 | local cost = {[ItemId.Exp] = curData.exp, [ItemId.Gold] = curData.gold} |
27 | 27 | if not role:checkItemEnough(cost) then return end |
28 | - role:costItems(cost, {}) | |
28 | + role:costItems(cost) | |
29 | 29 | hero:updateProperty({field = "level", delta = 1}) |
30 | 30 | |
31 | 31 | SendPacket(actionCodes.Hero_levelUpRpc, '') |
... | ... | @@ -43,7 +43,7 @@ function _M.breakRpc( agent, data ) |
43 | 43 | local curData = csvdb["unit_breakCsv"][hero:getProperty("breakL")] |
44 | 44 | local cost = {[ItemId.BreakCost] = curData.cost, [ItemId.Gold] = curData.gold} |
45 | 45 | if not role:checkItemEnough(cost) then return end |
46 | - role:costItems(cost, {}) | |
46 | + role:costItems(cost) | |
47 | 47 | hero:updateProperty({field = "breakL", delta = 1}) |
48 | 48 | |
49 | 49 | SendPacket(actionCodes.Hero_breakRpc, '') |
... | ... | @@ -62,7 +62,7 @@ function _M.wakeRpc(agent, data) |
62 | 62 | cost[ItemId.HeroFC[csvdb["unitCsv"][hero:getProperty("type")].rare]] = less[hero:getProperty("type")] |
63 | 63 | if not role:checkItemEnough(cost) then return end |
64 | 64 | end |
65 | - role:costItems(cost, {}) | |
65 | + role:costItems(cost) | |
66 | 66 | hero:updateProperty({field = "wakeL", delta = 1}) |
67 | 67 | |
68 | 68 | SendPacket(actionCodes.Hero_wakeRpc, '') |
... | ... | @@ -113,7 +113,7 @@ function _M.talentRpc(agent, data) |
113 | 113 | end |
114 | 114 | |
115 | 115 | if not role:checkItemEnough(cost) then return end |
116 | - role:costItems(cost, {}) | |
116 | + role:costItems(cost) | |
117 | 117 | talent = talent:incrv(index, 1) |
118 | 118 | |
119 | 119 | --是否进阶 |
... | ... | @@ -424,7 +424,7 @@ function _M.createHeroRpc(agent, data) |
424 | 424 | if hero:getProperty("type") == heroType then return end |
425 | 425 | end |
426 | 426 | |
427 | - role:costItems({[heroType] = cost}, {}) | |
427 | + role:costItems({[heroType] = cost}) | |
428 | 428 | role:award({[heroType + ItemStartId.Hero] = 1}, {}) |
429 | 429 | |
430 | 430 | SendPacket(actionCodes.Hero_createHeroRpc, "") | ... | ... |
src/actions/RoleAction.lua
... | ... | @@ -256,7 +256,7 @@ function _M.saleItemRpc(agent, data) |
256 | 256 | if itemData.sell_effect == "" then return end |
257 | 257 | local sellEffect = itemData.sell_effect:toArray(true, "=") |
258 | 258 | |
259 | - role:costItems({[itemId] = count}, {}) | |
259 | + role:costItems({[itemId] = count}) | |
260 | 260 | local reward = role:award({[sellEffect[1]] = sellEffect[2] * count}, {}) |
261 | 261 | |
262 | 262 | SendPacket(actionCodes.Role_saleItemRpc, MsgPack.pack({reward = reward})) |
... | ... | @@ -292,7 +292,7 @@ function _M.openItemRpc(agent, data) |
292 | 292 | end |
293 | 293 | end |
294 | 294 | end |
295 | - role:costItems({[itemId] = count}, {}) | |
295 | + role:costItems({[itemId] = count}) | |
296 | 296 | reward = role:award(reward, {}) |
297 | 297 | |
298 | 298 | SendPacket(actionCodes.Role_openItemRpc, MsgPack.pack({reward = reward})) | ... | ... |
src/models/Diner.lua
... | ... | @@ -6,10 +6,10 @@ end |
6 | 6 | |
7 | 7 | Diner.schema = { |
8 | 8 | buildL = {"string", ""}, -- 家具等级 1=1 2=1 3=1 |
9 | - order = {"string", ""}, -- 特殊订单 | |
10 | - slots = {"string", ""}, -- 贩卖位置 | |
9 | + order = {"string", "[]"}, -- 特殊订单 | |
10 | + sells = {"string", "[]"}, -- 贩卖位置 | |
11 | 11 | hot = {"string", ""}, -- 今日热门 |
12 | - dishTree = {"string", ""}, -- 料理天赋 | |
12 | + dishTree = {"string", "1=1 2=1 3=1"}, -- 料理天赋 | |
13 | 13 | skillTree = {"string", ""}, -- 支援天赋 |
14 | 14 | } |
15 | 15 | |
... | ... | @@ -76,13 +76,51 @@ function Diner:notifyUpdateProperty(field, newValue, oldValue) |
76 | 76 | SendPacket(actionCodes.Diner_updateProperty, MsgPack.pack(datas)) |
77 | 77 | end |
78 | 78 | |
79 | -function Diner:doSell(notify) | |
80 | - | |
79 | +function Diner:updateSell(slot, calOnly) | |
80 | + local sells = json.decode(self:getProperty("sells")) | |
81 | + local sell = sells[slot] | |
82 | + if not sell or sell.count <= 0 then | |
83 | + return | |
84 | + end | |
85 | + local dishData = csvdb["diner_dishCsv"][sell.dish][sell.level] | |
86 | + | |
87 | + local deltaTime = 0 | |
88 | + local deltaCount = 0 | |
89 | + local timePass = skynet.timex() - sell.time | |
90 | + local sellTime = dishData.sell_time | |
91 | + if self:getProperty("hot"):getv(sell.dish, 0) > 0 then | |
92 | + sellTime = sellTime * 1.5 | |
93 | + end | |
94 | + deltaCount = math.floor(timePass / sellTime) | |
95 | + if deltaCount < sell.count then | |
96 | + deltaTime = math.floor(timePass - sellTime * deltaCount) | |
97 | + end | |
98 | + deltaCount = math.min(deltaCount, sell.count) | |
99 | + local lastCount = sell.count - deltaCount | |
100 | + | |
101 | + if not calOnly then | |
102 | + sell.time = skynet.timex() - deltaTime | |
103 | + sell.count = lastCount | |
104 | + sell.level = self:getProperty("dishTree"):getv(sell.dish, 1) | |
105 | + | |
106 | + self:setProperty("sells", json.encode(sells)) | |
107 | + end | |
108 | + return { | |
109 | + deltaCount = deltaCount, | |
110 | + deltaTime = deltaTime, | |
111 | + lastCount = lastCount, | |
112 | + } | |
81 | 113 | end |
82 | 114 | |
83 | 115 | function Diner:getMaxSlots() |
84 | 116 | local slotCount = globalCsv.diner_sell_slots_init |
85 | 117 | |
118 | + local hangPass = self.owner:getProperty("hangPass") | |
119 | + for _, carbonId in ipairs(globalCsv.diner_sell_slots_unlock) do | |
120 | + if hangPass[carbonId] then | |
121 | + slotCount = slotCount + 1 | |
122 | + end | |
123 | + end | |
86 | 124 | |
87 | 125 | return slotCount |
88 | 126 | end | ... | ... |
src/models/RolePlugin.lua
... | ... | @@ -191,8 +191,8 @@ function RolePlugin.bind(Role) |
191 | 191 | end |
192 | 192 | |
193 | 193 | function Role:costItems(itemCountT, params) |
194 | + local pms = clone(params or {}) | |
194 | 195 | if itemCountT[ItemId.Diamond] then --优先扣除钻石 |
195 | - local pms = clone(params or {}) | |
196 | 196 | pms.count = itemCountT[ItemId.Diamond] |
197 | 197 | if not self:costDiamond(pms) then |
198 | 198 | return |
... | ... | @@ -200,7 +200,6 @@ function RolePlugin.bind(Role) |
200 | 200 | itemCountT[ItemId.Diamond] = nil |
201 | 201 | end |
202 | 202 | for itemId, count in pairs(itemCountT) do |
203 | - local pms = clone(params or {}) | |
204 | 203 | pms.itemId = itemId |
205 | 204 | pms.count = - count |
206 | 205 | self:addItem(pms) | ... | ... |