Commit 1663460594b058c17c9d4eda37410cd03be7e579
1 parent
96d591f7
多队挂机,天赋道具合成
Showing
7 changed files
with
157 additions
and
18 deletions
Show diff stats
src/ProtocolCode.lua
| @@ -99,6 +99,7 @@ actionCodes = { | @@ -99,6 +99,7 @@ actionCodes = { | ||
| 99 | Hero_unlockPoolRpc = 222, | 99 | Hero_unlockPoolRpc = 222, |
| 100 | Hero_changeCrown = 223, | 100 | Hero_changeCrown = 223, |
| 101 | Hero_drawHeroExtraRewardNtf = 224, | 101 | Hero_drawHeroExtraRewardNtf = 224, |
| 102 | + Hero_itemComposeRpc = 225, | ||
| 102 | 103 | ||
| 103 | Hang_startRpc = 251, | 104 | Hang_startRpc = 251, |
| 104 | Hang_checkRpc = 252, | 105 | Hang_checkRpc = 252, |
| @@ -217,9 +218,8 @@ actionCodes = { | @@ -217,9 +218,8 @@ actionCodes = { | ||
| 217 | Activity_actCalendaTaskRpc = 655, | 218 | Activity_actCalendaTaskRpc = 655, |
| 218 | Activity_actPaySignRpc = 656, | 219 | Activity_actPaySignRpc = 656, |
| 219 | 220 | ||
| 220 | - Radio_listRpc = 700, -- 获取电台讨伐任务列表 | ||
| 221 | - Radio_startQuestRpc = 701, | ||
| 222 | - Radio_finishQuestRpc = 702, | 221 | + Radio_startQuestRpc = 700, |
| 222 | + Radio_finishQuestRpc = 701, | ||
| 223 | } | 223 | } |
| 224 | 224 | ||
| 225 | rpcResponseBegin = 10000 | 225 | rpcResponseBegin = 10000 |
src/actions/HeroAction.lua
| @@ -1038,4 +1038,23 @@ function _M.changeCrown(agent, data) | @@ -1038,4 +1038,23 @@ function _M.changeCrown(agent, data) | ||
| 1038 | return true | 1038 | return true |
| 1039 | end | 1039 | end |
| 1040 | 1040 | ||
| 1041 | +function _M.itemComposeRpc(agent, data) | ||
| 1042 | + local role = agent.role | ||
| 1043 | + local msg = MsgPack.unpack(data) | ||
| 1044 | + | ||
| 1045 | + local itemId = msg.id | ||
| 1046 | + local count = msg.count | ||
| 1047 | + if not csvdb["itemCsv"][itemId] then return 1 end | ||
| 1048 | + local config = csvdb["item_processCsv"][itemId] | ||
| 1049 | + if not config then return 2 end | ||
| 1050 | + | ||
| 1051 | + local cost = config.cost:toNumMap() | ||
| 1052 | + if not role:checkItemEnough(cost) then return 2 end | ||
| 1053 | + role:costItems(cost, {log = {desc = "itemCompose", int1 = itemId, int2 = count}}) | ||
| 1054 | + role:award({[itemId] = count}, {log = {desc = "itemCompose"}}) | ||
| 1055 | + | ||
| 1056 | + SendPacket(actionCodes.Hero_itemComposeRpc, "") | ||
| 1057 | + return true | ||
| 1058 | +end | ||
| 1059 | + | ||
| 1041 | return _M | 1060 | return _M |
src/actions/RadioAction.lua
| 1 | local _M = {} | 1 | local _M = {} |
| 2 | 2 | ||
| 3 | -function _M.listRpc(agent, data) | ||
| 4 | - local role = agent.role | ||
| 5 | - local roleId = role:getProperty("id") | ||
| 6 | - local now = skynet.timex() | ||
| 7 | - local result = {} | ||
| 8 | - | 3 | +-- 获取英雄大成功率 |
| 4 | +local function getHeroCoef(hero, condition) | ||
| 5 | + -- 基础概率 | ||
| 6 | + local rareMap = {[HeroQuality.N] = 10, [HeroQuality.R] = 10, [HeroQuality.SR] = 15, [HeroQuality.SSR] = 20} | ||
| 7 | + local rare = hero:getRare() | ||
| 8 | + local result = 0 | ||
| 9 | + for _, it in ipairs(condition:toTableArray(true)) do | ||
| 10 | + local type = it[1] | ||
| 11 | + local value = it[2] | ||
| 12 | + local add = it[3] | ||
| 13 | + if type == 1 then -- 种族加成 | ||
| 14 | + if hero:getCamp() == value then | ||
| 15 | + result = result + add | ||
| 16 | + end | ||
| 17 | + elseif type == 2 then -- 定位加成 | ||
| 18 | + if hero:getPosition() == value then | ||
| 19 | + result = result + add | ||
| 20 | + end | ||
| 21 | + end | ||
| 22 | + end | ||
| 9 | 23 | ||
| 10 | - SendPacket(actionCodes.Email_listRpc, MsgPack.pack({list = result})) | ||
| 11 | - return true | 24 | + return result + (rareMap[rare] or 0) |
| 12 | end | 25 | end |
| 13 | 26 | ||
| 14 | --- 获取英雄大成功率 | ||
| 15 | -local function getHeroCoef() | ||
| 16 | - return 0 | 27 | +local function getQuestMax(role) |
| 28 | + local count = 0 | ||
| 29 | + for _, carbonId in ipairs(globalCsv.crusade_team_unlock or {}) do | ||
| 30 | + if role:checkHangPass(carbonId) then | ||
| 31 | + count = count + 1 | ||
| 32 | + end | ||
| 33 | + end | ||
| 34 | + | ||
| 35 | + return count + (globalCsv.cursade_team_count_initial or 0) | ||
| 17 | end | 36 | end |
| 18 | 37 | ||
| 19 | function _M.startQuestRpc(agent, data) | 38 | function _M.startQuestRpc(agent, data) |
| @@ -22,11 +41,67 @@ function _M.startQuestRpc(agent, data) | @@ -22,11 +41,67 @@ function _M.startQuestRpc(agent, data) | ||
| 22 | local id = msg.id | 41 | local id = msg.id |
| 23 | local heros = msg.heros | 42 | local heros = msg.heros |
| 24 | local result = {} | 43 | local result = {} |
| 44 | + local radioTask = role:getProperty("radioTask") | ||
| 45 | + if table.numbers(radioTask) >= getQuestMax(role) then | ||
| 46 | + return 1 | ||
| 47 | + end | ||
| 25 | -- check id | 48 | -- check id |
| 49 | + local config = csvdb["crusadeCsv"][id] | ||
| 50 | + if not config then return 2 end | ||
| 51 | + if not role:checkHangPass(config.unlock) then return 3 end | ||
| 52 | + if radioTask[id] then return 4 end | ||
| 26 | -- check hero | 53 | -- check hero |
| 54 | + --1=指定等级=人数 | ||
| 55 | + --2=指定稀有度=人数 | ||
| 56 | + --3=人数 | ||
| 57 | + local needHeroCnt = 0 | ||
| 58 | + local lvlMap = {} | ||
| 59 | + local rareMap = {} | ||
| 60 | + for _, it in ipairs(config.condition:toTableArray(true)) do | ||
| 61 | + local type = it[1] | ||
| 62 | + if type == 1 then | ||
| 63 | + lvlMap[1] = it[2] | ||
| 64 | + lvlMap[2] = it[3] | ||
| 65 | + elseif type == 2 then | ||
| 66 | + rareMap[1] = it[2] | ||
| 67 | + rareMap[2] = it[3] | ||
| 68 | + elseif type == 3 then | ||
| 69 | + needHeroCnt = it[2] | ||
| 70 | + end | ||
| 71 | + end | ||
| 72 | + for _, heroId in ipairs(heros) do | ||
| 73 | + local hero = role.heros[heroId] | ||
| 74 | + if hero then | ||
| 75 | + needHeroCnt = needHeroCnt - 1 | ||
| 76 | + if next(lvlMap) then | ||
| 77 | + if hero:getProperty("level") >= lvlMap[1] then | ||
| 78 | + lvlMap[2] = lvlMap[2] - 1 | ||
| 79 | + if lvlMap[2] <= 0 then | ||
| 80 | + lvlMap = {} | ||
| 81 | + end | ||
| 82 | + end | ||
| 83 | + end | ||
| 84 | + if next(rareMap) then | ||
| 85 | + if hero:getRare() >= rareMap[1] then | ||
| 86 | + rareMap[2] = rareMap[2] - 1 | ||
| 87 | + end | ||
| 88 | + if rareMap[2] <= 0 then | ||
| 89 | + rareMap = {} | ||
| 90 | + end | ||
| 91 | + end | ||
| 92 | + end | ||
| 93 | + end | ||
| 94 | + if needHeroCnt > 0 or next(rareMap) or next(lvlMap) then | ||
| 95 | + return 5 | ||
| 96 | + end | ||
| 27 | -- start quest, set finish time | 97 | -- start quest, set finish time |
| 98 | + local taskData = {} | ||
| 99 | + taskData["time"] = skynet.timex() + config.time | ||
| 100 | + taskData["heros"] = heros | ||
| 101 | + radioTask[id] = taskData | ||
| 102 | + role:updateProperty({field="radioTask", value=radioTask, notNotify=true}) | ||
| 28 | 103 | ||
| 29 | - SendPacket(actionCodes.Email_listRpc, MsgPack.pack({list = result})) | 104 | + SendPacket(actionCodes.Radio_startQuestRpc, MsgPack.pack({id=id, task=taskData})) |
| 30 | return true | 105 | return true |
| 31 | end | 106 | end |
| 32 | 107 | ||
| @@ -34,13 +109,50 @@ function _M.finishQuestRpc(agent, data) | @@ -34,13 +109,50 @@ function _M.finishQuestRpc(agent, data) | ||
| 34 | local role = agent.role | 109 | local role = agent.role |
| 35 | local msg = MsgPack.unpack(data) | 110 | local msg = MsgPack.unpack(data) |
| 36 | local id = msg.id | 111 | local id = msg.id |
| 37 | - local result = {} | ||
| 38 | -- check finish time | 112 | -- check finish time |
| 113 | + local radioTask = role:getProperty("radioTask") | ||
| 114 | + local task = radioTask[id] | ||
| 115 | + if not task then return 1 end | ||
| 116 | + if skynet.timex() < task.time then return 2 end | ||
| 39 | -- check id | 117 | -- check id |
| 118 | + local config = csvdb["crusadeCsv"][id] | ||
| 119 | + if not config then return 3 end | ||
| 120 | + local carbonData = csvdb["idle_battleCsv"][config.unlock] | ||
| 121 | + if not carbonData then return 4 end | ||
| 40 | -- get heros | 122 | -- get heros |
| 123 | + local totalCoef = 0 | ||
| 124 | + for _, heroId in ipairs(task.heros) do | ||
| 125 | + local hero = role.heros[heroId] | ||
| 126 | + if hero then | ||
| 127 | + totalCoef = totalCoef + getHeroCoef(hero, config.success) | ||
| 128 | + end | ||
| 129 | + end | ||
| 41 | -- send award | 130 | -- send award |
| 131 | + local bigSuccess = false | ||
| 132 | + local result = math.randomInt(0, 100) | ||
| 133 | + if result < totalCoef then | ||
| 134 | + bigSuccess = true | ||
| 135 | + end | ||
| 136 | + local money = math.ceil(carbonData.money / 5) * config.time * config.money_clear | ||
| 137 | + local exp = math.ceil(carbonData.exp / 5) * config.time * config.exp_clear | ||
| 138 | + local itemReward = config.item_clear_special:toNumMap() | ||
| 139 | + itemReward[ItemId.Gold] = (itemReward[ItemId.Gold] or 0) + money | ||
| 140 | + itemReward[ItemId.Exp] = (itemReward[ItemId.Exp] or 0) + exp | ||
| 141 | + if bigSuccess then | ||
| 142 | + for key, value in pairs(itemReward) do | ||
| 143 | + itemReward[key] = math.ceil(1.5 * value) | ||
| 144 | + end | ||
| 145 | + end | ||
| 146 | + | ||
| 147 | + local r, change = role:award(itemReward, {log = {desc = "radioQuest", int1 = id}}) | ||
| 148 | + | ||
| 149 | + radioTask[id] = nil | ||
| 150 | + role:updateProperty({field="radioTask", value=radioTask, notNotify = true}) | ||
| 42 | 151 | ||
| 43 | - SendPacket(actionCodes.Email_listRpc, MsgPack.pack({list = result})) | 152 | + local msg = role:packReward(r, change) |
| 153 | + msg["big"] = bigSuccess | ||
| 154 | + msg["id"] = id | ||
| 155 | + SendPacket(actionCodes.Radio_finishQuestRpc, MsgPack.pack(msg)) | ||
| 44 | return true | 156 | return true |
| 45 | end | 157 | end |
| 46 | 158 |
src/models/Hero.lua
| @@ -115,4 +115,8 @@ function Hero:getRare() | @@ -115,4 +115,8 @@ function Hero:getRare() | ||
| 115 | return csvdb["unitCsv"][self:getProperty("type")].rare | 115 | return csvdb["unitCsv"][self:getProperty("type")].rare |
| 116 | end | 116 | end |
| 117 | 117 | ||
| 118 | +function Hero:getPosition() | ||
| 119 | + return csvdb["unitCsv"][self:getProperty("type")].position | ||
| 120 | +end | ||
| 121 | + | ||
| 118 | return Hero | 122 | return Hero |
| 119 | \ No newline at end of file | 123 | \ No newline at end of file |
src/models/Role.lua
| @@ -181,6 +181,7 @@ Role.schema = { | @@ -181,6 +181,7 @@ Role.schema = { | ||
| 181 | feedback = {"table", {}}, -- 反馈相关信息 {flag = false, count = 0} flag是否评论过,count 提示次数 | 181 | feedback = {"table", {}}, -- 反馈相关信息 {flag = false, count = 0} flag是否评论过,count 提示次数 |
| 182 | 182 | ||
| 183 | calTask = {"table", {}}, -- 英雄令活动 日历任务活动 | 183 | calTask = {"table", {}}, -- 英雄令活动 日历任务活动 |
| 184 | + radioTask = {"table", {}}, -- 电台任务 {id = {time=end_ts,heros=heros}} 表crusadeCsv | ||
| 184 | } | 185 | } |
| 185 | 186 | ||
| 186 | 187 | ||
| @@ -406,6 +407,7 @@ function Role:data() | @@ -406,6 +407,7 @@ function Role:data() | ||
| 406 | feedback = self:getProperty("feedback"), | 407 | feedback = self:getProperty("feedback"), |
| 407 | ctime = self:getProperty("ctime"), | 408 | ctime = self:getProperty("ctime"), |
| 408 | calTask = self:getProperty("calTask"), | 409 | calTask = self:getProperty("calTask"), |
| 410 | + radioTask = self:getProperty("radioTask"), | ||
| 409 | } | 411 | } |
| 410 | end | 412 | end |
| 411 | 413 |
src/models/RoleLog.lua
| @@ -107,6 +107,8 @@ local ItemReason = { | @@ -107,6 +107,8 @@ local ItemReason = { | ||
| 107 | unlockPool = 1208, -- 解锁英雄定向抽卡池 | 107 | unlockPool = 1208, -- 解锁英雄定向抽卡池 |
| 108 | downloadCv = 1209, -- 下载 cv包奖励 | 108 | downloadCv = 1209, -- 下载 cv包奖励 |
| 109 | refer = 1210, -- 穿戴 | 109 | refer = 1210, -- 穿戴 |
| 110 | + itemCompose = 1211, -- 天赋道具合成 | ||
| 111 | + radioQuest = 1212, -- 电台任务奖励 | ||
| 110 | 112 | ||
| 111 | -- pvp | 113 | -- pvp |
| 112 | pvpCHead = 1301, -- pvp 跨服竞技场头像 | 114 | pvpCHead = 1301, -- pvp 跨服竞技场头像 |