Commit ec026b77bafd94f8ece6c592e4565b47c2ad680b
Merge branch 'develop' into player
Showing
46 changed files
with
1845 additions
and
830 deletions
Show diff stats
src/GlobalVar.lua
| @@ -134,6 +134,9 @@ TimeReset = { | @@ -134,6 +134,9 @@ TimeReset = { | ||
| 134 | DailyBattle2 = 14, -- 特殊-每日副本(贴纸) | 134 | DailyBattle2 = 14, -- 特殊-每日副本(贴纸) |
| 135 | DailyBattle1 = 15, -- 特殊-每日副本(装备) | 135 | DailyBattle1 = 15, -- 特殊-每日副本(装备) |
| 136 | DailyBattle3 = 16, -- 特殊-每日副本(时钟箱) | 136 | DailyBattle3 = 16, -- 特殊-每日副本(时钟箱) |
| 137 | + DrawType1 = 17, -- 变异 抽卡加成 | ||
| 138 | + DrawType2 = 18, -- 通常 抽卡加成 | ||
| 139 | + DrawType3 = 19, -- 魔法 抽卡加成 | ||
| 137 | } | 140 | } |
| 138 | 141 | ||
| 139 | GuideStep = { | 142 | GuideStep = { |
| @@ -191,7 +194,7 @@ AdvBackEventType = { | @@ -191,7 +194,7 @@ AdvBackEventType = { | ||
| 191 | Trader = 12, -- 召唤商人 | 194 | Trader = 12, -- 召唤商人 |
| 192 | Monster = 13, -- 召唤怪物 | 195 | Monster = 13, -- 召唤怪物 |
| 193 | RelayReward = 14, -- 中级层奖励 | 196 | RelayReward = 14, -- 中级层奖励 |
| 194 | - | 197 | + Exp = 15, -- 经验飘字 |
| 195 | Cost = 16, -- 消耗道具 | 198 | Cost = 16, -- 消耗道具 |
| 196 | Trap = 17, --陷阱 | 199 | Trap = 17, --陷阱 |
| 197 | Layer = 18, --切换层 | 200 | Layer = 18, --切换层 |
src/ProtocolCode.lua
| @@ -41,6 +41,7 @@ actionCodes = { | @@ -41,6 +41,7 @@ actionCodes = { | ||
| 41 | Role_changeHeadRpc = 127, | 41 | Role_changeHeadRpc = 127, |
| 42 | Role_openSpeedUpBoxRpc = 128, | 42 | Role_openSpeedUpBoxRpc = 128, |
| 43 | Role_guideRpc = 129, | 43 | Role_guideRpc = 129, |
| 44 | + Role_getRandomNameRpc = 130, | ||
| 44 | 45 | ||
| 45 | Adv_startAdvRpc = 151, | 46 | Adv_startAdvRpc = 151, |
| 46 | Adv_startHangRpc = 152, | 47 | Adv_startHangRpc = 152, |
| @@ -97,6 +98,7 @@ actionCodes = { | @@ -97,6 +98,7 @@ actionCodes = { | ||
| 97 | Hang_buyBonusCountRpc = 259, | 98 | Hang_buyBonusCountRpc = 259, |
| 98 | Hang_startBonusBattleRpc = 260, | 99 | Hang_startBonusBattleRpc = 260, |
| 99 | Hang_endBonusBattleRpc = 261, | 100 | Hang_endBonusBattleRpc = 261, |
| 101 | + Hang_hangGiftRpc = 262, | ||
| 100 | 102 | ||
| 101 | Diner_updateProperty = 300, | 103 | Diner_updateProperty = 300, |
| 102 | Diner_addSellRpc = 301, | 104 | Diner_addSellRpc = 301, |
| @@ -179,6 +181,9 @@ actionCodes = { | @@ -179,6 +181,9 @@ actionCodes = { | ||
| 179 | Email_checkRpc = 603, | 181 | Email_checkRpc = 603, |
| 180 | Email_delRpc = 604, | 182 | Email_delRpc = 604, |
| 181 | 183 | ||
| 184 | + Activity_sudokuRpc = 650, | ||
| 185 | + Activity_signRpc = 651, | ||
| 186 | + Activity_sudokuRewardRpc = 652, | ||
| 182 | } | 187 | } |
| 183 | 188 | ||
| 184 | rpcResponseBegin = 10000 | 189 | rpcResponseBegin = 10000 |
| @@ -0,0 +1,138 @@ | @@ -0,0 +1,138 @@ | ||
| 1 | +local ipairs = ipairs | ||
| 2 | +local table = table | ||
| 3 | +local math = math | ||
| 4 | +local string = string | ||
| 5 | +local redisproxy = redisproxy | ||
| 6 | +local MsgPack = MsgPack | ||
| 7 | +local string_format = string.format | ||
| 8 | +local tonumber = tonumber | ||
| 9 | +local table_insert = table.insert | ||
| 10 | +local table_unpack = table.unpack | ||
| 11 | +local table_find = table.find | ||
| 12 | +local table_nums = table.nums | ||
| 13 | +local math_random = math.randomInt | ||
| 14 | + | ||
| 15 | + | ||
| 16 | +local _M = {} | ||
| 17 | + | ||
| 18 | + | ||
| 19 | +function _M.sudokuRpc(agent, data) | ||
| 20 | + local role = agent.role | ||
| 21 | + local msg = MsgPack.unpack(data) | ||
| 22 | + local id = msg.id | ||
| 23 | + | ||
| 24 | + local sudoku = role:getProperty("sudoku") | ||
| 25 | + local phase = sudoku[-1] or 1 | ||
| 26 | + local curData = (csvdb["guide_sudokuCsv"][phase] or {})[id] | ||
| 27 | + if phase == -1 or not curData then return 1 end | ||
| 28 | + | ||
| 29 | + sudoku.task = sudoku.task or {} | ||
| 30 | + sudoku.task[phase] = sudoku.task[phase] or {} | ||
| 31 | + | ||
| 32 | + if (sudoku.task[phase][id] or 0) < curData.con1 then return 2 end | ||
| 33 | + | ||
| 34 | + sudoku.task[phase][id] = -1 | ||
| 35 | + local task = role:award(curData.reward, {log = {desc = "sudoku", int1 = id, int2 = phase}}) -- 任务奖励 | ||
| 36 | + | ||
| 37 | + local reward = {} | ||
| 38 | + local rId = {} | ||
| 39 | + for pid, pdata in pairs(csvdb["guide_sudoku_rewardCsv"][phase] or {}) do | ||
| 40 | + local pos = pdata.pos:toArray(true, "=") | ||
| 41 | + local ok, is = true, false | ||
| 42 | + for _, one in pairs(pos) do | ||
| 43 | + if one == id then | ||
| 44 | + is = true | ||
| 45 | + end | ||
| 46 | + if sudoku.task[phase][one] ~= -1 then | ||
| 47 | + ok = false | ||
| 48 | + break | ||
| 49 | + end | ||
| 50 | + end | ||
| 51 | + | ||
| 52 | + if ok and is then | ||
| 53 | + for itemId, count in pairs(pdata.reward:toNumMap()) do | ||
| 54 | + reward[itemId] = (reward[itemId] or 0) + count | ||
| 55 | + end | ||
| 56 | + table.insert(rId, pid) | ||
| 57 | + end | ||
| 58 | + end | ||
| 59 | + | ||
| 60 | + if not next(reward) then | ||
| 61 | + reward = nil | ||
| 62 | + else | ||
| 63 | + reward = role:award(reward, {log = {desc = "sudokuR", int1 = id, int2 = phase}}) | ||
| 64 | + end | ||
| 65 | + | ||
| 66 | + role:updateProperty({field = "sudoku", value = sudoku}) | ||
| 67 | + | ||
| 68 | + role:log("act_action", {desc = "sudoku", int1 = id, int2 = phase}) | ||
| 69 | + | ||
| 70 | + SendPacket(actionCodes.Activity_sudokuRpc, MsgPack.pack({task = task, reward = reward, rId = rId})) | ||
| 71 | + return true | ||
| 72 | +end | ||
| 73 | + | ||
| 74 | +function _M.sudokuRewardRpc(agent, data) | ||
| 75 | + local role = agent.role | ||
| 76 | + | ||
| 77 | + | ||
| 78 | + local sudoku = role:getProperty("sudoku") | ||
| 79 | + local phase = sudoku[-1] or 1 | ||
| 80 | + | ||
| 81 | + local curData = csvdb["guide_sudokuCsv"][phase] | ||
| 82 | + if not curData then return end | ||
| 83 | + if not globalCsv.guide_sudoku_reward[phase] then return end | ||
| 84 | + | ||
| 85 | + local curTask = (sudoku.task or {})[phase] or {} | ||
| 86 | + | ||
| 87 | + for id, _ in pairs(curData) do | ||
| 88 | + if curTask[id] ~= -1 then | ||
| 89 | + return | ||
| 90 | + end | ||
| 91 | + end | ||
| 92 | + | ||
| 93 | + local reward = role:award(globalCsv.guide_sudoku_reward[phase], {log = {desc = "sudokuRP", int1 = phase}}) | ||
| 94 | + | ||
| 95 | + sudoku[-1] = phase + 1 | ||
| 96 | + sudoku.task[phase] = nil | ||
| 97 | + if not csvdb["guide_sudokuCsv"][sudoku[-1]] then | ||
| 98 | + sudoku[-1] = -1 | ||
| 99 | + sudoku.task = nil | ||
| 100 | + end | ||
| 101 | + role:updateProperty({field = "sudoku", value = sudoku}) | ||
| 102 | + | ||
| 103 | + SendPacket(actionCodes.Activity_sudokuRewardRpc, MsgPack.pack(reward)) | ||
| 104 | + return true | ||
| 105 | +end | ||
| 106 | + | ||
| 107 | + | ||
| 108 | +function _M.signRpc(agent, data) | ||
| 109 | + local role = agent.role | ||
| 110 | + | ||
| 111 | + local serverT = skynet.timex() | ||
| 112 | + local tm = os.date("*t", serverT) | ||
| 113 | + | ||
| 114 | + local curDay = tm.day | ||
| 115 | + | ||
| 116 | + local yearMonth = tm.year * 100 + tm.month | ||
| 117 | + local monthData = csvdb["daily_signInCsv"][yearMonth] | ||
| 118 | + if not monthData or not monthData[curDay] then | ||
| 119 | + return 1 | ||
| 120 | + end | ||
| 121 | + | ||
| 122 | + local signs = role:getProperty("sign") | ||
| 123 | + if signs[curDay] == yearMonth then -- 未重置的还可以签到正常(本月已经签到) | ||
| 124 | + return 2 | ||
| 125 | + end | ||
| 126 | + signs[curDay] = yearMonth | ||
| 127 | + | ||
| 128 | + local raward = role:award(monthData[curDay].item, {log = {desc = "sign", int1 = yearMonth, int2 = curDay}}) | ||
| 129 | + role:changeUpdates({{type = "sign", field = curDay, value = yearMonth}}) | ||
| 130 | + | ||
| 131 | + SendPacket(actionCodes.Activity_signRpc, MsgPack.pack(raward)) | ||
| 132 | + return true | ||
| 133 | +end | ||
| 134 | + | ||
| 135 | + | ||
| 136 | + | ||
| 137 | + | ||
| 138 | +return _M | ||
| 0 | \ No newline at end of file | 139 | \ No newline at end of file |
src/actions/AdvAction.lua
| @@ -104,21 +104,24 @@ function _M.startAdvRpc( agent, data ) | @@ -104,21 +104,24 @@ function _M.startAdvRpc( agent, data ) | ||
| 104 | if not role:isFuncOpen(FuncOpenType.AdvEndless) then return 11 end -- 无尽模式 才可以玩儿无尽模式 | 104 | if not role:isFuncOpen(FuncOpenType.AdvEndless) then return 11 end -- 无尽模式 才可以玩儿无尽模式 |
| 105 | 105 | ||
| 106 | local advElM = role:getProperty("advElM") --最高通关的层数 | 106 | local advElM = role:getProperty("advElM") --最高通关的层数 |
| 107 | + if not role:advChapterIsOpen(chapterId) then return 13 end | ||
| 107 | 108 | ||
| 108 | - if layer == 1 then | ||
| 109 | - if not role:advChapterIsOpen(chapterId, layer) then return 13 end | ||
| 110 | - else | 109 | + if layer ~= 1 then |
| 111 | local relayData = role:getAdvData():isHaveRelay(layer, chapterId) | 110 | local relayData = role:getAdvData():isHaveRelay(layer, chapterId) |
| 112 | - if not relayData then return end -- 不是中继层 | ||
| 113 | - if advElM < relayData.unlockfloor then return end --未解锁 | 111 | + if not relayData then return 14 end -- 不是中继层 |
| 112 | + if advElM < relayData.unlockfloor then return 15 end --未解锁 | ||
| 114 | end | 113 | end |
| 115 | else -- 普通模式判断 | 114 | else -- 普通模式判断 |
| 116 | if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return 2 end -- 是否有体力 | 115 | if role.dailyData:getProperty("advC") >= role:getAdvHangLimit() then return 2 end -- 是否有体力 |
| 117 | - if layer > chapterData.limitlevel then return 4 end | 116 | + if layer >= chapterData.limitlevel then return 4 end |
| 118 | -- 关卡开放判断 | 117 | -- 关卡开放判断 |
| 119 | - if not role:advChapterIsOpen(chapterId, layer) then return 5 end | ||
| 120 | - -- 普通模式没有中继 只能从1 开始 中继开放判断 | ||
| 121 | - if layer ~= 1 then return 6 end | 118 | + if not role:advChapterIsOpen(chapterId) then return 5 end |
| 119 | + | ||
| 120 | + if layer ~= 1 then | ||
| 121 | + local relayData = role:getAdvData():isHaveRelay(layer, chapterId) | ||
| 122 | + if not relayData then return 6 end -- 不是中继层 | ||
| 123 | + if (advPass[chapterId] or 0) < relayData.floor then return 21 end | ||
| 124 | + end | ||
| 122 | end | 125 | end |
| 123 | 126 | ||
| 124 | if not checkFormat(role, format) then return 7 end | 127 | if not checkFormat(role, format) then return 7 end |
| @@ -158,8 +161,13 @@ function _M.startAdvRpc( agent, data ) | @@ -158,8 +161,13 @@ function _M.startAdvRpc( agent, data ) | ||
| 158 | end | 161 | end |
| 159 | end | 162 | end |
| 160 | end | 163 | end |
| 161 | - | ||
| 162 | - role:getAdvData():initByChapter(chapterId, layer, false, false, layer ~= 1, true, support) | 164 | + role:getAdvData():initByChapter({ |
| 165 | + chapterId = chapterId, | ||
| 166 | + level = layer, | ||
| 167 | + isRelay = layer ~= 1, | ||
| 168 | + isEnter = true, | ||
| 169 | + support = support, | ||
| 170 | + }) | ||
| 163 | role:checkTaskEnter("AdvStart", {id = chapterId}) | 171 | role:checkTaskEnter("AdvStart", {id = chapterId}) |
| 164 | role:checkTaskEnter("AdvStartSelf", {id = chapterId}) | 172 | role:checkTaskEnter("AdvStartSelf", {id = chapterId}) |
| 165 | role:getAdvData():popBackEvents() -- 清一下事件 | 173 | role:getAdvData():popBackEvents() -- 清一下事件 |
| @@ -242,11 +250,11 @@ function _M.quickHangRpc(agent, data) | @@ -242,11 +250,11 @@ function _M.quickHangRpc(agent, data) | ||
| 242 | local cost = math.ceil((info.time - skynet.timex()) / chapterData.idleTime * chapterData.accelerate) | 250 | local cost = math.ceil((info.time - skynet.timex()) / chapterData.idleTime * chapterData.accelerate) |
| 243 | 251 | ||
| 244 | if not role:checkItemEnough({[ItemId.Diamond] = cost}) then return end | 252 | if not role:checkItemEnough({[ItemId.Diamond] = cost}) then return end |
| 245 | - role:costItems({[ItemId.Diamond] = cost}, {log = {desc = "quickHang", int1 = chapterId}}) | 253 | + role:costItems({[ItemId.Diamond] = cost}, {log = {desc = "advQuickHang", int1 = chapterId}}) |
| 246 | info.time = 0 | 254 | info.time = 0 |
| 247 | role:changeUpdates({{type = "advHang", field = chapterId, value = info}}) | 255 | role:changeUpdates({{type = "advHang", field = chapterId, value = info}}) |
| 248 | 256 | ||
| 249 | - role:log("adv_action", {desc = "quickHang", int1 = chapterId}) | 257 | + role:log("adv_action", {desc = "advQuickHang", int1 = chapterId}) |
| 250 | 258 | ||
| 251 | SendPacket(actionCodes.Adv_quickHangRpc, '') | 259 | SendPacket(actionCodes.Adv_quickHangRpc, '') |
| 252 | return true | 260 | return true |
| @@ -511,6 +519,8 @@ function _M.upArtifactRpc(agent, data) | @@ -511,6 +519,8 @@ function _M.upArtifactRpc(agent, data) | ||
| 511 | adv:backCost(cost) | 519 | adv:backCost(cost) |
| 512 | if status == 1 then -- 现在穿着呢。更新下 | 520 | if status == 1 then -- 现在穿着呢。更新下 |
| 513 | adv:saveDB() | 521 | adv:saveDB() |
| 522 | + else | ||
| 523 | + adv:updateAchievement() | ||
| 514 | end | 524 | end |
| 515 | SendPacket(actionCodes.Adv_upArtifactRpc, '') | 525 | SendPacket(actionCodes.Adv_upArtifactRpc, '') |
| 516 | return true | 526 | return true |
src/actions/CarAction.lua
| @@ -103,7 +103,7 @@ function _M.runeUpRpc( agent, data ) | @@ -103,7 +103,7 @@ function _M.runeUpRpc( agent, data ) | ||
| 103 | local uid = msg.uid | 103 | local uid = msg.uid |
| 104 | local ownRune = role.runeBag[uid] | 104 | local ownRune = role.runeBag[uid] |
| 105 | if not ownRune then return 1 end | 105 | if not ownRune then return 1 end |
| 106 | - if ownRune:getProperty("refer") ~= 0 then return 2 end | 106 | + |
| 107 | 107 | ||
| 108 | local typ = ownRune:getProperty("type") | 108 | local typ = ownRune:getProperty("type") |
| 109 | local id = ownRune:getProperty("id") | 109 | local id = ownRune:getProperty("id") |
| @@ -126,6 +126,12 @@ function _M.runeUpRpc( agent, data ) | @@ -126,6 +126,12 @@ function _M.runeUpRpc( agent, data ) | ||
| 126 | ownRune:updateProperty({field = "level",value = level+1}) | 126 | ownRune:updateProperty({field = "level",value = level+1}) |
| 127 | role:checkTaskEnter("RuneUp") | 127 | role:checkTaskEnter("RuneUp") |
| 128 | 128 | ||
| 129 | + if ownRune:getProperty("refer") ~= 0 then | ||
| 130 | + local hero = role.heros[ownRune:getProperty("refer")] | ||
| 131 | + if hero then | ||
| 132 | + hero:updateProperty({field = "battleV", value = hero:getBattleValue()}) | ||
| 133 | + end | ||
| 134 | + end | ||
| 129 | ownRune:log({desc = "runeUp", int1 = level + 1}) | 135 | ownRune:log({desc = "runeUp", int1 = level + 1}) |
| 130 | 136 | ||
| 131 | SendPacket(actionCodes.Car_runeUpRpc, '') | 137 | SendPacket(actionCodes.Car_runeUpRpc, '') |
src/actions/DinerAction.lua
| @@ -364,8 +364,7 @@ function _M.talentUpRpc( agent, data ) | @@ -364,8 +364,7 @@ function _M.talentUpRpc( agent, data ) | ||
| 364 | end | 364 | end |
| 365 | 365 | ||
| 366 | if talentData.levelFront ~= "" then | 366 | if talentData.levelFront ~= "" then |
| 367 | - local hangPass = role:getProperty("hangPass") | ||
| 368 | - if not hangPass[tonumber(talentData.levelFront)] then | 367 | + if not role:checkHangPass(tonumber(talentData.levelFront)) then |
| 369 | return 9 | 368 | return 9 |
| 370 | end | 369 | end |
| 371 | end | 370 | end |
| @@ -399,7 +398,7 @@ function _M.talentUpRpc( agent, data ) | @@ -399,7 +398,7 @@ function _M.talentUpRpc( agent, data ) | ||
| 399 | -- role:award(treePoint) | 398 | -- role:award(treePoint) |
| 400 | -- end | 399 | -- end |
| 401 | 400 | ||
| 402 | - role:checkTaskEnter("DinerTalentUp", {type = talentData.effect:toArray(true,"=")[1]}) | 401 | + role:checkTaskEnter("DinerTalentUp", {type = talentData.effect:toArray(true,"=")[1], level = dishLevel + 1}) |
| 403 | 402 | ||
| 404 | role:log("diner_action", {desc = "talentUp", int1 = dish, int2 = dishLevel + 1}) | 403 | role:log("diner_action", {desc = "talentUp", int1 = dish, int2 = dishLevel + 1}) |
| 405 | 404 | ||
| @@ -635,8 +634,7 @@ function _M.addWantFoodRpc(agent , data) | @@ -635,8 +634,7 @@ function _M.addWantFoodRpc(agent , data) | ||
| 635 | local foodData = csvdb["diner_materialCsv"][itemId] | 634 | local foodData = csvdb["diner_materialCsv"][itemId] |
| 636 | if not foodData then return 3 end | 635 | if not foodData then return 3 end |
| 637 | if foodData.unlock ~= 0 then | 636 | if foodData.unlock ~= 0 then |
| 638 | - local hangPass = role:getProperty("hangPass") | ||
| 639 | - if not hangPass[foodData.unlock] then | 637 | + if not role:checkHangPass(foodData.unlock) then |
| 640 | return 4 | 638 | return 4 |
| 641 | end | 639 | end |
| 642 | end | 640 | end |
| @@ -683,7 +681,7 @@ function _M.getGreenhouseRpc( agent, data ) | @@ -683,7 +681,7 @@ function _M.getGreenhouseRpc( agent, data ) | ||
| 683 | end | 681 | end |
| 684 | end | 682 | end |
| 685 | role.dinerData:updateProperty({field = "gfood", value = gfood}) | 683 | role.dinerData:updateProperty({field = "gfood", value = gfood}) |
| 686 | - local reward = role:award(reward, {log = {desc = "greenHourse"}}) | 684 | + local reward = role:award(reward, {log = {desc = "greenHourse", int1 = level}}) |
| 687 | role:checkTaskEnter("FoodMGet") | 685 | role:checkTaskEnter("FoodMGet") |
| 688 | 686 | ||
| 689 | role:log("diner_action", {desc = "greenHourse"}) | 687 | role:log("diner_action", {desc = "greenHourse"}) |
src/actions/FriendAction.lua
| @@ -316,11 +316,15 @@ function _M.handleApplyRpc(agent, data) | @@ -316,11 +316,15 @@ function _M.handleApplyRpc(agent, data) | ||
| 316 | end | 316 | end |
| 317 | 317 | ||
| 318 | redisproxy:pipelining(function (red) | 318 | redisproxy:pipelining(function (red) |
| 319 | - red:ZREM(FRIEND_APPLY_KEY:format(roleId), table_unpack(needAdd)) | ||
| 320 | - red:HMSET(FRIEND_KEY:format(roleId), table_unpack(needAddMy)) | ||
| 321 | - for _, objectId in pairs(needAdd) do | ||
| 322 | - red:ZREM(FRIEND_APPLY_KEY:format(objectId), roleId) | ||
| 323 | - red:hsetnx(FRIEND_KEY:format(objectId), roleId, newTag)--告知对放有新好友 | 319 | + if next(needAdd) then |
| 320 | + red:ZREM(FRIEND_APPLY_KEY:format(roleId), table_unpack(needAdd)) | ||
| 321 | + for _, objectId in pairs(needAdd) do | ||
| 322 | + red:ZREM(FRIEND_APPLY_KEY:format(objectId), roleId) | ||
| 323 | + red:hsetnx(FRIEND_KEY:format(objectId), roleId, newTag)--告知对放有新好友 | ||
| 324 | + end | ||
| 325 | + end | ||
| 326 | + if next(needAddMy) then | ||
| 327 | + red:HMSET(FRIEND_KEY:format(roleId), table_unpack(needAddMy)) | ||
| 324 | end | 328 | end |
| 325 | end) | 329 | end) |
| 326 | local myInfo = role:friendSInfo() | 330 | local myInfo = role:friendSInfo() |
src/actions/GmAction.lua
| @@ -16,7 +16,7 @@ function _M.clientRequest(agent, data) | @@ -16,7 +16,7 @@ function _M.clientRequest(agent, data) | ||
| 16 | end | 16 | end |
| 17 | 17 | ||
| 18 | function _M.testhotfix(role, pms) | 18 | function _M.testhotfix(role, pms) |
| 19 | - return csvdb["itemCsv"][1]["name"] .. " -=- " .. csvdb["itemCsv"][2]["name"] .. " -=- " .. role:getItemCount(123) .. " -=- " .. table.pack(next(role.heros))[2]:getBattleValue() | 19 | + return csvdb["itemCsv"][1]["name"] .. " -=- " .. globalCsv["codeVersion"] .. " -=- " .. role:getItemCount(123) .. " -=- " .. table.pack(next(role.heros))[2]:getBattleValue() |
| 20 | end | 20 | end |
| 21 | 21 | ||
| 22 | function _M.ignoreout(role, pms) | 22 | function _M.ignoreout(role, pms) |
| @@ -178,19 +178,17 @@ table.insert(helpDes, {"通关挂机副本", "fb", "挂卡id"}) | @@ -178,19 +178,17 @@ table.insert(helpDes, {"通关挂机副本", "fb", "挂卡id"}) | ||
| 178 | function _M.fb(role, pms) -- 直接通关 | 178 | function _M.fb(role, pms) -- 直接通关 |
| 179 | local carbonId = tonum(pms.pm1) | 179 | local carbonId = tonum(pms.pm1) |
| 180 | if not csvdb["idle_battleCsv"][carbonId] then return "不存在的carbon" end | 180 | if not csvdb["idle_battleCsv"][carbonId] then return "不存在的carbon" end |
| 181 | - local passCarbon = role:getProperty("hangPass") | ||
| 182 | local addPre | 181 | local addPre |
| 183 | addPre = function(carbonId) | 182 | addPre = function(carbonId) |
| 184 | local carbonData = csvdb["idle_battleCsv"][carbonId] | 183 | local carbonData = csvdb["idle_battleCsv"][carbonId] |
| 185 | for _, pre in ipairs(carbonData.prepose:toArray(true, "=")) do | 184 | for _, pre in ipairs(carbonData.prepose:toArray(true, "=")) do |
| 186 | - passCarbon[pre] = 1 | 185 | + role:hangFinish(pre) |
| 187 | role:checkTaskEnter("HangPass", {id = pre}) | 186 | role:checkTaskEnter("HangPass", {id = pre}) |
| 188 | addPre(pre) | 187 | addPre(pre) |
| 189 | end | 188 | end |
| 190 | end | 189 | end |
| 191 | - passCarbon[carbonId] = 1 | 190 | + role:hangFinish(carbonId) |
| 192 | addPre(carbonId) | 191 | addPre(carbonId) |
| 193 | - role:updateProperty({field = "hangPass", value = passCarbon}) | ||
| 194 | 192 | ||
| 195 | role:log("gm_action", {desc = "fb", int1 = carbonId, key1 = pms.sender}) | 193 | role:log("gm_action", {desc = "fb", int1 = carbonId, key1 = pms.sender}) |
| 196 | 194 | ||
| @@ -207,14 +205,14 @@ function _M.fbc(role, pms) -- 直接通关 | @@ -207,14 +205,14 @@ function _M.fbc(role, pms) -- 直接通关 | ||
| 207 | addPre = function(carbonId) | 205 | addPre = function(carbonId) |
| 208 | local carbonData = csvdb["idle_battleCsv"][carbonId] | 206 | local carbonData = csvdb["idle_battleCsv"][carbonId] |
| 209 | for _, pre in ipairs(carbonData.prepose:toArray(true, "=")) do | 207 | for _, pre in ipairs(carbonData.prepose:toArray(true, "=")) do |
| 210 | - passCarbon[pre] = 1 | 208 | + role:hangFinish(pre) |
| 211 | role:checkTaskEnter("HangPass", {id = pre}) | 209 | role:checkTaskEnter("HangPass", {id = pre}) |
| 212 | addPre(pre) | 210 | addPre(pre) |
| 213 | end | 211 | end |
| 214 | end | 212 | end |
| 213 | + role:updateProperty({field = "hangPass", value = {}}) | ||
| 215 | addPre(carbonId) | 214 | addPre(carbonId) |
| 216 | - role:updateProperty({field = "hangInfo", value = {}}) | ||
| 217 | - role:updateProperty({field = "hangPass", value = passCarbon}) | 215 | + |
| 218 | role:checkTaskEnter("HangPass", {id = carbonId}) | 216 | role:checkTaskEnter("HangPass", {id = carbonId}) |
| 219 | 217 | ||
| 220 | role:log("gm_action", {desc = "fbc", int1 = carbonId, key1 = pms.sender}) | 218 | role:log("gm_action", {desc = "fbc", int1 = carbonId, key1 = pms.sender}) |
| @@ -355,24 +353,14 @@ function _M.adv(role, pms) | @@ -355,24 +353,14 @@ function _M.adv(role, pms) | ||
| 355 | local layer = tonum(pms.pm2) | 353 | local layer = tonum(pms.pm2) |
| 356 | 354 | ||
| 357 | local advCsv = csvdb["adv_chapterCsv"][chapterId] | 355 | local advCsv = csvdb["adv_chapterCsv"][chapterId] |
| 358 | - if not advCsv then return end | 356 | + if not advCsv then return "不存在的章节" end |
| 359 | if math.floor(chapterId / 100) ~= 2 then | 357 | if math.floor(chapterId / 100) ~= 2 then |
| 360 | layer = math.min(layer, advCsv.limitlevel) | 358 | layer = math.min(layer, advCsv.limitlevel) |
| 361 | end | 359 | end |
| 362 | local advPass = role:getProperty("advPass") | 360 | local advPass = role:getProperty("advPass") |
| 363 | - local addPre | ||
| 364 | - addPre = function(chapterId) | ||
| 365 | - local advCsv = csvdb["adv_chapterCsv"][chapterId] | ||
| 366 | - for pre, l in ipairs(advCsv.prepose:toNumMap()) do | ||
| 367 | - if (advPass[pre] or 0) < l then | ||
| 368 | - advPass[pre] = l | ||
| 369 | - addPre(pre) | ||
| 370 | - end | ||
| 371 | - end | ||
| 372 | - end | 361 | + |
| 373 | if (advPass[chapterId] or 0) < layer then | 362 | if (advPass[chapterId] or 0) < layer then |
| 374 | advPass[chapterId] = layer | 363 | advPass[chapterId] = layer |
| 375 | - addPre(chapterId) | ||
| 376 | role:updateProperty({field = "advPass", value = advPass}) | 364 | role:updateProperty({field = "advPass", value = advPass}) |
| 377 | end | 365 | end |
| 378 | role:log("gm_action", {desc = "advf", int1 = chapterId, int2 = layer, key1 = pms.sender}) | 366 | role:log("gm_action", {desc = "advf", int1 = chapterId, int2 = layer, key1 = pms.sender}) |
| @@ -380,30 +368,29 @@ function _M.adv(role, pms) | @@ -380,30 +368,29 @@ function _M.adv(role, pms) | ||
| 380 | return "成功" | 368 | return "成功" |
| 381 | end | 369 | end |
| 382 | 370 | ||
| 383 | -table.insert(helpDes, {"冒险到达指定层", "advt", "章节id", "层数"}) | 371 | +table.insert(helpDes, {"冒险到达指定层", "advt", "章节id", "层数", "地图id(选)"}) |
| 384 | function _M.advt(role, pms) | 372 | function _M.advt(role, pms) |
| 385 | local chapterId = tonum(pms.pm1) | 373 | local chapterId = tonum(pms.pm1) |
| 386 | local layer = tonum(pms.pm2) | 374 | local layer = tonum(pms.pm2) |
| 375 | + local mapId = tonum(pms.pm3) | ||
| 387 | local advCsv = csvdb["adv_chapterCsv"][chapterId] | 376 | local advCsv = csvdb["adv_chapterCsv"][chapterId] |
| 388 | if not advCsv then return "不存在的章节" end | 377 | if not advCsv then return "不存在的章节" end |
| 389 | 378 | ||
| 379 | + local status = _M.adv(role, {pm1 = chapterId, pm2 = layer - 1}) | ||
| 380 | + if status ~= "成功" then return status end | ||
| 381 | + | ||
| 390 | local advData = role:getAdvData() | 382 | local advData = role:getAdvData() |
| 391 | - if not advData.chapterId then | ||
| 392 | - return "先随便开启一关" | ||
| 393 | - end | ||
| 394 | - if not advData:isEndless() then | ||
| 395 | - layer = math.min(layer, advCsv.limitlevel) | 383 | + if advData:isRunning() then |
| 384 | + advData:forceOver() | ||
| 396 | end | 385 | end |
| 397 | - | ||
| 398 | - _M.adv(role, {pm1 = chapterId, pm2 = layer - 1}) | ||
| 399 | 386 | ||
| 400 | - | ||
| 401 | - advData.chapterId = chapterId | ||
| 402 | - advData.level = layer | ||
| 403 | - | ||
| 404 | - advData:saveDB() | 387 | + advData:initByChapter({ |
| 388 | + chapterId = chapterId, | ||
| 389 | + level = layer, | ||
| 390 | + isEnter = true, | ||
| 391 | + debugMapId = mapId, | ||
| 392 | + }) | ||
| 405 | role:log("gm_action", {desc = "advt", int1 = chapterId, int2 = layer, key1 = pms.sender}) | 393 | role:log("gm_action", {desc = "advt", int1 = chapterId, int2 = layer, key1 = pms.sender}) |
| 406 | - | ||
| 407 | return "成功" | 394 | return "成功" |
| 408 | end | 395 | end |
| 409 | 396 |
src/actions/HangAction.lua
| @@ -75,10 +75,9 @@ function _M.startRpc( agent, data ) | @@ -75,10 +75,9 @@ function _M.startRpc( agent, data ) | ||
| 75 | if not role:isFuncUnlock(FuncUnlock.DifficultHang) then return end | 75 | if not role:isFuncUnlock(FuncUnlock.DifficultHang) then return end |
| 76 | end | 76 | end |
| 77 | 77 | ||
| 78 | - local hangPass = role:getProperty("hangPass") | ||
| 79 | 78 | ||
| 80 | for _, preCarbonId in ipairs(carbonData.prepose:toArray(true, "=")) do | 79 | for _, preCarbonId in ipairs(carbonData.prepose:toArray(true, "=")) do |
| 81 | - if not hangPass[preCarbonId] then return 2 end | 80 | + if not role:checkHangPass(preCarbonId) then return 2 end |
| 82 | end | 81 | end |
| 83 | 82 | ||
| 84 | if checkReward(role) then | 83 | if checkReward(role) then |
| @@ -98,7 +97,7 @@ function _M.startRpc( agent, data ) | @@ -98,7 +97,7 @@ function _M.startRpc( agent, data ) | ||
| 98 | hangInfo.coinTime = math.min(nowTime, hangInfo.endCoinTime) | 97 | hangInfo.coinTime = math.min(nowTime, hangInfo.endCoinTime) |
| 99 | hangInfo.itemTime = math.min(nowTime, hangInfo.endItemTime) | 98 | hangInfo.itemTime = math.min(nowTime, hangInfo.endItemTime) |
| 100 | end | 99 | end |
| 101 | - if not hangPass[carbonId] then | 100 | + if not role:checkHangPass(carbonId) then |
| 102 | hangInfo.bossTime = nowTime + carbonData.idle_time | 101 | hangInfo.bossTime = nowTime + carbonData.idle_time |
| 103 | else | 102 | else |
| 104 | hangInfo.bossTime = nil | 103 | hangInfo.bossTime = nil |
| @@ -140,8 +139,7 @@ function _M.startBattleRpc(agent, data) | @@ -140,8 +139,7 @@ function _M.startBattleRpc(agent, data) | ||
| 140 | end | 139 | end |
| 141 | end | 140 | end |
| 142 | 141 | ||
| 143 | - local hangPass = role:getProperty("hangPass") | ||
| 144 | - if hangPass[carbonId] then | 142 | + if role:checkHangPass(carbonId) then |
| 145 | return 3 | 143 | return 3 |
| 146 | end | 144 | end |
| 147 | 145 | ||
| @@ -169,14 +167,13 @@ function _M.endBattleRpc(agent, data) | @@ -169,14 +167,13 @@ function _M.endBattleRpc(agent, data) | ||
| 169 | return 3 | 167 | return 3 |
| 170 | end | 168 | end |
| 171 | end | 169 | end |
| 172 | - local hangPass = role:getProperty("hangPass") | ||
| 173 | - if hangPass[carbonId] then | 170 | + |
| 171 | + if role:checkHangPass(carbonId) then | ||
| 174 | return 4 | 172 | return 4 |
| 175 | end | 173 | end |
| 176 | local reward | 174 | local reward |
| 177 | if msg.starNum and msg.starNum > 0 then --win | 175 | if msg.starNum and msg.starNum > 0 then --win |
| 178 | - hangPass[carbonId] = 1 | ||
| 179 | - role:updateProperty({field = "hangPass", value = hangPass}) | 176 | + role:hangFinish(carbonId) |
| 180 | if carbonData.main ~= 1 then | 177 | if carbonData.main ~= 1 then |
| 181 | hangInfo.bossTime = nil | 178 | hangInfo.bossTime = nil |
| 182 | end | 179 | end |
| @@ -193,8 +190,9 @@ function _M.endBattleRpc(agent, data) | @@ -193,8 +190,9 @@ function _M.endBattleRpc(agent, data) | ||
| 193 | role:checkTaskEnter("HangPass", {id = carbonId}) | 190 | role:checkTaskEnter("HangPass", {id = carbonId}) |
| 194 | end | 191 | end |
| 195 | role:updateProperty({field = "hangInfo", value = hangInfo}) | 192 | role:updateProperty({field = "hangInfo", value = hangInfo}) |
| 196 | - | ||
| 197 | - role:log("hang_action", {desc = "hangBattle", short1 = msg.starNum > 0 and 1 or 0, int1 = carbonId}) | 193 | + |
| 194 | + local team = role:getProperty("pvpTC") | ||
| 195 | + role:log("hang_action", {desc = "hangBattle", short1 = msg.starNum > 0 and 1 or 0, int1 = carbonId, int2 = role:getProperty("hangTBV"), cint1 = role:getHerosCamp(team.heros)}) | ||
| 198 | 196 | ||
| 199 | SendPacket(actionCodes.Hang_endBattleRpc, MsgPack.pack({ | 197 | SendPacket(actionCodes.Hang_endBattleRpc, MsgPack.pack({ |
| 200 | starNum = msg.starNum, | 198 | starNum = msg.starNum, |
| @@ -439,8 +437,7 @@ function _M.startBonusBattleRpc(agent, data) | @@ -439,8 +437,7 @@ function _M.startBonusBattleRpc(agent, data) | ||
| 439 | if not role:isTimeResetOpen(TimeReset["DailyBattle" .. bonusData.type]) then return end | 437 | if not role:isTimeResetOpen(TimeReset["DailyBattle" .. bonusData.type]) then return end |
| 440 | 438 | ||
| 441 | if not bonusData then return 1 end | 439 | if not bonusData then return 1 end |
| 442 | - local hangPass = role:getProperty("hangPass") | ||
| 443 | - if not hangPass[bonusData.unlock] then return 2 end | 440 | + if not role:checkHangPass(bonusData.unlock) then return 2 end |
| 444 | 441 | ||
| 445 | if not next(role:getProperty("bTeam")) then return 3 end | 442 | if not next(role:getProperty("bTeam")) then return 3 end |
| 446 | 443 | ||
| @@ -489,6 +486,25 @@ function _M.endBonusBattleRpc(agent, data) | @@ -489,6 +486,25 @@ function _M.endBonusBattleRpc(agent, data) | ||
| 489 | return true | 486 | return true |
| 490 | end | 487 | end |
| 491 | 488 | ||
| 489 | +function _M.hangGiftRpc(agent, data) | ||
| 490 | + local role = agent.role | ||
| 491 | + local msg = MsgPack.unpack(data) | ||
| 492 | + | ||
| 493 | + local id = msg.id | ||
| 494 | + local carbonData = csvdb["idle_battleCsv"][id] | ||
| 495 | + if not carbonData or carbonData.item_clear_special == "" then return 1 end | ||
| 496 | + | ||
| 497 | + local hangGift = role:getProperty("hangGift") | ||
| 498 | + if hangGift[id] then return 2 end | ||
| 499 | + | ||
| 500 | + local reward = role:award(carbonData.item_clear_special, {log = {desc = "hangGift", int1 = id}}) | ||
| 501 | + role:log("hang_action", {desc = "hangGift", int1 = id}) | ||
| 502 | + | ||
| 503 | + role:changeUpdates({{type = "hangGift", field = id, value = 1}}) | ||
| 504 | + | ||
| 505 | + SendPacket(actionCodes.Hang_hangGiftRpc, MsgPack.pack(reward)) | ||
| 506 | + return true | ||
| 507 | +end | ||
| 492 | 508 | ||
| 493 | 509 | ||
| 494 | return _M | 510 | return _M |
| 495 | \ No newline at end of file | 511 | \ No newline at end of file |
src/actions/HeroAction.lua
| @@ -233,7 +233,7 @@ function _M.commentHeroRpc(agent, data) | @@ -233,7 +233,7 @@ function _M.commentHeroRpc(agent, data) | ||
| 233 | result.status = 1 | 233 | result.status = 1 |
| 234 | else | 234 | else |
| 235 | local commentKey = getCommentKey(heroType) | 235 | local commentKey = getCommentKey(heroType) |
| 236 | - local SERV = string.format(".NAMED%d", math.random(1, 5)) | 236 | + local SERV = string.format(".chated%d", math.random(1, 5)) |
| 237 | local legal, mod = skynet.call(SERV, "lua", "check", content) | 237 | local legal, mod = skynet.call(SERV, "lua", "check", content) |
| 238 | if not legal then | 238 | if not legal then |
| 239 | content = mod or "" | 239 | content = mod or "" |
| @@ -536,13 +536,29 @@ function _M.referRunesRpc(agent, data) | @@ -536,13 +536,29 @@ function _M.referRunesRpc(agent, data) | ||
| 536 | local runes = msg.runes | 536 | local runes = msg.runes |
| 537 | if not runes or not next(runes) then return 11 end | 537 | if not runes or not next(runes) then return 11 end |
| 538 | 538 | ||
| 539 | + local used = {} | ||
| 539 | for typ = 1, 6 do | 540 | for typ = 1, 6 do |
| 540 | if runes[typ] and runes[typ] ~= 0 then | 541 | if runes[typ] and runes[typ] ~= 0 then |
| 541 | local ownRune = role.runeBag[runes[typ]] | 542 | local ownRune = role.runeBag[runes[typ]] |
| 542 | if not ownRune then return end | 543 | if not ownRune then return end |
| 543 | - if ownRune:getProperty("refer") ~= 0 then return end | 544 | + if ownRune:getProperty("refer") ~= 0 then |
| 545 | + used[ownRune:getProperty("refer")] = used[ownRune:getProperty("refer")] or {} | ||
| 546 | + used[ownRune:getProperty("refer")][runes[typ]] = 1 | ||
| 547 | + end | ||
| 548 | + end | ||
| 549 | + end | ||
| 550 | + | ||
| 551 | + for cheroId, cIds in pairs(used) do | ||
| 552 | + local chero = role.heros[cheroId] | ||
| 553 | + local hrunes = chero:getProperty("rune") | ||
| 554 | + for slot, rId in pairs(hrunes:toNumMap()) do | ||
| 555 | + if cIds[rId] then | ||
| 556 | + hrunes = hrunes:delk(slot) | ||
| 557 | + end | ||
| 544 | end | 558 | end |
| 559 | + chero:updateProperty({field = "rune", value = hrunes}) | ||
| 545 | end | 560 | end |
| 561 | + | ||
| 546 | local curRune = hero:getProperty("rune") | 562 | local curRune = hero:getProperty("rune") |
| 547 | for typ = 1, 6 do | 563 | for typ = 1, 6 do |
| 548 | if runes[typ] then | 564 | if runes[typ] then |
| @@ -668,208 +684,261 @@ function _M.getResetRewardRpc(agent, data) | @@ -668,208 +684,261 @@ function _M.getResetRewardRpc(agent, data) | ||
| 668 | end | 684 | end |
| 669 | 685 | ||
| 670 | 686 | ||
| 671 | -local function randomDrawCondition(pool, condition) | ||
| 672 | - local value = {} | ||
| 673 | - for idx, field in ipairs(condition) do | ||
| 674 | - local lpool = {} | ||
| 675 | - local curIdx = 1 | ||
| 676 | - while pool[field .. "_" .. curIdx] do | ||
| 677 | - table.insert(lpool, {pool[field .. "_" .. curIdx]}) | ||
| 678 | - curIdx = curIdx + 1 | ||
| 679 | - end | ||
| 680 | - if next(lpool) then | ||
| 681 | - value[idx] = math.randWeight(lpool, 1) | ||
| 682 | - end | ||
| 683 | - end | ||
| 684 | - return value | ||
| 685 | -end | ||
| 686 | - | ||
| 687 | - | ||
| 688 | -local function fillDrawPool(curPool, resultPool, isNeedFunc) | ||
| 689 | - for itemId, oneData in pairs(csvdb["build_poolCsv"]) do | ||
| 690 | - if oneData["pool_" .. curPool] and oneData["pool_" .. curPool] ~= "" then | ||
| 691 | - local itemData = csvdb["itemCsv"][itemId] | ||
| 692 | - if itemData and isNeedFunc(itemData) then | ||
| 693 | - for _, one in ipairs(oneData["pool_" .. curPool]:toTableArray(true)) do | ||
| 694 | - table.insert(resultPool, {itemId, one[1], one[2]}) -- itemId, count, 概率 | ||
| 695 | - end | ||
| 696 | - end | ||
| 697 | - end | ||
| 698 | - end | ||
| 699 | -end | ||
| 700 | 687 | ||
| 701 | function _M.drawHeroRpc(agent, data) | 688 | function _M.drawHeroRpc(agent, data) |
| 702 | local role = agent.role | 689 | local role = agent.role |
| 703 | local msg = MsgPack.unpack(data) | 690 | local msg = MsgPack.unpack(data) |
| 704 | 691 | ||
| 705 | if not role:isFuncUnlock(FuncUnlock.GetHero) then return end | 692 | if not role:isFuncUnlock(FuncUnlock.GetHero) then return end |
| 706 | - local pool = msg.pool -- 1 2 3 | 693 | + local btype = msg.pool -- 1 2 3 4 |
| 707 | local drawType = msg.type -- 1 单抽 2 十连 | 694 | local drawType = msg.type -- 1 单抽 2 十连 |
| 695 | + local guide = msg.guide -- 是否是引导抽的 | ||
| 708 | 696 | ||
| 709 | - local buildTypeData = csvdb["build_typeCsv"][pool] | 697 | + local buildTypeData = csvdb["build_typeCsv"][btype] |
| 710 | if not buildTypeData then return 1 end | 698 | if not buildTypeData then return 1 end |
| 711 | 699 | ||
| 712 | - local costs = {{"draw_card", "draw_coin"}, {"draw10_card", "draw10_coin"}} -- 抽取消耗 | ||
| 713 | local drawCount = {1, 10} -- 抽取次数 | 700 | local drawCount = {1, 10} -- 抽取次数 |
| 701 | + if not drawCount[drawType] then return 2 end | ||
| 714 | 702 | ||
| 715 | - local costT = costs[drawType] | ||
| 716 | - if not costT then return 2 end | ||
| 717 | - local cost = buildTypeData[costT[1]]:toNumMap() | ||
| 718 | - if not role:checkItemEnough(cost) then | ||
| 719 | - cost = buildTypeData[costT[2]]:toNumMap() | ||
| 720 | - if not role:checkItemEnough(cost) then | ||
| 721 | - return 3 | 703 | + local newerDraw |
| 704 | + if btype == 4 then | ||
| 705 | + newerDraw = role:getProperty("newerDraw") | ||
| 706 | + if math.illegalNum(globalCsv.draw_newer[2] - (newerDraw[1] or 0), drawCount[drawType], globalCsv.draw_newer[2]) then return 11 end | ||
| 707 | + end | ||
| 708 | + | ||
| 709 | + local cost = {} | ||
| 710 | + local lastCount = drawCount[drawType] | ||
| 711 | + for _, costType in ipairs({"draw_card", "draw_coin"}) do | ||
| 712 | + if buildTypeData[costType] ~= "" then | ||
| 713 | + local curCost = buildTypeData[costType]:toArray(true, "=") | ||
| 714 | + local hadCount = role:getItemCount(curCost[1]) | ||
| 715 | + local curCount = math.floor(hadCount / curCost[2]) | ||
| 716 | + if curCount >= lastCount then | ||
| 717 | + cost[curCost[1]] = curCost[2] * lastCount | ||
| 718 | + lastCount = 0 | ||
| 719 | + break | ||
| 720 | + elseif curCount > 0 then | ||
| 721 | + cost[curCost[1]] = curCost[2] * curCount | ||
| 722 | + lastCount = lastCount - curCount | ||
| 723 | + end | ||
| 722 | end | 724 | end |
| 723 | end | 725 | end |
| 726 | + if lastCount > 0 then -- 钱不够 | ||
| 727 | + return 3 | ||
| 728 | + end | ||
| 724 | 729 | ||
| 725 | - -- 开始抽 | ||
| 726 | - local rateTypes = {"unitRate", "fragmentRate", "itemRate"} | 730 | + -- pool 固定的 |
| 731 | + local poolEnum = { | ||
| 732 | + [1] = { | ||
| 733 | + [1] = 1, | ||
| 734 | + [2] = 2, | ||
| 735 | + [3] = 3, | ||
| 736 | + }, | ||
| 737 | + [2] = 10, | ||
| 738 | + [3] = 11, | ||
| 739 | + [4] = 12, | ||
| 740 | + } | ||
| 727 | 741 | ||
| 728 | - local typePool = {} | ||
| 729 | - for _, rateType in ipairs(rateTypes) do | ||
| 730 | - table.insert(typePool, {buildTypeData[rateType]}) | 742 | + -- 抽取的池子 |
| 743 | + local pool = poolEnum[btype] | ||
| 744 | + if btype == 1 then | ||
| 745 | + -- 超级卡池子 每周轮换 有活动覆盖之 | ||
| 746 | + --TODO 活动判断 | ||
| 747 | + if false then | ||
| 748 | + else | ||
| 749 | + for idx, poolId in pairs(pool) do | ||
| 750 | + if role:isTimeResetOpen(TimeReset["DrawType" .. idx]) then | ||
| 751 | + pool = poolId | ||
| 752 | + break | ||
| 753 | + end | ||
| 754 | + end | ||
| 755 | + if type(pool) ~= "number" then | ||
| 756 | + pool = -1 | ||
| 757 | + end | ||
| 758 | + end | ||
| 731 | end | 759 | end |
| 760 | + local unitPool = csvdb["build_unitCsv"][pool] | ||
| 761 | + if not unitPool then return 4 end | ||
| 732 | 762 | ||
| 763 | + -- 开始抽 | ||
| 733 | local resultPool = {} | 764 | local resultPool = {} |
| 765 | + local function fillDrawPool(fixRare, fixCamp, ssrUp) | ||
| 766 | + local condition = {"rare", "camp"} | ||
| 767 | + local values = {fixRare, fixCamp} | ||
| 768 | + | ||
| 769 | + for idx, field in ipairs(condition) do | ||
| 770 | + if not values[idx] then | ||
| 771 | + local lpool = {} | ||
| 772 | + local curIdx = 1 | ||
| 773 | + while unitPool[field .. "_" .. curIdx] do | ||
| 774 | + lpool[curIdx] = {unitPool[field .. "_" .. curIdx]} | ||
| 775 | + curIdx = curIdx + 1 | ||
| 776 | + end | ||
| 734 | 777 | ||
| 735 | - local fillPoolFunc = { | ||
| 736 | - unitRate = function(fixRare, fixCamp, fixJob) | ||
| 737 | - local condition = {"rare", "camp", "job"} | ||
| 738 | - local values = randomDrawCondition(csvdb["build_unitCsv"][pool], condition) | ||
| 739 | - values[1] = fixRare or values[1] | ||
| 740 | - values[2] = fixCamp or values[2] | ||
| 741 | - values[3] = fixJob or values[3] | ||
| 742 | - fillDrawPool(pool, resultPool, function(itemData) | ||
| 743 | - if itemData.type ~= ItemType.Hero then return end | ||
| 744 | - local heroData = csvdb["unitCsv"][itemData.id - ItemStartId.Hero] | ||
| 745 | - if not heroData then return end | ||
| 746 | - for idx, field in ipairs(condition) do | ||
| 747 | - if heroData[field] ~= values[idx] then return end | 778 | + -- 稀有度 ssr up |
| 779 | + if field == "rare" then | ||
| 780 | + local all = 0 | ||
| 781 | + for _, weight in pairs(lpool) do | ||
| 782 | + all = all + weight[1] | ||
| 783 | + end | ||
| 784 | + | ||
| 785 | + lpool[4][1] = lpool[4][1] + (ssrUp or 0) * all | ||
| 748 | end | 786 | end |
| 749 | - return true | ||
| 750 | - end) | ||
| 751 | - end, | ||
| 752 | - fragmentRate = function(fixRare, fixCamp, fixJob) | ||
| 753 | - local condition = {"rare", "camp", "job"} | ||
| 754 | - local values = randomDrawCondition(csvdb["build_fragmentCsv"][pool], condition) | ||
| 755 | - values[1] = fixRare or values[1] | ||
| 756 | - values[2] = fixCamp or values[2] | ||
| 757 | - values[3] = fixJob or values[3] | ||
| 758 | - fillDrawPool(pool, resultPool, function(itemData) | ||
| 759 | - if itemData.type ~= ItemType.HeroFragment then return end | ||
| 760 | - local heroData = csvdb["unitCsv"][itemData.id] | ||
| 761 | - if not heroData then return end | ||
| 762 | - for idx, field in ipairs(condition) do | ||
| 763 | - if heroData[field] ~= values[idx] then return end | 787 | + |
| 788 | + if next(lpool) then | ||
| 789 | + values[idx] = math.randWeight(lpool, 1) | ||
| 764 | end | 790 | end |
| 765 | - return true | ||
| 766 | - end) | ||
| 767 | - end, | ||
| 768 | - itemRate = function() | ||
| 769 | - fillDrawPool(pool, resultPool, function(itemData) | ||
| 770 | - if itemData.type == ItemType.HeroFragment or itemData.type == ItemType.Hero then return end | ||
| 771 | - return true | ||
| 772 | - end) | ||
| 773 | - end, | ||
| 774 | - } | 791 | + end |
| 792 | + end | ||
| 793 | + | ||
| 794 | + for itemId, oneData in pairs(csvdb["build_poolCsv"]) do | ||
| 795 | + if oneData["pool_" .. pool] and oneData["pool_" .. pool] ~= "" then | ||
| 796 | + local itemData = csvdb["itemCsv"][itemId] | ||
| 797 | + while itemData do | ||
| 798 | + if itemData.type ~= ItemType.Hero then break end | ||
| 799 | + local heroData = csvdb["unitCsv"][itemData.id - ItemStartId.Hero] | ||
| 800 | + if not heroData then break end | ||
| 801 | + local ok = true | ||
| 802 | + for idx, field in ipairs(condition) do | ||
| 803 | + if heroData[field] ~= values[idx] then ok = false break end | ||
| 804 | + end | ||
| 805 | + if not ok then break end | ||
| 806 | + if oneData["pool_" .. pool] > 0 then | ||
| 807 | + resultPool[itemId] = {oneData["pool_" .. pool]} -- itemId, count, 概率 | ||
| 808 | + end | ||
| 809 | + break | ||
| 810 | + end | ||
| 811 | + end | ||
| 812 | + end | ||
| 813 | + end | ||
| 814 | + | ||
| 815 | + role:costItems(cost, {log = {desc = "drawHero", short1 = btype, int1 = pool}}) | ||
| 775 | 816 | ||
| 776 | - role:costItems(cost, {log = {desc = "drawHero", short1 = pool}}) | ||
| 777 | - local floorHeroCount = role:getProperty("floorHero")[pool] or 0 | 817 | + local draw_floor_back_counts = globalCsv.draw_floor_back_counts[btype] |
| 818 | + local draw_ssr_up_count_rate = globalCsv.draw_ssr_up_count_rate[btype] | ||
| 819 | + local floorHeroCount = role:getProperty("floorHero")[btype] or 0 | ||
| 820 | + local ssrUpCount = role:getProperty("ssrUp")[btype] or 0 | ||
| 821 | + | ||
| 822 | + local newerDrawCount, newerHadSSR | ||
| 823 | + if btype == 4 then | ||
| 824 | + newerDrawCount = newerDraw[1] or 0 | ||
| 825 | + newerHadSSR = newerDraw[2] or 0 | ||
| 826 | + end | ||
| 778 | 827 | ||
| 779 | local ssrCount = 0 | 828 | local ssrCount = 0 |
| 780 | local reward = {} | 829 | local reward = {} |
| 781 | for i = 1, drawCount[drawType] do | 830 | for i = 1, drawCount[drawType] do |
| 782 | floorHeroCount = floorHeroCount + 1 | 831 | floorHeroCount = floorHeroCount + 1 |
| 832 | + if btype == 4 then | ||
| 833 | + newerDrawCount = newerDrawCount + 1 | ||
| 834 | + end | ||
| 783 | 835 | ||
| 784 | resultPool = {} | 836 | resultPool = {} |
| 785 | - local isFloorBack = globalCsv.draw_floor_back_counts[pool] and floorHeroCount >= globalCsv.draw_floor_back_counts[pool] | ||
| 786 | - while not next(resultPool) do | ||
| 787 | - local rateType | 837 | + local isFloorBack = draw_floor_back_counts and floorHeroCount >= draw_floor_back_counts |
| 838 | + local isNewerSSR = btype == 4 and (newerHadSSR == 0 and newerDrawCount >= globalCsv.draw_newer[1]) or false | ||
| 788 | 839 | ||
| 789 | - if isFloorBack then | ||
| 790 | - rateType = 1 --保底英雄 | ||
| 791 | - else | ||
| 792 | - rateType = math.randWeight(typePool, 1) | ||
| 793 | - end | ||
| 794 | - if not fillPoolFunc[rateTypes[rateType]] then return 4 end | ||
| 795 | - if isFloorBack then | ||
| 796 | - fillPoolFunc[rateTypes[rateType]](3) -- 保底 sr 【郑斌】明确 | 840 | + local ssrUp = 0 |
| 841 | + if draw_ssr_up_count_rate then | ||
| 842 | + ssrUp = math.floor(ssrUpCount / draw_ssr_up_count_rate[1]) * draw_ssr_up_count_rate[2] / 100 | ||
| 843 | + end | ||
| 844 | + while not next(resultPool) do | ||
| 845 | + if isNewerSSR then | ||
| 846 | + fillDrawPool(4) -- 新手保底的 ssr | ||
| 847 | + elseif isFloorBack then | ||
| 848 | + fillDrawPool(3) -- 保底 sr 【郑斌】明确 | ||
| 797 | else | 849 | else |
| 798 | - fillPoolFunc[rateTypes[rateType]]() | 850 | + fillDrawPool(nil, nil, ssrUp) |
| 799 | end | 851 | end |
| 800 | end | 852 | end |
| 801 | 853 | ||
| 802 | - local idx = math.randWeight(resultPool, 3) | ||
| 803 | - local temp = resultPool[idx] | ||
| 804 | - local itemData = csvdb["itemCsv"][temp[1]] | ||
| 805 | - | ||
| 806 | - if itemData.type == ItemType.Hero then | ||
| 807 | - if itemData.quality == 4 then | ||
| 808 | - ssrCount = ssrCount + 1 | ||
| 809 | - elseif itemData.quality == 3 then | ||
| 810 | - floorHeroCount = 0 | 854 | + -- 引导必送 613 丝路德 |
| 855 | + local itemId = guide and 613 or math.randWeight(resultPool, 1) | ||
| 856 | + local itemData = csvdb["itemCsv"][itemId] | ||
| 857 | + if itemData.quality == 4 then | ||
| 858 | + ssrCount = ssrCount + 1 | ||
| 859 | + ssrUpCount = 0 | ||
| 860 | + | ||
| 861 | + if btype == 4 then | ||
| 862 | + newerHadSSR = newerHadSSR + 1 | ||
| 811 | end | 863 | end |
| 864 | + elseif itemData.quality == 3 then | ||
| 865 | + floorHeroCount = 0 | ||
| 866 | + ssrUpCount = ssrUpCount + 1 | ||
| 867 | + else | ||
| 868 | + ssrUpCount = ssrUpCount + 1 | ||
| 812 | end | 869 | end |
| 813 | 870 | ||
| 814 | - if itemData.type == ItemType.Hero and role:isHaveHero(itemData.id - ItemStartId.Hero) then | 871 | + if role:isHaveHero(itemData.id - ItemStartId.Hero) then |
| 815 | local fragId = itemData.id - ItemStartId.Hero | 872 | local fragId = itemData.id - ItemStartId.Hero |
| 816 | local heroData = csvdb["unitCsv"][fragId] | 873 | local heroData = csvdb["unitCsv"][fragId] |
| 817 | - local count = globalCsv.draw_unit_tofragment[heroData.rare] * temp[2] | ||
| 818 | - role:award({[fragId] = count}, {log = {desc = "drawHero", short1 = pool}}) | ||
| 819 | - table.insert(reward, {id = fragId, count = count, from = temp[1], fcount = temp[2]}) | 874 | + local count = globalCsv.draw_unit_tofragment[heroData.rare] |
| 875 | + role:award({[fragId] = count}, {log = {desc = "drawHero", short1 = btype, int1 = pool}}) | ||
| 876 | + table.insert(reward, {id = fragId, count = count, from = itemId, fcount = 1}) | ||
| 820 | else | 877 | else |
| 821 | - role:award({[temp[1]] = temp[2]}, {log = {desc = "drawHero", short1 = pool}}) | ||
| 822 | - table.insert(reward, {id = temp[1], count = temp[2]}) | 878 | + role:award({[itemId] = 1}, {log = {desc = "drawHero", short1 = btype, int1 = pool}}) |
| 879 | + table.insert(reward, {id = itemId, count = 1}) | ||
| 823 | end | 880 | end |
| 824 | end | 881 | end |
| 825 | 882 | ||
| 826 | - if globalCsv.draw_floor_back_counts[pool] then | 883 | + if draw_floor_back_counts then |
| 827 | local floorHero = role:getProperty("floorHero") | 884 | local floorHero = role:getProperty("floorHero") |
| 828 | floorHero[pool] = floorHeroCount | 885 | floorHero[pool] = floorHeroCount |
| 829 | - role:updateProperty({field = "floorHero", value = floorHero}) | 886 | + role:setProperty("floorHero", floorHero) |
| 830 | end | 887 | end |
| 831 | 888 | ||
| 832 | - if pool == 1 then | ||
| 833 | - local repayHero = role:getProperty("repayHero") | ||
| 834 | - repayHero = math.min(globalCsv.draw_super_repay_count, repayHero + drawCount[drawType]) | ||
| 835 | - role:updateProperty({field = "repayHero", value = repayHero}) | 889 | + if draw_ssr_up_count_rate then |
| 890 | + local ssrUp = role:getProperty("ssrUp") | ||
| 891 | + ssrUp[pool] = ssrUpCount | ||
| 892 | + role:setProperty("ssrUp", ssrUp) | ||
| 836 | end | 893 | end |
| 837 | 894 | ||
| 895 | + if btype == 4 then | ||
| 896 | + newerDraw[1] = newerDrawCount | ||
| 897 | + newerDraw[2] = newerHadSSR | ||
| 898 | + role:updateProperty({field = "newerDraw", value = newerDraw}) | ||
| 899 | + end | ||
| 900 | + | ||
| 901 | + -- if pool == 1 then | ||
| 902 | + -- local repayHero = role:getProperty("repayHero") | ||
| 903 | + -- repayHero = math.min(globalCsv.draw_super_repay_count, repayHero + drawCount[drawType]) | ||
| 904 | + -- role:updateProperty({field = "repayHero", value = repayHero}) | ||
| 905 | + -- end | ||
| 906 | + | ||
| 838 | role:checkTaskEnter("DrawHero", {pool = pool, count = drawCount[drawType]}) | 907 | role:checkTaskEnter("DrawHero", {pool = pool, count = drawCount[drawType]}) |
| 839 | if ssrCount > 0 then | 908 | if ssrCount > 0 then |
| 840 | role:checkTaskEnter("DrawSSR", {count = ssrCount}) | 909 | role:checkTaskEnter("DrawSSR", {count = ssrCount}) |
| 841 | end | 910 | end |
| 842 | - role:log("hero_action", {desc = "drawHero", short1 = pool, int1 = drawCount[drawType]}) | 911 | + role:log("hero_action", {desc = "drawHero", short1 = btype, int1 = drawCount[drawType], int2 = pool}) |
| 843 | SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组 | 912 | SendPacket(actionCodes.Hero_drawHeroRpc, MsgPack.pack({reward = reward})) -- 这个 reward 是数组 |
| 844 | return true | 913 | return true |
| 845 | end | 914 | end |
| 846 | 915 | ||
| 847 | -function _M.repayHeroRpc(agent, data) | ||
| 848 | - local role = agent.role | ||
| 849 | - | ||
| 850 | - local repayHero = role:getProperty("repayHero") | ||
| 851 | - if repayHero < globalCsv.draw_super_repay_count then | ||
| 852 | - return | ||
| 853 | - end | 916 | +-- function _M.repayHeroRpc(agent, data) |
| 917 | +-- local role = agent.role | ||
| 854 | 918 | ||
| 855 | - role:updateProperty({field = "repayHero", value = 0}) | ||
| 856 | - local id = math.randWeight(csvdb["build_giftCsv"], "pool_1") | 919 | +-- local repayHero = role:getProperty("repayHero") |
| 920 | +-- if repayHero < globalCsv.draw_super_repay_count then | ||
| 921 | +-- return | ||
| 922 | +-- end | ||
| 857 | 923 | ||
| 858 | - local reward = {} | ||
| 859 | - local itemData = csvdb["itemCsv"][id] | ||
| 860 | - if itemData.type == ItemType.Hero and role:isHaveHero(itemData.id - ItemStartId.Hero) then | ||
| 861 | - local fragId = itemData.id - ItemStartId.Hero | ||
| 862 | - local heroData = csvdb["unitCsv"][fragId] | ||
| 863 | - local count = globalCsv.draw_unit_tofragment[heroData.rare] | ||
| 864 | - role:award({[fragId] = count}, {log = {desc = "heroRepay"}}) | ||
| 865 | - reward = {id = fragId, count = count, from = id, fcount = 1} | ||
| 866 | - else | ||
| 867 | - role:award({[id] = 1}, {log = {desc = "heroRepay"}}) | ||
| 868 | - reward = {id = id, count = 1} | ||
| 869 | - end | ||
| 870 | - role:log("hero_action", {desc = "heroRepay"}) | ||
| 871 | - SendPacket(actionCodes.Hero_repayHeroRpc, MsgPack.pack({reward = reward})) | ||
| 872 | - return true | ||
| 873 | -end | 924 | +-- role:updateProperty({field = "repayHero", value = 0}) |
| 925 | +-- local id = math.randWeight(csvdb["build_giftCsv"], "pool_1") | ||
| 926 | + | ||
| 927 | +-- local reward = {} | ||
| 928 | +-- local itemData = csvdb["itemCsv"][id] | ||
| 929 | +-- if itemData.type == ItemType.Hero and role:isHaveHero(itemData.id - ItemStartId.Hero) then | ||
| 930 | +-- local fragId = itemData.id - ItemStartId.Hero | ||
| 931 | +-- local heroData = csvdb["unitCsv"][fragId] | ||
| 932 | +-- local count = globalCsv.draw_unit_tofragment[heroData.rare] | ||
| 933 | +-- role:award({[fragId] = count}, {log = {desc = "heroRepay"}}) | ||
| 934 | +-- reward = {id = fragId, count = count, from = id, fcount = 1} | ||
| 935 | +-- else | ||
| 936 | +-- role:award({[id] = 1}, {log = {desc = "heroRepay"}}) | ||
| 937 | +-- reward = {id = id, count = 1} | ||
| 938 | +-- end | ||
| 939 | +-- role:log("hero_action", {desc = "heroRepay"}) | ||
| 940 | +-- SendPacket(actionCodes.Hero_repayHeroRpc, MsgPack.pack({reward = reward})) | ||
| 941 | +-- return true | ||
| 942 | +-- end | ||
| 874 | 943 | ||
| 875 | return _M | 944 | return _M |
| 876 | \ No newline at end of file | 945 | \ No newline at end of file |
src/actions/HttpAction.lua
| 1 | -local codecache = require "skynet.codecache" -- 清空缓存用 | ||
| 2 | - | ||
| 3 | 1 | ||
| 4 | local _M = {} | 2 | local _M = {} |
| 5 | 3 | ||
| @@ -19,45 +17,12 @@ local _M = {} | @@ -19,45 +17,12 @@ local _M = {} | ||
| 19 | ]=] | 17 | ]=] |
| 20 | 18 | ||
| 21 | 19 | ||
| 22 | --- 清空缓存 | ||
| 23 | -function _M.clearcache(query, body) | ||
| 24 | - skynet.error(string.format("clearcache time: %s", skynet.timex())) | ||
| 25 | - codecache.clear() | ||
| 26 | - return 'success' | ||
| 27 | -end | ||
| 28 | - | ||
| 29 | ---重新加载 需要修改的csvdb -- 单字段修改 优先使用hotfix_csvdata | ||
| 30 | ---[=[ eg: | ||
| 31 | - body = """ | ||
| 32 | - csvdb["itemCsv"][1]["name"] = "测试一下" | ||
| 33 | - """ | ||
| 34 | -]=] | ||
| 35 | - | ||
| 36 | -function _M.reload_csvdata(query, body) | ||
| 37 | - if not body or body == "" then | ||
| 38 | - return 'no body' | ||
| 39 | - end | ||
| 40 | - | ||
| 41 | - local ok = pcall(load, body) | ||
| 42 | - if not ok then | ||
| 43 | - return "code error" | ||
| 44 | - end | ||
| 45 | - | ||
| 46 | - local ok, status = pcall(skynet.call, '.CSVDATA', "lua", "reload", body) | ||
| 47 | - if status == "ok" then | ||
| 48 | - skynet.error(string.format("reload_csvdata time: %s, code: %s", skynet.timex(), body)) | ||
| 49 | - return 'success' | ||
| 50 | - else | ||
| 51 | - return 'error update' | ||
| 52 | - end | ||
| 53 | -end | ||
| 54 | - | ||
| 55 | ---指定更新某个字段值 | ||
| 56 | --[=[ | 20 | --[=[ |
| 57 | 解码后 | 21 | 解码后 |
| 58 | body = { | 22 | body = { |
| 59 | - {"itemCsv", 1, "name", "测试一下"}, | ||
| 60 | - {"itemCsv", 2, "name", "测试一下"} | 23 | + "src/csvdata/init.lua", |
| 24 | + "unitCsv", | ||
| 25 | + "story_cgCsv", | ||
| 61 | } | 26 | } |
| 62 | ]=] | 27 | ]=] |
| 63 | function _M.hotfix_csvdata(query, body) | 28 | function _M.hotfix_csvdata(query, body) |
| @@ -69,14 +34,10 @@ function _M.hotfix_csvdata(query, body) | @@ -69,14 +34,10 @@ function _M.hotfix_csvdata(query, body) | ||
| 69 | if not ok or type(result) ~= 'table' then | 34 | if not ok or type(result) ~= 'table' then |
| 70 | return "decode error" | 35 | return "decode error" |
| 71 | end | 36 | end |
| 72 | - local ok, status = pcall(skynet.call, '.CSVDATA', "lua", "hotfix", result) | ||
| 73 | 37 | ||
| 74 | - if status == "ok" then | ||
| 75 | - skynet.error(string.format("hotfix_csvdata time: %s, code: %s", skynet.timex(), body)) | ||
| 76 | - return 'success' | ||
| 77 | - else | ||
| 78 | - return 'error update' | ||
| 79 | - end | 38 | + csvdb.hotfix(table.unpack(result)) |
| 39 | + | ||
| 40 | + return 'success' | ||
| 80 | end | 41 | end |
| 81 | 42 | ||
| 82 | -- 热更新代码 -- 针对 agent 执行发送过来的代码 -- 代码要规范~ | 43 | -- 热更新代码 -- 针对 agent 执行发送过来的代码 -- 代码要规范~ |
| @@ -150,7 +111,7 @@ function _M.hotfix_code(query, body) | @@ -150,7 +111,7 @@ function _M.hotfix_code(query, body) | ||
| 150 | 111 | ||
| 151 | skynet.error(string.format("hotfix_code time: %s, code: %s", skynet.timex(), body)) | 112 | skynet.error(string.format("hotfix_code time: %s, code: %s", skynet.timex(), body)) |
| 152 | 113 | ||
| 153 | - pcall(skynet.call, '.WATCHDOG', "lua", "hotfix", body) | 114 | + pcall(skynet.call, '.watchdog', "lua", "hotfix", body) |
| 154 | return 'success' | 115 | return 'success' |
| 155 | end | 116 | end |
| 156 | 117 |
src/actions/RoleAction.lua
| @@ -22,7 +22,7 @@ local function validName(name) | @@ -22,7 +22,7 @@ local function validName(name) | ||
| 22 | local exist = redisproxy:exists(string_format("user:%s", name)) | 22 | local exist = redisproxy:exists(string_format("user:%s", name)) |
| 23 | if exist then return "existed" end | 23 | if exist then return "existed" end |
| 24 | 24 | ||
| 25 | - local SERV = string_format(".NAMED%d", math.random(1, 5)) | 25 | + local SERV = string_format(".named%d", math.random(1, 5)) |
| 26 | local legal = skynet.call(SERV, "lua", "check", name) | 26 | local legal = skynet.call(SERV, "lua", "check", name) |
| 27 | return legal and "ok" or "illegal" | 27 | return legal and "ok" or "illegal" |
| 28 | end | 28 | end |
| @@ -217,7 +217,7 @@ function _M.loginRpc( agent, data ) | @@ -217,7 +217,7 @@ function _M.loginRpc( agent, data ) | ||
| 217 | 217 | ||
| 218 | -- 发下缓存的世界消息 | 218 | -- 发下缓存的世界消息 |
| 219 | local worldChatResponse = {worldChats = {}} | 219 | local worldChatResponse = {worldChats = {}} |
| 220 | - local ok, msgs = pcall(skynet.call, '.GLOBALD', "lua", "getWorldMsg", role._channelIdx) | 220 | + local ok, msgs = pcall(skynet.call, '.globald', "lua", "getWorldMsg", role._channelIdx) |
| 221 | if not ok then | 221 | if not ok then |
| 222 | msgs = {} | 222 | msgs = {} |
| 223 | end | 223 | end |
| @@ -245,8 +245,10 @@ function _M.loginRpc( agent, data ) | @@ -245,8 +245,10 @@ function _M.loginRpc( agent, data ) | ||
| 245 | -- 玩家登陆做的一些操作 | 245 | -- 玩家登陆做的一些操作 |
| 246 | role:saveHangTeam() | 246 | role:saveHangTeam() |
| 247 | role:savePvpCTeam() | 247 | role:savePvpCTeam() |
| 248 | + role:savePvpHTeam() | ||
| 248 | 249 | ||
| 249 | - role:log("login", {key1 = agent.ip:toArray(false, ":")[1]}) | 250 | + local hangPass = role:getProperty("hangPass") |
| 251 | + role:log("login", {key1 = agent.ip:toArray(false, ":")[1], int1 = hangPass[1] or 0}) | ||
| 250 | 252 | ||
| 251 | return true | 253 | return true |
| 252 | end | 254 | end |
| @@ -352,6 +354,12 @@ function _M.changeNameRpc(agent, data) | @@ -352,6 +354,12 @@ function _M.changeNameRpc(agent, data) | ||
| 352 | return true | 354 | return true |
| 353 | end | 355 | end |
| 354 | 356 | ||
| 357 | +function _M.getRandomNameRpc() | ||
| 358 | + local name = randomRoleName() | ||
| 359 | + SendPacket(actionCodes.Role_getRandomNameRpc, MsgPack.pack({name = name})) | ||
| 360 | + return true | ||
| 361 | +end | ||
| 362 | + | ||
| 355 | function _M.changeIntroRpc(agent, data) | 363 | function _M.changeIntroRpc(agent, data) |
| 356 | local role = agent.role | 364 | local role = agent.role |
| 357 | local roleId = role:getProperty("id") | 365 | local roleId = role:getProperty("id") |
| @@ -359,7 +367,7 @@ function _M.changeIntroRpc(agent, data) | @@ -359,7 +367,7 @@ function _M.changeIntroRpc(agent, data) | ||
| 359 | local content = msg.content | 367 | local content = msg.content |
| 360 | if not content or type(content) ~= "string" then return end | 368 | if not content or type(content) ~= "string" then return end |
| 361 | 369 | ||
| 362 | - local SERV = string_format(".CHATED%d", math.random(1, 5)) | 370 | + local SERV = string_format(".chated%d", math.random(1, 5)) |
| 363 | local legal, mod = skynet.call(SERV, "lua", "check", content) | 371 | local legal, mod = skynet.call(SERV, "lua", "check", content) |
| 364 | if not legal then | 372 | if not legal then |
| 365 | content = mod or "" | 373 | content = mod or "" |
| @@ -744,7 +752,7 @@ function _M.chatRpc(agent, data) | @@ -744,7 +752,7 @@ function _M.chatRpc(agent, data) | ||
| 744 | -- 判断禁言 | 752 | -- 判断禁言 |
| 745 | local result = nil | 753 | local result = nil |
| 746 | 754 | ||
| 747 | - local SERV = string_format(".CHATED%d", math.random(1, 5)) | 755 | + local SERV = string_format(".chated%d", math.random(1, 5)) |
| 748 | local legal, mod = skynet.call(SERV, "lua", "check", content) | 756 | local legal, mod = skynet.call(SERV, "lua", "check", content) |
| 749 | if not legal then | 757 | if not legal then |
| 750 | content = mod or "" | 758 | content = mod or "" |
| @@ -799,7 +807,7 @@ function _M.chatRpc(agent, data) | @@ -799,7 +807,7 @@ function _M.chatRpc(agent, data) | ||
| 799 | end | 807 | end |
| 800 | end | 808 | end |
| 801 | mcast_util.pub_world(actionCodes.Role_chat, MsgPack.pack(response)) | 809 | mcast_util.pub_world(actionCodes.Role_chat, MsgPack.pack(response)) |
| 802 | - pcall(skynet.send, '.GLOBALD', "lua", "sendWorldMsg", role._channelIdx, response) | 810 | + pcall(skynet.send, '.globald', "lua", "sendWorldMsg", role._channelIdx, response) |
| 803 | end, | 811 | end, |
| 804 | -- 私聊 | 812 | -- 私聊 |
| 805 | [2] = function () | 813 | [2] = function () |
src/adv/Adv.lua
| @@ -74,7 +74,16 @@ function Adv:isHaveRelay(level, chapterId) | @@ -74,7 +74,16 @@ function Adv:isHaveRelay(level, chapterId) | ||
| 74 | end | 74 | end |
| 75 | 75 | ||
| 76 | -- 随机新的地图 | 76 | -- 随机新的地图 |
| 77 | -function Adv:initByChapter(chapterId, level, isToNext, notNotify, isRelay, isEnter, support) | 77 | +function Adv:initByChapter(params) |
| 78 | + local chapterId = params.chapterId | ||
| 79 | + local level = params.level | ||
| 80 | + local isToNext = params.isToNext | ||
| 81 | + local notNotify = params.notNotify | ||
| 82 | + local isRelay = params.isRelay | ||
| 83 | + local isEnter = params.isEnter | ||
| 84 | + local support = params.support | ||
| 85 | + local debugMapId = params.debugMapId | ||
| 86 | + | ||
| 78 | if not self.chapterId then -- 开始新的章节 | 87 | if not self.chapterId then -- 开始新的章节 |
| 79 | self.chapterId = chapterId | 88 | self.chapterId = chapterId |
| 80 | self:checkAchievement(Adv.AchievType.StartBattle, 1) | 89 | self:checkAchievement(Adv.AchievType.StartBattle, 1) |
| @@ -99,21 +108,23 @@ function Adv:initByChapter(chapterId, level, isToNext, notNotify, isRelay, isEnt | @@ -99,21 +108,23 @@ function Adv:initByChapter(chapterId, level, isToNext, notNotify, isRelay, isEnt | ||
| 99 | end | 108 | end |
| 100 | 109 | ||
| 101 | -- 随机出地图 | 110 | -- 随机出地图 |
| 102 | - local mapId | ||
| 103 | - if isRelay then | ||
| 104 | - local relayData = self:isHaveRelay(level, chapterId) | ||
| 105 | - if relayData then | ||
| 106 | - mapId = relayData.map | 111 | + local mapId, relayData |
| 112 | + | ||
| 113 | + if debugMapId and csvdb["mapCsv"][debugMapId] then | ||
| 114 | + mapId = debugMapId | ||
| 115 | + end | ||
| 116 | + if not mapId then | ||
| 117 | + if isRelay then | ||
| 118 | + relayData = self:isHaveRelay(level, chapterId) | ||
| 119 | + if relayData then | ||
| 120 | + mapId = relayData.map | ||
| 121 | + else | ||
| 122 | + isRelay = false | ||
| 123 | + mapId = self:randomMapId(chapterId, level) | ||
| 124 | + end | ||
| 107 | else | 125 | else |
| 108 | - isRelay = false | ||
| 109 | mapId = self:randomMapId(chapterId, level) | 126 | mapId = self:randomMapId(chapterId, level) |
| 110 | end | 127 | end |
| 111 | - else | ||
| 112 | - mapId = self:randomMapId(chapterId, level) | ||
| 113 | - end | ||
| 114 | - | ||
| 115 | - if isEnter and not self.owner:checkOverGuide(GuideStep.AdvGuide) then | ||
| 116 | - mapId = 101 | ||
| 117 | end | 128 | end |
| 118 | 129 | ||
| 119 | self.isRelay = isRelay | 130 | self.isRelay = isRelay |
| @@ -141,9 +152,21 @@ function Adv:initByChapter(chapterId, level, isToNext, notNotify, isRelay, isEnt | @@ -141,9 +152,21 @@ function Adv:initByChapter(chapterId, level, isToNext, notNotify, isRelay, isEnt | ||
| 141 | 152 | ||
| 142 | self:checkTask(Adv.TaskType.Arrive) | 153 | self:checkTask(Adv.TaskType.Arrive) |
| 143 | self:checkAdvUnlock(1, self.level) | 154 | self:checkAdvUnlock(1, self.level) |
| 155 | + | ||
| 144 | if isToNext then | 156 | if isToNext then |
| 145 | self.battle.player:afterLayer() -- 玩家的buff 清理一下 | 157 | self.battle.player:afterLayer() -- 玩家的buff 清理一下 |
| 146 | end | 158 | end |
| 159 | + | ||
| 160 | + -- 不是中继层 加上 层 和 地图的buff和被动 | ||
| 161 | + if not self.isRelay then | ||
| 162 | + self.battle:initMapEffect() | ||
| 163 | + end | ||
| 164 | + | ||
| 165 | + -- 中继进入奖励 | ||
| 166 | + if relayData and isEnter then | ||
| 167 | + self:awardRelay(relayData, notNotify) | ||
| 168 | + end | ||
| 169 | + | ||
| 147 | if not notNotify then | 170 | if not notNotify then |
| 148 | self:saveDB(notNotify) | 171 | self:saveDB(notNotify) |
| 149 | end | 172 | end |
| @@ -201,6 +224,44 @@ function Adv:saveDB(notNotify) | @@ -201,6 +224,44 @@ function Adv:saveDB(notNotify) | ||
| 201 | self.owner:updateProperties({advInfo = advInfo, advTeam = advTeam}, notNotify) | 224 | self.owner:updateProperties({advInfo = advInfo, advTeam = advTeam}, notNotify) |
| 202 | end | 225 | end |
| 203 | 226 | ||
| 227 | +function Adv:awardRelay(relayData, notNotify) | ||
| 228 | + local gift = {} | ||
| 229 | + | ||
| 230 | + if relayData.artifact > 0 then | ||
| 231 | + local pool = {} | ||
| 232 | + for id, temp in pairs(csvdb["adv_artifactCsv"]) do | ||
| 233 | + if not self:isHaveArtifact(id) and self.owner:isArtifactOpen(id, self:isEndless()) then | ||
| 234 | + table.insert(pool, id) | ||
| 235 | + end | ||
| 236 | + end | ||
| 237 | + for i = 1, math.min(relayData.artifact, #pool) do | ||
| 238 | + local idx = math.randomInt(1, #pool) | ||
| 239 | + gift[pool[idx]] = 1 | ||
| 240 | + table.remove(pool, idx) | ||
| 241 | + end | ||
| 242 | + end | ||
| 243 | + | ||
| 244 | + if relayData.point > 0 then | ||
| 245 | + gift[ItemId.AdvPoint] = relayData.point | ||
| 246 | + end | ||
| 247 | + | ||
| 248 | + if relayData.otherAward ~= "" then | ||
| 249 | + for dropId, count in pairs(relayData.otherAward:toNumMap()) do | ||
| 250 | + for i = 1, count do | ||
| 251 | + local dropData = csvdb["event_dropCsv"][dropId] | ||
| 252 | + if dropData then | ||
| 253 | + local item = dropData["range"]:randWeight(true) | ||
| 254 | + gift[item[1]] = (gift[item[1]] or 0) + item[2] | ||
| 255 | + else | ||
| 256 | + skynet.error(string.format("[ERROR]: event_dropCsv no id %s, adv_chapter_campsite", dropId)) | ||
| 257 | + end | ||
| 258 | + end | ||
| 259 | + end | ||
| 260 | + end | ||
| 261 | + | ||
| 262 | + self:award(gift, {notNotify = notNotify, log = {desc = "relayEnter", int1 = self.chapterId, int2 = self.level}}) | ||
| 263 | +end | ||
| 264 | + | ||
| 204 | function Adv:initSupport(supports) | 265 | function Adv:initSupport(supports) |
| 205 | self.support = {} | 266 | self.support = {} |
| 206 | 267 | ||
| @@ -743,6 +804,7 @@ function Adv:over(success, rewardRatio, overType) | @@ -743,6 +804,7 @@ function Adv:over(success, rewardRatio, overType) | ||
| 743 | 804 | ||
| 744 | self:log({desc = "over", short1 = success and 1 or 0, int1 = overType}) | 805 | self:log({desc = "over", short1 = success and 1 or 0, int1 = overType}) |
| 745 | 806 | ||
| 807 | + local chapterId = self.chapterId | ||
| 746 | self:clear() | 808 | self:clear() |
| 747 | self.owner:checkTaskEnter("AdvScore", {score = score}) | 809 | self.owner:checkTaskEnter("AdvScore", {score = score}) |
| 748 | 810 | ||
| @@ -751,7 +813,7 @@ function Adv:over(success, rewardRatio, overType) | @@ -751,7 +813,7 @@ function Adv:over(success, rewardRatio, overType) | ||
| 751 | advAFGet = {}, | 813 | advAFGet = {}, |
| 752 | advAFWear = {}, | 814 | advAFWear = {}, |
| 753 | }) | 815 | }) |
| 754 | - self:backEnd(success, score, scoreInfo, reward, overType, scoreReward) | 816 | + self:backEnd(success, score, scoreInfo, reward, overType, scoreReward, chapterId) |
| 755 | end | 817 | end |
| 756 | 818 | ||
| 757 | function Adv:exit() | 819 | function Adv:exit() |
| @@ -787,7 +849,7 @@ function Adv:randomMapId(chapterId, level) | @@ -787,7 +849,7 @@ function Adv:randomMapId(chapterId, level) | ||
| 787 | local temp = csvdb["mapCsv"][mapId] | 849 | local temp = csvdb["mapCsv"][mapId] |
| 788 | if temp and not lastMapIds[mapId] then | 850 | if temp and not lastMapIds[mapId] then |
| 789 | if AdvCommon.checkIsIn(level, temp.leveltype, temp.levellimit) then | 851 | if AdvCommon.checkIsIn(level, temp.leveltype, temp.levellimit) then |
| 790 | - table.insert(pool, mapId) | 852 | + pool[mapId] = {showup = temp.showup} |
| 791 | end | 853 | end |
| 792 | end | 854 | end |
| 793 | end | 855 | end |
| @@ -795,10 +857,10 @@ function Adv:randomMapId(chapterId, level) | @@ -795,10 +857,10 @@ function Adv:randomMapId(chapterId, level) | ||
| 795 | error("mapIds is empty!") | 857 | error("mapIds is empty!") |
| 796 | return | 858 | return |
| 797 | end | 859 | end |
| 798 | - return pool[math.randomInt(1, #pool)] | 860 | + return math.randWeight(pool, "showup") |
| 799 | end | 861 | end |
| 800 | 862 | ||
| 801 | - | 863 | +-- log long1 字段被征用!!! |
| 802 | -- 在冒险中获得的物品都发放在冒险背包内 | 864 | -- 在冒险中获得的物品都发放在冒险背包内 |
| 803 | function Adv:award(gift, params) | 865 | function Adv:award(gift, params) |
| 804 | params = params or {} | 866 | params = params or {} |
| @@ -835,11 +897,13 @@ function Adv:award(gift, params) | @@ -835,11 +897,13 @@ function Adv:award(gift, params) | ||
| 835 | 897 | ||
| 836 | if params.log then | 898 | if params.log then |
| 837 | local log = clone(params.log) | 899 | local log = clone(params.log) |
| 838 | - if log["cint1"] or log["cint2"] or log["cint3"] then | 900 | + if log["cint1"] or log["cint2"] or log["cint3"] or log["long1"] then |
| 839 | print("addAdvItem error log have cint1 or cint2 or cint3 ", debug.traceback()) | 901 | print("addAdvItem error log have cint1 or cint2 or cint3 ", debug.traceback()) |
| 840 | end | 902 | end |
| 841 | - log["cint1"] = origin | 903 | + log["cint1"] = itemId |
| 842 | log["cint2"] = math.abs(count) | 904 | log["cint2"] = math.abs(count) |
| 905 | + log["cint3"] = self.chapterId | ||
| 906 | + log["long1"] = self.level | ||
| 843 | if count >= 0 then | 907 | if count >= 0 then |
| 844 | self.owner:log("in_adv", log) | 908 | self.owner:log("in_adv", log) |
| 845 | else | 909 | else |
| @@ -921,7 +985,7 @@ local function clickOut(self, room, block, params, isExit) | @@ -921,7 +985,7 @@ local function clickOut(self, room, block, params, isExit) | ||
| 921 | self:scoreChange(AdvScoreType.Level, curFloorData.advScore) --增加层级加分 | 985 | self:scoreChange(AdvScoreType.Level, curFloorData.advScore) --增加层级加分 |
| 922 | end | 986 | end |
| 923 | 987 | ||
| 924 | - if not self:isEndless() and (self.level >= csvdb["adv_chapterCsv"][self.chapterId].limitlevel or not self.owner:advChapterIsOpen(self.chapterId, self.level + 1)) then --关卡结束 | 988 | + if not self:isEndless() and (self.level >= csvdb["adv_chapterCsv"][self.chapterId].limitlevel) then --关卡结束 |
| 925 | self:over(true) | 989 | self:over(true) |
| 926 | else | 990 | else |
| 927 | self.battle.player:triggerPassive(Passive.DOWN_LAYER) | 991 | self.battle.player:triggerPassive(Passive.DOWN_LAYER) |
| @@ -933,10 +997,21 @@ local function clickOut(self, room, block, params, isExit) | @@ -933,10 +997,21 @@ local function clickOut(self, room, block, params, isExit) | ||
| 933 | 997 | ||
| 934 | self.owner:getProperty("advTeam").player = self.battle.player:getDB() -- 临时缓存住 battle 的player | 998 | self.owner:getProperty("advTeam").player = self.battle.player:getDB() -- 临时缓存住 battle 的player |
| 935 | if isHaveRelay and not self.isRelay then | 999 | if isHaveRelay and not self.isRelay then |
| 936 | - self:initByChapter(self.chapterId, self.level, true, true, true, false) | 1000 | + self:initByChapter({ |
| 1001 | + chapterId = self.chapterId, | ||
| 1002 | + level = self.level, | ||
| 1003 | + isToNext = true, | ||
| 1004 | + notNotify = true, | ||
| 1005 | + isRelay = true, | ||
| 1006 | + }) | ||
| 937 | else | 1007 | else |
| 938 | self:log({desc = "pass"}) | 1008 | self:log({desc = "pass"}) |
| 939 | - self:initByChapter(self.chapterId, self.level + 1, true, true, false, false) | 1009 | + self:initByChapter({ |
| 1010 | + chapterId = self.chapterId, | ||
| 1011 | + level = self.level + 1, | ||
| 1012 | + isToNext = true, | ||
| 1013 | + notNotify = true, | ||
| 1014 | + }) | ||
| 940 | end | 1015 | end |
| 941 | self:backNext() --下一关 | 1016 | self:backNext() --下一关 |
| 942 | end | 1017 | end |
| @@ -958,9 +1033,10 @@ local function clickMonster(self, room, block, params) | @@ -958,9 +1033,10 @@ local function clickMonster(self, room, block, params) | ||
| 958 | end | 1033 | end |
| 959 | 1034 | ||
| 960 | local function chooseCommon(self, room, block, chooseData, choose, tag) | 1035 | local function chooseCommon(self, room, block, chooseData, choose, tag) |
| 1036 | + if not choose then return end | ||
| 961 | if not chooseData or not chooseData["button".. choose .."cond"] then return end | 1037 | if not chooseData or not chooseData["button".. choose .."cond"] then return end |
| 962 | 1038 | ||
| 963 | - local cond = chooseData["button".. choose .."cond"]:toArray(true, "=") | 1039 | + local conds = chooseData["button".. choose .."cond"]:toTableArray(true) |
| 964 | local checkCond = { | 1040 | local checkCond = { |
| 965 | -- 没有条件 | 1041 | -- 没有条件 |
| 966 | [0] = function() | 1042 | [0] = function() |
| @@ -1035,10 +1111,54 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | @@ -1035,10 +1111,54 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | ||
| 1035 | [10] = function(_, artifactId) | 1111 | [10] = function(_, artifactId) |
| 1036 | return not self:isHaveArtifact(artifactId) | 1112 | return not self:isHaveArtifact(artifactId) |
| 1037 | end, | 1113 | end, |
| 1114 | + -- 11 = 地图上没有指定id 的怪 | ||
| 1115 | + [11] = function(_, monsterId) | ||
| 1116 | + for _, room in pairs(self:getCurMap().rooms) do | ||
| 1117 | + for _, block in pairs(room.blocks) do | ||
| 1118 | + if block:isMonster() then | ||
| 1119 | + if not monsterId then return false end | ||
| 1120 | + if block.event.id == monsterId then | ||
| 1121 | + return false | ||
| 1122 | + end | ||
| 1123 | + end | ||
| 1124 | + end | ||
| 1125 | + end | ||
| 1126 | + return true | ||
| 1127 | + end, | ||
| 1128 | + -- 12 = 地图上没有指定id 的建筑 | ||
| 1129 | + [12] = function(_, buildId) | ||
| 1130 | + for _, room in pairs(self:getCurMap().rooms) do | ||
| 1131 | + for _, block in pairs(room.blocks) do | ||
| 1132 | + if block:isBuild() then | ||
| 1133 | + if not buildId then return false end | ||
| 1134 | + if block.event.id == buildId then | ||
| 1135 | + return false | ||
| 1136 | + end | ||
| 1137 | + end | ||
| 1138 | + end | ||
| 1139 | + end | ||
| 1140 | + return true | ||
| 1141 | + end, | ||
| 1142 | + -- 13 = 地图上没有指定的 选择点 | ||
| 1143 | + [13] = function(_, chooseId) | ||
| 1144 | + for _, room in pairs(self:getCurMap().rooms) do | ||
| 1145 | + for _, block in pairs(room.blocks) do | ||
| 1146 | + if block:isChoose() then | ||
| 1147 | + if not chooseId then return false end | ||
| 1148 | + if block.event.id == chooseId then | ||
| 1149 | + return false | ||
| 1150 | + end | ||
| 1151 | + end | ||
| 1152 | + end | ||
| 1153 | + end | ||
| 1154 | + return true | ||
| 1155 | + end, | ||
| 1038 | } | 1156 | } |
| 1039 | - assert(not cond[1] or checkCond[cond[1]], "error cond, event_" .. (tag or "choose") .. "Csv id :" .. block.event.id) | ||
| 1040 | - | ||
| 1041 | - if cond[1] and not checkCond[cond[1]](table.unpack(cond)) then return end | 1157 | + for _, cond in ipairs(conds) do |
| 1158 | + assert(not cond[1] or checkCond[cond[1]], "error cond, event_" .. (tag or "choose") .. "Csv id :" .. block.event.id) | ||
| 1159 | + if cond[1] and not checkCond[cond[1]](table.unpack(cond)) then return end | ||
| 1160 | + end | ||
| 1161 | + | ||
| 1042 | local clearBlock = chooseData.keep ~= 1 | 1162 | local clearBlock = chooseData.keep ~= 1 |
| 1043 | local effects = chooseData["button".. choose .."effect"]:toTableArray(true) | 1163 | local effects = chooseData["button".. choose .."effect"]:toTableArray(true) |
| 1044 | for _, effect in ipairs(effects) do | 1164 | for _, effect in ipairs(effects) do |
| @@ -1047,8 +1167,13 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | @@ -1047,8 +1167,13 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | ||
| 1047 | local count = effect[3] or 1 | 1167 | local count = effect[3] or 1 |
| 1048 | local reward = {} | 1168 | local reward = {} |
| 1049 | for i = 1, count do | 1169 | for i = 1, count do |
| 1050 | - local item = csvdb["event_dropCsv"][effect[2]]["range"]:randWeight(true) | ||
| 1051 | - reward[item[1]] = (reward[item[1]] or 0) + item[2] | 1170 | + local dropData = csvdb["event_dropCsv"][effect[2]] |
| 1171 | + if dropData then | ||
| 1172 | + local item = dropData["range"]:randWeight(true) | ||
| 1173 | + reward[item[1]] = (reward[item[1]] or 0) + item[2] | ||
| 1174 | + else | ||
| 1175 | + skynet.error(string.format("[ERROR]: event_dropCsv no id %s in %s id: %s", effect[2], tag, chooseData.id)) | ||
| 1176 | + end | ||
| 1052 | end | 1177 | end |
| 1053 | self:backReward(self:award(reward, {log = {desc = "chooseEvent", key1 = tag, int1 = chooseData.id}}), {roomId = room.roomId, blockId = block.blockId}) | 1178 | self:backReward(self:award(reward, {log = {desc = "chooseEvent", key1 = tag, int1 = chooseData.id}}), {roomId = room.roomId, blockId = block.blockId}) |
| 1054 | end, | 1179 | end, |
| @@ -1059,9 +1184,6 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | @@ -1059,9 +1184,6 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | ||
| 1059 | end | 1184 | end |
| 1060 | end, | 1185 | end, |
| 1061 | [3] = function() --发现怪物 | 1186 | [3] = function() --发现怪物 |
| 1062 | - if block:getEventType() == AdvEventType.Build then | ||
| 1063 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | ||
| 1064 | - end | ||
| 1065 | self:getCurMap():addNewMonsterRand(effect[2], {room, block}) | 1187 | self:getCurMap():addNewMonsterRand(effect[2], {room, block}) |
| 1066 | self:pushBackEvent(AdvBackEventType.Monster, {id = effect[2]}) | 1188 | self:pushBackEvent(AdvBackEventType.Monster, {id = effect[2]}) |
| 1067 | clearBlock = false | 1189 | clearBlock = false |
| @@ -1083,59 +1205,71 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | @@ -1083,59 +1205,71 @@ local function chooseCommon(self, room, block, chooseData, choose, tag) | ||
| 1083 | etype = AdvEventType.Trader, | 1205 | etype = AdvEventType.Trader, |
| 1084 | id = effect[2] | 1206 | id = effect[2] |
| 1085 | }) | 1207 | }) |
| 1086 | - block:randomEvent() | ||
| 1087 | self:pushBackEvent(AdvBackEventType.Trader, {id = effect[2]}) | 1208 | self:pushBackEvent(AdvBackEventType.Trader, {id = effect[2]}) |
| 1088 | clearBlock = false | 1209 | clearBlock = false |
| 1089 | end, | 1210 | end, |
| 1090 | [7] = function() -- 建筑 | 1211 | [7] = function() -- 建筑 |
| 1091 | - if block:getEventType() == AdvEventType.Build then | ||
| 1092 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | ||
| 1093 | - end | ||
| 1094 | block:updateEvent({ | 1212 | block:updateEvent({ |
| 1095 | etype = AdvEventType.Build, | 1213 | etype = AdvEventType.Build, |
| 1096 | id = effect[2] | 1214 | id = effect[2] |
| 1097 | }) | 1215 | }) |
| 1098 | - block:randomEvent() | ||
| 1099 | clearBlock = false | 1216 | clearBlock = false |
| 1100 | end, | 1217 | end, |
| 1101 | [8] = function() -- 选择 | 1218 | [8] = function() -- 选择 |
| 1102 | - if block:getEventType() == AdvEventType.Build then | ||
| 1103 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | ||
| 1104 | - end | ||
| 1105 | block:updateEvent({ | 1219 | block:updateEvent({ |
| 1106 | etype = AdvEventType.Choose, | 1220 | etype = AdvEventType.Choose, |
| 1107 | id = effect[2] | 1221 | id = effect[2] |
| 1108 | }) | 1222 | }) |
| 1109 | - block:randomEvent() | ||
| 1110 | clearBlock = false | 1223 | clearBlock = false |
| 1111 | end, | 1224 | end, |
| 1112 | [9] = function() -- click | 1225 | [9] = function() -- click |
| 1113 | - if block:getEventType() == AdvEventType.Build then | ||
| 1114 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | ||
| 1115 | - end | ||
| 1116 | block:updateEvent({ | 1226 | block:updateEvent({ |
| 1117 | etype = AdvEventType.Click, | 1227 | etype = AdvEventType.Click, |
| 1118 | id = effect[2] | 1228 | id = effect[2] |
| 1119 | }) | 1229 | }) |
| 1120 | - block:randomEvent() | ||
| 1121 | clearBlock = false | 1230 | clearBlock = false |
| 1122 | end, | 1231 | end, |
| 1123 | [10] = function() -- 陷阱 | 1232 | [10] = function() -- 陷阱 |
| 1124 | - if block:getEventType() == AdvEventType.Build then | ||
| 1125 | - self.battle:removeBuildByPos(room.roomId, block.blockId) | ||
| 1126 | - end | ||
| 1127 | block:updateEvent({ | 1233 | block:updateEvent({ |
| 1128 | etype = AdvEventType.Trap, | 1234 | etype = AdvEventType.Trap, |
| 1129 | id = effect[2] | 1235 | id = effect[2] |
| 1130 | }) | 1236 | }) |
| 1131 | - block:randomEvent() | ||
| 1132 | clearBlock = false | 1237 | clearBlock = false |
| 1133 | end, | 1238 | end, |
| 1134 | [11] = function() -- 获得神器 | 1239 | [11] = function() -- 获得神器 |
| 1135 | self:waitChooseArtifact() --等待获取神器 | 1240 | self:waitChooseArtifact() --等待获取神器 |
| 1136 | - end | 1241 | + end, |
| 1242 | + [12] = function() | ||
| 1243 | + -- buffId | ||
| 1244 | + local targers = self.battle.player:getTeam(2, nil, nil, true) | ||
| 1245 | + for _, target in pairs(targers) do | ||
| 1246 | + target:addBuff(effect[2]) | ||
| 1247 | + end | ||
| 1248 | + end, | ||
| 1249 | + [13] = function() -- 显示地图 | ||
| 1250 | + self:getCurMap():showMap() | ||
| 1251 | + self:backMapShow() | ||
| 1252 | + end, | ||
| 1253 | + [14] = function() -- 指定地块召唤 指定类型的id | ||
| 1254 | + local change = self:getCurMap():layEventToStage(effect[2], effect[3], effect[4], effect[5]) | ||
| 1255 | + for _, one in ipairs(change) do | ||
| 1256 | + self:backBlockChange(one[1].roomId, one[2].blockId) | ||
| 1257 | + end | ||
| 1258 | + end, | ||
| 1259 | + [15] = function() -- 移除指定事件 | ||
| 1260 | + local change = self:getCurMap():clearEventById(effect[2], effect[3], effect[4]) | ||
| 1261 | + for _, one in ipairs(change) do | ||
| 1262 | + self:backBlockChange(one[1].roomId, one[2].blockId) | ||
| 1263 | + end | ||
| 1264 | + end, | ||
| 1265 | + [16] = function() -- 指定事件转移 | ||
| 1266 | + local change = self:getCurMap():eventChangeToOther(effect[2], effect[3], effect[4], effect[5], effect[6]) | ||
| 1267 | + for _, one in ipairs(change) do | ||
| 1268 | + self:backBlockChange(one[1].roomId, one[2].blockId) | ||
| 1269 | + end | ||
| 1270 | + end, | ||
| 1137 | } | 1271 | } |
| 1138 | - assert(doEffect[effect[1]], "error effect, event_" .. (tag or "choose") .. "Csv id :" .. block.event.id) | 1272 | + assert(doEffect[effect[1]], "error effect, event_" .. (tag or "choose") .. "Csv id :" .. (block.event and block.event.id or 0) .. "effect " .. effect[1]) |
| 1139 | doEffect[effect[1]]() | 1273 | doEffect[effect[1]]() |
| 1140 | end | 1274 | end |
| 1141 | self:scoreChange(AdvScoreType.Event, chooseData.advScore) --增加加分 | 1275 | self:scoreChange(AdvScoreType.Event, chooseData.advScore) --增加加分 |
| @@ -1201,7 +1335,9 @@ end | @@ -1201,7 +1335,9 @@ end | ||
| 1201 | local function clickDrop(self, room, block, params) | 1335 | local function clickDrop(self, room, block, params) |
| 1202 | local reward = {} | 1336 | local reward = {} |
| 1203 | if not block.event.item then return end | 1337 | if not block.event.item then return end |
| 1338 | + if not self.battle or not self.battle.player then return end | ||
| 1204 | self.battle.player:triggerPassive(Passive.CLICK_DROP) | 1339 | self.battle.player:triggerPassive(Passive.CLICK_DROP) |
| 1340 | + | ||
| 1205 | local reward = self:award({[block.event.item[1]] = block.event.item[2]}, {log = {desc = "clickDrop"}}) | 1341 | local reward = self:award({[block.event.item[1]] = block.event.item[2]}, {log = {desc = "clickDrop"}}) |
| 1206 | -- local reward = self:award({[5801] = 1}) | 1342 | -- local reward = self:award({[5801] = 1}) |
| 1207 | block:clear() | 1343 | block:clear() |
| @@ -1306,7 +1442,8 @@ local function clickLayer(self, room, block, params) | @@ -1306,7 +1442,8 @@ local function clickLayer(self, room, block, params) | ||
| 1306 | table.insert(self.mapStack, mapIdx) | 1442 | table.insert(self.mapStack, mapIdx) |
| 1307 | 1443 | ||
| 1308 | self.maps[mapIdx] = AdvMap.new(self, mapIdx, mapId) | 1444 | self.maps[mapIdx] = AdvMap.new(self, mapIdx, mapId) |
| 1309 | - self.battle:initMapEnemys(mapIdx) | 1445 | + self.battle:initMapEnemys(mapIdx, true) |
| 1446 | + self.battle:initMapEffect(true) | ||
| 1310 | self.maps[mapIdx]:initBattleAfter() | 1447 | self.maps[mapIdx]:initBattleAfter() |
| 1311 | self:checkAchievement(Adv.AchievType.EnterILayer, 1, mapId) | 1448 | self:checkAchievement(Adv.AchievType.EnterILayer, 1, mapId) |
| 1312 | end | 1449 | end |
| @@ -1347,7 +1484,7 @@ function Adv:clickBlock(roomId, blockId, params) | @@ -1347,7 +1484,7 @@ function Adv:clickBlock(roomId, blockId, params) | ||
| 1347 | if not ignoreGuard and _block:isGuard() then | 1484 | if not ignoreGuard and _block:isGuard() then |
| 1348 | if _block:isMonster() then | 1485 | if _block:isMonster() then |
| 1349 | local enemy = self.battle:getEnemy(_room.roomId, _block.blockId) | 1486 | local enemy = self.battle:getEnemy(_room.roomId, _block.blockId) |
| 1350 | - if not enemy:hadBuff(Buff.DONT_DEFEND) then | 1487 | + if not enemy:hadBuff(Buff.DONT_DEFEND) and not self.battle.player:hadBuff(Buff.SNEAK) then |
| 1351 | return false | 1488 | return false |
| 1352 | end | 1489 | end |
| 1353 | else | 1490 | else |
| @@ -1485,7 +1622,6 @@ function Adv:doActive(activeId, target) | @@ -1485,7 +1622,6 @@ function Adv:doActive(activeId, target) | ||
| 1485 | etype = AdvEventType.Trader, | 1622 | etype = AdvEventType.Trader, |
| 1486 | id = traderId, | 1623 | id = traderId, |
| 1487 | }) | 1624 | }) |
| 1488 | - target:randomEvent() | ||
| 1489 | self:backBlockChange(target.room.roomId, target.blockId) | 1625 | self:backBlockChange(target.room.roomId, target.blockId) |
| 1490 | self:pushBackEvent(AdvBackEventType.Trader, {id = traderId}) | 1626 | self:pushBackEvent(AdvBackEventType.Trader, {id = traderId}) |
| 1491 | end | 1627 | end |
| @@ -1497,7 +1633,6 @@ function Adv:doActive(activeId, target) | @@ -1497,7 +1633,6 @@ function Adv:doActive(activeId, target) | ||
| 1497 | doActiveEffect[3] = function(_, monsterId) | 1633 | doActiveEffect[3] = function(_, monsterId) |
| 1498 | for _, target in ipairs(targers) do | 1634 | for _, target in ipairs(targers) do |
| 1499 | if not target.lock and not target.isDead then | 1635 | if not target.lock and not target.isDead then |
| 1500 | - self.battle:removeEnemyById(target.id) | ||
| 1501 | self:getCurMap():addNewMonsterRand(monsterId, {self:getRoom(target.roomId), self:getBlock(target.roomId, target.blockId)}) | 1636 | self:getCurMap():addNewMonsterRand(monsterId, {self:getRoom(target.roomId), self:getBlock(target.roomId, target.blockId)}) |
| 1502 | self:backBlockChange(target.roomId, target.blockId) | 1637 | self:backBlockChange(target.roomId, target.blockId) |
| 1503 | self:pushBackEvent(AdvBackEventType.Monster, {id = monsterId}) | 1638 | self:pushBackEvent(AdvBackEventType.Monster, {id = monsterId}) |
| @@ -1515,7 +1650,7 @@ function Adv:doActive(activeId, target) | @@ -1515,7 +1650,7 @@ function Adv:doActive(activeId, target) | ||
| 1515 | doActiveEffect[5] = function(_) | 1650 | doActiveEffect[5] = function(_) |
| 1516 | for _, target in ipairs(targers) do | 1651 | for _, target in ipairs(targers) do |
| 1517 | if not target.lock and not target.isDead then | 1652 | if not target.lock and not target.isDead then |
| 1518 | - target.isDead = true | 1653 | + target:kill() |
| 1519 | self:backBlockChange(target.roomId, target.blockId) | 1654 | self:backBlockChange(target.roomId, target.blockId) |
| 1520 | end | 1655 | end |
| 1521 | end | 1656 | end |
| @@ -1679,8 +1814,12 @@ function Adv:enemyDead(enemy, escape) | @@ -1679,8 +1814,12 @@ function Adv:enemyDead(enemy, escape) | ||
| 1679 | if buff then | 1814 | if buff then |
| 1680 | item = table.pack(buff:effect()) | 1815 | item = table.pack(buff:effect()) |
| 1681 | else | 1816 | else |
| 1682 | - local dropData = csvdb["event_dropCsv"][monsterData.dropid] | ||
| 1683 | - item = dropData["range"]:randWeight(true) | 1817 | + if monsterData.dropid == 0 then |
| 1818 | + item = {0, 0} | ||
| 1819 | + else | ||
| 1820 | + local dropData = csvdb["event_dropCsv"][monsterData.dropid] | ||
| 1821 | + item = dropData["range"]:randWeight(true) | ||
| 1822 | + end | ||
| 1684 | end | 1823 | end |
| 1685 | 1824 | ||
| 1686 | end | 1825 | end |
| @@ -1688,6 +1827,11 @@ function Adv:enemyDead(enemy, escape) | @@ -1688,6 +1827,11 @@ function Adv:enemyDead(enemy, escape) | ||
| 1688 | block:clear() | 1827 | block:clear() |
| 1689 | self.battle.player:triggerPassive(Passive.BATTLE_WIN) | 1828 | self.battle.player:triggerPassive(Passive.BATTLE_WIN) |
| 1690 | else | 1829 | else |
| 1830 | + local buff = enemy:hadBuff(Buff.DROP_BUFF_BY_ENEMY) -- 根据敌人数量变化个数 | ||
| 1831 | + if buff then | ||
| 1832 | + local team = enemy:getTeam(1, true) | ||
| 1833 | + item[2] = math.floor(item[2] * (1 + 0.2 * #team)) | ||
| 1834 | + end | ||
| 1691 | block:updateEvent({ | 1835 | block:updateEvent({ |
| 1692 | etype = AdvEventType.Drop, | 1836 | etype = AdvEventType.Drop, |
| 1693 | item = item | 1837 | item = item |
| @@ -1736,8 +1880,8 @@ function Adv:backNext() | @@ -1736,8 +1880,8 @@ function Adv:backNext() | ||
| 1736 | self:pushBackEvent(AdvBackEventType.Next, {}) | 1880 | self:pushBackEvent(AdvBackEventType.Next, {}) |
| 1737 | end | 1881 | end |
| 1738 | 1882 | ||
| 1739 | -function Adv:backEnd(success, score, scoreInfo, reward, overType, scoreAward) | ||
| 1740 | - self:pushBackEvent(AdvBackEventType.End, {success = success, score = score, scoreInfo = scoreInfo, reward = reward, type = overType, scoreAward = scoreAward}) | 1883 | +function Adv:backEnd(success, score, scoreInfo, reward, overType, scoreAward, chapterId) |
| 1884 | + self:pushBackEvent(AdvBackEventType.End, {success = success, score = score, scoreInfo = scoreInfo, reward = reward, type = overType, scoreAward = scoreAward, chapterId = chapterId}) | ||
| 1741 | end | 1885 | end |
| 1742 | 1886 | ||
| 1743 | function Adv:backBlockChange(roomId, blockId, itemChangeType) | 1887 | function Adv:backBlockChange(roomId, blockId, itemChangeType) |
src/adv/AdvBattle.lua
| @@ -18,16 +18,22 @@ function Battle:ctor(adv) | @@ -18,16 +18,22 @@ function Battle:ctor(adv) | ||
| 18 | end | 18 | end |
| 19 | end | 19 | end |
| 20 | 20 | ||
| 21 | -function Battle:initAfter() | ||
| 22 | - self.player:initAfter(self.adv.owner:getProperty("advTeam").player) | 21 | +function Battle:initAfter(mapIdx) |
| 22 | + if not mapIdx then | ||
| 23 | + self.player:initAfter(self.adv.owner:getProperty("advTeam").player) | ||
| 24 | + end | ||
| 23 | for idx, mapEnemys in pairs(self.enemys) do | 25 | for idx, mapEnemys in pairs(self.enemys) do |
| 24 | - for _, enemy in ipairs(mapEnemys) do | ||
| 25 | - enemy:initAfter(self.adv:getBlock(enemy.roomId, enemy.blockId, idx).event.enemy) | 26 | + if not mapIdx or idx == mapIdx then |
| 27 | + for _, enemy in ipairs(mapEnemys) do | ||
| 28 | + enemy:initAfter(self.adv:getBlock(enemy.roomId, enemy.blockId, idx).event.enemy) | ||
| 29 | + end | ||
| 26 | end | 30 | end |
| 27 | end | 31 | end |
| 28 | for idx, mapBuilds in pairs(self.builds) do | 32 | for idx, mapBuilds in pairs(self.builds) do |
| 29 | - for _, build in ipairs(mapBuilds) do | ||
| 30 | - build:initAfter(self.adv:getBlock(build.roomId, build.blockId, idx).event.build) | 33 | + if not mapIdx or idx == mapIdx then |
| 34 | + for _, build in ipairs(mapBuilds) do | ||
| 35 | + build:initAfter(self.adv:getBlock(build.roomId, build.blockId, idx).event.build) | ||
| 36 | + end | ||
| 31 | end | 37 | end |
| 32 | end | 38 | end |
| 33 | end | 39 | end |
| @@ -65,7 +71,9 @@ function Battle:initPlayer() | @@ -65,7 +71,9 @@ function Battle:initPlayer() | ||
| 65 | player.level = 1 | 71 | player.level = 1 |
| 66 | if self.adv.level ~= 1 then | 72 | if self.adv.level ~= 1 then |
| 67 | local relayData = self.adv:isHaveRelay() | 73 | local relayData = self.adv:isHaveRelay() |
| 68 | - player.level = relayData.level | 74 | + if relayData then |
| 75 | + player.level = relayData.level | ||
| 76 | + end | ||
| 69 | end | 77 | end |
| 70 | player.exp = 0 | 78 | player.exp = 0 |
| 71 | player.sp = getAdvLvAttrUp(advAddAttrs, "sp", 100) | 79 | player.sp = getAdvLvAttrUp(advAddAttrs, "sp", 100) |
| @@ -109,18 +117,21 @@ function Battle:initEnemys() | @@ -109,18 +117,21 @@ function Battle:initEnemys() | ||
| 109 | end | 117 | end |
| 110 | end | 118 | end |
| 111 | 119 | ||
| 112 | - | ||
| 113 | -function Battle:initMapEnemys(mapIdx) | 120 | +-- after 是否是 后创建的夹层 |
| 121 | +function Battle:initMapEnemys(mapIdx, after) | ||
| 114 | self.enemys[mapIdx] = {} | 122 | self.enemys[mapIdx] = {} |
| 115 | self.builds[mapIdx] = {} | 123 | self.builds[mapIdx] = {} |
| 116 | local map = self.adv.maps[mapIdx] | 124 | local map = self.adv.maps[mapIdx] |
| 117 | if map then | 125 | if map then |
| 118 | for _, room in pairs(map.rooms) do | 126 | for _, room in pairs(map.rooms) do |
| 119 | for _, block in pairs(room.blocks) do | 127 | for _, block in pairs(room.blocks) do |
| 120 | - self:addEnemy(room, block, mapIdx) | 128 | + self:addEnemy(room, block, mapIdx, true) |
| 121 | end | 129 | end |
| 122 | end | 130 | end |
| 123 | end | 131 | end |
| 132 | + if after then | ||
| 133 | + self:initAfter(mapIdx) | ||
| 134 | + end | ||
| 124 | if self.cachePassiveEvent[mapIdx] then | 135 | if self.cachePassiveEvent[mapIdx] then |
| 125 | for _, passiveC in ipairs(self.cachePassiveEvent or {}) do | 136 | for _, passiveC in ipairs(self.cachePassiveEvent or {}) do |
| 126 | for _, enemy in ipairs(self.enemys[mapIdx]) do | 137 | for _, enemy in ipairs(self.enemys[mapIdx]) do |
| @@ -135,9 +146,10 @@ function Battle:initMapEnemys(mapIdx) | @@ -135,9 +146,10 @@ function Battle:initMapEnemys(mapIdx) | ||
| 135 | self.cachePassiveEvent[mapIdx] = nil | 146 | self.cachePassiveEvent[mapIdx] = nil |
| 136 | end | 147 | end |
| 137 | 148 | ||
| 138 | -function Battle:addEnemy(room, block, mapIdx) | 149 | +function Battle:addEnemy(room, block, mapIdx, init) |
| 139 | mapIdx = mapIdx or self.adv:getCurMapIdx() | 150 | mapIdx = mapIdx or self.adv:getCurMapIdx() |
| 140 | 151 | ||
| 152 | + local isNew, player, data | ||
| 141 | if block:isMonster() then | 153 | if block:isMonster() then |
| 142 | if not block.event.enemy then | 154 | if not block.event.enemy then |
| 143 | local enemyCsv = csvdb["event_monsterCsv"][block.event.id] | 155 | local enemyCsv = csvdb["event_monsterCsv"][block.event.id] |
| @@ -151,10 +163,15 @@ function Battle:addEnemy(room, block, mapIdx) | @@ -151,10 +163,15 @@ function Battle:addEnemy(room, block, mapIdx) | ||
| 151 | table.insert(enemy.passives, {id = id}) | 163 | table.insert(enemy.passives, {id = id}) |
| 152 | end | 164 | end |
| 153 | block.event.enemy = enemy | 165 | block.event.enemy = enemy |
| 166 | + isNew = true | ||
| 167 | + end | ||
| 168 | + if not block.event.mId then | ||
| 169 | + block.event.mId = self.adv.lastEnemyId | ||
| 170 | + self.adv.lastEnemyId = self.adv.lastEnemyId + 1 | ||
| 154 | end | 171 | end |
| 155 | - local player = Enemy.new(self, block.event.mId or 999, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.enemy, mapIdx) | 172 | + data = block.event.enemy |
| 173 | + player = Enemy.new(self, block.event.mId, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.enemy, mapIdx) | ||
| 156 | table.insert(self.enemys[mapIdx], player) | 174 | table.insert(self.enemys[mapIdx], player) |
| 157 | - return player | ||
| 158 | elseif block:isBuild() then | 175 | elseif block:isBuild() then |
| 159 | if not block.event.build then | 176 | if not block.event.build then |
| 160 | local buildCsv = csvdb["event_buildingCsv"][block.event.id] | 177 | local buildCsv = csvdb["event_buildingCsv"][block.event.id] |
| @@ -164,11 +181,28 @@ function Battle:addEnemy(room, block, mapIdx) | @@ -164,11 +181,28 @@ function Battle:addEnemy(room, block, mapIdx) | ||
| 164 | table.insert(build.passives, {id = id}) | 181 | table.insert(build.passives, {id = id}) |
| 165 | end | 182 | end |
| 166 | block.event.build = build | 183 | block.event.build = build |
| 184 | + isNew = true | ||
| 167 | end | 185 | end |
| 168 | - local player = Build.new(self, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.build, mapIdx) | 186 | + data = block.event.build |
| 187 | + player = Build.new(self, block.event.id, room.roomId, block.blockId, not block.isOpen, block.event.build, mapIdx) | ||
| 169 | table.insert(self.builds[mapIdx], player) | 188 | table.insert(self.builds[mapIdx], player) |
| 170 | - return player | ||
| 171 | end | 189 | end |
| 190 | + if not init then | ||
| 191 | + player:initAfter(data) | ||
| 192 | + | ||
| 193 | + -- 游戏中新创建的 加上地图 floor 效果 | ||
| 194 | + if isNew then | ||
| 195 | + local passives, buffs = self:getMapEffect(2, true, mapIdx) | ||
| 196 | + for _, passive in ipairs(passives) do | ||
| 197 | + player:addPassive({id = passive}) | ||
| 198 | + end | ||
| 199 | + | ||
| 200 | + for _, buff in ipairs(buffs) do | ||
| 201 | + enemy:addBuff(buff) | ||
| 202 | + end | ||
| 203 | + end | ||
| 204 | + end | ||
| 205 | + return player | ||
| 172 | end | 206 | end |
| 173 | 207 | ||
| 174 | function Battle:getEnemy(roomId, blockId, mapIdx) | 208 | function Battle:getEnemy(roomId, blockId, mapIdx) |
| @@ -249,16 +283,29 @@ end | @@ -249,16 +283,29 @@ end | ||
| 249 | --回合 | 283 | --回合 |
| 250 | function Battle:afterRound() | 284 | function Battle:afterRound() |
| 251 | local mapIdx = self.adv:getCurMapIdx() | 285 | local mapIdx = self.adv:getCurMapIdx() |
| 252 | - self.player:afterRound() | 286 | + |
| 253 | table.sort(self.enemys[mapIdx], function(e1, e2) | 287 | table.sort(self.enemys[mapIdx], function(e1, e2) |
| 254 | return e1.id < e2.id | 288 | return e1.id < e2.id |
| 255 | end) | 289 | end) |
| 290 | + | ||
| 291 | + self.player:afterRound("passive") | ||
| 256 | for _, enemy in ipairs(self.enemys[mapIdx]) do | 292 | for _, enemy in ipairs(self.enemys[mapIdx]) do |
| 257 | - enemy:afterRound() | 293 | + enemy:afterRound("passive") |
| 258 | end | 294 | end |
| 259 | for _, build in ipairs(self.builds[mapIdx]) do | 295 | for _, build in ipairs(self.builds[mapIdx]) do |
| 260 | - build:afterRound() | 296 | + build:afterRound("passive") |
| 297 | + end | ||
| 298 | + | ||
| 299 | + self.player:afterRound("buff") | ||
| 300 | + for _, enemy in ipairs(self.enemys[mapIdx]) do | ||
| 301 | + enemy:afterRound("buff") | ||
| 261 | end | 302 | end |
| 303 | + for _, build in ipairs(self.builds[mapIdx]) do | ||
| 304 | + build:afterRound("buff") | ||
| 305 | + end | ||
| 306 | + | ||
| 307 | + | ||
| 308 | + | ||
| 262 | self.player:clearRound() | 309 | self.player:clearRound() |
| 263 | for _, enemy in ipairs(self.enemys[mapIdx]) do | 310 | for _, enemy in ipairs(self.enemys[mapIdx]) do |
| 264 | enemy:clearRound() | 311 | enemy:clearRound() |
| @@ -292,9 +339,10 @@ function Battle:battleBegin(roomId, blockId, params) | @@ -292,9 +339,10 @@ function Battle:battleBegin(roomId, blockId, params) | ||
| 292 | local enemy = self:getEnemy(roomId, blockId) | 339 | local enemy = self:getEnemy(roomId, blockId) |
| 293 | if not enemy then return end | 340 | if not enemy then return end |
| 294 | local player = params.player | 341 | local player = params.player |
| 342 | + if not player then return end | ||
| 295 | -- 玩家没死就是怪死了 | 343 | -- 玩家没死就是怪死了 |
| 296 | if player.hp > 0 then | 344 | if player.hp > 0 then |
| 297 | - enemy:hurt(enemy.hp, self.player, {hurtType = 5}) | 345 | + enemy:kill() |
| 298 | self.player:effectBattleBuff() | 346 | self.player:effectBattleBuff() |
| 299 | 347 | ||
| 300 | self.adv.owner:checkTaskEnter("AdvBattleWin", {id = self.adv.chapterId}) | 348 | self.adv.owner:checkTaskEnter("AdvBattleWin", {id = self.adv.chapterId}) |
| @@ -312,6 +360,63 @@ function Battle:battleBegin(roomId, blockId, params) | @@ -312,6 +360,63 @@ function Battle:battleBegin(roomId, blockId, params) | ||
| 312 | end | 360 | end |
| 313 | 361 | ||
| 314 | 362 | ||
| 363 | +function Battle:getMapEffect(ctype, ilayer, mapIdx) | ||
| 364 | + mapIdx = mapIdx or self.adv:getCurMapIdx() | ||
| 365 | + local mapData = self.adv.maps[mapIdx]:getMapInfoCsv() or {} | ||
| 366 | + local floorData = self.adv:getCurFloorData() or {} | ||
| 367 | + | ||
| 368 | + local passives = {} | ||
| 369 | + local buffs = {} | ||
| 370 | + | ||
| 371 | + for _type, temp in ipairs({mapData, floorData}) do | ||
| 372 | + for _, one in ipairs((temp.passive or ""):toTableArray(true)) do | ||
| 373 | + passives[one[1]] = passives[one[1]] or {} | ||
| 374 | + if ilayer and one[1] == 1 and _type == 2 then | ||
| 375 | + else | ||
| 376 | + table.insert(passives[one[1]], one[2]) | ||
| 377 | + end | ||
| 378 | + end | ||
| 379 | + for _, one in ipairs((temp.buff or ""):toTableArray(true)) do | ||
| 380 | + buffs[one[1]] = buffs[one[1]] or {} | ||
| 381 | + if ilayer and one[1] == 1 and _type == 2 then | ||
| 382 | + else | ||
| 383 | + table.insert(buffs[one[1]], one[2]) | ||
| 384 | + end | ||
| 385 | + end | ||
| 386 | + end | ||
| 387 | + if ctype then | ||
| 388 | + passives = passives[ctype] or {} | ||
| 389 | + buffs = buffs[ctype] or {} | ||
| 390 | + end | ||
| 391 | + return passives, buffs | ||
| 392 | +end | ||
| 393 | +-- 夹层玩家 不重复加 floor | ||
| 394 | +function Battle:initMapEffect(ilayer) | ||
| 395 | + local passives, buffs = self:getMapEffect(nil, ilayer) | ||
| 396 | + local mapIdx = self.adv:getCurMapIdx() | ||
| 397 | + | ||
| 398 | + for _, passive in ipairs(passives[1] or {}) do | ||
| 399 | + self.player:addPassive({id = passive}) | ||
| 400 | + end | ||
| 401 | + | ||
| 402 | + for _, passive in ipairs(passives[2] or {}) do | ||
| 403 | + for _, enemy in ipairs(self.enemys[mapIdx]) do | ||
| 404 | + enemy:addPassive({id = passive}) | ||
| 405 | + end | ||
| 406 | + end | ||
| 407 | + | ||
| 408 | + for _, buff in ipairs(buffs[1] or {}) do | ||
| 409 | + self.palyer:addBuff(buff) | ||
| 410 | + end | ||
| 411 | + | ||
| 412 | + for _, buff in ipairs(buffs[2] or {}) do | ||
| 413 | + for _, enemy in ipairs(self.enemys[mapIdx]) do | ||
| 414 | + enemy:addBuff(buff) | ||
| 415 | + end | ||
| 416 | + end | ||
| 417 | +end | ||
| 418 | + | ||
| 419 | + | ||
| 315 | --写入数据 | 420 | --写入数据 |
| 316 | function Battle:saveDB() | 421 | function Battle:saveDB() |
| 317 | for idx, mapEnemys in pairs(self.enemys) do | 422 | for idx, mapEnemys in pairs(self.enemys) do |
src/adv/AdvBlock.lua
| @@ -25,12 +25,39 @@ function Block:isBuild() | @@ -25,12 +25,39 @@ function Block:isBuild() | ||
| 25 | return self:getEventType() == AdvEventType.Build | 25 | return self:getEventType() == AdvEventType.Build |
| 26 | end | 26 | end |
| 27 | 27 | ||
| 28 | +function Block:isChoose() | ||
| 29 | + return self:getEventType() == AdvEventType.Choose | ||
| 30 | +end | ||
| 31 | + | ||
| 28 | function Block:getEventType() | 32 | function Block:getEventType() |
| 29 | return self.event and self.event.etype | 33 | return self.event and self.event.etype |
| 30 | end | 34 | end |
| 31 | 35 | ||
| 36 | +function Block:getStageType() | ||
| 37 | + return self.room:getStageType(self.blockId) | ||
| 38 | +end | ||
| 39 | + | ||
| 32 | function Block:updateEvent(event, isInit) | 40 | function Block:updateEvent(event, isInit) |
| 41 | + if not isInit then | ||
| 42 | + -- 有些事件删除 需要处理 | ||
| 43 | + if self:isBuild() then | ||
| 44 | + self.room.map.adv.battle:removeBuildByPos(self.room.roomId, self.blockId) | ||
| 45 | + elseif self:isMonster() then | ||
| 46 | + if self.event.mId then | ||
| 47 | + self.room.map.adv.battle:removeEnemyById(self.event.mId) | ||
| 48 | + end | ||
| 49 | + end | ||
| 50 | + end | ||
| 33 | self.event = event | 51 | self.event = event |
| 52 | + if not isInit and self.event then | ||
| 53 | + -- 判断下类型是不是错的 | ||
| 54 | + if not self:getEventData() and (self:getEventType() ~= AdvEventType.Drop or not self.event.item) then | ||
| 55 | + self:clear() | ||
| 56 | + assert(false, "updateEvent error, : event " .. (event.etype or "nil")) | ||
| 57 | + return | ||
| 58 | + end | ||
| 59 | + self:randomEvent() | ||
| 60 | + end | ||
| 34 | end | 61 | end |
| 35 | 62 | ||
| 36 | function Block:clear() | 63 | function Block:clear() |
| @@ -54,14 +81,11 @@ function Block:randomEvent() | @@ -54,14 +81,11 @@ function Block:randomEvent() | ||
| 54 | local randomFunc = {} | 81 | local randomFunc = {} |
| 55 | --怪 | 82 | --怪 |
| 56 | randomFunc[AdvEventType.Monster] = function() | 83 | randomFunc[AdvEventType.Monster] = function() |
| 57 | - self.event.mId = adv.lastEnemyId --给怪一个有序id 回合逻辑时使用 | ||
| 58 | - adv.lastEnemyId = adv.lastEnemyId + 1 | ||
| 59 | local enemy = adv.battle:getEnemy(room.roomId, self.blockId, map.mapIdx) | 84 | local enemy = adv.battle:getEnemy(room.roomId, self.blockId, map.mapIdx) |
| 60 | if enemy then | 85 | if enemy then |
| 61 | - enemy:unlock(self.event.mId) | 86 | + enemy:unlock() |
| 62 | else | 87 | else |
| 63 | enemy = adv.battle:addEnemy(room, self, map.mapIdx) | 88 | enemy = adv.battle:addEnemy(room, self, map.mapIdx) |
| 64 | - enemy:initAfter(self.event.enemy) | ||
| 65 | end | 89 | end |
| 66 | enemy:triggerPassive(Passive.BORN_ONCE) | 90 | enemy:triggerPassive(Passive.BORN_ONCE) |
| 67 | 91 | ||
| @@ -73,7 +97,9 @@ function Block:randomEvent() | @@ -73,7 +97,9 @@ function Block:randomEvent() | ||
| 73 | randomFunc[AdvEventType.BOSS] = randomFunc[AdvEventType.Monster] | 97 | randomFunc[AdvEventType.BOSS] = randomFunc[AdvEventType.Monster] |
| 74 | --掉落 | 98 | --掉落 |
| 75 | randomFunc[AdvEventType.Drop] = function() | 99 | randomFunc[AdvEventType.Drop] = function() |
| 76 | - self.event.item = csvdb["event_dropCsv"][self.event.id]["range"]:randWeight(true) | 100 | + if not self.event.item then |
| 101 | + self.event.item = csvdb["event_dropCsv"][self.event.id]["range"]:randWeight(true) | ||
| 102 | + end | ||
| 77 | end | 103 | end |
| 78 | --交易 | 104 | --交易 |
| 79 | randomFunc[AdvEventType.Trader] = function() | 105 | randomFunc[AdvEventType.Trader] = function() |
| @@ -144,7 +170,6 @@ function Block:randomEvent() | @@ -144,7 +170,6 @@ function Block:randomEvent() | ||
| 144 | build:unlock() | 170 | build:unlock() |
| 145 | else | 171 | else |
| 146 | build = adv.battle:addEnemy(room, self, map.mapIdx) | 172 | build = adv.battle:addEnemy(room, self, map.mapIdx) |
| 147 | - build:initAfter(self.event.build) | ||
| 148 | end | 173 | end |
| 149 | build:triggerPassive(Passive.BORN_ONCE) | 174 | build:triggerPassive(Passive.BORN_ONCE) |
| 150 | end | 175 | end |
| @@ -155,13 +180,18 @@ function Block:randomEvent() | @@ -155,13 +180,18 @@ function Block:randomEvent() | ||
| 155 | adv.battle.player:triggerPassive(Passive.CLICK_TRAP) | 180 | adv.battle.player:triggerPassive(Passive.CLICK_TRAP) |
| 156 | 181 | ||
| 157 | local buffs = data.effect:toArray(true, "=") | 182 | local buffs = data.effect:toArray(true, "=") |
| 158 | - for _, buffId in ipairs(buffs) do | ||
| 159 | - adv.battle.player:addBuff(buffId) | ||
| 160 | - end | 183 | + |
| 161 | 184 | ||
| 162 | local backTrap = true | 185 | local backTrap = true |
| 163 | - if data.target == 1 then-- 给所有敌人同样增加buff | 186 | + if data.target == 0 then -- 给玩家增加buff |
| 187 | + for _, buffId in ipairs(buffs) do | ||
| 188 | + adv.battle.player:addBuff(buffId) | ||
| 189 | + end | ||
| 190 | + elseif data.target == 1 then-- 给玩家 和 所有敌人同样增加buff | ||
| 164 | local enemys = adv.battle.player:getTeam(2) | 191 | local enemys = adv.battle.player:getTeam(2) |
| 192 | + for _, buffId in ipairs(buffs) do | ||
| 193 | + adv.battle.player:addBuff(buffId) | ||
| 194 | + end | ||
| 165 | for k , enemy in ipairs(enemys) do | 195 | for k , enemy in ipairs(enemys) do |
| 166 | for _, buffId in ipairs(buffs) do | 196 | for _, buffId in ipairs(buffs) do |
| 167 | enemy:addBuff(buffId) | 197 | enemy:addBuff(buffId) |
| @@ -170,6 +200,14 @@ function Block:randomEvent() | @@ -170,6 +200,14 @@ function Block:randomEvent() | ||
| 170 | elseif data.target == 2 then -- 翻开房间 | 200 | elseif data.target == 2 then -- 翻开房间 |
| 171 | self.room.map.adv:getCurMap():openBlocksByRoom(self.room.roomId) | 201 | self.room.map.adv:getCurMap():openBlocksByRoom(self.room.roomId) |
| 172 | backTrap = false | 202 | backTrap = false |
| 203 | + elseif data.target == 3 then -- 翻开周围8格,并给怪物附带buff(不伤害玩家) | ||
| 204 | + self.room.map.adv:getCurMap():openBlocksBySize(self.room.roomId, self.blockId, 2) | ||
| 205 | + local enemys = self.room.map.adv:getCurMap():getEnemysBySize(self.room.roomId, self.blockId, 2) | ||
| 206 | + for _, e in ipairs(enemys) do | ||
| 207 | + for _, buffId in ipairs(buffs) do | ||
| 208 | + e:addBuff(buffId) | ||
| 209 | + end | ||
| 210 | + end | ||
| 173 | end | 211 | end |
| 174 | 212 | ||
| 175 | if data.specialEff ~= "" then | 213 | if data.specialEff ~= "" then |
| @@ -223,8 +261,8 @@ function Block:open() | @@ -223,8 +261,8 @@ function Block:open() | ||
| 223 | local room = self.room | 261 | local room = self.room |
| 224 | local map = room.map | 262 | local map = room.map |
| 225 | local adv = map.adv | 263 | local adv = map.adv |
| 226 | - self:randomEvent() | ||
| 227 | self.isOpen = true | 264 | self.isOpen = true |
| 265 | + self:randomEvent() | ||
| 228 | return true | 266 | return true |
| 229 | end | 267 | end |
| 230 | 268 |
src/adv/AdvBuff.lua
| @@ -22,7 +22,8 @@ Buff.CHANGE_DROP = 18 -- 转换掉落 | @@ -22,7 +22,8 @@ Buff.CHANGE_DROP = 18 -- 转换掉落 | ||
| 22 | Buff.BATTLE_PASSIVE = 19 -- 切换为战斗中的被动技 | 22 | Buff.BATTLE_PASSIVE = 19 -- 切换为战斗中的被动技 |
| 23 | Buff.EXP_ADD = 20 -- 增加exp(每回合) | 23 | Buff.EXP_ADD = 20 -- 增加exp(每回合) |
| 24 | Buff.DONT_DEFEND = 21 -- 不看守地板 -- 怪周围点半可点击 | 24 | Buff.DONT_DEFEND = 21 -- 不看守地板 -- 怪周围点半可点击 |
| 25 | - | 25 | +Buff.SHOW_DANGER = 22 -- 扫雷 展示地上怪物和陷阱数量的标记 |
| 26 | +Buff.SHOW_MONSTER_POS = 23 -- 蓝臂章训练场 感知 | ||
| 26 | Buff.EXP_UP = 24 -- 杀敌经验提高 | 27 | Buff.EXP_UP = 24 -- 杀敌经验提高 |
| 27 | Buff.DISABLE_BUFF = 25 -- 禁用固有技 | 28 | Buff.DISABLE_BUFF = 25 -- 禁用固有技 |
| 28 | Buff.ATTR_CHANGE_COND = 26 --属性变化(状态)有条件 | 29 | Buff.ATTR_CHANGE_COND = 26 --属性变化(状态)有条件 |
| @@ -31,6 +32,8 @@ Buff.SP_MAX_CHANGE = 28 -- 魔法上限 | @@ -31,6 +32,8 @@ Buff.SP_MAX_CHANGE = 28 -- 魔法上限 | ||
| 31 | Buff.ITEM_GET_UP = 29 -- 获得道具数量增加 | 32 | Buff.ITEM_GET_UP = 29 -- 获得道具数量增加 |
| 32 | Buff.Buff_EFFECT_CHANGE = 30 -- 改变 buff 效果 | 33 | Buff.Buff_EFFECT_CHANGE = 30 -- 改变 buff 效果 |
| 33 | Buff.Buff_NO_PASSIVE_MONSTER = 31 -- 地图被动刷新不出来怪物 | 34 | Buff.Buff_NO_PASSIVE_MONSTER = 31 -- 地图被动刷新不出来怪物 |
| 35 | +Buff.SNEAK = 32 --潜行 | ||
| 36 | +Buff.DROP_BUFF_BY_ENEMY = 33 -- 怪物掉落加成 -- 怪物使用 | ||
| 34 | 37 | ||
| 35 | 38 | ||
| 36 | --角色一些属性的变化 | 39 | --角色一些属性的变化 |
| @@ -81,7 +84,9 @@ local function commonAttCond(_Buff, attrName) | @@ -81,7 +84,9 @@ local function commonAttCond(_Buff, attrName) | ||
| 81 | effectCount = self.owner.battle.adv.level | 84 | effectCount = self.owner.battle.adv.level |
| 82 | elseif self.buffData.effectValue4 == 2 then | 85 | elseif self.buffData.effectValue4 == 2 then |
| 83 | local buff = self.owner.battle.player:getBuffById(tonumber(self.buffData.effectValue5)) | 86 | local buff = self.owner.battle.player:getBuffById(tonumber(self.buffData.effectValue5)) |
| 84 | - effectCount = buff.layer | 87 | + if buff then |
| 88 | + effectCount = buff.layer | ||
| 89 | + end | ||
| 85 | end | 90 | end |
| 86 | return self.buffData.effectValue2 * effectCount | 91 | return self.buffData.effectValue2 * effectCount |
| 87 | end | 92 | end |
| @@ -153,11 +158,15 @@ local BuffFactory = { | @@ -153,11 +158,15 @@ local BuffFactory = { | ||
| 153 | [Buff.HP_MAX_CHANGE] = function(_Buff) | 158 | [Buff.HP_MAX_CHANGE] = function(_Buff) |
| 154 | _Buff._init = function(self) --初始化变化值 | 159 | _Buff._init = function(self) --初始化变化值 |
| 155 | self._changeV = self:_calculate() | 160 | self._changeV = self:_calculate() |
| 161 | + local old = self.owner.hpMax | ||
| 156 | self.owner:reSetHpMax() | 162 | self.owner:reSetHpMax() |
| 163 | + self:_addHpByMax(old) | ||
| 157 | end | 164 | end |
| 158 | _Buff._overlay = function(self) | 165 | _Buff._overlay = function(self) |
| 159 | self._changeV = (self._changeV or 0) + self:_calculate() | 166 | self._changeV = (self._changeV or 0) + self:_calculate() |
| 167 | + local old = self.owner.hpMax | ||
| 160 | self.owner:reSetHpMax() | 168 | self.owner:reSetHpMax() |
| 169 | + self:_addHpByMax(old) | ||
| 161 | end | 170 | end |
| 162 | 171 | ||
| 163 | _Buff._uncover = function(self) | 172 | _Buff._uncover = function(self) |
| @@ -170,7 +179,7 @@ local BuffFactory = { | @@ -170,7 +179,7 @@ local BuffFactory = { | ||
| 170 | if self.buffData.effectValue1 == 0 then --固定值 | 179 | if self.buffData.effectValue1 == 0 then --固定值 |
| 171 | curValue = self.buffData.effectValue2 | 180 | curValue = self.buffData.effectValue2 |
| 172 | elseif self.buffData.effectValue1 == 1 then | 181 | elseif self.buffData.effectValue1 == 1 then |
| 173 | - local baseOwner = self.buffData.effectValue4 == 1 and self.owner or self.release | 182 | + local baseOwner = self.buffData.effectValue4 == 1 and self.owner or self.release |
| 174 | local attrs = {[0] = "hp", [1] = "hpMax", [2] = "atk"} | 183 | local attrs = {[0] = "hp", [1] = "hpMax", [2] = "atk"} |
| 175 | curValue = baseOwner[attrs[self.buffData.effectValue3]] * self.buffData.effectValue2 / 100 | 184 | curValue = baseOwner[attrs[self.buffData.effectValue3]] * self.buffData.effectValue2 / 100 |
| 176 | end | 185 | end |
| @@ -181,6 +190,15 @@ local BuffFactory = { | @@ -181,6 +190,15 @@ local BuffFactory = { | ||
| 181 | return self:doEffectChange(self._changeV) | 190 | return self:doEffectChange(self._changeV) |
| 182 | end | 191 | end |
| 183 | 192 | ||
| 193 | + _Buff._addHpByMax = function(self, old) | ||
| 194 | + if self.buffData.effectValue5 == "1" then | ||
| 195 | + local change = self.owner.hpMax - old | ||
| 196 | + if change > 0 then | ||
| 197 | + self.owner:recover(change, self.release) -- 防止release不存在,地图点buff | ||
| 198 | + end | ||
| 199 | + end | ||
| 200 | + end | ||
| 201 | + | ||
| 184 | _Buff._endBuff = function(self) | 202 | _Buff._endBuff = function(self) |
| 185 | self.owner:reSetHpMax() | 203 | self.owner:reSetHpMax() |
| 186 | end | 204 | end |
| @@ -355,7 +373,11 @@ local BuffFactory = { | @@ -355,7 +373,11 @@ local BuffFactory = { | ||
| 355 | return self.buffData.effectValue1 | 373 | return self.buffData.effectValue1 |
| 356 | end | 374 | end |
| 357 | end, | 375 | end, |
| 358 | - | 376 | + [Buff.SNEAK] = function(_Buff) |
| 377 | + _Buff._init = function(self) | ||
| 378 | + self.layer = self.buffData.effectValue1 | ||
| 379 | + end | ||
| 380 | + end, | ||
| 359 | } | 381 | } |
| 360 | 382 | ||
| 361 | -- 同样的返回 effectValue1, effectValue2 * self.layer 类型的buff | 383 | -- 同样的返回 effectValue1, effectValue2 * self.layer 类型的buff |
| @@ -472,6 +494,7 @@ function Buff:checkKeep() | @@ -472,6 +494,7 @@ function Buff:checkKeep() | ||
| 472 | 2=建筑id; | 494 | 2=建筑id; |
| 473 | 3=事件id | 495 | 3=事件id |
| 474 | 4=队伍为特定属性时 | 496 | 4=队伍为特定属性时 |
| 497 | + 5=拥有指定buff | ||
| 475 | --]] | 498 | --]] |
| 476 | 499 | ||
| 477 | local checkFunc = {} | 500 | local checkFunc = {} |
| @@ -508,6 +531,13 @@ function Buff:checkKeep() | @@ -508,6 +531,13 @@ function Buff:checkKeep() | ||
| 508 | local role = self.owner.battle.adv.owner | 531 | local role = self.owner.battle.adv.owner |
| 509 | return role:getHerosCamp(role:getProperty("advTeam").heros) == teamAttr | 532 | return role:getHerosCamp(role:getProperty("advTeam").heros) == teamAttr |
| 510 | end | 533 | end |
| 534 | + checkFunc[5] = function(_, buffId) | ||
| 535 | + local buff = self.owner:getBuffById(buffId) | ||
| 536 | + if buff and not buff.isDel then | ||
| 537 | + return true | ||
| 538 | + end | ||
| 539 | + return false | ||
| 540 | + end | ||
| 511 | 541 | ||
| 512 | local keepTerm = self.buffData.keepTerm:toArray(true, "=") | 542 | local keepTerm = self.buffData.keepTerm:toArray(true, "=") |
| 513 | if not checkFunc[keepTerm[1]] then return true end | 543 | if not checkFunc[keepTerm[1]] then return true end |
| @@ -526,7 +556,7 @@ end | @@ -526,7 +556,7 @@ end | ||
| 526 | 556 | ||
| 527 | function Buff:afterLayer() | 557 | function Buff:afterLayer() |
| 528 | -- 持续一层 | 558 | -- 持续一层 |
| 529 | - if self.buffData.round == 0 then | 559 | + if self.buffData.round == 0 or self.buffData.mapLock == 1 then |
| 530 | self.isDel = true | 560 | self.isDel = true |
| 531 | end | 561 | end |
| 532 | end | 562 | end |
src/adv/AdvMap.lua
| @@ -2,6 +2,8 @@ | @@ -2,6 +2,8 @@ | ||
| 2 | local Room = require "adv.AdvRoom" | 2 | local Room = require "adv.AdvRoom" |
| 3 | local Passive = require "adv.AdvPassive" | 3 | local Passive = require "adv.AdvPassive" |
| 4 | local AdvCommon = require "adv.AdvCommon" | 4 | local AdvCommon = require "adv.AdvCommon" |
| 5 | + | ||
| 6 | +local Buff = require "adv.AdvBuff" | ||
| 5 | -- 一层地图 | 7 | -- 一层地图 |
| 6 | local Map = class("AdvMap") | 8 | local Map = class("AdvMap") |
| 7 | -- 内部方法声明 | 9 | -- 内部方法声明 |
| @@ -10,7 +12,8 @@ local createMap, getEventLib | @@ -10,7 +12,8 @@ local createMap, getEventLib | ||
| 10 | 12 | ||
| 11 | function Map:ctor(adv, mapIdx, mapInfo, isEnter, isNewRelay) | 13 | function Map:ctor(adv, mapIdx, mapInfo, isEnter, isNewRelay) |
| 12 | self.adv = adv | 14 | self.adv = adv |
| 13 | - if type(mapInfo) == "number" then -- mapInfo 传入 id | 15 | + local isNew = type(mapInfo) == "number" |
| 16 | + if isNew then -- mapInfo 传入 id | ||
| 14 | mapInfo = createMap(self, mapInfo, isEnter, isNewRelay) -- 生成地图 | 17 | mapInfo = createMap(self, mapInfo, isEnter, isNewRelay) -- 生成地图 |
| 15 | end | 18 | end |
| 16 | if not mapInfo then return end | 19 | if not mapInfo then return end |
| @@ -19,19 +22,25 @@ function Map:ctor(adv, mapIdx, mapInfo, isEnter, isNewRelay) | @@ -19,19 +22,25 @@ function Map:ctor(adv, mapIdx, mapInfo, isEnter, isNewRelay) | ||
| 19 | self.mapId = mapInfo.mapId | 22 | self.mapId = mapInfo.mapId |
| 20 | self.isShow = mapInfo.isShow -- 是否全部展示 -- 客户端用 | 23 | self.isShow = mapInfo.isShow -- 是否全部展示 -- 客户端用 |
| 21 | self.rooms = {} | 24 | self.rooms = {} |
| 22 | - self:loadRooms(mapInfo.rooms, isNewRelay) | 25 | + self:loadRooms(mapInfo.rooms, isNew, isNewRelay) |
| 23 | end | 26 | end |
| 24 | 27 | ||
| 25 | -function Map:loadRooms(rooms, isNewRelay) | ||
| 26 | - local mapData = csvdb["map_" .. csvdb["mapCsv"][self.mapId]["path"] .. "Csv"] | 28 | +function Map:loadRooms(rooms, isNew, isNewRelay) |
| 29 | + local mapInfoCsv = csvdb["mapCsv"][self.mapId] | ||
| 30 | + local mapData = csvdb["map_" .. mapInfoCsv["path"] .. "Csv"] | ||
| 31 | + | ||
| 27 | for roomId, roomName in pairs(mapData["rooms"]) do | 32 | for roomId, roomName in pairs(mapData["rooms"]) do |
| 28 | if roomName == "path" then | 33 | if roomName == "path" then |
| 29 | - self.rooms[roomId] = Room.new(self, roomId, mapData["path"], rooms[roomId], true, isNewRelay) | 34 | + self.rooms[roomId] = Room.new(self, roomId, mapData["path"], rooms[roomId], true, isNewRelay, mapInfoCsv.type) |
| 30 | else | 35 | else |
| 31 | roomName = roomName:gsub("/", "_") | 36 | roomName = roomName:gsub("/", "_") |
| 32 | - self.rooms[roomId] = Room.new(self, roomId, csvdb["room_" .. roomName .. "Csv"], rooms[roomId], false, isNewRelay) | 37 | + self.rooms[roomId] = Room.new(self, roomId, csvdb["room_" .. roomName .. "Csv"], rooms[roomId], false, isNewRelay, mapInfoCsv.type) |
| 33 | end | 38 | end |
| 34 | end | 39 | end |
| 40 | + | ||
| 41 | + if mapInfoCsv.type == 2 and isNew then | ||
| 42 | + self:showMap() | ||
| 43 | + end | ||
| 35 | end | 44 | end |
| 36 | 45 | ||
| 37 | function Map:initBattleAfter() | 46 | function Map:initBattleAfter() |
| @@ -40,6 +49,11 @@ function Map:initBattleAfter() | @@ -40,6 +49,11 @@ function Map:initBattleAfter() | ||
| 40 | end | 49 | end |
| 41 | end | 50 | end |
| 42 | 51 | ||
| 52 | + | ||
| 53 | +function Map:getMapInfoCsv() | ||
| 54 | + return csvdb["mapCsv"][self.mapId] | ||
| 55 | +end | ||
| 56 | + | ||
| 43 | function Map:getDB() | 57 | function Map:getDB() |
| 44 | local map = {} | 58 | local map = {} |
| 45 | map.mapId = self.mapId | 59 | map.mapId = self.mapId |
| @@ -108,16 +122,104 @@ function Map:addNewMonsterRand(monsterId, where) | @@ -108,16 +122,104 @@ function Map:addNewMonsterRand(monsterId, where) | ||
| 108 | monsterId = math.randWeight(eventLib[AdvEventType.Monster][0], "showup") | 122 | monsterId = math.randWeight(eventLib[AdvEventType.Monster][0], "showup") |
| 109 | end | 123 | end |
| 110 | 124 | ||
| 111 | - local event = {etype = AdvEventType.Monster, mId = self.adv.lastEnemyId} | ||
| 112 | - self.adv.lastEnemyId = self.adv.lastEnemyId + 1 | ||
| 113 | - event.id = monsterId | 125 | + local event = { |
| 126 | + etype = AdvEventType.Monster, | ||
| 127 | + id = monsterId, | ||
| 128 | + } | ||
| 114 | block:updateEvent(event) | 129 | block:updateEvent(event) |
| 115 | 130 | ||
| 116 | - self.adv.battle:addEnemy(room, block):triggerPassive(Passive.BORN_ONCE) | ||
| 117 | - | ||
| 118 | return room, block | 131 | return room, block |
| 119 | end | 132 | end |
| 120 | 133 | ||
| 134 | +-- 在指定地块类型上 放置指定类型事件id | ||
| 135 | +function Map:layEventToStage(eventType, eventId, count, stage) | ||
| 136 | + local pool = {} | ||
| 137 | + for _, room_ in pairs(self.rooms) do | ||
| 138 | + for _, block_ in pairs(room_.blocks) do | ||
| 139 | + if block_.isOpen and not block_.event and block_:getStageType() == stage then | ||
| 140 | + table.insert(pool, {room_, block_}) | ||
| 141 | + end | ||
| 142 | + end | ||
| 143 | + end | ||
| 144 | + if not next(pool) then return {} end | ||
| 145 | + local change = {} | ||
| 146 | + count = math.min(#pool, count) | ||
| 147 | + for i = 1, count do | ||
| 148 | + local idx = math.randomInt(1, #pool) | ||
| 149 | + local room, block = pool[idx][1], pool[idx][2] | ||
| 150 | + table.remove(pool, idx) | ||
| 151 | + | ||
| 152 | + local event = { | ||
| 153 | + etype = eventType, | ||
| 154 | + id = eventId, | ||
| 155 | + } | ||
| 156 | + block:updateEvent(event) | ||
| 157 | + table.insert(change, {room, block}) | ||
| 158 | + end | ||
| 159 | + return change | ||
| 160 | +end | ||
| 161 | + | ||
| 162 | +-- 地图中指定事件 切换为另一个事件 | ||
| 163 | +function Map:eventChangeToOther(eventTypeF, eventIdF, eventTypeT, eventIdT, count) | ||
| 164 | + count = count or 1 | ||
| 165 | + local pool = {} | ||
| 166 | + for _, room_ in pairs(self.rooms) do | ||
| 167 | + for _, block_ in pairs(room_.blocks) do | ||
| 168 | + if block_.isOpen and block_:getEventType() == eventTypeF and block_.event.id == eventIdF then | ||
| 169 | + table.insert(pool, {room_, block_}) | ||
| 170 | + end | ||
| 171 | + end | ||
| 172 | + end | ||
| 173 | + if not next(pool) then return {} end | ||
| 174 | + local change = {} | ||
| 175 | + count = math.min(#pool, count) | ||
| 176 | + for i = 1, count do | ||
| 177 | + local idx = math.randomInt(1, #pool) | ||
| 178 | + local room, block = pool[idx][1], pool[idx][2] | ||
| 179 | + table.remove(pool, idx) | ||
| 180 | + | ||
| 181 | + local event = { | ||
| 182 | + etype = eventTypeT, | ||
| 183 | + id = eventIdT, | ||
| 184 | + } | ||
| 185 | + block:updateEvent(event) | ||
| 186 | + table.insert(change, {room, block}) | ||
| 187 | + end | ||
| 188 | + return change | ||
| 189 | +end | ||
| 190 | + | ||
| 191 | +function Map:clearEventById(eventType, eventId, count, exclude) | ||
| 192 | + count = count or 0 | ||
| 193 | + eventId = eventId or 0 | ||
| 194 | + exclude = exclude or {} | ||
| 195 | + | ||
| 196 | + local pool = {} | ||
| 197 | + for roomId, room_ in pairs(self.rooms) do | ||
| 198 | + exclude[roomId] = exclude[roomId] or {} | ||
| 199 | + for blockId, block_ in pairs(room_.blocks) do | ||
| 200 | + if not exclude[roomId][blockId] and block_.isOpen and block_:getEventType() == eventType and (eventId == 0 or block_.event.id == eventId) then | ||
| 201 | + table.insert(pool, {room_, block_}) | ||
| 202 | + end | ||
| 203 | + end | ||
| 204 | + end | ||
| 205 | + if not next(pool) then return {} end | ||
| 206 | + local change = {} | ||
| 207 | + if count == 0 then | ||
| 208 | + count = #pool | ||
| 209 | + else | ||
| 210 | + count = math.min(#pool, count) | ||
| 211 | + end | ||
| 212 | + for i = 1, count do | ||
| 213 | + local idx = math.randomInt(1, #pool) | ||
| 214 | + local room, block = pool[idx][1], pool[idx][2] | ||
| 215 | + table.remove(pool, idx) | ||
| 216 | + | ||
| 217 | + block:updateEvent(nil) | ||
| 218 | + table.insert(change, {room, block}) | ||
| 219 | + end | ||
| 220 | + return change | ||
| 221 | +end | ||
| 222 | + | ||
| 121 | -- 随机翻开 num 个 以开放的房间的 地块 | 223 | -- 随机翻开 num 个 以开放的房间的 地块 |
| 122 | function Map:openBlockRand(num, isPlayer, ignoreBack) | 224 | function Map:openBlockRand(num, isPlayer, ignoreBack) |
| 123 | local pool = {} | 225 | local pool = {} |
| @@ -156,11 +258,21 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack) | @@ -156,11 +258,21 @@ function Map:openBlock(roomId, blockId, isPlayer, ignoreBack) | ||
| 156 | if isPlayer then | 258 | if isPlayer then |
| 157 | self.adv.battle.player:triggerPassive(Passive.OPEN_BLOCK) | 259 | self.adv.battle.player:triggerPassive(Passive.OPEN_BLOCK) |
| 158 | self.adv.owner:checkTaskEnter("AdvOpenBlock") | 260 | self.adv.owner:checkTaskEnter("AdvOpenBlock") |
| 261 | + | ||
| 262 | + -- 潜行检查 | ||
| 263 | + local sneakBuff = self.adv.battle.player:hadBuff(Buff.SNEAK) | ||
| 264 | + if sneakBuff then | ||
| 265 | + local enemys = self:getEnemysBySize(roomId, blockId, 2) | ||
| 266 | + if #enemys > 0 then | ||
| 267 | + sneakBuff:uncover() | ||
| 268 | + end | ||
| 269 | + end | ||
| 159 | end | 270 | end |
| 160 | 271 | ||
| 161 | if not ignoreBack then | 272 | if not ignoreBack then |
| 162 | self.adv:backBlockChange(roomId, blockId) | 273 | self.adv:backBlockChange(roomId, blockId) |
| 163 | end | 274 | end |
| 275 | + | ||
| 164 | end | 276 | end |
| 165 | end | 277 | end |
| 166 | 278 | ||
| @@ -237,6 +349,20 @@ function Map:getBlocksBySize(roomId, blockId, size) | @@ -237,6 +349,20 @@ function Map:getBlocksBySize(roomId, blockId, size) | ||
| 237 | return blocks | 349 | return blocks |
| 238 | end | 350 | end |
| 239 | 351 | ||
| 352 | +function Map:getEnemysBySize(roomId, blockId, size) | ||
| 353 | + local blocks = self:getBlocksBySize(roomId, blockId, size) | ||
| 354 | + local enemys = {} | ||
| 355 | + for _, block in ipairs(blocks) do | ||
| 356 | + if block:isMonster() then | ||
| 357 | + local e = self.adv.battle:getEnemy(block.room.roomId, block.blockId) | ||
| 358 | + if e then | ||
| 359 | + table.insert(enemys, e) | ||
| 360 | + end | ||
| 361 | + end | ||
| 362 | + end | ||
| 363 | + return enemys | ||
| 364 | +end | ||
| 365 | + | ||
| 240 | -----------------------------随机地图----------------------------- | 366 | -----------------------------随机地图----------------------------- |
| 241 | 367 | ||
| 242 | -- isEnter isNewRelay 区分中继层的类型 --是否是开始进入 是否是第一次进入 | 368 | -- isEnter isNewRelay 区分中继层的类型 --是否是开始进入 是否是第一次进入 |
| @@ -250,6 +376,31 @@ createMap = function(self, mapId, isEnter, isNewRelay) | @@ -250,6 +376,31 @@ createMap = function(self, mapId, isEnter, isNewRelay) | ||
| 250 | error("mapId " .. mapId .. " dont exist!") | 376 | error("mapId " .. mapId .. " dont exist!") |
| 251 | return | 377 | return |
| 252 | end | 378 | end |
| 379 | + | ||
| 380 | + local etypeToStr = { | ||
| 381 | + [AdvEventType.Choose] = "choose", | ||
| 382 | + [AdvEventType.Drop] = "drop", | ||
| 383 | + [AdvEventType.Monster] = "monster", | ||
| 384 | + [AdvEventType.Trader] = "trader", | ||
| 385 | + [AdvEventType.Build] = "building", | ||
| 386 | + [AdvEventType.Trap] = "trap", | ||
| 387 | + [AdvEventType.Click] = "click", | ||
| 388 | + } | ||
| 389 | + | ||
| 390 | + local highLevelEvent = {} | ||
| 391 | + for _etype, _str in pairs(etypeToStr) do | ||
| 392 | + if mapCsvData[_str] ~= "" then | ||
| 393 | + highLevelEvent[_etype] = {} | ||
| 394 | + end | ||
| 395 | + for _id, _count in pairs(mapCsvData[_str]:toNumMap()) do | ||
| 396 | + local _curData = csvdb["event_" .. _str .. "Csv"][_id] | ||
| 397 | + if _curData then | ||
| 398 | + highLevelEvent[_etype][_curData.BlockEventType] = highLevelEvent[_etype][_curData.BlockEventType] or {} | ||
| 399 | + highLevelEvent[_etype][_curData.BlockEventType][_id] = {showup = _curData.showup, limit = _count, dlimit = _curData.limit} | ||
| 400 | + end | ||
| 401 | + end | ||
| 402 | + end | ||
| 403 | + | ||
| 253 | --事件随机 | 404 | --事件随机 |
| 254 | local eventLib = getEventLib(self) -- 同时记录出现次数 | 405 | local eventLib = getEventLib(self) -- 同时记录出现次数 |
| 255 | local monsterEvents = {} --处理钥匙掉落 | 406 | local monsterEvents = {} --处理钥匙掉落 |
| @@ -270,42 +421,60 @@ createMap = function(self, mapId, isEnter, isNewRelay) | @@ -270,42 +421,60 @@ createMap = function(self, mapId, isEnter, isNewRelay) | ||
| 270 | local randomFunc = {} | 421 | local randomFunc = {} |
| 271 | 422 | ||
| 272 | local function randomCommon() | 423 | local function randomCommon() |
| 273 | - if not eventLib[etype] or not next(eventLib[etype]) or not eventLib[etype][especial] or not next(eventLib[etype][especial]) then return false end | ||
| 274 | - event.id = math.randWeight(eventLib[etype][especial], "showup") | ||
| 275 | - if not event.id then return false end | ||
| 276 | - | ||
| 277 | - -- 不是 0 才会记录 | ||
| 278 | - if eventLib[etype][especial][event.id].dlimit ~= 0 then | ||
| 279 | - eventLimit[etype] = eventLimit[etype] or {} | ||
| 280 | - eventLimit[etype][event.id] = (eventLimit[etype][event.id] or 0) + 1 | 424 | + -- 刷新地图专属的 |
| 425 | + | ||
| 426 | + local function randomByLevelLib(lib) | ||
| 427 | + -- 刷新通用的 | ||
| 428 | + if not lib[etype] or not next(lib[etype]) or not lib[etype][especial] then return false end | ||
| 429 | + -- 清一下全关卡次数用完的 | ||
| 430 | + for _eid, _edata in pairs(lib[etype][especial]) do | ||
| 431 | + if _edata.dlimit ~= 0 and ((eventLimit[etype] or {})[_eid] or 0) >= _edata.dlimit then | ||
| 432 | + lib[etype][especial][_eid] = nil | ||
| 433 | + end | ||
| 434 | + end | ||
| 435 | + | ||
| 436 | + if not next(lib[etype][especial]) then return false end | ||
| 437 | + event.id = math.randWeight(lib[etype][especial], "showup") | ||
| 438 | + if not event.id then return false end | ||
| 439 | + | ||
| 440 | + -- 不是 0 才会记录 | ||
| 441 | + if lib[etype][especial][event.id].dlimit ~= 0 then | ||
| 442 | + eventLimit[etype] = eventLimit[etype] or {} | ||
| 443 | + eventLimit[etype][event.id] = (eventLimit[etype][event.id] or 0) + 1 | ||
| 444 | + end | ||
| 445 | + | ||
| 446 | + -- 消除单层次数用完的 | ||
| 447 | + if lib[etype][especial][event.id].limit > 1 then | ||
| 448 | + lib[etype][especial][event.id].limit = lib[etype][especial][event.id].limit - 1 | ||
| 449 | + elseif lib[etype][especial][event.id].limit == 1 then | ||
| 450 | + lib[etype][especial][event.id] = nil | ||
| 451 | + end | ||
| 452 | + return true | ||
| 281 | end | 453 | end |
| 282 | 454 | ||
| 283 | - -- 消除 | ||
| 284 | - if eventLib[etype][especial][event.id].limit > 1 then | ||
| 285 | - eventLib[etype][especial][event.id].limit = eventLib[etype][especial][event.id].limit - 1 | ||
| 286 | - elseif eventLib[etype][especial][event.id].limit == 1 then | ||
| 287 | - eventLib[etype][especial][event.id] = nil | 455 | + local status = randomByLevelLib(highLevelEvent) |
| 456 | + if not status then | ||
| 457 | + status = randomByLevelLib(eventLib) | ||
| 288 | end | 458 | end |
| 459 | + return status | ||
| 289 | end | 460 | end |
| 290 | 461 | ||
| 291 | --入口 | 462 | --入口 |
| 292 | randomFunc[AdvEventType.In] = function()end | 463 | randomFunc[AdvEventType.In] = function()end |
| 293 | --出口 | 464 | --出口 |
| 294 | - randomFunc[AdvEventType.Out] = function() | ||
| 295 | - if not self.adv:isEndless() and self.adv.isRelay and not self.adv.owner:checkOverGuide(GuideStep.AdvRelay) then | ||
| 296 | - return false | ||
| 297 | - end | ||
| 298 | - end | ||
| 299 | - --中继点出口 | ||
| 300 | - randomFunc[AdvEventType.Exit] = function() | ||
| 301 | - if not self.adv.isRelay or self.adv.owner:checkOverGuide(GuideStep.AdvRelay) then return false end | ||
| 302 | - end | 465 | + randomFunc[AdvEventType.Out] = function()end |
| 466 | + -- --中继点出口 | ||
| 467 | + -- randomFunc[AdvEventType.Exit] = function() | ||
| 468 | + -- -- if not self.adv.isRelay or self.adv.owner:checkOverGuide(GuideStep.AdvRelay) then return false end | ||
| 469 | + -- return false | ||
| 470 | + -- end | ||
| 303 | --开放出口 | 471 | --开放出口 |
| 304 | randomFunc[AdvEventType.InOut] = function() end | 472 | randomFunc[AdvEventType.InOut] = function() end |
| 305 | 473 | ||
| 306 | --开放出口 | 474 | --开放出口 |
| 307 | randomFunc[AdvEventType.Diner] = function() | 475 | randomFunc[AdvEventType.Diner] = function() |
| 308 | - if not self.adv.isRelay or isEnter or isNewRelay then return false end | 476 | + -- if not self.adv.isRelay or isEnter or isNewRelay then return false end |
| 477 | + if not self.adv.isRelay or isEnter then return false end | ||
| 309 | end | 478 | end |
| 310 | 479 | ||
| 311 | --boss | 480 | --boss |
| @@ -344,7 +513,8 @@ createMap = function(self, mapId, isEnter, isNewRelay) | @@ -344,7 +513,8 @@ createMap = function(self, mapId, isEnter, isNewRelay) | ||
| 344 | randomFunc[AdvEventType.Drop] = randomCommon | 513 | randomFunc[AdvEventType.Drop] = randomCommon |
| 345 | --交易所 | 514 | --交易所 |
| 346 | randomFunc[AdvEventType.Trader] = function() | 515 | randomFunc[AdvEventType.Trader] = function() |
| 347 | - if self.adv.isRelay and isNewRelay then return false end | 516 | + -- if self.adv.isRelay and isNewRelay then return false end |
| 517 | + if self.adv.isRelay then return false end | ||
| 348 | return randomCommon() | 518 | return randomCommon() |
| 349 | end | 519 | end |
| 350 | --建筑 | 520 | --建筑 |
| @@ -584,15 +754,8 @@ getEventLib = function(self, needEventType) -- needEventType 需要的事件 | @@ -584,15 +754,8 @@ getEventLib = function(self, needEventType) -- needEventType 需要的事件 | ||
| 584 | end | 754 | end |
| 585 | end | 755 | end |
| 586 | 756 | ||
| 587 | - -- data.limit 改为 整个冒险全程 | ||
| 588 | - local limit = data.limit | ||
| 589 | - if data.limit ~= 0 then | ||
| 590 | - limit = data.limit - ((eventLimit[etype] or {})[id] or 0) | ||
| 591 | - if limit <= 0 then | ||
| 592 | - add = false | ||
| 593 | - end | ||
| 594 | - end | ||
| 595 | - | 757 | + -- limit 单次上限 默认无限 |
| 758 | + local limit = 0 | ||
| 596 | if add and (etype == AdvEventType.LinkChoose or etype == AdvEventType.Choose) then --只能有一次 | 759 | if add and (etype == AdvEventType.LinkChoose or etype == AdvEventType.Choose) then --只能有一次 |
| 597 | limit = 1 | 760 | limit = 1 |
| 598 | end | 761 | end |
src/adv/AdvPassive.lua
| @@ -6,6 +6,7 @@ Filter.HP_LOW_WITH_EQUAL = 3 -- 血量<=value% | @@ -6,6 +6,7 @@ Filter.HP_LOW_WITH_EQUAL = 3 -- 血量<=value% | ||
| 6 | Filter.HP_LOW = 4 -- 血量<value% | 6 | Filter.HP_LOW = 4 -- 血量<value% |
| 7 | Filter.BUFF_BY_TYPE = 5 -- 指定类型buff | 7 | Filter.BUFF_BY_TYPE = 5 -- 指定类型buff |
| 8 | Filter.BUFF_BY_ID = 6 -- 指定id的buff | 8 | Filter.BUFF_BY_ID = 6 -- 指定id的buff |
| 9 | +Filter.CAMP = 7 -- 玩家是指定阵营 | ||
| 9 | 10 | ||
| 10 | local FilterFactory = {} | 11 | local FilterFactory = {} |
| 11 | FilterFactory[Filter.HP_UP_WITH_EQUAL] = function (_Filter) | 12 | FilterFactory[Filter.HP_UP_WITH_EQUAL] = function (_Filter) |
| @@ -38,6 +39,13 @@ FilterFactory[Filter.BUFF_BY_ID] = function (_Filter) | @@ -38,6 +39,13 @@ FilterFactory[Filter.BUFF_BY_ID] = function (_Filter) | ||
| 38 | return target:hadBuffById(self.value) | 39 | return target:hadBuffById(self.value) |
| 39 | end | 40 | end |
| 40 | end | 41 | end |
| 42 | +FilterFactory[Filter.CAMP] = function (_Filter) | ||
| 43 | + _Filter._execute = function (self, target) | ||
| 44 | + local role = self.owner.battle.adv.owner | ||
| 45 | + return role:getHerosCamp(role:getProperty("advTeam").heros) == self.value | ||
| 46 | + end | ||
| 47 | +end | ||
| 48 | + | ||
| 41 | 49 | ||
| 42 | function Filter:ctor(params) | 50 | function Filter:ctor(params) |
| 43 | self.owner = params.owner | 51 | self.owner = params.owner |
| @@ -145,7 +153,9 @@ PassiveCondFactory[Passive.OPEN_BLOCK] = PassiveCondFactory[Passive.HURT_PERCENT | @@ -145,7 +153,9 @@ PassiveCondFactory[Passive.OPEN_BLOCK] = PassiveCondFactory[Passive.HURT_PERCENT | ||
| 145 | PassiveCondFactory[Passive.SELF_HURT] = function(_Passive) | 153 | PassiveCondFactory[Passive.SELF_HURT] = function(_Passive) |
| 146 | _Passive._trigger = function(self, params) | 154 | _Passive._trigger = function(self, params) |
| 147 | local buffId = params.buffId | 155 | local buffId = params.buffId |
| 156 | + if not buffId then return end | ||
| 148 | local data = csvdb["adv_map_buffCsv"][buffId] | 157 | local data = csvdb["adv_map_buffCsv"][buffId] |
| 158 | + if not data then return end | ||
| 149 | if data.classify:sismember(self.passiveData.value, " ") then | 159 | if data.classify:sismember(self.passiveData.value, " ") then |
| 150 | return true | 160 | return true |
| 151 | end | 161 | end |
| @@ -297,7 +307,7 @@ function Passive:canEffect(effType, effValue) | @@ -297,7 +307,7 @@ function Passive:canEffect(effType, effValue) | ||
| 297 | end | 307 | end |
| 298 | 308 | ||
| 299 | function Passive:effect(triggerPms) | 309 | function Passive:effect(triggerPms) |
| 300 | - for _, effect in pairs(self.effects) do | 310 | + for _, effect in ipairs(self.effects) do |
| 301 | local effType = effect[1] | 311 | local effType = effect[1] |
| 302 | local effValue = effect[2] | 312 | local effValue = effect[2] |
| 303 | local otherPms = {} | 313 | local otherPms = {} |
| @@ -314,7 +324,7 @@ function Passive:effect(triggerPms) | @@ -314,7 +324,7 @@ function Passive:effect(triggerPms) | ||
| 314 | self.round = self.passiveData.round | 324 | self.round = self.passiveData.round |
| 315 | end | 325 | end |
| 316 | 326 | ||
| 317 | - if self.count <= 0 and self.passiveData.refresh == 1 then -- 次数 <= 0 并且一次冒险内不刷新,被动可以直接移除 | 327 | + if self.count <= 0 then -- 次数 <= 0 并且一次冒险内不刷新,被动可以直接移除 |
| 318 | self.isDel = true | 328 | self.isDel = true |
| 319 | end | 329 | end |
| 320 | end | 330 | end |
| @@ -332,6 +342,12 @@ function Passive:afterRound() | @@ -332,6 +342,12 @@ function Passive:afterRound() | ||
| 332 | end | 342 | end |
| 333 | end | 343 | end |
| 334 | 344 | ||
| 345 | +function Passive:afterLayer() | ||
| 346 | + if self.passiveData.mapLock == 1 or self.passiveData.floorType == 1 then | ||
| 347 | + self.isDel = true | ||
| 348 | + end | ||
| 349 | +end | ||
| 350 | + | ||
| 335 | -- 可以触发 | 351 | -- 可以触发 |
| 336 | function Passive:canTrigger( ) | 352 | function Passive:canTrigger( ) |
| 337 | return self.count > 0 and self.delay <= 0 | 353 | return self.count > 0 and self.delay <= 0 |
| @@ -427,11 +443,13 @@ function Passive:effect5(monsterId) | @@ -427,11 +443,13 @@ function Passive:effect5(monsterId) | ||
| 427 | 443 | ||
| 428 | end | 444 | end |
| 429 | 445 | ||
| 430 | ---6=给所有场上怪物增加buff | ||
| 431 | -function Passive:effect6(value) | 446 | +--6=给所有场上怪物增加buff 《 限定 怪 id》 |
| 447 | +function Passive:effect6(value, triggerPms, enemyId) | ||
| 432 | local aims = self.owner.battle.player:getTeam(2) | 448 | local aims = self.owner.battle.player:getTeam(2) |
| 433 | for k , aim in pairs(aims) do | 449 | for k , aim in pairs(aims) do |
| 434 | - aim:addBuff(value, self.owner) | 450 | + if not enemyId or enemyId == 0 or aim.monsterId == enemyId then |
| 451 | + aim:addBuff(value, self.owner) | ||
| 452 | + end | ||
| 435 | end | 453 | end |
| 436 | end | 454 | end |
| 437 | 455 | ||
| @@ -471,4 +489,33 @@ function Passive:effect10(count, triggerPms) | @@ -471,4 +489,33 @@ function Passive:effect10(count, triggerPms) | ||
| 471 | end | 489 | end |
| 472 | end | 490 | end |
| 473 | 491 | ||
| 492 | +-- 将地图上的A事件替换成B事件 | ||
| 493 | +function Passive:effect11(eventTypeF, triggerPms, eventIdF, eventTypeT, eventIdT, count) | ||
| 494 | + local change = self.owner.battle.adv:getCurMap():eventChangeToOther(eventTypeF, eventIdF, eventTypeT, eventIdT, count) | ||
| 495 | + for _, one in ipairs(change) do | ||
| 496 | + self.owner.battle.adv:backBlockChange(one[1].roomId, one[2].blockId) | ||
| 497 | + end | ||
| 498 | +end | ||
| 499 | + | ||
| 500 | +-- 在指定地点召唤event项目 | ||
| 501 | +function Passive:effect12(eventType, triggerPms, eventId, count, stage) | ||
| 502 | + local change = self.owner.battle.adv:getCurMap():layEventToStage(eventType, eventId, count, stage) | ||
| 503 | + for _, one in ipairs(change) do | ||
| 504 | + self.owner.battle.adv:backBlockChange(one[1].roomId, one[2].blockId) | ||
| 505 | + end | ||
| 506 | +end | ||
| 507 | + | ||
| 508 | +-- 移除指定项目 | ||
| 509 | +function Passive:effect13(eventType, triggerPms, eventId, count) | ||
| 510 | + local exclude = {} | ||
| 511 | + if self.owner:is("Enemy") then | ||
| 512 | + exclude[self.owner.roomId] = {[self.owner.blockId] = 1} | ||
| 513 | + end | ||
| 514 | + local change = self.owner.battle.adv:getCurMap():clearEventById(eventType, eventId, count, exclude) | ||
| 515 | + for _, one in ipairs(change) do | ||
| 516 | + self.owner.battle.adv:backBlockChange(one[1].roomId, one[2].blockId) | ||
| 517 | + end | ||
| 518 | +end | ||
| 519 | + | ||
| 520 | + | ||
| 474 | return Passive | 521 | return Passive |
| 475 | \ No newline at end of file | 522 | \ No newline at end of file |
src/adv/AdvPlayer.lua
| @@ -50,19 +50,21 @@ function BaseObject:reset(data) | @@ -50,19 +50,21 @@ function BaseObject:reset(data) | ||
| 50 | self:initAfter(data) | 50 | self:initAfter(data) |
| 51 | end | 51 | end |
| 52 | 52 | ||
| 53 | -function BaseObject:afterRound() | ||
| 54 | - for _, passive in ipairs(self.passives) do | ||
| 55 | - passive:afterRound(self) | ||
| 56 | - end | ||
| 57 | - for _, buff in ipairs(self.buffs) do | ||
| 58 | - buff:afterRound() | 53 | +function BaseObject:afterRound(roundType) |
| 54 | + if roundType == "passive" then | ||
| 55 | + for _, passive in ipairs(self.passives) do | ||
| 56 | + passive:afterRound(self) | ||
| 57 | + end | ||
| 58 | + elseif roundType == "buff" then | ||
| 59 | + for _, buff in ipairs(self.buffs) do | ||
| 60 | + buff:afterRound() | ||
| 61 | + end | ||
| 59 | end | 62 | end |
| 60 | end | 63 | end |
| 61 | 64 | ||
| 62 | function BaseObject:clearRound() | 65 | function BaseObject:clearRound() |
| 63 | for i = #self.passives, 1, -1 do | 66 | for i = #self.passives, 1, -1 do |
| 64 | if self.passives[i].isDel then | 67 | if self.passives[i].isDel then |
| 65 | - self.passives[i]:endPassive() | ||
| 66 | table.remove(self.passives, i) | 68 | table.remove(self.passives, i) |
| 67 | end | 69 | end |
| 68 | end | 70 | end |
| @@ -82,33 +84,33 @@ function BaseObject:clear() | @@ -82,33 +84,33 @@ function BaseObject:clear() | ||
| 82 | self.passives = {} | 84 | self.passives = {} |
| 83 | end | 85 | end |
| 84 | 86 | ||
| 85 | -function BaseObject:battleBegin() | ||
| 86 | - for _, passive in ipairs(self.passives) do | ||
| 87 | - passive:battleBegin() | ||
| 88 | - end | ||
| 89 | -end | ||
| 90 | - | ||
| 91 | -function BaseObject:battleEnd() | ||
| 92 | - for _, buff in ipairs(self.buffs) do | ||
| 93 | - buff:battleEnd() | ||
| 94 | - end | ||
| 95 | -end | ||
| 96 | - | ||
| 97 | function BaseObject:addPassive(params) | 87 | function BaseObject:addPassive(params) |
| 98 | local skillId = params.id | 88 | local skillId = params.id |
| 99 | local skillData = csvdb["adv_map_passiveCsv"][skillId] | 89 | local skillData = csvdb["adv_map_passiveCsv"][skillId] |
| 100 | if not skillData then return end | 90 | if not skillData then return end |
| 101 | local level = params.level or 1 | 91 | local level = params.level or 1 |
| 102 | if not skillData[level] then return end | 92 | if not skillData[level] then return end |
| 93 | + | ||
| 94 | + if self:getPassiveById(skillId) then return end -- 被动技不能重复 | ||
| 95 | + | ||
| 103 | table.insert(self.passives, Passive.new(self, { id = skillId, level = level })) | 96 | table.insert(self.passives, Passive.new(self, { id = skillId, level = level })) |
| 104 | end | 97 | end |
| 105 | 98 | ||
| 99 | +function BaseObject:getPassiveById(bId) | ||
| 100 | + for idx, passive in ipairs(self.passives) do | ||
| 101 | + if passive.id == bId then | ||
| 102 | + return passive | ||
| 103 | + end | ||
| 104 | + end | ||
| 105 | +end | ||
| 106 | + | ||
| 106 | function BaseObject:getPassiveIdx(passive) | 107 | function BaseObject:getPassiveIdx(passive) |
| 107 | for idx, passive_ in ipairs(self.passives) do | 108 | for idx, passive_ in ipairs(self.passives) do |
| 108 | if passive_ == passive then | 109 | if passive_ == passive then |
| 109 | return idx | 110 | return idx |
| 110 | end | 111 | end |
| 111 | end | 112 | end |
| 113 | + return 999 | ||
| 112 | end | 114 | end |
| 113 | 115 | ||
| 114 | function BaseObject:getDisablePassiveCount() | 116 | function BaseObject:getDisablePassiveCount() |
| @@ -524,8 +526,7 @@ function Enemy:ctor(battle, mId, monsterId, roomId, blockId, lock, enemy, mapIdx | @@ -524,8 +526,7 @@ function Enemy:ctor(battle, mId, monsterId, roomId, blockId, lock, enemy, mapIdx | ||
| 524 | self.mapIdx = mapIdx | 526 | self.mapIdx = mapIdx |
| 525 | self:initData(enemy) | 527 | self:initData(enemy) |
| 526 | end | 528 | end |
| 527 | -function Enemy:unlock(id) | ||
| 528 | - self.id = id | 529 | +function Enemy:unlock() |
| 529 | self.lock = nil | 530 | self.lock = nil |
| 530 | end | 531 | end |
| 531 | 532 | ||
| @@ -533,6 +534,10 @@ function Enemy:isEnemy() | @@ -533,6 +534,10 @@ function Enemy:isEnemy() | ||
| 533 | return true | 534 | return true |
| 534 | end | 535 | end |
| 535 | 536 | ||
| 537 | +function Enemy:kill() | ||
| 538 | + self:hurt(self.hp, self.battle.player, {hurtType = 5}) | ||
| 539 | +end | ||
| 540 | + | ||
| 536 | local Player = class("Player", BaseObject) | 541 | local Player = class("Player", BaseObject) |
| 537 | function Player:ctor(battle, data) | 542 | function Player:ctor(battle, data) |
| 538 | Player.super.ctor(self, battle) | 543 | Player.super.ctor(self, battle) |
| @@ -566,6 +571,9 @@ function Player:addExp(value) | @@ -566,6 +571,9 @@ function Player:addExp(value) | ||
| 566 | if level >= #csvdb["adv_levelCsv"] then break end | 571 | if level >= #csvdb["adv_levelCsv"] then break end |
| 567 | end | 572 | end |
| 568 | local delta = level - self.level | 573 | local delta = level - self.level |
| 574 | + | ||
| 575 | + self.battle.adv:pushBackEvent(AdvBackEventType.Exp, {delta = value}) | ||
| 576 | + | ||
| 569 | if delta > 0 then | 577 | if delta > 0 then |
| 570 | for attr, _ in pairs(AdvAttsEnum) do | 578 | for attr, _ in pairs(AdvAttsEnum) do |
| 571 | self:addBaseAttr(attr, self.growth[attr] * delta, 0, true) | 579 | self:addBaseAttr(attr, self.growth[attr] * delta, 0, true) |
| @@ -643,11 +651,18 @@ function Player:effectBattleBuff() | @@ -643,11 +651,18 @@ function Player:effectBattleBuff() | ||
| 643 | end | 651 | end |
| 644 | 652 | ||
| 645 | function Player:afterLayer() | 653 | function Player:afterLayer() |
| 654 | + for _, passive in ipairs(self.passives) do | ||
| 655 | + if not passive.isDel then | ||
| 656 | + passive:afterLayer() | ||
| 657 | + end | ||
| 658 | + end | ||
| 646 | for _, buff in ipairs(self.buffs) do | 659 | for _, buff in ipairs(self.buffs) do |
| 647 | if not buff.isDel then | 660 | if not buff.isDel then |
| 648 | buff:afterLayer() | 661 | buff:afterLayer() |
| 649 | end | 662 | end |
| 650 | end | 663 | end |
| 664 | + | ||
| 665 | + self:clearRound() | ||
| 651 | end | 666 | end |
| 652 | 667 | ||
| 653 | function Player:addBuff(buffId, releaser) | 668 | function Player:addBuff(buffId, releaser) |
src/adv/AdvRoom.lua
| @@ -5,7 +5,7 @@ local Block = require "adv.AdvBlock" | @@ -5,7 +5,7 @@ local Block = require "adv.AdvBlock" | ||
| 5 | local Passive = require "adv.AdvPassive" | 5 | local Passive = require "adv.AdvPassive" |
| 6 | 6 | ||
| 7 | local Room = class("AdvRoom") | 7 | local Room = class("AdvRoom") |
| 8 | -function Room:ctor(map, roomId, csvData, info, isPath, isNewRelay) | 8 | +function Room:ctor(map, roomId, csvData, info, isPath, isNewRelay, mapType) |
| 9 | self.map = map | 9 | self.map = map |
| 10 | self.roomId = roomId | 10 | self.roomId = roomId |
| 11 | self.col, self.row = AdvCommon.getCrById(self.roomId) | 11 | self.col, self.row = AdvCommon.getCrById(self.roomId) |
| @@ -13,14 +13,15 @@ function Room:ctor(map, roomId, csvData, info, isPath, isNewRelay) | @@ -13,14 +13,15 @@ function Room:ctor(map, roomId, csvData, info, isPath, isNewRelay) | ||
| 13 | self.isBossRoom = false -- boss房间 --击败boss 以后重置为false | 13 | self.isBossRoom = false -- boss房间 --击败boss 以后重置为false |
| 14 | self.isShow = false | 14 | self.isShow = false |
| 15 | self.battleAfterCall = {} | 15 | self.battleAfterCall = {} |
| 16 | + self.csvData = csvData | ||
| 16 | 17 | ||
| 17 | self.blocks = {} | 18 | self.blocks = {} |
| 18 | - self:loadBlocks(csvData, info, isNewRelay) | 19 | + self:loadBlocks(info, isNewRelay, mapType) |
| 19 | end | 20 | end |
| 20 | 21 | ||
| 21 | -function Room:loadBlocks(csvData, info, isNewRelay) | 22 | +function Room:loadBlocks(info, isNewRelay, mapType) |
| 22 | local isFirstOpen = false | 23 | local isFirstOpen = false |
| 23 | - for blockId, _ in pairs(csvData["blocks"]) do | 24 | + for blockId, _ in pairs(self.csvData["blocks"]) do |
| 24 | self.blocks[blockId] = Block.new(self, blockId, info.event[blockId], info.open == 1 or info.open[blockId], info.trap[blockId]) | 25 | self.blocks[blockId] = Block.new(self, blockId, info.event[blockId], info.open == 1 or info.open[blockId], info.trap[blockId]) |
| 25 | if not self.isPath and self.blocks[blockId]:isBoss() then | 26 | if not self.isPath and self.blocks[blockId]:isBoss() then |
| 26 | self.isBossRoom = true | 27 | self.isBossRoom = true |
| @@ -32,19 +33,29 @@ function Room:loadBlocks(csvData, info, isNewRelay) | @@ -32,19 +33,29 @@ function Room:loadBlocks(csvData, info, isNewRelay) | ||
| 32 | self.isShow = true | 33 | self.isShow = true |
| 33 | self.blocks[blockId].isOpen = true | 34 | self.blocks[blockId].isOpen = true |
| 34 | isFirstOpen = true | 35 | isFirstOpen = true |
| 35 | - --入口房间只会在这里首次展示开放 --触发固有技 | ||
| 36 | - self.map.adv:triggerPassive(Passive.ROOM_SHOW, {roomId = self.roomId}) | ||
| 37 | end | 36 | end |
| 38 | end | 37 | end |
| 39 | end | 38 | end |
| 40 | --中继层全部开放 boss 房间 开启所有的地块 | 39 | --中继层全部开放 boss 房间 开启所有的地块 |
| 41 | - if (self.map.adv.isRelay and not isNewRelay) or (self.isBossRoom and self.isShow and isFirstOpen) then | 40 | + if (self.map.adv.isRelay and not isNewRelay) or (self.isBossRoom and self.isShow and isFirstOpen) or (isFirstOpen and mapType == 1) then |
| 42 | table.insert(self.battleAfterCall, function() | 41 | table.insert(self.battleAfterCall, function() |
| 43 | for _, block in pairs(self.blocks) do | 42 | for _, block in pairs(self.blocks) do |
| 44 | self:openBlock(block) | 43 | self:openBlock(block) |
| 45 | end | 44 | end |
| 46 | end) | 45 | end) |
| 47 | end | 46 | end |
| 47 | + if isFirstOpen then | ||
| 48 | + table.insert(self.battleAfterCall, function() | ||
| 49 | + --入口房间只会在这里首次展示开放 --触发固有技 | ||
| 50 | + self.map.adv:triggerPassive(Passive.ROOM_SHOW, {roomId = self.roomId}) | ||
| 51 | + end) | ||
| 52 | + end | ||
| 53 | +end | ||
| 54 | + | ||
| 55 | +function Room:getStageType(blockId) | ||
| 56 | + if not self.blocks[blockId] then return end | ||
| 57 | + if not self.csvData["blocks"][blockId] then return end | ||
| 58 | + return self.csvData["blocks"][blockId] | ||
| 48 | end | 59 | end |
| 49 | 60 | ||
| 50 | function Room:initBattleAfter() | 61 | function Room:initBattleAfter() |
src/adv/AdvTask.lua
| @@ -248,18 +248,33 @@ function AdvTask.bind(Adv) | @@ -248,18 +248,33 @@ function AdvTask.bind(Adv) | ||
| 248 | 248 | ||
| 249 | local advAchievChange = {} | 249 | local advAchievChange = {} |
| 250 | 250 | ||
| 251 | - local function insertChange(chapterId, taskId, value, pts) | 251 | + local function insertChange(self, chapterId, taskId, value, pts) |
| 252 | local achievField = AdvCommon.isEndless(chapterId) and "advEAchiev" or "advAchiev" | 252 | local achievField = AdvCommon.isEndless(chapterId) and "advEAchiev" or "advAchiev" |
| 253 | + local dbData = self.owner:getProperty(achievField) | ||
| 253 | if pts then | 254 | if pts then |
| 254 | - table.insert(advAchievChange, {type = achievField, field = {chapterId, "pts", taskId}, value = value}) | 255 | + advAchievChange[achievField] = advAchievChange[achievField] or {} |
| 256 | + advAchievChange[achievField][chapterId] = advAchievChange[achievField][chapterId] or {} | ||
| 257 | + advAchievChange[achievField][chapterId]["pts"] = advAchievChange[achievField][chapterId]["pts"] or {} | ||
| 258 | + advAchievChange[achievField][chapterId]["pts"][taskId] = value | ||
| 259 | + | ||
| 260 | + dbData[chapterId] = dbData[chapterId] or {} | ||
| 261 | + dbData[chapterId]["pts"] = dbData[chapterId]["pts"] or {} | ||
| 262 | + dbData[chapterId]["pts"][taskId] = value | ||
| 255 | else | 263 | else |
| 256 | - table.insert(advAchievChange, {type = achievField, field = {chapterId, taskId}, value = value}) | 264 | + advAchievChange[achievField] = advAchievChange[achievField] or {} |
| 265 | + advAchievChange[achievField][chapterId] = advAchievChange[achievField][chapterId] or {} | ||
| 266 | + advAchievChange[achievField][chapterId][taskId] = value | ||
| 267 | + | ||
| 268 | + dbData[chapterId] = dbData[chapterId] or {} | ||
| 269 | + dbData[chapterId][taskId] = value | ||
| 257 | end | 270 | end |
| 258 | end | 271 | end |
| 259 | 272 | ||
| 260 | function Adv:checkAchievement(taskType, count, cond, cond2) | 273 | function Adv:checkAchievement(taskType, count, cond, cond2) |
| 261 | local achievField = self:isEndless() and "advEAchiev" or "advAchiev" | 274 | local achievField = self:isEndless() and "advEAchiev" or "advAchiev" |
| 262 | - local advAchiev = self.owner:getProperty(achievField)[self.chapterId] or {} | 275 | + local dbData = self.owner:getProperty(achievField) |
| 276 | + dbData[self.chapterId] = dbData[self.chapterId] or {} | ||
| 277 | + local advAchiev = dbData[self.chapterId] | ||
| 263 | for taskId , data in pairs(csvdb["adv_achievementCsv"][self.chapterId] or {}) do | 278 | for taskId , data in pairs(csvdb["adv_achievementCsv"][self.chapterId] or {}) do |
| 264 | local oldStatus = advAchiev[taskId] or 0 | 279 | local oldStatus = advAchiev[taskId] or 0 |
| 265 | if oldStatus ~= -1 and data.type == taskType then | 280 | if oldStatus ~= -1 and data.type == taskType then |
| @@ -332,18 +347,19 @@ function AdvTask.bind(Adv) | @@ -332,18 +347,19 @@ function AdvTask.bind(Adv) | ||
| 332 | 347 | ||
| 333 | if self:isEndless() then | 348 | if self:isEndless() then |
| 334 | if status and status ~= oldStatus then | 349 | if status and status ~= oldStatus then |
| 335 | - insertChange(self.chapterId, taskId, status) | 350 | + insertChange(self, self.chapterId, taskId, status) |
| 336 | end | 351 | end |
| 337 | else | 352 | else |
| 338 | if (status or -1) >= data.value1 then | 353 | if (status or -1) >= data.value1 then |
| 339 | status = -1 | 354 | status = -1 |
| 355 | + self.owner:log("adv_action", {desc = "finishAchiev", short1 = 1, int1 = self.chapterId, int2 = taskId}) | ||
| 340 | end | 356 | end |
| 341 | if status and status ~= oldStatus then | 357 | if status and status ~= oldStatus then |
| 342 | - insertChange(self.chapterId, taskId, status) | 358 | + insertChange(self, self.chapterId, taskId, status) |
| 343 | if status == -1 then | 359 | if status == -1 then |
| 344 | - local ptcount = (self.owner:getProperty(achievField)[self.chapterId] or {})[-1] or 0 | 360 | + local ptcount = advAchiev[-1] or 0 |
| 345 | ptcount = ptcount + data.pt | 361 | ptcount = ptcount + data.pt |
| 346 | - insertChange(self.chapterId, -1, ptcount) | 362 | + insertChange(self, self.chapterId, -1, ptcount) |
| 347 | end | 363 | end |
| 348 | end | 364 | end |
| 349 | end | 365 | end |
| @@ -361,10 +377,10 @@ function AdvTask.bind(Adv) | @@ -361,10 +377,10 @@ function AdvTask.bind(Adv) | ||
| 361 | 377 | ||
| 362 | local reward = {} | 378 | local reward = {} |
| 363 | if status >= achievData.value1 then | 379 | if status >= achievData.value1 then |
| 364 | - insertChange(chapterId, taskId, -1) | 380 | + insertChange(self, chapterId, taskId, -1) |
| 365 | local count = (self.owner:getProperty(achievField)[chapterId] or {})[-1] or 0 | 381 | local count = (self.owner:getProperty(achievField)[chapterId] or {})[-1] or 0 |
| 366 | count = count + achievData.pt | 382 | count = count + achievData.pt |
| 367 | - insertChange(chapterId, -1, count) | 383 | + insertChange(self, chapterId, -1, count) |
| 368 | 384 | ||
| 369 | -- 发放奖励 | 385 | -- 发放奖励 |
| 370 | reward = self.owner:award(achievData.reward, {log = {desc = "advAchiev", int1 = chapterId, int2 = taskId}}) | 386 | reward = self.owner:award(achievData.reward, {log = {desc = "advAchiev", int1 = chapterId, int2 = taskId}}) |
| @@ -380,13 +396,14 @@ function AdvTask.bind(Adv) | @@ -380,13 +396,14 @@ function AdvTask.bind(Adv) | ||
| 380 | if status == -1 or count < achievData.pt then return end | 396 | if status == -1 or count < achievData.pt then return end |
| 381 | 397 | ||
| 382 | local reward = self.owner:award(achievData.reward, {log = {desc = "advAchievReward", int1 = chapterId, int2 = taskId}}) | 398 | local reward = self.owner:award(achievData.reward, {log = {desc = "advAchievReward", int1 = chapterId, int2 = taskId}}) |
| 383 | - insertChange(chapterId, taskId, -1, true) | 399 | + insertChange(self, chapterId, taskId, -1, true) |
| 384 | return true, reward | 400 | return true, reward |
| 385 | end | 401 | end |
| 386 | 402 | ||
| 387 | function Adv:updateAchievement(notNotify) | 403 | function Adv:updateAchievement(notNotify) |
| 388 | if not next(advAchievChange) then return end | 404 | if not next(advAchievChange) then return end |
| 389 | - self.owner:changeUpdates(advAchievChange, notNotify) | 405 | + self.owner:changeMapUpdates(advAchievChange, notNotify) |
| 406 | + advAchievChange = {} | ||
| 390 | end | 407 | end |
| 391 | 408 | ||
| 392 | end | 409 | end |
src/agent.lua
| @@ -8,14 +8,13 @@ require "skynet.manager" | @@ -8,14 +8,13 @@ require "skynet.manager" | ||
| 8 | local queue = require "skynet.queue" | 8 | local queue = require "skynet.queue" |
| 9 | local netpack = require "skynet.netpack" | 9 | local netpack = require "skynet.netpack" |
| 10 | local socket = require "skynet.socket" | 10 | local socket = require "skynet.socket" |
| 11 | -local sharedata = require "skynet.sharedata" | ||
| 12 | local xxtea = require "xxtea" | 11 | local xxtea = require "xxtea" |
| 13 | 12 | ||
| 14 | skynet = require "skynet" | 13 | skynet = require "skynet" |
| 15 | redisproxy = require "shared.redisproxy" | 14 | redisproxy = require "shared.redisproxy" |
| 16 | datacenter = require "skynet.datacenter" | 15 | datacenter = require "skynet.datacenter" |
| 17 | mcast_util = require "services/mcast_util" | 16 | mcast_util = require "services/mcast_util" |
| 18 | -globalCsv = require "csvdata/GlobalDefine" | 17 | +csvdb = require "shared.csvdata" |
| 19 | 18 | ||
| 20 | local CMD = {} | 19 | local CMD = {} |
| 21 | local agentInfo = {} -- { client_fd, role, gate_serv, open_timer} | 20 | local agentInfo = {} -- { client_fd, role, gate_serv, open_timer} |
| @@ -217,7 +216,7 @@ skynet.register_protocol { | @@ -217,7 +216,7 @@ skynet.register_protocol { | ||
| 217 | 216 | ||
| 218 | skynet.register_protocol { | 217 | skynet.register_protocol { |
| 219 | name = "role", | 218 | name = "role", |
| 220 | - id = 13, | 219 | + id = 101, |
| 221 | pack = skynet.pack, | 220 | pack = skynet.pack, |
| 222 | unpack = skynet.unpack, | 221 | unpack = skynet.unpack, |
| 223 | dispatch = function(session, address, submethod, ...) | 222 | dispatch = function(session, address, submethod, ...) |
| @@ -326,20 +325,28 @@ skynet.start(function() | @@ -326,20 +325,28 @@ skynet.start(function() | ||
| 326 | end | 325 | end |
| 327 | end) | 326 | end) |
| 328 | 327 | ||
| 329 | - redisd = skynet.localname(".REDIS") | 328 | + skynet.info_func(function() |
| 329 | + local info = {} | ||
| 330 | + info.ip = agentInfo.ip | ||
| 331 | + if agentInfo.role then | ||
| 332 | + info.roldId = agentInfo.role:getProperty("id") | ||
| 333 | + end | ||
| 334 | + return info | ||
| 335 | + end) | ||
| 336 | + | ||
| 337 | + redisd = skynet.localname(".redis") | ||
| 330 | if tonumber(skynet.getenv "logd") == 1 then | 338 | if tonumber(skynet.getenv "logd") == 1 then |
| 331 | - logd = skynet.localname(".LOGD") | 339 | + logd = skynet.localname(".log") |
| 332 | end | 340 | end |
| 333 | 341 | ||
| 334 | cs = queue() | 342 | cs = queue() |
| 335 | 343 | ||
| 336 | - csvdb = sharedata.query("csvdata") | ||
| 337 | - pvpd = skynet.localname(".PVPCROSS") | 344 | + pvpd = skynet.localname(".pvpcross") |
| 338 | -- 错误码特殊处理 | 345 | -- 错误码特殊处理 |
| 339 | -- todo | 346 | -- todo |
| 340 | -- for key, value in pairs(csvdb["sys_codesCsv"]) do | 347 | -- for key, value in pairs(csvdb["sys_codesCsv"]) do |
| 341 | -- _G[string.upper(value.varname)] = key | 348 | -- _G[string.upper(value.varname)] = key |
| 342 | -- end | 349 | -- end |
| 343 | - | 350 | + globalCsv = csvdb["GlobalDefineCsv"] |
| 344 | agent_util = require "services/agent_util" | 351 | agent_util = require "services/agent_util" |
| 345 | end) | 352 | end) |
src/models/Diner.lua
| @@ -28,7 +28,6 @@ function Diner:refreshDailyData(notify) | @@ -28,7 +28,6 @@ function Diner:refreshDailyData(notify) | ||
| 28 | 28 | ||
| 29 | -- 委托 | 29 | -- 委托 |
| 30 | local entrust = self:getProperty("entrust") | 30 | local entrust = self:getProperty("entrust") |
| 31 | - local hangPass = self.owner:getProperty("hangPass") | ||
| 32 | local entrustB = self:getProperty("entrustB") | 31 | local entrustB = self:getProperty("entrustB") |
| 33 | local had = {} | 32 | local had = {} |
| 34 | local pool = {} | 33 | local pool = {} |
| @@ -41,11 +40,11 @@ function Diner:refreshDailyData(notify) | @@ -41,11 +40,11 @@ function Diner:refreshDailyData(notify) | ||
| 41 | if data.show ~= "" then | 40 | if data.show ~= "" then |
| 42 | -- 不填=默认刷出,1=达成前置任务,2=通关关卡 | 41 | -- 不填=默认刷出,1=达成前置任务,2=通关关卡 |
| 43 | local showC = data.show:toArray(true, "=") | 42 | local showC = data.show:toArray(true, "=") |
| 44 | - if showC[1] == 1 then | ||
| 45 | - if not hangPass[showC[2]] then | 43 | + if showC[1] == 2 then |
| 44 | + if not self.owner:checkHangPass(showC[2]) then | ||
| 46 | show = false | 45 | show = false |
| 47 | end | 46 | end |
| 48 | - elseif showC[1] == 2 then | 47 | + elseif showC[1] == 1 then |
| 49 | if not entrustB[showC[2]] then | 48 | if not entrustB[showC[2]] then |
| 50 | show = false | 49 | show = false |
| 51 | end | 50 | end |
| @@ -70,6 +69,18 @@ function Diner:refreshDailyData(notify) | @@ -70,6 +69,18 @@ function Diner:refreshDailyData(notify) | ||
| 70 | had[entrust[i]] = 1 | 69 | had[entrust[i]] = 1 |
| 71 | end | 70 | end |
| 72 | end | 71 | end |
| 72 | + | ||
| 73 | + local guide = self.owner:getProperty("newerGuide") | ||
| 74 | + local master, slave = string.match(guide,"(%d+)=(%d+)") | ||
| 75 | + if tonumber(master) <= 26 then | ||
| 76 | + entrust[1] = 1031 | ||
| 77 | + entrust[2] = 3 | ||
| 78 | + elseif tonumber(master) <= 29 then | ||
| 79 | + local temp = entrust[1] | ||
| 80 | + entrust[1] = 3 | ||
| 81 | + entrust[2] = temp | ||
| 82 | + end | ||
| 83 | + | ||
| 73 | self:updateProperty({field = "entrust", value = entrust, notNotify = not notify}) | 84 | self:updateProperty({field = "entrust", value = entrust, notNotify = not notify}) |
| 74 | 85 | ||
| 75 | -- 每日加速次数 | 86 | -- 每日加速次数 |
| @@ -301,9 +312,8 @@ end | @@ -301,9 +312,8 @@ end | ||
| 301 | function Diner:getMaxSlots() | 312 | function Diner:getMaxSlots() |
| 302 | local slotCount = globalCsv.diner_sell_slots_init | 313 | local slotCount = globalCsv.diner_sell_slots_init |
| 303 | 314 | ||
| 304 | - local hangPass = self.owner:getProperty("hangPass") | ||
| 305 | for _, carbonId in ipairs(globalCsv.diner_sell_slots_unlock) do | 315 | for _, carbonId in ipairs(globalCsv.diner_sell_slots_unlock) do |
| 306 | - if hangPass[carbonId] then | 316 | + if self.owner:checkHangPass(carbonId) then |
| 307 | slotCount = slotCount + 1 | 317 | slotCount = slotCount + 1 |
| 308 | end | 318 | end |
| 309 | end | 319 | end |
src/models/HeroPlugin.lua
| @@ -18,6 +18,28 @@ function HeroPlugin.bind(Hero) | @@ -18,6 +18,28 @@ function HeroPlugin.bind(Hero) | ||
| 18 | return math.min(#csvdb["unit_expCsv"], csvdb["unit_breakCsv"][self:getProperty("breakL")].levelLimit) | 18 | return math.min(#csvdb["unit_expCsv"], csvdb["unit_breakCsv"][self:getProperty("breakL")].levelLimit) |
| 19 | end | 19 | end |
| 20 | 20 | ||
| 21 | + | ||
| 22 | + -- 纯% 的属性 | ||
| 23 | + local PercentAttr = { | ||
| 24 | + crit = 6, -- 暴击 | ||
| 25 | + critHurt = 8, -- 暴伤 | ||
| 26 | + vampire = 9, -- 吸血 | ||
| 27 | + pierce = 10, -- 穿透 | ||
| 28 | + } | ||
| 29 | + -- base 原, add 增加值 ,atype 增加类型(0 值 1%) | ||
| 30 | + local function addAttr(base, add, atype, attrName) | ||
| 31 | + base = base or 0 | ||
| 32 | + add = add or 0 | ||
| 33 | + if PercentAttr[attrName] then | ||
| 34 | + atype = 0 | ||
| 35 | + end | ||
| 36 | + if atype == 1 then | ||
| 37 | + return base * add / 100 | ||
| 38 | + else | ||
| 39 | + return add | ||
| 40 | + end | ||
| 41 | + end | ||
| 42 | + | ||
| 21 | --角色自身 = 初始 *(1+升级)*(1+突破)*(1+觉醒)+ 天赋升级 + 天赋阶段 | 43 | --角色自身 = 初始 *(1+升级)*(1+突破)*(1+觉醒)+ 天赋升级 + 天赋阶段 |
| 22 | function Hero:getBaseAttrs(params) | 44 | function Hero:getBaseAttrs(params) |
| 23 | params = params or {} | 45 | params = params or {} |
| @@ -53,7 +75,7 @@ function HeroPlugin.bind(Hero) | @@ -53,7 +75,7 @@ function HeroPlugin.bind(Hero) | ||
| 53 | 75 | ||
| 54 | for _, attrName in pairs(AttsEnumEx) do | 76 | for _, attrName in pairs(AttsEnumEx) do |
| 55 | if talentAttrS[attrName] then | 77 | if talentAttrS[attrName] then |
| 56 | - talentAttrS[attrName] = (unitData[attrName] or 0) * talentAttrS[attrName] | 78 | + talentAttrS[attrName] = addAttr(unitData[attrName], talentAttrS[attrName], 1, attrName) |
| 57 | end | 79 | end |
| 58 | end | 80 | end |
| 59 | 81 | ||
| @@ -66,16 +88,16 @@ function HeroPlugin.bind(Hero) | @@ -66,16 +88,16 @@ function HeroPlugin.bind(Hero) | ||
| 66 | local blData = csvdb["unit_breakCsv"][breakL] | 88 | local blData = csvdb["unit_breakCsv"][breakL] |
| 67 | local wData = csvdb["unit_wakeCsv"][wakeL] | 89 | local wData = csvdb["unit_wakeCsv"][wakeL] |
| 68 | for attr, value in pairs(attrs) do | 90 | for attr, value in pairs(attrs) do |
| 69 | - attrs[attr] = attrs[attr] * (1 + (lData[attr .. "Level"] or 0) / 100) | ||
| 70 | - * (1 + (blData[attr .. "Level"] or 0) / 100) | ||
| 71 | - * (1 + (wData[attr .. "Level"] or 0) / 100) + (talentAttrS[attr] or 0) | 91 | + attrs[attr] = attrs[attr] + addAttr(attrs[attr], lData[attr .. "Level"], 1, attr) |
| 92 | + attrs[attr] = attrs[attr] + addAttr(attrs[attr], blData[attr .. "Level"], 1, attr) | ||
| 93 | + attrs[attr] = attrs[attr] + addAttr(attrs[attr], wData[attr .. "Level"], 1, attr) + (talentAttrS[attr] or 0) | ||
| 72 | end | 94 | end |
| 73 | 95 | ||
| 74 | return attrs | 96 | return attrs |
| 75 | end | 97 | end |
| 76 | 98 | ||
| 77 | 99 | ||
| 78 | - --当前属性 = [ 角色属性值 + 基础装备(固定)+ 专属装备(固定)] * [ 1 + 基础装备(百分比) + 专属装备(百分比)] | 100 | + --当前属性 = 角色属性值 * (1 + 装备套装(百分比) + 铭文套装(百分比))+ (装备(固定)+ 铭文(固定)) |
| 79 | function Hero:getTotalAttrs(params) | 101 | function Hero:getTotalAttrs(params) |
| 80 | params = params or {} | 102 | params = params or {} |
| 81 | local attrs = self:getBaseAttrs() | 103 | local attrs = self:getBaseAttrs() |
| @@ -83,13 +105,15 @@ function HeroPlugin.bind(Hero) | @@ -83,13 +105,15 @@ function HeroPlugin.bind(Hero) | ||
| 83 | local equipAttrs = self:getRuneEquipAttrs() | 105 | local equipAttrs = self:getRuneEquipAttrs() |
| 84 | 106 | ||
| 85 | for _, attName in pairs(AttsEnumEx) do | 107 | for _, attName in pairs(AttsEnumEx) do |
| 86 | - attrs[attName] = ((attrs[attName] or 0) + equipAttrs.value[attName]) * (1 + equipAttrs.percent[attName] / 100) | 108 | + attrs[attName] = attrs[attName] or 0 |
| 109 | + attrs[attName] = attrs[attName] + addAttr(attrs[attName], equipAttrs.percent[attName], 1, attName) | ||
| 110 | + attrs[attName] = attrs[attName] + addAttr(attrs[attName], equipAttrs.value[attName], 0, attName) | ||
| 87 | end | 111 | end |
| 88 | 112 | ||
| 89 | -- 羁绊加成 | 113 | -- 羁绊加成 |
| 90 | if params.activeRelation then | 114 | if params.activeRelation then |
| 91 | - for k, v in pairs(AttsEnumEx) do | ||
| 92 | - attrs[v] = (attrs[v] or 0) * (1 + (params.activeRelation[v] or 0) / 100) | 115 | + for k, attName in pairs(AttsEnumEx) do |
| 116 | + attrs[attName] = attrs[attName] + addAttr(attrs[attName], params.activeRelation[attName], 1, attName) | ||
| 93 | end | 117 | end |
| 94 | end | 118 | end |
| 95 | return attrs | 119 | return attrs |
| @@ -137,20 +161,32 @@ function HeroPlugin.bind(Hero) | @@ -137,20 +161,32 @@ function HeroPlugin.bind(Hero) | ||
| 137 | end | 161 | end |
| 138 | end | 162 | end |
| 139 | -- 零件效果 | 163 | -- 零件效果 |
| 140 | - local suits = {} | ||
| 141 | - for _, uid in pairs(self:getProperty("rune"):toNumMap()) do | ||
| 142 | - if uid > 0 then | ||
| 143 | - local rune = self.owner.runeBag[uid] | ||
| 144 | - local buildData = csvdb["rune_buildCsv"][rune:getProperty("level")] | ||
| 145 | - for k,v in pairs(rune:getProperty("attrs"):toNumMap()) do | ||
| 146 | - attrs.value[AttsEnumEx[k]] = attrs.value[AttsEnumEx[k]] + (v / 10 * (1 + buildData.effect/100)) -- 零件的加成属性有特殊需求 填的是 10倍的值 | ||
| 147 | - | ||
| 148 | - end | ||
| 149 | - local csvData = csvdb["runeCsv"][rune:getProperty("type")][rune:getProperty("id")] | ||
| 150 | - if not suits[csvData.suit] then suits[csvData.suit] = {} end | ||
| 151 | - table.insert(suits[csvData.suit],csvData) | ||
| 152 | - end | ||
| 153 | - end | 164 | + local suits = {} |
| 165 | + for _, uid in pairs(self:getProperty("rune"):toNumMap()) do | ||
| 166 | + if uid > 0 then | ||
| 167 | + local rune = self.owner.runeBag[uid] | ||
| 168 | + local csvData = csvdb["runeCsv"][rune:getProperty("type")][rune:getProperty("id")] | ||
| 169 | + local runeRareData = csvdb["rune_rareCsv"][csvData.rarity] | ||
| 170 | + local buildData = csvdb["rune_buildCsv"][rune:getProperty("level")] | ||
| 171 | + for k, v in pairs(rune:getProperty("attrs"):toNumMap()) do | ||
| 172 | + local attName = AttsEnumEx[k] | ||
| 173 | + --零件的加成属性有特殊需求 填的是 10倍的值 | ||
| 174 | + --rare的effect不影响 特殊属性 | ||
| 175 | + | ||
| 176 | + --铭文单件普通属性=attr*(1+[rune_build表effect]/100*[rune_rare表effect]/100) | ||
| 177 | + --铭文单件特殊属性=attr+[rune_build表effect] | ||
| 178 | + | ||
| 179 | + local effect = buildData[attName] | ||
| 180 | + if not PercentAttr[attName] then | ||
| 181 | + effect = buildData[attName] * runeRareData.effect / 100 | ||
| 182 | + end | ||
| 183 | + attrs.value[attName] = attrs.value[attName] + (v / 100) + addAttr(v / 100, effect, 1, attName) | ||
| 184 | + end | ||
| 185 | + | ||
| 186 | + if not suits[csvData.suit] then suits[csvData.suit] = {} end | ||
| 187 | + table.insert(suits[csvData.suit],csvData) | ||
| 188 | + end | ||
| 189 | + end | ||
| 154 | -- 零件套装效果 | 190 | -- 零件套装效果 |
| 155 | for suitId,runeDatas in pairs(suits) do | 191 | for suitId,runeDatas in pairs(suits) do |
| 156 | local suitCsv = csvdb["rune_suitCsv"][tonumber(suitId)] | 192 | local suitCsv = csvdb["rune_suitCsv"][tonumber(suitId)] |
| @@ -214,6 +250,52 @@ function HeroPlugin.bind(Hero) | @@ -214,6 +250,52 @@ function HeroPlugin.bind(Hero) | ||
| 214 | end | 250 | end |
| 215 | return {} | 251 | return {} |
| 216 | end | 252 | end |
| 253 | + | ||
| 254 | + function Hero:getRunes() | ||
| 255 | + local rune = self:getProperty("rune") | ||
| 256 | + if not rune or rune == "" then | ||
| 257 | + rune = "1=0 2=0 3=0 4=0 5=0 6=0" | ||
| 258 | + end | ||
| 259 | + local result = rune:toNumMap() | ||
| 260 | + for i = 1, 6 do | ||
| 261 | + if not result[i] then | ||
| 262 | + result[i] = 0 | ||
| 263 | + end | ||
| 264 | + end | ||
| 265 | + return result | ||
| 266 | + end | ||
| 267 | + | ||
| 268 | + -- 101 冒险战斗被动技 | ||
| 269 | + -- 102 挂机战斗被动技 | ||
| 270 | + function Hero:getRuneSkill(skillType) | ||
| 271 | + local suits = {} | ||
| 272 | + for _,uid in pairs(self:getRunes()) do | ||
| 273 | + if uid > 0 then | ||
| 274 | + local runeData = self.owner.runeBag[uid] | ||
| 275 | + if not runeData then return end | ||
| 276 | + local csvData = csvdb["runeCsv"][runeData:getProperty("type")][runeData:getProperty("id")] | ||
| 277 | + if not suits[csvData.suit] then suits[csvData.suit] = {} end | ||
| 278 | + table.insert(suits[csvData.suit],csvData) | ||
| 279 | + end | ||
| 280 | + end | ||
| 281 | + | ||
| 282 | + for suitId,runes in pairs(suits) do | ||
| 283 | + local suitCsv = csvdb["rune_suitCsv"][tonumber(suitId)] | ||
| 284 | + if not suitCsv then return end | ||
| 285 | + local effects = suitCsv.effect:toTableArray(true) | ||
| 286 | + local count = #runes | ||
| 287 | + if count >= 2 and effects[1][1] == skillType then | ||
| 288 | + return effects[1][2] | ||
| 289 | + end | ||
| 290 | + if count >= 4 and effects[2][1] == skillType then | ||
| 291 | + return effects[2][2] | ||
| 292 | + end | ||
| 293 | + if count >= 6 and effects[3][1] == skillType then | ||
| 294 | + return effects[3][2] | ||
| 295 | + end | ||
| 296 | + end | ||
| 297 | + return | ||
| 298 | + end | ||
| 217 | end | 299 | end |
| 218 | 300 | ||
| 219 | 301 |
src/models/Role.lua
| @@ -4,7 +4,6 @@ local RoleLog = import(".RoleLog") --日志相关 | @@ -4,7 +4,6 @@ local RoleLog = import(".RoleLog") --日志相关 | ||
| 4 | local RolePlugin = import(".RolePlugin") --基础功能 | 4 | local RolePlugin = import(".RolePlugin") --基础功能 |
| 5 | local RoleTimeReset = import(".RoleTimeReset") --时间重置相关 | 5 | local RoleTimeReset = import(".RoleTimeReset") --时间重置相关 |
| 6 | local RoleTask = import(".RoleTask") --角色任务 | 6 | local RoleTask = import(".RoleTask") --角色任务 |
| 7 | -local RoleActivity = import(".RoleActivity") --活动相关 | ||
| 8 | local RoleChangeStruct = import(".RoleChangeStruct") --角色数据额结构更改 | 7 | local RoleChangeStruct = import(".RoleChangeStruct") --角色数据额结构更改 |
| 9 | local RolePvp = import(".RolePvp") -- pvp | 8 | local RolePvp = import(".RolePvp") -- pvp |
| 10 | local RoleCross = import(".RoleCross") -- 跨服务请求相关 | 9 | local RoleCross = import(".RoleCross") -- 跨服务请求相关 |
| @@ -13,7 +12,6 @@ RoleLog.bind(Role) | @@ -13,7 +12,6 @@ RoleLog.bind(Role) | ||
| 13 | RolePlugin.bind(Role) | 12 | RolePlugin.bind(Role) |
| 14 | RoleTimeReset.bind(Role) | 13 | RoleTimeReset.bind(Role) |
| 15 | RoleTask.bind(Role) | 14 | RoleTask.bind(Role) |
| 16 | -RoleActivity.bind(Role) | ||
| 17 | RoleChangeStruct.bind(Role) | 15 | RoleChangeStruct.bind(Role) |
| 18 | RolePvp.bind(Role) | 16 | RolePvp.bind(Role) |
| 19 | RoleCross.bind(Role) | 17 | RoleCross.bind(Role) |
| @@ -88,6 +86,7 @@ Role.schema = { | @@ -88,6 +86,7 @@ Role.schema = { | ||
| 88 | 86 | ||
| 89 | --挂机相关 | 87 | --挂机相关 |
| 90 | hangPass = {"table", {}}, -- 挂机通过的最大关卡 | 88 | hangPass = {"table", {}}, -- 挂机通过的最大关卡 |
| 89 | + hangGift = {"table", {}}, -- 挂机奖励 {id = 1} | ||
| 91 | hangTeam = {"table", {}}, -- 挂机队伍 | 90 | hangTeam = {"table", {}}, -- 挂机队伍 |
| 92 | hangTS = {"table", {}}, -- 挂机队伍他人可读的队伍信息 | 91 | hangTS = {"table", {}}, -- 挂机队伍他人可读的队伍信息 |
| 93 | hangTB = {"table", {}}, -- 挂机队伍他人可用的战斗信息mao | 92 | hangTB = {"table", {}}, -- 挂机队伍他人可用的战斗信息mao |
| @@ -144,8 +143,13 @@ Role.schema = { | @@ -144,8 +143,13 @@ Role.schema = { | ||
| 144 | 143 | ||
| 145 | emailSync = {"number", 0}, -- 已经同步到的邮件Id | 144 | emailSync = {"number", 0}, -- 已经同步到的邮件Id |
| 146 | 145 | ||
| 147 | - repayHero = {"number", 0}, -- 超级招募 回馈 | 146 | + -- repayHero = {"number", 0}, -- 超级招募 回馈 |
| 148 | floorHero = {"table", {}}, -- 招募保底 -- {[poolId] = count} | 147 | floorHero = {"table", {}}, -- 招募保底 -- {[poolId] = count} |
| 148 | + ssrUp = {"table", {}}, -- ssr up -- {[poolId] = count} | ||
| 149 | + newerDraw = {"table", {}}, -- 新手池子 {N, 1} 抽了多少次, 是否出了ssr | ||
| 150 | + | ||
| 151 | + sudoku = {"table", {}}, -- 九宫格 {[-1] = 1, task = {[1] = {}, [2] = {}}}} -- [-1] 阶段 如果为 -1 关闭(都做完了), task 当前阶段任务进度, reward 连串奖励领取情况 | ||
| 152 | + sign = {"table", {}}, -- 签到记录 {[1] = 20181029} | ||
| 149 | } | 153 | } |
| 150 | 154 | ||
| 151 | 155 | ||
| @@ -192,8 +196,39 @@ function Role:notifyUpdateProperties(params) | @@ -192,8 +196,39 @@ function Role:notifyUpdateProperties(params) | ||
| 192 | SendPacket(actionCodes.Role_updateProperties, MsgPack.pack(params)) | 196 | SendPacket(actionCodes.Role_updateProperties, MsgPack.pack(params)) |
| 193 | end | 197 | end |
| 194 | 198 | ||
| 199 | +local mapToList | ||
| 200 | +mapToList = function(map) | ||
| 201 | + local result = {} | ||
| 202 | + if type(map) == "table" then | ||
| 203 | + for k, v in pairs(map) do | ||
| 204 | + for _, _one in ipairs(mapToList(v)) do | ||
| 205 | + table.insert(result, {k, table.unpack(_one)}) | ||
| 206 | + end | ||
| 207 | + end | ||
| 208 | + else | ||
| 209 | + table.insert(result, {map}) | ||
| 210 | + end | ||
| 211 | + return result | ||
| 212 | +end | ||
| 213 | + | ||
| 214 | +function Role:changeMapUpdates(params, notNotify) | ||
| 215 | + local changes = {} | ||
| 216 | + for _, one in ipairs(mapToList(params)) do | ||
| 217 | + local ftype = table.remove(one, 1) | ||
| 218 | + local value = table.remove(one, #one) | ||
| 219 | + if ftype and value and #one > 0 then | ||
| 220 | + table.insert(changes, {type = ftype, field = #one > 1 and one or one[1], value = value}) | ||
| 221 | + else | ||
| 222 | + print("ERROR: changeMapUpdates") | ||
| 223 | + dump(params) | ||
| 224 | + end | ||
| 225 | + end | ||
| 226 | + self:changeUpdates(changes, notNotify) | ||
| 227 | +end | ||
| 228 | + | ||
| 195 | -- 某些字段 更新改变量 改变量的定义由字段自身决定 {{type = ""}, } | 229 | -- 某些字段 更新改变量 改变量的定义由字段自身决定 {{type = ""}, } |
| 196 | function Role:changeUpdates(params, notNotify) | 230 | function Role:changeUpdates(params, notNotify) |
| 231 | + local needSetProperty = {} | ||
| 197 | local changeUpdateFunc = { | 232 | local changeUpdateFunc = { |
| 198 | -- ["loveStatus"] = function(info) | 233 | -- ["loveStatus"] = function(info) |
| 199 | -- self:setProperty("loveStatus", self:getProperty("loveStatus"):setv(info["field"], info["value"])) | 234 | -- self:setProperty("loveStatus", self:getProperty("loveStatus"):setv(info["field"], info["value"])) |
| @@ -219,7 +254,7 @@ function Role:changeUpdates(params, notNotify) | @@ -219,7 +254,7 @@ function Role:changeUpdates(params, notNotify) | ||
| 219 | else | 254 | else |
| 220 | curValue[info["field"]] = info["value"] | 255 | curValue[info["field"]] = info["value"] |
| 221 | end | 256 | end |
| 222 | - self:setProperty(fieldType) | 257 | + needSetProperty[fieldType] = 1 |
| 223 | return {type = fieldType, field = info["field"], value = info["value"]} | 258 | return {type = fieldType, field = info["field"], value = info["value"]} |
| 224 | end, | 259 | end, |
| 225 | ["onlyToC"] = function(info) | 260 | ["onlyToC"] = function(info) |
| @@ -238,6 +273,10 @@ function Role:changeUpdates(params, notNotify) | @@ -238,6 +273,10 @@ function Role:changeUpdates(params, notNotify) | ||
| 238 | table.insert(updates, changeUpdateFunc["tableCommon"](one["type"], one)) | 273 | table.insert(updates, changeUpdateFunc["tableCommon"](one["type"], one)) |
| 239 | end | 274 | end |
| 240 | end | 275 | end |
| 276 | + | ||
| 277 | + for fieldType, _ in pairs(needSetProperty) do | ||
| 278 | + self:setProperty(fieldType) | ||
| 279 | + end | ||
| 241 | if not notNotify and next(updates) then | 280 | if not notNotify and next(updates) then |
| 242 | SendPacket(actionCodes.Role_changeUpdate, MsgPack.pack(updates)) | 281 | SendPacket(actionCodes.Role_changeUpdate, MsgPack.pack(updates)) |
| 243 | end | 282 | end |
| @@ -283,6 +322,7 @@ function Role:data() | @@ -283,6 +322,7 @@ function Role:data() | ||
| 283 | advSup = self:getProperty("advSup"), | 322 | advSup = self:getProperty("advSup"), |
| 284 | 323 | ||
| 285 | hangPass = self:getProperty("hangPass"), | 324 | hangPass = self:getProperty("hangPass"), |
| 325 | + hangGift = self:getProperty("hangGift"), | ||
| 286 | hangTeam = self:getProperty("hangTeam"), | 326 | hangTeam = self:getProperty("hangTeam"), |
| 287 | hangInfo = self:getProperty("hangInfo"), | 327 | hangInfo = self:getProperty("hangInfo"), |
| 288 | hangBag = self:getProperty("hangBag"), | 328 | hangBag = self:getProperty("hangBag"), |
| @@ -314,8 +354,11 @@ function Role:data() | @@ -314,8 +354,11 @@ function Role:data() | ||
| 314 | dinerS = self:getProperty("dinerS"), | 354 | dinerS = self:getProperty("dinerS"), |
| 315 | 355 | ||
| 316 | rmbC = self:getProperty("rmbC"), | 356 | rmbC = self:getProperty("rmbC"), |
| 317 | - repayHero = self:getProperty("repayHero"), | ||
| 318 | - floorHero = self:getProperty("floorHero"), | 357 | + -- repayHero = self:getProperty("repayHero"), |
| 358 | + newerDraw = self:getProperty("newerDraw"), | ||
| 359 | + | ||
| 360 | + sudoku = self:getProperty("sudoku"), | ||
| 361 | + sign = self:getProperty("sign"), | ||
| 319 | } | 362 | } |
| 320 | end | 363 | end |
| 321 | 364 |
src/models/RoleActivity.lua
| 1 | +local Activity = class("Activity", require("shared.ModelBase")) | ||
| 1 | 2 | ||
| 2 | 3 | ||
| 3 | -local RoleActivity = {} | 4 | +Activity.ActivityType = { |
| 4 | 5 | ||
| 5 | -function RoleActivity.bind(Role) | 6 | +} |
| 6 | 7 | ||
| 8 | +local function checkActivityType(activityType) | ||
| 9 | + if type(activityType) == "string" then | ||
| 10 | + activityType = Activity.ActivityType[activityType] | ||
| 11 | + end | ||
| 12 | + return activityType | ||
| 13 | +end | ||
| 14 | + | ||
| 15 | + | ||
| 16 | +function Activity:ctor(properties) | ||
| 17 | + Activity.super.ctor(self, properties) | ||
| 18 | + | ||
| 19 | + self.open = {} | ||
| 20 | + | ||
| 21 | +end | ||
| 7 | 22 | ||
| 8 | 23 | ||
| 24 | +Activity.schema = { | ||
| 25 | + _1 = {"table", {}}, | ||
| 26 | +} | ||
| 9 | 27 | ||
| 28 | +function Activity:data() | ||
| 29 | + return { | ||
| 30 | + _1 = self:getProperty("_1"), | ||
| 31 | + } | ||
| 10 | end | 32 | end |
| 11 | 33 | ||
| 12 | -return RoleActivity | ||
| 13 | \ No newline at end of file | 34 | \ No newline at end of file |
| 35 | + | ||
| 36 | + | ||
| 37 | +return Activity | ||
| 14 | \ No newline at end of file | 38 | \ No newline at end of file |
src/models/RoleCross.lua
| @@ -144,19 +144,17 @@ RoleCross.bind = function (Role) | @@ -144,19 +144,17 @@ RoleCross.bind = function (Role) | ||
| 144 | 144 | ||
| 145 | -- fb | 145 | -- fb |
| 146 | local carbonId = initData.fb | 146 | local carbonId = initData.fb |
| 147 | - local passCarbon = self:getProperty("hangPass") | ||
| 148 | local addPre | 147 | local addPre |
| 149 | addPre = function(carbonId) | 148 | addPre = function(carbonId) |
| 150 | local carbonData = csvdb["idle_battleCsv"][carbonId] | 149 | local carbonData = csvdb["idle_battleCsv"][carbonId] |
| 151 | for _, pre in ipairs(carbonData.prepose:toArray(true, "=")) do | 150 | for _, pre in ipairs(carbonData.prepose:toArray(true, "=")) do |
| 152 | - passCarbon[pre] = 1 | 151 | + self:checkHangPass(pre) |
| 153 | self:checkTaskEnter("HangPass", {id = pre}) | 152 | self:checkTaskEnter("HangPass", {id = pre}) |
| 154 | addPre(pre) | 153 | addPre(pre) |
| 155 | end | 154 | end |
| 156 | end | 155 | end |
| 157 | - passCarbon[carbonId] = 1 | 156 | + self:checkHangPass(carbonId) |
| 158 | addPre(carbonId) | 157 | addPre(carbonId) |
| 159 | - self:updateProperty({field = "hangPass", value = passCarbon}) | ||
| 160 | self:checkTaskEnter("HangPass", {id = carbonId}) | 158 | self:checkTaskEnter("HangPass", {id = carbonId}) |
| 161 | 159 | ||
| 162 | -- talent | 160 | -- talent |
src/models/RoleLog.lua
| @@ -32,6 +32,7 @@ local LogType = { | @@ -32,6 +32,7 @@ local LogType = { | ||
| 32 | diner_action = "common", | 32 | diner_action = "common", |
| 33 | tower_action = "common", | 33 | tower_action = "common", |
| 34 | gm_action = "common", | 34 | gm_action = "common", |
| 35 | + act_action = "common", | ||
| 35 | } | 36 | } |
| 36 | 37 | ||
| 37 | -- 如要修改 要提前修改 _template mapping -- 对应 mapping 为 gamelog-* | 38 | -- 如要修改 要提前修改 _template mapping -- 对应 mapping 为 gamelog-* |
src/models/RolePlugin.lua
| @@ -401,10 +401,18 @@ function RolePlugin.bind(Role) | @@ -401,10 +401,18 @@ function RolePlugin.bind(Role) | ||
| 401 | 401 | ||
| 402 | redisproxy:sadd(string.format(R_HEROS, roleId), heroId) | 402 | redisproxy:sadd(string.format(R_HEROS, roleId), heroId) |
| 403 | 403 | ||
| 404 | + local wakeL = 1 | ||
| 405 | + if unitData.rare == 3 then | ||
| 406 | + wakeL = 2 | ||
| 407 | + elseif unitData.rare == 4 then | ||
| 408 | + wakeL = 3 | ||
| 409 | + end | ||
| 410 | + | ||
| 404 | local heroInfo = { | 411 | local heroInfo = { |
| 405 | key = string.format(R_HERO, roleId, heroId), | 412 | key = string.format(R_HERO, roleId, heroId), |
| 406 | id = heroId, | 413 | id = heroId, |
| 407 | type= heroType, | 414 | type= heroType, |
| 415 | + wakeL = wakeL, | ||
| 408 | } | 416 | } |
| 409 | 417 | ||
| 410 | local newHero = require("models.Hero").new(heroInfo) | 418 | local newHero = require("models.Hero").new(heroInfo) |
| @@ -837,8 +845,7 @@ function RolePlugin.bind(Role) | @@ -837,8 +845,7 @@ function RolePlugin.bind(Role) | ||
| 837 | local data = csvdb["guide_unlockCsv"][func] | 845 | local data = csvdb["guide_unlockCsv"][func] |
| 838 | if not data then return true end -- 没有就是解锁了 | 846 | if not data then return true end -- 没有就是解锁了 |
| 839 | 847 | ||
| 840 | - local hangPass = self:getProperty("hangPass") | ||
| 841 | - if hangPass[data.carbonId] then | 848 | + if self:checkHangPass(data.carbonId) then |
| 842 | return true | 849 | return true |
| 843 | else | 850 | else |
| 844 | return false | 851 | return false |
| @@ -916,25 +923,10 @@ function RolePlugin.bind(Role) | @@ -916,25 +923,10 @@ function RolePlugin.bind(Role) | ||
| 916 | end | 923 | end |
| 917 | end | 924 | end |
| 918 | 925 | ||
| 919 | - function Role:advChapterIsOpen(chapterId, layer) | ||
| 920 | - layer = layer or 1 | ||
| 921 | - local exlayer = math.floor((layer - 1) / 10) * 10 + 1 | ||
| 922 | - | ||
| 923 | - if exlayer == 1 then --第一层判断前置 | ||
| 924 | - local advPass = self:getProperty("advPass") | ||
| 925 | - local chapterData = csvdb["adv_chapterCsv"][chapterId] | ||
| 926 | - for id, l in pairs(chapterData.prepose:toNumMap()) do | ||
| 927 | - if (advPass[id] or 0) < l then return false end -- 前置 | ||
| 928 | - end | ||
| 929 | - return true | ||
| 930 | - end | ||
| 931 | - | ||
| 932 | - local unlock = {} | ||
| 933 | - for func , data in pairs(csvdb["unlockCsv"]) do | ||
| 934 | - if data.type == 1 and chapterId == data.value1 and exlayer == data.value2 then | ||
| 935 | - return self:isFuncOpen(func) | ||
| 936 | - end | ||
| 937 | - end | 926 | + function Role:advChapterIsOpen(chapterId) |
| 927 | + local chapterData = csvdb["adv_chapterCsv"][chapterId] | ||
| 928 | + if chapterData.prepose ~= 0 and not self:checkHangPass(chapterData.prepose) then return false end | ||
| 929 | + return true | ||
| 938 | end | 930 | end |
| 939 | 931 | ||
| 940 | function Role:advEventOpenStatus() | 932 | function Role:advEventOpenStatus() |
| @@ -995,7 +987,7 @@ function RolePlugin.bind(Role) | @@ -995,7 +987,7 @@ function RolePlugin.bind(Role) | ||
| 995 | for id, status in pairs(advEAchiev[self.advElChapter] or {}) do | 987 | for id, status in pairs(advEAchiev[self.advElChapter] or {}) do |
| 996 | if status == -1 then | 988 | if status == -1 then |
| 997 | local achvData = csvdb["adv_achievementCsv"][id] | 989 | local achvData = csvdb["adv_achievementCsv"][id] |
| 998 | - if achvData.support ~= 0 then | 990 | + if achvData and achvData.support ~= 0 then |
| 999 | effect[achvData.support] = 1 | 991 | effect[achvData.support] = 1 |
| 1000 | end | 992 | end |
| 1001 | end | 993 | end |
| @@ -1198,8 +1190,10 @@ function RolePlugin.bind(Role) | @@ -1198,8 +1190,10 @@ function RolePlugin.bind(Role) | ||
| 1198 | end | 1190 | end |
| 1199 | info.type = hero:getProperty("type") | 1191 | info.type = hero:getProperty("type") |
| 1200 | info.level = hero:getProperty("level") | 1192 | info.level = hero:getProperty("level") |
| 1193 | + info.wakeL = hero:getProperty("wakeL") | ||
| 1201 | info.blockLevel = hero:getSkillLevel(4) | 1194 | info.blockLevel = hero:getSkillLevel(4) |
| 1202 | info.specialLevel = hero:getSkillLevel(1) | 1195 | info.specialLevel = hero:getSkillLevel(1) |
| 1196 | + info.runeSkill = hero:getRuneSkill(102) | ||
| 1203 | teamInfo.heros[slot] = info | 1197 | teamInfo.heros[slot] = info |
| 1204 | end | 1198 | end |
| 1205 | for slot, id in pairs(team.supports or {}) do | 1199 | for slot, id in pairs(team.supports or {}) do |
| @@ -1267,9 +1261,11 @@ function RolePlugin.bind(Role) | @@ -1267,9 +1261,11 @@ function RolePlugin.bind(Role) | ||
| 1267 | 1261 | ||
| 1268 | local pvpTSH, pvpTBH, pvpTBVH = {}, {}, {} | 1262 | local pvpTSH, pvpTBH, pvpTBVH = {}, {}, {} |
| 1269 | for i = 1, 3 do | 1263 | for i = 1, 3 do |
| 1270 | - pvpTSH[i] = self:getTeamHerosInfo(team[i].heros) | ||
| 1271 | - pvpTBH[i] = self:getTeamBattleInfo(team[i]) | ||
| 1272 | - pvpTBVH[i] = self:getTeamBattleValue(team[i].heros) | 1264 | + if team[i] then |
| 1265 | + pvpTSH[i] = self:getTeamHerosInfo(team[i].heros) | ||
| 1266 | + pvpTBH[i] = self:getTeamBattleInfo(team[i]) | ||
| 1267 | + pvpTBVH[i] = self:getTeamBattleValue(team[i].heros) | ||
| 1268 | + end | ||
| 1273 | end | 1269 | end |
| 1274 | 1270 | ||
| 1275 | self:setProperties({ | 1271 | self:setProperties({ |
| @@ -1363,6 +1359,21 @@ function RolePlugin.bind(Role) | @@ -1363,6 +1359,21 @@ function RolePlugin.bind(Role) | ||
| 1363 | end | 1359 | end |
| 1364 | end | 1360 | end |
| 1365 | 1361 | ||
| 1362 | + function Role:checkHangPass(carbonId) | ||
| 1363 | + local hangPass = self:getProperty("hangPass") | ||
| 1364 | + local diff = math.floor(carbonId / 10000) | ||
| 1365 | + return (hangPass[diff] or 0) >= carbonId | ||
| 1366 | + end | ||
| 1367 | + | ||
| 1368 | + function Role:hangFinish(carbonId) | ||
| 1369 | + local hangPass = self:getProperty("hangPass") | ||
| 1370 | + local diff = math.floor(carbonId / 10000) | ||
| 1371 | + if (hangPass[diff] or 0) < carbonId then | ||
| 1372 | + hangPass[diff] = carbonId | ||
| 1373 | + self:updateProperty({field = "hangPass", value = hangPass}) | ||
| 1374 | + end | ||
| 1375 | + end | ||
| 1376 | + | ||
| 1366 | function Role:getAdvRankKey() | 1377 | function Role:getAdvRankKey() |
| 1367 | local round = self:getProperty("advElS") | 1378 | local round = self:getProperty("advElS") |
| 1368 | local idx = 1 | 1379 | local idx = 1 |
src/models/RoleTask.lua
| @@ -59,11 +59,12 @@ local TaskType = { | @@ -59,11 +59,12 @@ local TaskType = { | ||
| 59 | FoodSellGold = 607, -- 贩卖获得齿轮 - count | 59 | FoodSellGold = 607, -- 贩卖获得齿轮 - count |
| 60 | DinerPopular = 608, -- 人气值 - count | 60 | DinerPopular = 608, -- 人气值 - count |
| 61 | DinerLevelUp = 609, -- 餐厅升级 - level type | 61 | DinerLevelUp = 609, -- 餐厅升级 - level type |
| 62 | - DinerTalentUp = 610, -- 天赋升级 - type | 62 | + DinerTalentUp = 610, -- 天赋升级 - type level |
| 63 | 63 | ||
| 64 | -- 车厢相关 | 64 | -- 车厢相关 |
| 65 | PotionMake = 701, -- 营养剂制作 - id count | 65 | PotionMake = 701, -- 营养剂制作 - id count |
| 66 | OpenBox = 702, -- 拆解时间箱 - id | 66 | OpenBox = 702, -- 拆解时间箱 - id |
| 67 | + SupportSkill = 703, -- 后勤支援技升级 - id level | ||
| 67 | 68 | ||
| 68 | 69 | ||
| 69 | -- pvp相关 | 70 | -- pvp相关 |
| @@ -87,8 +88,8 @@ local TaskType = { | @@ -87,8 +88,8 @@ local TaskType = { | ||
| 87 | ShopAll = 1013, -- 在任意商店购买 | 88 | ShopAll = 1013, -- 在任意商店购买 |
| 88 | } | 89 | } |
| 89 | 90 | ||
| 90 | -local function f(field) | ||
| 91 | - return {type = "field", value = field} | 91 | +local function f(field, func) |
| 92 | + return {type = "field", value = field, func = func} | ||
| 92 | end | 93 | end |
| 93 | 94 | ||
| 94 | -- 剧情任务监听 | 95 | -- 剧情任务监听 |
| @@ -183,11 +184,33 @@ local AchievListener = { | @@ -183,11 +184,33 @@ local AchievListener = { | ||
| 183 | } | 184 | } |
| 184 | } | 185 | } |
| 185 | 186 | ||
| 187 | +local SudokuListerer = { | ||
| 188 | + func = "checkSudokuTask", | ||
| 189 | + listen = { | ||
| 190 | + [TaskType.HangPass] = {{1, 1, f("id")}}, | ||
| 191 | + [TaskType.DrawHero] = {{4, f("count")}}, | ||
| 192 | + [TaskType.HeroLevelUp] = {{5, f("level")}}, | ||
| 193 | + [TaskType.Wake] = {{6, f("wakeL")}}, | ||
| 194 | + [TaskType.AddFriend] = {{7, f("count")}}, | ||
| 195 | + [TaskType.GetFriendP] = {{8, f("count")}}, | ||
| 196 | + [TaskType.AdvStart] = {{9, 1}}, | ||
| 197 | + [TaskType.AdvDraw] = {{10, f("count")}}, | ||
| 198 | + [TaskType.DinerLevelUp] = {{11, f("level"), f("type")}}, | ||
| 199 | + [TaskType.FoodSell] = {{12, f("count")}}, | ||
| 200 | + [TaskType.OpenBox] = {{13, 1}}, | ||
| 201 | + [TaskType.TowerPass] = {{14, f("level")}}, | ||
| 202 | + [TaskType.PvpWin] = {{15, 1}}, | ||
| 203 | + [TaskType.DinerTalentUp] = {{16, f("level"), f("type")}}, | ||
| 204 | + [TaskType.RuneUp] = {{17, 1}}, | ||
| 205 | + } | ||
| 206 | +} | ||
| 207 | + | ||
| 186 | 208 | ||
| 187 | local TaskListeners = { | 209 | local TaskListeners = { |
| 188 | StoryListener, | 210 | StoryListener, |
| 189 | CommonListener, | 211 | CommonListener, |
| 190 | AchievListener, | 212 | AchievListener, |
| 213 | + SudokuListerer, | ||
| 191 | } | 214 | } |
| 192 | 215 | ||
| 193 | local RoleTask = {} | 216 | local RoleTask = {} |
| @@ -207,7 +230,11 @@ function RoleTask.bind(Role) | @@ -207,7 +230,11 @@ function RoleTask.bind(Role) | ||
| 207 | for __, v in ipairs(vs) do | 230 | for __, v in ipairs(vs) do |
| 208 | if type(v) == "table" and v.type then | 231 | if type(v) == "table" and v.type then |
| 209 | if v.type == "field" then | 232 | if v.type == "field" then |
| 210 | - table.insert(pms, params[v.value]) | 233 | + local value = params[v.value] |
| 234 | + if v.func then | ||
| 235 | + value = v.func(value) | ||
| 236 | + end | ||
| 237 | + table.insert(pms, value) | ||
| 211 | else | 238 | else |
| 212 | table.insert(pms, v) | 239 | table.insert(pms, v) |
| 213 | end | 240 | end |
| @@ -442,6 +469,54 @@ function RoleTask.bind(Role) | @@ -442,6 +469,54 @@ function RoleTask.bind(Role) | ||
| 442 | end | 469 | end |
| 443 | end | 470 | end |
| 444 | 471 | ||
| 472 | + -- 九宫格任务 | ||
| 473 | + function Role:checkSudokuTask(notNotify, stype, count, cond) | ||
| 474 | + local change = false | ||
| 475 | + local sudoku = self:getProperty("sudoku") | ||
| 476 | + | ||
| 477 | + local curPhase = sudoku[-1] or 1 | ||
| 478 | + if curPhase == -1 then return end | ||
| 479 | + | ||
| 480 | + local IsFindMax = { | ||
| 481 | + [5] = true, | ||
| 482 | + [6] = true, | ||
| 483 | + [7] = true, | ||
| 484 | + [11] = true, | ||
| 485 | + [14] = true, | ||
| 486 | + [16] = true, | ||
| 487 | + } | ||
| 488 | + | ||
| 489 | + sudoku.task = sudoku.task or {} | ||
| 490 | + for pause, guide_sudokuData in pairs(csvdb["guide_sudokuCsv"]) do | ||
| 491 | + if pause >= curPhase then | ||
| 492 | + sudoku.task[pause] = sudoku.task[pause] or {} | ||
| 493 | + for id , sudikuData in pairs(guide_sudokuData) do | ||
| 494 | + local curStatus = sudoku.task[pause][id] or 0 | ||
| 495 | + | ||
| 496 | + if curStatus ~= -1 and sudikuData.type == stype and (sudikuData.unlock == 0 or self:checkHangPass(sudikuData.unlock)) then | ||
| 497 | + if IsFindMax[sudikuData.type] then -- 最大值 | ||
| 498 | + if sudikuData.con2 == 0 or sudikuData.con2 == cond then | ||
| 499 | + if (count or 0) > curStatus then | ||
| 500 | + change = true | ||
| 501 | + sudoku.task[pause][id] = count | ||
| 502 | + end | ||
| 503 | + end | ||
| 504 | + else --通用增加 | ||
| 505 | + if sudikuData.con2 == 0 or sudikuData.con2 == cond then | ||
| 506 | + change = true | ||
| 507 | + sudoku.task[pause][id] = curStatus + (count or 1) | ||
| 508 | + end | ||
| 509 | + end | ||
| 510 | + end | ||
| 511 | + end | ||
| 512 | + end | ||
| 513 | + end | ||
| 514 | + | ||
| 515 | + if change then | ||
| 516 | + self:updateProperty({field = "sudoku", value = sudoku, notNotify = notNotify}) | ||
| 517 | + end | ||
| 518 | + end | ||
| 519 | + | ||
| 445 | end | 520 | end |
| 446 | 521 | ||
| 447 | return RoleTask | 522 | return RoleTask |
| 448 | \ No newline at end of file | 523 | \ No newline at end of file |
src/models/Rune.lua
| @@ -63,14 +63,16 @@ end | @@ -63,14 +63,16 @@ end | ||
| 63 | 63 | ||
| 64 | -- types 类型=权重"2=100 3=100 4=100" value最大值=最小值 "50=100 50=100 100=200" | 64 | -- types 类型=权重"2=100 3=100 4=100" value最大值=最小值 "50=100 50=100 100=200" |
| 65 | local function getRandomValue(types,values) | 65 | local function getRandomValue(types,values) |
| 66 | - local typeMap = types:toNumMap() | 66 | + local typeMap = types:toArray() |
| 67 | local valueArry = values:toArray() | 67 | local valueArry = values:toArray() |
| 68 | 68 | ||
| 69 | - if table.nums(typeMap) ~= #valueArry then return nil end | 69 | + if #typeMap ~= #valueArry then return nil end |
| 70 | + | ||
| 70 | local typ, value | 71 | local typ, value |
| 71 | local typTab = {} | 72 | local typTab = {} |
| 72 | - for t,w in pairs(typeMap) do | ||
| 73 | - table.insert(typTab,{t=t,w=w}) | 73 | + for _,w in ipairs(typeMap) do |
| 74 | + w = w:toArray(true, "=") | ||
| 75 | + table.insert(typTab,{t=w[1],w=w[2]}) | ||
| 74 | end | 76 | end |
| 75 | 77 | ||
| 76 | local tk = math.randWeight(typTab, "w") | 78 | local tk = math.randWeight(typTab, "w") |
| @@ -89,7 +91,7 @@ function Rune:generateAttrs() | @@ -89,7 +91,7 @@ function Rune:generateAttrs() | ||
| 89 | local attrs = "" | 91 | local attrs = "" |
| 90 | local typ, value = getRandomValue(runeData.attr1,runeData.range1) | 92 | local typ, value = getRandomValue(runeData.attr1,runeData.range1) |
| 91 | attrs = attrs:setv(typ, value) | 93 | attrs = attrs:setv(typ, value) |
| 92 | - local typ, value = getRandomValue(runeData.attr1,runeData.range1) | 94 | + local typ, value = getRandomValue(runeData.attr2,runeData.range2) |
| 93 | attrs = attrs:setv(typ, value) | 95 | attrs = attrs:setv(typ, value) |
| 94 | self:setProperty("attrs",attrs) | 96 | self:setProperty("attrs",attrs) |
| 95 | end | 97 | end |
src/services/agent_ctrl.lua
src/services/chated.lua
| @@ -35,12 +35,13 @@ if mode == "sub" then | @@ -35,12 +35,13 @@ if mode == "sub" then | ||
| 35 | skynet.ret(skynet.pack(f(...))) | 35 | skynet.ret(skynet.pack(f(...))) |
| 36 | end) | 36 | end) |
| 37 | 37 | ||
| 38 | - skynet.register(string.format(".CHATED%d", id)) | 38 | + skynet.register(string.format(".chated%d", id)) |
| 39 | end) | 39 | end) |
| 40 | else | 40 | else |
| 41 | skynet.start(function() | 41 | skynet.start(function() |
| 42 | - local ok, forbidNames = pcall(require, "csvdata.forbid_chat") | ||
| 43 | - if not ok then forbidNames = {} end | 42 | + local csvdb = require "shared.csvdata" |
| 43 | + local forbidNames = csvdb["forbid_chatCsv"] | ||
| 44 | + if not forbidNames then forbidNames = {} end | ||
| 44 | 45 | ||
| 45 | local words = {} | 46 | local words = {} |
| 46 | for _, data in ipairs(forbidNames) do | 47 | for _, data in ipairs(forbidNames) do |
| @@ -52,5 +53,6 @@ else | @@ -52,5 +53,6 @@ else | ||
| 52 | for i = 1, 5 do | 53 | for i = 1, 5 do |
| 53 | skynet.newservice(SERVICE_NAME, "sub", i, d) | 54 | skynet.newservice(SERVICE_NAME, "sub", i, d) |
| 54 | end | 55 | end |
| 56 | + skynet.exit() | ||
| 55 | end) | 57 | end) |
| 56 | end | 58 | end |
src/services/csvdatad.lua deleted
| @@ -1,115 +0,0 @@ | @@ -1,115 +0,0 @@ | ||
| 1 | -local sharedata = require "skynet.sharedata" | ||
| 2 | -local skynet = require "skynet" | ||
| 3 | -local lfs = require "lfs" | ||
| 4 | -local redisproxy = require "shared.redisproxy" | ||
| 5 | -require "shared.init" | ||
| 6 | -require "utils.init" | ||
| 7 | -require "csvdata.init" | ||
| 8 | -require "skynet.manager" | ||
| 9 | -require "RedisKeys" | ||
| 10 | - | ||
| 11 | --- local csvdb = {} | ||
| 12 | - | ||
| 13 | -local function formatFileName(filename) | ||
| 14 | - filename = string.trim(filename) | ||
| 15 | - local basename = filename:match("([^/]+)%.lua$") | ||
| 16 | - if not basename then return end | ||
| 17 | - local loadname = filename:match("^src/([^.]+)%.lua$") | ||
| 18 | - loadname = loadname:gsub('/', '.') | ||
| 19 | - return basename, loadname | ||
| 20 | -end | ||
| 21 | - | ||
| 22 | -local function travCsv(rootPath, pathes) | ||
| 23 | - pathes = pathes or {} | ||
| 24 | - local modified = false | ||
| 25 | - local ok, files, iter = pcall(lfs.dir, rootPath) | ||
| 26 | - if not ok then return modified end | ||
| 27 | - for entry in files, iter do | ||
| 28 | - -- 过滤 . 开始的字符串包括 . .. .git .开头的文件名 | ||
| 29 | - if string.byte(entry, 1) ~= 46 then | ||
| 30 | - local pathfile = rootPath .. '/' .. entry | ||
| 31 | - local attrs = lfs.attributes(pathfile) | ||
| 32 | - if attrs.mode == 'directory' then | ||
| 33 | - modified = travCsv(pathfile, pathes) or modified | ||
| 34 | - else | ||
| 35 | - local basename, loadname = formatFileName(pathfile) | ||
| 36 | - if basename then | ||
| 37 | - if tonum(pathes[loadname]) < attrs.modification then | ||
| 38 | - modified = true | ||
| 39 | - pathes[loadname] = attrs.modification | ||
| 40 | - end | ||
| 41 | - if basename == "init" or basename == "init_adv" then | ||
| 42 | - require(loadname) | ||
| 43 | - end | ||
| 44 | - end | ||
| 45 | - end | ||
| 46 | - end | ||
| 47 | - end | ||
| 48 | - return modified | ||
| 49 | -end | ||
| 50 | - | ||
| 51 | --- 每分钟检查是否有更改 | ||
| 52 | -local file2timeMap = {} | ||
| 53 | -local function handle_timeout() | ||
| 54 | - if travCsv("src/csvdata", file2timeMap) then | ||
| 55 | - sharedata.update("csvdata", csvdb) | ||
| 56 | - end | ||
| 57 | - skynet.timeout(100*5, handle_timeout) | ||
| 58 | -end | ||
| 59 | - | ||
| 60 | --- 重新加载csvdb | ||
| 61 | - | ||
| 62 | - | ||
| 63 | -local CMD = {} | ||
| 64 | - | ||
| 65 | -function CMD.reload(code) | ||
| 66 | - csvdb = csvdb or {} | ||
| 67 | - | ||
| 68 | - local ok, func = pcall(load, code) | ||
| 69 | - if ok then | ||
| 70 | - ok = pcall(func) | ||
| 71 | - end | ||
| 72 | - if not ok then | ||
| 73 | - skynet.error("reload_csvdata error by code " .. code) | ||
| 74 | - return 'error' | ||
| 75 | - end | ||
| 76 | - | ||
| 77 | - sharedata.update("csvdata", csvdb) | ||
| 78 | - return 'ok' | ||
| 79 | -end | ||
| 80 | - | ||
| 81 | ---更新已经存在的 | ||
| 82 | -function CMD.hotfix(fieldss) | ||
| 83 | - csvdb = csvdb or {} | ||
| 84 | - for _, fields in ipairs(fieldss) do | ||
| 85 | - if #fields >= 3 and (type(fields[#fields]) == 'number' or type(fields[#fields]) == 'string') then | ||
| 86 | - local temp = csvdb | ||
| 87 | - local ok = false | ||
| 88 | - for i = 1, #fields - 1 do | ||
| 89 | - if type(temp) ~= 'table' then break end | ||
| 90 | - if type(fields[i]) ~= 'number' and type(fields[i]) ~= 'string' then break end | ||
| 91 | - if i == #fields - 1 then | ||
| 92 | - if type(temp[fields[i]]) ~= 'number' and type(temp[fields[i]]) ~= 'string' then break end | ||
| 93 | - temp[fields[i]] = fields[#fields] | ||
| 94 | - else | ||
| 95 | - temp = temp[fields[i]] | ||
| 96 | - end | ||
| 97 | - end | ||
| 98 | - end | ||
| 99 | - end | ||
| 100 | - sharedata.update("csvdata", csvdb) | ||
| 101 | - return 'ok' | ||
| 102 | -end | ||
| 103 | - | ||
| 104 | -skynet.start(function () | ||
| 105 | - travCsv("src/csvdata", file2timeMap) | ||
| 106 | - sharedata.new("csvdata", csvdb) | ||
| 107 | - -- handle_timeout() | ||
| 108 | - | ||
| 109 | - skynet.dispatch("lua", function(_, _, command, ...) | ||
| 110 | - local f = CMD[command] | ||
| 111 | - skynet.ret(skynet.pack(f(...))) | ||
| 112 | - end) | ||
| 113 | - | ||
| 114 | - skynet.register(".CSVDATA") | ||
| 115 | -end) |
src/services/dbseed.lua
| 1 | -require "csvdata.init" | ||
| 2 | require "shared.init" | 1 | require "shared.init" |
| 3 | require "utils.init" | 2 | require "utils.init" |
| 4 | require "GlobalVar" | 3 | require "GlobalVar" |
| @@ -9,7 +8,6 @@ require "skynet.manager" | @@ -9,7 +8,6 @@ require "skynet.manager" | ||
| 9 | skynet = require "skynet" | 8 | skynet = require "skynet" |
| 10 | 9 | ||
| 11 | redisproxy = require("shared.redisproxy") | 10 | redisproxy = require("shared.redisproxy") |
| 12 | -globalCsv = require "csvdata/GlobalDefine" | ||
| 13 | 11 | ||
| 14 | SendPacket = function ( ... ) end | 12 | SendPacket = function ( ... ) end |
| 15 | 13 | ||
| @@ -36,7 +34,7 @@ local steps = { | @@ -36,7 +34,7 @@ local steps = { | ||
| 36 | } | 34 | } |
| 37 | 35 | ||
| 38 | skynet.start(function () | 36 | skynet.start(function () |
| 39 | - redisd = skynet.localname(".REDIS") | 37 | + redisd = skynet.localname(".redis") |
| 40 | 38 | ||
| 41 | redisproxy = require("shared.redisproxy") | 39 | redisproxy = require("shared.redisproxy") |
| 42 | 40 | ||
| @@ -46,6 +44,8 @@ skynet.start(function () | @@ -46,6 +44,8 @@ skynet.start(function () | ||
| 46 | skynet.exit() | 44 | skynet.exit() |
| 47 | return | 45 | return |
| 48 | end | 46 | end |
| 47 | + csvdb = require "shared.csvdata" | ||
| 48 | + globalCsv = csvdb["GlobalDefineCsv"] | ||
| 49 | 49 | ||
| 50 | for _, action in ipairs(steps) do | 50 | for _, action in ipairs(steps) do |
| 51 | print(action.desc .. "start ...") | 51 | print(action.desc .. "start ...") |
src/services/globald.lua
| @@ -129,8 +129,8 @@ local function __init__() | @@ -129,8 +129,8 @@ local function __init__() | ||
| 129 | end | 129 | end |
| 130 | end | 130 | end |
| 131 | end) | 131 | end) |
| 132 | - redisd = skynet.localname(".REDIS") | ||
| 133 | - skynet.register(".GLOBALD") | 132 | + redisd = skynet.localname(".redis") |
| 133 | + skynet.register(".globald") | ||
| 134 | 134 | ||
| 135 | end | 135 | end |
| 136 | 136 |
src/services/httpweb.lua
| @@ -8,9 +8,8 @@ skynet = require "skynet" | @@ -8,9 +8,8 @@ skynet = require "skynet" | ||
| 8 | redisproxy = require "shared.redisproxy" | 8 | redisproxy = require "shared.redisproxy" |
| 9 | netpack = require "skynet.netpack" | 9 | netpack = require "skynet.netpack" |
| 10 | datacenter = require "skynet.datacenter" | 10 | datacenter = require "skynet.datacenter" |
| 11 | -sharedata = require "skynet.sharedata" | ||
| 12 | mcast_util = require "services/mcast_util" | 11 | mcast_util = require "services/mcast_util" |
| 13 | -globalCsv = require "csvdata/GlobalDefine" | 12 | +csvdb = require "shared.csvdata" |
| 14 | 13 | ||
| 15 | local socket = require "skynet.socket" | 14 | local socket = require "skynet.socket" |
| 16 | 15 | ||
| @@ -33,7 +32,7 @@ local string = string | @@ -33,7 +32,7 @@ local string = string | ||
| 33 | 32 | ||
| 34 | skynet.register_protocol { | 33 | skynet.register_protocol { |
| 35 | name = "role", | 34 | name = "role", |
| 36 | - id = 13, | 35 | + id = 101, |
| 37 | pack = skynet.pack, | 36 | pack = skynet.pack, |
| 38 | unpack = skynet.unpack, | 37 | unpack = skynet.unpack, |
| 39 | } | 38 | } |
| @@ -54,8 +53,12 @@ end | @@ -54,8 +53,12 @@ end | ||
| 54 | local CMD = require "actions.HttpAction" | 53 | local CMD = require "actions.HttpAction" |
| 55 | 54 | ||
| 56 | local function start() | 55 | local function start() |
| 57 | - redisd = skynet.localname(".REDIS") | ||
| 58 | - csvdb = sharedata.query("csvdata") | 56 | + redisd = skynet.localname(".redis") |
| 57 | + globalCsv = csvdb["GlobalDefineCsv"] | ||
| 58 | + | ||
| 59 | + if tonumber(skynet.getenv "logd") == 1 then | ||
| 60 | + logd = skynet.localname(".log") | ||
| 61 | + end | ||
| 59 | 62 | ||
| 60 | local listen_socket = socket.listen("0.0.0.0", port) | 63 | local listen_socket = socket.listen("0.0.0.0", port) |
| 61 | print("Listen web port " .. port) | 64 | print("Listen web port " .. port) |
| @@ -83,7 +86,7 @@ local function start() | @@ -83,7 +86,7 @@ local function start() | ||
| 83 | if not content then | 86 | if not content then |
| 84 | code = 404 | 87 | code = 404 |
| 85 | end | 88 | end |
| 86 | - response(id, code, content) | 89 | + response(id, code, tostring(content)) |
| 87 | end | 90 | end |
| 88 | else | 91 | else |
| 89 | if url == sockethelper.socket_error then | 92 | if url == sockethelper.socket_error then |
src/services/logd.lua
src/services/named.lua
| @@ -35,12 +35,13 @@ if mode == "sub" then | @@ -35,12 +35,13 @@ if mode == "sub" then | ||
| 35 | skynet.ret(skynet.pack(f(...))) | 35 | skynet.ret(skynet.pack(f(...))) |
| 36 | end) | 36 | end) |
| 37 | 37 | ||
| 38 | - skynet.register(string.format(".NAMED%d", id)) | 38 | + skynet.register(string.format(".named%d", id)) |
| 39 | end) | 39 | end) |
| 40 | else | 40 | else |
| 41 | skynet.start(function() | 41 | skynet.start(function() |
| 42 | - local ok, forbidNames = pcall(require, "csvdata.forbid_name") | ||
| 43 | - if not ok then forbidNames = {} end | 42 | + local csvdb = require "shared.csvdata" |
| 43 | + local forbidNames = csvdb["forbid_nameCsv"] | ||
| 44 | + if not forbidNames then forbidNames = {} end | ||
| 44 | 45 | ||
| 45 | local words = {} | 46 | local words = {} |
| 46 | for _, data in ipairs(forbidNames) do | 47 | for _, data in ipairs(forbidNames) do |
| @@ -52,5 +53,6 @@ else | @@ -52,5 +53,6 @@ else | ||
| 52 | for i = 1, 5 do | 53 | for i = 1, 5 do |
| 53 | skynet.newservice(SERVICE_NAME, "sub", i, d) | 54 | skynet.newservice(SERVICE_NAME, "sub", i, d) |
| 54 | end | 55 | end |
| 56 | + skynet.exit() | ||
| 55 | end) | 57 | end) |
| 56 | end | 58 | end |
src/services/pvpd.lua
| @@ -3,13 +3,12 @@ local json = require("shared.json") | @@ -3,13 +3,12 @@ local json = require("shared.json") | ||
| 3 | redisproxy = require("shared.redisproxy") | 3 | redisproxy = require("shared.redisproxy") |
| 4 | local cluster = require "skynet.cluster" | 4 | local cluster = require "skynet.cluster" |
| 5 | local serverId = tonumber(skynet.getenv("servId")) | 5 | local serverId = tonumber(skynet.getenv("servId")) |
| 6 | -local sharedata = require "skynet.sharedata" | ||
| 7 | datacenter = require "skynet.datacenter" | 6 | datacenter = require "skynet.datacenter" |
| 7 | +csvdb = require "shared.csvdata" | ||
| 8 | require "shared.init" | 8 | require "shared.init" |
| 9 | require "utils.init" | 9 | require "utils.init" |
| 10 | require "RedisKeys" | 10 | require "RedisKeys" |
| 11 | require "skynet.manager" | 11 | require "skynet.manager" |
| 12 | -globalCsv = require "csvdata/GlobalDefine" | ||
| 13 | require "GlobalVar" | 12 | require "GlobalVar" |
| 14 | 13 | ||
| 15 | 14 | ||
| @@ -30,7 +29,7 @@ end | @@ -30,7 +29,7 @@ end | ||
| 30 | 29 | ||
| 31 | skynet.register_protocol { | 30 | skynet.register_protocol { |
| 32 | name = "role", | 31 | name = "role", |
| 33 | - id = 13, | 32 | + id = 101, |
| 34 | pack = skynet.pack, | 33 | pack = skynet.pack, |
| 35 | unpack = skynet.unpack, | 34 | unpack = skynet.unpack, |
| 36 | dispatch = function(session, address, submethod, ...) | 35 | dispatch = function(session, address, submethod, ...) |
| @@ -294,7 +293,9 @@ end | @@ -294,7 +293,9 @@ end | ||
| 294 | 293 | ||
| 295 | ------------------------------------------------------ | 294 | ------------------------------------------------------ |
| 296 | function CMD.start() | 295 | function CMD.start() |
| 297 | - redisd = skynet.localname(".REDIS") | 296 | + redisd = skynet.localname(".redis") |
| 297 | + globalCsv = csvdb["GlobalDefineCsv"] | ||
| 298 | + | ||
| 298 | pvpInfo = require("models.Pvpd").new({key = "cross:pvpInfo"}) | 299 | pvpInfo = require("models.Pvpd").new({key = "cross:pvpInfo"}) |
| 299 | pvpInfo:load() | 300 | pvpInfo:load() |
| 300 | end | 301 | end |
| @@ -308,9 +309,8 @@ local function __init__() | @@ -308,9 +309,8 @@ local function __init__() | ||
| 308 | skynet.ret(skynet.pack(f(...))) | 309 | skynet.ret(skynet.pack(f(...))) |
| 309 | end | 310 | end |
| 310 | end) | 311 | end) |
| 311 | - csvdb = sharedata.query("csvdata") | ||
| 312 | 312 | ||
| 313 | - skynet.register(".PVPCROSS") | 313 | + skynet.register(".pvpcross") |
| 314 | end | 314 | end |
| 315 | 315 | ||
| 316 | skynet.start(__init__) | 316 | skynet.start(__init__) |
src/services/redisd.lua
| @@ -24,5 +24,5 @@ skynet.start(function() | @@ -24,5 +24,5 @@ skynet.start(function() | ||
| 24 | skynet.ret(skynet.pack(db[string.lower(cmd)](db, ...))) | 24 | skynet.ret(skynet.pack(db[string.lower(cmd)](db, ...))) |
| 25 | end | 25 | end |
| 26 | end) | 26 | end) |
| 27 | - skynet.register ".REDIS" | 27 | + skynet.register ".redis" |
| 28 | end) | 28 | end) |
| 29 | \ No newline at end of file | 29 | \ No newline at end of file |
src/services/uniond.lua deleted
| @@ -1,143 +0,0 @@ | @@ -1,143 +0,0 @@ | ||
| 1 | -require "shared.init" | ||
| 2 | -require "utils.init" | ||
| 3 | -require "ProtocolCode" | ||
| 4 | -require "GlobalVar" | ||
| 5 | -require "RedisKeys" | ||
| 6 | -require "skynet.manager" | ||
| 7 | - | ||
| 8 | -local sharedata = require "sharedata" | ||
| 9 | -local redisproxy = require "shared.redisproxy" | ||
| 10 | -local datacenter = require "datacenter" | ||
| 11 | -local queue = require "skynet.queue" | ||
| 12 | - | ||
| 13 | -skynet = require "skynet" | ||
| 14 | -globalCsv = require "csvdata.GlobalDefine" | ||
| 15 | - | ||
| 16 | -local table_pack = table.pack | ||
| 17 | -local table_unpack = table.unpack | ||
| 18 | -local string_format = string.format | ||
| 19 | -local pairs = pairs | ||
| 20 | -local ipairs = ipairs | ||
| 21 | -local tonumber = tonumber | ||
| 22 | - | ||
| 23 | --- 维护在线状态 | ||
| 24 | - | ||
| 25 | -local unionInfo, CMD, cs = {}, {} | ||
| 26 | - | ||
| 27 | -skynet.register_protocol { | ||
| 28 | - name = "role", | ||
| 29 | - id = 13, | ||
| 30 | - pack = skynet.pack, | ||
| 31 | - unpack = skynet.unpack, | ||
| 32 | -} | ||
| 33 | - | ||
| 34 | -local function handle_timeout() | ||
| 35 | - local now = skynet.timex() | ||
| 36 | - unionInfo:onTimer(now) | ||
| 37 | - skynet.timeout(100, handle_timeout) | ||
| 38 | -end | ||
| 39 | - | ||
| 40 | ---[[ | ||
| 41 | -getProperties({"field1", "field2", ...}) | ||
| 42 | -return: {field1 = value1, field2 = value2, ...} | ||
| 43 | -------- | ||
| 44 | -setProperties({field1 = value1, field2 = value2, ...}) | ||
| 45 | -]] | ||
| 46 | -function rpcRole(roleId, funcName, ...) | ||
| 47 | - if not unionInfo.members[roleId] then return end | ||
| 48 | - local serv = unionInfo.members[roleId].serv | ||
| 49 | - if serv then | ||
| 50 | - if funcName == "getProperties" then | ||
| 51 | - return skynet.call(serv, "role", funcName, table_unpack(...)) | ||
| 52 | - else | ||
| 53 | - return skynet.call(serv, "role", funcName, ...) | ||
| 54 | - end | ||
| 55 | - else | ||
| 56 | - local rediskey = string_format("role:%d", roleId) | ||
| 57 | - if funcName == "getProperty" then | ||
| 58 | - return redisproxy:hget(rediskey, ...) | ||
| 59 | - elseif funcName == "setProperty" then | ||
| 60 | - return redisproxy:hset(rediskey, ...) | ||
| 61 | - elseif funcName == "getProperties" then | ||
| 62 | - local sRole = require "models.Role" | ||
| 63 | - local fields = table_pack(...) | ||
| 64 | - local rets = redisproxy:hmget(rediskey, table_unpack(fields, 1, fields.n)) | ||
| 65 | - local result = {} | ||
| 66 | - for i=1, fields.n do | ||
| 67 | - local typ = sRole.schema[fields[i]][1] | ||
| 68 | - local def = sRole.schema[fields[i]][2] | ||
| 69 | - if typ == "number" then | ||
| 70 | - result[fields[i]] = tonumber(rets[i] or def) | ||
| 71 | - else | ||
| 72 | - result[fields[i]] = rets[i] | ||
| 73 | - end | ||
| 74 | - end | ||
| 75 | - return result | ||
| 76 | - elseif funcName == "setProperties" then | ||
| 77 | - local fields = ... | ||
| 78 | - local params = {} | ||
| 79 | - for field, value in pairs(fields) do | ||
| 80 | - params[#params+1] = field | ||
| 81 | - params[#params+1] = value | ||
| 82 | - end | ||
| 83 | - return redisproxy:hmset(rediskey, table_unpack(params)) | ||
| 84 | - end | ||
| 85 | - end | ||
| 86 | -end | ||
| 87 | - | ||
| 88 | --- 加载联盟数据 | ||
| 89 | -function CMD.load(unionId) | ||
| 90 | - unionInfo = require("models.Union").new({key = UNION_KEY:format(unionId)}) | ||
| 91 | - unionInfo:load() | ||
| 92 | - unionInfo:loadMembers() | ||
| 93 | -end | ||
| 94 | - | ||
| 95 | --- 创建一个联盟 | ||
| 96 | -function CMD.new(roleId) | ||
| 97 | - local unionId = redisproxy:hincrby("autoincrement_set", "union", 1) | ||
| 98 | - unionInfo = require("models.Union").new({ | ||
| 99 | - key = UNION_KEY:format(unionId), | ||
| 100 | - master = roleId | ||
| 101 | - }) | ||
| 102 | - unionInfo:create() | ||
| 103 | - unionInfo:addMember(roleId, true) | ||
| 104 | - redisproxy:sadd(UNION_SET, unionId) | ||
| 105 | - return unionId | ||
| 106 | -end | ||
| 107 | - | ||
| 108 | --- 登录/登出 需要向联盟服务报备 | ||
| 109 | -function CMD.sign(cmd, roleId, serv) | ||
| 110 | - if not unionInfo.members[roleId] then return end | ||
| 111 | - if cmd == "login" then | ||
| 112 | - unionInfo.members[roleId].serv = serv | ||
| 113 | - elseif cmd == "logout" then | ||
| 114 | - unionInfo.members[roleId].serv = nil | ||
| 115 | - end | ||
| 116 | -end | ||
| 117 | - | ||
| 118 | -local function __init__() | ||
| 119 | - skynet.dispatch("lua", function(_, _, command, ...) | ||
| 120 | - cs(function (...) | ||
| 121 | - if CMD[command] then | ||
| 122 | - skynet.ret(skynet.pack(CMD[command](...))) | ||
| 123 | - return | ||
| 124 | - else | ||
| 125 | - if unionInfo and unionInfo[submethod] then | ||
| 126 | - if command == 'dismiss' then | ||
| 127 | - unionInfo:dismiss(...) | ||
| 128 | - return | ||
| 129 | - end | ||
| 130 | - local result = unionInfo[submethod](unionInfo, ...) | ||
| 131 | - skynet.ret(skynet.pack(result)) | ||
| 132 | - return | ||
| 133 | - end | ||
| 134 | - end | ||
| 135 | - skynet.error("uniond commond error cmd=", command) | ||
| 136 | - end) | ||
| 137 | - end) | ||
| 138 | - skynet.register("UNIOND") | ||
| 139 | - csvdb = sharedata.query("csvdata") | ||
| 140 | - cs = queue() | ||
| 141 | -end | ||
| 142 | - | ||
| 143 | -skynet.start(__init__) | ||
| 144 | \ No newline at end of file | 0 | \ No newline at end of file |
src/services/watchdog.lua
| @@ -9,6 +9,7 @@ local agent_ctrl = require "services.agent_ctrl" | @@ -9,6 +9,7 @@ local agent_ctrl = require "services.agent_ctrl" | ||
| 9 | local xxtea = require "xxtea" | 9 | local xxtea = require "xxtea" |
| 10 | local mc = require "skynet.multicast" | 10 | local mc = require "skynet.multicast" |
| 11 | local cluster = require "skynet.cluster" | 11 | local cluster = require "skynet.cluster" |
| 12 | +local csvdata = require "shared.csvdata" | ||
| 12 | 13 | ||
| 13 | require "ProtocolCode" | 14 | require "ProtocolCode" |
| 14 | require "GlobalVar" | 15 | require "GlobalVar" |
| @@ -50,7 +51,7 @@ local use_logd = tonumber(skynet.getenv "logd") | @@ -50,7 +51,7 @@ local use_logd = tonumber(skynet.getenv "logd") | ||
| 50 | -- @desc: agent状态定时检测 | 51 | -- @desc: agent状态定时检测 |
| 51 | function check_agent_status() | 52 | function check_agent_status() |
| 52 | pcall(agent_ctrl.check_agent_status, agent_ctrl) | 53 | pcall(agent_ctrl.check_agent_status, agent_ctrl) |
| 53 | - skynet.timeout(1, check_agent_status) | 54 | + skynet.timeout(100, check_agent_status) |
| 54 | end | 55 | end |
| 55 | 56 | ||
| 56 | -- 创建world以及union channel 用于广播 | 57 | -- 创建world以及union channel 用于广播 |
| @@ -107,12 +108,12 @@ skynet.start(function() | @@ -107,12 +108,12 @@ skynet.start(function() | ||
| 107 | skynet.ret(skynet.pack(f(subcmd, ...))) | 108 | skynet.ret(skynet.pack(f(subcmd, ...))) |
| 108 | end | 109 | end |
| 109 | end) | 110 | end) |
| 110 | - skynet.register ".WATCHDOG" | 111 | + skynet.register ".watchdog" |
| 111 | -- 数据库服务 | 112 | -- 数据库服务 |
| 112 | redisd = skynet.newservice("services/redisd") | 113 | redisd = skynet.newservice("services/redisd") |
| 113 | 114 | ||
| 114 | - -- load all csv data | ||
| 115 | - skynet.newservice("services/csvdatad") | 115 | + -- 提前加载好 |
| 116 | + csvdata.init() | ||
| 116 | print("launch csvdatad ...") | 117 | print("launch csvdatad ...") |
| 117 | 118 | ||
| 118 | -- 日志服务 | 119 | -- 日志服务 |
| @@ -0,0 +1,183 @@ | @@ -0,0 +1,183 @@ | ||
| 1 | +-- 对sharetable 的一层封装 实现热更新 | ||
| 2 | + | ||
| 3 | +local skynet = require "skynet" | ||
| 4 | +local service = require "skynet.service" | ||
| 5 | +local sharetable = require "skynet.sharetable" | ||
| 6 | + | ||
| 7 | +local function sharetable_service() | ||
| 8 | + local skynet = require "skynet" | ||
| 9 | + local sharetable = require "skynet.sharetable" | ||
| 10 | + | ||
| 11 | + local files = {} -- filename | ||
| 12 | + local csvdata = {} | ||
| 13 | + | ||
| 14 | + local initfile = { | ||
| 15 | + ["src/csvdata/init.lua"] = {}, | ||
| 16 | + ["src/csvdata/init_adv.lua"] = {}, | ||
| 17 | + } | ||
| 18 | + | ||
| 19 | + function csvdata.query(source, filename) | ||
| 20 | + files[filename] = files[filename] or {} | ||
| 21 | + files[filename][source] = 1 | ||
| 22 | + end | ||
| 23 | + | ||
| 24 | + function csvdata.close(source) | ||
| 25 | + for filename, info in pairs(files) do | ||
| 26 | + info[source] = nil | ||
| 27 | + end | ||
| 28 | + end | ||
| 29 | + | ||
| 30 | + function csvdata.realName(file) | ||
| 31 | + if string.match(file, "Csv$") then | ||
| 32 | + if initfile["src/csvdata/init.lua"] and initfile["src/csvdata/init.lua"][file] then | ||
| 33 | + file = initfile["src/csvdata/init.lua"][file] | ||
| 34 | + elseif initfile["src/csvdata/init_adv.lua"] and initfile["src/csvdata/init_adv.lua"][file] then | ||
| 35 | + file = initfile["src/csvdata/init_adv.lua"][file] | ||
| 36 | + end | ||
| 37 | + file = "src/" .. file .. ".lua" | ||
| 38 | + end | ||
| 39 | + return file | ||
| 40 | + end | ||
| 41 | + | ||
| 42 | + function csvdata.hotfix(_, ...) | ||
| 43 | + local now = skynet.timex() | ||
| 44 | + | ||
| 45 | + local filenames = {...} | ||
| 46 | + | ||
| 47 | + local needHotfix = {} | ||
| 48 | + for _, filename in ipairs(filenames) do | ||
| 49 | + -- 更新下 | ||
| 50 | + skynet.error(string.format("hotfix_csvdata time: %s, file: %s", now, filename)) | ||
| 51 | + | ||
| 52 | + if initfile[filename] then | ||
| 53 | + sharetable.loadfile(filename) | ||
| 54 | + sharetable.update(filename) | ||
| 55 | + else | ||
| 56 | + sharetable.loadfile(csvdata.realName(filename)) | ||
| 57 | + end | ||
| 58 | + | ||
| 59 | + if files[filename] then | ||
| 60 | + for source, _ in pairs(files[filename]) do | ||
| 61 | + needHotfix[source] = needHotfix[source] or {} | ||
| 62 | + table.insert(needHotfix[source], filename) | ||
| 63 | + end | ||
| 64 | + end | ||
| 65 | + end | ||
| 66 | + | ||
| 67 | + for source, files in pairs(needHotfix) do | ||
| 68 | + skynet.send(source, "csvdata", "hotfix", table.unpack(files)) | ||
| 69 | + end | ||
| 70 | + end | ||
| 71 | + | ||
| 72 | + skynet.dispatch("lua", function(_,source,cmd,...) | ||
| 73 | + skynet.ignoreret() | ||
| 74 | + csvdata[cmd](source,...) | ||
| 75 | + end) | ||
| 76 | + | ||
| 77 | + skynet.register_protocol { | ||
| 78 | + name = "csvdata", | ||
| 79 | + id = 102, | ||
| 80 | + pack = skynet.pack, | ||
| 81 | + unpack = skynet.unpack, | ||
| 82 | + } | ||
| 83 | + | ||
| 84 | + -- 初始化csvdata | ||
| 85 | + skynet.start(function() | ||
| 86 | + for file, _ in pairs(initfile) do | ||
| 87 | + sharetable.loadfile(file) | ||
| 88 | + local init = sharetable.query(file) | ||
| 89 | + if not init then | ||
| 90 | + error("csvdata load init file error " .. file) | ||
| 91 | + return | ||
| 92 | + end | ||
| 93 | + initfile[file] = init | ||
| 94 | + for _, one in pairs(init) do | ||
| 95 | + sharetable.loadfile("src/" .. one .. ".lua") | ||
| 96 | + end | ||
| 97 | + end | ||
| 98 | + end) | ||
| 99 | +end | ||
| 100 | + | ||
| 101 | + | ||
| 102 | +local cache = {} | ||
| 103 | +local csvdata | ||
| 104 | + | ||
| 105 | +local function load_csvdata(t, key) | ||
| 106 | + if key == "address" then | ||
| 107 | + t.address = service.new("csvdata", sharetable_service) | ||
| 108 | + return t.address | ||
| 109 | + else | ||
| 110 | + if cache[key] then return cache[key] end | ||
| 111 | + | ||
| 112 | + local realName = csvdata.realName(key) | ||
| 113 | + | ||
| 114 | + local tab = sharetable.query(realName) | ||
| 115 | + if not tab then | ||
| 116 | + error("dont have csvdata : " .. realName) | ||
| 117 | + return | ||
| 118 | + end | ||
| 119 | + cache[key] = tab | ||
| 120 | + -- 增加引用 | ||
| 121 | + skynet.send(csvdata.address, "lua", "query", key) | ||
| 122 | + return tab | ||
| 123 | + end | ||
| 124 | +end | ||
| 125 | + | ||
| 126 | +local function close_hotfix(t) | ||
| 127 | + local addr = rawget(t, "address") | ||
| 128 | + if addr then | ||
| 129 | + skynet.send(addr, "lua", "close") | ||
| 130 | + end | ||
| 131 | +end | ||
| 132 | + | ||
| 133 | +csvdata = setmetatable ( {} , { | ||
| 134 | + __index = load_csvdata, | ||
| 135 | + __gc = close_hotfix, | ||
| 136 | +}) | ||
| 137 | + | ||
| 138 | +function csvdata.init() | ||
| 139 | + return csvdata.address | ||
| 140 | +end | ||
| 141 | + | ||
| 142 | +function csvdata.hotfix(...) | ||
| 143 | + skynet.send(csvdata.address, "lua", "hotfix", ...) | ||
| 144 | +end | ||
| 145 | + | ||
| 146 | +function csvdata.realName(file) | ||
| 147 | + if string.match(file, "Csv$") then | ||
| 148 | + if csvdata["src/csvdata/init.lua"] and csvdata["src/csvdata/init.lua"][file] then | ||
| 149 | + file = csvdata["src/csvdata/init.lua"][file] | ||
| 150 | + elseif csvdata["src/csvdata/init_adv.lua"] and csvdata["src/csvdata/init_adv.lua"][file] then | ||
| 151 | + file = csvdata["src/csvdata/init_adv.lua"][file] | ||
| 152 | + end | ||
| 153 | + file = "src/" .. file .. ".lua" | ||
| 154 | + end | ||
| 155 | + return file | ||
| 156 | +end | ||
| 157 | + | ||
| 158 | +local function update(file) | ||
| 159 | + -- 更新一下 | ||
| 160 | + if cache[file] then | ||
| 161 | + sharetable.update(csvdata.realName(file)) | ||
| 162 | + end | ||
| 163 | +end | ||
| 164 | + | ||
| 165 | +skynet.register_protocol { | ||
| 166 | + name = "csvdata", | ||
| 167 | + id = 102, | ||
| 168 | + pack = skynet.pack, | ||
| 169 | + unpack = skynet.unpack, | ||
| 170 | + dispatch = function(_, _, cmd, ...) | ||
| 171 | + skynet.ignoreret() | ||
| 172 | + if cmd == "hotfix" then | ||
| 173 | + -- skynet.error("csvdara hotfix update", ...) | ||
| 174 | + local files = {...} | ||
| 175 | + for _, file in ipairs(files) do | ||
| 176 | + update(file) | ||
| 177 | + end | ||
| 178 | + return | ||
| 179 | + end | ||
| 180 | + end, | ||
| 181 | +} | ||
| 182 | + | ||
| 183 | +return csvdata |
src/shared/redisproxy.lua
| @@ -5,6 +5,10 @@ local table_insert = table.insert | @@ -5,6 +5,10 @@ local table_insert = table.insert | ||
| 5 | 5 | ||
| 6 | local redisproxy = {} | 6 | local redisproxy = {} |
| 7 | 7 | ||
| 8 | + | ||
| 9 | +local isUsePika = false | ||
| 10 | + | ||
| 11 | + | ||
| 8 | setmetatable(redisproxy, { __index = function(t, k) | 12 | setmetatable(redisproxy, { __index = function(t, k) |
| 9 | local cmd = string.upper(k) | 13 | local cmd = string.upper(k) |
| 10 | local f = function (self, ...) | 14 | local f = function (self, ...) |
| @@ -38,14 +42,61 @@ function redisproxy:runScripts(name, ...) | @@ -38,14 +42,61 @@ function redisproxy:runScripts(name, ...) | ||
| 38 | end | 42 | end |
| 39 | 43 | ||
| 40 | local meta = {__index = function (tab, name) return function (_, ...) tab[#tab+1]={name, ...} end end} | 44 | local meta = {__index = function (tab, name) return function (_, ...) tab[#tab+1]={name, ...} end end} |
| 41 | -function redisproxy:pipelining(block) | ||
| 42 | - local ops = setmetatable({{"multi"}}, meta) | 45 | +function redisproxy:pipelining(block, transaction) |
| 46 | + if transaction == nil then transaction = true end -- 默认具有事务性 | ||
| 47 | + if isUsePika then transaction = false end | ||
| 48 | + | ||
| 49 | + local ops = setmetatable({}, meta) | ||
| 50 | + if transaction then | ||
| 51 | + ops[#ops+1]={"multi"} | ||
| 52 | + end | ||
| 43 | block(ops) | 53 | block(ops) |
| 44 | - if #ops == 1 then return end | ||
| 45 | - ops[#ops+1]={"exec"} | ||
| 46 | - return self:pipeline(ops) | 54 | + if transaction then |
| 55 | + if #ops == 1 then return end | ||
| 56 | + ops[#ops+1]={"exec"} | ||
| 57 | + else | ||
| 58 | + if #ops == 0 then return end | ||
| 59 | + end | ||
| 60 | + return self:pipeline(ops, transaction) | ||
| 61 | +end | ||
| 62 | + | ||
| 63 | +if isUsePika then | ||
| 64 | + | ||
| 65 | +function redisproxy:insertEmail(params) | ||
| 66 | + local roleId = params.roleId | ||
| 67 | + local emailId = params.emailId | ||
| 68 | + local createtime = params.createtime or skynet.timex() | ||
| 69 | + local contentPms = params.contentPms or {} | ||
| 70 | + local rewardPms = params.rewardPms or {} | ||
| 71 | + local title = params.title or "" | ||
| 72 | + local stitle = params.stitle or "" | ||
| 73 | + local content = params.content or "" | ||
| 74 | + local attachments = params.attachments or "" | ||
| 75 | + | ||
| 76 | + local id = self:HINCRBY(string.format("role:%d:autoincr", roleId), "email", 1) | ||
| 77 | + self:LPUSH(string.format("role:%d:emailIds", roleId), id) | ||
| 78 | + local deleteIds = self:LRANGE(string.format("role:%d:emailIds", roleId), EMAIL_LIMIT, -1) | ||
| 79 | + self:pipelining(function(red) | ||
| 80 | + for _, deleteId in ipairs(deleteIds) do | ||
| 81 | + red:DEL(string.format("email:%d:%d", roleId, deleteId)) | ||
| 82 | + end | ||
| 83 | + red:LTRIM(string.format("role:%d:emailIds", roleId), 0, EMAIL_LIMIT - 1) | ||
| 84 | + red:HMSET(string.format("email:%d:%d", roleId, id), | ||
| 85 | + "id", tostring(id), | ||
| 86 | + "emailId", emailId, | ||
| 87 | + "status", "0", | ||
| 88 | + "createtime", createtime, | ||
| 89 | + "contentPms", MsgPack.pack(contentPms), | ||
| 90 | + "rewardPms", MsgPack.pack(rewardPms), | ||
| 91 | + "title", title, | ||
| 92 | + "stitle", stitle, | ||
| 93 | + "content", content, | ||
| 94 | + "attachments", attachments) | ||
| 95 | + end) | ||
| 47 | end | 96 | end |
| 48 | 97 | ||
| 98 | +else | ||
| 99 | + | ||
| 49 | function redisproxy:insertEmail(params) | 100 | function redisproxy:insertEmail(params) |
| 50 | local pms = { | 101 | local pms = { |
| 51 | roleId = params.roleId, | 102 | roleId = params.roleId, |
| @@ -64,4 +115,7 @@ function redisproxy:insertEmail(params) | @@ -64,4 +115,7 @@ function redisproxy:insertEmail(params) | ||
| 64 | return true | 115 | return true |
| 65 | end | 116 | end |
| 66 | 117 | ||
| 118 | + | ||
| 119 | +end | ||
| 120 | + | ||
| 67 | return redisproxy | 121 | return redisproxy |
| 68 | \ No newline at end of file | 122 | \ No newline at end of file |