Просмотр исходного кода

1.增加英雄种子系统功能 2.增加寻星礼包相关逻辑

gitxsm 7 месяцев назад
Родитель
Сommit
532389e4e9

+ 1 - 0
script/common/LogDefine.lua

@@ -307,6 +307,7 @@ DEFINE = {
 	cycleAct_makeFood		= 771,			-- 新商业化活动2 —— 烹饪嘉年华
 	HeroPub					= 772,			-- 英雄酒馆
 	HeroSeed				= 773,			-- 英雄种子
+	zhuanpanGift			= 774,			-- 寻星礼包
 }
 
 

+ 9 - 6
script/common/ProtoID.lua

@@ -1652,11 +1652,14 @@ _ENV[1688]="CG_UNLIMITDRAW_GET"
 _ENV[1689]="CG_COMMON_HUMAN_INFO"       -- 玩家通用的一些数据请求(是否首充等)
 _ENV[1690]="GC_COMMON_HUMAN_INFO"
 
--- _ENV[1691]="CG_HEROSEED_QUERY_ALL"
--- _ENV[1692]="GC_HEROSEED_QUERY_ALL"
--- _ENV[1693]="CG_HEROSEED_QUERY_SINGLE"
--- _ENV[1694]="GC_HEROSEED_QUERY_SINGLE"
--- _ENV[1695]="CG_HEROSEED_UPGRADE"
+_ENV[1691]="CG_HEROSEED_QUERY_ALL"
+_ENV[1692]="GC_HEROSEED_QUERY_ALL"
+_ENV[1693]="CG_HEROSEED_QUERY_SINGLE"
+_ENV[1694]="GC_HEROSEED_QUERY_SINGLE"
+_ENV[1695]="CG_HEROSEED_UPGRADE"
 
 -- _ENV[1697]="CG_OPENSERVER_GIFTPACKAGE_QUERY"
--- _ENV[1698]="GC_OPENSERVER_GIFTPACKAGE_QUERY"
+-- _ENV[1698]="GC_OPENSERVER_GIFTPACKAGE_QUERY"
+
+_ENV[1699]="CG_ZHUANPAN_GIFT_QUERY"
+_ENV[1700]="GC_ZHUANPAN_GIFT_QUERY"

+ 52 - 23
script/merge/MergeServerDefine.lua

@@ -73,6 +73,8 @@ CHANNEL_ID_SANLI_H5 = 5
 CHANNEL_ID_SANLI_4399 = 6
 CHANNEL_ID_SANLI_360 = 7
 
+CHANNEL_ID_SANLI_SHIYOU = 10
+
 -- 数据库名中字符串部分的格式
 DB_NAME_STR = "ckwy_fy_S"
 
@@ -93,6 +95,9 @@ CHANNEL_2_DBNUMBER = {
     -- 三狸H5,4399
     [CHANNEL_ID_SANLI_H5] = 550001,
     [CHANNEL_ID_SANLI_4399] = 550001,
+
+    -- 三狸视游
+    [CHANNEL_ID_SANLI_SHIYOU] = 750001,
 }
 
 -- 要进行合并的数据库所属渠道ID, 用于检测合错数据库的情况, 与下面的 MERGE_DB_TB 的值一一对应
@@ -100,40 +105,64 @@ CHANNEL_2_DBNUMBER = {
 MERGE_CHECK_TB = {
     -- 木子/Tap
     [CHANNEL_ID_TAP] = {
-        { {CHANNEL_ID_TAP, 21, 0},  {CHANNEL_ID_TAP, 22, 1} },
-        { {CHANNEL_ID_TAP, 23, 0},  {CHANNEL_ID_TAP, 24, 1} },
-        { {CHANNEL_ID_TAP, 25, 0},  {CHANNEL_ID_TAP, 26, 1} },
-        { {CHANNEL_ID_TAP, 27, 0},  {CHANNEL_ID_TAP, 28, 1} },
-        { {CHANNEL_ID_TAP, 29, 0},  {CHANNEL_ID_TAP, 30, 1} },
+        { {CHANNEL_ID_TAP, 71, 0},  {CHANNEL_ID_TAP, 72, 1} },
+        { {CHANNEL_ID_TAP, 73, 0},  {CHANNEL_ID_TAP, 74, 1} },
+        { {CHANNEL_ID_TAP, 75, 0},  {CHANNEL_ID_TAP, 76, 1} },
+        { {CHANNEL_ID_TAP, 77, 0},  {CHANNEL_ID_TAP, 78, 1} },
+        { {CHANNEL_ID_TAP, 79, 0},  {CHANNEL_ID_TAP, 80, 1} },
+        { {CHANNEL_ID_TAP, 81, 0},  {CHANNEL_ID_TAP, 82, 1} },
+        { {CHANNEL_ID_TAP, 83, 0},  {CHANNEL_ID_TAP, 84, 1} },
+        { {CHANNEL_ID_TAP, 85, 0},  {CHANNEL_ID_TAP, 86, 1} },
+        { {CHANNEL_ID_TAP, 87, 0},  {CHANNEL_ID_TAP, 88, 1} },
+        { {CHANNEL_ID_TAP, 89, 0},  {CHANNEL_ID_TAP, 90, 1} },
     },
 
     -- 三狸功夫
     [CHANNEL_ID_SANLI_ANDOIRD] = {
-        { {CHANNEL_ID_SANLI_ANDOIRD, 41, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 42, 1}, {CHANNEL_ID_SANLI_H5, 31, 2}, {CHANNEL_ID_SANLI_H5, 32, 2} },
-        { {CHANNEL_ID_SANLI_ANDOIRD, 43, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 44, 1}, {CHANNEL_ID_SANLI_H5, 33, 2}, {CHANNEL_ID_SANLI_H5, 34, 2} },
-        { {CHANNEL_ID_SANLI_ANDOIRD, 45, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 46, 1}, {CHANNEL_ID_SANLI_H5, 35, 2}, {CHANNEL_ID_SANLI_H5, 36, 2} },
-        { {CHANNEL_ID_SANLI_ANDOIRD, 47, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 48, 1}, {CHANNEL_ID_SANLI_H5, 37, 2}, {CHANNEL_ID_SANLI_H5, 38, 2} },
-        { {CHANNEL_ID_SANLI_ANDOIRD, 49, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 50, 1}, {CHANNEL_ID_SANLI_H5, 39, 2}, {CHANNEL_ID_SANLI_H5, 40, 2} },
+        { {CHANNEL_ID_SANLI_ANDOIRD, 81, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 82, 1} },
+        { {CHANNEL_ID_SANLI_ANDOIRD, 83, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 84, 1} },
+        { {CHANNEL_ID_SANLI_ANDOIRD, 85, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 86, 1} },
+        { {CHANNEL_ID_SANLI_ANDOIRD, 87, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 88, 1} },
+        { {CHANNEL_ID_SANLI_ANDOIRD, 89, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 90, 1} },
+        { {CHANNEL_ID_SANLI_ANDOIRD, 91, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 92, 1} },
+        { {CHANNEL_ID_SANLI_ANDOIRD, 93, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 94, 1} },
+        { {CHANNEL_ID_SANLI_ANDOIRD, 95, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 96, 1} },
+        { {CHANNEL_ID_SANLI_ANDOIRD, 97, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 98, 1} },
+        { {CHANNEL_ID_SANLI_ANDOIRD, 99, 0}, {CHANNEL_ID_SANLI_ANDOIRD, 100, 1} },
     },
 
 
     -- 三狸H5
-    [CHANNEL_ID_SANLI_H5] = {
-        { {CHANNEL_ID_SANLI_ANDOIRD, 41, 0},  {CHANNEL_ID_SANLI_H5, 31, 2}, {CHANNEL_ID_SANLI_H5, 32, 2} },
-        { {CHANNEL_ID_SANLI_ANDOIRD, 43, 0},  {CHANNEL_ID_SANLI_H5, 33, 2}, {CHANNEL_ID_SANLI_H5, 34, 2} },
-        { {CHANNEL_ID_SANLI_ANDOIRD, 45, 0},  {CHANNEL_ID_SANLI_H5, 35, 2}, {CHANNEL_ID_SANLI_H5, 36, 2} },
-        { {CHANNEL_ID_SANLI_ANDOIRD, 47, 0},  {CHANNEL_ID_SANLI_H5, 37, 2}, {CHANNEL_ID_SANLI_H5, 38, 2} },
-        { {CHANNEL_ID_SANLI_ANDOIRD, 49, 0},  {CHANNEL_ID_SANLI_H5, 39, 2}, {CHANNEL_ID_SANLI_H5, 40, 2} },
-    },
+    -- [CHANNEL_ID_SANLI_H5] = {
+    --     { {CHANNEL_ID_SANLI_ANDOIRD, 41, 0},  {CHANNEL_ID_SANLI_H5, 31, 2}, {CHANNEL_ID_SANLI_H5, 32, 2} },
+    --     { {CHANNEL_ID_SANLI_ANDOIRD, 43, 0},  {CHANNEL_ID_SANLI_H5, 33, 2}, {CHANNEL_ID_SANLI_H5, 34, 2} },
+    --     { {CHANNEL_ID_SANLI_ANDOIRD, 45, 0},  {CHANNEL_ID_SANLI_H5, 35, 2}, {CHANNEL_ID_SANLI_H5, 36, 2} },
+    --     { {CHANNEL_ID_SANLI_ANDOIRD, 47, 0},  {CHANNEL_ID_SANLI_H5, 37, 2}, {CHANNEL_ID_SANLI_H5, 38, 2} },
+    --     { {CHANNEL_ID_SANLI_ANDOIRD, 49, 0},  {CHANNEL_ID_SANLI_H5, 39, 2}, {CHANNEL_ID_SANLI_H5, 40, 2} },
+    -- },
 
 
     -- 三狸QQ
-    [CHANNEL_ID_SANLI_QQ] = {
-        { {CHANNEL_ID_SANLI_QQ, 21, 0},  {CHANNEL_ID_SANLI_QQ, 22, 1} },
-        { {CHANNEL_ID_SANLI_QQ, 23, 0},  {CHANNEL_ID_SANLI_QQ, 24, 1} },
-        { {CHANNEL_ID_SANLI_QQ, 25, 0},  {CHANNEL_ID_SANLI_QQ, 26, 1} },
-        { {CHANNEL_ID_SANLI_QQ, 27, 0},  {CHANNEL_ID_SANLI_QQ, 28, 1} },
-        { {CHANNEL_ID_SANLI_QQ, 29, 0},  {CHANNEL_ID_SANLI_QQ, 30, 1} },
+    -- [CHANNEL_ID_SANLI_QQ] = {
+    --     { {CHANNEL_ID_SANLI_QQ, 51, 0},  {CHANNEL_ID_SANLI_QQ, 52, 1} },
+    --     { {CHANNEL_ID_SANLI_QQ, 53, 0},  {CHANNEL_ID_SANLI_QQ, 54, 1} },
+    --     { {CHANNEL_ID_SANLI_QQ, 55, 0},  {CHANNEL_ID_SANLI_QQ, 56, 1} },
+    --     { {CHANNEL_ID_SANLI_QQ, 57, 0},  {CHANNEL_ID_SANLI_QQ, 58, 1} },
+    --     { {CHANNEL_ID_SANLI_QQ, 59, 0},  {CHANNEL_ID_SANLI_QQ, 60, 1} },
+    --     { {CHANNEL_ID_SANLI_QQ, 61, 0},  {CHANNEL_ID_SANLI_QQ, 62, 1} },
+    --     { {CHANNEL_ID_SANLI_QQ, 63, 0},  {CHANNEL_ID_SANLI_QQ, 64, 1} },
+    --     { {CHANNEL_ID_SANLI_QQ, 65, 0},  {CHANNEL_ID_SANLI_QQ, 66, 1} },
+    --     { {CHANNEL_ID_SANLI_QQ, 67, 0},  {CHANNEL_ID_SANLI_QQ, 68, 1} },
+    --     { {CHANNEL_ID_SANLI_QQ, 69, 0},  {CHANNEL_ID_SANLI_QQ, 70, 1} },
+    -- },
+
+    -- 三狸视游
+    [CHANNEL_ID_SANLI_SHIYOU] = {
+        { {CHANNEL_ID_SANLI_SHIYOU, 1, 0},  {CHANNEL_ID_SANLI_SHIYOU, 2, 1} },
+        { {CHANNEL_ID_SANLI_SHIYOU, 3, 0},  {CHANNEL_ID_SANLI_SHIYOU, 4, 1} },
+        { {CHANNEL_ID_SANLI_SHIYOU, 5, 0},  {CHANNEL_ID_SANLI_SHIYOU, 6, 1} },
+        { {CHANNEL_ID_SANLI_SHIYOU, 7, 0},  {CHANNEL_ID_SANLI_SHIYOU, 8, 1} },
+        { {CHANNEL_ID_SANLI_SHIYOU, 9, 0},  {CHANNEL_ID_SANLI_SHIYOU, 10, 1} },
     },
 
 }

+ 19 - 1
script/module/hero/Handler.lua

@@ -7,6 +7,7 @@ local HeroStrategyLogic = require("hero.HeroStrategyLogic")
 local HeroGem = require("hero.HeroGem")
 local HeroExclusiveWeapon = require("hero.HeroExclusiveWeapon")
 local HeroPubLogic = require("hero.HeroPubLogic")
+local HeroSeed = require("hero.HeroSeed")
 
 -- 请求英雄详细信息:静态
 function CG_HERO_BAG_STATIC(human,msg)
@@ -266,4 +267,21 @@ end
 
 function CG_HEROPUB_REWARD_GET(human,msg)
     HeroPubLogic.RewardGet(human)
-end
+end
+
+
+
+---------------------------------------英雄种子-----------------------------------------------
+function CG_HEROSEED_QUERY_ALL(human, msg)
+    HeroSeed.HeroSeed_Query_All(human, msg.heroID, msg.heroIndex)
+end
+
+function CG_HEROSEED_QUERY_SINGLE(human, msg)
+    HeroSeed.HeroSeed_Query_Single(human, msg.heroID, msg.heroIndex, msg.seedIdx)
+end
+
+function CG_HEROSEED_UPGRADE(human, msg)
+    HeroSeed.HeroSeed_UpGrade(human, msg.heroID, msg.heroIndex, msg.seedIdx, msg.opType)
+end
+
+---------------------------------------------------------------------------------------------

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

@@ -74,6 +74,7 @@ local HeroPubLogic = require("hero.HeroPubLogic")
 local WinnerRelicLogic = require("winnerRelic.WinnerRelicLogic")
 local GodsAreaNS = require("godsArea.GodsAreaNS")
 local Abs365CardLogic = require("absAct.Abs365CardLogic")
+local HeroSeed = require("hero.HeroSeed")
 
 HERO_MAX_STAR    =        15    -- 目前英雄最大星级
 
@@ -1525,6 +1526,18 @@ function sendHuituiQuery(human, heroID, heroIndex)
 		end
 	end
 
+	-- 英雄种子返还材料
+	local seedReturnItem = HeroSeed.CalcReturnItem(human, heroGrid)
+	if seedReturnItem then
+		for _, itemInfo in ipairs(seedReturnItem) do
+			if msgRet.returnItems[0] >= #msgRet.returnItems then
+				break
+			end
+			
+			msgRet.returnItems[0] = msgRet.returnItems[0] + 1
+			Grid.makeItem(msgRet.returnItems[msgRet.returnItems[0]], itemInfo[1], itemInfo[2])
+		end
+	end
 
 	msgRet.returnHeros[0] = 0
 	for star, v in pairs(heros) do
@@ -1591,6 +1604,20 @@ function huituiHero(human, heroID, heroIndex)
 		HeroExclusiveWeapon.SetHeroWeaponLv(human, heroID, heroIndex, 0)
 	end
 
+	-- 英雄种子返还材料
+	local seedReturnItem = HeroSeed.CalcReturnItem(human, heroGrid)
+	if seedReturnItem then
+		for _, itemInfo in ipairs(seedReturnItem) do
+			local itemId = itemInfo[1]
+			local itemCnt = itemInfo[2]
+			items[itemId] = (items[itemId] or 0) + itemCnt
+		end
+
+		-- 重置英雄所有种子等级
+		HeroSeed.ResetSeedLv(human, heroGrid)
+	end
+
+
 	heroGrid.star = star
 	heroGrid.lv = targetLv
 	XingYaoGongMing.onDelHero(human,heroGrid,heroIndex)

+ 322 - 0
script/module/hero/HeroSeed.lua

@@ -0,0 +1,322 @@
+-- 种子系统
+local Lang = require("common.Lang")
+local Msg = require("core.Msg")
+local BagLogic = require("bag.BagLogic")
+local HeroLogic = require("hero.HeroLogic")
+local ObjHuman = require("core.ObjHuman")
+local Grid = require("bag.Grid")
+local RoleAttr = require("role.RoleAttr")
+local HeroSeedCfg = require("excel.heroSeed")
+local Broadcast = require("broadcast.Broadcast")
+local RoleDefine = require("role.RoleDefine")
+
+local LOGTAG = "HeroSeed" --日志标识
+
+local HAVE_SEED_HERO_MIN_STAR = 10 --英雄获得种子的最低星级要求
+
+
+
+-- 获取下一级消耗的道具数量
+local function getUpGradeCostCnt(nextLv)
+    local upGradeCfg = HeroSeedCfg.upGrade
+
+    local maxLvCfg = upGradeCfg[#upGradeCfg]
+    if nextLv >= maxLvCfg.levelArea[2] then
+        return 0
+    end
+
+    for _, v in ipairs(upGradeCfg) do
+        if nextLv >= v.levelArea[1] and nextLv <= v.levelArea[2] then
+            return v.itemCnt
+        end
+    end
+end
+
+-- 计算一共可以升多少级, 消耗多少道具
+local function calcUpGrade(nowLv, itemAllCnt)
+    local addLv, oldItemAllCnt, itemCostCnt = 0, itemAllCnt, 0
+    while true do
+        nowLv = nowLv + 1
+        itemCostCnt = getUpGradeCostCnt(nowLv)
+        if not itemCostCnt or itemCostCnt == 0 then
+            break
+        end
+
+        if itemAllCnt < itemCostCnt then
+            break
+        end
+
+        addLv = addLv + 1
+        itemAllCnt = itemAllCnt - itemCostCnt
+    end
+
+    local useItemCnt = oldItemAllCnt - itemAllCnt
+
+    return addLv, useItemCnt
+end
+
+-- 计算种子重置等级后返还的材料
+local function calcReturnItem(seeIdx, seedLv)
+    if not seeIdx or not seedLv or seedLv <= 0 then
+        return
+    end
+
+    local targetSeedCfg = HeroSeedCfg.base[seeIdx]
+    if not targetSeedCfg then
+        return
+    end
+
+    local itemCnt = 0
+    for i=seedLv, 0, -1 do
+        for _, v in ipairs(HeroSeedCfg.upGrade) do
+            if i >= v.levelArea[1] and i <= v.levelArea[2] then
+                itemCnt = itemCnt + v.itemCnt
+                break
+            end
+        end
+    end
+
+    if itemCnt <= 0 then
+        return
+    end
+
+    local itemTb = { targetSeedCfg.itemId, itemCnt }
+    return itemTb
+end
+
+-- 获取英雄种子的红点标识数组
+local function getHeroSeedRedDotArr(human, heroGrid)
+    local bl = false
+    local redDotArr = {0, 0, 0, 0, 0, 0, 0, 0}
+    local seedData = heroGrid.seedData or {}
+    for idx, v in ipairs(HeroSeedCfg.base) do
+        local seedNowLv = seedData[idx] or 0
+        if seedNowLv < v.maxLv then
+            local itemCnt = getUpGradeCostCnt(seedNowLv+1)
+            if itemCnt and BagLogic.getItemCnt(human, v.itemId) >= itemCnt then
+                bl = true
+                redDotArr[idx] = 1
+            end
+        end
+    end
+
+    return redDotArr, bl
+end
+
+-- 计算重置种子等级后返还的材料
+function CalcReturnItem(human, heroGrid)
+    if heroGrid.star < HAVE_SEED_HERO_MIN_STAR then
+        return
+    end
+
+    local seedData = heroGrid.seedData
+    if seedData then
+        return
+    end
+
+    local itemArr = {}
+    for seeIdx, seedLv in pairs(seedData) do
+        local itemTb = calcReturnItem(seeIdx, seedLv)
+        if itemTb then
+            itemArr[#itemArr+1] = itemTb
+        end
+    end
+
+    if #itemArr == 0 then
+        return
+    end
+
+    return itemArr
+end
+
+-- 重置英雄所有种子等级
+function ResetSeedLv(human, heroGrid)
+    if not heroGrid or not heroGrid.seedData then
+        return
+    end
+
+    heroGrid.seedData = nil
+end
+
+-- 英雄种子红点检测
+function isSeedDot(human, heroGrid)
+    if heroGrid.star < HAVE_SEED_HERO_MIN_STAR then
+        return false
+    end
+
+    local seedData = heroGrid.seedData or {}
+    for idx, v in ipairs(HeroSeedCfg.base) do
+        local seedNowLv = seedData[idx] or 0
+        if seedNowLv < v.maxLv then
+            local itemCnt = getUpGradeCostCnt(seedNowLv+1)
+            if itemCnt and BagLogic.getItemCnt(human, v.itemId) >= itemCnt then
+                return true
+            end
+        end
+    end
+
+    return false
+end
+
+-- 种子加成
+function doCalcHero(heroGrid, addAttrs)
+    if not heroGrid or not heroGrid.seedData then
+        return
+    end
+
+    local seedBaseCfg = HeroSeedCfg.base
+    for seedIdx, seedLv in ipairs(heroGrid.seedData) do
+        if seedLv > 0 then
+            if seedBaseCfg[seedIdx] then
+                for _, attrTb in ipairs(seedBaseCfg[seedIdx].attr) do
+                    local attrId, attrVal = attrTb[1], attrTb[2]
+                    RoleAttr.updateValue(attrId, attrVal * seedLv, addAttrs)
+                end
+            end
+        end
+    end
+end
+
+
+
+--查询所有种子的简略信息
+function HeroSeed_Query_All(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 heroGrid.star < HAVE_SEED_HERO_MIN_STAR then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    local seedData = heroGrid.seedData
+    local seedBaseCfg = HeroSeedCfg.base
+    local msgRet = Msg.gc.GC_HEROSEED_QUERY_ALL
+    msgRet.seedArr[0] = #seedBaseCfg
+
+    for idx, seedCfg in ipairs(seedBaseCfg) do
+        msgRet.seedArr[idx].seedIdx = idx
+        msgRet.seedArr[idx].seedIcon = seedCfg.seedIcon
+        if seedData and seedData[idx] then
+            msgRet.seedArr[idx].seedLv = seedData[idx]
+        else
+            msgRet.seedArr[idx].seedLv = 0
+        end
+        msgRet.seedArr[idx].seedName = seedCfg.name
+    end
+
+    Msg.send(msgRet, human.fd)
+end
+
+-- 查询单个种子详细信息
+function HeroSeed_Query_Single(human, heroID, heroIndex, seedIdx)
+    local targetCfg = HeroSeedCfg.base[seedIdx]
+    if not targetCfg then
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if heroGrid.star < HAVE_SEED_HERO_MIN_STAR then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    local seedNowLv = 0
+    local seedData = heroGrid.seedData
+    if seedData then
+        seedNowLv = seedData[targetCfg.seedId] or 0
+    end
+
+    local msgRet = Msg.gc.GC_HEROSEED_QUERY
+    msgRet.seedIdx = seedIdx
+    msgRet.seedIcon = targetCfg.seedIcon
+    msgRet.seedLv = seedNowLv
+    msgRet.seedMaxLv = targetCfg.maxLv
+    msgRet.seedName = targetCfg.name
+    msgRet.seedLvAttr[0] = 0
+    for idx, attrTb in ipairs(targetCfg.attr) do
+        msgRet.seedLvAttr[0] = idx
+        msgRet.seedLvAttr[idx].key = attrTb[1]
+        msgRet.seedLvAttr[idx].value = attrTb[2]
+    end
+
+    local itemCnt = getUpGradeCostCnt(seedNowLv+1)
+    Grid.makeItem(msgRet.seedUpGradeCost, targetCfg.itemId, itemCnt)
+
+    Msg.send(msgRet, human.fd)
+end
+
+-- 种子升级
+function HeroSeed_UpGrade(human, heroID, heroIndex, seedIdx, opType)
+    local targetCfg = HeroSeedCfg.base[seedIdx]
+    if not targetCfg then
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    local heroGrid = HeroLogic.getHeroGrid(human, heroID, heroIndex)
+    if not heroGrid then
+        return Broadcast.sendErr(human, Lang.FUWEN_HERO_GRID_ERR)
+    end
+
+    if heroGrid.star < HAVE_SEED_HERO_MIN_STAR then
+        return Broadcast.sendErr(human, Lang.HEROPUB_STAR_NOT_ENOUGH)
+    end
+
+    local seedNowLv = 0
+    if heroGrid.seedData and heroGrid.seedData[seedIdx] then
+        seedNowLv = heroGrid.seedData[seedIdx]
+    end
+
+    if seedNowLv >= targetCfg.maxLv then
+        return Broadcast.sendErr(human, Lang.COMMON_MAXLEVEL)
+    end
+
+
+    local itemId, itemCnt, addLv = targetCfg.itemId, 0, 0
+    local itemAllCnt = BagLogic.getItemCnt(human, itemId)
+
+    if opType == 1 then --升级一次
+        itemCnt = getUpGradeCostCnt(seedNowLv+1)
+        if not itemCnt then
+            return Broadcast.sendErr(human, Lang.DATA_ERR)
+        end
+
+        if itemAllCnt < itemCnt then
+            return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
+        end
+        addLv = 1
+    elseif opType == 2 then -- 一键升级
+        if itemAllCnt <= 0 then
+            return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
+        end
+
+        addLv, itemCnt = calcUpGrade(seedNowLv, itemAllCnt)
+        if addLv <= 0 or itemAllCnt < itemCnt then --再验证一次道具数量
+            return Broadcast.sendErr(human, Lang.COMMON_ITEM_NOT_ENOUGH)
+        end
+    else
+        return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+    end
+
+    -- 扣除道具
+    BagLogic.delItem(human, itemId, itemCnt, LOGTAG)
+
+    -- 更新等级
+    heroGrid.seedData = heroGrid.seedData or {}
+    heroGrid.seedData[seedIdx] = (heroGrid.seedData[seedIdx] or 0) + addLv
+
+    -- 推送最新数据给客户端
+    HeroSeed_Query_All(human, heroID, heroIndex)
+    HeroSeed_Query_Single(human, heroID, heroIndex, seedIdx)
+
+    --重算战力和红点
+    RoleAttr.cleanHeroAttrCache(human)
+    RoleAttr.doCalc(human)
+    HeroLogic.sendHeroBagDynamic(human, heroID, heroIndex)
+    ObjHuman.sendAttr(human, RoleDefine.ZHANDOULI)
+    -- HeroLogic.refreshDot(human, heroGrid.uuid)
+end

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

@@ -672,7 +672,7 @@ GC_HERO_HUITUI_QUERY = {
 	{"oldSimple",	1,		HeroSimple},	-- 原有英雄信息
 	{"newSimple",	1,		HeroSimple},	-- 新英雄信息
 	{"needItem",	1,		ItemData},		-- 消耗道具
-	{"returnItems",	14,		ItemData},		-- 返还道具列表, 增加专属武器材料返还, 长度由10->14
+	{"returnItems",	22,		ItemData},		-- 返还道具列表, 增加专属武器材料返还, 长度由10->14
 	{"returnHeros",	20,		HeroSimple},	-- 返还英雄列表
 }
 
@@ -930,4 +930,54 @@ CG_HEROPUB_REWARD_GET = {
 GC_HEROPUB_BOX_REDDOT = {
 	{"redDotState",			1,		"byte"},     		-- 0- 没有红点, 1-有红点
 }
+------------------------------------------------------------------------------------
+
+
+------------------------------------英雄种子-----------------------------------------
+
+SEED_SIMPLE_INFO = {
+	{"seedIdx",			1,		"byte"},   -- 种子索引
+	{"seedIcon",		1,		"int"},   -- 种子Icon
+	{"seedLv",			1,		"int"},   -- 种子等级
+	{"seedName",		1,		"string"},   -- 种子名字
+}
+
+
+--查询英雄所有种子的简略信息
+CG_HEROSEED_QUERY_ALL = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+}
+
+GC_HEROSEED_QUERY_ALL = {
+	{"seedArr",			8,		SEED_SIMPLE_INFO},   -- 所有种子数据
+}
+
+
+--查询英雄单个种子的详细信息
+CG_HEROSEED_QUERY_SINGLE = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+	{"seedIdx",			1,		"byte"},   -- 种子索引
+}
+
+GC_HEROSEED_QUERY_SINGLE = {
+	{"seedIdx",			1,		"byte"},   	-- 种子索引
+	{"seedIcon",		1,		"int"},   	-- 种子Icon
+	{"seedLv",			1,		"int"},   	-- 种子等级
+	{"seedMaxLv",     	1,      "int"},		-- 种子最大等级
+	{"seedName",		1,		"string"},   -- 种子名字
+	{"seedLvAttr",     	2,      Attr},		-- 种子每级加成属性
+	{"seedUpGradeCost", 1,     ItemData},	-- 种子升到下一级消耗道具
+}
+
+-- 种子升级
+CG_HEROSEED_UPGRADE = {
+	{"heroID",			1,		"int"},   -- 英雄id
+	{"heroIndex",		1,		"short"}, -- 英雄index
+	{"seedIdx",			1,		"byte"},   -- 种子索引
+	{"opType",			1,		"byte"},   -- 升级类型, 1-升一级, 2-一键升级
+}
+
+
 ------------------------------------------------------------------------------------

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

@@ -42,6 +42,8 @@ local TalismanLogic = require("talisman.TalismanLogic")
 local HeroExclusiveWeapon = require("hero.HeroExclusiveWeapon")
 local WinnerRelicLogic = require("winnerRelic.WinnerRelicLogic")
 local HeroPubLogic = require("hero.HeroPubLogic")
+local HeroSeed = require("hero.HeroSeed")
+
 
 local function printAttr(attr, szText)
 	for i = RoleDefine.ATK, RoleDefine.SPEED, 1 do
@@ -175,6 +177,7 @@ function calcHeroGrid(heroGrid, index, human)
 	WinnerRelicLogic.doCalcHero(human, heroGrid, HERO_OTHER_ATTRS) --圣者遗物
 
 	HeroPubLogic.doCalcHero(human, HERO_OTHER_ATTRS) --英雄酒馆
+	HeroSeed.doCalcHero(heroGrid, HERO_OTHER_ATTRS) -- 英雄种子
 	
 
 	--不同模块在英雄属性计算 end	

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

@@ -48,6 +48,7 @@ local NewFirstCharge = require("present.NewFirstChargeLogic")
 local OneKillGiftLogic = require("present.OneKillGift")
 local OpenServerGiftPackage = require("present.OpenServerGiftPackage")
 local CommonDefine = require("common.CommonDefine")
+local ZhuanpanGift = require("zhuanpan.ZhuanpanGift")
 
 BUY_CODE_NORMAL = 0   -- 正常调平台的充值接口
 BUY_CODE_WX_KEFU = 1  -- 微信小程序客服充值接口
@@ -333,6 +334,11 @@ function cmd.openservergiftpackage(human, buyConf, isFirst, buyCnt)
 	OpenServerGiftPackage.onCharge(human, nBuyID)
 end
 
+function cmd.zhuanpanGift(human, buyConf, isFirst, buyCnt)
+	local nBuyID = buyConf.id
+	ZhuanpanGift.onCharge(human, nBuyID)
+end
+
 -------------------------------- cmd结束 ----------------------------------
 
 function checkBuy(human, ret)

+ 8 - 0
script/module/zhuanpan/Handler.lua

@@ -1,4 +1,5 @@
 local ZhuanpanLogic = require("zhuanpan.ZhuanpanLogic")
+local ZhuanpanGift = require("zhuanpan.ZhuanpanGift")
 
 -- 转盘查询
 function CG_ZHUANPAN_QUERY(human, msg)
@@ -29,3 +30,10 @@ end
 function CG_XUNXING_JINGLINGZHUFU(human)
     ZhuanpanLogic.getFree(human)
 end
+
+
+------------------寻星礼包---------------------
+
+function ZHUANPAN_GIFT_INFO(human)
+    ZhuanpanGift.ZhuanpanGift_Query(human)
+end

+ 19 - 0
script/module/zhuanpan/Proto.lua

@@ -1,5 +1,6 @@
 
 local ItemData = require("bag.Proto").ItemData
+local BuyItem = require("topup.Proto").BuyItem
 
 -- 查询转盘
 CG_ZHUANPAN_QUERY = {
@@ -94,4 +95,22 @@ CG_XUNXING_JINGLINGZHUFU = {}
 
 GC_XUNXING_JINGLINGZHUFU = {
     {"cnt",1,"byte"},           -- 随机次数
+}
+
+
+
+
+-------------------------------寻星礼包----------------------------------
+
+ZHUANPAN_GIFT_INFO = {
+    {"buyItem",     1,      BuyItem},       -- 直购信息
+    {"nowBuyCnt",   1,      "short"},       -- 当前已购买次数
+    {"maxBuyCnt",   1,      "short"},       -- 最大可购买次数
+    {"giftItem",    4,      ItemData},   	-- 礼包道具
+}
+
+CG_ZHUANPAN_GIFT_QUERY = {}
+
+GC_ZHUANPAN_GIFT_QUERY = {
+	{"giftArr",		6,			"byte"},           -- 寻星礼包
 }

+ 74 - 0
script/module/zhuanpan/ZhuanpanGift.lua

@@ -0,0 +1,74 @@
+-- 寻星礼包
+-- 逻辑:每日每种礼包有一定限购次数, 跨天后重置
+
+local Msg = require("core.Msg")
+local BagLogic = require("bag.BagLogic")
+local Grid = require("bag.Grid")
+local BuyLogic = require("topup.BuyLogic")
+local ZhuanpanGiftConfig = require("excel.zhuanpan").gift
+
+local LOGTAG = "zhuanpanGift"
+
+
+local function getCfg(buyId)
+    for _, v in ipairs(ZhuanpanGiftConfig) do
+        if buyId == v.buyID then
+            return v
+        end
+    end
+end
+
+
+function ZhuanpanGift_Query(human)
+    local zhuanpanGiftData = human.db.zhuanpanGiftData
+
+    local msgRet = Msg.gc.GC_ZHUANPAN_GIFT_QUERY
+    local giftArr = msgRet.giftArr
+    giftArr[0] = 0
+
+    for k, v in ipairs(ZhuanpanGiftConfig) do
+        giftArr[0] = k
+        giftArr[k].nowBuyCnt = zhuanpanGiftData and zhuanpanGiftData[v.buyID] or 0
+        giftArr[k].maxBuyCnt = v.amount
+        BuyLogic.fontBuyItem(human, giftArr[k].buyItem, v.buyID)
+
+        giftArr[k].giftItem[0] = #v.reward
+        for idx, itemCfg in ipairs(v.reward) do
+            Grid.makeItem(giftArr[k].giftItem[idx], itemCfg[1], itemCfg[2])
+        end
+    end
+
+    Msg.send(msgRet, human.fd)
+end
+
+
+function updateDaily(human)
+    human.db.zhuanpanGiftData = nil
+end
+
+
+function onCharge(human, buyId)
+    local zhuanpanGiftData = human.db.zhuanpanGiftData
+
+    local giftCfg = getCfg(buyId)
+    if not giftCfg then
+        return
+    end
+
+    if zhuanpanGiftData and (zhuanpanGiftData[buyId] or 0) >= giftCfg.amount then
+        return
+    end
+
+    local itemArr = {}
+    for idx, itemCfg in ipairs(giftCfg.reward) do
+        itemArr[idx] = {itemCfg[1], itemCfg[2]}
+    end
+
+    BagLogic.addItemList(human, itemArr, LOGTAG)
+
+    zhuanpanGiftData = zhuanpanGiftData or {}
+    zhuanpanGiftData[buyId] = (zhuanpanGiftData[buyId] or 0) + 1
+    human.db.zhuanpanGiftData = zhuanpanGiftData
+
+    ZhuanpanGift_Query(human)
+end

+ 3 - 0
script/module/zhuanpan/ZhuanpanLogic.lua

@@ -20,6 +20,7 @@ local TriggerLogic = require("trigger.TriggerLogic")
 local WeekTaskLogic = require("dailyTask.WeekTaskLogic")
 local ClutterDataLogic = require("clutter.ClutterDataLogic")
 local ClutterDataDefine = require("clutter.ClutterDataDefine")
+local ZhuanpanGift = require("zhuanpan.ZhuanpanGift")
 
 
 DEFAULT_ZHUANPAN_TYPE_NORMAL 		= 1     -- 基础转盘
@@ -278,6 +279,8 @@ function updateDaily(human)
 
     human.db.zhuanpan[DEFAULT_ZHUANPAN_TYPE_NORMAL].free = 1
     human.db.zhuanpan[DEFAULT_ZHUANPAN_TYPE_NORMAL].freeCnt = 0
+
+	ZhuanpanGift.updateDaily(human)
 end