Explorar el Código

Merge branch '360Release' of http://43.226.57.217:3000/yishanyou/GongFuServer into 360Release

# Conflicts:
#	script/module/zhuanpan/ZhuanpanLogic.lua
pigflower hace 1 mes
padre
commit
d8c6a88966
Se han modificado 46 ficheros con 2215 adiciones y 195 borrados
  1. 3 0
      script/common/CommonDefine.lua
  2. 13 1
      script/common/Lang.lua
  3. 1 0
      script/common/LogDefine.lua
  4. 20 1
      script/common/ProtoID.lua
  5. 3 0
      script/core/ObjHuman.lua
  6. 1 1
      script/module/absAct/Proto.lua
  7. 90 14
      script/module/battle/BattleLogic.lua
  8. 3 1
      script/module/battle/Proto.lua
  9. 18 0
      script/module/chat/Gm.lua
  10. 6 4
      script/module/chengjiu/ChengjiuLogic.lua
  11. 80 0
      script/module/combat/BeSkill.lua
  12. 80 0
      script/module/combat/CombatBuff.lua
  13. 54 20
      script/module/combat/CombatCalc.lua
  14. 9 3
      script/module/combat/CombatImpl.lua
  15. 12 7
      script/module/combat/CombatLogic.lua
  16. 23 8
      script/module/combat/CombatObj.lua
  17. 3 2
      script/module/combat/CombatPosLogic.lua
  18. 44 0
      script/module/combat/Skill.lua
  19. 63 1
      script/module/dailyTask/HonorJourney.lua
  20. 12 0
      script/module/fuwen/FuwenLogic.lua
  21. 9 4
      script/module/godsArea/GodsAreaCS.lua
  22. 7 1
      script/module/guide/GuideLogic.lua
  23. 63 0
      script/module/hero/Handler.lua
  24. 1246 0
      script/module/hero/HeroArtifacts.lua
  25. 6 1
      script/module/hero/HeroExclusiveWeapon.lua
  26. 5 4
      script/module/hero/HeroGrid.lua
  27. 32 2
      script/module/hero/HeroLogic.lua
  28. 147 1
      script/module/hero/Proto.lua
  29. 3 2
      script/module/monster/MonsterGrid.lua
  30. 6 3
      script/module/role/RoleAttr.lua
  31. 18 4
      script/module/role/RoleDefine.lua
  32. 7 0
      script/module/role/RoleHeadLogic.lua
  33. 5 0
      script/module/roleSystem/RoleRealmLogic.lua
  34. 1 1
      script/module/roleSystem/RoleSystemDefine.lua
  35. 2 1
      script/module/serverCommerce/ServerCommerceActBattleGroundNS.lua
  36. 10 7
      script/module/serverCommerce/ServerCommerceManager.lua
  37. 79 21
      script/module/theStars/TheStarsLogic.lua
  38. 4 0
      script/module/topup/BuyLogic.lua
  39. 4 0
      script/module/topup/GiftLogic.lua
  40. 3 0
      script/module/trigger/TriggerDefine.lua
  41. 0 77
      script/module/trigger/TriggerLogic.lua
  42. 14 0
      script/module/voucher/VoucherInvest.lua
  43. 3 0
      script/module/voucher/VoucherShopDefine.lua
  44. 1 1
      script/module/winnerRelic/Proto.lua
  45. 1 1
      script/module/winnerRelic/WinnerRelicLogic.lua
  46. 1 1
      script/module/zhuanpan/ZhuanpanLogic.lua

+ 3 - 0
script/common/CommonDefine.lua

@@ -9,6 +9,9 @@ CHANNEL_TAG_SANLI_QQ = 4         -- 三狸QQ大厅
 CHANNEL_TAG_SANLI_H5= 5          -- 三狸H5
 CHANNEL_TAG_SANLI_H5_4399 = 6    -- 三狸H5-4399
 CHANNEL_TAG_WX = 11              -- 微信小程序,抖音游戏, 圣扬IOS
+CHANNEL_TAG_HP = 14              -- 虎扑
+CHANNEL_TAG_720 = 15             -- 720
+CHANNEL_TAG_MINNIGAME = 17       -- 美团, 华为, 淘宝
 
 
 CHANNEL_TAG_FT = 18             -- 繁体

+ 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"

+ 3 - 0
script/core/ObjHuman.lua

@@ -924,6 +924,9 @@ function updateDaily(human, isGm)
 	ClutterDataLogic.updateDaily(human)
 	BreakThroughTheme.updateDaily(human)
 	QQBigShot.updateDaily(human)
+
+	TriggerLogic.PublishEvent(TriggerDefine.EVENT_TYPE_DAILY_LOGIN, human.db._id, 1)
+	
 	-- 红点 发送  理论放最后
 	RoleSystemLogic.onLogin(human)
 end

+ 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},         --所有商品数据
 }
 
 --购买请求协议

+ 90 - 14
script/module/battle/BattleLogic.lua

@@ -4,6 +4,7 @@ local BattleExcel_Elite = require("excel.battle_elite")
 local BattleExcel_Hard = require("excel.battle_hard")
 local MonsterExcel = require("excel.monster")
 local BattleMonsterExcel = require("excel.battlemonster")
+local BattleMonsterExcel2 = require("excel.battlemonster2")
 local DropExcel = require("excel.drop")
 local Msg = require("core.Msg")
 local ObjHuman = require("core.ObjHuman")
@@ -1537,7 +1538,7 @@ function hangFightQuery(human)
     local monsterOutID = nowNodeConfig.monsterOutID[teamIdx]
 
     --local monsterOutConfig = MonsterExcel.monsterOut[monsterOutID]
-    local monsterOutConfig = BattleMonsterExcel.monsterOut[monsterOutID]
+    local monsterOutConfig = BattleMonsterExcel.monsterOut[monsterOutID] or BattleMonsterExcel2.monsterOut[monsterOutID]
 
     local msgRet = Msg.gc.GC_BATTLE_HANG_FIGHT
     local len = 0
@@ -1545,7 +1546,7 @@ function hangFightQuery(human)
         local monsterID = monster[1]
         len = len + 1
         -- local monsterConfig = MonsterExcel.monster[monsterID]
-        local monsterConfig = BattleMonsterExcel.monster[monsterID]
+        local monsterConfig = BattleMonsterExcel.monster[monsterID] or BattleMonsterExcel2.monster[monsterID]
         local skillConfig = SkillExcel.skill[monsterConfig.normalAtkID]
         wrapHangFightNet(msgRet.monsterList[len], monsterConfig, skillConfig)
     end
@@ -1763,7 +1764,7 @@ function fontVideoInfo(human, net, monsterConfig)
             -- body数据
             cnt = cnt + 1
             -- local config = MonsterExcel.monster[v[1]]
-            local config = BattleMonsterExcel.monster[v[1]]
+            local config = BattleMonsterExcel.monster[v[1]] or BattleMonsterExcel2.monster[v[1]]
             if config then
                 local normalAtkID = config.normalAtkID
 
@@ -1775,7 +1776,10 @@ function fontVideoInfo(human, net, monsterConfig)
 
                 local attrID = monsterConfig.attrID[k]
                 -- local attrConfig = MonsterExcel.monsterAttr[attrID].attrs
-                local attrConfig = BattleMonsterExcel.monsterAttr[attrID].attrs
+                local attrConfig = BattleMonsterExcel.monsterAttr[attrID] and BattleMonsterExcel.monsterAttr[attrID].attrs
+                if not attrConfig then
+                    attrConfig = BattleMonsterExcel2.monsterAttr[attrID] and BattleMonsterExcel2.monsterAttr[attrID].attrs
+                end
                 if not attrConfig then
                     print("[fontVideoInfo] 根据attrID获取到的 attrConfig 为空 k = "..k.. " attrID = "..attrID)
                 end
@@ -1969,7 +1973,7 @@ function query(human)
     end
 
     -- local monsterConfig = MonsterExcel.monsterOut[monsterOutId]
-    local monsterConfig = BattleMonsterExcel.monsterOut[monsterOutId]
+    local monsterConfig = BattleMonsterExcel.monsterOut[monsterOutId] or BattleMonsterExcel2.monsterOut[monsterOutId]
     if not monsterConfig then
         print("[BattleLogic query] 获取到的 monsterConfig 为空 monsterOutId = "..monsterOutId)
         return
@@ -2197,16 +2201,74 @@ function battleWorldMapQuery(human)
     
     local tBattleLevelPlayerList = BATTLE_LEVEL_PLAYER_LIST[nBattleType]
 
-    for i = 1, len do
-        local v = worldMapConfig[i]
-        msgRet.worldMap[i].mapID = i
+    -- for i = 1, len do
+    --     local v = worldMapConfig[i]
+    --     msgRet.worldMap[i].mapID = i
+    --     msgRet.worldMap[i].mapName = v.name or ""
+    --     msgRet.worldMap[i].mapBuild = v.build or 0
+    --     msgRet.worldMap[i].mapBg = v.bg or 0
+    --     msgRet.worldMap[i].mapPos[0] = 2
+    --     msgRet.worldMap[i].mapPos[1] = v.pos[1]
+    --     msgRet.worldMap[i].mapPos[2] = v.pos[2]
+    --     msgRet.worldMap[i].status =(battleNodeConfig.mapID >= i) and 1 or 0
+    --     msgRet.worldMap[i].story = v.des or ""
+    --     if battleNodeConfig.mapID == i then
+    --         msgRet.worldMap[i].maxLevel = battleNodeConfig.maxLevel
+    --         msgRet.worldMap[i].curLevel = battleNodeConfig.curLevel
+    --     else
+    --         msgRet.worldMap[i].maxLevel = 0
+    --         msgRet.worldMap[i].curLevel = 0
+    --     end
+
+    --     local reward = v.reward
+    --     local l = 0
+    --     msgRet.worldMap[i].chapterReward[0] = #reward
+    --     for _, rewardData in pairs(reward) do
+    --         l = l + 1
+    --         Grid.makeItem(msgRet.worldMap[i].chapterReward[l], rewardData[1], rewardData[2])
+    --     end
+
+    --     msgRet.worldMap[i].chapterDot = 0
+    --     if isChapterDot(human, i) then
+    --         msgRet.worldMap[i].chapterDot = 1
+    --     end
+
+    --     local cnt = 0
+    --     -- BATTLE_LEVEL_PLAYER_LIST[i] = BATTLE_LEVEL_PLAYER_LIST[i] or { }
+    --     tBattleLevelPlayerList[i] = tBattleLevelPlayerList[i] or { }
+    --     -- for s, t in pairs(BATTLE_LEVEL_PLAYER_LIST[i]) do
+    --     for s, t in pairs(tBattleLevelPlayerList[i]) do
+    --         cnt = cnt + 1
+    --         RoleLogic.makeRoleBase(t, msgRet.worldMap[i].roleList[cnt])
+    --         if cnt >= 3 then
+    --             break
+    --         end
+    --     end
+    --     msgRet.worldMap[i].roleList[0] = cnt
+    -- end
+
+    -- msgRet.worldMap[0] = len
+
+
+    msgRet.worldMap[0] = 0
+    msgRet.isStart = 1
+    msgRet.isEnd = 0
+
+    local i = 0
+    local msgOneceMaxLen = 20
+
+    for k, v in ipairs(worldMapConfig) do
+        i = i + 1
+        msgRet.worldMap[0] = i
+
+        msgRet.worldMap[i].mapID = k
         msgRet.worldMap[i].mapName = v.name or ""
         msgRet.worldMap[i].mapBuild = v.build or 0
         msgRet.worldMap[i].mapBg = v.bg or 0
         msgRet.worldMap[i].mapPos[0] = 2
         msgRet.worldMap[i].mapPos[1] = v.pos[1]
         msgRet.worldMap[i].mapPos[2] = v.pos[2]
-        msgRet.worldMap[i].status =(battleNodeConfig.mapID >= i) and 1 or 0
+        msgRet.worldMap[i].status =(battleNodeConfig.mapID >= k) and 1 or 0
         msgRet.worldMap[i].story = v.des or ""
         if battleNodeConfig.mapID == i then
             msgRet.worldMap[i].maxLevel = battleNodeConfig.maxLevel
@@ -2225,15 +2287,15 @@ function battleWorldMapQuery(human)
         end
 
         msgRet.worldMap[i].chapterDot = 0
-        if isChapterDot(human, i) then
+        if isChapterDot(human, k) then
             msgRet.worldMap[i].chapterDot = 1
         end
 
         local cnt = 0
         -- BATTLE_LEVEL_PLAYER_LIST[i] = BATTLE_LEVEL_PLAYER_LIST[i] or { }
-        tBattleLevelPlayerList[i] = tBattleLevelPlayerList[i] or { }
+        tBattleLevelPlayerList[k] = tBattleLevelPlayerList[k] or { }
         -- for s, t in pairs(BATTLE_LEVEL_PLAYER_LIST[i]) do
-        for s, t in pairs(tBattleLevelPlayerList[i]) do
+        for s, t in pairs(tBattleLevelPlayerList[k]) do
             cnt = cnt + 1
             RoleLogic.makeRoleBase(t, msgRet.worldMap[i].roleList[cnt])
             if cnt >= 3 then
@@ -2241,10 +2303,24 @@ function battleWorldMapQuery(human)
             end
         end
         msgRet.worldMap[i].roleList[0] = cnt
+
+        if i >= msgOneceMaxLen then
+            len = len - i
+            if len <= 0 then
+                msgRet.isEnd = 1
+                return Msg.send(msgRet, human.fd)
+            end
+
+            Msg.send(msgRet, human.fd)
+            i = 0
+            msgRet.isStart = 0
+        end
     end
 
-    msgRet.worldMap[0] = len
-    Msg.send(msgRet, human.fd)
+    if i > 0 then
+        msgRet.isEnd = 1
+        Msg.send(msgRet, human.fd)
+    end
 end
 
 function battleNodeQuery(human, mapID)

+ 3 - 1
script/module/battle/Proto.lua

@@ -109,7 +109,9 @@ CG_BATTLE_WORLD_MAP_QUERY = {
 }
 
 GC_BATTLE_WORLD_MAP_QUERY = {
-    {"worldMap",100,BattleWorldMap},           -- 世界地图
+    {"worldMap",20,BattleWorldMap},           -- 世界地图
+	{"isStart",	1,	    "byte"},	           -- 是否是第一段数据,0-否,1-是
+	{"isEnd",	1,	    "byte"},	           -- 是否是最后一段数据,0-否,1-是
 }
 
 -- 当前关卡玩家查询

+ 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

+ 6 - 4
script/module/chengjiu/ChengjiuLogic.lua

@@ -344,10 +344,12 @@ function onCallback(human,taskType,cnt)
 
             human.db.chengjiu.task = human.db.chengjiu.task or {}
             human.db.chengjiu.task[k] = CJ_TASK_STATE_1
-            RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2001)
-            RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2002)
-            RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2004)
-            RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2031)
+            RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2001, true)
+            RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2002, true)
+
+            RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2006, true)
+            RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2021, true)
+            RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_2031, true)
             
             local msgRet = Msg.gc.GC_CHENGJIU_SET
             msgRet.taskID = k

+ 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

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

@@ -394,6 +394,42 @@ function getBuffer(obj)
 	return obj.buffer
 end
 
