gitxsm 3 месяцев назад
Родитель
Сommit
592cf24a83

+ 9 - 1
script/common/Lang.lua

@@ -860,4 +860,12 @@ LOST_HAS_ONECLICKSWEEP = [[已经一键扫荡过]]
 BG_MATCHLIST_ERR = [[匹配列表中未找到该对手]]
 BG_COMBAT_TYPE_ERR = [[战斗类型错误]]
 BG_CONDITION_ERR = [[挑战次数或挑战券不足]]
-BG_FREECNT_NOT_ENOUGH = [[免费次数不足]]
+BG_FREECNT_NOT_ENOUGH = [[免费次数不足]]
+
+
+--------------------------英雄天元系统-------------------------
+HERO_TY_POINT_MAX = [[已点亮所有天元点, 请先提升天元重数]]
+
+HERO_TY_POINT_NOT_ENOUGH = [[请先点亮天元点]]
+
+HERO_TY_STAGE_MAX = [[天元重数已达最高]]

+ 1 - 1
script/common/LogDefine.lua

@@ -315,7 +315,7 @@ DEFINE = {
 	anotherWorldBattleTreasure = 777,		-- 异界寻宝
 	AnotherWorldBattleNS 	= 778,			-- 异界之战
 	ServerCommerceActBattleGround 	= 779,  -- 巅峰战场
-
+	HeroTianYuan 			= 780,  		-- 英雄天元系统
 
 	errHandle				= 99999,		-- 异常处理
 }

+ 5 - 3
script/common/ProtoID.lua

@@ -1736,7 +1736,6 @@ _ENV[1776]="GC_ZHUANPAN_ONCE_REWARD_QUERY"
 _ENV[1777]="CG_ZHUANPAN_ONCE_REWARD_GET"
 _ENV[1778]="CG_ALL_HERO_BOOK_QUERY"
 _ENV[1779]="GC_ALL_HERO_BOOK_QUERY"
-
 _ENV[1781]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_MAINPAGE_QUERY"
 _ENV[1782]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_MAINPAGE_QUERY"
 _ENV[1783]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_MATCHLIST_QUERY"
@@ -1751,7 +1750,10 @@ _ENV[1791]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANKAWARD_QUERY"
 _ENV[1792]="GC_SERVEERCOMMERCE_ACT_BATTLEGROUND_RANKAWARD_QUERY"
 _ENV[1793]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_UPDATE_MATCHLIST"
 _ENV[1794]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_ONECLICK_SWEEP"
-
 _ENV[1795]="GC_AB_TIPS"
-
 _ENV[1796]="CG_SERVEERCOMMERCE_ACT_BATTLEGROUND_ALREAFY_KNOW"
+
+_ENV[1797]="CG_HEROTY_QUERY"
+_ENV[1798]="GC_HEROTY_QUERY"
+_ENV[1799]="CG_HEROTY_POINT_UPGRADE"
+_ENV[1800]="CG_HEROTY_STAGE_UPGRADE"

+ 16 - 0
script/module/hero/Handler.lua

@@ -8,6 +8,7 @@ local HeroGem = require("hero.HeroGem")
 local HeroExclusiveWeapon = require("hero.HeroExclusiveWeapon")
 local HeroPubLogic = require("hero.HeroPubLogic")
 local HeroSeed = require("hero.HeroSeed")
+local HeroTianYuan = require("hero.HeroTianYuan")
 
 -- 请求英雄详细信息:静态
 function CG_HERO_BAG_STATIC(human,msg)
@@ -290,4 +291,19 @@ function CG_HEROSEED_UPGRADE(human, msg)
     HeroSeed.HeroSeed_UpGrade(human, msg.heroID, msg.heroIndex, msg.seedIdx, msg.opType)
 end
 
