--[[ 失落神庙 ]] local Msg = require("core.Msg") local LuaMongo = _G.lua_mongo local DB = require("common.DB") local LostTempleExcel = require("excel.lostTemple") local ElementExcel = require("excel.lostTemple").Element local CombatPosLogic = require("combat.CombatPosLogic") local CombatDefine = require("combat.CombatDefine") local MonsterOutExcel = require("excel.monster").monsterOut local HeroLogic = require("hero.HeroLogic") local MonsterExcel = require("excel.monster") local CombatLogic = require("combat.CombatLogic") local Grid = require("bag.Grid") local HeroGrid = require("hero.HeroGrid") local CombatPosExcel = require("excel.combatPos") local RoleSystemLogic = require("roleSystem.RoleSystemLogic") local RoleSystemDefine = require("roleSystem.RoleSystemDefine") local Util = require("common.Util") local LostTempleCombatLogic = require("lostTemple.lostTempleCombatLogic") local HeroDefine = require("hero.HeroDefine") local BagLogic = require("bag.BagLogic") local Broadcast = require("broadcast.Broadcast") local Lang = require("common.Lang") local CommonDB = require("common.CommonDB") local TriggerDefine = require("trigger.TriggerDefine") local TriggerLogic = require("trigger.TriggerLogic") local HeroGrowUp = require("absAct.HeroGrowUp") local YunYingLogic = require("yunying.YunYingLogic") local Timer = require("core.Timer") local Lost_Handle_Func = { } QUEUE_LEN = 3 -- 每次推送的横向队列数 START_X = 1 -- 起始横向位置 START_LAYER = 1 -- 起始层数 OP_QUERY = 0 OP_CONFIRM = 1 INIT_HP_MAX = 100 DAY_7s = 604800 DAY_2s = 172800 DAY_1s = 86400 --跳过战斗需要的战力 local SHOWQUICKPOWER = 0 --2000000 local function resetDB(human) local query = { _id = human.db._id } LuaMongo.remove(DB.db_lost_temple, query) end function initAfterHot() end function getLeftTime() local openDay = CommonDB.getServerOpenDay() if not openDay then return 0 end local curTime = os.time() local tNowDate = os.date("*t", curTime) tNowDate.hour = 0 tNowDate.min = 0 tNowDate.sec = 0 -- if openDay % 2 == 1 then -- tNowDate.day = tNowDate.day + 2 -- else -- tNowDate.day = tNowDate.day + 1 -- end tNowDate.day = tNowDate.day + 1 local nEndTime = os.time(tNowDate) return nEndTime - curTime end -- local function isOpen(human) --[[ local openDay = CommonDB.getServerOpenDay() if not openDay then return end if openDay < 7 then return end ---- 已经开启 if (openDay - 7 + 1) % 2 ~= 1 then return end ]] if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_1208) then return end return true end function onZero() local openDay = CommonDB.getServerOpenDay() if not openDay then return end -- print("[lostTempleLogic - onZero] 失落神庙零点刷新开始 openDay = "..openDay) -- -- 奇数天刷新 -- if openDay % 2 == 1 then -- print("[lostTempleLogic - onZero] 失落神庙零点, 当前为奇数天移除DB数据\n") -- LuaMongo.remove(DB.db_lost_temple) -- end -- 修改: 每日刷新 -- LuaMongo.remove(DB.db_lost_temple) -- 修改: 延迟60s再清除数据 -- Timer.addLater(60, LuaMongo.remove, DB.db_lost_temple) -- 已经关闭 -- if (openDay - 7 + 1) % 2 ~= 0 then -- return -- end end function updateDaily(human) if not isOpen(human) then return end resetDB(human) print("[lostTempleLogic - updateDaily] 天数刷新 玩家移除lostTemple数据 name = "..human.db.name) human.lostTemple = nil local msgRet = Msg.gc.GC_LOST_TEMPLE_CLOSE Msg.send(msgRet, human.fd) end -- db local QueryByUuid = { _id = nil } -- 插入新的数据 function dbRead(human) if not isOpen(human) then return end human.lostTemple = { } QueryByUuid._id = human.db._id LuaMongo.find(DB.db_lost_temple, QueryByUuid) if not LuaMongo.next(human.lostTemple) then human.lostTemple = nil end end -- local DB_DATA = { } function dbSave(human) if not human.lostTemple then return end if not human.db then return end DB_DATA = { } LuaMongo.find(DB.db_lost_temple, QueryByUuid) -- if not LuaMongo.next(DB_DATA) then -- human.lostTemple._id = human.db._id -- LuaMongo.insert(DB.db_lost_temple, human.lostTemple) -- return -- end if not LuaMongo.next(DB_DATA) then -- 检查 human.db._id 是否已经存在 local exists = false local tempQuery = { _id = human.db._id } LuaMongo.find(DB.db_lost_temple, tempQuery) if LuaMongo.next(DB_DATA) then exists = true end if exists then -- 如果存在,更新文档 LuaMongo.update(DB.db_lost_temple, tempQuery, human.lostTemple) else -- 如果不存在,插入新文档 human.lostTemple._id = human.db._id LuaMongo.insert(DB.db_lost_temple, human.lostTemple) end return end QueryByUuid._id = human.db._id LuaMongo.update(DB.db_lost_temple, QueryByUuid, human.lostTemple) end -- db function onLogin(human) if not isOpen(human) then return end dbRead(human) end -- 初始化玩家当前格子 local function printGrid(human) if not human.lostTemple then return end local startX = human.lostTemple.x + 1 local endX = human.lostTemple.x + QUEUE_LEN local layer = human.lostTemple.layer local random = human.lostTemple.random local LostTempleConfig = LostTempleExcel[layer] if not LostTempleConfig then return end local LostTemple = LostTempleConfig[random] if not LostTemple then return end print("layler=", human.lostTemple.layer, "random=", human.lostTemple.random, "playerX=", human.lostTemple.x, "playerY=", human.lostTemple.y) for x = startX, endX do human.lostTemple.grid[x] = human.lostTemple.grid[x] or { } local LostTempleX = LostTemple[x] if LostTempleX then for y = 1, LostTemple.vertical do if LostTempleX[y] then print("x=", x, "y=", y, "id=", human.lostTemple.grid[x][y].id) end end end end return true end -- local function makeMonsterGrid(human, cmd) if not human.lostTemple then return end local x = human.lostTemple.x local layer = human.lostTemple.layer local LostTempleMonster = LostTempleExcel.Lost[x] if not LostTempleMonster then return end -- 取共鸣英雄的等级 local totalLv = 0 local equally = 0 local equallyLv = 0 local db = human.db.xingYaoGongMing if db and db.defList then for heroIndex in pairs(db.defList) do local heroGrid = human.db.heroBag[heroIndex] if heroGrid then totalLv = totalLv + heroGrid.lv equally = equally + 1 end end end local randomId = 0 if cmd == "nomalMonster" then randomId = math.random(LostTempleMonster.nomal[layer][1], LostTempleMonster.nomal[layer][2]) elseif cmd == "eliteMonster" then randomId = math.random(LostTempleMonster.elite[layer][1], LostTempleMonster.elite[layer][2]) elseif cmd == "eliteBoss" then randomId = math.random(LostTempleMonster.elite[layer][1], LostTempleMonster.elite[layer][2]) end equallyLv = math.ceil(totalLv / equally * randomId / 10000) local monsterOutID = 0 for i = 1, #LostTempleExcel.Monster do if equallyLv >= LostTempleExcel.Monster[i].lvminmax[1] and equallyLv <= LostTempleExcel.Monster[i].lvminmax[2] then local randomIndex = math.random(1, #LostTempleExcel.Monster[i].monsteroutid) monsterOutID = LostTempleExcel.Monster[i].monsteroutid[randomIndex] break end end if monsterOutID == 0 then assert(nil, "monsterOutID is error equallyLv=" .. equallyLv .. "-randomId=" .. randomId) end return monsterOutID end -- 制造一个召唤祭坛 local function makeSummonHeroGrid(human) -- 取共鸣英雄的等级 local totalLv = 0 local equally = 0 local equallyLv = 0 local db = human.db.xingYaoGongMing if db and db.defList then for heroIndex in pairs(db.defList) do local heroGrid = human.db.heroBag[heroIndex] if heroGrid then totalLv = totalLv + heroGrid.lv equally = equally + 1 end end end equallyLv = math.ceil(totalLv / equally) local heroIndex = nil for i = 1, #LostTempleExcel.Hero do if equallyLv >= LostTempleExcel.Hero[i].lvminmax[1] and equallyLv <= LostTempleExcel.Hero[i].lvminmax[2] then heroIndex = i break end end if heroIndex == nil then assert(nil, "heroid is error equallyLv=" .. equallyLv) end -- local summonHero = { } local weightHeroTb = Util.copyTable(LostTempleExcel.Hero[heroIndex].heroid) -- 根据权重取出4英雄 local totalWeight = 0 for i = 1, #weightHeroTb do totalWeight = totalWeight + weightHeroTb[i][4] end -- 取4次 local len = 0 for k = 1, 4 do local random = math.random(1, totalWeight) for i = 1, #weightHeroTb do if random <= weightHeroTb[i][4] then len = len + 1 summonHero[len] = { } summonHero[len].id = weightHeroTb[i][1] summonHero[len].lv = weightHeroTb[i][2] local maxStar = HeroDefine.getMaxHeroStar(weightHeroTb[i][1]) summonHero[len].star = maxStar > weightHeroTb[i][3] and weightHeroTb[i][3] or maxStar -- 最后一个放入到 这一个里面 删掉最后一个 totalWeight = totalWeight - weightHeroTb[i][4] weightHeroTb[i] = weightHeroTb[#weightHeroTb] weightHeroTb[#weightHeroTb] = nil break end random = random - weightHeroTb[i][4] end end if #summonHero == 0 then assert(nil, "summonHero is error equallyLv=" .. equallyLv) end return summonHero end -- 制造一个智慧树 local function makeSummonTreeGrid(human) -- local summonTree = { } local weightTreeTb = Util.copyTable(LostTempleExcel.Tree) -- 根据权重取出4英雄 local totalWeight = 0 for i = 1, #weightTreeTb do totalWeight = totalWeight + weightTreeTb[i].weight end -- 取3次 local len = 0 for k = 1, 3 do local random = math.random(1, totalWeight) for i = 1, #weightTreeTb do if random <= weightTreeTb[i].weight then len = len + 1 summonTree[len] = i -- 最后一个放入到 这一个里面 删掉最后一个 totalWeight = totalWeight - weightTreeTb[i].weight weightTreeTb[i] = weightTreeTb[#weightTreeTb] weightTreeTb[#weightTreeTb] = nil break end random = random - weightTreeTb[i].weight end end if #summonTree == 0 then assert(nil, "summonTree is error") end return summonTree end -- 神界商店 local function makeSummonShopGrid(human) -- local summonShop = { } local weightShopTb = Util.copyTable(LostTempleExcel.LostShop) -- 根据权重取出4英雄 local totalWeight = 0 for i = 1, #weightShopTb do totalWeight = totalWeight + weightShopTb[i].weight end -- 取3次 local len = 0 for k = 1, 4 do local random = math.random(1, totalWeight) for i = 1, #weightShopTb do if random <= weightShopTb[i].weight then len = len + 1 summonShop[len] = i -- 最后一个放入到 这一个里面 删掉最后一个 totalWeight = totalWeight - weightShopTb[i].weight weightShopTb[i] = weightShopTb[#weightShopTb] weightShopTb[#weightShopTb] = nil break end random = random - weightShopTb[i].weight end end if #summonShop == 0 then assert(nil, "summonShop is error") end return summonShop end -- 制造一个宝箱 local function makeBoxGrid(human) for i = 1, #ElementExcel do local element = ElementExcel[i] if element.cmd == "summonBox" then return i end end end -- 制造一个传送门 local function makeConverDoorGrid(human) for i = 1, #ElementExcel do local element = ElementExcel[i] if element.cmd == "conveyDoor" then return i end end end -- 初始化玩家当前格子 local function makeGrid(human) if not human.lostTemple then return end local layer = human.lostTemple.layer local random = human.lostTemple.random local LostTempleConfig = LostTempleExcel[layer] if not LostTempleConfig then return end local LostTemple = LostTempleConfig[random] if not LostTemple then return end -- 清除玩家当前位置的数据 human.lostTemple.grid = human.lostTemple.grid or { } human.lostTemple.grid[human.lostTemple.x] = nil local startX = human.lostTemple.x + 1 local endX = human.lostTemple.x + QUEUE_LEN for x = startX, endX do local LostTempleX = LostTemple[x] if LostTempleX then human.lostTemple.grid[x] = human.lostTemple.grid[x] or { } for y = 1, LostTemple.vertical do if LostTempleX[y] then if not human.lostTemple.grid[x][y] then human.lostTemple.grid[x][y] = { id = LostTempleX[y][1] } end local element = ElementExcel[LostTempleX[y][1]] -- 召唤神坛 if element.cmd == "summonHero" then human.lostTemple.grid[x][y].summonHero = makeSummonHeroGrid(human) end -- 智慧树 if element.cmd == "summonTree" then human.lostTemple.grid[x][y].summonTree = makeSummonTreeGrid(human) end -- 神界商店 if element.cmd == "summonShop" then human.lostTemple.grid[x][y].summonShop = makeSummonShopGrid(human) end --只生成 第一层的怪物 if x == startX then if element.cmd == "nomalMonster" or element.cmd == "eliteMonster" or element.cmd == "eliteBoss" then human.lostTemple.grid[x][y].monsterOutID = makeMonsterGrid(human, element.cmd) end end end end end end return true end -- 制造一个默认的位置数据 local function makeLostTempLe(layer) -- 第一层 local LostTempleConfig = LostTempleExcel[layer] if not LostTempleConfig then assert(nil, "lostTemple startLayer error = " .. layer) end -- 随机一张地图 local startRandom = math.random(1, #LostTempleConfig) local LostTemple = LostTempleConfig[startRandom] if not LostTemple then return end -- 起始位置 local LostTempleX = LostTemple[START_X] if not LostTempleX then assert(nil, "lostTemple startX error = " .. START_LAYER) end -- 找到纵向可以站立的位置 local startY = 1 for y = 1, LostTemple.vertical do if LostTempleX[y] and LostTempleX[y][1] == 0 then startY = y break end end return layer, START_X, startY, startRandom end -- 初始化 local function initDB(human) if human.lostTemple then return end local lostLayer, lostX, lostY, lostRandom = makeLostTempLe(START_LAYER) if not lostLayer then return end human.lostTemple = { layer = lostLayer, x = lostX, y = lostY, random = lostRandom, box = nil, grid = nil } makeGrid(human) dbSave(human) end -- 重置之后的Y值 local function getStartYVal(mapIdx) local LostTempleConfig = LostTempleExcel[START_LAYER] if not LostTempleConfig then return -1 end local LostTemple = LostTempleConfig[mapIdx] if not LostTemple then return -1 end local LostTempleX = LostTemple[START_X] if not LostTempleX then return -1 end local startY = -1 for y = 1, LostTemple.vertical do if LostTempleX[y] and LostTempleX[y][1] == 0 then startY = y break end end return startY end -- 是否已经挑战过 local function isChallenge(human) if not human.lostTemple then return false end -- 层数判断 local layer = human.lostTemple.layer or 0 if layer > 1 then return true end -- X 值判断 local start_X_Val = human.lostTemple.x or 0 if start_X_Val ~= START_X then return true end local y_Val = human.lostTemple.y or 0 local mapIdx = human.lostTemple.random or 0 local start_Y_Val = getStartYVal(mapIdx) if start_Y_Val == -1 then assert(false, "失落神庙数据异常") end -- Y 值判断 if y_Val ~= start_Y_Val then return true end return false end -- human = { } -- initDB(human) -- printGrid(human) -- print("-----------------------------") -- 下一格 function nextGrid(human, y) if not human.lostTemple then return end local layer = human.lostTemple.layer local LostTempleConfig = LostTempleExcel[layer] if not LostTempleConfig then assert(nil, "lostTemple startLayer error = " .. layer) end local random = human.lostTemple.random local LostTemple = LostTempleConfig[random] if not LostTemple then return end local x = human.lostTemple.x + 1 local LostTempleX = LostTemple[x] if not LostTempleX then return end local LostTempleY = LostTempleX[y] if not LostTempleY then return end human.lostTemple.x = x human.lostTemple.y = y makeGrid(human) end -- 下一层 local function nextDB(human) if not human.lostTemple then return end local nextLayer = human.lostTemple.layer + 1 local LostTempleConfig = LostTempleExcel[nextLayer] if not LostTempleConfig then return end local lostLayer, lostX, lostY, lostRandom = makeLostTempLe(nextLayer) if not lostLayer then return end -- TriggerLogic.PublishEvent(TriggerDefine.LOSTTEMPLE_PASS_LAYER, human.db._id, 1) human.lostTemple.layer = lostLayer human.lostTemple.x = lostX human.lostTemple.y = lostY human.lostTemple.random = lostRandom human.lostTemple.grid = nil makeGrid(human) end -- local function makeGridNet(human, net) if not human.lostTemple then return end local startX = human.lostTemple.x + 1 local endX = human.lostTemple.x + QUEUE_LEN local layer = human.lostTemple.layer local random = human.lostTemple.random local LostTempleConfig = LostTempleExcel[layer] if not LostTempleConfig then return end local LostTemple = LostTempleConfig[random] if not LostTemple then return end net[0] = 0 local len = 0 for x = startX, endX do if human.lostTemple.grid[x] then for y = 1, LostTemple.vertical do if human.lostTemple.grid[x][y] then len = len + 1 local grid = human.lostTemple.grid[x][y] local element = ElementExcel[grid.id] if not element then assert(nil, "lostTemple element error = " .. grid.id) end net[len].id = grid.id net[len].name = element.name net[len].type = element.type net[len].desc = element.desc net[len].x = x net[len].y = y net[len].body = 0 if grid.monsterOutID then if not MonsterOutExcel[grid.monsterOutID] then assert(nil, "lostTemple monsterOutID error = " .. grid.monsterOutID) end local monsterConfig = MonsterExcel.monster[MonsterOutExcel[grid.monsterOutID].member[1][1]] if not monsterConfig then assert(nil, "lostTemple monsterOutID error = " .. MonsterOutExcel[grid.monsterOutID].member[1][1]) end net[len].body = monsterConfig.body end end end end end net[0] = len return true end --通关 function IsPass(human) -- initDB(human) if not human.lostTemple then return false end if human.lostTemple.oneClickSweep then return true end local startX = human.lostTemple.x + 1 local endX = human.lostTemple.x + QUEUE_LEN local layer = human.lostTemple.layer local random = human.lostTemple.random local LostTempleConfig = LostTempleExcel[layer] if not LostTempleConfig then return end local LostTemple = LostTempleConfig[random] if not LostTemple then return end local type = 0 local len = 0 for x = startX, endX do if human.lostTemple.grid[x] then for y = 1, LostTemple.vertical do if human.lostTemple.grid[x][y] then len = len + 1 local grid = human.lostTemple.grid[x][y] local element = ElementExcel[grid.id] if not element then return false end type = element.type end end end end if len == 1 and type == 6 and layer >= 3 then return true end return false end -- 查询 function query(human) if not isOpen(human) then return end -- 没有共鸣 local db = human.db.xingYaoGongMing if not db or not db.defList then return end initDB(human) local leftTime = getLeftTime() local msgRet = Msg.gc.GC_LOST_TEMPLE_QUERY msgRet.leftTime = leftTime if not makeGridNet(human, msgRet.list) then return end msgRet.playerX = human.lostTemple.x msgRet.playerY = human.lostTemple.y msgRet.layer = human.lostTemple.layer msgRet.leftTime = leftTime Msg.send(msgRet, human.fd) sendHeroStatus(human) end -- 更新 function update(human) if not human.lostTemple then return end local msgRet = Msg.gc.GC_LOST_TEMPLE_UPDATE if not makeGridNet(human, msgRet.list) then return end local leftTime = getLeftTime() msgRet.leftTime = leftTime msgRet.playerX = human.lostTemple.x msgRet.playerY = human.lostTemple.y msgRet.layer = human.lostTemple.layer Msg.send(msgRet, human.fd) end -- 检测点击格子是否合法 function checkPutByY(human, y) local startX = human.lostTemple.x + 1 if not human.lostTemple.grid or not human.lostTemple.grid[startX] or not human.lostTemple.grid[startX][y] then return end local grid = human.lostTemple.grid[startX][y] -- 检测点击位置是否合法 return grid end -- 检测点击格子是否合法 function checkPut(human, x, y) local startX = x if not human.lostTemple.grid or not human.lostTemple.grid[startX] or not human.lostTemple.grid[startX][y] then return end local grid = human.lostTemple.grid[startX][y] local nNowX = human.lostTemple.x local nNowY = human.lostTemple.y if nNowX + 1 ~= x then print("[checkPut] x ="..x.." nNowX="..nNowX.." y="..y.." nNowY="..nNowY) return end -- 检测点击位置是否合法 return grid end -- 设置格子 function putSet(human, y, cmd) local startX = human.lostTemple.x + 1 if not human.lostTemple.grid or not human.lostTemple.grid[startX] or not human.lostTemple.grid[startX][y] then return end if cmd == "eliteBoss" then human.lostTemple.grid[startX][y] = { id = makeBoxGrid(human) } return true end if cmd == "summonBox" then human.lostTemple.grid[startX][y] = { id = makeConverDoorGrid(human) } return true end end -- 走到下一步 function put(human, op, x, y, arg) if not isOpen(human) then return end if not human.lostTemple then return end if op ~= OP_QUERY and op ~= OP_CONFIRM then return end local grid = checkPut(human, x, y) if not grid then return end local elementConfig = ElementExcel[grid.id] if not elementConfig then return end local ret = nil if Lost_Handle_Func[elementConfig.cmd] then ret = Lost_Handle_Func[elementConfig.cmd](human, op, y, grid, arg, elementConfig) end if ret then nextGrid(human, y) dbSave(human) update(human) end end -- 怪物面板 local function monsterQuery(human, grid, elementConfig) if not human.lostTemple then return end if not grid.monsterOutID then return end local rewardConfig = LostTempleExcel.Drop[elementConfig.arg[1]] if not rewardConfig then return end local msgRet = Msg.gc.GC_LOST_TEMPLE_MONSTER msgRet.gdReward[0] = 0 for _, item in ipairs(rewardConfig.drop) do msgRet.gdReward[0] = msgRet.gdReward[0] + 1 Grid.makeItem(msgRet.gdReward[msgRet.gdReward[0]], item[1], item[2]) end msgRet.randomReward[0] = 0 for _, item in ipairs(rewardConfig.randomdrop) do if type(item) == "table" then msgRet.randomReward[0] = msgRet.randomReward[0] + 1 Grid.makeItem(msgRet.randomReward[msgRet.randomReward[0]], item[1], item[2]) end end local monsterOutConfig = MonsterOutExcel[grid.monsterOutID] if not monsterOutConfig then return end local formation = monsterOutConfig.formation formation = formation == 0 and 1 or formation local mationConfig = CombatPosExcel.formation[formation] local posList = mationConfig.pos if not posList then return end msgRet.list[0] = 0 for i, member in ipairs(monsterOutConfig.member) do local monsterID = member[1] local monsterConfig = MonsterExcel.monster[monsterID] if posList[i] then local defPos = CombatLogic.getPos(CombatDefine.DEFEND_SIDE, posList[i]) local monsterLv = member[2] local obj = grid.objStatus and grid.objStatus[defPos] or nil local hpRate = obj and obj.hpRate or 1 local hp = math.ceil(INIT_HP_MAX * hpRate) local hpMax = INIT_HP_MAX local others = HeroGrid.createOthers(monsterLv, hp, hpMax, monsterConfig.star) msgRet.list[0] = msgRet.list[0] + 1 HeroGrid.makeHeroSimpleByMonsterID(msgRet.list[msgRet.list[0]], monsterID, others) end end msgRet.showNext = 0 if human.db.zhandouli >= SHOWQUICKPOWER then msgRet.showNext = 1 end msgRet.quick = 0 if human.db.combatQuick[CombatDefine.COMBAT_TYPE24] == 1 then msgRet.quick = 1 end Msg.send(msgRet, human.fd) end -- 英雄列表 function sendHeroStatus(human) if not human.lostTemple then return end local msgRet = Msg.gc.GC_LOST_TEMPLE_HERO_STATUS msgRet.list[0] = 0 msgRet.isEnd = 0 local len = 0 if human.lostTemple.heroStatus then for k, hpRate in pairs(human.lostTemple.heroStatus) do local hp = math.ceil(INIT_HP_MAX * hpRate) local hpMax = INIT_HP_MAX len = len + 1 local net = msgRet.list[len] net.hp = hp net.hpMax = hpMax net.uuid = k if len >= 30 then msgRet.isEnd = 0 msgRet.list[0] = len Msg.send(msgRet, human.fd) len = 0 end end end msgRet.isEnd = 1 msgRet.list[0] = len Msg.send(msgRet, human.fd) end -- 推送召唤祭坛英雄列表 function sendSummonHeroList(human) if not human.lostTemple then return end if not human.lostTemple.summonHero then return end local msgRet = Msg.gc.GC_LOST_TEMPLE_SUMMON_LIST msgRet.list[0] = 0 for index = 1, human.lostTemple.summonHero[0] do msgRet.list[0] = msgRet.list[0] + 1 HeroGrid.makeHeroSimple(msgRet.list[msgRet.list[0]], human.lostTemple.summonHero[index], index) end Msg.send(msgRet, human.fd) end -- 推送buff属性 function sendSummonTreeList(human) if not human.lostTemple then return end if not human.lostTemple.summonTree then return end local msgRet = Msg.gc.GC_LOST_TEMPLE_BUFF_LIST msgRet.list[0] = 0 for k, v in pairs(human.lostTemple.summonTree) do msgRet.list[0] = msgRet.list[0] + 1 local net = msgRet.list[msgRet.list[0]] net.attr.key = k net.attr.value = v net.name = "" for i = 1, #LostTempleExcel.Tree do if LostTempleExcel.Tree[i].icon == k then net.name = LostTempleExcel.Tree[i].buffname break end end end Msg.send(msgRet, human.fd) end -- 随机奖励宝箱 function sendRandomBox(human) if not human.lostTemple then return end local msgRet = Msg.gc.GC_LOGT_TEMPLE_RANDOM_BOX local len = 0 if human.lostTemple.randomReward then for k, v in pairs(human.lostTemple.randomReward) do len = len + 1 Grid.makeItem(msgRet.randomReward[len], k, v) end end msgRet.randomReward[0] = len Msg.send(msgRet, human.fd) end -- function Lost_Handle_Func.nomalMonster(human, op, y, grid, arg, elementConfig) if op == OP_QUERY then monsterQuery(human, grid, elementConfig) end end -- function Lost_Handle_Func.eliteMonster(human, op, y, grid, arg, elementConfig) if op == OP_QUERY then monsterQuery(human, grid, elementConfig) end end -- function Lost_Handle_Func.eliteBoss(human, op, y, grid, arg, elementConfig) if op == OP_QUERY then monsterQuery(human, grid, elementConfig) end end -- function Lost_Handle_Func.summonHero(human, op, y, grid, arg, elementConfig) -- 召唤神坛查询 if op == OP_QUERY then if not grid.summonHero then return end local msgRet = Msg.gc.GC_LOST_TEMPLE_SUMMON msgRet.list[0] = 0 for i = 1, #grid.summonHero do local hero = grid.summonHero[i] msgRet.list[0] = msgRet.list[0] + 1 local others = HeroGrid.createOthers(hero.lv, INIT_HP_MAX, INIT_HP_MAX, hero.star) HeroGrid.makeHeroSimpleByID(msgRet.list[msgRet.list[0]], hero.id, i, others) end Msg.send(msgRet, human.fd) return end -- 添加召唤英雄 if op == OP_CONFIRM then local index = tonumber(arg) if not grid.summonHero then return end local hero = grid.summonHero[index] if not hero then return end local heroGrid = HeroGrid.createHeroGrid(hero.id, hero.star) if not heroGrid then return end heroGrid.isLostTemple = 1 -- 初始化属性 local attrConfig = HeroDefine.getAttrConfig(hero.id, heroGrid.star) if not attrConfig then return end local quality = HeroGrid.getMaxQualityByLv(heroGrid.star, hero.lv) local maxLv = HeroGrid.getMaxLv(heroGrid.star, quality) heroGrid.lv = math.min(maxLv, hero.lv or 0) heroGrid.quality = math.max(heroGrid.quality, quality or 0) -- 加入装备 -- 加入到英雄队列 human.lostTemple.summonHero = human.lostTemple.summonHero or { } human.lostTemple.summonHero[0] = human.lostTemple.summonHero[0] or 0 human.lostTemple.summonHero[0] = human.lostTemple.summonHero[0] + 1 local addIndex = human.lostTemple.summonHero[0] human.lostTemple.summonHero[addIndex] = heroGrid heroGrid.bagIndex = addIndex -- 计算属性 LostTempleCombatLogic.getHeroAttrs(human, addIndex) -- 通知客户端 sendSummonHeroList(human) return true end end -- 智慧树 function Lost_Handle_Func.summonTree(human, op, y, grid, arg, elementConfig) -- 召唤神坛查询 if op == OP_QUERY then if not grid.summonTree then return end local msgRet = Msg.gc.GC_LOST_TEMPLE_BUFF msgRet.list[0] = 0 for i = 1, #grid.summonTree do local hero = grid.summonTree[i] msgRet.list[0] = msgRet.list[0] + 1 local config = LostTempleExcel.Tree[grid.summonTree[i]] local net = msgRet.list[msgRet.list[0]] net.id = i net.icon = config.icon net.name = config.buffname net.attr[0] = #config.Buffid for i = 1, #config.Buffid do net.attr[i].key = config.Buffid[i][1] net.attr[i].value = config.Buffid[i][2] end end Msg.send(msgRet, human.fd) return end -- 添加召唤英雄 if op == OP_CONFIRM then local index = tonumber(arg) if not grid.summonTree then return end local buffID = grid.summonTree[index] if not buffID then return end local config = LostTempleExcel.Tree[buffID] if not config then return end human.lostTemple.summonTree = human.lostTemple.summonTree or { } for i = 1, #config.Buffid do local key = config.Buffid[i][1] local value = config.Buffid[i][2] human.lostTemple.summonTree[key] = human.lostTemple.summonTree[key] or 0 human.lostTemple.summonTree[key] = human.lostTemple.summonTree[key] + value end sendSummonTreeList(human) return true end end -- 炽天使 function Lost_Handle_Func.treatRevive(human, op, y, grid, arg, elementConfig) if op == OP_QUERY then return end -- 复活治疗 if op == OP_CONFIRM then local opType = tonumber(arg) local heroStatus = human.lostTemple.heroStatus if not heroStatus then return true end -- 复活 if opType == 1 then local len = 0 local cnt = 0 local revice = {} local hpList = {} for k, hpRate in pairs(heroStatus) do if hpRate <= 0.0 then len = len + 1 revice[len]=k else if hpRate < 1.0 then cnt = cnt + 1 hpList[cnt] = k end end end if #revice > 0 then local random = math.random(1, #revice) heroStatus[revice[random]] = nil elseif #hpList > 0 then local random = math.random(1, #hpList) heroStatus[hpList[random]] = nil end end -- 治疗 if opType == 2 then for k, hpRate in pairs(heroStatus) do if heroStatus[k] > 0.0 then heroStatus[k] = hpRate + 0.5 if heroStatus[k] >= 1.0 then heroStatus[k] = nil end end end end sendHeroStatus(human) return true end end -- 神界商店 function Lost_Handle_Func.summonShop(human, op, y, grid, arg, elementConfig) if op == OP_QUERY then if not grid.summonShop then return end local msgRet = Msg.gc.GC_LOST_TEMPLE_SHOP msgRet.list[0] = 0 for i = 1, #grid.summonShop do msgRet.list[0] = msgRet.list[0] + 1 local config = LostTempleExcel.LostShop[grid.summonShop[i]] local net = msgRet.list[msgRet.list[0]] Grid.makeItem(net.item, config.itemid, config.itemnum) Grid.makeItem(net.needItem, config.spenditem, config.spendnum) net.discount = config.discount net.id = i end Msg.send(msgRet, human.fd) return end -- 购买东西 if op == OP_CONFIRM then local index = tonumber(arg) if not grid.summonShop then return end local shopID = grid.summonShop[index] if not shopID then return end local config = LostTempleExcel.LostShop[shopID] if not config then return end if not BagLogic.checkItemCnt(human, config.spenditem, config.spendnum) then return end BagLogic.delItem(human, config.spenditem, config.spendnum, "lostTemple") BagLogic.addItem(human, config.itemid, config.itemnum, "lostTemple") return true end end -- -- 宝箱 function Lost_Handle_Func.summonBox(human, op, y, grid, arg, elementConfig) if op == OP_QUERY then sendRandomBox(human) return end -- if op == OP_CONFIRM then if human.lostTemple.randomReward then local item = { } local len = 0 for k, v in pairs(human.lostTemple.randomReward) do len = len + 1 item[len] = { k, v } end BagLogic.addItemList(human, item, "lostTemple") human.lostTemple.randomReward = nil TriggerLogic.PublishEvent(TriggerDefine.LOSTTEMPLE_PASS_LAYER, human.db._id, 1) end -- 判定有没有下一程 local nextLayer = human.lostTemple.layer + 1 local LostTempleConfig = LostTempleExcel[nextLayer] if LostTempleConfig then -- 变成传送门 putSet(human, y, elementConfig.cmd) end dbSave(human) update(human) RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1208) end end -- 传送门 function Lost_Handle_Func.conveyDoor(human, op, y, grid, arg, elementConfig) if op == OP_QUERY then return end -- 进入下一层 if op == OP_CONFIRM then nextDB(human) dbSave(human) update(human) end end function lostTempleRevice(human) if not human.lostTemple then return end human.lostTemple.heroStatus = nil sendHeroStatus(human) end -- 查询一键扫荡状态 function LostTemple_OneClickSweep_Query(human) if not isOpen(human) then return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED) end local msgRet = Msg.gc.GC_LOGT_TEMPLE_ONECLICK_SWEEP_QUERY msgRet.state = 0 if human.lostTemple and human.lostTemple.oneClickSweep then msgRet.state = 2 else local isBuyKing = HeroGrowUp.isBuyKing(human) if isBuyKing and isBuyKing == 1 then msgRet.state = 1 end end Msg.send(msgRet, human.fd) end -- 查询一键扫荡奖励 function LostTemple_OneClickSweep_Award(human) if not isOpen(human) then return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED) end local msgRet = Msg.gc.GC_LOGT_TEMPLE_ONECLICK_SWEEP_AWARD msgRet.awardArr[0] = 0 local awardCfg = LostTempleExcel.Saodang[1].reward msgRet.awardArr[0] = #awardCfg for idx, itemTb in ipairs(awardCfg) do Grid.makeItem(msgRet.awardArr[idx], itemTb[1], itemTb[2]) end Msg.send(msgRet, human.fd) end -- 进行一键扫荡 function LostTemple_OneClickSweep_Do(human) if not isOpen(human) then return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED) end local isBuyKing = HeroGrowUp.isBuyKing(human) if not isBuyKing or isBuyKing ~= 1 then return Broadcast.sendErr(human, Lang.LOST_NO_BUY) end local lostTempleData = human.lostTemple if lostTempleData and lostTempleData.oneClickSweep then return Broadcast.sendErr(human, Lang.LOST_HAS_ONECLICKSWEEP) end if isChallenge(human) then return Broadcast.sendErr(human, Lang.LOST_HAS_CHALLENGE) end -- 更新数据 --human.lostTemple = { layer = lostLayer, x = lostX, y = lostY, random = lostRandom, box = nil, grid = nil } initDB(human) -- lostTempleData = human.lostTemple -- lostTempleData.layer = 3 -- lostTempleData.x = 10 -- lostTempleData.y = 4 for i=1, 2 do nextDB(human) end human.lostTemple.oneClickSweep = true dbSave(human) update(human) local awardArr = {} local awardCfg = LostTempleExcel.Saodang[1].reward for idx, itemTb in ipairs(awardCfg) do awardArr[idx] = {itemTb[1], itemTb[2]} end BagLogic.addItemList(human, awardArr, "lostTemple") YunYingLogic.onCallBack(human, "lostTempleCombat", 1) LostTemple_OneClickSweep_Query(human) RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_1208) end