flowerpig 5 месяцев назад
Родитель
Сommit
79bfdf48c8

+ 2 - 4
script/common/ProtoID.lua

@@ -1715,7 +1715,5 @@ _ENV[1744]="CG_AB_TREASURE_QUERY"
 _ENV[1745]="GC_AB_TREASURE_QUERY"
 _ENV[1746]="CG_AB_TREASURE_LOTTERY"
 _ENV[1747]="GC_AB_TREASURE_LOTTERY"
-
-
--- _ENV[1747]="CG_DRILL_ONE_CLICK_SAODANG"
--- _ENV[1748]="GC_DRILL_ONE_CLICK_SAODANG"
+_ENV[1748]="CG_DRILL_ONE_CLICK_SAODANG"
+_ENV[1749]="GC_DRILL_ONE_CLICK_SAODANG"

+ 100 - 24
script/module/drill/DrillLogic.lua

@@ -75,6 +75,7 @@ local WeekTaskLogic = require("dailyTask.WeekTaskLogic")
 local TriggerLogic = require("trigger.TriggerLogic")
 local TriggerDefine = require("trigger.TriggerDefine")
 local OverflowFundLogic = require("present.OverflowFundLogic")
+local Log = require("common.Log")
 
 local queryFields = {["uuid"] = 1}
 local queryFieldsList = {}
@@ -427,7 +428,13 @@ function getBoxState(drill, index)
 end
 
 -- 查询关卡Id
-function queryDrillId(human, drillData)
+function queryDrillId(human, drillData, openPanel)
+	-- openPanel: 是否打开界面,默认为true(打开界面)
+	-- false-不打开界面,只刷新数据;true-打开界面
+	if openPanel == nil then
+		openPanel = true  -- 默认打开界面
+	end
+	
 	drillData = drillData or DrillDB.getDrillDataByUuid(human.db._id)
 	if not drillData then -- 没有记录 请求第一关
 		fixDrillDB(human)
@@ -435,6 +442,15 @@ function queryDrillId(human, drillData)
 	end
 
 	local drill = human.db.drill
+	if not drill then
+		-- drill 数据不存在,初始化
+		fixDrillDB(human)
+		drill = human.db.drill
+		if not drill then
+			return diffChoseQuery(human)
+		end
+	end
+	
 	local diff = drill.diff
 	if not drill.diff  or drill.diff == 0 then
 		diff = drillData.diff		 
@@ -445,23 +461,37 @@ function queryDrillId(human, drillData)
 	end
 
     local msgRet = Msg.gc.GC_DRILL_ID
