| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512 |
- --[[
- 数据库设计
- relic = {
- [camp] = {
- isLock = 1 -- 是否被锁住
- lv = 0 -- 等级
- exp = 0 -- 经验
- quality = 0 -- 品阶
- star = 0 -- 星
- tupoLv = 0 -- 突破等级
- lvAttr = {[key] = value}
- qualityAttr = {[key] = value}
- tupoAttr = {[key] = value}
- }
- }
- ]]
- local Msg = require("core.Msg")
- local RelicExcel = require("excel.relic")
- local HeroLogic = require("hero.HeroLogic")
- local HechengLogic = require("hecheng.HechengLogic")
- local FenjieLogic = require("hecheng.FenjieLogic")
- local Grid = require("bag.Grid")
- local Broadcast = require("broadcast.Broadcast")
- local Util = require("common.Util")
- local Lang = require("common.Lang")
- local function initDB(human)
- if human.db.relic then
- return
- end
- -- 初始化信息
- for i = 1,5 do
- human.db.relic[i] = {}
- human.db.relic[i].isLock = 1
- human.db.relic[i].lv = 1
- human.db.relic[i].exp = 0
- human.db.relic[i].quality = 0
- human.db.relic[i].star = 0
- human.db.relic[i].tupoLv = 0
- human.db.relic[i].lvAttr = {}
- human.db.relic[i].qualityAttr = {}
- human.db.relic[i].tupoAttr = {}
- end
- -- 第一阵营默认为已解锁状态
- human.db.relic[1].isLock = 0
- end
- local function getJinjieState(human,camp)
- initDB(human)
- local db = human.db.relic[camp]
- local nextQuality = db.quality + 1
- local config = RelicExcel.jinjie[nextQuality]
- if not config then
- return 0 -- 已达到最大阶数
- end
- if db.lv < config.needLv then
- return 1 -- 等级不够
- end
- -- 检查材料是否足够
- if human.db.jinbi < config.jinbi then
- return 2 -- 材料不足
- end
- local len = #config.item
- for i = 1,len do
- if BagLogic.getItemCnt(human, config.item[i][1]) < config.item[i][2] then
- return 2 -- 材料不足
- end
- end
- return 3 -- 可以进阶
- end
- -- 获取突破状态
- local function getTupoState(human,camp)
- initDB(human)
- local db = human.db.relic[camp]
- local nextTupo = db.tupoLv + 1
- local config = RelicExcel.tupo[nextTupo]
- if not config then
- return 0 -- 配置错误,或已达到最大等级
- end
-
- if db.quality < config.quality then
- return 1 -- 阶数不够
- end
- -- 检查材料是否足够
- if human.db.jinbi < config.jinbi then
- return 2 -- 材料不足
- end
- local len = #config.item
- for i = 1,len do
- if BagLogic.getItemCnt(human, config.item[i][1]) < config.item[i][2] then
- return 2 -- 材料不足
- end
- end
- return 3 -- 可以突破
- end
- local function getAttrTb(human,camp)
- initDB(human)
- local db = human.db.relic[camp]
- local attrTb = {}
- for k,v in pairs(db.lvAttr) do
- attrTb[k] = attrTb[k] or 0
- attrTb[k] = attrTb[k] + v
- end
- for k,v in pairs(db.qualityAttr) do
- attrTb[k] = attrTb[k] or 0
- attrTb[k] = attrTb[k] + v
- end
- for k,v in pairs(db.tupoAttr) do
- attrTb[k] = attrTb[k] or 0
- attrTb[k] = attrTb[k] + v
- end
- return attrTb
- end
- -- 界面查询
- function relicQuery(human,camp)
- -- 等级限制 todo
- if human.db.lv < 1 then
- return
- end
- -- 初始化数据
- initDB(human)
- if human.db.relic[camp].isLock ~= 1 then
- -- 未解锁
- unlockReturn(human,camp)
- else
- -- 已解锁
- lvUpReturn(human,camp)
- end
- end
- -- 未解锁界面返回
- function unlockReturn(human,camp)
- local msgRet = Msg.gc.GC_RELIC_UNLOCK_QUERY_RETURN
- for i = 1,5 do
- msgRet.lockMsg[i] = human.db.relic[i].isLock
- end
- msgRet.lockMsg[0] = 5
- HeroLogic.makeUpStarCond(msgRet.unlockNeed, RelicExcel.unlock[i].unlockNeed)
- Msg.send(msgRet,human.fd)
- end
- -- 解锁
- function unlockDo(human,camp,inputIDList,inputIndexList)
- -- 初始化数据
- initDB(human)
-
- local db = human.db.relic[camp]
- if db.isLock ~= 1 then
- return
- end
- if not HechengLogic.checkCond(human, inputIDList, inputIndexList, RelicExcel.unlock[camp].unlockNeed) then
- return
- end
- local fenjieList = FenjieLogic.fenjie(human, FenjieLogic.FENJIE_DO_JUEXING, inputIDList, inputIndexList)
- db.isLock = 0
- db.lv = 1
- local config = RelicExcel.lvup[db[camp].lv]
- local len = #config.attrAdd[camp]
- for i = 1,len do
- local key = config.attrAdd[camp][i][1]
- local value = config.attrAdd[camp][i][2]
- db.lvAttr[key] = db.lvAttr[key] or 0
- db.lvAttr[key] = db.lvAttr[key] + value
- end
- local msgRet = Msg.gc.GC_RELIC_UNLOCK_RETURN
- msgRet.camp = camp
- Msg.send(msgRet,human.fd)
- relicQuery(human,camp)
- end
- -- 升级界面返回
- function lvUpReturn(human,camp)
- local msgRet = Msg.gc.GC_RELIC_LVUP_QUERY_RETURN
- local db = human.db.relic
- for i = 1,5 do
- msgRet.lockMsg[i] = db[i].isLock
- end
- msgRet.lockMsg[0] = 5
- local config = RelicExcel.lvup[db[camp].lv]
- msgRet.lv = db[camp].lv
- msgRet.maxExp = config.exp
- msgRet.exp = db[camp].exp
- msgRet.jinbi = config.jinbi
- local len = #config.item
- for i = 1,len do
- Grid.makeItem(msgRet.item[i],config.item[i][1],config.item[i][2])
- end
- msgRet.item[0] = len
- local attrTb = getAttrTb(human,camp)
- local count = 0
- for k,v in pairs(attrTb) do
- count = count + 1
- msgRet.attr[count].key = k
- msgRet.attr[count].value = v
- end
- msgRet.attr[0] = count
- Msg.send(msgRet,human.fd)
- end
- -- 升级
- function lvUpDo(human,camp)
- -- 初始化数据
- initDB(human)
- -- 未解锁,返回
- local db = human.db.relic[camp]
- if db.isLock == 1 then
- return
- end
- -- 最大等级
- local maxLv = #RelicExcel.lvup
- -- 已经是最大等级
- if db.lv >= maxLv then
- return
- end
- local config = RelicExcel.lvup[db.lv]
- -- 检查材料是否足够
- if human.db.jinbi < config.jinbi then
- return Broadcast.sendErr(human, Lang.COMMON_NO_JINBI)
- end
- local len = #config.item
- for i = 1,len do
- if BagLogic.getItemCnt(human, config.item[i][1]) < config.item[i][2] then
- local strName = ItemDefine.getValue(config.item[i][1], "name")
- return Broadcast.sendErr(human, Util.format(Lang.COMMON_NO_ITEM, strName))
- end
- end
- -- 扣除材料
- ObjHuman.updateJinbi(human, -config.jinbi, "relic_lvup")
- for i = 1,len do
- BagLogic.delItem(human, config.item[i][1], config.item[i][2], "relic_lvup")
- end
- -- 增加经验
- db.exp = db.exp + config.upExp
- if db.exp >= config.exp then
- db.exp = 0
- db.lv = db.lv + 1
- end
- local len = #RelicExcel.lvup[db.lv].attrAdd[camp]
- for i = 1,len do
- local key = RelicExcel.lvup[db.lv].attrAdd[camp][i][1]
- local value = RelicExcel.lvup[db.lv].attrAdd[camp][i][2]
- db.lvAttr[key] = db.lvAttr[key] or 0
- db.lvAttr[key] = db.lvAttr[key] + value
- end
- relicQuery(human,camp)
- end
- function jinjieQuery(human,camp)
- -- 初始化数据
- initDB(human)
- -- 未解锁,返回
- local db = human.db.relic[camp]
- if db.isLock == 1 then
- return
- end
- local nextQuality = db.quality + 1
- local config = RelicExcel.jinjie[nextQuality]
- if not config then
- return
- end
- local msgRet = Msg.gc.GC_RELIC_JINJIE_QUERY
- if config.tupo == 1 then
- local nextTupoLv = db.tupoLv + 1
- if nextTupoLv <= #RelicExcel.tupo then
- config = RelicExcel.tupo[nextTupoLv]
- end
- msgRet.unlockNeed[0] = 1
- HeroLogic.makeUpStarCond(msgRet.unlockNeed[1], config.unlockNeed)
- else
- msgRet.unlockNeed[0] = 0
- end
- msgRet.quality = db.quality
- msgRet.star = db.satr
- msgRet.tupoLv = db.tupoLv
- msgRet.jinbi = config.jinbi
- msgRet.needLv = config.needLv
- msgRet.canJinjie = getJinjieState(human,camp)
- msgRet.canTupo = getTupoState(human,camp)
- local count = 0
- local attrTb = getAttrTb(human,camp)
- for k,v in pairs(attrTb) do
- count = count + 1
- msgRet.attr[count].key = k
- msgRet.attr[count].value = v
- end
- msgRet.attr[0] = count
- local len = #config.item
- for i = 1,len do
- Grid.makeItem(msgRet.item[i],config.item[i][1],config.item[i][2])
- end
- msgRet.item[0] = len
- Msg.send(msgRet,human.fd)
- end
- -- 进阶预览
- function yulanQuery(human,camp)
- local config = RelicExcel.jinjie
- local msgRet = Msg.gc.GC_RELIC_JINJIE_YULAN_QUERY
- local len = #config
- for i = 1,len do
- msgRet.yulan[i].quality = i
- msgRet.yulan[i].desc = config[i].desc
- local attrLen = #RelicExcel.lvup[i].attr[camp]
- for j = 1,attrLen do
- count = count + 1
- local key = RelicExcel.lvup[i].attr[camp][j][1]
- local value = RelicExcel.lvup[i].attr[camp][j][2]
- msgRet.yulan[i].attr[count].key = k
- msgRet.yulan[i].attr[count].value = v
- end
- msgRet.attr[0] = count
- end
- msgRet.yulan[0] = len
- Msg.send(msgRet,human.fd)
- end
- -- 进阶
- function jinjieDo(human,camp)
- -- 初始化数据
- initDB(human)
- -- 未解锁,返回
- local db = human.db.relic[camp]
- if db.isLock == 1 then
- return
- end
- -- 已经是最大阶数
- local nextQuality = db.quality + 1
- local config = RelicExcel.jinjie[nextQuality]
- if not config then
- return
- end
- -- 需要等级不达标
- if db.lv < config.needLv then
- return
- end
- -- 需要突破等级不达标
- if db.tupoLv < config.needTupo then
- return
- end
- -- 检查材料是否足够
- if human.db.jinbi < config.jinbi then
- return Broadcast.sendErr(human, Lang.COMMON_NO_JINBI)
- end
- local len = #config.item
- for i = 1,len do
- if BagLogic.getItemCnt(human, config.item[i][1]) < config.item[i][2] then
- local strName = ItemDefine.getValue(config.item[i][1], "name")
- return Broadcast.sendErr(human, Util.format(Lang.COMMON_NO_ITEM, strName))
- end
- end
-
- -- 扣除材料
- ObjHuman.updateJinbi(human, -config.jinbi, "relic_jinjie")
- for i = 1,len do
- BagLogic.delItem(human, config.item[i][1], config.item[i][2], "relic_jinjie")
- end
- -- 进阶
- db.quality = nextQuality
- db.satr = db.satr + 1
- local len = #config.attrAdd[camp]
- for i = 1,len do
- local key = config.attrAdd[camp][i][1]
- local value = config.attrAdd[camp][i][2]
- db.qualityAttr[key] = db.qualityAttr[key] or 0
- db.qualityAttr[key] = db.qualityAttr[key] + value
- end
- jinjieQuery(human,camp)
- end
- -- 突破
- function tupoDo(human,camp,inputIDList, inputIndexList)
- -- 初始化数据
- initDB(human)
- -- 未解锁,返回
- local db = human.db.relic[camp]
- if db.isLock == 1 then
- return
- end
- -- 已经是最大阶数
- local nextTupoLv = db.tupoLv + 1
- local config = RelicExcel.tupo[nextTupoLv]
- if not config then
- return
- end
- -- 需要品阶不达标
- if db.quality < config.quality then
- return
- end
- -- 检查材料是否足够
- if human.db.jinbi < config.jinbi then
- return Broadcast.sendErr(human, Lang.COMMON_NO_JINBI)
- end
- local len = #config.item
- for i = 1,len do
- if BagLogic.getItemCnt(human, config.item[i][1]) < config.item[i][2] then
- local strName = ItemDefine.getValue(config.item[i][1], "name")
- return Broadcast.sendErr(human, Util.format(Lang.COMMON_NO_ITEM, strName))
- end
- end
-
- if not HechengLogic.checkCond(human, inputIDList, inputIndexList, RelicExcel.unlock[camp].unlockNeed) then
- return
- end
- local fenjieList = FenjieLogic.fenjie(human, FenjieLogic.FENJIE_DO_JUEXING, inputIDList, inputIndexList)
-
- -- 扣除材料
- ObjHuman.updateJinbi(human, -config.jinbi, "relic_jinjie")
- for i = 1,len do
- BagLogic.delItem(human, config.item[i][1], config.item[i][2], "relic_jinjie")
- end
- -- 进阶
- db.tupoLv = nextTupoLv
- db.satr = 0
- local msgRet = Msg.gc.GC_RELIC_TUPO_RETURN
- msgRet.camp = camp
- msgRet.lv = db.tupoLv
- local count = 0
- for k,v in pairs(db.tupoAttr) do
- count = count + 1
- msgRet.befAttr[count].key = k
- msgRet.befAttr[count].value = v
- end
- msgRet.befAttr[0] = count
-
- local len = #config.attrAdd[camp]
- for i = 1,len do
- local key = config.attrAdd[camp][i][1]
- local value = config.attrAdd[camp][i][2]
- db.tupoAttr[key] = db.tupoAttr[key] or 0
- db.tupoAttr[key] = db.tupoAttr[key] + value
- end
- count = 0
- for k,v in pairs(db.tupoAttr) do
- count = count + 1
- msgRet.aftAttr[count].key = k
- msgRet.aftAttr[count].value = v
- end
- msgRet.aftAttr[0] = count
- Msg.send(msgRet,human.fd)
- end
- -- 计算圣器属性
- function doCalcHero(human, grid, attrs)
- if not human then return end
- initDB(human)
-
- local heroConfig = HeroExcel.hero[grid.id]
- local relicCamp = human.db.relic[heroConfig.camp]
- for k,v in pairs(relicCamp.lvAttr) do
- RoleAttr.updateValue(k,v,attrs)
- end
-
- for k,v in pairs(relicCamp.qualityAttr) do
- RoleAttr.updateValue(k,v,attrs)
- end
-
- for k,v in pairs(relicCamp.tupoAttr) do
- RoleAttr.updateValue(k,v,attrs)
- end
- end
|