+-- 计算偷取的属性
+local function calcStealAttr(buffer, conf)
+	local attrList = {}
+	if type(buffer.arg) == "table" then
+		for j = 1,#buffer.arg do
+			local attrData = buffer.arg[j]
+			local key = attrData[1]
+			local value = 0
+			if not conf.attrRate then
+				value = attrData[2]
+			else
+				value = conf.attrRate
+			end
+			-- RoleAttr.updateValue(key,value,bufferAttr,true)
+			attrList[key] = (attrList[key] or 0) + value
+		end
+	else
+		for j = 1,#conf.args do
+			local attrData = conf.args[j]
+			local key = attrData[1]
+			local value = 0
+			if not conf.attrRate then
+				value = attrData[2] 
+			else
+				value = conf.attrRate
+			end
+			-- RoleAttr.updateValue(key,buffer.arg or (value * buffer.cnt),bufferAttr,true)
+			attrList[key] = (attrList[key] or 0) + (buffer.arg or (value * buffer.cnt))
+		end
+	end
+
+	return attrList
+end
+
+
+
 function onBufferChange(obj)
 	local bufferAttr = obj.bufferAttr
 	RoleAttr.initCombatAttr(bufferAttr)
@@ -499,9 +535,13 @@ function onBufferChange(obj)
 				end	
 			end
 		end
+
 		bufferCmd[conf.cmd] = bufferCmd[conf.cmd] or {}
 		bufferCmd[conf.cmd][#bufferCmd[conf.cmd] + 1] = i
 	end
+
+
+
 	CombatObj.calcAttr(obj)
 	for pos in pairs(changeList) do
 		CombatObj.calcAttr(CombatImpl.objList[pos])
@@ -850,6 +890,26 @@ function reviceObj(attackPos, obj, bufferID, skillID)
 	return 0
 end
 
+-- 英雄被偷取属性,并转移到施法者身上
+local function stealAttrHandle(buffer)
+	local conf = GetBuffConfig(buffer.id)
+	if conf.cmd == "stealattr" then
+		local attacker = buffer.attackPos and CombatImpl.objList[buffer.attackPos]
+		if attacker then
+			local noInitAttr = attacker.noInitAttr
+			local attrList = calcStealAttr(buffer, conf)
+
+			for attrId, attrVal in pairs(attrList) do
+				RoleAttr.updateValue(attrId, -attrVal, noInitAttr, true)
+			end
+
+			CombatObj.calcAttr(attacker)
+		end
+	end
+end
+
+
+
 
 function addBuffer(attackPos,obj, id, skillID,arg,parentConf)
 	-- local conf = BufferExcel.buffer[id]
@@ -1013,6 +1073,8 @@ function addBuffer(attackPos,obj, id, skillID,arg,parentConf)
 
 	onBufferChange(obj)
 
+	stealAttrHandle(buffer)
+
 	if conf.isAddCmd == 1 and handler[conf.cmd] then
 		handler[conf.cmd](obj,buffer,conf)
 		HANDLER_ONCE[conf.cmd] = nil
@@ -1064,6 +1126,19 @@ local function beforeDelBuffer(obj, buffer)
           CombatObj.onHpCB(obj, d, obj.pos)
        end
     end
+
+	-- 施法者给英雄上了偷取属性的buff, 英雄的buff被删除时, 也需要将施法者偷取的属性重置
+	if conf.cmd == "stealattr" then
+		local attacker = buffer.attackPos and CombatImpl.objList[buffer.attackPos]
+		if attacker then
+			local noInitAttr = attacker.noInitAttr
+			local attrList = calcStealAttr(buffer, conf)
+			for attrId, attrVal in pairs(attrList) do
+				RoleAttr.updateValue(attrId, attrVal, noInitAttr, true)
+			end
+			CombatObj.calcAttr(attacker)
+		end
+	end
 end
 
 function delBuffer(obj, ind)
@@ -1527,6 +1602,11 @@ function onUseBeSkill(attacker,skillConfig,objs,cmdTargets, arg, arg2)--attacker
 						end
 					end
 
+					if bufferConf.cmd == "stealattr" then
+                        local value = CombatCalc.calcValue(attacker, target, bufferConf.args[1], bufferConf.args[2])
+                        bufferArg1 = { { bufferConf.args[3], value } }
+                    end
+
 					if bufferConf.cmd == "shaqi" or bufferConf.cmd == "shuihua" then
 						for k=1, addBuffTimes do
 							addBuffer(attackPos,target, bufferID,skillConfig.id,bufferArg1 or bufferArg)

+ 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)

+ 9 - 3
script/module/combat/CombatImpl.lua

@@ -11,6 +11,7 @@ local BeSkill = require("combat.BeSkill")
 local HeroExcel = require("excel.hero").hero
 local MonsterExcel = require("excel.monster").monster
 local BattleMonsterExcel = require("excel.battlemonster").monster
+local BattleMonsterExcel2 = require("excel.battlemonster2").monster
 local CombatExcel = require("excel.combat").combat
 local SkillExcel = require("excel.skill").skill
 -- local BufferExcel = require("excel.buffer").buffer
@@ -188,10 +189,15 @@ function setData(pos, hero)
     if hero.type == CombatDefine.COMBAT_OBJ_TYPE1 then
        obj.hurtType = HeroExcel[obj.id].hurtType
     else
-       obj.hurtType = MonsterExcel[obj.id].hurtType
+       obj.hurtType = MonsterExcel[obj.id] and MonsterExcel[obj.id].hurtType
 	   if not obj.hurtType then
-			if BattleMonsterExcel[obj.id] then
-				obj.hurtType = BattleMonsterExcel[obj.id].hurtType or 0
+			if BattleMonsterExcel[obj.id] or BattleMonsterExcel2[obj.id] then
+				-- obj.hurtType = BattleMonsterExcel[obj.id].hurtType or 0
+				if BattleMonsterExcel[obj.id] then
+					obj.hurtType = BattleMonsterExcel[obj.id].hurtType or 0
+				else
+					obj.hurtType = BattleMonsterExcel2[obj.id].hurtType or 0
+				end
 			else
 				obj.hurtType = 0
 			end

+ 12 - 7
script/module/combat/CombatLogic.lua

@@ -17,6 +17,7 @@
 local CombatExcel = require("excel.combat")
 local MonsterExcel = require("excel.monster")
 local BattleMonsterExcel = require("excel.battlemonster")
+local BattleMonsterExcel2 = require("excel.battlemonster2")
 local HeroExcel = require("excel.hero")
 local SkillExcel = require("excel.skill")
 local BufferExcel = require("excel.buffer")
