Commit 384bb077c785366a93be90ec5f6e5db08f6c0692
1 parent
ec87b4a5
挂机
Showing
5 changed files
with
187 additions
and
3 deletions
Show diff stats
src/ProtocolCode.lua
| ... | ... | @@ -44,6 +44,12 @@ actionCodes = { |
| 44 | 44 | Hero_loveTaskRpc = 213, |
| 45 | 45 | Hero_changeSkinRpc = 214, |
| 46 | 46 | |
| 47 | + Hang_startRpc = 251, | |
| 48 | + Hang_checkRpc = 252, | |
| 49 | + Hang_startBattleRpc = 253, | |
| 50 | + Hang_endBattleRpc = 254, | |
| 51 | + Hang_roleFormatRpc = 255, | |
| 52 | + | |
| 47 | 53 | } |
| 48 | 54 | |
| 49 | 55 | rpcResponseBegin = 10000 | ... | ... |
src/actions/AdvAction.lua
| ... | ... | @@ -35,14 +35,14 @@ function _M.roleFormatRpc(agent , data) |
| 35 | 35 | local role = agent.role |
| 36 | 36 | local msg = MsgPack.unpack(data) |
| 37 | 37 | local advTeam = role:getProperty("advTeam") |
| 38 | - for slot, heroId in ipairs(msg.heros) do | |
| 38 | + for slot, heroId in pairs(msg.heros) do | |
| 39 | 39 | if not role.heros[heroId] then |
| 40 | 40 | return |
| 41 | 41 | end |
| 42 | 42 | end |
| 43 | 43 | table.clear(advTeam) |
| 44 | 44 | advTeam.heros = {} |
| 45 | - for slot, heroId in ipairs(msg.heros) do | |
| 45 | + for slot, heroId in pairs(msg.heros) do | |
| 46 | 46 | advTeam.heros[slot] = heroId |
| 47 | 47 | end |
| 48 | 48 | role:updateProperty({field = "advTeam", value = advTeam}) | ... | ... |
| ... | ... | @@ -0,0 +1,164 @@ |
| 1 | +local ipairs = ipairs | |
| 2 | +local table = table | |
| 3 | +local math = math | |
| 4 | +local next = next | |
| 5 | +local string = string | |
| 6 | +local redisproxy = redisproxy | |
| 7 | +local MsgPack = MsgPack | |
| 8 | +local getRandomName = getRandomName | |
| 9 | +local mcast_util = mcast_util | |
| 10 | +local string_format = string.format | |
| 11 | +local tonumber = tonumber | |
| 12 | +local require = require | |
| 13 | +local table_insert = table.insert | |
| 14 | +local tconcat = table.concat | |
| 15 | +local table_unpack = table.unpack | |
| 16 | + | |
| 17 | +local _M = {} | |
| 18 | + | |
| 19 | +local function checkReward(role) | |
| 20 | + local hangInfo = role:getProperty("hangInfo") | |
| 21 | + if not hangInfo.carbonId or not hangInfo.coinTime or not hangInfo.itemTime then | |
| 22 | + return | |
| 23 | + end | |
| 24 | + local carbonData = csvdb["idle_battleCsv"][hangInfo.carbonId] | |
| 25 | + local nowTime = skynet.timex() | |
| 26 | + | |
| 27 | + local coinCount = math.floor((nowTime - hangInfo.coinTime) / 5) | |
| 28 | + hangInfo.coinTime = hangInfo.coinTime + coinCount * 5 | |
| 29 | + | |
| 30 | + local itemCount = math.floor((nowTime - hangInfo.itemTime) / 60) | |
| 31 | + hangInfo.itemTime = hangInfo.itemTime + itemCount * 60 | |
| 32 | + | |
| 33 | + local items = role:getProperty("hangBag") | |
| 34 | + items[ItemId.Gold] = (items[ItemId.Gold] or 0) + coinCount * carbonData.money | |
| 35 | + items[ItemId.Exp] = (items[ItemId.Exp] or 0) + coinCount * carbonData.exp | |
| 36 | + | |
| 37 | + local pool = {} | |
| 38 | + for _, temp in pairs(carbonData.item:toArray()) do | |
| 39 | + table.insert(pool, temp:toArray(true, "=")) | |
| 40 | + end | |
| 41 | + for i = 1, itemCount do | |
| 42 | + local cur = pool[math.randWeight(pool, 3)] | |
| 43 | + items[cur[1]] = (items[cur[1]] or 0) + cur[2] | |
| 44 | + end | |
| 45 | + | |
| 46 | + if coinCount > 0 or itemCount > 0 then | |
| 47 | + role:updateProperty({field = "hangBag", value = items}) | |
| 48 | + role:updateProperty({field = "hangInfo", value = hangInfo}) | |
| 49 | + end | |
| 50 | +end | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | +--开始一个新的关卡 | |
| 55 | +function _M.startRpc( agent, data ) | |
| 56 | + local role = agent.role | |
| 57 | + local msg = MsgPack.unpack(data) | |
| 58 | + local carbonId = msg.carbonId | |
| 59 | + local carbonData = csvdb["idle_battleCsv"][carbonId] | |
| 60 | + if not carbonData then return end | |
| 61 | + | |
| 62 | + local hangPass = role:getProperty("hangPass") | |
| 63 | + if carbonData.prepose ~= "" and carbonData.prepose ~= 0 and not hangPass[carbonData.prepose] then return end | |
| 64 | + | |
| 65 | + checkReward(role) | |
| 66 | + | |
| 67 | + local hangInfo = role:getProperty("hangInfo") | |
| 68 | + table.clear(hangInfo) | |
| 69 | + hangInfo.carbonId = carbonId | |
| 70 | + local nowTime = skynet.timex() | |
| 71 | + hangInfo.coinTime = nowTime | |
| 72 | + hangInfo.itemTime = nowTime | |
| 73 | + if not hangPass[carbonId] then | |
| 74 | + hangInfo.bossTime = nowTime + 100 | |
| 75 | + end | |
| 76 | + role:updateProperty({field = "hangInfo", value = hangInfo}) | |
| 77 | + | |
| 78 | + SendPacket(actionCodes.Hang_startRpc, '') | |
| 79 | + return true | |
| 80 | +end | |
| 81 | + | |
| 82 | +-- 每隔1分钟检查一次 | |
| 83 | +function _M.checkRpc(agent, data) | |
| 84 | + local role = agent.role | |
| 85 | + -- local msg = MsgPack.unpack(data) | |
| 86 | + checkReward(role) | |
| 87 | + SendPacket(actionCodes.Hang_checkRpc, MsgPack.pack({})) | |
| 88 | + return true | |
| 89 | +end | |
| 90 | + | |
| 91 | +function _M.startBattleRpc(agent, data) | |
| 92 | + local role = agent.role | |
| 93 | + local msg = MsgPack.unpack(data) | |
| 94 | + local hangInfo = role:getProperty("hangInfo") | |
| 95 | + if msg.carbonId ~= hangInfo.carbonId then return end | |
| 96 | + local hangPass = role:getProperty("hangPass") | |
| 97 | + if hangPass[hangInfo.carbonId] then return end | |
| 98 | + local key = tostring(math.random()) | |
| 99 | + hangInfo.key = key | |
| 100 | + local nowTime = skynet.timex() | |
| 101 | + hangInfo.bossTime = nowTime + 100 | |
| 102 | + role:updateProperty({field = "hangInfo", value = hangInfo}) | |
| 103 | + SendPacket(actionCodes.Hang_startBattleRpc, MsgPack.pack({key = key})) | |
| 104 | + return true | |
| 105 | +end | |
| 106 | + | |
| 107 | +function _M.endBattleRpc(agent, data) | |
| 108 | + local role = agent.role | |
| 109 | + local msg = MsgPack.unpack(data) | |
| 110 | + local hangInfo = role:getProperty("hangInfo") | |
| 111 | + if not msg.key or msg.key ~= hangInfo.key then return end | |
| 112 | + if msg.carbonId ~= hangInfo.carbonId then return end | |
| 113 | + local hangPass = role:getProperty("hangPass") | |
| 114 | + if hangPass[hangInfo.carbonId] then return end | |
| 115 | + local reward | |
| 116 | + if msg.starNum and msg.starNum > 0 then --win | |
| 117 | + hangPass[hangInfo.carbonId] = 1 | |
| 118 | + role:updateProperty({field = "hangPass", value = hangPass}) | |
| 119 | + hangInfo.bossTime = nil | |
| 120 | + | |
| 121 | + -- reward | |
| 122 | + reward = {} | |
| 123 | + local items = role:getProperty("hangBag") | |
| 124 | + local carbonData = csvdb["idle_battleCsv"][carbonId] | |
| 125 | + items[ItemId.Gold] = (items[ItemId.Gold] or 0) + carbonData.money_clear | |
| 126 | + items[ItemId.Exp] = (items[ItemId.Exp] or 0) + carbonData.exp_clear | |
| 127 | + reward[ItemId.Gold] = carbonData.money_clear | |
| 128 | + reward[ItemId.Exp] = carbonData.exp_clear | |
| 129 | + for itemId, count in pairs(carbonData.item_clear:toNumMap()) do | |
| 130 | + items[itemId] = (items[itemId] or 0) + count | |
| 131 | + reward[itemId] = count | |
| 132 | + end | |
| 133 | + end | |
| 134 | + hangInfo.key = nil | |
| 135 | + role:updateProperty({field = "hangInfo", value = hangInfo}) | |
| 136 | + SendPacket(actionCodes.Hang_endBattleRpc, MsgPack.pack({ | |
| 137 | + starNum = msg.starNum, | |
| 138 | + reward = reward, | |
| 139 | + })) | |
| 140 | + return true | |
| 141 | +end | |
| 142 | + | |
| 143 | +function _M.roleFormatRpc(agent , data) | |
| 144 | + local role = agent.role | |
| 145 | + local msg = MsgPack.unpack(data) | |
| 146 | + local hangTeam = role:getProperty("hangTeam") | |
| 147 | + for slot, heroId in pairs(msg.heros) do | |
| 148 | + if not role.heros[heroId] then | |
| 149 | + return | |
| 150 | + end | |
| 151 | + end | |
| 152 | + table.clear(hangTeam) | |
| 153 | + hangTeam.heros = {} | |
| 154 | + for slot, heroId in pairs(msg.heros) do | |
| 155 | + hangTeam.heros[slot] = heroId | |
| 156 | + end | |
| 157 | + hangTeam.leader = msg.leader | |
| 158 | + | |
| 159 | + role:updateProperty({field = "hangTeam", value = hangTeam}) | |
| 160 | + SendPacket(actionCodes.Hang_roleFormatRpc, '') | |
| 161 | + return true | |
| 162 | +end | |
| 163 | + | |
| 164 | +return _M | |
| 0 | 165 | \ No newline at end of file | ... | ... |
src/adv/AdvBattle.lua
| ... | ... | @@ -38,7 +38,7 @@ function Battle:initPlayer() |
| 38 | 38 | end |
| 39 | 39 | end |
| 40 | 40 | player.hp = hp |
| 41 | - player.atk = player.hp * 0.1 --todo 系数是临时的 | |
| 41 | + player.atk = tonumber(string.format("%0.0f", player.hp * 0.1)) --todo 系数是临时的 | |
| 42 | 42 | player.miss = 0 |
| 43 | 43 | player.hit = 100 |
| 44 | 44 | self.adv.advTeam.player = player | ... | ... |
src/models/Role.lua
| ... | ... | @@ -42,6 +42,13 @@ Role.schema = { |
| 42 | 42 | advInfo = {"table", {}}, -- 冒险关卡信息 |
| 43 | 43 | advTeam = {"table", {}}, -- 冒险玩家队伍信息 |
| 44 | 44 | |
| 45 | + --挂机相关 | |
| 46 | + hangPass = {"table", {}}, -- 挂机通过的最大关卡 | |
| 47 | + hangTeam = {"table", {}}, -- 挂机队伍 | |
| 48 | + hangInfo = {"table", {}}, -- 当前挂机信息 | |
| 49 | + hangBag = {"table", {}}, -- 背包 | |
| 50 | + hangBagLimit = {"number", 10}, --背包上限 | |
| 51 | + | |
| 45 | 52 | } |
| 46 | 53 | |
| 47 | 54 | |
| ... | ... | @@ -144,10 +151,17 @@ function Role:data() |
| 144 | 151 | reDiamond = self:getProperty("reDiamond"), |
| 145 | 152 | items = self:getProperty("items"):toNumMap(), |
| 146 | 153 | loveStatus = self:getProperty("loveStatus"):toNumMap(), |
| 154 | + | |
| 147 | 155 | advPass = self:getProperty("advPass"), |
| 148 | 156 | advInfo = self:getProperty("advInfo"), |
| 149 | 157 | advItems = self:getProperty("advItems"):toNumMap(), |
| 150 | 158 | advTeam = self:getProperty("advTeam"), |
| 159 | + | |
| 160 | + hangPass = self:getProperty("hangPass"), | |
| 161 | + hangTeam = self:getProperty("hangTeam"), | |
| 162 | + hangInfo = self:getProperty("hangInfo"), | |
| 163 | + hangBag = self:getProperty("hangBag"), | |
| 164 | + hangBagLimit = self:getProperty("hangBagLimit"), | |
| 151 | 165 | } |
| 152 | 166 | end |
| 153 | 167 | ... | ... |