|
|
@@ -0,0 +1,356 @@
|
|
|
+--秘宝系统
|
|
|
+--[=[
|
|
|
+ db
|
|
|
+ human.db.talismanData =
|
|
|
+ {
|
|
|
+ [ID1] = level,
|
|
|
+ [ID2] = level,
|
|
|
+ }
|
|
|
+]=]--
|
|
|
+local Msg = require("core.Msg")
|
|
|
+local Grid = require("bag.Grid")
|
|
|
+local BagLogic = require("bag.BagLogic")
|
|
|
+local Lang = require("common.Lang")
|
|
|
+local RoleAttr = require("role.RoleAttr")
|
|
|
+local RoleDefine = require("role.RoleDefine")
|
|
|
+local ObjHuman = require("core.ObjHuman")
|
|
|
+local Broadcast = require("broadcast.Broadcast")
|
|
|
+local talismanConfig = require("excel.talisman").talisman
|
|
|
+local HeroConfig = require("excel.hero").hero
|
|
|
+local HuanJingTowerLogic = require("huanjingTower.HuanjingTowerLogic")
|
|
|
+local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
|
|
|
+local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
|
|
|
+
|
|
|
+
|
|
|
+local LOGTYPE = "talisman"
|
|
|
+local COND_TOWER_LEVEL = 100 --开启本系统需要通关恶魔之塔的层数
|
|
|
+
|
|
|
+--秘宝对挂机钻石/情报等其他方面加成标识
|
|
|
+OTHER_EFFECT_TBL = {
|
|
|
+ ["GJ_QB"] = "GJ_QB", --挂机情报类型
|
|
|
+ ["GJ_ZS"] = "GJ_ZS", --挂机钻石类型
|
|
|
+ ["DJ"] = "DJ", --点金
|
|
|
+ ["NW_JB"] = "NW_JB", --女巫森林金币类型
|
|
|
+}
|
|
|
+
|
|
|
+--是否开启本系统
|
|
|
+local function isOpen(human)
|
|
|
+ local towerLevel = HuanJingTowerLogic.getTowerLevel(human)
|
|
|
+ if towerLevel >= COND_TOWER_LEVEL then
|
|
|
+ return true
|
|
|
+ end
|
|
|
+ return false
|
|
|
+end
|
|
|
+
|
|
|
+--取对应类型的秘宝配置
|
|
|
+local function generateCfgByType(type_m)
|
|
|
+ local tbl = {}
|
|
|
+ for id, cfg in pairs(talismanConfig) do
|
|
|
+ if cfg.type == type_m then
|
|
|
+ tbl[id] = cfg
|
|
|
+ tbl[id].id = id
|
|
|
+ end
|
|
|
+ end
|
|
|
+ if not next(tbl) then
|
|
|
+ return nil
|
|
|
+ end
|
|
|
+ return tbl
|
|
|
+end
|
|
|
+
|
|
|
+--填充协议的数据
|
|
|
+local function populateMsg(config, msgTb, nLevel)
|
|
|
+ msgTb.id = config.id
|
|
|
+ msgTb.name = config.name
|
|
|
+ msgTb.iconId = config.iconId
|
|
|
+ msgTb.level = nLevel
|
|
|
+
|
|
|
+ local descVec = msgTb.descVec
|
|
|
+ local effectDescCfg = config.effectDesc
|
|
|
+ descVec[0] = #effectDescCfg
|
|
|
+ for idx, desc in ipairs(effectDescCfg) do
|
|
|
+ local singleDesc = descVec[idx]
|
|
|
+ singleDesc.desc = desc
|
|
|
+ singleDesc.isActivate = nLevel >= idx and 1 or 0
|
|
|
+ end
|
|
|
+
|
|
|
+ if nLevel < config.maxLevel then
|
|
|
+ nLevel = nLevel + 1
|
|
|
+ nLevel = math.ceil(nLevel/3)
|
|
|
+ else
|
|
|
+ nLevel = 0
|
|
|
+ end
|
|
|
+ Grid.makeItem(msgTb.upGradeCost, config.costItemId, nLevel)
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+-- local function send(human, type_m)
|
|
|
+-- local cfg = generateCfgByType(type_m)
|
|
|
+-- if not cfg then
|
|
|
+-- return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
|
|
|
+-- end
|
|
|
+
|
|
|
+-- local msgRet = Msg.gc.GC_TALISMAN_QUERY
|
|
|
+-- msgRet.type = type_m
|
|
|
+-- local talismanVec = msgRet.talismanVec
|
|
|
+-- talismanVec[0] = #cfg
|
|
|
+
|
|
|
+-- local talismanData
|
|
|
+-- if human.db.talismanData and human.db.talismanData[type_m] then
|
|
|
+-- talismanData = human.db.talismanData[type_m]
|
|
|
+-- end
|
|
|
+
|
|
|
+-- local mathCeil = math.ceil
|
|
|
+-- for i = 1, #cfg do
|
|
|
+-- local singleCfg = cfg[i]
|
|
|
+-- local singleTalisman = talismanVec[i]
|
|
|
+
|
|
|
+-- singleTalisman.id = singleCfg.id
|
|
|
+-- singleTalisman.name = singleCfg.name
|
|
|
+-- singleTalisman.iconId = singleCfg.iconId
|
|
|
+
|
|
|
+-- local nLevel = 0
|
|
|
+-- if talismanData and talismanData[singleCfg.id] then
|
|
|
+-- nLevel = talismanData[singleCfg.id]
|
|
|
+-- end
|
|
|
+-- singleTalisman.level = nLevel
|
|
|
+
|
|
|
+-- local descList = singleTalisman.descList
|
|
|
+-- local effectDescCfg = singleCfg.effectDesc
|
|
|
+-- descList[0] = #effectDescCfg
|
|
|
+-- for j = 1, #effectDescCfg do
|
|
|
+-- local singleDesc = descList[j]
|
|
|
+-- singleDesc.desc = effectDescCfg[j]
|
|
|
+-- singleDesc.isActivate = nLevel >= j and 1 or 0
|
|
|
+-- end
|
|
|
+
|
|
|
+-- if nLevel < singleCfg.maxLevel then
|
|
|
+-- nLevel = nLevel + 1
|
|
|
+-- nLevel = mathCeil(nLevel/3)
|
|
|
+-- else
|
|
|
+-- nLevel = 0
|
|
|
+-- end
|
|
|
+-- Grid.makeItem(singleTalisman.upGradeCost, singleCfg.costItemId, nLevel)
|
|
|
+-- end
|
|
|
+-- Msg.send(msgRet, human.fd)
|
|
|
+-- end
|
|
|
+
|
|
|
+--红点判断
|
|
|
+local function dotJudgment(human, cfgHtbl)
|
|
|
+ local talismanData = human.db.talismanData
|
|
|
+ for id, cfg in pairs(cfgHtbl) do
|
|
|
+ local nLevel = 0
|
|
|
+ if talismanData and talismanData[id] then
|
|
|
+ nLevel = talismanData[id]
|
|
|
+ end
|
|
|
+
|
|
|
+ if nLevel < cfg.maxLevel then
|
|
|
+ nLevel = nLevel + 1
|
|
|
+ local costItemCnt = math.ceil(nLevel/3)
|
|
|
+ if BagLogic.getItemCnt(human, cfg.costItemId) >= costItemCnt then
|
|
|
+ return true
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ return false
|
|
|
+end
|
|
|
+
|
|
|
+--GM命令, 设置秘宝等级
|
|
|
+function GmSetlevel(human, id, level)
|
|
|
+ local config = talismanConfig[id]
|
|
|
+ if not config then
|
|
|
+ return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
|
|
|
+ end
|
|
|
+ if level > config.maxLevel then
|
|
|
+ level = config.maxLevel
|
|
|
+ end
|
|
|
+ if level < 0 then
|
|
|
+ level = 0
|
|
|
+ end
|
|
|
+ human.db.talismanData = human.db.talismanData or {}
|
|
|
+ human.db.talismanData[id] = level
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+--秘宝对英雄属性加成
|
|
|
+function doCalcHero(human, heroGrid, addAttrs)
|
|
|
+ if not human or not heroGrid then
|
|
|
+ return
|
|
|
+ end
|
|
|
+
|
|
|
+ local talismanData = human.db.talismanData
|
|
|
+ if not talismanData then
|
|
|
+ return
|
|
|
+ end
|
|
|
+
|
|
|
+ local heroCfg = HeroConfig[heroGrid.id]
|
|
|
+
|
|
|
+ for id, level in pairs(talismanData) do
|
|
|
+ local attrs = talismanConfig[id].attrs
|
|
|
+ for i=1, level do
|
|
|
+ local singleAttr = attrs[i]
|
|
|
+ if #singleAttr == 2 and type(singleAttr[1]) == "number" then --给所有英雄加属性
|
|
|
+ RoleAttr.updateValue(singleAttr[1], singleAttr[2], addAttrs)
|
|
|
+ elseif #singleAttr == 3 then --只给某个种族的英雄加属性
|
|
|
+ if singleAttr[1] == heroCfg.camp then
|
|
|
+ RoleAttr.updateValue(singleAttr[2], singleAttr[3], addAttrs)
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+
|
|
|
+end
|
|
|
+
|
|
|
+--红点
|
|
|
+function isDot(human, dotConfig)
|
|
|
+ if not isOpen(human) then
|
|
|
+ return false
|
|
|
+ end
|
|
|
+ --入口处的红点判断
|
|
|
+ if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2006 then
|
|
|
+ return dotJudgment(human, talismanConfig)
|
|
|
+ else
|
|
|
+ --单个分页的红点
|
|
|
+ local talismanType = 0
|
|
|
+ if dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2007 then
|
|
|
+ talismanType = 1
|
|
|
+ elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2008 then
|
|
|
+ talismanType = 2
|
|
|
+ elseif dotConfig.id == RoleSystemDefine.ROLE_SYS_ID_2009 then
|
|
|
+ talismanType = 3
|
|
|
+ else
|
|
|
+ talismanType = 4
|
|
|
+ end
|
|
|
+
|
|
|
+ local cfgHtbl = generateCfgByType(talismanType)
|
|
|
+ if not cfgHtbl then
|
|
|
+ return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
|
|
|
+ end
|
|
|
+
|
|
|
+ return dotJudgment(human, cfgHtbl)
|
|
|
+ end
|
|
|
+end
|
|
|
+
|
|
|
+--秘宝对其他方面的加成, 如:挂机钻石
|
|
|
+function getTalismanAdd(human, type_m)
|
|
|
+ local addValue = 0
|
|
|
+ local talismanData = human.db.talismanData
|
|
|
+ if not talismanData or not type_m then
|
|
|
+ return addValue
|
|
|
+ end
|
|
|
+
|
|
|
+ for id, level in pairs(talismanData) do
|
|
|
+ local cfg = talismanConfig[id]
|
|
|
+ local attrs = cfg.attrs
|
|
|
+ for i=1,#attrs do
|
|
|
+ local singleAttr = attrs[i]
|
|
|
+ local addType = singleAttr[1]
|
|
|
+ if type(addType) == "string" and level >= i and type_m == addType then
|
|
|
+ addValue = addValue + singleAttr[2]
|
|
|
+ end
|
|
|
+ end
|
|
|
+ end
|
|
|
+ return addValue
|
|
|
+end
|
|
|
+
|
|
|
+
|
|
|
+--查询
|
|
|
+function Query(human, type_m)
|
|
|
+ if not type_m then
|
|
|
+ return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
|
|
|
+ end
|
|
|
+
|
|
|
+ if not isOpen(human) then
|
|
|
+ return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
|
|
|
+ end
|
|
|
+
|
|
|
+ local cfgHtbl = generateCfgByType(type_m)
|
|
|
+ if not cfgHtbl then
|
|
|
+ return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
|
|
|
+ end
|
|
|
+
|
|
|
+ local msgRet = Msg.gc.GC_TALISMAN_QUERY
|
|
|
+ msgRet.type = type_m
|
|
|
+ local talismanVec = msgRet.talismanVec
|
|
|
+
|
|
|
+ local len = 0
|
|
|
+ local talismanData = human.db.talismanData
|
|
|
+ for id, cfg in pairs(cfgHtbl) do
|
|
|
+ len = len + 1
|
|
|
+ local nLevel = 0
|
|
|
+ if talismanData and talismanData[id] then
|
|
|
+ nLevel = talismanData[id]
|
|
|
+ end
|
|
|
+ populateMsg(cfg, talismanVec[len], nLevel)
|
|
|
+ end
|
|
|
+ talismanVec[0] = len
|
|
|
+ Msg.send(msgRet, human.fd)
|
|
|
+end
|
|
|
+
|
|
|
+--升级
|
|
|
+function UpGrade(human, id)
|
|
|
+ if not isOpen(human) then
|
|
|
+ return Broadcast.sendErr(human, Lang.COMMOM_NOT_ENABLED)
|
|
|
+ end
|
|
|
+
|
|
|
+ local singleCfg = talismanConfig[id]
|
|
|
+ if not singleCfg then
|
|
|
+ return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
|
|
|
+ end
|
|
|
+
|
|
|
+ local nLevel = 0
|
|
|
+ local type = singleCfg.type
|
|
|
+
|
|
|
+ --等级判断
|
|
|
+ if human.db.talismanData and human.db.talismanData[id] then
|
|
|
+ nLevel = human.db.talismanData[id]
|
|
|
+ end
|
|
|
+ if nLevel >= singleCfg.maxLevel then
|
|
|
+ return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
|
|
|
+ end
|
|
|
+
|
|
|
+ --道具判断
|
|
|
+ nLevel = nLevel + 1
|
|
|
+ local costItemId = singleCfg.costItemId
|
|
|
+ local costItemCnt = math.ceil(nLevel/3)
|
|
|
+ if BagLogic.getItemCnt(human, costItemId) < costItemCnt then
|
|
|
+ return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
|
|
|
+ end
|
|
|
+ BagLogic.delItem(human, costItemId, costItemCnt, LOGTYPE)
|
|
|
+
|
|
|
+ --更新数据
|
|
|
+ human.db.talismanData = human.db.talismanData or {}
|
|
|
+ human.db.talismanData[id] = nLevel
|
|
|
+
|
|
|
+ --下发数据
|
|
|
+ local msgRet = Msg.gc.GC_TALISMAN_UPGRADE
|
|
|
+ msgRet.type = type
|
|
|
+ populateMsg(singleCfg, msgRet.talismanInfo, nLevel)
|
|
|
+ Msg.send(msgRet, human.fd)
|
|
|
+
|
|
|
+ --重算战力
|
|
|
+ RoleAttr.cleanHeroAttrCache(human)
|
|
|
+ RoleAttr.doCalc(human)
|
|
|
+ ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
|
|
|
+
|
|
|
+ --刷新红点
|
|
|
+ nLevel = nLevel + 1
|
|
|
+ costItemCnt = math.ceil(nLevel/3)
|
|
|
+ if nLevel >= singleCfg.maxLevel or BagLogic.getItemCnt(human, costItemId) < costItemCnt then
|
|
|
+ local dotID = 0
|
|
|
+ if type == 1 then
|
|
|
+ dotID = RoleSystemDefine.ROLE_SYS_ID_2007
|
|
|
+ elseif type == 2 then
|
|
|
+ dotID = RoleSystemDefine.ROLE_SYS_ID_2008
|
|
|
+ elseif type == 3 then
|
|
|
+ dotID = RoleSystemDefine.ROLE_SYS_ID_2009
|
|
|
+ else
|
|
|
+ dotID = RoleSystemDefine.ROLE_SYS_ID_2010
|
|
|
+ end
|
|
|
+
|
|
|
+ --刷新单页
|
|
|
+ RoleSystemLogic.onDot(human, dotID)
|
|
|
+ --刷新入口处
|
|
|
+ RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2006)
|
|
|
+ end
|
|
|
+
|
|
|
+end
|