@@ -62,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 = {
@@ -313,7 +316,7 @@ function getConfigByObj(obj)
 	if obj.type == CombatDefine.COMBAT_OBJ_TYPE1 then
 		return HeroExcel.hero[id]
 	end
-	return MonsterExcel.monster[id] or BattleMonsterExcel.monster[id]
+	return MonsterExcel.monster[id] or BattleMonsterExcel.monster[id] or BattleMonsterExcel2.monster[id]
 end
 
 -- 创建战斗Human
@@ -358,7 +361,7 @@ end
 
 -- 根据怪物表信息创建临时对象
 function createMonsterObj(id, lv, attrID, index, objType, monsterOutConfig, attrInput)
-	local monsterConfig = MonsterExcel.monster[id] or BattleMonsterExcel.monster[id]
+	local monsterConfig = MonsterExcel.monster[id] or BattleMonsterExcel.monster[id] or BattleMonsterExcel2.monster[id]
 	if not monsterConfig then return end			
 
 	local obj = {}
@@ -467,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
@@ -499,7 +504,7 @@ end
 -- 根据怪物组id获取出战英雄列表
 function getMonsterObjList(monsterOutID, objType, args)
 	if not monsterOutID then return end
-	local monsterOutConfig = MonsterExcel.monsterOut[monsterOutID] or BattleMonsterExcel.monsterOut[monsterOutID]
+	local monsterOutConfig = MonsterExcel.monsterOut[monsterOutID] or BattleMonsterExcel.monsterOut[monsterOutID] or BattleMonsterExcel2.monsterOut[monsterOutID]
 	if not monsterOutConfig then return end
 
     local formation = monsterOutConfig.formation
@@ -1105,7 +1110,7 @@ function fontFinishResultNet(net, obj)
 	net.star = obj.star or 0
 
     local heroConfig = HeroExcel.hero[net.heroID]
-    local monsterConfig = MonsterExcel.monster[net.heroID] or BattleMonsterExcel.monster[net.heroID]
+    local monsterConfig = MonsterExcel.monster[net.heroID] or BattleMonsterExcel.monster[net.heroID] or BattleMonsterExcel2.monster[net.heroID]
     if obj.type == CombatDefine.COMBAT_OBJ_TYPE1 then
        net.name = heroConfig and heroConfig.name or ""
        net.body = heroConfig and heroConfig.body.."" or ""
@@ -1224,7 +1229,7 @@ function sendCombatFinish(human, combatInfo)
 	BeginStory.handleBattle8End(human, combatInfo.isWin, combatInfo.isVideo, combatInfo.type, msgRet)
 	BeginStory.handleBattle12End(human, combatInfo.isWin, combatInfo.isVideo, combatInfo.type, msgRet)
 
-	if CombatDefine.COMBAT_TYPE1 == combatInfo.type  or CombatDefine.COMBAT_TYPE30 == combatInfo.type then
+	if CombatDefine.COMBAT_TYPE1 == combatInfo.type  or CombatDefine.COMBAT_TYPE30 == combatInfo.type or CombatDefine.COMBAT_TYPE38 == combatInfo.type then
 		msgRet.data.nBattleType = human.db.battleType
 		if true == combatInfo.isWin and BattleLogic.BattleLogic_IsLastLevels(human, human.db.battleType) then
 			msgRet.data.param = "0|0|0"
@@ -1874,7 +1879,7 @@ end
 
 -- 根据怪物组id获取外显
 function getMonsterIDByOutID(monsterOutID, args)
-    local mocf = MonsterExcel.monsterOut[monsterOutID] or BattleMonsterExcel.monsterOut[monsterOutID]
+    local mocf = MonsterExcel.monsterOut[monsterOutID] or BattleMonsterExcel.monsterOut[monsterOutID] or BattleMonsterExcel2.monsterOut[monsterOutID]
     if not mocf then return end
 
     local memberCnt = #mocf.member
@@ -1895,7 +1900,7 @@ function getMonsterIDByOutID(monsterOutID, args)
     local monsterLv = minfo[2]
     local mcf = monsterID and MonsterExcel.monster[monsterID]
 	if not mcf then
-		mcf = BattleMonsterExcel.monster[monsterID]
+		mcf = BattleMonsterExcel.monster[monsterID] or BattleMonsterExcel2.monster[monsterID]
 	end
 	
     if not mcf then return end

+ 23 - 8
script/module/combat/CombatObj.lua

@@ -65,6 +65,7 @@ function initAfterStart()
 		obj.bufferAttr		= bufferAttr
 		obj.bufferAttr2		= bufferAttr2
 		obj.relicAttr 		= relicAttr
+		obj.noInitAttr = {}	-- 战斗过程中临时修改的且不需要每次都重置的属性列表
 		obj.buffer = {[0] = 0}  -- obj身上的buff集合,buff[0]表示buff数量
 		obj.bufferCmd = {}		--控制类buffer
 		obj.skillList		= nil
@@ -192,6 +193,7 @@ function init(obj)
 		ProAttr = {},					-- 百分比属性
 		bSpecialDef = nil,				-- 防御为0特殊标识
 	}
+	obj.noInitAttr = {}
 end
 
 --辅助对象相关
@@ -315,6 +317,10 @@ function calcAttr(obj)
 		attr[key] = (attr[key] or 0) + val
 	end
 
+	for key ,val in pairs(obj.noInitAttr) do
+		attr[key] = (attr[key] or 0) + val
+	end
+
 	calcFinalAttr(attr)
 	checkLimit(attr)
 
@@ -446,22 +452,29 @@ function updateHp(obj, value,isRevive,delayCB, attackPos,type)
 	end
 
 
-	-- 判断伤害能否被抵消
-	local isOffset = false
+	-- 判断技能伤害能否被抵消
+	local isOffsetSkillHurt = false
 	if value < 0 and (type == SKILL_HP_TYPE or type == EXTRA_HP_TYPE) then -- 是扣血, 并且来自技能本身或技能特殊效果
 		targetBuffCMD = "jiahu"
 		if CombatBuff.isStatus(obj, {targetBuffCMD} ) then
 			extraHandle = extraHandle or {}
 			extraHandle[1] = 2
 			extraHandle[2] = targetBuffCMD
-			isOffset = true
+			isOffsetSkillHurt = true
 		end
 	end
 
-
+	-- 技能伤害能否免疫
+	local isImmunitySkillHurt = false
+	if value < 0 and (type == SKILL_HP_TYPE or type == EXTRA_HP_TYPE) then -- 是扣血, 并且来自技能本身或技能特殊效果
+		targetBuffCMD = "jiahu2"
+		if CombatBuff.isStatus(obj, {targetBuffCMD} ) then
+			isImmunitySkillHurt = true
+		end
+	end
 
 	-- 护盾值检测
-	if value < 0 and (not isAbsorb and not isOffset) then
+	if value < 0 and (not isAbsorb and not isOffsetSkillHurt and not isImmunitySkillHurt) then
 		local huDunValue = CombatBuff.getBuffHuDun(obj)
 		if huDunValue > 0 then
 			if huDunValue >= (-value) then
@@ -472,7 +485,6 @@ function updateHp(obj, value,isRevive,delayCB, attackPos,type)
 				CombatBuff.updateHuDun(obj, -huDunValue)
 			end
 		end
-
 	end
 
 	-- 加血上限判断
@@ -491,7 +503,7 @@ function updateHp(obj, value,isRevive,delayCB, attackPos,type)
 	end
 
 
-	if isAbsorb or isOffset then
+	if isAbsorb or isOffsetSkillHurt then
 		extraHandle[3] = d
 		d = 0
 
@@ -499,12 +511,15 @@ function updateHp(obj, value,isRevive,delayCB, attackPos,type)
 		-- return 0, value
 	end
 
+	if isImmunitySkillHurt then
+		d = 0
+	end
 
 	if sum < 0 then
 		sum = 0
 	end
 	local ret = beforeUpdateHp(obj, sum, value, d)
-	if ret and (not isAbsorb and not isOffset) then
+	if ret and (not isAbsorb and not isOffsetSkillHurt and not isImmunitySkillHurt) then
 		obj.hp = sum
 	end
 

+ 3 - 2
script/module/combat/CombatPosLogic.lua

@@ -15,6 +15,7 @@ local HeroExcel = require("excel.hero")
 local MonsterExcel = require("excel.monster").monster
 local MonsterOutExcel = require("excel.monster").monsterOut
 local BattleMonsterExcel = require("excel.battlemonster")
+local BattleMonsterExcel2 = require("excel.battlemonster2")
 local CombatPosExcel = require("excel.combatPos")
 local FormationExcel = CombatPosExcel.formation
 local DefineExcel = CombatPosExcel.define[1]
@@ -592,12 +593,12 @@ end
 
 -- 获得 怪物组的 光环  血量加成
 function getCombatHpMaxJiaCheng(monsterOutID)
