Commit 396b17aa authored by Vury Leo's avatar Vury Leo

Add TG サイバー・マジシャン

parent 9977b62c
......@@ -29,7 +29,7 @@ function s.initial_effect(c)
e4:SetType(EFFECT_TYPE_SINGLE)
e4:SetProperty(EFFECT_FLAG_CANNOT_DISABLE+EFFECT_FLAG_UNCOPYABLE)
e4:SetCode(id)
e4:SetTarget(s.hsyntg)
e4:SetValue(s.tgvalue)
c:RegisterEffect(e4)
end
function s.synfilter1(c,syncard,tuner,f)
......@@ -126,3 +126,7 @@ end
function s.hsyntg(e,c,syncard)
return c:IsSetCard(0x27) and c:IsNotTuner(syncard)
end
function s.tgvalue(e,tc)
return tc:IsSetCard(0x27)
end
......@@ -4,6 +4,7 @@ function s.initial_effect(c)
c:EnableReviveLimit()
--material
aux.AddSynchroProcedure(c,nil,aux.NonTuner(nil),1)
Synchro.AddSynchroProcedure(c)
--spsummon
local e1=Effect.CreateEffect(c)
e1:SetDescription(aux.Stringid(id,0))
......
......@@ -3384,7 +3384,7 @@ Synchro.Role={
}
--- Shadowing Duel.GetSynchroMaterial as we have different definition on hand materials
function Synchro.GetSynchroMaterial(tp,tc,base_mapper)
function Synchro.GetSynchroMaterial(tp,tc,level_mapper)
local mg=Duel.GetMatchingGroup(function(mc) return mc:IsFaceup() and mc:IsOnField() end,tp,LOCATION_MZONE,0,nil)
local mg_hand=Duel.GetMatchingGroup(function(mc) return mc:IsFaceupEx() end,tp,LOCATION_HAND,0,nil)
local mg_oppoent=Duel.GetMatchingGroup(function(mc)
......@@ -3420,7 +3420,7 @@ function Synchro.GetSynchroMaterial(tp,tc,base_mapper)
end,nil)
--- it must have a level
mg=mg:Filter(function(mc)
local lvls=base_mapper(mc,tc)
local lvls=level_mapper(mc,tc)
if #lvls==0 then
return false
end
......@@ -3442,8 +3442,9 @@ function Synchro.AddSynchroProcedure(c,params)
local tuner_max=params.tuner_max or 1
local non_tuner_min=params.non_tuner_min or 1
local non_tuner_max=params.non_tuner_max or Synchro.Infinite
local base_mapper=params.base_mapper or Synchro.DefaultLevelMapper
local level_mapper=params.level_mapper or Synchro.DefaultLevelMapper
local scheck=params.scheck or aux.TRUE
local hand_count_mapper=params.hand_count_mapper or Synchro.DefaultHandCountMapper
local drop_default_tuner_filter=params.drop_default_tuner_filter or false
local drop_default_non_tuner_filter=params.drop_default_non_tuner_filter or false
......@@ -3463,8 +3464,8 @@ function Synchro.AddSynchroProcedure(c,params)
e1:SetCode(EFFECT_SPSUMMON_PROC)
e1:SetProperty(EFFECT_FLAG_CANNOT_DISABLE+EFFECT_FLAG_UNCOPYABLE)
e1:SetRange(LOCATION_EXTRA)
e1:SetCondition(Synchro.SynCondition(tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tuner_min,tuner_max,non_tuner_min,non_tuner_max,base_mapper,scheck))
e1:SetTarget(Synchro.SynTarget(tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tuner_min,tuner_max,non_tuner_min,non_tuner_max,base_mapper,scheck))
e1:SetCondition(Synchro.SynCondition(tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tuner_min,tuner_max,non_tuner_min,non_tuner_max,level_mapper,hand_count_mapper,scheck))
e1:SetTarget(Synchro.SynTarget(tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tuner_min,tuner_max,non_tuner_min,non_tuner_max,level_mapper,hand_count_mapper,scheck))
e1:SetOperation(Synchro.SynOperation())
e1:SetValue(SUMMON_TYPE_SYNCHRO)
c:RegisterEffect(e1)
......@@ -3477,8 +3478,8 @@ function Synchro.AddSynchroProcedure(c,params)
e2:SetCode(EFFECT_SPSUMMON_PROC)
e2:SetProperty(EFFECT_FLAG_CANNOT_DISABLE+EFFECT_FLAG_UNCOPYABLE)
e2:SetRange(LOCATION_EXTRA)
e2:SetCondition(Synchro.SynCondition(tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tuner_min,tuner_max,non_tuner_min,non_tuner_max,base_mapper,scheck))
e2:SetTarget(Synchro.SynTarget(tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tuner_min,tuner_max,non_tuner_min,non_tuner_max,base_mapper,scheck))
e2:SetCondition(Synchro.SynCondition(tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tuner_min,tuner_max,non_tuner_min,non_tuner_max,level_mapper,hand_count_mapper,scheck))
e2:SetTarget(Synchro.SynTarget(tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tuner_min,tuner_max,non_tuner_min,non_tuner_max,level_mapper,hand_count_mapper,scheck))
e2:SetOperation(Synchro.SynOperation())
e2:SetValue(SUMMON_TYPE_SYNCHRO)
c:RegisterEffect(e2)
......@@ -3491,7 +3492,7 @@ function Synchro.FindValidSelection(candidates,target_level,
non_tuner_race,non_tuner_filter,tc,
tuner_min,tuner_max,
non_tuner_min,non_tuner_max,
base_mapper,scheck,
level_mapper,hand_count_mapper,scheck,
pre_select,state)
Synchro.SortMaterials(candidates,tc,tuner_filter)
......@@ -3507,7 +3508,7 @@ function Synchro.FindValidSelection(candidates,target_level,
-- Find the index of the last hand card
local hand_prune_index=0
for i, c in ipairs(candidates) do
if Synchro.IsHandAlter(c) then
if Synchro.IsHandAlter(c,tc) then
hand_prune_index=i
end
end
......@@ -3527,15 +3528,16 @@ function Synchro.FindValidSelection(candidates,target_level,
non_tuner_race,non_tuner_filter,tc,
tuner_min,tuner_max,
non_tuner_min,non_tuner_max,
base_mapper,scheck,
level_mapper,hand_count_mapper,scheck,
pre_select or {},
1,
state or { -- initial state
possible_sums={[0]=true},
tuner_count=0,
non_tuner_count=0,
level_mapper=base_mapper,
level_mapper=level_mapper,
level_mapper_priority=0,
hand_count_mapper=hand_count_mapper,
hand_count_limit=0,
hand_count=0,
genomix_race=nil,
......@@ -3565,7 +3567,7 @@ end
--- @param tuner_max integer|table -- Maximum number of Tuners.
--- @param non_tuner_min integer -- Minimum number of non-Tuners.
--- @param non_tuner_max integer|table -- Maximum number of non-Tuners.
--- @param base_mapper fun(mc:Card,tc:Card):integer[] -- Returns possible levels for mc.
--- @param level_mapper fun(mc:Card,tc:Card):integer[] -- Returns possible levels for mc.
--- @param scheck fun(selected:Card[]):boolean -- Optional card-group check (e.g. Judgment’s same-Attribute).
--- @param selected Card[] -- Materials chosen so far.
--- @param index integer -- Next candidate index (1-based).
......@@ -3586,7 +3588,7 @@ end
--- race_prune_index integer
--- @return boolean True if a valid selection exists, false otherwise.
function Synchro.CanCompleteSelection(candidates,target_level,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tc,
tuner_min,tuner_max,non_tuner_min,non_tuner_max,base_mapper,scheck,selected,index,state,prune_indexes)
tuner_min,tuner_max,non_tuner_min,non_tuner_max,level_mapper,hand_count_mapper,scheck,selected,index,state,prune_indexes)
if state.tuner_count>tuner_max then return false end
if state.non_tuner_count>non_tuner_max then return false end
......@@ -3656,7 +3658,7 @@ function Synchro.CanCompleteSelection(candidates,target_level,tuner_race,tuner_f
--- include branch
if can_include then
for _,diff in ipairs(Synchro.GenerateVariantForCard(
state,mc,#selected+1,tc,tuner_race,prune_tuner_filter,non_tuner_race,prune_non_tuner_filter
state,mc,selected,tc,tuner_race,prune_tuner_filter,non_tuner_race,prune_non_tuner_filter
)) do
-- apply diff
local branch_state=Synchro.ApplyVariantState(
......@@ -3668,7 +3670,7 @@ function Synchro.CanCompleteSelection(candidates,target_level,tuner_race,tuner_f
tuner_race,tuner_filter,
non_tuner_race,non_tuner_filter,tc,
tuner_min,tuner_max,non_tuner_min,non_tuner_max,
base_mapper,scheck,
level_mapper,hand_count_mapper,scheck,
selected,index+1,branch_state,prune_indexes
) then
table.remove(selected)
......@@ -3680,7 +3682,7 @@ function Synchro.CanCompleteSelection(candidates,target_level,tuner_race,tuner_f
-- exclude branch
if Synchro.CanCompleteSelection(candidates,target_level,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tc,
tuner_min,tuner_max,non_tuner_min,non_tuner_max,base_mapper,scheck,selected,index+1,state,prune_indexes) then
tuner_min,tuner_max,non_tuner_min,non_tuner_max,level_mapper,hand_count_mapper,scheck,selected,index+1,state,prune_indexes) then
return true
end
......@@ -3688,7 +3690,7 @@ function Synchro.CanCompleteSelection(candidates,target_level,tuner_race,tuner_f
end
--- Synchro condition generator using tuner/non-tuner min/max counts and filters
function Synchro.SynCondition(tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tuner_min,tuner_max,non_tuner_min,non_tuner_max,base_mapper,scheck)
function Synchro.SynCondition(tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tuner_min,tuner_max,non_tuner_min,non_tuner_max,level_mapper,hand_count_mapper,scheck)
--- @param mg Group
return function(e,c,smat,mg,min,max)
if c==nil then return true end
......@@ -3708,7 +3710,7 @@ function Synchro.SynCondition(tuner_race,tuner_filter,non_tuner_race,non_tuner_f
end
local target_level=c:GetLevel()
mg=mg or Synchro.GetSynchroMaterial(c:GetControler(),c,base_mapper)
mg=mg or Synchro.GetSynchroMaterial(c:GetControler(),c,level_mapper)
local smat_states=nil
local smat_arr=nil
......@@ -3726,28 +3728,28 @@ function Synchro.SynCondition(tuner_race,tuner_filter,non_tuner_race,non_tuner_f
end
smat_arr={}
table.insert(smat_arr,smat)
smat_states=Synchro.BuildStatesFromSelection(smat_arr,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,base_mapper,c,math.huge)
smat_states=Synchro.BuildStatesFromSelection(smat_arr,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,level_mapper,hand_count_mapper,c,math.huge)
for _,state in ipairs(smat_states) do
if Synchro.FindValidSelection(candidates,target_level,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,c,tuner_min,tuner_max,non_tuner_min,non_tuner_max,base_mapper,scheck,smat_arr,state) then
if Synchro.FindValidSelection(candidates,target_level,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,c,tuner_min,tuner_max,non_tuner_min,non_tuner_max,level_mapper,hand_count_mapper,scheck,smat_arr,state) then
return true
end
end
return false
else
return Synchro.FindValidSelection(candidates,target_level,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,c,tuner_min,tuner_max,non_tuner_min,non_tuner_max,base_mapper,scheck)
return Synchro.FindValidSelection(candidates,target_level,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,c,tuner_min,tuner_max,non_tuner_min,non_tuner_max,level_mapper,hand_count_mapper,scheck)
end
end
end
function Synchro.SynTarget(tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tuner_min,tuner_max,non_tuner_min,non_tuner_max,base_mapper,scheck)
function Synchro.SynTarget(tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tuner_min,tuner_max,non_tuner_min,non_tuner_max,level_mapper,hand_count_mapper,scheck)
return function(e,tp,eg,ep,ev,re,r,rp,chk,tc,smat,mg,min,max)
if mg~=nil and #mg==min then
e:SetLabelObject(mg)
return true
end
mg=mg or Synchro.GetSynchroMaterial(tp,tc,base_mapper)
mg=mg or Synchro.GetSynchroMaterial(tp,tc,level_mapper)
-- add リペア・ジェネクス・コントローラー to scheck
if Duel.IsPlayerAffectedByEffect(tp,8173184) then
......@@ -3788,7 +3790,7 @@ function Synchro.SynTarget(tuner_race,tuner_filter,non_tuner_race,non_tuner_filt
sg_arr,
tuner_race,tuner_filter,
non_tuner_race,non_tuner_filter,
base_mapper,
level_mapper,hand_count_mapper,
tc,math.huge
)
--- use the min select level as hint
......@@ -3826,7 +3828,7 @@ function Synchro.SynTarget(tuner_race,tuner_filter,non_tuner_race,non_tuner_filt
test_selection,
tuner_race,tuner_filter,
non_tuner_race,non_tuner_filter,
base_mapper,
level_mapper,hand_count_mapper,
tc,math.huge
)
......@@ -3836,7 +3838,7 @@ function Synchro.SynTarget(tuner_race,tuner_filter,non_tuner_race,non_tuner_filt
tuner_race,tuner_filter,
non_tuner_race,non_tuner_filter,tc,
tuner_min,tuner_max,non_tuner_min,non_tuner_max,
base_mapper,scheck,test_selection,init_state)
level_mapper,hand_count_mapper,scheck,test_selection,init_state)
then
addable:AddCard(candidate)
break
......@@ -3853,7 +3855,7 @@ function Synchro.SynTarget(tuner_race,tuner_filter,non_tuner_race,non_tuner_filt
break
end
local finishable=Synchro.IsSelectionValid(sg_arr,target_level,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tc,tuner_min,tuner_max,non_tuner_min,non_tuner_max,base_mapper)
local finishable=Synchro.IsSelectionValid(sg_arr,target_level,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tc,tuner_min,tuner_max,non_tuner_min,non_tuner_max,level_mapper,hand_count_mapper)
Duel.Hint(HINT_SELECTMSG,tp,HINTMSG_SMATERIAL)
local picked=Group.SelectUnselect(addable,sg,tp,finishable,true,selected_level_min,target_level)
......@@ -3939,12 +3941,12 @@ function Synchro.SynOperation()
end
end
function Synchro.IsSelectionValid(selection,target_level,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tc,tuner_min,tuner_max,non_tuner_min,non_tuner_max,base_mapper)
function Synchro.IsSelectionValid(selection,target_level,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tc,tuner_min,tuner_max,non_tuner_min,non_tuner_max,level_mapper,hand_count_mapper)
local states=Synchro.BuildStatesFromSelection(
selection,
tuner_race,tuner_filter,
non_tuner_race,non_tuner_filter,
base_mapper,
level_mapper,hand_count_mapper,
tc,target_level
)
for _,state in ipairs(states) do
......@@ -4012,6 +4014,14 @@ function Synchro.DefaultLevelMapper(card,tc)
return levels
end
function Synchro.DefaultHandCountMapper(card,tc)
-- Revolution Synchron effect
if Synchro.IsRevolution(card,tc) then
return 0
end
return 1
end
function Synchro.DefaultTunerFilter(mc,tc)
-- if this card has EFFECT_TUNER, always count it as a Tuner
for _,e in ipairs({mc:IsHasEffect(EFFECT_TUNER)}) do
......@@ -4053,14 +4063,15 @@ function Synchro.UpdatepossibleSums(possible_sums,card_levels,prune_level)
return new_sums
end
function Synchro.BuildStatesFromSelection(selection,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,base_mapper,tc,prune_level)
function Synchro.BuildStatesFromSelection(selection,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,level_mapper,hand_count_mapper,tc,prune_level)
local states={
{
possible_sums={[0]=true},
tuner_count=0,
non_tuner_count=0,
level_mapper=base_mapper,
level_mapper=level_mapper,
level_mapper_priority=0,
hand_count_mapper=hand_count_mapper,
hand_count_limit=0,
hand_count=0,
genomix_race=nil,
......@@ -4071,7 +4082,8 @@ function Synchro.BuildStatesFromSelection(selection,tuner_race,tuner_filter,non_
Synchro.SortMaterials(selection,tc,tuner_filter)
for idx,card in ipairs(selection)do
local selected={}
for _,card in ipairs(selection)do
local next_states={}
local material_limit_effect=card:IsHasEffect(EFFECT_TUNER_MATERIAL_LIMIT) or card:IsHasEffect(EFFECT_SCRAP_CHIMERA)
......@@ -4082,7 +4094,7 @@ function Synchro.BuildStatesFromSelection(selection,tuner_race,tuner_filter,non_
for _,st in ipairs(states) do
for _,diff in ipairs(Synchro.GenerateVariantForCard(
st,card,idx,tc,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter
st,card,selected,tc,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter
)) do
-- merge diff into full state
local new_state = Synchro.ApplyVariantState(
......@@ -4092,6 +4104,7 @@ function Synchro.BuildStatesFromSelection(selection,tuner_race,tuner_filter,non_
end
end
table.insert(selected,card)
states=next_states
if #states==0 then
......@@ -4131,6 +4144,15 @@ function Synchro.IsRevolution(c,tc)
return revo_e:GetValue()(revo_e,tc)
end
--- @param c Card
function Synchro.IsTGCyberMagician(c,tc)
local tg_e=c:IsHasEffect(64910482)
if tg_e==nil then
return false
end
return tg_e:GetValue()(tg_e,tc)
end
--- @param c Card
function Synchro.IsGenomix(c)
return c:IsHasEffect(42155488)~=nil
......@@ -4165,8 +4187,8 @@ function Synchro.IsLevelAlter(c)
return Synchro.IsMono(c) or Synchro.IsFlower(c)
end
function Synchro.IsHandAlter(c)
return Synchro.IsTatsunoko(c) or Synchro.IsTatsunecro(c)
function Synchro.IsHandAlter(c,tc)
return Synchro.IsTatsunoko(c) or Synchro.IsTatsunecro(c) or Synchro.IsTGCyberMagician(c,tc)
end
function Synchro.IsRaceAlter(c)
......@@ -4182,14 +4204,14 @@ function Synchro.IsNoHarm(c)
end
-- Helper to generate only the variant-specific diffs for a card
function Synchro.GenerateVariantForCard(st,card,selected_count,tc,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter)
function Synchro.GenerateVariantForCard(st,card,selected,tc,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter)
local base_variants = {}
-- MonoSynchron first/second
if Synchro.IsMono(card) then
if st.level_mapper_priority<2 then
local firstMono = card
table.insert(base_variants,{
possible_sums={[(selected_count-1)+card:GetLevel()]=true},
possible_sums={[#selected+card:GetLevel()]=true},
level_mapper=function(c)
return (c==firstMono) and {c:GetLevel()} or {1}
end,
......@@ -4197,7 +4219,7 @@ function Synchro.GenerateVariantForCard(st,card,selected_count,tc,tuner_race,tun
})
elseif st.level_mapper_priority==2 then
table.insert(base_variants,{
possible_sums={[selected_count]=true},
possible_sums={[#selected+1]=true},
level_mapper=function() return {1} end,
})
end
......@@ -4217,9 +4239,9 @@ function Synchro.GenerateVariantForCard(st,card,selected_count,tc,tuner_race,tun
end
-- Flower Cardian override
if Synchro.IsFlower(card) and st.level_mapper_priority < 1 then
if Synchro.IsFlower(card) and st.level_mapper_priority<1 then
table.insert(base_variants,{
possible_sums={[2*selected_count]=true},
possible_sums={[2*(#selected+1)]=true},
level_mapper=function() return {2} end,
level_mapper_priority=1,
})
......@@ -4239,17 +4261,29 @@ function Synchro.GenerateVariantForCard(st,card,selected_count,tc,tuner_race,tun
})
end
-- now wrap each base_variant in role‐specific diffs
-- Revolution Synchron effect
local hand_delta=0
-- TG Cyber Magician effect
if Synchro.IsTGCyberMagician(card,tc) then
local new_hand_count_mapper=function(mc,p_tc)
if not mc:IsType(TYPE_TUNER) and mc:IsSetCard(0x27) then
return 0
end
return Synchro.DefaultHandCountMapper(mc,p_tc)
end
local previous_hand_count=0
if card:IsLocation(LOCATION_HAND) then
if Synchro.IsRevolution(card,tc) then
hand_delta=0
else
hand_delta=1
previous_hand_count=new_hand_count_mapper(card,tc)
end
for _,sc in ipairs(selected) do
if sc:IsLocation(LOCATION_HAND) then
previous_hand_count=previous_hand_count+new_hand_count_mapper(sc,tc)
end
end
table.insert(base_variants,{
hand_count=previous_hand_count,
hand_count_mapper=new_hand_count_mapper,
})
end
-- now wrap each base_variant in role‐specific diffs
local variants={}
local can_be_tuner=tuner_filter(card,tc)
......@@ -4265,7 +4299,8 @@ function Synchro.GenerateVariantForCard(st,card,selected_count,tc,tuner_race,tun
hand_count_limit=base.hand_count_limit,
append_material_limit_filter=base.append_material_limit_filter,
genomix_race=base.genomix_race,
hand_delta=hand_delta,
hand_count=base.hand_count,
hand_count_mapper=base.hand_count_mapper,
-- role-specific
tuner_delta=1,
non_tuner_delta=0,
......@@ -4281,7 +4316,9 @@ function Synchro.GenerateVariantForCard(st,card,selected_count,tc,tuner_race,tun
hand_count_limit=base.hand_count_limit,
append_material_limit_filter=base.append_material_limit_filter,
genomix_race=base.genomix_race,
hand_delta=hand_delta,
hand_count=base.hand_count,
hand_count_mapper=base.hand_count_mapper,
-- role-specific
tuner_delta=0,
non_tuner_delta=1,
role=Synchro.Role.NON_TUNER,
......@@ -4298,7 +4335,6 @@ function Synchro.ApplyVariantState(st,card,diff,tuner_race,tuner_filter,non_tune
-- compute increments using provided filters
local tuner_inc=diff.tuner_delta
local non_tuner_inc=diff.non_tuner_delta
local hand_inc=diff.hand_delta
local new_selected_roles={ table.unpack(st.selected_roles) }
table.insert(new_selected_roles,diff.role)
local possible_sums=Synchro.UpdatepossibleSums(
......@@ -4306,6 +4342,10 @@ function Synchro.ApplyVariantState(st,card,diff,tuner_race,tuner_filter,non_tune
st.level_mapper(card,tc),
prune_level
)
local hand_inc=0
if card:IsLocation(LOCATION_HAND) then
hand_inc=st.hand_count_mapper(card,tc)
end
local new_material_limit_filter=st.material_limit_filter
if append_material_limit_filter~=nil then
new_material_limit_filter=aux.AND(append_material_limit_filter,st.material_limit_filter)
......@@ -4316,8 +4356,9 @@ function Synchro.ApplyVariantState(st,card,diff,tuner_race,tuner_filter,non_tune
non_tuner_count=st.non_tuner_count+non_tuner_inc,
level_mapper=diff.level_mapper or st.level_mapper,
level_mapper_priority=diff.level_mapper_priority or st.level_mapper_priority,
hand_count_mapper=diff.hand_count_mapper or st.hand_count_mapper,
hand_count_limit=diff.hand_count_limit or st.hand_count_limit,
hand_count=st.hand_count+hand_inc,
hand_count=diff.hand_count or st.hand_count+hand_inc,
genomix_race=diff.genomix_race or st.genomix_race,
material_limit_filter=new_material_limit_filter,
selected_roles=new_selected_roles,
......@@ -4370,12 +4411,10 @@ function Synchro.CanIncludeMaterial(mc,state,selected,tc,
-- hand‐location count limit
if mc:IsLocation(LOCATION_HAND) and index>prune_indexes.hand_prune_index then
if not Synchro.IsRevolution(mc,tc) then
if state.hand_count+1>state.hand_count_limit then
if state.hand_count+state.hand_count_mapper(mc,tc)>state.hand_count_limit then
return false,nil
end
end
end
-- build a temporary Group = already selected cards + this mc
local sg=Group.FromCards(table.unpack(selected))
......@@ -4387,4 +4426,3 @@ function Synchro.CanIncludeMaterial(mc,state,selected,tc,
return true,append_material_limit_filter
end
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