| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226 |
- -- 宝石相关逻辑
- local Lang = require("common.Lang")
- local Msg = require("core.Msg")
- local BagLogic = require("bag.BagLogic")
- local LogDefine = require("common.LogDefine")
- local HeroLogic = require("hero.HeroLogic")
- local ObjHuman = require("core.ObjHuman")
- local HeroExcel = require("excel.hero")
- local Grid = require("bag.Grid")
- local Util = require("common.Util")
- local HeroDefine = require("hero.HeroDefine")
- --宝石最大等级
- local MAXGEMLEVEL = 10
- --一级宝石对普通装备基础属性的加成
- local BASEBONUS = 0.05
- -- 一级宝石对戒指、护符基础属性的加成
- local SPE_EQUIP_BASEBONUS = 0.05
- -- 一级宝石对戒指、护符套装属性的加成
- local SPE_EQUIP_SUITBONUS = 0.001
- --一级宝石对装备套装效果的加成,key为套装,value为加成比例
- local GEMTOEQUIPATTR = {
- [2] = 0.0025,
- [3] = 0.0025,
- [4] = 0.0025
- }
- --local inlayLog = "inlayGem"
- local upgradeLog = "upgradeGem"
- --组装下发给客户端的宝石数据
- function assembleData(sourceTb, targetTb, job, pos)
- --只生成单个数据
- local jobToGem = HeroDefine.HEROJOBTOGEM
- if pos then
- if sourceTb[pos] then
- targetTb.id = job and jobToGem[job] or 0
- targetTb.pos = pos
- targetTb.lv = sourceTb[pos].lv
- targetTb.maxLv = MAXGEMLEVEL
- if targetTb.lv < MAXGEMLEVEL then
- targetTb.upcost = math.ceil((targetTb.lv + 1) / 3 )
- else
- targetTb.upcost = 0 --宝石达到最高级时,消耗数量为0
- end
- else
- targetTb.id = job and jobToGem[job] or 0
- targetTb.pos = pos
- targetTb.lv = 0
- targetTb.maxLv = MAXGEMLEVEL
- targetTb.upcost = math.ceil(1 / 3 )
- end
- return
- end
- --所有数据
- for i = 1, HeroDefine.HEROGEMMAX do
- if sourceTb and sourceTb[i] then
- local lv = sourceTb[i].lv
- targetTb[i] = {
- id = job and jobToGem[job] or 0,
- pos = sourceTb[i].pos,
- lv = lv,
- maxLv = MAXGEMLEVEL,
- }
- if lv < MAXGEMLEVEL then
- targetTb[i].upcost = math.ceil((lv + 1) / 3 )
- else
- targetTb[i].upcost = 0 --宝石达到最高级时,消耗数量为0
- end
- else
- targetTb[i] = {
- id = job and jobToGem[job] or 0,
- pos = i,
- lv = 0,
- maxLv = MAXGEMLEVEL,
- }
- targetTb[i].upcost = math.ceil( 1/ 3 )
- end
- end
- end
- --宝石对装备加成
- --规则:只要有镶嵌宝石,那么就能对1-4孔位上装备的基础属性,装备套装效果有加成。
- function suitAttrBonus(heroGrid)
- local gemData = heroGrid.gem
- if not gemData then
- return
- end
- local sumLevel = 0
- for _, v in pairs(gemData) do
- sumLevel = sumLevel + v.lv
- end
-
- if sumLevel > 0 then
- local t = {}
- for k, v in pairs(GEMTOEQUIPATTR) do
- t[k] = v * sumLevel
- end
- --基础属性
- t.base = BASEBONUS * sumLevel
- -- 戒指, 护符加成
- t.sp_base = SPE_EQUIP_BASEBONUS * sumLevel
- t.sp_suit = SPE_EQUIP_SUITBONUS * sumLevel
- return t
- end
- end
- --获取宝石数据,以ItemData格式下发
- function getGemData(human, heroID, heroIndex, pos)
- --位置是否超出装备位置
- if not pos or pos > HeroDefine.HEROGEMMAX then
- return
- end
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return
- end
-
- local heroCfg = HeroExcel.hero[heroID]
- if not heroCfg or not heroCfg.job then
- return
- end
- local itemId = HeroDefine.HEROJOBTOGEM[heroCfg.job]
- local itemCnt = 1
-
- --下发客户端
- local msgRet = Msg.gc.GC_HERO_GEM_LEVELUP_QUERY
- Grid.makeItem(msgRet.list, itemId, itemCnt)
- Msg.send(msgRet, human.fd)
- end
- --升级宝石
- function upgradeGem(human, heroID, heroIndex, pos)
- --位置是否超出装备位置
- if not pos or pos > HeroDefine.HEROGEMMAX then
- return
- end
- local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
- if not heroGrid then
- return
- end
- --有没有穿装备
- if not heroGrid.equip or not heroGrid.equip[pos] then
- return
- end
- local heroCfg = HeroExcel.hero[heroID]
- if not heroCfg or not heroCfg.job then
- return
- end
-
- local itemId = HeroDefine.HEROJOBTOGEM[heroCfg.job]
- if not itemId then
- return
- end
- --英雄数据中没有宝石那就是镶嵌操作
- local isGen = true
- local lv = 0
- local gemData = heroGrid.gem or {}
- if gemData[pos] then
- lv = gemData[pos].lv
- isGen = false
- end
- --已经最高级
- if lv == MAXGEMLEVEL then
- return
- end
-
- lv = lv + 1
- local itemCnt = math.ceil(lv / 3)
- --宝石数量是否足够
- if not BagLogic.checkItemCnt(human, itemId, itemCnt) then
- return
- end
- --扣除道具
- BagLogic.delItem(human, itemId, itemCnt, upgradeLog)
- --更新数据
- if isGen then
- gemData[pos] = {
- pos = pos,
- lv = lv,
- }
- heroGrid.gem = gemData
- else
- gemData[pos].lv = lv
- end
-
- ObjHuman.doCalcHero(human, heroIndex)
- HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
- HeroLogic.refreshDot(human, heroGrid.uuid)
- --通知客户端
- local msgRet = Msg.gc.GC_HERO_GEM_UPGRADEGEM
- -- msgRet.gemData[0] = HeroDefine.HEROGEMMAX
- assembleData(gemData, msgRet.gemData, heroCfg.job, pos)
- Msg.send(msgRet, human.fd)
- --更新宝石加成
- local queryFunc = require("hero.HeroEquip").query
- queryFunc(human, heroID, heroIndex)
- end
|