-    local config = MonsterOutExcel[monsterOutID] or BattleMonsterExcel.monsterOut[monsterOutID]
+    local config = MonsterOutExcel[monsterOutID] or BattleMonsterExcel.monsterOut[monsterOutID] or BattleMonsterExcel2.monsterOut[monsterOutID]
     local jobList = {}
     if config and #config.member > 5 then
         for i,member in ipairs(config.member) do
             local monsterID = member[1]
-            local monsterConfig = MonsterExcel[monsterID] or BattleMonsterExcel.monster[monsterID]
+            local monsterConfig = MonsterExcel[monsterID] or BattleMonsterExcel.monster[monsterID] or BattleMonsterExcel2.monster[monsterID]
             jobList[monsterConfig.job] = jobList[monsterConfig.job] or 0
 			jobList[monsterConfig.job] = jobList[monsterConfig.job] + 1
         end

+ 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

+ 63 - 1
script/module/dailyTask/HonorJourney.lua

@@ -185,6 +185,18 @@ local function HonorJourney_AddTaskPoint(human, nPoint)
     human.db.HonorJourney.nPoint = human.db.HonorJourney.nPoint + nPoint
 end
 
+
+local function HonorJourney_GetDayLoginTime(human)
+    local tDBData = HonorJourneyTask_GetTaskDB(human)
+    return tDBData.dayLoginTime
+end
+
+local function HonorJourney_UpdateDayLoginTime(human)
+    local tDBData = HonorJourneyTask_GetTaskDB(human)
+    tDBData.dayLoginTime = os.time()
+end
+
+
 -- 检测任务状态
 function HonorJourney_CheckTaskStatus(human,nID)
     local nNowFinishNum = HonorJourney_GetTaskFinishNum(human, nID)
@@ -590,7 +602,7 @@ end
 local tEventHandler = nil
 -- 起服处理
 local function HonorJourneyTask_EvnentCommon(nEventType, uuid, nValue, nArgumentType)
-    print("当前进入荣耀历程增加次数..............................",nEventType, nArgumentType)
+    -- print("当前进入荣耀历程增加次数..............................",nEventType, nArgumentType)
     local human = ObjHuman.onlineUuid[uuid]
     if not human then
         print("[HonorJourneyTask_EvnentCommon] 玩家不在线了? nEventType = "..nEventType)
