Commit 3064f601 authored by 未闻皂名's avatar 未闻皂名

2025/10/11 选择卡片优化

parent b31873f8
Pipeline #41001 passed with stages
in 13 minutes and 10 seconds
...@@ -151,6 +151,16 @@ end ...@@ -151,6 +151,16 @@ end
-- 让玩家选择卡片组的 min ~ max 张卡,可以取消 -- 让玩家选择卡片组的 min ~ max 张卡,可以取消
function RushDuel.SelectGroup(player, group, min, max) function RushDuel.SelectGroup(player, group, min, max)
-- 单选优化
if min == 1 and max == 1 then
local tc = group:SelectUnselect(nil, player, false, true, 1, 1)
if tc then
return Group.FromCards(tc)
else
return nil
end
end
-- 多选
local sg = Group.CreateGroup() local sg = Group.CreateGroup()
local finish = (#sg >= min and #sg <= max) local finish = (#sg >= min and #sg <= max)
while #sg < max do while #sg < max do
......
...@@ -17,20 +17,17 @@ RushDuel.FusionSummonPosition = POS_FACEUP ...@@ -17,20 +17,17 @@ RushDuel.FusionSummonPosition = POS_FACEUP
function RushDuel.MakeFusionMaterial(card, ...) function RushDuel.MakeFusionMaterial(card, ...)
local codes = {} local codes = {}
local funcs = {} local funcs = {}
local unspecified = false
for _, val in ipairs {...} do for _, val in ipairs {...} do
local val_type = type(val) local val_type = type(val)
if val_type == "number" then if val_type == "number" then
RushDuel.AddCodeFusionMaterial(codes, funcs, val) RushDuel.AddCodeFusionMaterial(codes, funcs, val)
elseif val_type == "function" then elseif val_type == "function" then
unspecified = true
RushDuel.AddFuncFusionMaterial(codes, funcs, val) RushDuel.AddFuncFusionMaterial(codes, funcs, val)
elseif val_type == "table" then elseif val_type == "table" then
local res = RushDuel.AddMixFusionMaterial(codes, funcs, val) RushDuel.AddMixFusionMaterial(codes, funcs, val)
unspecified = unspecified or res
end end
end end
return codes, funcs, unspecified return codes, funcs
end end
-- 融合素材 - 卡名 -- 融合素材 - 卡名
function RushDuel.AddCodeFusionMaterial(codes, funcs, code) function RushDuel.AddCodeFusionMaterial(codes, funcs, code)
...@@ -48,12 +45,10 @@ end ...@@ -48,12 +45,10 @@ end
-- 融合素材 - 混合 -- 融合素材 - 混合
function RushDuel.AddMixFusionMaterial(codes, funcs, list) function RushDuel.AddMixFusionMaterial(codes, funcs, list)
local mixs = {} local mixs = {}
local unspecified = true
for _, val in ipairs(list) do for _, val in ipairs(list) do
local val_type = type(val) local val_type = type(val)
if val_type == "number" then if val_type == "number" then
RushDuel.AddCodeFusionMaterial(codes, mixs, val) RushDuel.AddCodeFusionMaterial(codes, mixs, val)
unspecified = false
elseif val_type == "function" then elseif val_type == "function" then
RushDuel.AddFuncFusionMaterial(codes, mixs, val) RushDuel.AddFuncFusionMaterial(codes, mixs, val)
end end
...@@ -66,11 +61,10 @@ function RushDuel.AddMixFusionMaterial(codes, funcs, list) ...@@ -66,11 +61,10 @@ function RushDuel.AddMixFusionMaterial(codes, funcs, list)
end end
return false return false
end) end)
return unspecified
end end
-- 设置融合素材数据 -- 设置融合素材数据
function RushDuel.SetFusionMaterialData(card, codes, min, max, unspecified) function RushDuel.SetFusionMaterialData(card, codes, min, max)
local mt = getmetatable(card) local mt = getmetatable(card)
-- 卡名记述的素材 -- 卡名记述的素材
if codes ~= nil then if codes ~= nil then
...@@ -85,10 +79,6 @@ function RushDuel.SetFusionMaterialData(card, codes, min, max, unspecified) ...@@ -85,10 +79,6 @@ function RushDuel.SetFusionMaterialData(card, codes, min, max, unspecified)
if mt.material_count == nil then if mt.material_count == nil then
mt.material_count = {min, max} mt.material_count = {min, max}
end end
-- 包含不指定卡名的融合素材
if unspecified ~= nil then
mt.unspecified_funsion = unspecified
end
end end
-- 创建融合手续 -- 创建融合手续
...@@ -219,8 +209,8 @@ function RushDuel.AddFusionProcedure(card, sub, insf, ...) ...@@ -219,8 +209,8 @@ function RushDuel.AddFusionProcedure(card, sub, insf, ...)
sub = true sub = true
end end
-- 融合素材 -- 融合素材
local codes, funcs, unspecified = RushDuel.MakeFusionMaterial(card, table.unpack(vals)) local codes, funcs = RushDuel.MakeFusionMaterial(card, table.unpack(vals))
RushDuel.SetFusionMaterialData(card, codes, #funcs, #funcs, unspecified) RushDuel.SetFusionMaterialData(card, codes, #funcs, #funcs)
return RushDuel.CreateFusionProcedure(card, insf, sub, funcs, nil, 0, nil) return RushDuel.CreateFusionProcedure(card, insf, sub, funcs, nil, 0, nil)
end end
...@@ -248,8 +238,8 @@ function RushDuel.AddFusionProcedureRep(card, insf, sub, func, min, max, ...) ...@@ -248,8 +238,8 @@ function RushDuel.AddFusionProcedureRep(card, insf, sub, func, min, max, ...)
table.insert(vals, func) table.insert(vals, func)
end end
-- 融合素材 -- 融合素材
local codes, funcs, unspecified = RushDuel.MakeFusionMaterial(card, table.unpack(vals)) local codes, funcs = RushDuel.MakeFusionMaterial(card, table.unpack(vals))
RushDuel.SetFusionMaterialData(card, codes, #funcs + min, #funcs + max, unspecified) RushDuel.SetFusionMaterialData(card, codes, #funcs + min, #funcs + max)
return RushDuel.CreateFusionProcedure(card, insf, sub, funcs, func, max - min, nil) return RushDuel.CreateFusionProcedure(card, insf, sub, funcs, func, max - min, nil)
end end
...@@ -317,7 +307,7 @@ function RushDuel.ContactFusionOperation(e, tp, eg, ep, ev, re, r, rp, c) ...@@ -317,7 +307,7 @@ function RushDuel.ContactFusionOperation(e, tp, eg, ep, ev, re, r, rp, c)
if #cg > 0 then if #cg > 0 then
Duel.ConfirmCards(1 - c:GetControler(), cg) Duel.ConfirmCards(1 - c:GetControler(), cg)
end end
Duel.SendtoDeck(g, nil, SEQ_DECKSHUFFLE, REASON_MATERIAL + REASON_COST) Duel.SendtoDeck(g, nil, SEQ_DECKSHUFFLE, REASON_MATERIAL + REASON_FUSION + REASON_COST)
g:DeleteGroup() g:DeleteGroup()
end end
...@@ -414,11 +404,9 @@ function RushDuel.ExecuteFusionSummon(e, tp, list, chkf, gc, mat_move, cancelabl ...@@ -414,11 +404,9 @@ function RushDuel.ExecuteFusionSummon(e, tp, list, chkf, gc, mat_move, cancelabl
local fc = nil local fc = nil
Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON) Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
if cancelable then if cancelable then
local g = RushDuel.SelectGroup(tp, sg, 1, 1) fc = sg:SelectUnselect(nil, tp, false, true, 1, 1)
if not g then if not fc then
return nil return nil
else
fc = g:GetFirst()
end end
else else
fc = sg:Select(tp, 1, 1, nil):GetFirst() fc = sg:Select(tp, 1, 1, nil):GetFirst()
......
...@@ -186,11 +186,9 @@ function RushDuel.ExecuteRitualSummon(e, tp, type, list, chkf, gc, mat_move, can ...@@ -186,11 +186,9 @@ function RushDuel.ExecuteRitualSummon(e, tp, type, list, chkf, gc, mat_move, can
local rc = nil local rc = nil
Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON) Duel.Hint(HINT_SELECTMSG, tp, HINTMSG_SPSUMMON)
if cancelable then if cancelable then
local g = RushDuel.SelectGroup(tp, sg, 1, 1) rc = sg:SelectUnselect(nil, tp, false, true, 1, 1)
if not g then if not rc then
return nil return nil
else
rc = g:GetFirst()
end end
else else
rc = sg:Select(tp, 1, 1, nil):GetFirst() rc = sg:Select(tp, 1, 1, nil):GetFirst()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment