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"), |