@@ -937,6 +949,39 @@ local function HonorJourneyTask_EvnentGetJingLing(nEventType, uuid, nValue1, nVa
     end
 end
 
+-- 每日登录
+local function HonorJourneyTask_EvnentDailyLogin(nEventType, uuid, nValue1)
+    local human = ObjHuman.onlineUuid[uuid]
+    if not human then
+        return
+    end
+
+    if not nValue1 then
+        return
+    end
+    
+    local tTaksID = {}
+    for nID, v in pairs(HonorJourneyExcel.HonorJourney) do
+        if v.triggerType == nEventType then
+            local nState = HonorJourney_GetTaskStatus(human, nID)
+            if nState == CommonDefine.COMMON_PRIZE_STATE_NOGET then
+                table.insert(tTaksID, nID)
+            end
+        end
+    end
+
+    if tTaksID and nil ~= _G.next(tTaksID) then
+        for _, nID in ipairs(tTaksID) do
+            HonorJourneyTask_AddTaskFinishNum(human, nID, nValue1)
+            HonorJourney_CheckTaskStatus(human, nID)
+        end
+
+        HonorJourney_UpdateDayLoginTime(human)
+        RoleSystemLogic.onDot(human, RoleSystemDefine.ROLE_SYS_ID_803)
+    end
+end
+
+
 function Init()
     tEventHandler = {
         [TriggerDefine.CHAT_TIMES] = HonorJourneyTask_EvnentCommon,
@@ -973,6 +1018,7 @@ function Init()
         [TriggerDefine.EVENT_TYPE_GETPOINTHERO] = HonorJourneyTask_EvnentGetPointHero,
         [TriggerDefine.EVENT_TYPE_JINGLING_GET] = HonorJourneyTask_EvnentGetJingLing,
         [TriggerDefine.EVENT_TYPE_JINGLING_STAR] = HonorJourneyTask_EvnentCommon,
+        [TriggerDefine.EVENT_TYPE_DAILY_LOGIN] = HonorJourneyTask_EvnentDailyLogin,
     }
 end
 
@@ -1034,6 +1080,9 @@ local function HonorJourney_OnLoginSubEvent(human)
     HonorJourney_SubEvent(uuid, TriggerDefine.EVENT_TYPE_JINGLING_GET)
 
     HonorJourney_SubEvent(uuid, TriggerDefine.EVENT_TYPE_JINGLING_STAR)
+
+    -- 每日登录
+    HonorJourney_SubEvent(uuid, TriggerDefine.EVENT_TYPE_DAILY_LOGIN)
 end
 
 -- 回调,增加次数
@@ -1052,6 +1101,17 @@ function HonorJourneyTask_EventCallBack(nEventType, uuid, nValue1, nValue2, nVal
     -- print("[HonorJourneyTask_EventCallBack] 触发事件回调 处理结束 ")
 end
 
+
+local function dailyLoginCheck(human)
+    local dayLoginTime = HonorJourney_GetDayLoginTime(human)
+    local now = os.time()
+
+    if not dayLoginTime or not Util.isSameDayByTimes(dayLoginTime,now) then
+        HonorJourneyTask_EvnentDailyLogin(TriggerDefine.EVENT_TYPE_DAILY_LOGIN, human.db._id, 1)
+    end
+end
+
+
 function onLogin(human)	
     -- print("当前进入荣耀历程登录")
 
@@ -1062,6 +1122,8 @@ function onLogin(human)
     HonorJourney_OnLoginSubEvent(human)
 
 	-- HonorJourneyTaskQuery(human, true)
+
+    dailyLoginCheck(human)
 end
 
 function HonorJourney_GMClear(human)

+ 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
         -- 通知失败方更新称号

+ 7 - 1
script/module/guide/GuideLogic.lua

@@ -37,12 +37,18 @@ local OpenServerGiftLogic = require("present.OpenServerGiftLogic")
 local MaiDianDefine = require("MaiDian.MaiDianDefine")
 local MainDianLogic = require("MaiDian.MaiDianLogic")
 local GuideJumpExcel = require("excel.guideJump")
+local CommonDefine = require("common.CommonDefine")
 
 local WeiLen = 30
 local GUIDECMD_LIST = {"battle"}
 local GUIDEID_FIRST = 0
 local GUIDEID_SPECIALSID = 103
 
+local FORCE_GUIDE_CHANNEL_LIST = { --即使问卷调查选对游戏, 依然要强制新手引导的渠道
+    [CommonDefine.CHANNEL_TAG_MINNIGAME] = true,
+}
+
+
 -- 指引中断处理方式
 SKIPTYPE_RESET = 0              -- 该指引重新从第一步开始
 SKIPTYPE_JUMP = 1               -- 该指引直接跳过
@@ -931,7 +937,7 @@ function stepwenjuanchose(human, szChoseID)
         human.db.bGetJumpPrize = true
     end
 
-    if true == bJump then
+    if true == bJump and not FORCE_GUIDE_CHANNEL_LIST[human.phpChanelID] then
         local nMaxID = 0
         for nID, v in pairs(GuideExcel.main_guide) do
             nMaxID = math.max(nMaxID, nID)

+ 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

+ 6 - 1
script/module/hero/HeroExclusiveWeapon.lua

@@ -14,8 +14,9 @@ local ObjHuman = require("core.ObjHuman")
 local Config = require("excel.weapon").weapon
 local HeroExcel = require("excel.hero").hero
 
+local GiftLogic
 
-local COND_STAR = 12   -- 获得超武需要的星级
+local COND_STAR = 11   -- 获得超武需要的星级
 local STAGELV = 20     -- 每20级获得一个特殊效果
 local LOGTAG = "HeroExclusiveWeapon" --日志标识
 local SSRGRADE = 4          -- SSR英雄的grade值
@@ -328,6 +329,10 @@ function UpgradeWeapon(human, heroID, heroIndex)
     HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
     ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
     HeroLogic.refreshDot(human, heroGrid.uuid)
+
+    -- 弹窗礼包
+    GiftLogic = GiftLogic or require("topup.GiftLogic")
+    GiftLogic.trigger(human, GiftLogic.GIFT_HEROWEAPON_UPGRADE_STAR, {currentVal = nextWeaponLv}, GiftLogic.GIFT_SEC_TYPE1)
 end
 
 

+ 5 - 4
script/module/hero/HeroGrid.lua

@@ -25,6 +25,7 @@ local UpNeedExcel = require("excel.upNeed")
 local HeroExcel = require("excel.hero")
 local MonsterExcel = require("excel.monster")
 local BattleMonsterExcel = require("excel.battlemonster")
+local BattleMonsterExcel2 = require("excel.battlemonster2")
 local ObjHuman = require("core.ObjHuman")
 local RoleDefine = require("role.RoleDefine")
 local HeroDefine = require("hero.HeroDefine")
@@ -386,7 +387,7 @@ end
 function makeHeroSimpleByMonsterID(net, id, others)
 	makeHeroSimpleByID(net, nil, nil, others)
 
-	local mcf = MonsterExcel.monster[id] or BattleMonsterExcel.monster[id]
+	local mcf = MonsterExcel.monster[id] or BattleMonsterExcel.monster[id] or BattleMonsterExcel2.monster[id]
 	if not mcf then return end
 
 	net.id = id	
@@ -665,7 +666,7 @@ function makeHeroInfo(net, grid)
 end
 
 function makeMonsterSimpleData(net, id, lv)
-	local mcf = MonsterExcel.monster[id] or BattleMonsterExcel.monster[id] 
+	local mcf = MonsterExcel.monster[id] or BattleMonsterExcel.monster[id] or BattleMonsterExcel2.monster[id]
 	if not mcf then return end
 	net.id = id or 0
 	net.icon = mcf.head
@@ -678,11 +679,11 @@ end
 
 
 function getMonsterOutIDBody(id)
-	local monsterOutConfig = MonsterExcel.monsterOut[id]  or BattleMonsterExcel.monsterOut[id] 
+	local monsterOutConfig = MonsterExcel.monsterOut[id]  or BattleMonsterExcel.monsterOut[id] or BattleMonsterExcel2.monsterOut[id]
 	if not monsterOutConfig then return 0 end
 
 	local monsterID = monsterOutConfig.member[1][1]
-	local monsterConfig = MonsterExcel.monster[monsterID] or BattleMonsterExcel.monster[monsterID]
+	local monsterConfig = MonsterExcel.monster[monsterID] or BattleMonsterExcel.monster[monsterID] or BattleMonsterExcel2.monster[monsterID]
 	if not monsterConfig then return 0 end
 	return monsterConfig.body
 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-保存洗练出的被动技能
+}
+
+
 -------------------------------------------------------------------------------------

+ 3 - 2
script/module/monster/MonsterGrid.lua

@@ -2,10 +2,11 @@ local monsterConfig = require("excel.monster")
 local RoleAttr = require("role.RoleAttr")
 local RoleDefine = require("role.RoleDefine")
 local BattleMonsterExcel = require("excel.battlemonster")
+local BattleMonsterExcel2 = require("excel.battlemonster2")
 
 -- 创建一个怪物grid
 function createMonsterObj(monsterId, attrId, refreshData, deleteData)
-	local monsterCfg = monsterConfig.monster[monsterId] or BattleMonsterExcel.monster[monsterId] 
+	local monsterCfg = monsterConfig.monster[monsterId] or BattleMonsterExcel.monster[monsterId] or BattleMonsterExcel2.monster[monsterId]
 	if not monsterCfg then 
 		--assert(nil, "not monster id "..id)
 		return
@@ -42,7 +43,7 @@ end
 function createMonsterObjListByMonsterOutID(monsterOutID)
     if not monsterOutID then return end
 
-    local singleCfg = monsterConfig.monsterOut[monsterOutID] or BattleMonsterExcel.monsterOut[monsterOutID] 
+    local singleCfg = monsterConfig.monsterOut[monsterOutID] or BattleMonsterExcel.monsterOut[monsterOutID] or BattleMonsterExcel2.monsterOut[monsterOutID]
     local member = singleCfg.member
     local attrIds = singleCfg.attrID
 

+ 6 - 3
script/module/role/RoleAttr.lua

@@ -17,6 +17,7 @@ local HeroExcel = require("excel.hero").hero
 local MonsterExcel = require("excel.monster").monster
 local MonsterAttrExcel = require("excel.monster").monsterAttr
 local BattleMonsterExcel = require("excel.battlemonster")
+local BattleMonsterExcel2 = require("excel.battlemonster2")
 local Util = require("common.Util")
 local BeSkill = require("combat.BeSkill")
 local RoleHeadLogic = require("role.RoleHeadLogic")
@@ -45,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)
@@ -96,10 +98,11 @@ end
 
 -- 获取怪物属性 用的地方有点多,不一定改
 function calcMonsterConf(monsterID, attrID, attrInput)
-	local monsterConfig = MonsterExcel[monsterID] or BattleMonsterExcel.monster[monsterID]
+	local monsterConfig = MonsterExcel[monsterID] or BattleMonsterExcel.monster[monsterID] or BattleMonsterExcel2.monster[monsterID]
 	local attrsConfig = attrID and MonsterAttrExcel[attrID]
 	if not attrsConfig then
-		attrsConfig = attrID and BattleMonsterExcel.monsterAttr[attrID]
+		-- attrsConfig = attrID and BattleMonsterExcel.monsterAttr[attrID]
+		attrsConfig = attrID and (BattleMonsterExcel.monsterAttr[attrID] or BattleMonsterExcel2.monsterAttr[attrID])
 	end
 
 	if not attrsConfig then
@@ -182,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

+ 1 - 1
script/module/roleSystem/RoleSystemDefine.lua

@@ -82,7 +82,7 @@ ROLE_SYS_ID_1401 = 1401 -- 天梯
 ROLE_SYS_ID_2001 = 2001 -- 宝具-封印之章
 ROLE_SYS_ID_2002 = 2002 -- 宝具-守护之龙
 ROLE_SYS_ID_2003 = 2003 -- 宝具-守护之龙洗练
-ROLE_SYS_ID_2004 = 2004 --秘宝
+
 
 ROLE_SYS_ID_3001 = 3001 -- 福利
 ROLE_SYS_ID_3101 = 3101 -- 首充

+ 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 = {} }

+ 10 - 7
script/module/serverCommerce/ServerCommerceManager.lua

@@ -722,13 +722,16 @@ function onCharge(human, price, funcID, buyID)
         end
     end
 
-    local tBuyCfg = BuyConf.buy[buyID]
-    if tBuyCfg then
-        local region = human.region or "CN"
-        local nPoint = tBuyCfg[region]
-        CommerveManager_AddServerPoint(nPoint)
-        CommerveManager_AddHumanPint(human, nPoint)
-    end
+    -- local tBuyCfg = BuyConf.buy[buyID]
+    -- if tBuyCfg then
+    --     local region = human.region or "CN"
+    --     local nPoint = tBuyCfg[region]
+    --     CommerveManager_AddServerPoint(nPoint)
+    --     CommerveManager_AddHumanPint(human, nPoint)
+    -- end
+
+        CommerveManager_AddServerPoint(price)
+        CommerveManager_AddHumanPint(human, price)
 end
 
 -- 增加整个服务器的点数

