| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587 |
- -----------------------------------------------------------
- -- 英雄格子相关
- -- createHeroGrid 创建英雄对象
- -- getCacheHeroGrid 获取通用缓存英雄对象
- -- getHeroGridCalcCache 临时计算用的英雄格子
- -- createOthers 有时候要给HeroSimple额外附上一些特殊值,如等级血量等,会用到
- -- makeHeroSimple 根据英雄对象封装英雄信息HeroSimple
- -- makeHeroSimpleByID 根据英雄id封装英雄信息HeroSimple
- -- makeHeroSimpleByMonsterID 根据怪物id封装英雄信息HeroSimple
- -- makeHeroStatic 根据英雄id封装英雄静态信息HeroStatic
- -- makeHeroDynamic 根据英雄对象封装英雄动态信息HeroDynamic
- -- makeHeroDynamicByID 根据英雄id封装英雄动态信息HeroDynamic
- -- makeHeroInfo 根据英雄id封装英雄基础信息
- -- makeMonsterSimpleData 根据怪物id封装
- -- makeHeroNice 封装特殊英雄信息
- -- getMaxQuality 根据星级获取英雄最高品阶
- -- getMaxLv 根据星级和品阶获取英雄最大等级
- -- getHeroBodyById 根据英雄id获取英雄形象body
- -----------------------------------------------------------
- local lua_mongo = _G.lua_mongo
- local Util = require("common.Util")
- local UpNeedExcel = require("excel.upNeed")
- local HeroExcel = require("excel.hero")
- local MonsterExcel = require("excel.monster")
- local ObjHuman = require("core.ObjHuman")
- local RoleDefine = require("role.RoleDefine")
- local HeroDefine = require("hero.HeroDefine")
- local HeroLogic = require("hero.HeroLogic")
- local RoleAttr = require("role.RoleAttr")
- local EquipExcel = require("excel.equip")
- local ItemDefine = require("bag.ItemDefine")
- local BagLogic = require("bag.BagLogic")
- local Grid = require("bag.Grid")
- local SkinLogic = require("skin.SkinLogic")
- local PaomaExcel = require("excel.paoma")
- local UnionTecLogic = require("union.UnionTecLogic")
- local HeroBook = require("hero.HeroBook")
- local XingYaoGongMing = require("xingYaoMen.XingYaoGongMing")
- local FuwenExcel = require("excel.fuwen").fuwen
- local Log = require("common.Log")
- local Json = require("common.Json")
- HERO_GRID_CACHE = HERO_GRID_CACHE or {} -- 为静态英雄数据使用
- HERO_GRID_CACHE_TUJIAN = HERO_GRID_CACHE_TUJIAN or {}
- HERO_LEVELUP_MAXCNT = 5 -- 最多连升x次
- HERO_LEVELUP_MAXLEVEL = 60 -- 从x级开始不能连续升多级
- -- 创建一个英雄grid
- function createHeroGrid(id,star, xlv, mergeHeroAttrs)
- local cf = HeroExcel.hero[id]
- if not cf then
- assert(nil, "not hero id "..id)
- return
- end
-
- local grid = {}
- grid.uuid = lua_mongo.id() --唯一标识
- grid.id = id
- grid.lv = 1 --等级
- -- 星级调整成动态值 dxzeng
- grid.star = star or cf.star --星级 起始星级
- grid.quality = 0 --品质
- grid.zhandouli = 0 --战斗力
- grid.equip = nil --装备 1-6对应6个部位
- grid.shuijingAttrID = nil --水晶随机属性ID
- grid.fuwen = nil --符文 1-2对应2个符文 因为只凭一个id或一个索引无法的到所上符文的详细信息
- grid.bingshu = nil --兵书 [index] = bingshuGrid
- grid.oldLV = nil --星耀共鸣记录旧等级
- grid.oldQuality = nil --星耀共鸣记录旧品质
- grid.xLv = xlv or 0 --x等级 默认0
- grid.mergeHeroAttrs = mergeHeroAttrs or {} --融合英雄的初始属性
- return grid
- end
- -- 初始化的英雄 无添加
- function getCacheHeroGrid(id, star, others)
- if not id then return end
- local cf = HeroExcel.hero[id]
- if not cf then return end
- star = star or cf.star
- local grid = HERO_GRID_CACHE[id] and HERO_GRID_CACHE[id][star] or nil
- if not grid or others then
- if not cf then return end
- local grid = createHeroGrid(id, star)
- if others then
- grid.lv = others.lv and others.lv or grid.lv
- grid.xLv = others.xLv and others.xLv or (grid.xLv or 0)
- grid.quality = others.quality and others.quality or grid.quality
- grid.star = others.star and others.star or grid.star
- end
- grid.attrs = Util.copyTable(RoleAttr.calcHeroGrid(grid))
- grid.zhandouli = grid.attrs[RoleDefine.ZHANDOULI] or 0
- HERO_GRID_CACHE[id] = HERO_GRID_CACHE[id] or {}
- HERO_GRID_CACHE[id][star] = grid
- end
- return HERO_GRID_CACHE[id][star]
- end
- -- 图鉴的英雄,经过美化
- function getCacheHeroGridTujian(id)
- if not id then return end
- local grid = HERO_GRID_CACHE_TUJIAN[id]
- if not grid then
- local cf = HeroExcel.hero[id]
- if not cf then return end
- local grid = createHeroGrid(id,cf.star)
- local maxQuality = getMaxQuality(cf.star)
- grid.lv = getMaxLv(cf.star, maxQuality)
- grid.quality = maxQuality
- -- 星级调整成动态值 dxzeng
- grid.star = cf.star
- grid.attrs = Util.copyTable(RoleAttr.calcHeroGrid(grid))
- grid.zhandouli = grid.attrs[RoleDefine.ZHANDOULI] or 0
- -- 英雄如果有推荐,用推荐
- local scf = HeroExcel.strategy[cf.id]
- local equipLen = scf and #scf.equips or 0
- for i = 1, equipLen do
- grid.equip = grid.equip or {}
- grid.equip[i] = scf.equips[i]
- if i == ItemDefine.EQUIP_SUBTYPE_SHUIJIN then
- grid.shuijingAttrID = scf.shuijing
- end
- end
- HERO_GRID_CACHE_TUJIAN[id] = grid
- end
- return HERO_GRID_CACHE_TUJIAN[id]
- end
- -- 临时用的英雄
- local HERO_GRID_CALC_CACHE = {}
- function getHeroGridCalcCache(grid)
- Util.cleanTable(HERO_GRID_CALC_CACHE)
- Util.copyTableSimple(grid, HERO_GRID_CALC_CACHE)
- return HERO_GRID_CALC_CACHE
- end
- -- 根据id取形象
- function getHeroBodyById(id)
- local cf = HeroExcel.hero[id]
- if not cf then
- return 0
- end
- return cf.body
- end
- -- 获取英雄最高品阶
- function getMaxQuality(star)
- local starConfig = HeroExcel.star[star]
- if not starConfig then return 0 end
- local maxQuality = starConfig.maxQuality
- return maxQuality
- end
- -- 获取英雄最高等级
- function getMaxLv(star, quality)
- local starConfig = HeroExcel.star[star]
- if not starConfig then return 0 end
- if not starConfig.maxLv[quality+1] then
- return starConfig.maxLv[#starConfig.maxLv][2]
- end
- local maxLv = starConfig.maxLv[quality+1][2]
- return maxLv
- end
- -- 获取英雄等级 能达到的最高品阶
- function getMaxQualityByLv(star, lv)
- local maxQuality = getMaxQuality(star)
- local starConfig = HeroExcel.star[star]
- if not starConfig then return 0 end
- local quality = 0
- for i = 1, maxQuality do
- local maxLv = getMaxLv(star, quality)
- if lv >= maxLv then
- quality = i
- else
- break
- end
- end
- return quality <= maxQuality and quality or maxQuality
- end
- -- 额外数据
- local TEMP_OTHERS = {}
- function createOthers(lv, hp, hpMax, star)
- TEMP_OTHERS.lv = lv
- TEMP_OTHERS.hp = hp
- TEMP_OTHERS.hpMax = hpMax
- TEMP_OTHERS.star = star
- TEMP_OTHERS.quality = getMaxQuality(star)
- return TEMP_OTHERS
- end
- -- 封装英雄信息
- function makeHeroSimple(net, grid, index, human, others, tuJian)
- local id = grid and (grid.id or grid.heroID)
- local cf = id and HeroExcel.hero[id]
- local star = grid and grid.star or (cf and cf.star or 1)
- local upStarConfig = HeroDefine.getNextAttrConfig(id, star)
- local jobConfig = cf and cf.job and HeroExcel.job[cf.job]
- local isGongMing = XingYaoGongMing.isGongMing(human, index)
- net.id = id or 0
- net.index = index or 0
- net.uuid = grid and grid.uuid or ""
- net.gl = cf and cf.gl or 0
- net.camp = cf and cf.camp or 0
- net.job = cf and cf.job or 0
- net.star = others and others.star or star --cf and cf.star or 0 星级调整 dxzeng
- net.icon = grid and grid.head or (cf and cf.head or 0)
- net.body = grid and grid.body or (cf and cf.body or 0)
- if grid and human and index then -- todo 皮肤这个以后可能还是需要继续整理
- local skinConf = SkinLogic.getHeroSkin(human, index)
- if skinConf then
- net.icon = skinConf.head
- net.body = skinConf.body
- end
- end
- net.up = upStarConfig == nil and 0 or 1 --是否能够升星
- net.lv = others and others.lv or (grid and grid.lv or 1)
- net.xLv = others and others.xLv or (grid and grid.xLv or 0)
- net.zhandouli = grid and grid.zhandouli or 0
- net.quality = grid and grid.quality or 0
- net.isLock = (grid and grid.isLock) and 1 or 0
- net.hp = others and others.hp or 0
- net.hpMax = others and others.hpMax or 0
- net.cnt = others and others.cnt or 1
- net.isget = HeroBook.isGetHero(human, id) or 0
- net.weightLv = cf and cf.grade or 0
- net.name = cf and cf.name or ""
- net.grade = cf and cf.grade or 0
- net.jobDesc = jobConfig and jobConfig.desc or ""
- net.label = cf and cf.label or ""
- net.order = cf and cf.order or 0
- net.isGongMing = isGongMing or 0
-
-
- --是否发送图鉴信息
- net.general[0] = 0
- if tuJian then
- local tj = HeroExcel.tujian[id]
- if tj ~= nil then
- net.general[0] = 1
- net.general[1].cm = tj.cm or 0
- net.general[1].kg = tj.kg or 0
- net.general[1].age = tj.age or 0
- net.general[1].cup = tj.cup or ""
- net.general[1].character = tj.character or ""
- net.general[1].interest = tj.interest or ""
- net.general[1].desc = tj.desc or ""
- end
- end
- end
- -- 封装英雄信息装备符文
- function fontHeroDetailInfo(net, grid, index, human, others, tuJian)
- makeHeroSimple(net,grid, index, human, others, tuJian)
- net.equips = grid.equip or {}
- for k,v in pairs(net.equips) do
- if next(v) then
- v.name = EquipExcel.equip[v.id].name
- end
- end
- net.fuWens = grid.fuwen or {}
- for k,v in pairs(net.fuWens) do
- if next(v) then
- v.name = FuwenExcel[v.id].name
- end
- end
- end
- -- 根据英雄id封装英雄信息heroSimple
- function makeHeroOrMonster(net, id, index, others, human,tujian)
- local grid = getCacheHeroGrid(id)
- if not grid then
- makeHeroSimpleByMonsterID(net, id, others)
- else
- makeHeroSimple(net, grid, index, human, others,tujian)
- end
- end
- -- 根据英雄id封装英雄信息heroSimple
- function makeHeroSimpleByID(net, id, index, others, human, tujian)
- local star = others and others.star or nil
- local grid = getCacheHeroGrid(id, star, others)
- makeHeroSimple(net, grid, index, human, others,tujian)
- end
- -- 根据怪物id封装英雄信息
- function makeHeroSimpleByMonsterID(net, id, others)
- makeHeroSimpleByID(net, nil, nil, others)
- local mcf = MonsterExcel.monster[id]
- if not mcf then return end
- net.id = id
- net.camp = mcf.camp
- net.job = mcf.job
- net.star = mcf.star
- net.icon = mcf.head
- net.body = mcf.body
- net.lv = others and others.lv or 1
- net.hp = others and others.hp or 0
- net.hpMax = others and others.hpMax or 0
- end
- function makeHeroSimpleByGeneral(net, id)
- local tj = HeroExcel.tujian[id]
- if tj ~= nil then
- net.general[0] = 1
- net.general[1].cm = tj.cm or 0
- net.general[1].kg = tj.kg or 0
- net.general[1].age = tj.age or 0
- net.general[1].cup = tj.cup or ""
- net.general[1].character = tj.character or ""
- net.general[1].interest = tj.interest or ""
- net.general[1].desc = tj.desc or ""
- end
- end
- function makeHeroNice(net, id, cnt, isNew, index)
- net.itemData[0] = 0
- net.heroSimple[0] = 0
- net.heroStatic[0] = 0
- if cnt then
- net.itemData[0] = 1
- Grid.makeItem(net.itemData[1], id, cnt)
- end
- local heroConfig = HeroExcel.hero[id]
- local specialConfig = HeroExcel.specialHero[id]
- if heroConfig then
- net.heroSimple[0] = 1
- makeHeroSimpleByID(net.heroSimple[1], id, index)
- net.heroStatic[0] = 1
- makeHeroStatic(net.heroStatic[1], id)
- end
- net.body = specialConfig and (heroConfig and heroConfig.body or 0) or 0
- net.isNew = isNew and 1 or 0
- net.weightLv = heroConfig and heroConfig.grade or 0
- net.attrs[0] = 0
- net.attrsMax[0] = 0
- net.bubble = ""
- if heroConfig then
- local bubble = PaomaExcel.bubble[heroConfig.id]
- net.bubble = bubble and bubble.drawCard or ""
- local heroGrid = getCacheHeroGridTujian(id)
- for key = RoleDefine.ATK, RoleDefine.SPEED do
- local value = heroGrid.attrs[key]
- net.attrs[0] = net.attrs[0] + 1
- net.attrs[net.attrs[0]].key = key
- net.attrs[net.attrs[0]].value = value
- net.attrsMax[0] = net.attrsMax[0] + 1
- net.attrsMax[net.attrsMax[0]].key = key
- net.attrsMax[net.attrsMax[0]].value = HeroDefine.getTujianMaxValue(key)
- end
- end
- end
- -- 填充英雄详细信息:静态
- function makeHeroStatic(net, id, tuJian)
- local cf = id and HeroExcel.hero[id]
- if not cf then
- net.id=0
- net.name =""
- net.body =0
- net.job = 0
- net.weightLv=0
- net.normalAtkID=0
- net.skillList[0]=0
- net.beSkill[0]=0
- net.skin=0
- return
- end
- local star = cf.star
- if tuJian and tuJian == 1 then
- local tuJianConfig = HeroExcel.tujian[id]
- if tuJianConfig then
- local maxStarIndex = #tuJianConfig.star
- star = tuJianConfig.star[maxStarIndex]
- end
- end
- net.id = id
- net.name = cf.name
- net.body = cf.body
- net.job = cf.job
- net.weightLv = cf.grade
-
- local attrConfig = HeroDefine.getAttrConfig(id, star)
- net.normalAtkID = attrConfig.normalAtkID
- net.skillList[0] = #attrConfig.skillList
- for i = 1, net.skillList[0] do
- HeroLogic.makeSkillNet(net.skillList[i], attrConfig.skillList[i])
- end
- net.beSkill[0] = #attrConfig.beSkillList
- for i = 1, net.beSkill[0] do
- HeroLogic.makeSkillNet(net.beSkill[i], attrConfig.beSkillList[i])
- end
- net.skin = #cf.skin > 0 and 1 or 0
- end
- -- 最多连续升x级
- function getLevelUpCnt(human, nowLv, maxLv)
- local cnt = 0
- local needJinbi = 0
- local needItemCnt = 0
- if human and human.db and human.db.bag then
- local bagItemCnt = BagLogic.getItemCnt(human, ItemDefine.ITEM_GREEN_EXP_ID)
- local bagJinbi = human.db.jinbi
- for i = 1, HERO_LEVELUP_MAXCNT do
- local nextLv = nowLv + i
- local upcf = UpNeedExcel.upLv[nextLv]
- if not upcf then break end
- if nextLv > maxLv then break end
- if i > 1 then
- if (needJinbi + upcf.money > bagJinbi) or
- (needItemCnt + upcf.soul > bagItemCnt) then
- break
- end
- end
- cnt = cnt + 1
- needJinbi = needJinbi + upcf.money
- needItemCnt = needItemCnt + upcf.soul
- if nowLv >= HERO_LEVELUP_MAXLEVEL then
- break -- 小于一定等级不能连升
- end
- end
- end
- return cnt, needJinbi, needItemCnt
- end
- -- 填充英雄详细信息:动态
- function makeHeroDynamic(net, grid, index, human)
- local id = grid and grid.id
- local cf = id and HeroExcel.hero[id]
- local lv = grid and grid.lv or 1
- local xLv = grid and grid.xLv or 0
- local star = grid and grid.star or 1 -- 星级调整成动态值 dxzeng --cf and cf.star or 0
- local quality = grid and grid.quality or 0
- local maxLv = getMaxLv(star, quality)
- -- 最大品阶
- net.maxQuality = getMaxQuality(star)
- net.id = id or 0
- net.lv = lv
- net.xLv = xLv
- net.uuid = grid and grid.uuid or ""
- net.head = cf and cf.head or 0
- net.quality = quality
- net.maxLv = maxLv
- net.techLv = human and UnionTecLogic.getTechLvByJob(human, cf.job) or 0
- net.star = star
- net.upLv = 0
- if lv >= maxLv then -- 升阶
- local upcf = quality < getMaxQuality(star) and UpNeedExcel.upQuality[quality + 1]
- net.upLvJinbi = upcf and upcf.money or 0
- net.upLvSoul = upcf and upcf.jinjieshi or 0
- else -- 升级
- if grid and human and index then
- net.upLv, net.upLvJinbi, net.upLvSoul = getLevelUpCnt(human, lv, maxLv)
- else
- local upcf = UpNeedExcel.upLv[lv + 1]
- net.upLvJinbi = upcf and upcf.money or 0
- net.upLvSoul = upcf and upcf.soul or 0
- end
- end
-
- net.skin[0] = 0
- if grid and human and index then -- todo 皮肤这个以后可能还是需要继续整理
- local skinConf, skinSkillConf = SkinLogic.getHeroSkin(human, index)
- if skinConf then
- net.head = skinConf.head
- net.skin[0] = 1 -- 皮肤技能相关
- local skinNet = net.skin[1]
- skinNet.name = skinConf.name
- skinNet.body = skinConf.body
- skinNet.normalAtkID = skinSkillConf.normalAtkID
-
- skinNet.skillList[0] = #skinSkillConf.skillList
- for i = 1, skinNet.skillList[0] do
- HeroLogic.makeSkillNet(skinNet.skillList[i], skinSkillConf.skillList[i])
- end
- skinNet.beSkill[0] = #skinSkillConf.beSkillID
- for i = 1, skinNet.beSkill[0] do
- HeroLogic.makeSkillNet(skinNet.beSkill[i], skinSkillConf.beSkillID[i])
- end
- end
- end
- -- 技能变更
- net.skillList[0] = 0
- net.beSkill[0] = 0
- if grid and grid.star ~= cf.star then
- local attrConfig = HeroDefine.getAttrConfig(id, grid.star)
- net.skillList[0] = #attrConfig.skillList
- for i = 1, net.skillList[0] do
- HeroLogic.makeSkillNet(net.skillList[i], attrConfig.skillList[i])
- end
-
- net.beSkill[0] = #attrConfig.beSkillList
- for i = 1, net.beSkill[0] do
- HeroLogic.makeSkillNet(net.beSkill[i], attrConfig.beSkillList[i])
- end
- end
-
- local attrs = nil
- if human and index then
- attrs = ObjHuman.getHeroAttrs(human, index)
- elseif grid and grid.attrs then
- attrs = grid.attrs
- end
- net.attrs[0] = 0
- if attrs then
- for key, value in pairs(attrs)do
- -- print(" net.attrs[0] ", net.attrs[0], key)
- if RoleDefine.isPanelAttr(key) or RoleDefine.isPingFenAttr(key) then
- net.attrs[0] = net.attrs[0] + 1
- net.attrs[net.attrs[0]].key = key
- net.attrs[net.attrs[0]].value = value
- end
- end
- end
- net.zhandouli = grid and grid.zhandouli or 0
- end
- -- 根据英雄id填充动态信息
- function makeHeroDynamicByID(net, id,star)
- local grid = getCacheHeroGrid(id,star)
- makeHeroDynamic(net, grid)
- end
- --
- function makeHeroInfo(net, grid)
- local id = grid and grid.id
- local cf = id and HeroExcel.hero[id]
- net.id = id or 0
- net.camp = cf and cf.camp or 0
- net.icon = cf and cf.head or 0
- net.lv = grid and grid.lv or 0
- net.star = grid and grid.star or 0
- net.label = cf and cf.label or ""
- end
- function makeMonsterSimpleData(net, id, lv)
- local mcf = MonsterExcel.monster[id]
- if not mcf then return end
- net.id = id or 0
- net.icon = mcf.head
- net.lv = lv or 1
- net.camp = mcf.camp
- net.star = mcf.star
- net.label = mcf and mcf.label or ""
- return true
- end
- function getMonsterOutIDBody(id)
- local monsterOutConfig = MonsterExcel.monsterOut[id]
- if not monsterOutConfig then return 0 end
- local monsterID = monsterOutConfig.member[1][1]
- local monsterConfig = MonsterExcel.monster[monsterID]
- if not monsterConfig then return 0 end
- return monsterConfig.body
- end
|