Commit f8408529b103c034e9daaf309e2ea96c5e2f0429
1 parent
44dd6cae
冒险商店
Showing
4 changed files
with
75 additions
and
8 deletions
Show diff stats
src/adv/Adv.lua
@@ -12,6 +12,7 @@ function Adv:ctor(owner) | @@ -12,6 +12,7 @@ function Adv:ctor(owner) | ||
12 | assert(owner, "Adv instance must have owner(role)") | 12 | assert(owner, "Adv instance must have owner(role)") |
13 | self.owner = owner | 13 | self.owner = owner |
14 | self.maps = {} | 14 | self.maps = {} |
15 | + self.shopStatus = {} | ||
15 | self.battle = nil | 16 | self.battle = nil |
16 | self.backEvents = {} --发给客户端的事件组 | 17 | self.backEvents = {} --发给客户端的事件组 |
17 | 18 | ||
@@ -35,6 +36,8 @@ function Adv:initByInfo(advInfo) | @@ -35,6 +36,8 @@ function Adv:initByInfo(advInfo) | ||
35 | self.lchoose = advInfo.lch or {} | 36 | self.lchoose = advInfo.lch or {} |
36 | self.waitArtifact = advInfo.waitAF | 37 | self.waitArtifact = advInfo.waitAF |
37 | self.cacheUnlock = advInfo.cacheUnlock or {} | 38 | self.cacheUnlock = advInfo.cacheUnlock or {} |
39 | + self.shopStatus = advInfo.shopStatus or {} | ||
40 | + | ||
38 | self.maps = {} | 41 | self.maps = {} |
39 | for id, map in ipairs(advInfo.maps or {}) do | 42 | for id, map in ipairs(advInfo.maps or {}) do |
40 | self.maps[id] = AdvMap.new(self, id, map) | 43 | self.maps[id] = AdvMap.new(self, id, map) |
@@ -59,6 +62,7 @@ function Adv:initByChapter(chapterId, level, isToNext, notNotify) | @@ -59,6 +62,7 @@ function Adv:initByChapter(chapterId, level, isToNext, notNotify) | ||
59 | self.mapStack = {1} -- 最后一个为当前的地图 | 62 | self.mapStack = {1} -- 最后一个为当前的地图 |
60 | self.lchoose = self.lchoose or {} | 63 | self.lchoose = self.lchoose or {} |
61 | self.cacheUnlock = self.cacheUnlock or {} | 64 | self.cacheUnlock = self.cacheUnlock or {} |
65 | + self.shopStatus = self.shopStatus or {} | ||
62 | 66 | ||
63 | -- 随机出地图 | 67 | -- 随机出地图 |
64 | local mapId = self:randomMapId(chapterId, level) | 68 | local mapId = self:randomMapId(chapterId, level) |
@@ -92,6 +96,7 @@ function Adv:clear() | @@ -92,6 +96,7 @@ function Adv:clear() | ||
92 | self.battle = nil | 96 | self.battle = nil |
93 | self.waitArtifact = nil | 97 | self.waitArtifact = nil |
94 | self.cacheUnlock = {} | 98 | self.cacheUnlock = {} |
99 | + self.shopStatus = {} | ||
95 | end | 100 | end |
96 | 101 | ||
97 | function Adv:saveDB(notNotify) | 102 | function Adv:saveDB(notNotify) |
@@ -107,6 +112,7 @@ function Adv:saveDB(notNotify) | @@ -107,6 +112,7 @@ function Adv:saveDB(notNotify) | ||
107 | advInfo.lch = self.lchoose | 112 | advInfo.lch = self.lchoose |
108 | advInfo.waitAF = self.waitArtifact | 113 | advInfo.waitAF = self.waitArtifact |
109 | advInfo.cacheUnlock = self.cacheUnlock | 114 | advInfo.cacheUnlock = self.cacheUnlock |
115 | + advInfo.shopStatus = self.shopStatus | ||
110 | advInfo.maps = {} | 116 | advInfo.maps = {} |
111 | 117 | ||
112 | self.battle:saveDB() | 118 | self.battle:saveDB() |
@@ -792,9 +798,22 @@ local function clickTrader(self, room, block, params) | @@ -792,9 +798,22 @@ local function clickTrader(self, room, block, params) | ||
792 | if not block.event.shop or not block.event.shop[buyId] then return end | 798 | if not block.event.shop or not block.event.shop[buyId] then return end |
793 | if (block.event.status or ""):getv(buyId, 0) == 1 then return end -- 买过了 | 799 | if (block.event.status or ""):getv(buyId, 0) == 1 then return end -- 买过了 |
794 | 800 | ||
795 | - if not self:cost({[traderData.type] = block.event.shop[buyId][3]}, {}) then return end --不够 | ||
796 | - self:backCost({[traderData.type] = block.event.shop[buyId][3]}) | ||
797 | - local reward = self:award({[block.event.shop[buyId][1]] = block.event.shop[buyId][2]}) | 801 | + if traderData.purchasetime <= #((block.event.status or ""):toArray()) then return end |
802 | + | ||
803 | + local goodsData = csvdb["event_trader_goodsCsv"][block.event.shop[buyId][1]] | ||
804 | + if not goodsData then return end | ||
805 | + | ||
806 | + local costCount = math.ceil(goodsData.price * (block.event.shop[buyId][2] or 100) / 100) | ||
807 | + if not self:cost({[goodsData.currency] = costCount}, {}) then return end --不够 | ||
808 | + self:backCost({[goodsData.currency] = costCount}) | ||
809 | + local reward = self:award({[goodsData.item] = goodsData.num}) | ||
810 | + if goodsData.restrict == 1 then | ||
811 | + self.shopStatus[goodsData.goods] = (self.shopStatus[goodsData.goods] or 0) + 1 | ||
812 | + elseif goodsData.restrict == 2 then | ||
813 | + local advShop = self.owner:getProperty("advShop") | ||
814 | + advShop[goodsData.goods] = (advShop[goodsData.goods] or 0) + 1 | ||
815 | + self.owner:updateProperty({field = "advShop", value = advShop}) | ||
816 | + end | ||
798 | block.event.status = block.event.status:setv(buyId, 1) | 817 | block.event.status = block.event.status:setv(buyId, 1) |
799 | self:checkTask(Adv.TaskType.Shop, 1, block.event.id) | 818 | self:checkTask(Adv.TaskType.Shop, 1, block.event.id) |
800 | self:checkAchievement(Adv.AchievType.Shop, 1, block.event.id) | 819 | self:checkAchievement(Adv.AchievType.Shop, 1, block.event.id) |
src/adv/AdvBlock.lua
@@ -79,12 +79,58 @@ function Block:randomEvent() | @@ -79,12 +79,58 @@ function Block:randomEvent() | ||
79 | local data = csvdb["event_traderCsv"][self.event.id] | 79 | local data = csvdb["event_traderCsv"][self.event.id] |
80 | self.event.shop = {} | 80 | self.event.shop = {} |
81 | self.event.status = "" --购买次数状态 1 就是购买过了 -- 购买id就是shop索引 | 81 | self.event.status = "" --购买次数状态 1 就是购买过了 -- 购买id就是shop索引 |
82 | + local needDiscount = data.discount -- 需要的折扣数量 | ||
83 | + local curHad = {} | ||
84 | + local advShop = adv.owner:getProperty("advShop") | ||
85 | + local function randomGoods(range, gcount) | ||
86 | + local pool = range:toTableArray(true) -- {{id, weight}, ... } | ||
87 | + local function randomOneGood() | ||
88 | + for i = #pool, 1, -1 do | ||
89 | + local curId = pool[i][1] | ||
90 | + local curData = csvdb["event_trader_goodsCsv"][curId] | ||
91 | + if not curData then | ||
92 | + table.remove(pool, i) | ||
93 | + else | ||
94 | + if curData.restrict == 1 then -- 冒险内限制 | ||
95 | + if curData.restrictnum <= ((adv.shopStatus[curId] or 0) + (curHad[curId] or 0)) then | ||
96 | + table.remove(pool, i) | ||
97 | + end | ||
98 | + elseif curData.restrict == 2 then -- 角色限制 | ||
99 | + if curData.restrictnum <= ((advShop[curId] or 0) + (curHad[curId] or 0)) then | ||
100 | + table.remove(pool, i) | ||
101 | + end | ||
102 | + end | ||
103 | + end | ||
104 | + end | ||
105 | + if #pool <= 0 then | ||
106 | + return false | ||
107 | + end | ||
108 | + local idx = math.randWeight(pool, 2) | ||
109 | + local getId = pool[idx][1] | ||
110 | + local getData = svdb["event_trader_goodsCsv"][getId] | ||
111 | + if getData.restrict ~= 0 then | ||
112 | + curHad[curId] = (curHad[curId] or 0) + 1 | ||
113 | + end | ||
114 | + if getData.discount ~= "" and needDiscount > 0 then | ||
115 | + needDiscount = needDiscount - 1 | ||
116 | + table.insert(self.event.shop, {getId, getData.discount:randWeight()}) | ||
117 | + else | ||
118 | + table.insert(self.event.shop, {getId}) | ||
119 | + end | ||
120 | + return true | ||
121 | + end | ||
122 | + | ||
123 | + for i = 1, gcount do | ||
124 | + if not randomOneGood() then | ||
125 | + break | ||
126 | + end | ||
127 | + end | ||
128 | + end | ||
129 | + | ||
82 | for i = 1, 10 do | 130 | for i = 1, 10 do |
83 | local numS, rangeS = "num" .. i, "range" .. i | 131 | local numS, rangeS = "num" .. i, "range" .. i |
84 | if data[numS] and data[rangeS] then | 132 | if data[numS] and data[rangeS] then |
85 | - for j = 1, data[numS] do | ||
86 | - table.insert(self.event.shop, data[rangeS]:randWeight(true)) | ||
87 | - end | 133 | + randomGoods(data[rangeS], data[numS]) |
88 | else | 134 | else |
89 | break | 135 | break |
90 | end | 136 | end |
src/models/Role.lua
@@ -70,12 +70,13 @@ Role.schema = { | @@ -70,12 +70,13 @@ Role.schema = { | ||
70 | advAFWear = {"table", {}}, -- 当前拥有的神器 {[slot] = id} | 70 | advAFWear = {"table", {}}, -- 当前拥有的神器 {[slot] = id} |
71 | advDrawB = {"table", {}}, -- 冒险抽奖回馈 {[1] = 0, [2] = 100} -- 池子类型 = 点数 | 71 | advDrawB = {"table", {}}, -- 冒险抽奖回馈 {[1] = 0, [2] = 100} -- 池子类型 = 点数 |
72 | advStoryB = {"table", {}}, -- 冒险故事完成记录 (连锁事件绑定的故事) -- {storyId = 1} | 72 | advStoryB = {"table", {}}, -- 冒险故事完成记录 (连锁事件绑定的故事) -- {storyId = 1} |
73 | + advShop = {"table", {}}, -- 冒险內的商店限制购买次数记录 {goodId = count} | ||
73 | 74 | ||
74 | --挂机相关 | 75 | --挂机相关 |
75 | hangPass = {"table", {}}, -- 挂机通过的最大关卡 | 76 | hangPass = {"table", {}}, -- 挂机通过的最大关卡 |
76 | hangTeam = {"table", {}}, -- 挂机队伍 | 77 | hangTeam = {"table", {}}, -- 挂机队伍 |
77 | hangTS = {"table", {}}, -- 挂机队伍他人可读的队伍信息 | 78 | hangTS = {"table", {}}, -- 挂机队伍他人可读的队伍信息 |
78 | - hangTB = {"table", {}}, -- 挂机队伍他人可用的战斗信息 | 79 | + hangTB = {"table", {}}, -- 挂机队伍他人可用的战斗信息mao |
79 | hangTBV = {"number", 0}, -- 挂机队伍他人可用的战斗力 | 80 | hangTBV = {"number", 0}, -- 挂机队伍他人可用的战斗力 |
80 | 81 | ||
81 | hangInfo = {"table", {}}, -- 当前挂机信息 | 82 | hangInfo = {"table", {}}, -- 当前挂机信息 |
@@ -251,6 +252,7 @@ function Role:data() | @@ -251,6 +252,7 @@ function Role:data() | ||
251 | advAFGet = self:getProperty("advAFGet"), | 252 | advAFGet = self:getProperty("advAFGet"), |
252 | advAFWear = self:getProperty("advAFWear"), | 253 | advAFWear = self:getProperty("advAFWear"), |
253 | advDrawB = self:getProperty("advDrawB"), | 254 | advDrawB = self:getProperty("advDrawB"), |
255 | + advShop = self:getProperty("advShop"), | ||
254 | 256 | ||
255 | hangPass = self:getProperty("hangPass"), | 257 | hangPass = self:getProperty("hangPass"), |
256 | hangTeam = self:getProperty("hangTeam"), | 258 | hangTeam = self:getProperty("hangTeam"), |