Commit 1a0b3c5612b598aa5650742345a470bf9db47fc1
1 parent
71a18948
抽卡保底,切换定向卡池
Showing
9 changed files
with
229 additions
and
15 deletions
Show diff stats
src/GlobalVar.lua
@@ -272,4 +272,11 @@ CardType = { | @@ -272,4 +272,11 @@ CardType = { | ||
272 | PrivilegeCard = 3, --特权卡 | 272 | PrivilegeCard = 3, --特权卡 |
273 | GrowFund = 4, --成长助力 | 273 | GrowFund = 4, --成长助力 |
274 | BattleCard = 5, --赛季卡 | 274 | BattleCard = 5, --赛季卡 |
275 | +} | ||
276 | + | ||
277 | +HeroQuality = { | ||
278 | + N = 1, | ||
279 | + R = 2, | ||
280 | + SR = 3, | ||
281 | + SSR = 4, | ||
275 | } | 282 | } |
276 | \ No newline at end of file | 283 | \ No newline at end of file |
src/ProtocolCode.lua
@@ -88,6 +88,7 @@ actionCodes = { | @@ -88,6 +88,7 @@ actionCodes = { | ||
88 | Hero_getResetRewardRpc = 219, | 88 | Hero_getResetRewardRpc = 219, |
89 | Hero_drawHeroRpc = 220, | 89 | Hero_drawHeroRpc = 220, |
90 | Hero_repayHeroRpc = 221, | 90 | Hero_repayHeroRpc = 221, |
91 | + Hero_unlockPoolRpc = 222, | ||
91 | 92 | ||
92 | Hang_startRpc = 251, | 93 | Hang_startRpc = 251, |
93 | Hang_checkRpc = 252, | 94 | Hang_checkRpc = 252, |
src/actions/GmAction.lua
@@ -515,8 +515,9 @@ end | @@ -515,8 +515,9 @@ end | ||
515 | table.insert(helpDes, {"测试", "test", ""}) | 515 | table.insert(helpDes, {"测试", "test", ""}) |
516 | function _M.test(role, pms) | 516 | function _M.test(role, pms) |
517 | local id = tonum(pms.pm1, 0) | 517 | local id = tonum(pms.pm1, 0) |
518 | - local a = require("actions.StoreAction") | ||
519 | - a.getGrowFundRewardRpc({role=role}, MsgPack.pack({id=id})) | 518 | + --local hero = require ("actions.HeroAction") |
519 | + --hero.unlockPoolRpc({role = role}, MsgPack.pack({type = id})) | ||
520 | + role.storeData:resetStoreReored(id) | ||
520 | return "成功" | 521 | return "成功" |
521 | end | 522 | end |
522 | 523 | ||
@@ -525,12 +526,4 @@ function _M.ayncPurchase(role, params) | @@ -525,12 +526,4 @@ function _M.ayncPurchase(role, params) | ||
525 | return role:handlePurchase(params) or "" | 526 | return role:handlePurchase(params) or "" |
526 | end | 527 | end |
527 | 528 | ||
528 | -function _M.test(role, params) | ||
529 | - local id = tonum(params.pm1, 0) | ||
530 | - local store = require ("actions.StoreAction") | ||
531 | - store.shopBuyRpc({role = role}, MsgPack.pack({id = id})) | ||
532 | - return "成功" | ||
533 | -end | ||
534 | - | ||
535 | - | ||
536 | return _M | 529 | return _M |
537 | \ No newline at end of file | 530 | \ No newline at end of file |
src/actions/HeroAction.lua
@@ -681,9 +681,7 @@ function _M.getResetRewardRpc(agent, data) | @@ -681,9 +681,7 @@ function _M.getResetRewardRpc(agent, data) | ||
681 | return true | 681 | return true |
682 | end | 682 | end |
683 | 683 | ||
684 | - | ||
685 | - | ||
686 | -function _M.drawHeroRpc(agent, data) | 684 | +function _M.unuse_drawHeroRpc(agent, data) |
687 | local role = agent.role | 685 | local role = agent.role |
688 | local msg = MsgPack.unpack(data) | 686 | local msg = MsgPack.unpack(data) |
689 | 687 | ||
@@ -921,6 +919,153 @@ function _M.drawHeroRpc(agent, data) | @@ -921,6 +919,153 @@ function _M.drawHeroRpc(agent, data) | ||
921 | return true | 919 | return true |
922 | end | 920 | end |
923 | 921 | ||
922 | +function _M.drawHeroRpc(agent, data) | ||
923 | + local role = agent.role | ||
924 | + local msg = MsgPack.unpack(data) | ||
925 | + | ||
926 | + if not role:isFuncUnlock(FuncUnlock.GetHero) then return end | ||
927 | + local btype = msg.pool -- 1 2 3 卡池类型 | ||
928 | + local subType = msg.subType or 1-- 定向卡池需要传 子类型 | ||
929 | + local drawType = msg.type -- 1 单抽 2 十连 | ||
930 | + local guide = msg.guide -- 是否是引导抽的 | ||
931 | + if btype ~= 1 then | ||
932 | + subType = 1 | ||
933 | + end | ||
934 | + | ||
935 | + local buildTypeData = csvdb["build_typeCsv"][btype] | ||
936 | + if not buildTypeData then return 1 end | ||
937 | + | ||
938 | + local drawCount = {1, 10} -- 抽取次数 | ||
939 | + if not drawCount[drawType] then return 2 end | ||
940 | + | ||
941 | + -- 计算抽卡消耗品 | ||
942 | + local cost = {} | ||
943 | + local lastCount = drawCount[drawType] | ||
944 | + for _, costType in ipairs({"draw_card", "draw_coin"}) do | ||
945 | + if buildTypeData[costType] ~= "" then | ||
946 | + local curCost = buildTypeData[costType]:toArray(true, "=") | ||
947 | + local hadCount = role:getItemCount(curCost[1]) | ||
948 | + local curCount = math.floor(hadCount / curCost[2]) | ||
949 | + if curCount >= lastCount then | ||
950 | + cost[curCost[1]] = curCost[2] * lastCount | ||
951 | + lastCount = 0 | ||
952 | + break | ||
953 | + elseif curCount > 0 then | ||
954 | + cost[curCost[1]] = curCost[2] * curCount | ||
955 | + lastCount = lastCount - curCount | ||
956 | + end | ||
957 | + end | ||
958 | + end | ||
959 | + if lastCount > 0 then -- 钱不够 | ||
960 | + return 3 | ||
961 | + end | ||
962 | + | ||
963 | + -- 抽取的池子 | ||
964 | + local poolMap = buildTypeData["pool"]:toNumMap() | ||
965 | + local poolId = poolMap[subType] | ||
966 | + if not poolId then return end | ||
967 | + | ||
968 | + --判断定向卡池是否开启 | ||
969 | + if btype == 1 then | ||
970 | + if not role:isTimeResetOpen(TimeReset["DrawType" .. subType]) then | ||
971 | + local unlockPool = role.dailyData:getProperty("unlockPool") | ||
972 | + if not unlockPool[subType] then | ||
973 | + return 1 | ||
974 | + end | ||
975 | + end | ||
976 | + end | ||
977 | + | ||
978 | + --TODO 活动覆盖 | ||
979 | + | ||
980 | + local unitPool = csvdb["build_unitCsv"][poolId] | ||
981 | + if not unitPool then return 4 end | ||
982 | + | ||
983 | + -- 开始抽 | ||
984 | + local resultPool = {} | ||
985 | + local function fillDrawPool() | ||
986 | + local condition = {"rare", "camp"} | ||
987 | + local values = {} | ||
988 | + | ||
989 | + for idx, field in ipairs(condition) do | ||
990 | + if not values[idx] then | ||
991 | + local lpool = {} | ||
992 | + local curIdx = 1 | ||
993 | + while unitPool[field .. "_" .. curIdx] do | ||
994 | + lpool[curIdx] = {unitPool[field .. "_" .. curIdx]} | ||
995 | + curIdx = curIdx + 1 | ||
996 | + end | ||
997 | + | ||
998 | + if next(lpool) then | ||
999 | + values[idx] = math.randWeight(lpool, 1) | ||
1000 | + end | ||
1001 | + end | ||
1002 | + end | ||
1003 | + | ||
1004 | + for itemId, oneData in pairs(csvdb["build_poolCsv"]) do | ||
1005 | + if oneData["pool_" .. poolId] and oneData["pool_" .. poolId] ~= "" then | ||
1006 | + local itemData = csvdb["itemCsv"][itemId] | ||
1007 | + while itemData do | ||
1008 | + if itemData.type ~= ItemType.Hero then break end | ||
1009 | + local heroData = csvdb["unitCsv"][itemData.id - ItemStartId.Hero] | ||
1010 | + if not heroData then break end | ||
1011 | + local ok = true | ||
1012 | + for idx, field in ipairs(condition) do | ||
1013 | + if heroData[field] ~= values[idx] then ok = false break end | ||
1014 | + end | ||
1015 | + if not ok then break end | ||
1016 | + if oneData["pool_" .. poolId] > 0 then | ||
1017 | + resultPool[itemId] = {oneData["pool_" .. poolId]} -- itemId, count, 概率 | ||
1018 | + end | ||
1019 | + break | ||
1020 | + end | ||
1021 | + end | ||
1022 | + end | ||
1023 | + end | ||
1024 | + | ||
1025 | + role:costItems(cost, {log = {desc = "drawHero", short1 = btype, int1 = poolId}}) | ||
1026 | + | ||
1027 | + local ssrCount = 0 | ||
1028 | + local reward = {} | ||
1029 | + for i = 1, drawCount[drawType] do | ||
1030 | + resultPool = {} | ||
1031 | + while not next(resultPool) do | ||
1032 | + fillDrawPool() | ||
1033 | + end | ||
1034 | + | ||
1035 | + -- 引导必送 613 丝路德 | ||
1036 | + local itemId = guide and 613 or math.randWeight(resultPool, 1) | ||
1037 | + local itemData = csvdb["itemCsv"][itemId] | ||
1038 | + if itemData.quality == HeroQuality.SSR then | ||
1039 | + ssrCount = ssrCount + 1 | ||
1040 | + end | ||
1041 | + | ||
1042 | + if role:isHaveHero(itemData.id - ItemStartId.Hero) then | ||
1043 | + local fragId = itemData.id - ItemStartId.Hero | ||
1044 | + local heroData = csvdb["unitCsv"][fragId] | ||
1045 | + local count = globalCsv.draw_unit_tofragment[heroData.rare] | ||
1046 | + role:award({[fragId] = count}, {log = {desc = "drawHero", short1 = btype, int1 = poolId}}) | ||
1047 | + table.insert(reward, {id = fragId, count = count, from = itemId, fcount = 1}) | ||
1048 | + else | ||
1049 | + role:award({[itemId] = 1}, {log = {desc = "drawHero", short1 = btype, int1 = poolId}}) | ||
1050 | + table.insert(reward, {id = itemId, count = 1}) | ||
1051 | + end | ||
1052 | + end | ||
1053 | + | ||
1054 | + if btype == 1 or btype == 2 then | ||
1055 | + local repayHero = role:getProperty("repayHero") or 0 | ||
1056 | + repayHero = repayHero + drawCount[drawType] | ||
1057 | + role:updateProperty({field = "repayHero", value = repayHero}) | ||
1058 | + end | ||
1059 | + | ||
1060 | + role:checkTaskEnter("DrawHero", {pool = btype, count = drawCount[drawType]}) | ||
1061 | + if ssrCount > 0 then | ||
1062 | + role:checkTaskEnter("DrawSSR", {count = ssrCount}) | ||
1063 | + end | ||
1064 | + role:log("hero_action", {desc = "drawHero", short1 = btype, int1 = drawCount[drawType], int2 = poolId}) | ||
1065 | + SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组 | ||
1066 | + return true | ||
1067 | +end | ||
1068 | + | ||
924 | function _M.repayHeroRpc(agent, data) | 1069 | function _M.repayHeroRpc(agent, data) |
925 | local role = agent.role | 1070 | local role = agent.role |
926 | 1071 | ||
@@ -950,4 +1095,36 @@ function _M.repayHeroRpc(agent, data) | @@ -950,4 +1095,36 @@ function _M.repayHeroRpc(agent, data) | ||
950 | return true | 1095 | return true |
951 | end | 1096 | end |
952 | 1097 | ||
1098 | +function _M.unlockPoolRpc(agent, data) | ||
1099 | + local role = agent.role | ||
1100 | + local msg = MsgPack.unpack(data) | ||
1101 | + | ||
1102 | + if not role:isFuncUnlock(FuncUnlock.GetHero) then return end | ||
1103 | + local type = msg.type -- 指定定向卡池需要类型 1, 2, 3 | ||
1104 | + local needCost = true | ||
1105 | + --当前开启的类型不用解锁 | ||
1106 | + if role:isTimeResetOpen(TimeReset["DrawType" .. type]) then | ||
1107 | + needCost = false | ||
1108 | + end | ||
1109 | + --已经解锁的不需要重复解锁 | ||
1110 | + local unlockPool = role.dailyData:getProperty("unlockPool") | ||
1111 | + if unlockPool[type] then | ||
1112 | + needCost = false | ||
1113 | + end | ||
1114 | + | ||
1115 | + if needCost then | ||
1116 | + if not role:costDiamond({count = 300, log = {desc = "unlockPool", short1 = type}}) then | ||
1117 | + return | ||
1118 | + end | ||
1119 | + end | ||
1120 | + | ||
1121 | + unlockPool[type] = 1 | ||
1122 | + role.dailyData:updateProperty({field="unlockPool", value = unlockPool}) | ||
1123 | + role.dailyData:updateProperty({field="curPool", value = type}) | ||
1124 | + | ||
1125 | + role:log("hero_action", {desc = "unlockPool", short1=type}) | ||
1126 | + SendPacket(actionCodes.Hero_unlockPoolRpc, MsgPack.pack({})) | ||
1127 | + return true | ||
1128 | +end | ||
1129 | + | ||
953 | return _M | 1130 | return _M |
954 | \ No newline at end of file | 1131 | \ No newline at end of file |
src/actions/RoleAction.lua
@@ -663,7 +663,8 @@ function _M.taskRpc(agent, data) | @@ -663,7 +663,8 @@ function _M.taskRpc(agent, data) | ||
663 | { type = roleField[taskType], field = "a", value = active}, | 663 | { type = roleField[taskType], field = "a", value = active}, |
664 | }) | 664 | }) |
665 | 665 | ||
666 | - role:updateProperty({field = "battlePoint", role:getProperty("battlePoint") + 100}) | 666 | + local oldVal = role:getProperty("battlePoint") or 0 |
667 | + role:updateProperty({field = "battlePoint", value = oldVal + taskData.active}) | ||
667 | 668 | ||
668 | SendPacket(actionCodes.Role_taskRpc, MsgPack.pack(role:packReward(reward, change))) | 669 | SendPacket(actionCodes.Role_taskRpc, MsgPack.pack(role:packReward(reward, change))) |
669 | return true | 670 | return true |
src/actions/StoreAction.lua
@@ -387,6 +387,11 @@ function _M.getBattlePassRewardRpc(agent, data) | @@ -387,6 +387,11 @@ function _M.getBattlePassRewardRpc(agent, data) | ||
387 | return 1 | 387 | return 1 |
388 | end | 388 | end |
389 | 389 | ||
390 | + if role:getProperty("battlePoint") < config.condition then | ||
391 | + skynet.error(string.format("user do not have enough battle point, user_id:%d", role:getProperty("id"))) | ||
392 | + return 1 | ||
393 | + end | ||
394 | + | ||
390 | local gift = "" | 395 | local gift = "" |
391 | if freeFlag == "0" then | 396 | if freeFlag == "0" then |
392 | gift = config.giftFree | 397 | gift = config.giftFree |
src/models/Daily.lua
@@ -26,7 +26,8 @@ Daily.schema = { | @@ -26,7 +26,8 @@ Daily.schema = { | ||
26 | advSupRe = {"number", 0}, -- 冒险支援效果刷新次数 | 26 | advSupRe = {"number", 0}, -- 冒险支援效果刷新次数 |
27 | goldBuyT = {"number", 0}, -- 金币购买次数 | 27 | goldBuyT = {"number", 0}, -- 金币购买次数 |
28 | 28 | ||
29 | - unlockPool = {"table", {}} -- 解锁的属性卡池 | 29 | + unlockPool = {"table", {}}, -- 解锁的属性卡池 |
30 | + curPool = {"number", 0}, -- 属性卡池当前索引 | ||
30 | } | 31 | } |
31 | 32 | ||
32 | function Daily:updateProperty(params) | 33 | function Daily:updateProperty(params) |
@@ -99,6 +100,8 @@ function Daily:data() | @@ -99,6 +100,8 @@ function Daily:data() | ||
99 | dailySDD = self:getProperty("dailySDD"), | 100 | dailySDD = self:getProperty("dailySDD"), |
100 | advSupRe = self:getProperty("advSupRe"), | 101 | advSupRe = self:getProperty("advSupRe"), |
101 | goldBuyT = self:getProperty("goldBuyT"), | 102 | goldBuyT = self:getProperty("goldBuyT"), |
103 | + unlockPool = self:getProperty("unlockPool"), | ||
104 | + curPool = self:getProperty("curPool"), | ||
102 | } | 105 | } |
103 | end | 106 | end |
104 | 107 |
src/models/RoleTimeReset.lua
@@ -66,6 +66,10 @@ function Role:updateTimeReset(now, notify) | @@ -66,6 +66,10 @@ function Role:updateTimeReset(now, notify) | ||
66 | ResetFunc[funcName](self, notify, response, now) | 66 | ResetFunc[funcName](self, notify, response, now) |
67 | resetMode[funcName] = true | 67 | resetMode[funcName] = true |
68 | end | 68 | end |
69 | + if needResetId[resetId] then | ||
70 | + -- 充值商城购买记录 | ||
71 | + self.storeData:resetStoreReored(resetId) | ||
72 | + end | ||
69 | end | 73 | end |
70 | 74 | ||
71 | for resetId, round in pairs(needResetId) do | 75 | for resetId, round in pairs(needResetId) do |
src/models/Store.lua
@@ -194,6 +194,29 @@ function Store:notifyUpdateProperty(field, newValue, oldValue) | @@ -194,6 +194,29 @@ function Store:notifyUpdateProperty(field, newValue, oldValue) | ||
194 | SendPacket(actionCodes.Store_updateproperty, MsgPack.pack(datas)) | 194 | SendPacket(actionCodes.Store_updateproperty, MsgPack.pack(datas)) |
195 | end | 195 | end |
196 | 196 | ||
197 | +function Store:resetStoreReored(resetId) | ||
198 | + local payRecord = self:getProperty("payR") or {} | ||
199 | + local buyRecord = self:getProperty("buyR") or {} | ||
200 | + for k, v in pairs(payRecord) do | ||
201 | + local config = csvdb["shop_rechargeCsv"][k] | ||
202 | + if config then | ||
203 | + if config.resetTime == resetId then | ||
204 | + payRecord[k] = nil | ||
205 | + end | ||
206 | + end | ||
207 | + end | ||
208 | + self:updateProperty({field = "payR", value = payRecord}) | ||
209 | + for k, v in pairs(buyRecord) do | ||
210 | + local config = csvdb["shop_normalCsv"][k] | ||
211 | + if config then | ||
212 | + if config.resetTime == resetId then | ||
213 | + buyRecord[k] = nil | ||
214 | + end | ||
215 | + end | ||
216 | + end | ||
217 | + self:updateProperty({field = "buyR", value = buyRecord}) | ||
218 | +end | ||
219 | + | ||
197 | function Store:data() | 220 | function Store:data() |
198 | return { | 221 | return { |
199 | buyR = self:getProperty("buyR"), | 222 | buyR = self:getProperty("buyR"), |