Commit 00e663bd7beb6b8e7ff702c95b7a35178cd36f15
1 parent
0a0267a8
剧情相关
Showing
7 changed files
with
176 additions
and
10 deletions
Show diff stats
src/ProtocolCode.lua
| @@ -25,6 +25,7 @@ actionCodes = { | @@ -25,6 +25,7 @@ actionCodes = { | ||
| 25 | Role_openItemRpc = 111, | 25 | Role_openItemRpc = 111, |
| 26 | Role_updateEquip = 112, | 26 | Role_updateEquip = 112, |
| 27 | Role_updateRune = 113, | 27 | Role_updateRune = 113, |
| 28 | + Role_storyBookRewardRpc = 114, | ||
| 28 | 29 | ||
| 29 | Adv_startAdvRpc = 151, | 30 | Adv_startAdvRpc = 151, |
| 30 | Adv_roleFormatRpc = 152, | 31 | Adv_roleFormatRpc = 152, |
src/actions/HangAction.lua
| @@ -180,6 +180,8 @@ function _M.endBattleRpc(agent, data) | @@ -180,6 +180,8 @@ function _M.endBattleRpc(agent, data) | ||
| 180 | reward[itemId] = count | 180 | reward[itemId] = count |
| 181 | end | 181 | end |
| 182 | reward = role:award(reward) | 182 | reward = role:award(reward) |
| 183 | + | ||
| 184 | + role:checkTaskEnter(role.TaskType.HangPass, {id = carbonId}) | ||
| 183 | end | 185 | end |
| 184 | hangInfo.key = nil | 186 | hangInfo.key = nil |
| 185 | role:updateProperty({field = "hangInfo", value = hangInfo}) | 187 | role:updateProperty({field = "hangInfo", value = hangInfo}) |
src/actions/HeroAction.lua
| @@ -69,7 +69,7 @@ function _M.wakeRpc(agent, data) | @@ -69,7 +69,7 @@ function _M.wakeRpc(agent, data) | ||
| 69 | local skills = {} | 69 | local skills = {} |
| 70 | for _,v in pairs(wakeData.skill:toArray(true,"=") ) do | 70 | for _,v in pairs(wakeData.skill:toArray(true,"=") ) do |
| 71 | local skillSet = hero:getSkillData(v) | 71 | local skillSet = hero:getSkillData(v) |
| 72 | - if next(skillSet) then | 72 | + if skillSet and next(skillSet) then |
| 73 | local skillLv = hero:getSkillLevel(v)+1 | 73 | local skillLv = hero:getSkillLevel(v)+1 |
| 74 | local skillData = skillSet[skillLv] | 74 | local skillData = skillSet[skillLv] |
| 75 | if skillData and next(skillData) then | 75 | if skillData and next(skillData) then |
| @@ -86,6 +86,8 @@ function _M.wakeRpc(agent, data) | @@ -86,6 +86,8 @@ function _M.wakeRpc(agent, data) | ||
| 86 | end | 86 | end |
| 87 | hero:updateProperty({field = "wakeL", delta = 1}) | 87 | hero:updateProperty({field = "wakeL", delta = 1}) |
| 88 | 88 | ||
| 89 | + role:checkTaskEnter(role.TaskType.Wake, {heroType = typ, wakeL = hero:getProperty("wakeL")}) | ||
| 90 | + | ||
| 89 | SendPacket(actionCodes.Hero_wakeRpc, '') | 91 | SendPacket(actionCodes.Hero_wakeRpc, '') |
| 90 | return true | 92 | return true |
| 91 | end | 93 | end |
| @@ -368,7 +370,8 @@ function _M.loveItemRpc(agent, data) | @@ -368,7 +370,8 @@ function _M.loveItemRpc(agent, data) | ||
| 368 | end | 370 | end |
| 369 | local curL = hero:getProperty("loveL") | 371 | local curL = hero:getProperty("loveL") |
| 370 | local curExp = hero:getProperty("loveExp") | 372 | local curExp = hero:getProperty("loveExp") |
| 371 | - local curPlus = csvdb["unit_love_plusCsv"][hero:getProperty("type")] | 373 | + local curType = hero:getProperty("type") |
| 374 | + local curPlus = csvdb["unit_love_plusCsv"][curType] | ||
| 372 | if not curPlus then | 375 | if not curPlus then |
| 373 | return | 376 | return |
| 374 | end | 377 | end |
| @@ -392,8 +395,16 @@ function _M.loveItemRpc(agent, data) | @@ -392,8 +395,16 @@ function _M.loveItemRpc(agent, data) | ||
| 392 | return true | 395 | return true |
| 393 | end | 396 | end |
| 394 | role:costItems({[cost[1]] = cost[2]}) | 397 | role:costItems({[cost[1]] = cost[2]}) |
| 395 | - hero:updateProperty({field = "loveL", value = curL + 1}) | 398 | + local newLevel = curL + 1 |
| 399 | + hero:updateProperty({field = "loveL", value = newLevel}) | ||
| 396 | hero:updateProperty({field = "loveExp", value = 0}) | 400 | hero:updateProperty({field = "loveExp", value = 0}) |
| 401 | + | ||
| 402 | + if role:getProperty("loveStatus"):getv(curType, 0) < newLevel then | ||
| 403 | + role:changeUpdates({{type = "loveStatus", field = curType, value = newLevel}}) -- 总的 | ||
| 404 | + end | ||
| 405 | + | ||
| 406 | + role:checkTaskEnter(role.TaskType.LoveBreak, {heroType = curType, loveL = newLevel}) | ||
| 407 | + | ||
| 397 | else | 408 | else |
| 398 | local delta = globalCsv.unit_love_presentValue[msg.itemId] | 409 | local delta = globalCsv.unit_love_presentValue[msg.itemId] |
| 399 | if not delta then | 410 | if not delta then |
| @@ -438,13 +449,16 @@ function _M.loveTaskRpc(agent, data) | @@ -438,13 +449,16 @@ function _M.loveTaskRpc(agent, data) | ||
| 438 | else | 449 | else |
| 439 | newExp = 0 | 450 | newExp = 0 |
| 440 | end | 451 | end |
| 452 | + local newLevel = curL + 1 | ||
| 441 | hero:updateProperty({field = "loveExp", value = newExp}) | 453 | hero:updateProperty({field = "loveExp", value = newExp}) |
| 442 | - hero:updateProperty({field = "loveL", value = curL + 1}) | 454 | + hero:updateProperty({field = "loveL", value = newLevel}) |
| 443 | 455 | ||
| 444 | - if role:getProperty("loveStatus"):getv(curType, 0) < curL + 1 then | ||
| 445 | - role:changeUpdates({{type = "loveStatus", field = curType, value = curL + 1}}) -- 总的 | 456 | + if role:getProperty("loveStatus"):getv(curType, 0) < newLevel then |
| 457 | + role:changeUpdates({{type = "loveStatus", field = curType, value = newLevel}}) -- 总的 | ||
| 446 | end | 458 | end |
| 447 | 459 | ||
| 460 | + role:checkTaskEnter(role.TaskType.LoveBreak, {heroType = curType, loveL = newLevel}) | ||
| 461 | + | ||
| 448 | SendPacket(actionCodes.Hero_loveTaskRpc, "") | 462 | SendPacket(actionCodes.Hero_loveTaskRpc, "") |
| 449 | return true | 463 | return true |
| 450 | end | 464 | end |
src/actions/RoleAction.lua
| @@ -313,5 +313,23 @@ function _M.openItemRpc(agent, data) | @@ -313,5 +313,23 @@ function _M.openItemRpc(agent, data) | ||
| 313 | return true | 313 | return true |
| 314 | end | 314 | end |
| 315 | 315 | ||
| 316 | +function _M.storyBookRewardRpc(agent, data) | ||
| 317 | + local role = agent.role | ||
| 318 | + local msg = MsgPack.unpack(data) | ||
| 319 | + local storyId = msg.id | ||
| 320 | + local storyBookData = csvdb["story_bookCsv"][storyId] | ||
| 321 | + if not storyBookData then return end | ||
| 322 | + local storyStatus = self:getProperty("storyB") | ||
| 323 | + if not storyStatus[id] or not storyStatus[id].s or storyStatus[id].s ~= 1 then return end | ||
| 324 | + | ||
| 325 | + -- 获取奖励 | ||
| 326 | + storyStatus[id].s = -1 | ||
| 327 | + self:setProperty("storyB", storyBookStatus) -- 统一写入数据库 | ||
| 328 | + self:changeUpdates({{ type = "storyB", field = id, value = storyStatus[id] }}) | ||
| 329 | + local reward = role:award(storyBookData.gift) | ||
| 330 | + SendPacket(actionCodes.Role_storyBookRewardRpc, MsgPack.pack({reward = reward})) | ||
| 331 | + return true | ||
| 332 | +end | ||
| 333 | + | ||
| 316 | 334 | ||
| 317 | return _M | 335 | return _M |
| 318 | \ No newline at end of file | 336 | \ No newline at end of file |
src/adv/Adv.lua
| @@ -460,6 +460,8 @@ function Adv:over(success) | @@ -460,6 +460,8 @@ function Adv:over(success) | ||
| 460 | if success then | 460 | if success then |
| 461 | self.owner:updateProperty({field = "advPass", self.owner:getProperty("advPass"):setv(self.advInfo.chapter, score)}) | 461 | self.owner:updateProperty({field = "advPass", self.owner:getProperty("advPass"):setv(self.advInfo.chapter, score)}) |
| 462 | reward = self.owner:award(self.owner:getProperty("advItems"):toNumMap()) | 462 | reward = self.owner:award(self.owner:getProperty("advItems"):toNumMap()) |
| 463 | + | ||
| 464 | + self.owner:checkTaskEnter(self.owner.TaskType.AdvPass, {id = self.advInfo.chapter}) | ||
| 463 | end | 465 | end |
| 464 | table.clear(self.advInfo) --清空advInfo | 466 | table.clear(self.advInfo) --清空advInfo |
| 465 | self.advTeam.player = nil --重置玩家的数据 | 467 | self.advTeam.player = nil --重置玩家的数据 |
src/models/Role.lua
| @@ -55,6 +55,8 @@ Role.schema = { | @@ -55,6 +55,8 @@ Role.schema = { | ||
| 55 | hangBagLimit = {"number", globalCsv.idle_field_origin}, --背包上限 | 55 | hangBagLimit = {"number", globalCsv.idle_field_origin}, --背包上限 |
| 56 | 56 | ||
| 57 | potionBag = {"table", {}}, -- 营养剂背包 | 57 | potionBag = {"table", {}}, -- 营养剂背包 |
| 58 | + | ||
| 59 | + storyB = {"table", {}}, -- 剧情记录 | ||
| 58 | } | 60 | } |
| 59 | 61 | ||
| 60 | 62 | ||
| @@ -133,12 +135,18 @@ function Role:changeUpdates(params, notNotify) | @@ -133,12 +135,18 @@ function Role:changeUpdates(params, notNotify) | ||
| 133 | self:setProperty(fieldType) | 135 | self:setProperty(fieldType) |
| 134 | return {type = fieldType, field = info["field"], value = info["value"]} | 136 | return {type = fieldType, field = info["field"], value = info["value"]} |
| 135 | end, | 137 | end, |
| 138 | + ["onlyToC"] = function(info) | ||
| 139 | + return info | ||
| 140 | + end, | ||
| 136 | } | 141 | } |
| 137 | 142 | ||
| 138 | local updates = {} | 143 | local updates = {} |
| 139 | for _, one in ipairs(params) do | 144 | for _, one in ipairs(params) do |
| 140 | if changeUpdateFunc[one["type"]] then | 145 | if changeUpdateFunc[one["type"]] then |
| 141 | table.insert(updates, changeUpdateFunc[one["type"]](one)) | 146 | table.insert(updates, changeUpdateFunc[one["type"]](one)) |
| 147 | + elseif one.isOnlyToC then | ||
| 148 | + one.isOnlyToC = nil | ||
| 149 | + table.insert(updates, one) | ||
| 142 | else | 150 | else |
| 143 | table.insert(updates, changeUpdateFunc["tableCommon"](one["type"], one)) | 151 | table.insert(updates, changeUpdateFunc["tableCommon"](one["type"], one)) |
| 144 | end | 152 | end |
src/models/RoleTask.lua
| 1 | 1 | ||
| 2 | 2 | ||
| 3 | +-- 增加 checkTaskEnter 内的参数 记得增增加注释 | ||
| 3 | local TaskType = { | 4 | local TaskType = { |
| 4 | - | 5 | + HangPass = 1, -- id |
| 6 | + AdvPass = 2, -- id | ||
| 7 | + LoveBreak = 3, -- heroType loveL | ||
| 8 | + Wake = 4, -- heroType wakeL | ||
| 9 | +} | ||
| 10 | + | ||
| 11 | +local function v(value) | ||
| 12 | + return {type = "value", value = value} | ||
| 13 | +end | ||
| 14 | + | ||
| 15 | +local function f(field) | ||
| 16 | + return {type = "field", value = field} | ||
| 17 | +end | ||
| 18 | + | ||
| 19 | +local StoryListener = { | ||
| 20 | + func = "checkStoryStatus", | ||
| 21 | + listen = { | ||
| 22 | + [TaskType.HangPass] = {v(1), f("id")}, | ||
| 23 | + [TaskType.AdvPass] = {v(4), f("id")}, | ||
| 24 | + [TaskType.LoveBreak] = {v(2), f("heroType")}, | ||
| 25 | + [TaskType.Wake] = {v(3), f("heroType"), f("wakeL")}, | ||
| 26 | + } | ||
| 27 | +} | ||
| 28 | + | ||
| 29 | +local TaskListeners = { | ||
| 30 | + StoryListener, | ||
| 5 | } | 31 | } |
| 6 | 32 | ||
| 7 | local RoleTask = {} | 33 | local RoleTask = {} |
| @@ -10,11 +36,29 @@ function RoleTask.bind(Role) | @@ -10,11 +36,29 @@ function RoleTask.bind(Role) | ||
| 10 | 36 | ||
| 11 | Role.TaskType = TaskType | 37 | Role.TaskType = TaskType |
| 12 | 38 | ||
| 13 | - function Role:checkTaskEnter(taskType, ...) | ||
| 14 | - | 39 | + -- 任务相关入口 |
| 40 | + function Role:checkTaskEnter(taskType, params, notNotify) | ||
| 41 | + for _, listener in ipairs(TaskListeners) do | ||
| 42 | + if listener and listener.listen and listener.listen[taskType] and listener["func"] then | ||
| 43 | + local pms = {} | ||
| 44 | + for _, v in ipairs(listener.listen[taskType]) do | ||
| 45 | + if type(v) == "table" and v.type then | ||
| 46 | + if v.type == "value" then | ||
| 47 | + table.insert(pms, v.value) | ||
| 48 | + elseif v.type == "field" then | ||
| 49 | + table.insert(pms, params[v.value]) | ||
| 50 | + else | ||
| 51 | + table.insert(pms, v) | ||
| 52 | + end | ||
| 53 | + else | ||
| 54 | + table.insert(pms, v) | ||
| 55 | + end | ||
| 56 | + end | ||
| 57 | + self[listener["func"]](self, notNotify, table.unpack(pms)) | ||
| 58 | + end | ||
| 59 | + end | ||
| 15 | end | 60 | end |
| 16 | 61 | ||
| 17 | - | ||
| 18 | function Role:checkDailyTask() | 62 | function Role:checkDailyTask() |
| 19 | end | 63 | end |
| 20 | 64 | ||
| @@ -24,6 +68,83 @@ function RoleTask.bind(Role) | @@ -24,6 +68,83 @@ function RoleTask.bind(Role) | ||
| 24 | function Role:checkAchievTask() | 68 | function Role:checkAchievTask() |
| 25 | end | 69 | end |
| 26 | 70 | ||
| 71 | + --剧情相关----begin------------- | ||
| 72 | + local function checkStoryStatusByHang(role, data, status, cond1) -- cond1 carbonId | ||
| 73 | + if tonumber(data.unlockData) ~= cond1 then return end | ||
| 74 | + status.s = 1 | ||
| 75 | + return true | ||
| 76 | + end | ||
| 77 | + | ||
| 78 | + local function checkStoryStatusByLove(role, data, status, cond1) -- cond1 heroType | ||
| 79 | + if data.sort ~= cond1 then return end | ||
| 80 | + local curL = role:getProperty("loveStatus"):getv(cond1, 0) | ||
| 81 | + if curL < tonumber(data.unlockData) then return end | ||
| 82 | + status.s = 1 | ||
| 83 | + return true | ||
| 84 | + end | ||
| 85 | + | ||
| 86 | + local function checkStoryStatusByMultStar(role, data, status, cond1, cond2) -- cond1 heroType, cond2 wakeL | ||
| 87 | + local heroType = cond1 | ||
| 88 | + local need = data.unlockData:toArray(true, "=") | ||
| 89 | + local had = false | ||
| 90 | + for _, v in pairs(need) do | ||
| 91 | + if v == heroType then | ||
| 92 | + had = true | ||
| 93 | + break | ||
| 94 | + end | ||
| 95 | + end | ||
| 96 | + if not had then return end | ||
| 97 | + if cond2 > (status["s" .. heroType] or 0) then | ||
| 98 | + status["s" .. heroType] = cond2 | ||
| 99 | + end | ||
| 100 | + local starC = 0 | ||
| 101 | + for _, v in pairs(need) do | ||
| 102 | + starC = starC + (status["s" .. v] or 0) | ||
| 103 | + end | ||
| 104 | + if starC >= tonumber(data.unlockData2) then | ||
| 105 | + table.clear(status) | ||
| 106 | + status.s = 1 | ||
| 107 | + end | ||
| 108 | + return true | ||
| 109 | + end | ||
| 110 | + | ||
| 111 | + local function checkStoryStatusByAdv(role, data, status, cond1) -- cond1 advId | ||
| 112 | + if tonumber(data.unlockData) ~= cond1 then return end | ||
| 113 | + status.s = 1 | ||
| 114 | + return true | ||
| 115 | + end | ||
| 116 | + | ||
| 117 | + local checkstoryStatusFunc = { | ||
| 118 | + [1] = checkStoryStatusByHang, | ||
| 119 | + [2] = checkStoryStatusByLove, | ||
| 120 | + [3] = checkStoryStatusByMultStar, | ||
| 121 | + [4] = checkStoryStatusByAdv, | ||
| 122 | + } | ||
| 123 | + | ||
| 124 | + function Role:checkStoryStatus(notNotify, stype, cond1, cond2, cond3) | ||
| 125 | + local storyBookStatus = self:getProperty("storyB") | ||
| 126 | + local change = {} | ||
| 127 | + for id, data in pairs(csvdb["story_bookCsv"]) do | ||
| 128 | + if stype == data.unlockType and checkstoryStatusFunc[stype] then | ||
| 129 | + local curStatus = storyBookStatus[id] or {} | ||
| 130 | + if not curStatus.s then -- 存在状态就是已经完成 | ||
| 131 | + local isChange = checkstoryStatusFunc[stype](self, data, curStatus, cond1, cond2, cond3) | ||
| 132 | + if isChange then | ||
| 133 | + storyBookStatus[id] = curStatus | ||
| 134 | + table.insert(change, {type = "storyB", field = id, value = curStatus, isOnlyToC = true}) | ||
| 135 | + end | ||
| 136 | + end | ||
| 137 | + end | ||
| 138 | + end | ||
| 139 | + if next(change) then | ||
| 140 | + self:setProperty("storyB", storyBookStatus) -- 统一写入数据库 | ||
| 141 | + if not notNotify then | ||
| 142 | + self:changeUpdates(change) | ||
| 143 | + end | ||
| 144 | + end | ||
| 145 | + end | ||
| 146 | + | ||
| 147 | + --剧情相关----end------------- | ||
| 27 | end | 148 | end |
| 28 | 149 | ||
| 29 | return RoleTask | 150 | return RoleTask |
| 30 | \ No newline at end of file | 151 | \ No newline at end of file |