+---------------------------------------------------------------------------------------------
+
+---------------------------------------英雄天元系统-----------------------------------------------
+function CG_HEROTY_QUERY(human, msg)
+    HeroTianYuan.HeroTianYuan_Query(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROTY_POINT_UPGRADE(human, msg)
+    HeroTianYuan.HeroTianYuan_PointUpGrade(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROTY_STAGE_UPGRADE(human, msg)
+    HeroTianYuan.HeroTianYuan_StageUpGrade(human, msg.heroID, msg.heroIndex)
+end
+
 ---------------------------------------------------------------------------------------------

+ 31 - 0
script/module/hero/HeroLogic.lua

@@ -77,6 +77,7 @@ local Abs365CardLogic = require("absAct.Abs365CardLogic")
 local HeroSeed = require("hero.HeroSeed")
 local DeleteHeroConfig = require("excel.delteHero")
 local AnotherWorldBattleNS = require("anotherWorldBattle.AnotherWorldBattleNS")
+local HeroTianYuan = require("hero.HeroTianYuan")
 
 
 HERO_MAX_STAR    =        15    -- 目前英雄最大星级
@@ -441,6 +442,8 @@ function sendHeroGridDynamic(human, heroGrid, index, isQuery)
     msgRet.canJueXing = isHeroJuexingDot(human, index, heroGrid) == true and 1 or 0
 	msgRet.canWeapon = HeroExclusiveWeapon.isWeaponDot(human, heroGrid) == true and 1 or 0
 	msgRet.canSeed = HeroSeed.isSeedDot(human, heroGrid) == true and 1 or 0
+	msgRet.canTianYuan = HeroTianYuan.isTianYuanDot(human, heroGrid) == true and 1 or 0
+
 	local bingShuState = BingshuLogic.isBingShuDot(human, heroGrid)
 	if bingShuState == -1 then
 		msgRet.canBingShu = -1 
@@ -1630,6 +1633,18 @@ function sendHuituiQuery(human, heroID, heroIndex)
 		end
 	end
 
+	local tianYuanReturnItem = HeroTianYuan.CalcReturnItem(human, heroGrid)
+		if tianYuanReturnItem then
+		for itemId, itemCnt in pairs(tianYuanReturnItem) do
+			if msgRet.returnItems[0] >= #msgRet.returnItems then
+				break
+			end
+			
+			msgRet.returnItems[0] = msgRet.returnItems[0] + 1
+			Grid.makeItem(msgRet.returnItems[msgRet.returnItems[0]], itemId, itemCnt)
+		end
+	end
+
 	msgRet.returnHeros[0] = 0
 	for star, v in pairs(heros) do
         local rHeroID = v[1]
@@ -1708,6 +1723,17 @@ function huituiHero(human, heroID, heroIndex)
 		HeroSeed.ResetSeedLv(human, heroGrid)
 	end
 
+	-- 英雄天元返还材料
+	local tianYuanReturnItem = HeroTianYuan.CalcReturnItem(human, heroGrid)
+	if tianYuanReturnItem then
+		for itemId, itemCnt in pairs(tianYuanReturnItem) do
+			items[itemId] = (items[itemId] or 0) + itemCnt
+		end
+
+		-- 重置英雄天元数据
+		HeroTianYuan.ResetTianYuanData(human, heroGrid)
+	end
+
 
 	heroGrid.star = star
 	heroGrid.lv = targetLv
@@ -2048,6 +2074,11 @@ function isHeroDot(human, heroGrid)
 		return true
 	end
 
+	-- 英雄天元
+	if HeroTianYuan.isTianYuanDot(human, heroGrid) then
+		return true
+	end
+
 end
 
 -- 升级判定

+ 357 - 0
script/module/hero/HeroTianYuan.lua

@@ -0,0 +1,357 @@
+-- 天元系统
+
+local Lang = require("common.Lang")
+local Msg = require("core.Msg")
+local BagLogic = require("bag.BagLogic")
+local HeroLogic = require("hero.HeroLogic")
+local ObjHuman = require("core.ObjHuman")
+local Grid = require("bag.Grid")
+local RoleAttr = require("role.RoleAttr")
+local HeroTianYuanCfg = require("excel.heroTianYuan")
+local Broadcast = require("broadcast.Broadcast")
+local RoleDefine = require("role.RoleDefine")
+
+
+local LOGTAG = "HeroTianYuan" --日志标识
+
+
+local function initData(heroGrid)
+    heroGrid.tianYuanData = {
+        pointIdx = 0,
+        stage = 0,
+    }
+end
+
+local function updateData(heroGrid, newPointIdx, newStage)
+    if not heroGrid.tianYuanData then
+        initData(heroGrid)
+    end
+
+    if newPointIdx then
+        heroGrid.tianYuanData.pointIdx = newPointIdx
+    end
+
+    if newStage then
+        heroGrid.tianYuanData.stage = newStage
+    end
+end
+
+
+
+-- 系统开启条件检查
+local function openCheck(human, heroID, heroIndex)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    local varCfg = HeroTianYuanCfg.var[1]
+    if heroGrid.star < varCfg.unLockCondStar then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    return true
+end
+
+-- 获取正确的消耗道具信息
+local function getTargetItem(nowStage, nowPointIdx, maxStage)
+    local varCfg = HeroTianYuanCfg.var[1]
+    local targetStageCfgIdx = nowStage
+
+    local item
+    if nowPointIdx < varCfg.pointMaxNum then
+        if targetStageCfgIdx <= 0 then
+            targetStageCfgIdx = 1
+        end
+
+        item = HeroTianYuanCfg.upGrade[targetStageCfgIdx].pointCost[1]
+    else
+        targetStageCfgIdx = math.min((targetStageCfgIdx+1), maxStage)
+
+        item = HeroTianYuanCfg.upGrade[targetStageCfgIdx].stageCost[1]
+    end
+
+    return item
+end
+
+local function transformData(targetList, sourceArr, mul)
+    mul = mul or 1
+    for _, tb in ipairs(sourceArr) do
+        local id = tb[1]
+        local val = tb[2]
+        targetList[id] = (targetList[id] or 0) + val * mul
+    end
+end
+
+-- 统计数据, dataType: 1-加成属性, 2-消耗道具
+local function calcData(nowStage, nowPointIdx, dataType)
+    if nowStage <= 0 and nowPointIdx <= 0 then
+        return
+    end
+
+    local dataList = {}
+    local maxPointNum = HeroTianYuanCfg.var[1].pointMaxNum
+
+    for i = 1, nowStage do
+        local cfg = HeroTianYuanCfg.upGrade[i]
+        local sourceData = cfg.pointCost
+
+        -- 天元点
+        local pointNum = 0
+        if i == nowStage and nowPointIdx > 0 then
+            pointNum = nowPointIdx
+        elseif i ~= nowStage then
+            pointNum = maxPointNum
+        end
+
+        if pointNum > 0 then
+            if dataType == 1 then
+                sourceData = cfg.pointAttrs
+            end
+            transformData(dataList, sourceData, pointNum)
+        end
+
+        -- 天元突破
+        sourceData = cfg.stageCost
+        if dataType == 1 then
+            sourceData = cfg.stageAttrs
+        end
+        transformData(dataList, sourceData)
+    end
+
+    -- 0 ~ 1重的天元点
+    local pointNum = nowPointIdx
+    if nowStage >= 1 then
+        pointNum = maxPointNum
+    end
+
+    local stageOneCfg = HeroTianYuanCfg.upGrade[1]
+    local sourceData = stageOneCfg.pointCost
+    if dataType == 1 then
+        sourceData = stageOneCfg.pointAttrs
+    end
+    transformData(dataList, sourceData, pointNum)
+
+    return dataList
+end
+
+-- 更新战力
+local function updatePower(human, heroID, heroIndex)
+    RoleAttr.cleanHeroAttrCache(human)
+    RoleAttr.doCalc(human)
+    HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
+    ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
+end
+
+
+
+-- 英雄天元红点检测
+function isTianYuanDot(human, heroGrid)
+    local varCfg = HeroTianYuanCfg.var[1]
+    if heroGrid.star < varCfg.unLockCondStar then
+        return false
+    end
+
+    local tianYuanData = heroGrid.tianYuanData
+    local nowPointIdx = tianYuanData and tianYuanData.pointIdx or 0
+    local nowStage = tianYuanData and tianYuanData.stage or 0
+    local maxStage = #HeroTianYuanCfg.upGrade
+
+    if nowStage >= maxStage and nowPointIdx >= varCfg.pointMaxNum then
+        return false
+    end
+
+    local item = getTargetItem(nowStage, nowPointIdx, maxStage)
+    if BagLogic.getItemCnt(human, item[1]) < item[2] then
+        return false
+    end
+
+    return true
+end
+
+-- 计算返还材料
+function CalcReturnItem(human, heroGrid)
+    if not heroGrid or not heroGrid.tianYuanData then
+        return
+    end
+
+    local nowStage = heroGrid.tianYuanData.stage or 0
+    local nowPointIdx = heroGrid.tianYuanData.pointIdx or 0
+    local itemList = calcData(nowStage, nowPointIdx, 2)
+
+    return itemList
+end
+
+-- 重置英雄天元数据
+function ResetTianYuanData(human, heroGrid)
+    if not heroGrid or not heroGrid.tianYuanData then
+        return
+    end
+
+    heroGrid.tianYuanData = nil
+end
+
+-- 英雄天元加成
+function doCalcHero(human, heroGrid, tatgetAttrs)
+    if not heroGrid or not heroGrid.tianYuanData then
+        return
+    end
+
+    local nowStage = heroGrid.tianYuanData.stage or 0
+    local nowPointIdx = heroGrid.tianYuanData.pointIdx or 0
+    local sourceAttrs = calcData(nowStage, nowPointIdx, 1)
+
+    for attrId, attrVal in pairs(sourceAttrs or {}) do
+        RoleAttr.updateValue(attrId, attrVal, tatgetAttrs)
+    end
+end
+
+
+
+-- 查询英雄天元信息
+function HeroTianYuan_Query(human, heroID, heroIndex)
+    local res = openCheck(human, heroID, heroIndex)
+    if res ~= true then
+        return
+    end
+
+
+    local upGradeCfg = HeroTianYuanCfg.upGrade
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    local tianYuanData = heroGrid.tianYuanData
+    local nowPointIdx = tianYuanData and tianYuanData.pointIdx or 0
+    local nowStage = tianYuanData and tianYuanData.stage or 0
+
+    local msgRet = Msg.gc.GC_HEROTY_QUERY
+    msgRet.pointIdx = nowPointIdx
+    msgRet.stageIdx = nowStage
+    msgRet.stageMax = #upGradeCfg
+
+
+    -- 消耗
+    local itemTb = getTargetItem(nowStage, nowPointIdx, msgRet.stageMax)
+    local itemId, itemCnt = itemTb[1], itemTb[2]
+    if nowStage >= msgRet.stageMax then
+        itemCnt = 0
+    end
+    Grid.makeItem(msgRet.cost, itemId, itemCnt)
+
+
+    -- 总加成属性
+    msgRet.attrs[0] = 0
+    local attrs =  calcData(nowStage, nowPointIdx, 1)
+    if attrs then
+        local len = 0
+        for attrId, attrVal in pairs(attrs) do
+            len = len + 1
+            msgRet.attrs[0] = len
+            msgRet.attrs[len].key = attrId
+            msgRet.attrs[len].value = attrVal
+        end
+    end
+
+    Msg.send(msgRet, human.fd)
+end
+
+-- 请求点亮天元点
+function HeroTianYuan_PointUpGrade(human, heroID, heroIndex)
+    local res = openCheck(human, heroID, heroIndex)
+    if res ~= true then
+        return
+    end
+
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    local varCfg = HeroTianYuanCfg.var[1]
+
+    local tianYuanData = heroGrid.tianYuanData
+    local nowPointIdx = tianYuanData and tianYuanData.pointIdx or 0
+    local nowStage = tianYuanData and tianYuanData.stage or 0
+
+    if nowPointIdx >= varCfg.pointMaxNum then
+        return Broadcast.sendErr(human, Lang.HERO_TY_POINT_MAX)
+    end
+
+    local targetCfgIdx = nowStage
+    if targetCfgIdx <= 0 then
+        targetCfgIdx = 1
+    end
+
+    local targetStageCfg = HeroTianYuanCfg.upGrade[targetCfgIdx]
+    if not targetStageCfg then
+        return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
+    end
+
+    -- 消耗检查
+    local itemTb = targetStageCfg.pointCost
+    local itemId, itemCnt = itemTb[1][1], itemTb[1][2]
+    if BagLogic.getItemCnt(human, itemId) < itemCnt then
+        return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
+    end
+
+    -- 扣除消耗
+    BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
+
+    -- 更新点亮天元点索引
+    nowPointIdx = nowPointIdx + 1
+    updateData(heroGrid, nowPointIdx)
+
+    -- 推送最新数据给客户端
+    HeroTianYuan_Query(human, heroID, heroIndex)
+
+    -- 更新战力
+    updatePower(human, heroID, heroIndex)
+
+    -- 刷新红点
+    HeroLogic.refreshDot(human, heroGrid.uuid)
+end
+
+-- 请求天元突破
+function HeroTianYuan_StageUpGrade(human, heroID, heroIndex)
+    local res = openCheck(human, heroID, heroIndex)
+    if res ~= true then
+        return
+    end
+
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    local varCfg = HeroTianYuanCfg.var[1]
+
+    local tianYuanData = heroGrid.tianYuanData
+    local nowPointIdx = tianYuanData and tianYuanData.pointIdx or 0
+    local nowStage = tianYuanData and tianYuanData.stage or 0
+
+    if nowPointIdx < varCfg.pointMaxNum then
+        return Broadcast.sendErr(human, Lang.HERO_TY_POINT_NOT_ENOUGH)
+    end
+
+    if nowStage >= #HeroTianYuanCfg.upGrade then
+        return Broadcast.sendErr(human, Lang.HERO_TY_STAGE_MAX)
+    end
+
+    local nextStage = nowStage + 1
+    local nextStageCfg = HeroTianYuanCfg.upGrade[nextStage]
+    if not nextStageCfg then
+        return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
+    end
+
+    -- 消耗检查
+    local itemTb = nextStageCfg.stageCost
+    local itemId, itemCnt = itemTb[1][1], itemTb[1][2]
+    if BagLogic.getItemCnt(human, itemId) < itemCnt then
+        return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
+    end
+
+    -- 扣除消耗
+    BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
+
+    -- 更新天元点索引, 天元重数
+    updateData(heroGrid, 0, nextStage)
+
+    -- 推送最新数据给客户端
+    HeroTianYuan_Query(human, heroID, heroIndex)
+
+    -- 更新战力
+    updatePower(human, heroID, heroIndex)
+
+    -- 刷新红点
+    HeroLogic.refreshDot(human, heroGrid.uuid)
+end

+ 34 - 1
script/module/hero/Proto.lua

@@ -218,6 +218,7 @@ GC_HERO_BAG_DYNAMIC = {
 	{"canBingShu",  1,      "byte"},
 	{"canWeapon",   1,      "byte"},
 	{"canSeed",   	1,      "byte"},
+	{"canTianYuan", 1,      "byte"},
 }
 
 -- 获取配置英雄属性
@@ -989,4 +990,36 @@ CG_HEROSEED_UPGRADE = {
 }
 
 
-------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------
+
+
+-----------------------------------英雄天元系统---------------------------------------
+
+-- 查询英雄天元信息
+CG_HEROTY_QUERY = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+
+GC_HEROTY_QUERY = {
+	{"pointIdx",	1,		"short"}, 	-- 当前已点亮的天元点索引
+	{"stageIdx",	1,		"short"}, 	-- 当前已突破的重数
+	{"stageMax",	1,		"short"}, 	-- 最大可突破重数
+	{"attrs",		6,		Attr}, 		-- 总加成属性
+	{"cost", 		1,     ItemData},	-- 点亮/突破消耗的道具,没法升级后数量为0
+}
+
+-- 点亮天元
+CG_HEROTY_POINT_UPGRADE = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+
+
+-- 突破天元
+CG_HEROTY_STAGE_UPGRADE = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+
+-------------------------------------------------------------------------------------

+ 2 - 0
script/module/role/RoleAttr.lua

@@ -44,6 +44,7 @@ local WinnerRelicLogic = require("winnerRelic.WinnerRelicLogic")
 local HeroPubLogic = require("hero.HeroPubLogic")
 local HeroSeed = require("hero.HeroSeed")
 local ElfLogic = require("elf.ElfLogic")
+local HeroTianYuan = require("hero.HeroTianYuan")
 
 
 local function printAttr(attr, szText)
@@ -180,6 +181,7 @@ function calcHeroGrid(heroGrid, index, human)
 	HeroPubLogic.doCalcHero(human, HERO_OTHER_ATTRS) --英雄酒馆
 	HeroSeed.doCalcHero(human, heroGrid, HERO_OTHER_ATTRS) -- 英雄种子
 	ElfLogic.doCalcHero(human, HERO_OTHER_ATTRS) --精灵系统
+	HeroTianYuan.doCalcHero(human, heroGrid, HERO_OTHER_ATTRS) -- 英雄天元
 	
 
 	--不同模块在英雄属性计算 end