+ 79 - 21
script/module/theStars/TheStarsLogic.lua

@@ -5,7 +5,7 @@ local MonsterExcel = require("excel.monster")
 local ThroneExcel = require("excel.throne")
 local MailExcel = require("excel.mail")
 local RoleExcel = require("excel.role")
-local Lang = require("common.Lang")
+-- local Lang = require("common.Lang")
 local Util = require("common.Util")
 local Lang = require("common.Lang")
 local Msg = require("core.Msg")
@@ -26,16 +26,33 @@ local MailManager = require("mail.MailManager")
 local TheStarsDBLogic = require("theStars.TheStarsDBLogic")
 local RoleSystemLogic = require("roleSystem.RoleSystemLogic")
 local RoleSystemDefine = require("roleSystem.RoleSystemDefine")
-local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
-local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
+-- local ChengjiuLogic = require("chengjiu.ChengjiuLogic")
+-- local ChengjiuDefine = require("chengjiu.ChengjiuDefine")
 local JjcLogic = require("jjc.JjcLogic")
 local ItemExcel = require("excel.item").item
 local MailDefine = require("mail.MailIdDefine")
 local ChatPaoMaLogic = require("chat.ChatPaoMaLogic")
 local HeroGrowUp = require("absAct.HeroGrowUp")
+local HeroLogic = require("hero.HeroLogic")
+local HeroExcel = require("excel.hero")
 
 local FAIL_COMBAT_CD = 1200                   -- 失败后冷却CD 1200
 
+
+local function getTargetHuman(playerUuid)
+    local targetHuman = ObjHuman.onlineUuid[playerUuid]
+    if not targetHuman then
+        local db = RoleDBLogic.getDb(playerUuid)
+        if db then
+            targetHuman = {}
+            targetHuman.db = db
+        end
+    end
+
+    return targetHuman
+end
+
+
 function isOpen(human,sendErr)
     if not RoleSystemLogic.isOpen(human, RoleSystemDefine.ROLE_SYS_ID_1303,sendErr) then
         return
@@ -138,19 +155,43 @@ function theStarsThroneQuery(human, id, vestId)
 
     msgRet.lv = throne.lv
     msgRet.nowEvolveCnt = throne.evolve or 0
+    msgRet.monsterList[0] = 0
 
-    local monsterOutID = getMonsterOutID(throne.id, throne.lv)
-    local monsterOutConfig = MonsterExcel.monsterOut[monsterOutID]
-    local count = #monsterOutConfig.member
-    for i = 1,count do
-        local monsterID = monsterOutConfig.member[i][1]
-        local lv = monsterOutConfig.member[i][2]
-	    local mcf = MonsterExcel.monster[monsterID]
-        msgRet.monsterList[i].body = mcf.body
-        msgRet.monsterList[i].lv = throne.lv
-        msgRet.monsterList[i].camp = mcf.camp
+    if throne.uuid then
+        local targetHuman = getTargetHuman(throne.uuid)
+        if targetHuman then
+            local len = 0
+            local heroList = CombatPosLogic.getCombatHeros(targetHuman, CombatDefine.COMBAT_TYPE5)
+            for i, heroUuid in ipairs(heroList or {}) do
+                if i >= CombatDefine.COMBAT_HERO_CNT then -- 不显示援军
+                    break
+                end
+                local heroGrid = HeroLogic.getHeroGridByUuid(targetHuman, heroUuid)
+                if heroGrid then
+                    len = len + 1
+                    msgRet.monsterList[0] = len
+
+                    local heroCfg = HeroExcel.hero[heroGrid.id]
+                    msgRet.monsterList[len].body = heroGrid.body or heroCfg.body
+                    msgRet.monsterList[len].lv = heroGrid.lv or 0
+                    msgRet.monsterList[len].camp = heroCfg.camp
+                end
+            end
+        end
+    else
+        local monsterOutID = getMonsterOutID(throne.id, throne.lv)
+        local monsterOutConfig = MonsterExcel.monsterOut[monsterOutID]
+        local count = #monsterOutConfig.member
+        for i = 1,count do
+            local monsterID = monsterOutConfig.member[i][1]
+            local lv = monsterOutConfig.member[i][2]
+            local mcf = MonsterExcel.monster[monsterID]
+            msgRet.monsterList[i].body = mcf.body
+            msgRet.monsterList[i].lv = throne.lv
+            msgRet.monsterList[i].camp = mcf.camp
+        end
+        msgRet.monsterList[0] = count
     end
-    msgRet.monsterList[0] = count
 
     Msg.send(msgRet, human.fd)
 end
@@ -166,7 +207,7 @@ end
 
 local function getNewLvExp(id, lv, exp, evolveCnt)
 	local starsCf = ThroneExcel.theStars[lv]
-	exp = evolveCnt * starsCf.evolveExp + exp 
+	exp = evolveCnt * starsCf.evolveExp + exp
     while exp >= starsCf.exp do
         lv = lv + 1 
         exp = exp - starsCf.exp
@@ -185,7 +226,7 @@ function checkCombatPos(human, args)
     local evolveCnt = tonumber(args[2] or 0)
     local vestId = args[3]
 
-	if evolveCnt < 1 then return end -- 升级次数小于1,怀疑有人作弊
+	-- if evolveCnt < 1 then return end -- 升级次数小于1,怀疑有人作弊
 
     local cf = ThroneExcel.throne[id]
     if not cf then return end
@@ -197,7 +238,7 @@ function checkCombatPos(human, args)
 
     local leftTime = getFightCoolTime(human)
     if leftTime > 0 then
-       return Broadcast.sendErr(human, Util.format(Lang.THRONE_CHALLENGE_TIME_INIT, math.ceil(leftTime / 60))) 
+       return Broadcast.sendErr(human, Util.format(Lang.THRONE_CHALLENGE_TIME_INIT, math.ceil(leftTime / 60)))
     end
 
 	if human.db._id == throne.uuid then --不能挑战自己
@@ -230,6 +271,9 @@ function fight(human, args)
     cbParam.vestId = throne._id
     cbParam.id = throne.id    
     cbParam.evolveCnt = tonumber(args[2] or 0)
