--[[
    ʧ������

]]
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 Lost_Handle_Func = { }

QUEUE_LEN = 3       -- ÿ�����͵ĺ��������
START_X = 1         -- ��ʼ����λ��
START_LAYER = 1     -- ��ʼ����
OP_QUERY = 0
OP_CONFIRM = 1
INIT_HP_MAX = 100


function initAfterHot()

end

--
local function isOpen(human)
    --local openDay = CommonDB.getServerOpenDay()
    --if not openDay then
    --    return Broadcast.sendErr(human,Lang.LOST_TEMPLE_OPEN_ERROR)
    --end
    --
    --if openDay < 7 then
    --    return Broadcast.sendErr(human,Lang.LOST_TEMPLE_OPEN_ERROR)
    --end
    --
    ---- �Ѿ�����
    --if (openDay - 7 + 1) % 2 ~= 1 then
    --    return Broadcast.sendErr(human,Lang.LOST_TEMPLE_OPEN_ERROR)
    --end
    --
    --if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_1208) then
    --   return Broadcast.sendErr(human,Lang.LOST_TEMPLE_OPEN_ERROR)
    --end
    return true
end


function onZero()
    local openDay = CommonDB.getServerOpenDay()
    if not openDay then
        return
    end

    if openDay < 7 then
        return
    end

    -- �Ѿ��ر�
    if (openDay - 7 + 1) % 2 ~= 0 then
        return
    end

    LuaMongo.remove(DB.db_lost_temple)
end


function updateDaily(human)
    --local openDay = CommonDB.getServerOpenDay()
    --if not openDay then
    --    return
    --end
    --
    --if openDay < 7 then
    --    return
    --end
    --
    ---- �Ѿ��ر�
    --if (openDay - 7 + 1) % 2 ~= 0 then
    --    return
    --end
    --
    --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

    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]
                summonHero[len].star = weightHeroTb[i][3]

                -- ���һ�����뵽 ��һ������ ɾ�����һ��
                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

-- 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

    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 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 msgRet = Msg.gc.GC_LOST_TEMPLE_QUERY
    if not makeGridNet(human, msgRet.list) then return end
    msgRet.playerX = human.lostTemple.x
    msgRet.playerY = human.lostTemple.y
    msgRet.layer = human.lostTemple.layer
    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
    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]

    -- �����λ���Ƿ�Ϸ�
    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
    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
        end

        -- �ж���û����һ��
        local nextLayer = human.lostTemple.layer + 1
        local LostTempleConfig = LostTempleExcel[nextLayer]
        if LostTempleConfig then
            -- ��ɴ�����
            putSet(human, y, elementConfig.cmd)
        end

        dbSave(human)
        update(human)
    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