Commit 87cc3a35ee96d7a3b5301fbbd91376612fda8a80
1 parent
a6c04593
餐厅建筑升级逻辑
Showing
8 changed files
with
225 additions
and
32 deletions
Show diff stats
src/ProtocolCode.lua
... | ... | @@ -57,6 +57,11 @@ actionCodes = { |
57 | 57 | Hang_getRewardItemRpc = 258, |
58 | 58 | Hang_getRewardCoinRpc = 259, |
59 | 59 | |
60 | + Diner_updateProperty = 300, | |
61 | + Diner_addSellRpc = 301, | |
62 | + Diner_getSellRewardRpc = 302, | |
63 | + Diner_levelUpRpc = 303, | |
64 | + Diner_talentUpRpc = 304, | |
60 | 65 | } |
61 | 66 | |
62 | 67 | rpcResponseBegin = 10000 | ... | ... |
src/RedisKeys.lua
... | ... | @@ -0,0 +1,64 @@ |
1 | +local ipairs = ipairs | |
2 | +local table = table | |
3 | +local math = math | |
4 | +local redisproxy = redisproxy | |
5 | +local MsgPack = MsgPack | |
6 | + | |
7 | +local _M = {} | |
8 | + | |
9 | +function _M.addSellRpc( agent, data ) | |
10 | + local role = agent.role | |
11 | + local msg = MsgPack.unpack(data) | |
12 | + | |
13 | + local slot = msg.slot | |
14 | + if math.illegalNum(slot, 1, role.dinerData:getMaxSlots()) then | |
15 | + return | |
16 | + end | |
17 | + if slot > role.dinerData:getMaxSlots() then | |
18 | + return | |
19 | + end | |
20 | + local dish = msg.dish | |
21 | + local dishSet = csvdb["diner_dishCsv"][dish] | |
22 | + if not dishSet then | |
23 | + return | |
24 | + end | |
25 | + local count = msg.count | |
26 | + if math.illegalNum(count, 1, role.dinerData:getMaxDishs()) then | |
27 | + return | |
28 | + end | |
29 | + | |
30 | +end | |
31 | + | |
32 | +function _M.getSellRewardRpc( agent, data ) | |
33 | + | |
34 | +end | |
35 | + | |
36 | +function _M.levelUpRpc( agent, data ) | |
37 | + local role = agent.role | |
38 | + local msg = MsgPack.unpack(data) | |
39 | + | |
40 | + local index = msg.index | |
41 | + local buildingData = csvdb["diner_buildingCsv"][index] | |
42 | + if not buildingData then | |
43 | + return | |
44 | + end | |
45 | + | |
46 | + local buildL = role.dinerData:getProperty("buildL") | |
47 | + local curLevel = buildL:getv(index, 1) | |
48 | + if curLevel >= #buildingData then | |
49 | + return | |
50 | + end | |
51 | + | |
52 | + local cost = buildingData[curLevel].starCost:toNumMap() | |
53 | + if not role:checkItemEnough(cost) then | |
54 | + return | |
55 | + end | |
56 | + | |
57 | + role:costItems(cost, {}) | |
58 | + role.dinerData:updateProperty({field = "level", value = buildL:setv(index, curLevel + 1)}) | |
59 | + | |
60 | + SendPacket(actionCodes.Diner_levelUpRpc, '') | |
61 | + return true | |
62 | +end | |
63 | + | |
64 | +return _M | |
0 | 65 | \ No newline at end of file | ... | ... |
src/actions/RoleAction.lua
src/models/Daily.lua
... | ... | @@ -7,8 +7,9 @@ function Daily:ctor(properties) |
7 | 7 | end |
8 | 8 | |
9 | 9 | Daily.schema = { |
10 | - commentHero = {"string", ""}, --单日评论食灵记录 type=1 | |
11 | - hangQC ={"number", 0}, -- 挂机快速次数 | |
10 | + commentHero = {"string", ""}, -- 单日评论食灵记录 type=1 | |
11 | + hangQC = {"number", 0}, -- 挂机快速次数 | |
12 | + dinerQC = {"number", 0}, -- 贩卖加速次数 | |
12 | 13 | } |
13 | 14 | |
14 | 15 | function Daily:updateProperty(params) |
... | ... | @@ -41,8 +42,8 @@ end |
41 | 42 | |
42 | 43 | function Daily:data() |
43 | 44 | return { |
44 | - -- dailyTaskStatus = self:getProperty("dailyTaskStatus"), | |
45 | 45 | hangQC = self:getProperty("hangQC"), |
46 | + dinerQC = self:getProperty("dinerQC"), | |
46 | 47 | } |
47 | 48 | end |
48 | 49 | ... | ... |
... | ... | @@ -0,0 +1,108 @@ |
1 | +local Diner = class("Diner", require("shared.ModelBase")) | |
2 | + | |
3 | +function Diner:ctor(properties) | |
4 | + Diner.super.ctor(self, properties) | |
5 | +end | |
6 | + | |
7 | +Diner.schema = { | |
8 | + buildL = {"string", ""}, -- 家具等级 1=1 2=1 3=1 | |
9 | + order = {"string", ""}, -- 特殊订单 | |
10 | + slots = {"string", ""}, -- 贩卖位置 | |
11 | + hot = {"string", ""}, -- 今日热门 | |
12 | + dishTree = {"string", ""}, -- 料理天赋 | |
13 | + skillTree = {"string", ""}, -- 支援天赋 | |
14 | +} | |
15 | + | |
16 | +function Diner:refreshDailyData(notify) | |
17 | + -- 热门料理 | |
18 | + local hotPool = {} | |
19 | + local dishTree = self:getProperty("dishTree"):toNumMap() | |
20 | + local hangPass = self.owner:getProperty("hangPass") | |
21 | + | |
22 | + for index, dishData in ipairs(csvdb["diner_dishCsv"]) do | |
23 | + local check = true | |
24 | + local dish = dishData[1] | |
25 | + if dish.unlock_tree > 0 and not dishTree[dish.unlock_tree] then | |
26 | + check = false | |
27 | + end | |
28 | + if dish.unlock_carbon > 0 and not hangPass[dish.unlock_carbon] then | |
29 | + check = false | |
30 | + end | |
31 | + if check then | |
32 | + table.insert(hotPool, index) | |
33 | + end | |
34 | + end | |
35 | + if #hotPool >= 2 then | |
36 | + local hot = "" | |
37 | + for n = 1, 2 do | |
38 | + local index = math.random(1, #hotPool) | |
39 | + hot = hot:setv(hotPool[index], 1) | |
40 | + table.remove(hotPool, index) | |
41 | + end | |
42 | + self:updateProperty({field = "hot", value = hot, notNotify = not notify}) | |
43 | + self:setProperty("hot", hot) | |
44 | + end | |
45 | + | |
46 | + -- 特殊订单 | |
47 | + local order = {} | |
48 | + | |
49 | +end | |
50 | + | |
51 | +function Diner:updateProperty(params) | |
52 | + params = params or {} | |
53 | + if not self.schema[params.field] then | |
54 | + return | |
55 | + end | |
56 | + local oldValue = self:getProperty(params.field) | |
57 | + if params.value then | |
58 | + self:setProperty(params.field, params.value) | |
59 | + elseif params.delta then | |
60 | + self:incrProperty(params.field, params.delta) | |
61 | + else | |
62 | + return | |
63 | + end | |
64 | + local newValue = self:getProperty(params.field) | |
65 | + if not params.notNotify then | |
66 | + self:notifyUpdateProperty(params.field, newValue, oldValue) | |
67 | + end | |
68 | +end | |
69 | + | |
70 | +function Diner:notifyUpdateProperty(field, newValue, oldValue) | |
71 | + local datas = { | |
72 | + key = field, | |
73 | + newValue = newValue, | |
74 | + oldValue = oldValue, | |
75 | + } | |
76 | + SendPacket(actionCodes.Diner_updateProperty, MsgPack.pack(datas)) | |
77 | +end | |
78 | + | |
79 | +function Diner:doSell(notify) | |
80 | + | |
81 | +end | |
82 | + | |
83 | +function Diner:getMaxSlots() | |
84 | + local slotCount = globalCsv.diner_sell_slots_init | |
85 | + | |
86 | + | |
87 | + return slotCount | |
88 | +end | |
89 | + | |
90 | +function Diner:getMaxDishs() | |
91 | + local dishCount = globalCsv.diner_sell_dish_init | |
92 | + | |
93 | + local buildingCsv = csvdb["diner_buildingCsv"] | |
94 | + for id, level in pairs(self:getProperty("buildL"):toNumMap()) do | |
95 | + if buildingCsv[id][level].storage > 0 then | |
96 | + dishCount = dishCount + buildingCsv[id][level].storage | |
97 | + end | |
98 | + end | |
99 | + return dishCount | |
100 | +end | |
101 | + | |
102 | +function Diner:data() | |
103 | + local properties = {"buildL", "order", "hot", "dishTree", "skillTree"} | |
104 | + local data = self:getProperties(properties) | |
105 | + return data | |
106 | +end | |
107 | + | |
108 | +return Diner | |
0 | 109 | \ No newline at end of file | ... | ... |
src/models/Hero.lua
... | ... | @@ -6,15 +6,15 @@ HeroPlugin.bind(Hero) |
6 | 6 | Hero.schema = { |
7 | 7 | id = {"number"}, |
8 | 8 | type = {"number", 0}, |
9 | - level = {"number", 1}, -- 等级 | |
10 | - breakL = {"number", 0}, -- 突破等级 | |
11 | - wakeL = {"number", 0}, -- 觉醒等级 | |
12 | - skillL = {"string", ""}, -- 技能等级 1=1 2=1 3=1 | |
13 | - talent = {"string", ""}, -- 0=阶段 1=1 2=1 3=1 4=1 四个天赋当前阶段的等级 阶段默认为1 等级默认为0 | |
14 | - battleV = {"number", 0}, -- 保存战斗力 | |
15 | - loveExp = {"number", 0}, --好感度经验 | |
16 | - loveL = {"number", 0}, --好感度等级 | |
17 | - skin = {"number", 0}, --皮肤 0 、 1、 2、 3 | |
9 | + level = {"number", 1}, -- 等级 | |
10 | + breakL = {"number", 0}, -- 突破等级 | |
11 | + wakeL = {"number", 0}, -- 觉醒等级 | |
12 | + skillL = {"string", ""}, -- 技能等级 1=1 2=1 3=1 | |
13 | + talent = {"string", ""}, -- 0=阶段 1=1 2=1 3=1 4=1 四个天赋当前阶段的等级 阶段默认为1 等级默认为0 | |
14 | + battleV = {"number", 0}, -- 保存战斗力 | |
15 | + loveExp = {"number", 0}, --好感度经验 | |
16 | + loveL = {"number", 0}, --好感度等级 | |
17 | + skin = {"number", 0}, --皮肤 0 、 1、 2、 3 | |
18 | 18 | } |
19 | 19 | |
20 | 20 | function Hero:ctor( properties ) |
... | ... | @@ -22,18 +22,12 @@ function Hero:ctor( properties ) |
22 | 22 | end |
23 | 23 | |
24 | 24 | function Hero:notifyUpdateProperty(field, newValue, oldValue) |
25 | - local updateData = { | |
26 | - id = self:getProperty("id"), | |
27 | - datas = { | |
28 | - { | |
29 | - key = field, | |
30 | - newValue = newValue, | |
31 | - oldValue = oldValue or "", | |
32 | - }, | |
33 | - } | |
25 | + local datas = { | |
26 | + key = field, | |
27 | + newValue = newValue, | |
28 | + oldValue = oldValue, | |
34 | 29 | } |
35 | - | |
36 | - SendPacket(actionCodes.Hero_updateProperty, MsgPack.pack(updateData)) | |
30 | + self:notifyUpdateProperties(datas) | |
37 | 31 | end |
38 | 32 | |
39 | 33 | function Hero:notifyUpdateProperties(params) |
... | ... | @@ -41,7 +35,6 @@ function Hero:notifyUpdateProperties(params) |
41 | 35 | id = self:getProperty("id"), |
42 | 36 | datas = params |
43 | 37 | } |
44 | - | |
45 | 38 | SendPacket(actionCodes.Hero_updateProperty, MsgPack.pack(updateData)) |
46 | 39 | end |
47 | 40 | ... | ... |
src/models/RolePlugin.lua
... | ... | @@ -11,6 +11,7 @@ function RolePlugin.bind(Role) |
11 | 11 | function Role:loadAll() |
12 | 12 | self:loadDaily() |
13 | 13 | self:loadHeros() |
14 | + self:loadDiner() | |
14 | 15 | end |
15 | 16 | |
16 | 17 | function Role:reloadWhenLogin() |
... | ... | @@ -24,6 +25,7 @@ function RolePlugin.bind(Role) |
24 | 25 | local response = {} |
25 | 26 | |
26 | 27 | self.dailyData:refreshDailyData(notify) |
28 | + self.dinerData:refreshDailyData(notify) | |
27 | 29 | |
28 | 30 | if notify then |
29 | 31 | self:notifyUpdateProperties(response) |
... | ... | @@ -171,10 +173,18 @@ function RolePlugin.bind(Role) |
171 | 173 | |
172 | 174 | function Role:checkItemEnough(itemCountT) |
173 | 175 | local less = {} |
176 | + if not next(itemCountT) then | |
177 | + return false, less | |
178 | + end | |
174 | 179 | for itemId, count in pairs(itemCountT) do |
175 | - local last = self:getItemCount(itemId) - count | |
176 | - if last < 0 then | |
177 | - less[itemId] = -last | |
180 | + if count <= 0 then | |
181 | + -- 判断物品数量值不应该小于等于0 | |
182 | + less[itemId] = 0 | |
183 | + else | |
184 | + local last = self:getItemCount(itemId) - count | |
185 | + if last < 0 then | |
186 | + less[itemId] = -last | |
187 | + end | |
178 | 188 | end |
179 | 189 | end |
180 | 190 | return (not next(less)), less -- 是否足够,,缺什么缺多少 |
... | ... | @@ -334,6 +344,18 @@ function RolePlugin.bind(Role) |
334 | 344 | end |
335 | 345 | end |
336 | 346 | |
347 | + function Role:loadDiner() | |
348 | + local roleId = self:getProperty("id") | |
349 | + local dataKey = string.format(R_DINER, roleId) | |
350 | + self.dinerData = require("models.Diner").new({key = dataKey}) | |
351 | + self.dinerData.owner = self | |
352 | + if not redisproxy:exists(dataKey) then | |
353 | + self.dinerData:create() | |
354 | + else | |
355 | + self.dinerData:load() | |
356 | + end | |
357 | + end | |
358 | + | |
337 | 359 | function Role:getAdvData() |
338 | 360 | if not self.advData then |
339 | 361 | self.advData = require("adv.Adv").new(self) | ... | ... |