+
+    
+    args[#args+1] = throne.uuid
     
     CombatLogic.combatBegin(human, cf.mapID, args, CombatDefine.COMBAT_TYPE5, cbParam)
     
@@ -287,7 +331,7 @@ function onFightEnd(human, result, type, cbParam, combatInfo)
         combatInfo.endParam = ItemExcel[config.chenghaoID].icon.."|"..key1Value.."|"..key2Value
 
         -- 重新设置敌人名字
-        combatInfo.defender.name = Util.format(Lang.THE_STARS_DEFINCER, cbParam.newLv)
+        -- combatInfo.defender.name = Util.format(Lang.THE_STARS_DEFINCER, cbParam.newLv)
         CombatVideo.saveThroneVideo(throne.id, combatInfo,cbParam.evolveCnt)
     else
         human.db.throneTime = os.time() -- 失败刷新CD
@@ -351,10 +395,24 @@ function getCombatMonsterOutID(human, side, args)
     return getMonsterOutID(throne.id, newLv)
 end
 
-function getCombatObjList(human,side)
-    if side ~= CombatDefine.ATTACK_SIDE then return end
+function getCombatObjList(human,side, args)
+    -- if side ~= CombatDefine.ATTACK_SIDE then return end
+
+    local h
+    if side == CombatDefine.ATTACK_SIDE then
+        h = human
+    else
+        local playerUuuid = args and args[#args]
+        h = getTargetHuman(playerUuuid)
+    end
+
+    if not h then
+        return
+    end
+
+    -- return CombatLogic.getHumanObjList(human, CombatDefine.COMBAT_TYPE1)
 
-    return CombatLogic.getHumanObjList(human, CombatDefine.COMBAT_TYPE1)
+    return CombatLogic.getHumanObjList(h, CombatDefine.COMBAT_TYPE1)
 end
 
 

+ 4 - 0
script/module/topup/BuyLogic.lua

@@ -486,6 +486,10 @@ local notAddTopupList = {
 	[90512] = true,
 	[90513] = true,
 	[90514] = true,
+	[90515] = true,
+	[90516] = true,
+	[90517] = true,
+	[90518] = true,
 }
 
 

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

@@ -32,10 +32,14 @@ GIFT_HERO_UPGRADE_STAR_DAILY = 8    -- 英雄升星, 每日只可触发一次, 
 
 GIFT_HEROSEED_UPGRADE_STAR = 9      -- 英雄种子
 GIFT_HEROTIANYUAN_UPGRADE_STAR = 10 -- 英雄天元
+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 = {

+ 3 - 0
script/module/trigger/TriggerDefine.lua

@@ -67,6 +67,8 @@ JINGYAN_DEL                = 60          --  消耗经验
 EVENT_TYPE_GETPOINTHERO    = 61          --  获得指定英雄(包含星级)
 EVENT_TYPE_JINGLING_GET    = 62          --  获得精灵
 EVENT_TYPE_JINGLING_STAR   = 63          --  精灵总星数
+EVENT_TYPE_DAILY_LOGIN     = 64          --  每日登录
+
 
 --触发事件后, 新值与旧值相加
 TRIGGERADDTB = {
@@ -109,6 +111,7 @@ TRIGGERADDTB = {
     [SET_MODELING] = SET_MODELING,
     [EQUIP_REFINEMENT] = EQUIP_REFINEMENT,
     [UNIONS_CHALLENGE_BOSS] = UNIONS_CHALLENGE_BOSS,
+    [EVENT_TYPE_DAILY_LOGIN] = EVENT_TYPE_DAILY_LOGIN,
 }
 
 --触发事件后, 用新值替换旧值

+ 0 - 77
script/module/trigger/TriggerLogic.lua

@@ -9,42 +9,6 @@ local TriggerDefine = require("trigger.TriggerDefine")
 local moniterTbl = {}
 
 
---检测触发事件是否正确
--- local function checkTrigger(arg)
---     local errTag = nil
---     if type(arg) == "table" then
---         for _, tag in ipairs(arg) do
---             if not TriggerDefine.TRIGGERADDTB[tag] and not TriggerDefine.TRIGGERUPDATETB[tag] then
---                 errTag = tag
---                 break
---             end
---         end
---     else
---         if not TriggerDefine.TRIGGERADDTB[arg] and not TriggerDefine.TRIGGERUPDATETB[arg] then
---             errTag = arg
---         end
---     end
-
---     if errTag then
---         assert(false, string.format("注册事件不存在, tag = %s", errTag))
---     end
---     return true
--- end
-
-
---注册订阅
--- function RegisterMoniter(triggerArr, cbFunc)
---     checkTrigger(triggerArr)
-
---     local handler = #moniterTbl+1
---     moniterTbl[handler] = {
---         triggerArr = triggerArr,
---         cbFunc = cbFunc,
---     }
-
---     return handler
--- end
-
 -- 注册事件
 -- 为每个玩家维护订阅表
 function SubscribeEvent(eventType, uuid, callback)
@@ -105,47 +69,6 @@ function onLogout(human)
 end
 
 
---移除订阅
--- function RemoveMoniter(handler)
---     if not handler then
---         return
---     end
-
---     table.remove(moniterTbl, handler)
--- end
-
-
---广播
--- function Broadcast(human, triggerTag, val, isAdd)
---     for tag, v in ipairs(moniterTbl) do
---         if table.find(v.triggerArr, triggerTag) then
---             local f = v.cbFunc
---             local res = pcall(f, human, triggerTag, val, isAdd)
---             if not res then
---                 print(string.format("广播失败, handler = %s", tag))
---             end
---         end
---     end
--- end
-
-
--- --触发事件
--- function Trigger(human, triggerTag, val)
---     local isAdd = false
---     if TriggerDefine.TRIGGERADDTB[triggerTag] then
---         isAdd = true
---     end
-
---     if not isAdd then
---         if not TriggerDefine.TRIGGERUPDATETB[triggerTag] then
---             assert(false, string.format("触发事件不存在, tag = %s", triggerTag))
---         end
---     end
-
-
---     Broadcast(human, triggerTag, val, isAdd)
--- end
-
 
 
 

+ 14 - 0
script/module/voucher/VoucherInvest.lua

@@ -144,6 +144,20 @@ function isOpen(human, YYInfo, funcConfig)
     if human.version and table.find(VoucherShopDefine.VOUCHER_NO_OPEN_TAG_ARR, human.version) then
         return false
     end
+
+    if human.db.phpChanelID and (human.db.phpChanelID == 13 or human.db.phpChanelID == "13") then
+        return false
+    end
+
+    if human.db.lv < VoucherShopDefine.VOUCHER_OPEN_LV_COND then
+        return false
+    end
+
+    if not human.db.nFirstBuy or human.db.nFirstBuy ~= 1 then
+        --print("[VoucherShop is open] 33333")
+        return false
+    end
+
     return true
 end
 

+ 3 - 0
script/module/voucher/VoucherShopDefine.lua

@@ -35,3 +35,6 @@ VOUCHERSTATUS_GET = 1           -- 已获取
 
 -- 当标识是这些时,代金券活动不开启
 VOUCHER_NO_OPEN_TAG_ARR = {"minigame_ts_ios", "iostishen", "minigame_ts"}
+
+
+VOUCHER_OPEN_LV_COND = 40   -- 代金券商店,代金券投资开启需要的等级

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

@@ -28,7 +28,7 @@ CG_SACRED_RELIC_QUERY = {
 -- 服务端返回遗物列表
 GC_SACRED_RELIC_QUERY = {
     {"nAllStar",			1,			"int"},				-- 总星数
-    {"SacredRelicConfigs", 25, SacredRelicNet},-- 星级配置
+    {"SacredRelicConfigs", 30, SacredRelicNet},-- 星级配置
 }
 
 -- 客户端请求激活/升星遗物

+ 1 - 1
script/module/winnerRelic/WinnerRelicLogic.lua

@@ -26,7 +26,7 @@ local LOGTYPE = "WinnerRelic"
 local relicUpgradeConfig = relicModule.RelicUpgrade  -- 获取升级配置表
 local relicDataConfig = relicModule.RelicData       -- 获取遗物数据表
 local COND_TOWER_LEVEL = 500  --开启本系统需要通关恶魔之塔的层数
-local WINNERRELIC_HEROSTAR = 13     -- 需要穿戴的星级
+local WINNERRELIC_HEROSTAR = 12     -- 需要穿戴的星级
 local WINNERRELIC_2_CHENGJIU_TASKID = 405 -- 圣遗物系统对应的成就任务Id
 --[[
     DB =

+ 1 - 1
script/module/zhuanpan/ZhuanpanLogic.lua

@@ -1522,7 +1522,7 @@ local TB_DESKTOP_REWARD      = {{118, 5}}     -- 添加桌面奖励(仅1次)
 
 -- 渠道校验:仅 pf == "tbMiniGame" 的玩家可参与
 local function isTbMiniApp(human)
-	return human.pf == "tbMiniGame"
+	return human.pf_info and human.pf_info.pf == "tbMiniGame"
 end
 
 -- 淘宝小程序桌面活动查询