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

+ 13 - 1
script/common/Lang.lua

@@ -873,4 +873,16 @@ HERO_TY_POINT_MAX = [[已点亮所有天元点, 请先提升天元重数]]
 
 HERO_TY_POINT_NOT_ENOUGH = [[请先点亮天元点]]
 
-HERO_TY_STAGE_MAX = [[天元重数已达最高]]
+HERO_TY_STAGE_MAX = [[天元重数已达最高]]
+
+--------------------------英雄神威灵装系统-------------------------
+
+HERO_AF_NOT_ACTIVATE = [[神威灵装未激活]]
+HERO_AF_LV_MAX = [[神威灵装等级已达上限]]
+HERO_AF_LV_STAR = [[神威灵装星级已达上限]]
+HERO_AF_NO_EFFECT = [[神威灵装尚未获得特效]]
+HERO_AF_CANNOT_LOCK = [[锁定数量已达上限]]
+HERO_AF_NO_REFINE_EFFECT = [[神威灵装尚未洗练特效]]
+HERO_AF_NO_BESKILL = [[神威灵装尚未获得被动技能]]
+HERO_AF_NO_REFINE_BESKILL = [[神威灵装尚未洗练被动技能]]
+HERO_AF_NEED_HANDLE_REFINE = [[需要先保存或取消洗练出的效果]]

+ 1 - 0
script/common/LogDefine.lua

@@ -320,6 +320,7 @@ DEFINE = {
 	HeroTianYuan 			= 780,  		-- 英雄天元系统
 	BreakThroughTheme 		= 781,  		-- 闯关主题
 	VoucherInvest 			= 782,  		-- 代金券投资
+	Artifacts				= 783,			-- 英雄神威灵装
 
 	errHandle				= 99999,		-- 异常处理
 }

+ 20 - 1
script/common/ProtoID.lua

@@ -1775,12 +1775,31 @@ _ENV[1816]="GC_ABS_COMONACT_MONEYTREE_QUERY"
 _ENV[1817]="CG_ABS_COMONACT_MONEYTREE_LOTTERY"
 _ENV[1818]="GC_ABS_COMONACT_MONEYTREE_LOTTERY"
 _ENV[1819]="CG_ABS_COMONACT_MONEYTREE_GET_REWARD"
-
 _ENV[1820]="CG_VOUCHER_INVEST_QUERY"
 _ENV[1821]="GC_VOUCHER_INVEST_QUERY"
 _ENV[1822]="CG_VOUCHER_INVEST_GET"
 _ENV[1823]="CG_ABS_COMONACT_MONEYTREE_LOTTERY_STAGE"
 
+_ENV[1824]="CG_HEROARTIFACTS_BASE_QUERY"
+_ENV[1825]="GC_HEROARTIFACTS_BASE_QUERY"
+_ENV[1826]="CG_HEROARTIFACTS_ACTIVATE"
+_ENV[1827]="CG_HEROARTIFACTS_LV_QUERY"
+_ENV[1829]="GC_HEROARTIFACTS_LV_QUERY"
+_ENV[1830]="CG_HEROARTIFACTS_UPGRADE_LV"
+_ENV[1831]="CG_HEROARTIFACTS_STAR_QUERY"
+_ENV[1832]="GC_HEROARTIFACTS_STAR_QUERY"
+_ENV[1833]="CG_HEROARTIFACTS_UPGRADE_STAR"
+_ENV[1834]="CG_HEROARTIFACTS_EFFECT_REFINE_QUERY"
+_ENV[1835]="GC_HEROARTIFACTS_EFFECT_REFINE_QUERY"
+_ENV[1836]="CG_HEROARTIFACTS_EFFECT_LOCK"
+_ENV[1837]="CG_HEROARTIFACTS_EFFECT_REFINE_DO"
+_ENV[1838]="CG_HEROARTIFACTS_EFFECTREFINE_UPDATE"
+_ENV[1839]="CG_HEROARTIFACTS_BESKILL_REFINE_QUERY"
+_ENV[1840]="GC_HEROARTIFACTS_BESKILL_REFINE_QUERY"
+_ENV[1841]="CG_HEROARTIFACTS_BESKILL_LOCK"
+_ENV[1842]="CG_HEROARTIFACTS_BESKILL_REFINE_DO"
+_ENV[1843]="CG_HEROARTIFACTS_BESKILLREFINE_UPDATE"
+
 
 _ENV[1896]="CG_ZHUANPAN_SUBSCRIBE_REWARD_QUERY"
 _ENV[1897]="GC_ZHUANPAN_SUBSCRIBE_REWARD_QUERY"

+ 1 - 1
script/module/absAct/Proto.lua