-	msgRet.drillId = drillData.drillId 
-	msgRet.diff = diff
-	msgRet.maxDiff = drill.maxDiff
-	msgRet.dayGet[0] = 2
-	local dayJinbi = drill.dayGet and drill.dayGet[ItemDefine.ITEM_JINBI_ID] or 0
-	local dayCoin = drill.dayGet and drill.dayGet[ItemDefine.ITEM_DRILL_COIN_ID] or 0
-	Grid.makeItem(msgRet.dayGet[1], ItemDefine.ITEM_JINBI_ID,  dayJinbi )
-	Grid.makeItem(msgRet.dayGet[2], ItemDefine.ITEM_DRILL_COIN_ID,  dayCoin )
-
+	-- 按照协议定义的顺序赋值
+	-- 1. drillId (byte类型,范围0-255,防止溢出)
+	local drillIdValue = drillData.drillId or 1
+	if drillIdValue > 255 or drillIdValue < 0 then
+		Log.write(Log.LOGID_DEBUG, "[queryDrillId] WARNING: drillId溢出,原始值="..drillIdValue..",限制后="..math.min(math.max(drillIdValue, 0), 255))
+	end
+	msgRet.drillId = math.min(math.max(drillIdValue, 0), 255)
+	-- 2. diff (byte类型,范围0-255,防止溢出)
+	local diffValue = diff or 1
+	if diffValue > 255 or diffValue < 0 then
+		Log.write(Log.LOGID_DEBUG, "[queryDrillId] WARNING: diff溢出,原始值="..diffValue..",限制后="..math.min(math.max(diffValue, 0), 255))
+	end
+	msgRet.diff = math.min(math.max(diffValue, 0), 255)
+	-- 3. box (数组) - 协议定义最大长度为5
+	local boxCount = math.min(#DrillExcel.box, 5)
+	msgRet.box[0] = boxCount
 	--秘宝加成
 	local talismanAdd_jinbi = getTalismanAdd(human)
-
-	msgRet.box[0] = #DrillExcel.box
-	for k, config  in ipairs(DrillExcel.box) do
+	for k = 1, boxCount do
+		local config = DrillExcel.box[k]
 		local net = msgRet.box[k]	
-		net.index =  k 
-		net.needId= config.needDrill
+		-- index 和 needId 都是 byte 类型,防止溢出
+		if k > 255 or k < 0 then
+			Log.write(Log.LOGID_DEBUG, "[queryDrillId] WARNING: box index溢出,原始值="..k..",限制后="..math.min(math.max(k, 0), 255))
+		end
+		net.index = math.min(math.max(k, 0), 255)
+		local needIdValue = config.needDrill or 0
+		if needIdValue > 255 or needIdValue < 0 then
+			Log.write(Log.LOGID_DEBUG, "[queryDrillId] WARNING: box needId溢出,原始值="..needIdValue..",限制后="..math.min(math.max(needIdValue, 0), 255))
+		end
+		net.needId = math.min(math.max(needIdValue, 0), 255)
 		net.state = getBoxState(drill,  k)
 		local itemID1  = config["items"..diff][1][1]
 		local itemCnt1 = config["items"..diff][1][2]
@@ -490,6 +520,51 @@ function queryDrillId(human, drillData)
 			net.reward[0] = 3
 		end
 	end
+	-- 4. dayGet (数组)
+	msgRet.dayGet[0] = 2
+	local dayJinbi = drill.dayGet and drill.dayGet[ItemDefine.ITEM_JINBI_ID] or 0
+	local dayCoin = drill.dayGet and drill.dayGet[ItemDefine.ITEM_DRILL_COIN_ID] or 0
+	Grid.makeItem(msgRet.dayGet[1], ItemDefine.ITEM_JINBI_ID,  dayJinbi )
+	Grid.makeItem(msgRet.dayGet[2], ItemDefine.ITEM_DRILL_COIN_ID,  dayCoin )
+	-- 5. maxDiff (byte类型,范围0-255,防止溢出)
+	-- 注意:如果 maxDiff 为 0,应该视为未设置,使用默认值 1(因为 0 在 Lua 中是 truthy)
+	local maxDiffValue = (drill.maxDiff == nil or drill.maxDiff == 0) and 1 or drill.maxDiff
+	if maxDiffValue > 255 or maxDiffValue < 0 then
+		Log.write(Log.LOGID_DEBUG, "[queryDrillId] WARNING: maxDiff溢出,原始值="..maxDiffValue..",限制后="..math.min(math.max(maxDiffValue, 0), 255))
+	end
+	msgRet.maxDiff = math.min(math.max(maxDiffValue, 0), 255)
+	-- 6. canOneClickSaodang
+	-- 计算是否开启一键扫荡
+	local canOneClickSaodang = 0
+	-- 检查是否购买了基金
+	local overflowState = human.db.overflow and human.db.overflow.state and human.db.overflow.state[OverflowFundLogic.OVERFLOW_TYPE_2]
+	local hasFund = overflowState ~= nil
+	Log.write(Log.LOGID_DEBUG, "[queryDrillId] 检查基金状态: overflow="..tostring(human.db.overflow ~= nil)..", state="..tostring(human.db.overflow and human.db.overflow.state ~= nil)..", overflowState[2]="..tostring(overflowState)..", hasFund="..tostring(hasFund))
+	if hasFund then
+		-- 检查试炼是否开启
+		local drillOpen = isOpen(human, false)
+		if drillOpen then
+			-- 检查是否有 drill 数据
+			if drill then
+				-- 检查是否有 drillData 数据
+				if drillData then
+					-- 检查 diff 不为 0
+					if diff ~= 0 then
+						-- 检查当前关卡ID > 1
+						local currentDrillId = drillData.drillId or 1
+						if currentDrillId > 1 then
+							-- 已购买基金且满足其他条件,开启一键扫荡(已去掉等级限制)
+							canOneClickSaodang = 1
+						end
+					end
+				end
+			end
+		end
+	end
+	msgRet.canOneClickSaodang = canOneClickSaodang
+	-- 7. openPanel
+	msgRet.openPanel = (openPanel == true) and 1 or 0
+
 --	Msg.trace(msgRet)
 	Msg.send(msgRet, human.fd)
 end
@@ -1714,21 +1789,25 @@ end
 function oneClickSaodang(human)
 	-- 检查是否购买了基金(购买项207)
 	if not human.db.overflow or not human.db.overflow.state or not human.db.overflow.state[OverflowFundLogic.OVERFLOW_TYPE_2] then
+		Log.write(Log.LOGID_DEBUG, "[oneClickSaodang] 未购买奢华基金(OVERFLOW_TYPE_2)")
 		return
 	end
 	
 	-- 检查是否开启了试炼
 	if not isOpen(human, true) then
+		Log.write(Log.LOGID_DEBUG, "[oneClickSaodang] 试炼未开启")
 		return
 	end
 	
 	local drill = human.db.drill
 	if not drill then
+		Log.write(Log.LOGID_DEBUG, "[oneClickSaodang] drill为nil")
 		return
 	end
 	
 	local drillData = DrillDB.getDrillDataByUuid(human.db._id)
 	if not drillData then
+		Log.write(Log.LOGID_DEBUG, "[oneClickSaodang] drillData为nil")
 		return
 	end
 	
@@ -1738,19 +1817,16 @@ function oneClickSaodang(human)
 	end
 	
 	if diff == 0 then
+		Log.write(Log.LOGID_DEBUG, "[oneClickSaodang] diff="..diff..",需要!=0")
 		return
 	end
 	
-	-- 获取当前关卡ID
+	---- 获取当前关卡ID
 	local currentDrillId = drillData.drillId or 1
-	if currentDrillId <= 1 then
-		return
-	end
-	
-	-- 检查是否有可扫荡的关卡(需要达到等级要求)
-	if human.db.lv < SAODANG_COND_LEVEL then
-		return
-	end
+	--if currentDrillId <= 1 then
+	--	Log.write(Log.LOGID_DEBUG, "[oneClickSaodang] 当前关卡ID="..currentDrillId..",需要>1")
+	--	return
+	--end
 	
 	-- 计算可扫荡的关卡数(从1到currentDrillId-1,最多扫荡到currentDrillId-1)
 	local maxSaodangId = currentDrillId - 1

+ 3 - 3
script/module/drill/Handler.lua

@@ -59,6 +59,6 @@ function CG_DRILL_FIGHT_BY_DIAMON(human, msg)
 	DrillLogic.ChallengeLevelByDiamond(human, msg.levelID)
 end
 
--- function CG_DRILL_ONE_CLICK_SAODANG(human)
--- 	DrillLogic.oneClickSaodang(human)
--- end
+function CG_DRILL_ONE_CLICK_SAODANG(human)
+	DrillLogic.oneClickSaodang(human)
+end

+ 8 - 6
script/module/drill/Proto.lua

@@ -50,6 +50,8 @@ GC_DRILL_ID = {
     {"box",          5,        DRILL_BOX},  -- 已经被领取的箱子
     {"dayGet",       3,        ItemData},  
     {"maxDiff",      1,        "byte"},   -- 通关最大难度
+    {"canOneClickSaodang", 1,  "byte"},  -- 是否开启一键扫荡 0-未开启 1-开启
+    {"openPanel",    1,        "byte"},  -- 是否打开界面 0-不打开只刷新数据 1-打开界面
 }
 
 -- 请求关卡信息
@@ -146,10 +148,10 @@ CG_DRILL_FIGHT_BY_DIAMON = {
 }
 
 -- 一键扫荡
--- CG_DRILL_ONE_CLICK_SAODANG = {}
+CG_DRILL_ONE_CLICK_SAODANG = {}
 
--- GC_DRILL_ONE_CLICK_SAODANG = {
---     {"drillId",           1,    "int"},     -- 扫荡到的关卡ID
---     {"itemList",          5,    ItemData},  -- 奖励列表
---     {"double",            1,    "byte"},    -- 是否双倍
--- }
+GC_DRILL_ONE_CLICK_SAODANG = {
+    {"drillId",           1,    "int"},     -- 扫荡到的关卡ID
+    {"itemList",          5,    ItemData},  -- 奖励列表
+    {"double",            1,    "byte"},    -- 是否双倍
+}

+ 12 - 11
script/module/present/OverflowFundLogic.lua

@@ -23,6 +23,7 @@ local Grid = require("bag.Grid")
 local PanelDefine = require("broadcast.PanelDefine")
 local YunYingLogic = require("yunying.YunYingLogic")
 local BuyExcel = require("excel.buy")
+local Log = require("common.Log")
 
 -----------------------------------------
 -- 宏定义
@@ -91,24 +92,15 @@ function overflowQuery(human,type)
     msgRet.worth[2] = PresentExcel.luxuryFund[1].worth
     msgRet.worth[0] = 2
     
-    -- 检查是否可以一键扫荡:购买项207(奢华基金)购买后开启一键扫荡权限
-    -- 购买项207对应的是奢华基金(OVERFLOW_TYPE_2)
-    -- local canOneClickSaodang = 0
-    -- if type == OVERFLOW_TYPE_2 then
-    --     -- 检查是否购买了奢华基金
-    --     if human.db.overflow and human.db.overflow.state and human.db.overflow.state[OVERFLOW_TYPE_2] then
-    --         canOneClickSaodang = 1
-    --     end
-    -- end
-    -- msgRet.canOneClickSaodang = canOneClickSaodang
-    
     Msg.send(msgRet,human.fd)
 end
 
 function onBuy(human,type)
+    Log.write(Log.LOGID_DEBUG, "[OverflowFundLogic.onBuy] 进入购买 type="..type)
 
     -- 已购买,不可重复购买
     if human.db.overflow and human.db.overflow.state and human.db.overflow.state[type] then
+        Log.write(Log.LOGID_DEBUG, "[OverflowFundLogic.onBuy] 已购买,不可重复购买 type="..type)
         return
     end
 
@@ -117,11 +109,20 @@ function onBuy(human,type)
     human.db.overflow.get = human.db.overflow.get or {}
     human.db.overflow.state[type] = os.time()
     human.db.overflow.get[type] = 0
+    Log.write(Log.LOGID_DEBUG, "[OverflowFundLogic.onBuy] 设置基金状态 type="..type..", state="..human.db.overflow.state[type])
     overflowQuery(human,type)
 	for k, v in pairs(funcID) do
 	    YunYingLogic.sendGroupUpdate(YYInfo[k], human, PanelDefine.PANEL_ID_3310)
         break
     end
+    
+    -- 如果购买的是奢华基金(OVERFLOW_TYPE_2),需要更新勇者试炼的一键扫荡状态
+    if type == OVERFLOW_TYPE_2 then
+        Log.write(Log.LOGID_DEBUG, "[OverflowFundLogic.onBuy] 购买奢华基金,更新勇者试炼状态")
+        local DrillLogic = require("drill.DrillLogic")
+        -- 只刷新数据,不打开界面(openPanel = false)
+        DrillLogic.queryDrillId(human, nil, false)
+    end
 end
 
 function getFundReward(human,type)

+ 0 - 1
script/module/present/Proto.lua

@@ -777,7 +777,6 @@ GC_OVERFLOW_FUND_QUERY = {
     {"worth",           2,          "int"},     -- 总价值
     {"state",           1,          "byte"},    -- 0 未购买  1 领取 2 已领取
     {"type",            1,          "byte"},    -- 1 超值基金  2 奢华基金
-    -- {"canOneClickSaodang", 1,       "byte"},    -- 是否可以一键扫荡(勇者试炼) 0 不可以 1 可以
 }
 
 CG_OVERFLOW_FUND_GET = {

+ 28 - 4
script/module/xianzhi/XianzhiLogic.lua

@@ -103,8 +103,18 @@ function zhaohuanDo(human, camp, cnt, skip)
 	if flag ~= true then
 		return Broadcast.sendErr(human, Lang.XIANZHI_OPEN_NEED_LV)
 	end
-    cnt = 1
-	if cnt < 1 then return end 
+	
+	-- 验证召唤次数:支持1次或10次
+	if cnt ~= 1 and cnt ~= 10 then
+		return Broadcast.sendErr(human, Lang.COMMON_ARGUMENT_ERROR)
+	end
+	
+	-- 检查英雄背包空间
+	local heroCnt = cnt * 5  -- 每次召唤实际会抽取5次(碎片机制)
+	if HeroLogic.getEmptyCnt(human) < heroCnt then
+		return Broadcast.sendErr(human, Lang.HERO_BAG_FULL)
+	end
+	
 	local xianzhiConfig = XianzhiExcel.xianzhi[camp]
 	if not xianzhiConfig then return end
 	
@@ -124,6 +134,20 @@ function zhaohuanDo(human, camp, cnt, skip)
 		return
 	end
 	
+	-- 检查返回的英雄数量是否超出协议限制(协议支持最多15个)
+	if #getID > 15 then
+		print("[zhaohuanDo] WARNING: 返回英雄数量 "..#getID.." 超出协议限制15,将截断")
+		-- 截断到15个
+		local tempID = {}
+		local tempCnt = {}
+		for i = 1, math.min(15, #getID) do
+			tempID[i] = getID[i]
+			tempCnt[i] = getCnt[i]
+		end
+		getID = tempID
+		getCnt = tempCnt
+	end
+	
     human.db.drawCard.skip = skip or 0
 	-- 扣消耗
 	BagLogic.delItem(human, needItemID, needItemCnt, "xianzhi_zhaohuan")
@@ -148,8 +172,8 @@ function zhaohuanDo(human, camp, cnt, skip)
 	--	BagLogic.addItem(human, getID[i], getCnt[i], "xianzhi_zhaohuan")
 		HeroGrid.makeHeroNice(msgRet.list[i], getID[i], getCnt[i], isNew)
 	end
-	BagLogic.updateMomentItem(2, xianzhiOutPutId, 1) --每次召唤获得精华1
-	-- 额外增加的物品 30珠子 1转轴	
+	BagLogic.updateMomentItem(2, xianzhiOutPutId, cnt) --每次召唤获得精华1个,10连获得10
+	-- 额外增加的物品:每次召唤获得100珠子,10连获得1000珠子
 	local exItemCnt1 = cnt * 100
 	BagLogic.updateMomentItem(2, ItemDefine.ITEM_XIANZHI_ZHUFU_ID,  exItemCnt1)
 	BagLogic.addMomentItemList(human, "xianzhi_zhaohuan")