@@ -110,10 +110,10 @@ function Xyz.SubMatFilter(c,lv,xyz,tp)
110110 end
111111 return true
112112end
113- function Xyz .CheckValidMultiXyzMaterial (effs ,xyz )
113+ function Xyz .CheckValidMultiXyzMaterial (effs ,xyz , matg )
114114 for i ,te in ipairs (effs ) do
115115 local tgf = te :GetOperation ()
116- if not tgf or tgf (te ,xyz ) then return true end
116+ if not tgf or tgf (te ,xyz , matg ) then return true end
117117 end
118118 return false
119119end
@@ -224,15 +224,16 @@ function Xyz.RecursionChk(c,mg,xyz,tp,min,max,minc,maxc,sg,matg,ct,matct,mustbem
224224 if mg :IsExists (Xyz .RecursionChk ,1 ,sg ,mg ,xyz ,tp ,min ,max ,minc ,maxc ,sg ,matg ,xct ,xmatct ,mustbemat ,exchk ,f ,mustg ,lv ,eqmg ,equips_inverse ) then return true end
225225 if not mustbemat then
226226 local retchknum = {}
227- for i ,te in ipairs ({c :GetCardEffect (EFFECT_DOUBLE_XYZ_MATERIAL )}) do
227+ for i ,te in ipairs ({c :IsHasEffect (EFFECT_DOUBLE_XYZ_MATERIAL , tp )}) do
228228 local tgf = te :GetOperation ()
229229 local val = te :GetValue ()
230- if val > 0 and not retchknum [val ] and (not maxc or xmatct + val <= maxc ) and (not tgf or tgf (te ,xyz )) then
230+ if val > 0 and not retchknum [val ] and (not maxc or xmatct + val <= maxc ) and (not tgf or tgf (te ,xyz , matg )) then
231231 retchknum [val ]= true
232- if (xct + val >= min and xmatct + val >= minc and Xyz .CheckMaterialSet (matg ,xyz ,tp ,exchk ,mustg ,lv ))
233- or mg :IsExists (Xyz .RecursionChk ,1 ,sg ,mg ,xyz ,tp ,min ,max ,minc ,maxc ,sg ,matg ,xct ,xmatct + val ,mustbemat ,exchk ,f ,mustg ,lv ,eqmg ,equips_inverse ) then
234- return true
235- end
232+ te :UseCountLimit (tp )
233+ local chk = (xct + val >= min and xmatct + val >= minc and Xyz .CheckMaterialSet (matg ,xyz ,tp ,exchk ,mustg ,lv ))
234+ or mg :IsExists (Xyz .RecursionChk ,1 ,sg ,mg ,xyz ,tp ,min ,max ,minc ,maxc ,sg ,matg ,xct ,xmatct + val ,mustbemat ,exchk ,f ,mustg ,lv ,eqmg ,equips_inverse )
235+ te :RestoreCountLimit (tp )
236+ if chk then return true end
236237 end
237238 end
238239 end
@@ -345,7 +346,7 @@ function Xyz.Target(f,lv,minc,maxc,mustbemat,exchk)
345346 min = min or 0
346347 local matg = Group .CreateGroup ()
347348 local sg = Group .CreateGroup ()
348- local tab = {}
349+ local multiXyzSelectedCards = {}
349350 local finishable = false
350351 while true do
351352 local ct =# matg
@@ -365,37 +366,46 @@ function Xyz.Target(f,lv,minc,maxc,mustbemat,exchk)
365366 if equips_inverse and equips_inverse [sc ] then
366367 mg :Merge (equips_inverse [sc ])
367368 end
368- local multiXyz = {sc :GetCardEffect (EFFECT_DOUBLE_XYZ_MATERIAL )}
369- if # multiXyz > 0 and Xyz .CheckValidMultiXyzMaterial (multiXyz ,c ) and ct < minc then
369+ local multiXyz = {sc :IsHasEffect (EFFECT_DOUBLE_XYZ_MATERIAL , tp )}
370+ if # multiXyz > 0 and Xyz .CheckValidMultiXyzMaterial (multiXyz ,c , matg ) and ct < minc then
370371 matg :AddCard (sc )
371372 local multi = {}
372- if mg :IsExists (Xyz .RecursionChk ,1 ,sg ,mg ,c ,tp ,min ,max ,minc ,maxc ,sg ,matg ,ct ,matct ,mustbemat ,exchk ,f ,mustg ,lv ,eqmg ,equips_inverse ) then
373- table.insert ( multi , 1 )
373+ if mg :IsExists (Xyz .RecursionChk ,1 ,sg ,mg ,c ,tp ,min ,max ,minc ,maxc ,sg ,matg ,ct + 1 ,matct + 1 ,mustbemat ,exchk ,f ,mustg ,lv ,eqmg ,equips_inverse ) then
374+ multi [ 1 ] = {}
374375 end
375- local eff = {sc :GetCardEffect (EFFECT_DOUBLE_XYZ_MATERIAL )}
376- for i = 1 ,# eff do
377- local te = eff [i ]
376+ for i = 1 ,# multiXyz do
377+ local te = multiXyz [i ]
378378 local tgf = te :GetOperation ()
379379 local val = te :GetValue ()
380- if val > 0 and (not tgf or tgf (te ,c )) then
380+ if val > 0 and (not tgf or tgf (te ,c , matg )) then
381381 local newCount = matct + 1 + val
382- if (minc <= newCount and newCount <= maxc )
383- or mg :IsExists (Xyz .RecursionChk ,1 ,sg ,mg ,c ,tp ,min ,max ,minc ,maxc ,sg ,matg ,ct ,newCount ,mustbemat ,exchk ,f ,mustg ,lv ,eqmg ,equips_inverse ) then
384- table.insert (multi ,1 + val )
382+ te :UseCountLimit (tp )
383+ local chk = (minc <= newCount and newCount <= maxc )
384+ or mg :IsExists (Xyz .RecursionChk ,1 ,sg ,mg ,c ,tp ,min ,max ,minc ,maxc ,sg ,matg ,ct + 1 ,newCount ,mustbemat ,exchk ,f ,mustg ,lv ,eqmg ,equips_inverse )
385+ if chk then
386+ if not multi [1 + val ] then
387+ multi [1 + val ]= {}
388+ end
389+ table.insert (multi [1 + val ],te )
385390 end
391+ te :RestoreCountLimit (tp )
386392 end
387393 end
388- if # multi == 1 then
389- if multi [1 ]> 1 then
390- extra_mats = extra_mats + multi [1 ]- 1
391- tab [sc ]= multi [1 ]
394+ local availableNumbers = {}
395+ for k in ipairs (multi ) do
396+ table.insert (availableNumbers ,k )
397+ end
398+ if # availableNumbers > 0 then
399+ local chosen = availableNumbers [1 ]
400+ if # availableNumbers ~= 1 then
401+ Duel .Hint (HINT_SELECTMSG ,tp ,HINTMSG_XMATERIAL )
402+ chosen = Duel .AnnounceNumber (tp ,availableNumbers )
392403 end
393- else
394- Duel .Hint (HINT_SELECTMSG ,tp ,HINTMSG_XMATERIAL )
395- local num = Duel .AnnounceNumber (tp ,table.unpack (multi ))
396- if num > 1 then
397- extra_mats = extra_mats + num - 1
398- tab [sc ]= num
404+ if chosen > 1 then
405+ local eff = multi [chosen ][1 ]
406+ extra_mats = extra_mats + chosen - 1
407+ eff :UseCountLimit (tp )
408+ multiXyzSelectedCards [sc ]= {eff ,chosen }
399409 end
400410 end
401411 elseif sc :IsHasEffect (EFFECT_ORICHALCUM_CHAIN ) then
@@ -416,9 +426,11 @@ function Xyz.Target(f,lv,minc,maxc,mustbemat,exchk)
416426 extra_mats = extra_mats - 1
417427 else
418428 matg :RemoveCard (sc )
419- local num = tab [sc ]
420- if num then
421- tab [sc ]= nil
429+ local multiXyzSelection = multiXyzSelectedCards [sc ]
430+ if multiXyzSelection then
431+ multiXyzSelectedCards [sc ]= nil
432+ local eff ,num = table.unpack (multiXyzSelection )
433+ eff :RestoreCountLimit (tp )
422434 extra_mats = extra_mats - (num - 1 )
423435 end
424436 end
0 commit comments