@@ -1070,7 +1070,7 @@ ITEM_INFO = {
 --查询返回协议
 GC_DISCOUNTSTORE_QUERY = {
     {"isBuy",			                1,      "byte"},              --发数据时机, 0-正常查询 1-购买后
-    {"itemVec",                         20,       ITEM_INFO},         --所有商品数据
+    {"itemVec",                         25,       ITEM_INFO},         --所有商品数据
 }
 
 --购买请求协议

+ 18 - 0
script/module/chat/Gm.lua

@@ -2304,4 +2304,22 @@ end
 function d3.cycleAct(human)
 	local CycleActivityLogic = require("yunying.CycleActivity")
 	CycleActivityLogic.GM_EnterNext(human)
+end
+
+function d3.active(human, value)
+	local pos = string.find(value, " ", 1, true)
+	if pos == nil then return end
+	local tp = tonumber(string.sub(value, 1, pos - 1))
+	local id = tonumber(string.sub(value,pos+1, #value))
+	local RoleHeadLogic = require("role.RoleHeadLogic")
+	RoleHeadLogic.GM_Active(human, tp, id)
+end
+
+function d3.unaActive(human, value)
+	local pos = string.find(value, " ", 1, true)
+	if pos == nil then return end
+	local tp = tonumber(string.sub(value, 1, pos - 1))
+	local id = tonumber(string.sub(value,pos+1, #value))
+	local RoleHeadLogic = require("role.RoleHeadLogic")
+	RoleHeadLogic.GM_UnActive(human, tp, id)
 end

+ 80 - 0
script/module/combat/BeSkill.lua

@@ -137,6 +137,7 @@ function setBeSkill(obj, config, skinConf, monsterOutConfig)
 			for groupID, skillIDTemp in pairs(tbFuwenSkillGroupID) do
 				local fuwenSkillConfig = FuwenExcel.skill[skillIDTemp]
 				local fuwenBeSkillID = fuwenSkillConfig.fuwenBeSkill
+				fuwenBeSkillID = obj.fuwenStrengthenSkillList and obj.fuwenStrengthenSkillList[fuwenBeSkillID] or fuwenBeSkillID
 				setBeSkillID(obj,fuwenBeSkillID, 1)
 			end
 		end
@@ -164,6 +165,12 @@ function setBeSkill(obj, config, skinConf, monsterOutConfig)
 
 	end
 
+	-- 神威灵装被动技能
+	if obj.artifactsBeSkillList then
+		for _, skillId in ipairs(obj.artifactsBeSkillList) do
+			setBeSkillID(obj, skillId)
+		end
+	end
 end
 
 function setPetBeSkill(obj)
@@ -1832,6 +1839,15 @@ function getExtraHurtRate(attacker,defender,skillConfig)
 						end
 					end
 				end
+			elseif config.cmd == "hpSubHurtAdd" then
+				local nowHp = attacker.hp
+				local hpMax = CombatObj.getHpMax(attacker)
+				local percent = math.floor((hpMax - nowHp )/hpMax * 100) --已损失血量百分比
+				local condCfg = config.beSkillArgs
+				local condRate = condCfg[1]
+				if percent >= condRate then
+					hpHurtRate = hpHurtRate + condCfg[2]
+				end
 			end
 		end
 	end
@@ -2337,4 +2353,68 @@ function isNoFanji(obj)
         end
 	end
 	return false
+end
+
+-- 获取与神威灵装"真伤附加"效果相对的"真伤减免"
+function GetTrueDamegeOffset(obj)
+	if obj.beSkillList[BESKILL_TYPE72] then
+		for _, v in ipairs(obj.beSkillList[BESKILL_TYPE72]) do
+			local skillConfig = Skill.GetSkillConfig(v[1])
+			if skillConfig.cmd == "trueDamegeOffset" then
+				local offsetInfo = {}
+				offsetInfo[1] = skillConfig.beSkillArgs[1]
+				offsetInfo[2] = skillConfig.beSkillArgs[2]
+				return offsetInfo
+			end
+        end
+	end
+end
+
+-- 触发格挡后额外减伤
+function GetGeDangExtraDef(obj)
+	if obj.beSkillList[BESKILL_TYPE72] then
+		for _, v in ipairs(obj.beSkillList[BESKILL_TYPE72]) do
+			local skillConfig = Skill.GetSkillConfig(v[1])
+			if skillConfig.cmd == "gedangExtraDef" then
+				return skillConfig.beSkillArgs[1]
+			end
+        end
+	end
+
+	return 0
+end
+
+-- 伤害翻倍
+function GetBeSkillHurtMul(obj)
+	if obj.beSkillList[BESKILL_TYPE72] then
+		for _, v in ipairs(obj.beSkillList[BESKILL_TYPE72]) do
+			local skillConfig = Skill.GetSkillConfig(v[1])
+			if skillConfig.cmd == "physicalDamageMul" and obj.hurtType == CombatDefine.PHY_HURT_TYPE then
+				return math.random(skillConfig.beSkillArgs[1], skillConfig.beSkillArgs[2])
+			end
+
+			if skillConfig.cmd == "magicDamageMul" and obj.hurtType == CombatDefine.MAGIC_HURT_TYPE then
+				return math.random(skillConfig.beSkillArgs[1], skillConfig.beSkillArgs[2])
+			end
+        end
+	end
+end
+
+-- 回血翻倍
+function GetBeSkillRestoretHPMul(obj)
+	local mul = 1
+	if obj.beSkillList[BESKILL_TYPE72] then
+		for _, v in ipairs(obj.beSkillList[BESKILL_TYPE72]) do
+			local skillConfig = Skill.GetSkillConfig(v[1])
+			if skillConfig.cmd == "restoreHPMul" then
+				local r = math.random(1,10000)
+				if r <= (skillConfig.beSkillArgs[2] or 0) then
+					mul =  skillConfig.beSkillArgs[1] or 1
+				end
+				return mul
+			end
+        end
+	end
+
+	return mul
 end

+ 54 - 20
script/module/combat/CombatCalc.lua

@@ -477,6 +477,19 @@ local function getHurtMul(skillConfig)
     return mul
 end
 
+-- 触发格挡后额外减伤
+local function triggerGeDangExtraDef(defender)
+    local extraDefVal = BeSkill.GetGeDangExtraDef(defender) or 0
+    extraDefVal = extraDefVal / 10000
+    return extraDefVal
+end
+
+-- 被动技能的伤害倍数
+local function getBeSkillHurtMul(attacker)
+    local hurtMul = BeSkill.GetBeSkillHurtMul(attacker) or 10000
+    hurtMul = hurtMul / 10000
+    return hurtMul
+end
 
 function initAttacker(attacker)
     if attacker.isPet or attacker.isElf then
@@ -582,12 +595,18 @@ function calcPhyHurt(attacker, index, targets, skillConfig)
 
     --是否触发格挡
     if isGedang(defender) then
-        hurt = hurt * 0.5
+        -- hurt = hurt * 0.5
+        local extraDefVal = triggerGeDangExtraDef(defender)
+        hurt = hurt * (1- (0.5 + extraDefVal))
     end
 
     local hurtMul = getHurtMul(skillConfig)
     hurt = hurt * hurtMul
 
+    hurtMul = getBeSkillHurtMul(attacker)
+    hurt = hurt * hurtMul
+    hurt = math.ceil(hurt)
+
     hurt = math.max(hurt, 1)
     CombatObj.updateValue(attacker, RoleDefine.HURT_COMBAT_NOW, hurt)
     return hurt, flag
@@ -686,13 +705,19 @@ function calcMagicHurt(attacker, index, targets, skillConfig)
 
     --是否触发格挡
     if isGedang(defender) then
-        hurt = hurt * 0.5
+        -- hurt = hurt * 0.5
+        local extraDefVal = triggerGeDangExtraDef(defender)
+        hurt = hurt * (1- (0.5 + extraDefVal))
     end
 
     local hurtMul = getHurtMul(skillConfig)
     hurt = hurt * hurtMul
 
-    hurt = hurt > 0 and hurt or 1
+    hurtMul = getBeSkillHurtMul(attacker)
+    hurt = hurt * hurtMul
+    hurt = math.ceil(hurt)
+
+    hurt = math.max(hurt, 1)
 
     CombatObj.updateValue(attacker, RoleDefine.HURT_COMBAT_NOW, hurt)
     return hurt, flag
@@ -706,28 +731,37 @@ local function isShanbi(attacker, index, targets)
     local jingzhun = CombatObj.getValue(attacker, RoleDefine.JINGZHUN) + CombatPosLogic.getRestrict(attacker,defender,RoleDefine.JINGZHUN)
     local shanbi = CombatObj.getValue(defender, RoleDefine.SHANBI)
 
-    if jingzhun >= 10000 then
-        local mingZhong = jingzhun - 10000
-        mingZhong = mingZhong < 0 and 0 or mingZhong
-        -- 强制设定额外命中不超过 99%
-        if mingZhong >= 9900 then
-           mingZhong = 9900
-        end
+    -- if jingzhun >= 10000 then
+    --     local mingZhong = jingzhun - 10000
+    --     mingZhong = mingZhong < 0 and 0 or mingZhong
+    --     -- 强制设定额外命中不超过 99%
+    --     if mingZhong >= 9900 then
+    --        mingZhong = 9900
+    --     end
 
-        local shanbiRatio = 10000 - mingZhong
-        shanbiRatio = shanbiRatio < 0 and 0 or shanbiRatio
+    --     local shanbiRatio = 10000 - mingZhong
+    --     shanbiRatio = shanbiRatio < 0 and 0 or shanbiRatio
 
         
-        shanbi = math.floor(shanbi *(shanbiRatio / 10000))
-    else
-        shanbi = 10000 - jingzhun + shanbi
-    end
-    
+    --     shanbi = math.floor(shanbi *(shanbiRatio / 10000))
+    -- else
+    --     shanbi = 10000 - jingzhun + shanbi
+    -- end
+
+    -- local r = math.random(1, 10000)
+    -- if r < shanbi then
+    --     return true
+    -- end
+    -- return false
+
+    -- 修改
+    local hitVal = math.max(jingzhun - shanbi, 0)
     local r = math.random(1, 10000)
-    if r < shanbi then
-        return true
+    if r <= hitVal then
+        return false
     end
-    return false
+
+    return true
 end
 
 function calcHurt(attacker, index, targets, skillConfig)

+ 4 - 0
script/module/combat/CombatLogic.lua

@@ -63,6 +63,8 @@ local BattleLogic = require("battle.BattleLogic")
 local HeroExclusiveWeapon = require("hero.HeroExclusiveWeapon")
 local ItemConfig = require("excel.item").item
 local ElfLogic = require("elf.ElfLogic")
+local HeroArtifacts = require("hero.HeroArtifacts")
+
 
 -- 用于在切磋时取目标玩家db数据中的计算属性数据, 如果在 RoleAttr.calcHeroGrid中用到了,需要加到这个里面
 FieldsCombat = {
@@ -468,6 +470,8 @@ function createHeroObjByHeroGrid(human, heroGrid)
     obj.camp = heroConfig.camp
     obj.isGongMing = XingYaoGongMing.isGongMing(human, heroGrid.bagIndex)
 	obj.weaponEffectIdList = HeroExclusiveWeapon.GetweaponEffectIdList(heroGrid)
+	obj.fuwenStrengthenSkillList = HeroArtifacts.GetFuwenStrengthenSkillList(heroGrid)
+	obj.artifactsBeSkillList = HeroArtifacts.GetArtifactsBeSkillList(heroGrid)
 	obj.skinOn = heroGrid.skinOn
 
     obj.sex = heroConfig.sex

+ 44 - 0
script/module/combat/Skill.lua

@@ -429,6 +429,10 @@ function CMD.hp(obj,skillConfig,skillTargets)
                 if target.side == CombatDefine.DEFEND_SIDE then
 					hp = CombatImpl.commonArgs.hpLimit or hp
 				end
+
+				local restoreMul = BeSkill.GetBeSkillRestoretHPMul(target) or 1
+				hp = hp * restoreMul
+
 				local d, _, extraHandleTb = CombatObj.updateHp(target,hp,nil,true,obj.pos,CombatObj.EXTRA_HP_TYPE)
                 local showHp = hp
                 if hp > 0 and d < 0 then
@@ -1922,4 +1926,44 @@ function CMD.exchangeHP(obj,skillConfig,skillTargets)
 
 		end
 	end
+end
+
+-- 神威灵装被动-真伤附加
+function CMD.trueDamegeAddtional(obj,skillConfig,skillTargets)
+	local args = obj.isPet and obj.args or skillConfig.args
+	local r = math.random(0,10000)
+	if r > args[4] then 
+		return
+	end
+	local calcType = args[1]
+	local rate = args[2]
+	local targets = TargetMode.getTargets(obj, args[3],skillTargets)
+	local hp
+	local limit
+	local ret = {}
+	if args[5] then
+		limit = args[5] * CombatObj.getValue(obj,RoleDefine.ATK_COMBAT_NOW) / 10000
+	end
+	for _,target in ipairs(targets) do
+		hp = calcHp(obj,target,calcType,rate,limit)
+		local offsetInfo = BeSkill.GetTrueDamegeOffset(target)
+		if offsetInfo then
+			local offsetHurt = calcHp(obj,target,offsetInfo[1],offsetInfo[2],limit)
+			hp = math.max(hp - offsetHurt, 0)
+		end
+
+		if hp ~= 0 then
+			local d, _, extraHandleTb = CombatObj.updateHp(target,-hp,nil,true, obj.pos,CombatObj.EXTRA_HP_TYPE)
+			if d ~= 0 then
+				CombatImpl.setExtraHit(target,-hp,CMD2ID["hurt"])
+				CombatObj.onHpCB(target,d, obj.pos)
+				ret[#ret+1] = target
+			end
+
+			if extraHandleTb then
+				ExtraHandle(target, extraHandleTb)
+			end
+		end
+	end
+	return ret
 end

+ 12 - 0
script/module/fuwen/FuwenLogic.lua

@@ -27,6 +27,7 @@ local YunYingLogic = require("yunying.YunYingLogic")
 local TriggerDefine = require("trigger.TriggerDefine")
 local TriggerLogic = require("trigger.TriggerLogic")
 local Abs365CardLogic = require("absAct.Abs365CardLogic")
+local HeroArtifacts = require("hero.HeroArtifacts")
 
 -- 符文锁定属性,技能后的刷新时额外消耗的道具Id
 local LOCK_COST_ITEN_ID = 136
@@ -1000,6 +1001,11 @@ function doCalcHero(obj,attrs)
             end
         end
     end
+
+    local skillId_2_Attr
+    if next(tbSkillGroupID) then
+        skillId_2_Attr = HeroArtifacts.GetFuwenStrengthenAttrList(obj)
+    end
 	
 	-- 符文技能效果这里 如果有多个同类型的技能 效果不叠加 只取最高等级的那个技能的效果
 	for groupID, skillIDTemp in pairs(tbSkillGroupID) do
@@ -1010,6 +1016,12 @@ function doCalcHero(obj,attrs)
                 RoleAttr.updateValue(v[1], v[2], attrs)
 		    end
         end
+
+        if skillId_2_Attr and skillId_2_Attr[skillConfig.fuwenBeSkill] then
+            for _, v in ipairs(skillId_2_Attr[skillConfig.fuwenBeSkill]) do
+                RoleAttr.updateValue(v[1], v[2], attrs)
+            end
+        end
 	end
 end
 

+ 9 - 4
script/module/godsArea/GodsAreaCS.lua

@@ -279,10 +279,10 @@ function CS_Challenge_Query(sourceServerId, defenseRank, defenseUid, attackerUid
 
     -- 不能挑战比自己排名低的
     local attackerRank = getRankInfoByUid(rankList, attackerUid)
-    if attackerRank ~= 0 and attackerRank < defenseRank then
-        msgData.res = -3
-        return InnerMsg.sendMsg(fd, msgData)
-    end
+    -- if attackerRank ~= 0 and attackerRank < defenseRank then
+    --     msgData.res = -3
+    --     return InnerMsg.sendMsg(fd, msgData)
+    -- end
 
     clearChallengeList()
 
@@ -338,6 +338,11 @@ function CS_Challenge_Win(sourceServerId, defenseRank, defenseUid, attackerUid,
         attackData = attackerRankData
     end
 
+    -- 挑战方排名高于防守方排名则不做其他操作
+    if attackData.rank and attackData.rank ~= 0 and attackData.rank < defenseRankData.rank then
+        return
+    end
+
     -- 防守方当前是玩家
     if defenseRankData.uid then
         -- 通知失败方更新称号

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

@@ -9,6 +9,8 @@ local HeroExclusiveWeapon = require("hero.HeroExclusiveWeapon")
 local HeroPubLogic = require("hero.HeroPubLogic")
 local HeroSeed = require("hero.HeroSeed")
 local HeroTianYuan = require("hero.HeroTianYuan")
+local HeroArtifacts = require("hero.HeroArtifacts")
+
 
 -- 请求英雄详细信息:静态
 function CG_HERO_BAG_STATIC(human,msg)
@@ -306,4 +308,65 @@ function CG_HEROTY_STAGE_UPGRADE(human, msg)
     HeroTianYuan.HeroTianYuan_StageUpGrade(human, msg.heroID, msg.heroIndex)
 end
 
+---------------------------------------------------------------------------------------------
+
+
+
+---------------------------------------英雄神威灵装系统-----------------------------------------------
+function CG_HEROARTIFACTS_BASE_QUERY(human, msg)
+    HeroArtifacts.HeroArtifacts_Base_Query(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROARTIFACTS_ACTIVATE(human, msg)
+    HeroArtifacts.HeroArtifacts_Activate(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROARTIFACTS_LV_QUERY(human, msg)
+    HeroArtifacts.HeroArtifacts_Lv_Query(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROARTIFACTS_UPGRADE_LV(human, msg)
+    HeroArtifacts.HeroArtifacts_UpGrade_Level(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROARTIFACTS_STAR_QUERY(human, msg)
+    HeroArtifacts.HeroArtifacts_Star_Query(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROARTIFACTS_UPGRADE_STAR(human, msg)
+    HeroArtifacts.HeroArtifacts_UpGrade_Star(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROARTIFACTS_EFFECT_REFINE_QUERY(human, msg)
+    HeroArtifacts.HeroArtifacts_EffectRefine_Query(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROARTIFACTS_EFFECT_LOCK(human, msg)
+    HeroArtifacts.HeroArtifacts_Effect_Lock(human, msg.heroID, msg.heroIndex, msg.effectIdxArr)
+end
+
+function CG_HEROARTIFACTS_EFFECT_REFINE_DO(human, msg)
+    HeroArtifacts.HeroArtifacts_EffectRefine_Do(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROARTIFACTS_EFFECTREFINE_UPDATE(human, msg)
+    HeroArtifacts.HeroArtifacts_EffectRefine_Handle(human, msg.heroID, msg.heroIndex, msg.opType)
+end
+
+function CG_HEROARTIFACTS_BESKILL_REFINE_QUERY(human, msg)
+    HeroArtifacts.HeroArtifacts_BeSkillRefine_Query(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROARTIFACTS_BESKILL_LOCK(human, msg)
+    HeroArtifacts.HeroArtifacts_BeSkill_Lock(human, msg.heroID, msg.heroIndex, msg.beSkillIdxArr)
+end
+
+function CG_HEROARTIFACTS_BESKILL_REFINE_DO(human, msg)
+    HeroArtifacts.HeroArtifacts_BeSkillRefine_Do(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROARTIFACTS_BESKILLREFINE_UPDATE(human, msg)
+    HeroArtifacts.HeroArtifacts_BeSkillRefine_Handle(human, msg.heroID, msg.heroIndex, msg.opType)
+end
+
 ---------------------------------------------------------------------------------------------

+ 1246 - 0
script/module/hero/HeroArtifacts.lua

@@ -0,0 +1,1246 @@
+-- 英雄神威灵装系统
+
+--db
+--[=[
+    heroGrid.artifacts = {
+        isActive = nil, -- 是否激活,激活后为true
+        level = 0, -- 当前等级
+        star = 0,  -- 当前星级
+        effectArr = { --特效
+            {idx = 1, isLock = 0, lv = 0}
+        },
+
+        effectArrTemp = { --新洗练出且未替换的特效
+            {idx = 1, lv = 0}
+        },
+
+        beSkillArr = { --被动技能
+            {idx = 1, isLock = 0}
+        },
+
+        beSkillArrTemp = { --新洗练出且未替换的被动技能
+            {idx = 1}
+        },
+    }
+]=]--
+
+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 RoleDefine = require("role.RoleDefine")
+local HeroArtifactsConfig = require("excel.heroArtifacts")
+local Util = require("common.Util")
+local Lang = require("common.Lang")
+local Broadcast = require("broadcast.Broadcast")
+
+local GiftLogic
+
+local LOGTAG = "Artifacts" --日志标识
+
+
+local function initArtifactsData(heroGrid)
+    heroGrid.artifacts = {
+        level = 0,
+        star = 0
+    }
+end
+
+local function getArtifactsData(heroGrid)
+    return heroGrid.artifacts
+end
+
+local function updateArtifactsState(heroGrid, state)
+    local artifactsData = getArtifactsData(heroGrid)
+    if not artifactsData then
+        initArtifactsData(heroGrid)
+        artifactsData = getArtifactsData(heroGrid)
+    end
+
+    artifactsData.isActive = state
+end
+
+local function upGradeArtifactsLv(heroGrid, addVal)
+    local artifactsData = getArtifactsData(heroGrid)
+    if not artifactsData then
+        initArtifactsData(heroGrid)
+        artifactsData = getArtifactsData(heroGrid)
+    end
+
+    artifactsData.level = artifactsData.level + addVal
+end
+
+local function upGradeArtifactsStar(heroGrid, addVal)
+    local artifactsData = getArtifactsData(heroGrid)
+    if not artifactsData then
+        initArtifactsData(heroGrid)
+        artifactsData = getArtifactsData(heroGrid)
+    end
+
+    artifactsData.star = artifactsData.star + addVal
+end
+
+local function resetArtifactsData(heroGrid)
+    local artifactsData = getArtifactsData(heroGrid)
+    artifactsData.level = 0
+    artifactsData.star = 0
+    artifactsData.isActive = nil
+    artifactsData.effectArr = nil
+    artifactsData.effectArrTemp = nil
+    artifactsData.beSkillArr = nil
+    artifactsData.beSkillArrTemp = nil
+end
+
+
+
+-- 是否开启
+local function isOpen(heroGrid)
+    local varCfg = HeroArtifactsConfig.Var[1]
+    if heroGrid.star < varCfg.openStarCond then
+        return false
+    end
+
+    return true
+end
+
+-- 是否激活
+local function isActivate(heroGrid)
+    local artifactsData = getArtifactsData(heroGrid)
+    return artifactsData and artifactsData.isActive
+end
+
+-- 计算当前等级/星级的属性总加成
+local function calcAttrs(conf, currentStage)
+    local attrList = {}
+    for i=1, currentStage do
+        local t = conf[i]
+        local attrArr = t and t.attrArr
+        for _, attrInfo in ipairs(attrArr or {}) do
+            local attrId, attrVal = attrInfo[1],attrInfo[2]
+            attrList[attrId] = (attrList[attrId] or 0) + attrVal
+        end
+    end
+
+    return attrList
+end
+
+-- 获取神威灵装激活消耗
+local function getActivateCost()
+    local varCfg = HeroArtifactsConfig.Var[1]
+    local activateCostTb = varCfg.activateCost
+    return activateCostTb[1][1],activateCostTb[1][2]
+end
+
+-- 获取等级/星级下一阶段的消耗
+local function getNextStageCost(currentStage, tp, isMax)
+    local varCfg = HeroArtifactsConfig.Var[1]
+    local itemId = varCfg.upGradeLvCostId
+    local itemCnt = 0
+
+    local upGradeCfg = HeroArtifactsConfig.UpGradeLv
+    if tp == 2 then
+        itemId = varCfg.upGradeStarCostId
+        upGradeCfg = HeroArtifactsConfig.UpGradeStar
+    end
+
+    if not isMax then
+        local nextStageCfg = upGradeCfg[currentStage+1]
+        itemCnt = nextStageCfg.costCnt
+    end
+
+    return itemId, itemCnt
+end
+
+-- 获取升到当前等级/星级的总消耗
+local function getTaotalStageCost(currentStage, tp)
+    local varCfg = HeroArtifactsConfig.Var[1]
+    local itemId = varCfg.upGradeLvCostId
+    local itemCnt = 0
+
+    local upGradeCfg = HeroArtifactsConfig.UpGradeLv
+    if tp == 2 then
+        itemId = varCfg.upGradeStarCostId
+        upGradeCfg = HeroArtifactsConfig.UpGradeStar
+    end
+
+    for i=1, currentStage do
+        local stageCfg = upGradeCfg[i]
+        itemCnt = itemCnt + stageCfg.costCnt
+    end
+
+    return itemId, itemCnt
+end
+
+-- 填充激活灵装协议结构数据
+local function populateActivateCostMsg(net)
+    -- local varCfg = HeroArtifactsConfig.Var[1]
+    -- local activateCostTb = varCfg.activateCost
+    -- net[0] = #activateCostTb
+
+    -- for k,v in ipairs(activateCostTb) do
+    --     Grid.makeItem(net[k], v[1], v[2])
+    -- end
+    local itemId, itemCnt = getActivateCost()
+    Grid.makeItem(net, itemId, itemCnt)
+end
+
+-- 填充灵装当前等级/星级总加成属性协议结构数据
+local function populateTotalAttrMsg(net, n, tp)
+    local t
+    if tp == 1 then
+        t = HeroArtifactsConfig.UpGradeLv
+    else
+        t = HeroArtifactsConfig.UpGradeStar
+    end
+
+    local stage = n
+    if n <= 0 then
+        stage = 1
+    end
+
+    local attrList = calcAttrs(t, stage)
+
+    net[0] = 0
+    local len = 0
+    for attrId, attrVal in pairs(attrList) do
+        len = len + 1
+        net[0] = len
+        net[len].key = attrId
+        net[len].value = n <= 0 and 0 or attrVal
+    end
+end
+
+-- 填充灵装下一等级/星级加成属性协议结构数据
+local function populateNextAttrMsg(net, n, tp, isMax)
+    local t
+    if tp == 1 then
+        t = HeroArtifactsConfig.UpGradeLv
+    else
+        t = HeroArtifactsConfig.UpGradeStar
+    end
+
+    net[0] = 0
+    local cfg = t[n]
+    local attrArrCfg = cfg and cfg.attrArr
+    for k,v in ipairs(attrArrCfg or {}) do
+        net[0] = k
+        net[k].key = v[1]
+        net[k].value = isMax and 0 or v[2]
+    end
+end
+
+-- 判断属性是否是绝对值属性
+local function isAbsAttr(attrId)
+    return RoleDefine.isAbsAttr(attrId)
+end
+
+-- 填充灵装特效协议结构数据
+local function populateEffectMsg(net, arr)
+    for k, v in ipairs(arr) do
+        net[0] = k
+        local cfg = HeroArtifactsConfig.EffectList[v.idx]
+        net[k].idx = v.idx
+        net[k].name = cfg.name
+        net[k].desc = cfg.desc
+        net[k].isLock = v.isLock or 0
+        net[k].isActivate = 1
+        net[k].activateStarCond = 1
+        net[k].level = v.lv
+
+        local attrVal = cfg.effectAttrValArr[v.lv] or 0
+        if not isAbsAttr(cfg.effectAttrId) then
+            attrVal = attrVal / 100
+        end
+        net[k].desc = Util.format(cfg.desc, attrVal)
+    end
+end
+
+-- 填充灵装被动技能协议结构数据
+local function populateBeSkillMsg(net, arr)
+    local varCfg = HeroArtifactsConfig.Var[1]
+    for i, activateBeSkillStar in ipairs(varCfg.activateBeSkillStarList) do
+        net[0] = i
+        net[i].idx = i
+        net[i].name = ""
+        net[i].desc = ""
+        net[i].isLock = 0
+        net[i].isActivate = 0
+        net[i].activateStarCond = activateBeSkillStar
+        net[i].level = 0
+        if arr and arr[i] then
+            local beSkillData = arr[i]
+            local cfg = HeroArtifactsConfig.BeSkillList[beSkillData.idx]
+            net[i].idx = beSkillData.idx
+            net[i].name = cfg.name
+            net[i].desc = cfg.desc
+            net[i].isLock = beSkillData.isLock or 0
+            net[i].isActivate = 1
+        end
+    end
+end
+
+-- 计算特效/被动技能的锁定数量
+local function calcLockNum(arr)
+    local lockNum = 0
+    for _, v in ipairs(arr or {}) do
+        if v.isLock and v.isLock == 1 then
+            lockNum = lockNum + 1
+        end
+    end
+
+    return lockNum
+end
+
+-- 计算特效/被动技能洗练需要消耗的道具
+local function calcRefineCost(data, costIdArr, costNumArr)
+    if not costIdArr or not costNumArr then
+        return
+    end
+
+    if #costIdArr ~= #costNumArr then
+        return
+    end
+
+    local lockNum = calcLockNum(data)
+    lockNum = lockNum + 1
+
+    local itemList = {}
+    for i=1, #costIdArr do
+        local itemId = costIdArr[i]
+        local itemCntArr = costNumArr[i]
+        local itemCnt = itemCntArr and itemCntArr[lockNum]
+        if not itemId or not itemCnt then
+            return
+        end
+
+        itemList[itemId] = (itemList[itemId] or 0) + itemCnt
+    end
+
+    return itemList
+end
+
+-- 生成要排除的特效/被动技能列表
+local function genExcludeList(arr)
+    if not arr then
+        return
+    end
+
+    local excludeList = {}
+    for _, v in ipairs(arr) do
+        excludeList[v.idx] = true
+    end
+
+    return excludeList
+end
+
+-- 随机一个特效/被动技能
+local function randEffect(conf, excludeList)
+    local totalWeight = 0
+    local arr = {}
+
+    for k,v in ipairs(conf) do
+        if not excludeList or not excludeList[k] then
+            totalWeight = totalWeight + v.weight
+            arr[#arr+1] = {weight = v.weight, idx = k}
+        end
+    end
+
+    local weight = 0
+    local randVal = math.random(1, totalWeight)
+    for _, v in ipairs(arr) do
+        weight = weight + v.weight
+        if randVal <= weight then
+            return v.idx
+        end
+    end
+end
+
+-- 随机一个特效的等级
+local function randEffectLv()
+    local totalWeight = 0
+    for k,v in ipairs(HeroArtifactsConfig.EffectLvProb) do
+        totalWeight = totalWeight + v.weight
+    end
+
+    local weight = 0
+    local randVal = math.random(1, totalWeight)
+    for _, v in ipairs(HeroArtifactsConfig.EffectLvProb) do
+        weight = weight + v.weight
+        if randVal <= weight then
+            return v.level
+        end
+    end
+end
+
+-- 更新战力
+local function updatePower(human)
+    RoleAttr.cleanHeroAttrCache(human)
+    ObjHuman.doCalc(human)
+    ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
+end
+
+-- 更新英雄属性
+local function updateHeroAttr(human, heroID, heroIndex)
+    HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
+end
+
+-- 刷新红点
+local function updateRedDot(human, heroGrid)
+    HeroLogic.refreshDot(human, heroGrid.uuid)
+end
+
+-- 刷新战力, 红点, 英雄属性
+local function updatePowerAndRedDot(human, heroGrid, heroID, heroIndex)
+    -- 更新战力
+    updatePower(human)
+
+    -- 刷新红点
+    updateRedDot(human, heroGrid)
+
+    -- 刷新英雄属性
+    updateHeroAttr(human, heroID, heroIndex)
+end
+
+
+
+
+-- 获取神威灵装的被动技能
+function GetArtifactsBeSkillList(heroGrid)
+    if not heroGrid or not heroGrid.artifacts then
+        return
+    end
+
+    local beSkillArr = heroGrid.artifacts.beSkillArr
+    if not beSkillArr then
+        return
+    end
+
+    local skillArr
+    for _, skillInfo in ipairs(beSkillArr) do
+        local cfgIdx = skillInfo.idx
+        local skillCfg = HeroArtifactsConfig.BeSkillList[cfgIdx]
+        if skillCfg and skillCfg.skillType == 2 then
+            skillArr = skillArr or {}
+            skillArr[#skillArr+1] = skillCfg.skillId
+        end
+    end
+
+    return skillArr
+end
+
+-- 获取神威灵装对符文/战意的属性加成列表
+function GetFuwenStrengthenAttrList(heroGrid)
+    if not heroGrid or not heroGrid.artifacts then
+        return
+    end
+
+    local beSkillArr = heroGrid.artifacts.beSkillArr
+    if not beSkillArr then
+        return
+    end
+
+    local skillId_2_Attr = nil
+
+    for _, skillInfo in ipairs(beSkillArr) do
+        local skillCfg = HeroArtifactsConfig.BeSkillList[skillInfo.idx]
+        if skillCfg and skillCfg.skillType == 1 and next(skillCfg.attr) then
+            local attrArr = {}
+            for i, attrInfo in ipairs(skillCfg.attr) do
+                attrArr[i] = {attrInfo[1], attrInfo[2]}
+            end
+
+            skillId_2_Attr = skillId_2_Attr or {}
+
+            for _, fuwenSkillId in ipairs(skillCfg.fuwenSkillIdArr) do
+                skillId_2_Attr[fuwenSkillId] = attrArr
+            end
+        end
+    end
+
+    return skillId_2_Attr
+end
+
+-- 获取神威灵装对符文/战意的强化技能列表
+function GetFuwenStrengthenSkillList(heroGrid)
+    if not heroGrid or not heroGrid.artifacts then
+        return
+    end
+
+    local beSkillArr = heroGrid.artifacts.beSkillArr
+    if not beSkillArr then
+        return
+    end
+
+    local skillId_2_strengthenSkillId = nil
+
+    for _, skillInfo in ipairs(beSkillArr) do
+        local skillCfg = HeroArtifactsConfig.BeSkillList[skillInfo.idx]
+        if skillCfg and skillCfg.skillType == 1 and next(skillCfg.strengthenSkillIdArr) then
+            skillId_2_strengthenSkillId = skillId_2_strengthenSkillId or {}
+            for i, fuwenSkillId in ipairs(skillCfg.fuwenSkillIdArr) do
+                skillId_2_strengthenSkillId[fuwenSkillId] = skillCfg.strengthenSkillIdArr[i]
+            end
+        end
+    end
+
+    return skillId_2_strengthenSkillId
+end
+
+-- 神威灵装加成
+function doCalcHero(human, heroGrid, addAttrs)
+    if not heroGrid or not heroGrid.artifacts then
+        return
+    end
+
+    local artifactsData = heroGrid.artifacts
+
+    if artifactsData.level > 0 then
+        local attrList = calcAttrs(HeroArtifactsConfig.UpGradeLv, artifactsData.level)
+        for attrId, attrVal in pairs(attrList) do
+            RoleAttr.updateValue(attrId, attrVal, addAttrs)
+        end
+    end
+
+    if artifactsData.star > 0 then
+        local attrList = calcAttrs(HeroArtifactsConfig.UpGradeStar, artifactsData.star)
+        for attrId, attrVal in pairs(attrList) do
+            RoleAttr.updateValue(attrId, attrVal, addAttrs)
+        end
+    end
+
+    -- 特效
+    if artifactsData.effectArr then
+        for _, effectInfo in ipairs(artifactsData.effectArr) do
+            local effectCfg = HeroArtifactsConfig.EffectList[effectInfo.idx]
+            if effectCfg then
+                local effectLv = effectInfo.lv
+                local attrId = effectCfg.effectAttrId
+                local attrVal = effectCfg.effectAttrValArr[effectLv] or 0
+                RoleAttr.updateValue(attrId, attrVal, addAttrs)
+            end
+        end
+    end
+end
+
+-- 红点判断
+function isArtifactsDot(human, heroGrid)
+    if not isOpen(heroGrid) then
+        return false
+    end
+
+    if not isActivate(heroGrid) then
+        local varCfg = HeroArtifactsConfig.Var[1]
+        local activateCostTb = varCfg.activateCost
+        local itemId, itemCnt = activateCostTb[1][1], activateCostTb[1][2]
+        if BagLogic.getItemCnt(human, itemId) >= itemCnt then
+            return true
+        end
+
+        return false
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+
+    local currentLevel = artifactsData and artifactsData.level or 0
+    local maxLevel = HeroArtifactsConfig.UpGradeLv[#HeroArtifactsConfig.UpGradeLv].level
+    if currentLevel < maxLevel then
+        local itemId, itemCnt = getNextStageCost(currentLevel, 1)
+        if BagLogic.getItemCnt(human, itemId) >= itemCnt then
+            return true
+        end
+    end
+
+    local currentStar = artifactsData and artifactsData.star or 0
+    local maxStar = HeroArtifactsConfig.UpGradeStar[#HeroArtifactsConfig.UpGradeStar].star
+    if currentStar < maxStar then
+        local itemId, itemCnt = getNextStageCost(currentStar, 2)
+        if BagLogic.getItemCnt(human, itemId) >= itemCnt then
+            return true
+        end
+    end
+
+    return false
+end
+
+-- 返还材料计算
+function CalcReturnItem(human, heroGrid)
+    if not isOpen(heroGrid) then
+        return
+    end
+
+    if not isActivate(heroGrid) then
+        return
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+
+    local itemList = {}
+    local itemId, itemCnt = getActivateCost()
+    itemList[itemId] = (itemList[itemId] or 0) + itemCnt
+
+    if artifactsData and artifactsData.level > 0 then
+        itemId, itemCnt = getTaotalStageCost(artifactsData.level, 1)
+        itemList[itemId] = (itemList[itemId] or 0) + itemCnt
+    end
+
+    if artifactsData and artifactsData.star > 0 then
+        itemId, itemCnt = getTaotalStageCost(artifactsData.star, 2)
+        itemList[itemId] = (itemList[itemId] or 0) + itemCnt
+    end
+
+    return itemList
+end
+
+-- 重置神威灵装数据
+function ResetArtifactsData(human, heroGrid)
+    if not isOpen(heroGrid) then
+        return
+    end
+
+    if not isActivate(heroGrid) then
+        return
+    end
+
+    resetArtifactsData(heroGrid)
+end
+
+
+
+
+-- 神威灵装基础信息查询
+function HeroArtifacts_Base_Query(human, heroID, heroIndex)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    local currentLevel = artifactsData and artifactsData.level or 0
+    local currentStar = artifactsData and artifactsData.star or 0
+
+    local msgRet = Msg.gc.GC_HEROARTIFACTS_BASE_QUERY
+    msgRet.artifactsLv = currentLevel
+    msgRet.artifactsStar = currentStar
+    msgRet.nowLevelAttrs[0] = 0
+    msgRet.nowStarAttrs[0] = 0
+    msgRet.effectArr[0] = 0
+    msgRet.beSkillArr[0] = 0
+    msgRet.isActivate = isActivate(heroGrid) and 1 or 0
+
+    populateActivateCostMsg(msgRet.ActivateCost)
+    populateTotalAttrMsg(msgRet.nowLevelAttrs, currentLevel, 1)
+    populateTotalAttrMsg(msgRet.nowStarAttrs, currentStar, 2)
+
+    if artifactsData and artifactsData.effectArr then
+        populateEffectMsg(msgRet.effectArr, artifactsData.effectArr)
+    end
+
+    populateBeSkillMsg(msgRet.beSkillArr, artifactsData and artifactsData.beSkillArr)
+
+    Msg.send(msgRet, human.fd)
+end
+
+-- 激活神威灵装
+function HeroArtifacts_Activate(human, heroID, heroIndex)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.BINGSHU_LEARN_ERR_HAD)
+    end
+
+    local itemId, itemCnt = getActivateCost()
+    if BagLogic.getItemCnt(human, itemId) < itemCnt then
+        return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
+    end
+
+    BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
+
+    updateArtifactsState(heroGrid, true)
+
+    HeroArtifacts_Base_Query(human, heroID, heroIndex)
+
+    -- 弹窗礼包
+    GiftLogic = GiftLogic or require("topup.GiftLogic")
+    GiftLogic.trigger(human, GiftLogic.GIFT_ARTIFACTS_OPEN, {currentVal = 0}, GiftLogic.GIFT_SEC_TYPE3)
+end
+
+-- 神威灵装升级信息查询
+function HeroArtifacts_Lv_Query(human, heroID, heroIndex)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if not isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    local UpGradeLvCfg = HeroArtifactsConfig.UpGradeLv
+
+    local currentLevel = artifactsData and artifactsData.level or 0
+    local maxLevel = UpGradeLvCfg[#UpGradeLvCfg].level
+    local isMax = currentLevel >= maxLevel
+    local nextLevel = isMax and maxLevel or currentLevel + 1
+
+    local msgRet = Msg.gc.GC_HEROARTIFACTS_LV_QUERY
+    msgRet.artifactsLv = currentLevel
+    msgRet.artifactsLvMax = maxLevel
+    populateTotalAttrMsg(msgRet.nowLevelAttrs, currentLevel, 1)
+    populateNextAttrMsg(msgRet.nextLevelAttrs, nextLevel, 1, isMax)
+
+    local itemId, itemCnt = getNextStageCost(currentLevel, 1, isMax)
+    Grid.makeItem(msgRet.cost, itemId, itemCnt)
+
+    Msg.send(msgRet, human.fd)
+end
+
+-- 神威灵装升级
+function HeroArtifacts_UpGrade_Level(human, heroID, heroIndex)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if not isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    local currentLevel = artifactsData and artifactsData.level or 0
+
+    local UpGradeLvCfg = HeroArtifactsConfig.UpGradeLv
+    local maxLevel = UpGradeLvCfg[#UpGradeLvCfg].level
+
+    if currentLevel >= maxLevel then
+        return Broadcast.sendErr(human, Lang.HERO_AF_LV_MAX)
+    end
+
+    local itemId, itemCnt = getNextStageCost(currentLevel, 1)
+    if BagLogic.getItemCnt(human, itemId) < itemCnt then
+        return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
+    end
+    BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
+
+    upGradeArtifactsLv(heroGrid, 1)
+
+    HeroArtifacts_Lv_Query(human, heroID, heroIndex)
+
+    updatePowerAndRedDot(human, heroGrid, heroID, heroIndex)
+end
+
+-- 神威灵装升星信息查询
+function HeroArtifacts_Star_Query(human, heroID, heroIndex)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if not isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    local upGradeStarCfg = HeroArtifactsConfig.UpGradeStar
+
+    local currentStar = artifactsData and artifactsData.star or 0
+    local maxStar = upGradeStarCfg[#upGradeStarCfg].star
+    local isMax = currentStar >= maxStar
+    local nextStar = isMax and maxStar or currentStar + 1
+
+    local msgRet = Msg.gc.GC_HEROARTIFACTS_STAR_QUERY
+    msgRet.artifactsStar = currentStar
+    msgRet.artifactsStarMax = maxStar
+    populateTotalAttrMsg(msgRet.nowStarAttrs, currentStar, 2)
+    populateNextAttrMsg(msgRet.nextStarAttrs, nextStar, 2, isMax)
+
+    local itemId, itemCnt = getNextStageCost(currentStar, 2, isMax)
+    Grid.makeItem(msgRet.cost, itemId, itemCnt)
+
+    msgRet.effectArr[0] = 0
+    if artifactsData and artifactsData.effectArr then
+        populateEffectMsg(msgRet.effectArr, artifactsData.effectArr)
+    end
+
+    populateBeSkillMsg(msgRet.beSkillArr, artifactsData and artifactsData.beSkillArr)
+
+    Msg.send(msgRet, human.fd)
+end
+
+-- 神威灵装升星
+function HeroArtifacts_UpGrade_Star(human, heroID, heroIndex)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if not isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    local currentStar = artifactsData and artifactsData.star or 0
+
+    local upGradeStarCfg = HeroArtifactsConfig.UpGradeStar
+    local maxStar = upGradeStarCfg[#upGradeStarCfg].star
+
+    if currentStar >= maxStar then
+        return Broadcast.sendErr(human, Lang.HERO_AF_LV_STAR)
+    end
+
+    local itemId, itemCnt = getNextStageCost(currentStar, 2)
+    if BagLogic.getItemCnt(human, itemId) < itemCnt then
+        return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
+    end
+    BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
+
+    -- 更新英雄星级
+    upGradeArtifactsStar(heroGrid, 1)
+
+    local nextStar = currentStar + 1
+    local varCfg = HeroArtifactsConfig.Var[1]
+
+    -- 激活新的特效
+    if table.find(varCfg.activateEffectStarList, nextStar) then
+        local excludeList = nil
+        if artifactsData.effectArr then
+            excludeList = genExcludeList(artifactsData.effectArr)
+        end
+
+        local effectIdx = randEffect(HeroArtifactsConfig.EffectList, excludeList)
+        if not effectIdx then
+            return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
+        end
+
+        local effectLv = randEffectLv()
+        if not effectLv then
+            return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
+        end
+
+        artifactsData.effectArr = artifactsData.effectArr or {}
+        table.insert(artifactsData.effectArr, {idx = effectIdx, lv = effectLv})
+
+        -- 处理新获得特效后,可能导致洗练界面两边数量不一致的情况
+        if artifactsData.effectArrTemp then
+            table.insert(artifactsData.effectArrTemp, {idx = effectIdx, lv = effectLv})
+        end
+    end
+
+    -- 激活新的被动技能
+    if table.find(varCfg.activateBeSkillStarList, nextStar) then
+        local excludeList = nil
+        if artifactsData.beSkillArr then
+            excludeList = genExcludeList(artifactsData.beSkillArr)
+        end
+
+        local beSkillIdx = randEffect(HeroArtifactsConfig.BeSkillList, excludeList)
+        if not beSkillIdx then
+            return Broadcast.sendErr(human, Lang.COMMON_COMFIG_ERROR)
+        end
+
+        artifactsData.beSkillArr = artifactsData.beSkillArr or {}
+        table.insert(artifactsData.beSkillArr, {idx = beSkillIdx} )
+
+        -- 处理新获得被动技能后,可能导致洗练界面两边数量不一致的情况
+        if artifactsData.beSkillArrTemp then
+            table.insert(artifactsData.beSkillArrTemp, {idx = beSkillIdx} )
+        end
+    end
+
+    HeroArtifacts_Star_Query(human, heroID, heroIndex)
+
+    updatePowerAndRedDot(human, heroGrid, heroID, heroIndex)
+
+    -- 弹窗礼包
+    GiftLogic = GiftLogic or require("topup.GiftLogic")
+    GiftLogic.trigger(human, GiftLogic.GIFT_ARTIFACTS_UPGRADE_STAR, {currentVal = nextStar}, GiftLogic.GIFT_SEC_TYPE3)
+end
+
+-- 神威灵装特效洗练信息查询
+function HeroArtifacts_EffectRefine_Query(human, heroID, heroIndex)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if not isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    local msgRet = Msg.gc.GC_HEROARTIFACTS_EFFECT_REFINE_QUERY
+    msgRet.effectArr[0] = 0
+    msgRet.effectArrTemp[0] = 0
+
+    if artifactsData and artifactsData.effectArr then
+        populateEffectMsg(msgRet.effectArr, artifactsData.effectArr)
+    end
+
+    if artifactsData and artifactsData.effectArrTemp then
+        populateEffectMsg(msgRet.effectArrTemp, artifactsData.effectArrTemp)
+    end
+
+    msgRet.cost[0] = 0
+
+    local varCfg = HeroArtifactsConfig.Var[1]
+    local itemList = calcRefineCost(artifactsData and artifactsData.effectArr, varCfg.lockEffectCostIdList, varCfg.lockEffectCostNumList)
+    if not itemList then
+        return Broadcast.sendErr(human, Lang.DATA_ERR)
+    end
+
+    local len = 0
+    for itemId, itemCnt in pairs(itemList) do
+        len = len + 1
+        msgRet.cost[0] = len
+        Grid.makeItem(msgRet.cost[len], itemId, itemCnt)
+    end
+
+    Msg.send(msgRet, human.fd)
+end
+
+-- 锁定/解锁神威灵装特效
+function HeroArtifacts_Effect_Lock(human, heroID, heroIndex, effectIdxArr)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if not isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    if not artifactsData or not artifactsData.effectArr then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NO_EFFECT)
+    end
+
+    if artifactsData.effectArrTemp then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NEED_HANDLE_REFINE)
+    end
+
+    if effectIdxArr[0] >= #artifactsData.effectArr then
+        return Broadcast.sendErr(human, Lang.HERO_AF_CANNOT_LOCK)
+    end
+
+    local lockIdxArr = {}
+    for i=1,effectIdxArr[0] do
+        lockIdxArr[i] = effectIdxArr[i]
+    end
+
+    for _, v in ipairs(artifactsData.effectArr) do
+        if table.find(lockIdxArr, v.idx) then
+            v.isLock = 1
+        else
+            v.isLock = 0
+        end
+    end
+
+    HeroArtifacts_EffectRefine_Query(human, heroID, heroIndex)
+end
+
+-- 洗练神威灵装特效
+function HeroArtifacts_EffectRefine_Do(human, heroID, heroIndex)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if not isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    if not artifactsData or not artifactsData.effectArr then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NO_EFFECT)
+    end
+
+    local varCfg = HeroArtifactsConfig.Var[1]
+    local itemList = calcRefineCost(artifactsData.effectArr, varCfg.lockEffectCostIdList, varCfg.lockEffectCostNumList)
+    if not itemList then
+        return Broadcast.sendErr(human, Lang.DATA_ERR)
+    end
+
+    for itemId, itemCnt in pairs(itemList) do
+        if BagLogic.getItemCnt(human, itemId) < itemCnt then
+            return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
+        end
+    end
+
+    for itemId, itemCnt in pairs(itemList) do
+        BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
+    end
+
+    artifactsData.effectArrTemp = Util.copyTable(artifactsData.effectArr)
+
+    for _, effctInfo in ipairs(artifactsData.effectArrTemp) do
+        if not effctInfo.isLock or effctInfo.isLock == 0 then
+            local excludeList = genExcludeList(artifactsData.effectArrTemp)
+            local effectIdx = randEffect(HeroArtifactsConfig.EffectList, excludeList)
+            effctInfo.idx = effectIdx
+            local effectLv = randEffectLv()
+            effctInfo.lv = effectLv
+        end
+    end
+
+    HeroArtifacts_EffectRefine_Query(human, heroID, heroIndex)
+end
+
+-- 处理洗练出的神威灵装特效
+-- opType: 0-放弃,1-替换
+function HeroArtifacts_EffectRefine_Handle(human, heroID, heroIndex, opType)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if not isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
+    end
+
+    if opType ~= 0 and opType ~= 1 then
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    if not artifactsData or not artifactsData.effectArrTemp then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NO_REFINE_EFFECT)
+    end
+
+    if opType == 1 then
+        for i, v in ipairs(artifactsData.effectArrTemp) do
+            artifactsData.effectArr[i].idx = v.idx
+            artifactsData.effectArr[i].lv = v.lv
+        end
+    end
+
+    artifactsData.effectArrTemp = nil
+
+    HeroArtifacts_EffectRefine_Query(human, heroID, heroIndex)
+
+    updatePower(human)
+
+    updateHeroAttr(human, heroID, heroIndex)
+end
+
+-- 神威灵装被动技能洗练信息查询
+function HeroArtifacts_BeSkillRefine_Query(human, heroID, heroIndex)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if not isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    local msgRet = Msg.gc.GC_HEROARTIFACTS_BESKILL_REFINE_QUERY
+    msgRet.beSkillArr[0] = 0
+    msgRet.beSkillArrTemp[0] = 0
+
+    if artifactsData and artifactsData.beSkillArr then
+        populateBeSkillMsg(msgRet.beSkillArr, artifactsData.beSkillArr)
+    end
+
+    if artifactsData and artifactsData.beSkillArrTemp then
+        populateBeSkillMsg(msgRet.beSkillArrTemp, artifactsData.beSkillArrTemp)
+    end
+
+    msgRet.cost[0] = 0
+
+    local varCfg = HeroArtifactsConfig.Var[1]
+    local itemList = calcRefineCost(artifactsData and artifactsData.beSkillArr, varCfg.lockBeSkillCostIdList, varCfg.lockBeSkillCostNumList)
+    if not itemList then
+        return Broadcast.sendErr(human, Lang.DATA_ERR)
+    end
+
+    local len = 0
+    for itemId, itemCnt in pairs(itemList) do
+        len = len + 1
+        msgRet.cost[0] = len
+        Grid.makeItem(msgRet.cost[len], itemId, itemCnt)
+    end
+
+    Msg.send(msgRet, human.fd)
+end
+
+-- 锁定/解锁神威灵装被动技能
+function HeroArtifacts_BeSkill_Lock(human, heroID, heroIndex, beSkillIdxArr)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if not isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    if not artifactsData or not artifactsData.beSkillArr then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NO_BESKILL)
+    end
+
+    if artifactsData.beSkillArrTemp then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NEED_HANDLE_REFINE)
+    end
+
+    if beSkillIdxArr[0] >= #artifactsData.beSkillArr then
+        return Broadcast.sendErr(human, Lang.HERO_AF_CANNOT_LOCK)
+    end
+
+    local lockIdxArr = {}
+    for i=1,beSkillIdxArr[0] do
+        lockIdxArr[i] = beSkillIdxArr[i]
+    end
+
+    for _, v in ipairs(artifactsData.beSkillArr) do
+        if table.find(lockIdxArr, v.idx) then
+            v.isLock = 1
+        else
+            v.isLock = 0
+        end
+    end
+
+    HeroArtifacts_BeSkillRefine_Query(human, heroID, heroIndex)
+end
+
+-- 洗练神威灵装被动技能
+function HeroArtifacts_BeSkillRefine_Do(human, heroID, heroIndex)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if not isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    if not artifactsData or not artifactsData.beSkillArr then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NO_BESKILL)
+    end
+
+    local varCfg = HeroArtifactsConfig.Var[1]
+    local itemList = calcRefineCost(artifactsData.beSkillArr, varCfg.lockBeSkillCostIdList, varCfg.lockBeSkillCostNumList)
+    if not itemList then
+        return Broadcast.sendErr(human, Lang.DATA_ERR)
+    end
+
+    for itemId, itemCnt in pairs(itemList) do
+        if BagLogic.getItemCnt(human, itemId) < itemCnt then
+            return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
+        end
+    end
+
+    for itemId, itemCnt in pairs(itemList) do
+        BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
+    end
+
+    artifactsData.beSkillArrTemp = Util.copyTable(artifactsData.beSkillArr)
+
+    for _, beSkillInfo in ipairs(artifactsData.beSkillArrTemp) do
+        if not beSkillInfo.isLock or beSkillInfo.isLock == 0 then
+            local excludeList = genExcludeList(artifactsData.beSkillArrTemp)
+            local beSkillIdx = randEffect(HeroArtifactsConfig.BeSkillList, excludeList)
+            beSkillInfo.idx = beSkillIdx
+        end
+    end
+
+    HeroArtifacts_BeSkillRefine_Query(human, heroID, heroIndex)
+end
+
+-- 处理洗练出的神威灵装被动技能
+-- opType: 0-放弃,1-替换
+function HeroArtifacts_BeSkillRefine_Handle(human, heroID, heroIndex, opType)
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if not isOpen(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    if not isActivate(heroGrid) then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NOT_ACTIVATE)
+    end
+
+    if opType ~= 0 and opType ~= 1 then
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    local artifactsData = getArtifactsData(heroGrid)
+    if not artifactsData or not artifactsData.beSkillArrTemp then
+        return Broadcast.sendErr(human, Lang.HERO_AF_NO_REFINE_BESKILL)
+    end
+
+    if opType == 1 then
+        for i, v in ipairs(artifactsData.beSkillArrTemp) do
+            artifactsData.beSkillArr[i].idx = v.idx
+        end
+    end
+    artifactsData.beSkillArrTemp = nil
+
+    HeroArtifacts_BeSkillRefine_Query(human, heroID, heroIndex)
+
+    updatePower(human)
+
+    updateHeroAttr(human, heroID, heroIndex)
+end

+ 32 - 2
script/module/hero/HeroLogic.lua

@@ -78,6 +78,7 @@ local HeroSeed = require("hero.HeroSeed")
 local DeleteHeroConfig = require("excel.delteHero")
 local AnotherWorldBattleNS = require("anotherWorldBattle.AnotherWorldBattleNS")
 local HeroTianYuan = require("hero.HeroTianYuan")
+local HeroArtifacts = require("hero.HeroArtifacts")
 
 
 HERO_MAX_STAR    =        15    -- 目前英雄最大星级
@@ -443,6 +444,7 @@ function sendHeroGridDynamic(human, heroGrid, index, isQuery)
 	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
+	msgRet.canArtifacts = HeroArtifacts.isArtifactsDot(human, heroGrid) == true and 1 or 0
 
 	local bingShuState = BingshuLogic.isBingShuDot(human, heroGrid)
 	if bingShuState == -1 then
@@ -1634,12 +1636,25 @@ function sendHuituiQuery(human, heroID, heroIndex)
 	end
 
 	local tianYuanReturnItem = HeroTianYuan.CalcReturnItem(human, heroGrid)
-		if tianYuanReturnItem then
+	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
+
+
+	local artifactsReturnItems = HeroArtifacts.CalcReturnItem(human, heroGrid)
+	if artifactsReturnItems then
+		for itemId, itemCnt in pairs(artifactsReturnItems) 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
@@ -1734,6 +1749,16 @@ function huituiHero(human, heroID, heroIndex)
 		HeroTianYuan.ResetTianYuanData(human, heroGrid)
 	end
 
+	-- 英雄神威灵装返还材料
+	local artifactsReturnItems = HeroArtifacts.CalcReturnItem(human, heroGrid)
+	if artifactsReturnItems then
+		for itemId, itemCnt in pairs(artifactsReturnItems) do
+			items[itemId] = (items[itemId] or 0) + itemCnt
+		end
+
+		-- 重置英雄神威灵装数据
+		HeroArtifacts.ResetArtifactsData(human, heroGrid)
+	end
 
 	heroGrid.star = star
 	heroGrid.lv = targetLv
@@ -2079,6 +2104,11 @@ function isHeroDot(human, heroGrid)
 		return true
 	end
 
+	-- 英雄神威灵装
+	if HeroArtifacts.isArtifactsDot(human, heroGrid) then
+		return true
+	end
+	
 end
 
 -- 升级判定

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

@@ -219,6 +219,7 @@ GC_HERO_BAG_DYNAMIC = {
 	{"canWeapon",   1,      "byte"},
 	{"canSeed",   	1,      "byte"},
 	{"canTianYuan", 1,      "byte"},
+	{"canArtifacts",1,      "byte"},
 }
 
 -- 获取配置英雄属性
@@ -681,7 +682,7 @@ GC_HERO_HUITUI_QUERY = {
 	{"oldSimple",	1,		HeroSimple},	-- 原有英雄信息
 	{"newSimple",	1,		HeroSimple},	-- 新英雄信息
 	{"needItem",	1,		ItemData},		-- 消耗道具
-	{"returnItems",	22,		ItemData},		-- 返还道具列表, 增加专属武器材料返还, 长度由10->14
+	{"returnItems",	24,		ItemData},		-- 返还道具列表
 	{"returnHeros",	20,		HeroSimple},	-- 返还英雄列表
 }
 
@@ -1024,4 +1025,149 @@ CG_HEROTY_STAGE_UPGRADE = {
 	{"heroIndex",		1,		"short"}, -- 英雄index
 }
 
+-------------------------------------------------------------------------------------
+
+-----------------------------------英雄天赋系统---------------------------------------
+-- 灵装信息
+HEROARTIFACTS_EFFECT_DETAILEDINFO = {
+	{"idx",				1,		"byte"},   -- idx, 用于洗练相关操作
+	{"name",			1,		"string"}, -- 名字
+	{"desc",			1,		"string"}, -- 描述
+	{"isLock",			1,		"byte"},   -- 是否锁定, 0-否, 1-是
+	{"isActivate",		1,		"byte"},   -- 是否激活, 0-否, 1-是
+	{"activateStarCond",1,		"byte"},   -- 激活需要星级
+	{"level",			1,		"byte"},   -- 等级
+}
+
+-- 查询英雄神威灵装信息
+CG_HEROARTIFACTS_BASE_QUERY = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+GC_HEROARTIFACTS_BASE_QUERY = {
+	{"artifactsLv",		1,		"short"}, 	-- 灵装当前等级
+	{"artifactsStar",	1,		"byte"}, 	-- 灵装当前星级
+	{"nowLevelAttrs",	4,		Attr}, 		-- 当前灵装等级的总加成
+	{"nowStarAttrs",	4,		Attr}, 		-- 当前灵装星级的总加成
+	{"effectArr",		5,		HEROARTIFACTS_EFFECT_DETAILEDINFO}, -- 特效
+	{"beSkillArr",		7,		HEROARTIFACTS_EFFECT_DETAILEDINFO}, -- 被动技能
+	{"isActivate",		1,		"byte"},   -- 是否激活, 0-否, 1-是
+	{"ActivateCost", 	1,     ItemData},	-- 激活消耗的道具
+}
+
+-- 激活灵装
+CG_HEROARTIFACTS_ACTIVATE = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+
+
+
+-- 查询英雄神威灵装升级信息
+CG_HEROARTIFACTS_LV_QUERY = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+GC_HEROARTIFACTS_LV_QUERY = {
+	{"artifactsLv",		1,		"short"}, 	-- 灵装当前等级
+	{"artifactsLvMax",	1,		"short"}, 	-- 灵装最高等级
+	{"nowLevelAttrs",	4,		Attr}, 		-- 当前灵装等级的总加成
+	{"nextLevelAttrs",	4,		Attr}, 		-- 下一级增加的加成
+	{"cost", 			1,     ItemData},	-- 升级消耗的道具,没法升级后数量为0
+}
+-- 英雄神威灵装升级
+CG_HEROARTIFACTS_UPGRADE_LV = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+
+
+
+-- 查询英雄神威灵装升星信息
+CG_HEROARTIFACTS_STAR_QUERY = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+GC_HEROARTIFACTS_STAR_QUERY = {
+	{"artifactsStar",		1,		"byte"}, 	-- 灵装当前星级
+	{"artifactsStarMax",	1,		"byte"}, 	-- 灵装最高星级
+	{"nowStarAttrs",		4,		Attr}, 		-- 当前灵装星级的总加成
+	{"nextStarAttrs",		4,		Attr}, 		-- 下一星级增加的属性
+	{"cost", 				1,      ItemData},	-- 升星消耗的道具,没法升星后数量为0
+	{"effectArr",			5,		HEROARTIFACTS_EFFECT_DETAILEDINFO}, -- 特效
+	{"beSkillArr",			7,		HEROARTIFACTS_EFFECT_DETAILEDINFO}, -- 被动技能
+}
+-- 英雄神威灵装升星
+CG_HEROARTIFACTS_UPGRADE_STAR = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+
+
+
+-- 查询英雄神威灵装特效洗练查询
+CG_HEROARTIFACTS_EFFECT_REFINE_QUERY = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+GC_HEROARTIFACTS_EFFECT_REFINE_QUERY = {
+	{"effectArr",		5,		HEROARTIFACTS_EFFECT_DETAILEDINFO}, -- 特效
+	{"effectArrTemp",	5,		HEROARTIFACTS_EFFECT_DETAILEDINFO}, -- 新洗练出的特效(右边)
+	{"cost", 			3,      ItemData},	-- 洗练消耗的道具
+}
+
+-- 锁定特效
+CG_HEROARTIFACTS_EFFECT_LOCK = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+	{"effectIdxArr",	4,		"byte"},   -- 要锁定的特效Idx数组
+}
+
+-- 特效洗练
+CG_HEROARTIFACTS_EFFECT_REFINE_DO = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+
+-- 处理洗练出的特效
+CG_HEROARTIFACTS_EFFECTREFINE_UPDATE = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+	{"opType",			1,		"byte"},  -- 操作类型,0-放弃洗练出的特效, 1-保存洗练出的特效
+}
+
+
+
+-- 查询英雄神威灵装被动技能洗练查询
+CG_HEROARTIFACTS_BESKILL_REFINE_QUERY = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+GC_HEROARTIFACTS_BESKILL_REFINE_QUERY = {
+	{"beSkillArr",		7,		HEROARTIFACTS_EFFECT_DETAILEDINFO}, -- 被动技能
+	{"beSkillArrTemp",	7,		HEROARTIFACTS_EFFECT_DETAILEDINFO}, -- 新洗练出的被动技能(右边)
+	{"cost", 			3,      ItemData},	-- 洗练消耗的道具
+}
+
+-- 锁定被动技能
+CG_HEROARTIFACTS_BESKILL_LOCK = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+	{"beSkillIdxArr",	6,		"byte"},   -- 要锁定的被动技能Idx数组
+}
+
+-- 洗练被动技能
+CG_HEROARTIFACTS_BESKILL_REFINE_DO = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+
+-- 处理洗练出的被动技能
+CG_HEROARTIFACTS_BESKILLREFINE_UPDATE = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+	{"opType",			1,		"byte"},   -- 操作类型,0-放弃洗练出的被动技能, 1-保存洗练出的被动技能
+}
+
+
 -------------------------------------------------------------------------------------

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

@@ -46,6 +46,7 @@ local HeroPubLogic = require("hero.HeroPubLogic")
 local HeroSeed = require("hero.HeroSeed")
 local ElfLogic = require("elf.ElfLogic")
 local HeroTianYuan = require("hero.HeroTianYuan")
+local HeroArtifacts = require("hero.HeroArtifacts")
 
 
 local function printAttr(attr, szText)
@@ -184,7 +185,7 @@ function calcHeroGrid(heroGrid, index, human)
 	HeroSeed.doCalcHero(human, heroGrid, HERO_OTHER_ATTRS) -- 英雄种子
 	ElfLogic.doCalcHero(human, HERO_OTHER_ATTRS) --精灵系统
 	HeroTianYuan.doCalcHero(human, heroGrid, HERO_OTHER_ATTRS) -- 英雄天元
-	
+	HeroArtifacts.doCalcHero(human, heroGrid, HERO_OTHER_ATTRS) -- 英雄神威灵装
 
 	--不同模块在英雄属性计算 end	
 	

+ 18 - 4
script/module/role/RoleDefine.lua

@@ -31,9 +31,9 @@ POJIA			= 110 -- 破甲 万分比
 MIANKONG_RATE	= 111 -- 免控率 万分比
 JIANSHANG_RATE	= 112 -- 减伤率 万分比
 SHENSHENG_HURT_RATE = 113 --神圣伤害 万分比
-SHANBI			= 114	--闪避
+SHANBI			= 114	--闪避 万分比
 KONG_RATE		= 115 -- 控率 万分比
-POJIA_DK		= 116 -- 破甲抵抗
+POJIA_DK		= 116 -- 破甲抵抗 万分比
 
 -- 内部使用属性(201-300)
 ATK_RATE		= 201 -- 攻击百分比 万分比
@@ -76,7 +76,7 @@ STATUS_MIANYI_RATE7 = 233 --对中毒免疫率 万分比
 STATUS_MIANYI_ZUZHOU = 280 --对诅咒免疫率 万分比
 STATUS_MIANYI_CHENSHUI = 281 --对沉睡免疫率 万分比
 
-STATUS_MIANYI_RATE8 = 259 -- 免疫所有负面状态率
+STATUS_MIANYI_RATE8 = 259 -- 免疫所有负面状态率 万分比
 
 
 HP_ADD_RATE			= 234 --受到治疗效果 万分比
@@ -105,7 +105,7 @@ ANTI_BAOJI_HURT_RATE = 252	--抗暴击伤害率
 
 JOB_JIANSHANG_RATE1  = 253 -- 对虎卫减伤加成 万分比
 JOB_JIANSHANG_RATE2  = 254 -- 对猛将减伤加成 万分比
-JOB_JIANSHANG_RATE3  = 255 -- 对谋士减伤加成 万分比
+JOB_JIANSHANG_RATE3  = 255 -- 对谋士减伤加成 万分比1
 JOB_JIANSHANG_RATE4  = 256 -- 对方士减伤加成 万分比
 JOB_JIANSHANG_RATE5  = 257 -- 对傀儡减伤加成 万分比
 
@@ -196,6 +196,15 @@ PANEL_ATTR_KEY = {
 	[POJIA_DK] = 1,
 }
 
+
+-- 绝对值属性Id列表
+local ABS_ATTR_ID_LIST = {
+	[ATK] = 1,
+	[DEF] = 1,
+	[HP] = 1,
+	[SPEED] = 1,
+}
+
 function isPanelAttr(key)
 	if PANEL_ATTR_KEY[key] then
 		return true
@@ -216,4 +225,9 @@ end
 --使用几何计算的属性
 function isBasicRate(key)
 	return BASIC_RATE_KEY[key]
+end
+
+-- 是否是绝对值属性
+function isAbsAttr(key)
+	return ABS_ATTR_ID_LIST[key]
 end

+ 7 - 0
script/module/role/RoleHeadLogic.lua

@@ -1009,4 +1009,11 @@ function GetCorrectBodyId(human)
 	return nowBodyId
 end
 
+function GM_Active(human, headType, id)
+	active(human, headType, id)
+end
+
+function GM_UnActive(human, headType, id)
+	unActive(human.db._id, headType, id)
+end
 

+ 5 - 0
script/module/roleSystem/RoleRealmLogic.lua

@@ -18,6 +18,7 @@ local TriggerLogic = require("trigger.TriggerLogic")
 local TriggerDefine = require("trigger.TriggerDefine")
 local TalismanLogic = require("talisman.TalismanLogic")
 
+local GiftLogic
 
 local REALM_UPGRADE_LOG = "realmUpgrade"
 
@@ -224,4 +225,8 @@ function realmUpgrade(human)
     ObjHuman.doCalc(human)
 
     TriggerLogic.PublishEvent(TriggerDefine.REALM_UPGRADE, human.db._id, 1, realmLv)
+
+    -- 弹窗礼包
+    GiftLogic = GiftLogic or require("topup.GiftLogic")
+    GiftLogic.trigger(human, GiftLogic.GIFT_REALM_UPGRADE_STAR, {currentVal = realmLv}, GiftLogic.GIFT_SEC_TYPE3)
 end

+ 2 - 1
script/module/serverCommerce/ServerCommerceActBattleGroundNS.lua

@@ -1183,9 +1183,10 @@ function getCombatObjList(human, side, args, combatType)
 
     local attrsChange = {
         [RoleDefine.ATK] = 2,
-        [RoleDefine.HP] = 2,
+        [RoleDefine.HP] = 1.5,
         [RoleDefine.BAOJI] = 1.7,
         [RoleDefine.HURT_RATE] = 2,
+        [RoleDefine.POJIA] = 1.2,
     }
 
     local fakeHuman = { db = {} }

+ 4 - 1
script/module/topup/GiftLogic.lua

@@ -32,11 +32,14 @@ GIFT_HERO_UPGRADE_STAR_DAILY = 8    -- 英雄升星, 每日只可触发一次, 
 
 GIFT_HEROSEED_UPGRADE_STAR = 9      -- 英雄种子
 GIFT_HEROTIANYUAN_UPGRADE_STAR = 10 -- 英雄天元
-GIFT_HEROWEAPON_UPGRADE_STAR = 11  -- 英雄专属武器
+GIFT_HEROWEAPON_UPGRADE_STAR = 11   -- 英雄专属武器
+GIFT_ARTIFACTS_UPGRADE_STAR = 12    -- 英雄神威灵装升星
+GIFT_REALM_UPGRADE_STAR = 13        -- 境界提升
 
 GIFT_TALISMAN_OPEN = 15           -- 开启秘宝玩法
 GIFT_WINNERRELIC_OPEN = 16        -- 开启圣遗物玩法
 GIFT_ELF_OPEN = 17                -- 开启精灵玩法
+GIFT_ARTIFACTS_OPEN = 18          -- 开启神威灵装玩法
 
 -- 每日只触发一次的礼包类型
 local dailyEventList = {