Commit 9f9014b3 authored by Vury Leo's avatar Vury Leo

init mat filter

parent f5ac4633
......@@ -2,10 +2,10 @@
local s,id,o=GetID()
function s.initial_effect(c)
--synchro summon
aux.AddSynchroProcedure(c,aux.FilterBoolFunction(Card.IsRace,RACE_FIEND),aux.NonTuner(nil),1)
Synchro.AddSynchroProcedure(c,{
tuner_race=RACE_FIEND,
})
aux.AddSynchroProcedure(c,aux.FilterBoolFunction(Card.IsRace,RACE_FIEND),aux.NonTuner(nil),1)
c:EnableReviveLimit()
--chain attack
local e1=Effect.CreateEffect(c)
......
......@@ -3417,7 +3417,7 @@ function Synchro.FindValidSelection(candidates,target_level,
Synchro.SortMaterials(candidates,tc,tuner_filter)
-- Find the index of the last level card
local level_prune_index=0
local level_prune_index=-1
for i, c in ipairs(candidates) do
if Synchro.IsLevelAlter(c) then
level_prune_index=i
......@@ -3425,7 +3425,7 @@ function Synchro.FindValidSelection(candidates,target_level,
end
-- Find the index of the last hand card
local hand_prune_index=0
local hand_prune_index=-1
for i, c in ipairs(candidates) do
if Synchro.IsHandAlter(c) then
hand_prune_index=i
......@@ -3433,7 +3433,7 @@ function Synchro.FindValidSelection(candidates,target_level,
end
-- Find the index of the last race card
local race_prune_index=0
local race_prune_index=-1
for i, c in ipairs(candidates) do
if Synchro.IsRaceAlter(c) then
race_prune_index=i
......@@ -3459,6 +3459,7 @@ function Synchro.FindValidSelection(candidates,target_level,
hand_count_limit=0,
hand_count=0,
genomix_race=nil,
material_limit_filter=aux.TRUE,
},
{
level_prune_index=level_prune_index,
......@@ -3530,25 +3531,51 @@ function Synchro.CanCompleteSelection(candidates,target_level,tuner_race,tuner_f
end
local mc=candidates[index]
for _,diff in ipairs(Synchro.GenerateVariantForCard(
state,mc,#selected+1,tc,prune_tuner_filter,prune_non_tuner_filter
)) do
-- apply diff
local branch_state=Synchro.ApplyVariantState(
state,mc,diff,tuner_race,prune_tuner_filter,non_tuner_race,prune_non_tuner_filter,tc,prune_level
)
table.insert(selected,mc)
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,selected,index+1,branch_state,prune_indexes
) then
local can_include=true
--- to include one material it must fit all applied filter
if not state.material_limit_filter(nil,mc) then
can_include=false
end
local append_material_limit_filter=nil
if can_include==true then
--- to include one material, all selected ones must fit its material limit
local material_limit_effect=mc:IsHasEffect(EFFECT_TUNER_MATERIAL_LIMIT)
if material_limit_effect~=nil then
append_material_limit_filter=material_limit_effect:GetTarget()
assert(append_material_limit_filter~=nil,"we have a material limit effect but it does not have target function")
for _,selected_mat in ipairs(selected) do
if not append_material_limit_filter(material_limit_effect,selected_mat) then
can_include=false
break
end
end
end
end
--- include branch
if can_include then
for _,diff in ipairs(Synchro.GenerateVariantForCard(
state,mc,#selected+1,tc,prune_tuner_filter,prune_non_tuner_filter
)) do
-- apply diff
local branch_state=Synchro.ApplyVariantState(
state,mc,diff,tuner_race,prune_tuner_filter,non_tuner_race,prune_non_tuner_filter,tc,prune_level,append_material_limit_filter
)
table.insert(selected,mc)
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,selected,index+1,branch_state,prune_indexes
) then
table.remove(selected)
return true
end
table.remove(selected)
return true
end
table.remove(selected)
end
-- exclude branch
......@@ -3612,44 +3639,69 @@ function Synchro.SynTarget(tuner_race,tuner_filter,non_tuner_race,non_tuner_filt
--- use the min select level as hint
for _,state in ipairs(selected_states) do
for lvl,_ in pairs(state.possible_sums) do
if lvl < selected_level_min then
if lvl<selected_level_min then
selected_level_min=lvl
end
end
end
for _,state in ipairs(selected_states) do
for _,candidate in ipairs(cg_arr) do
local can_include=true
for _,candidate in ipairs(cg_arr) do
-- simulate adding candidate to sg_arr
local test_selection={}
for _, card in ipairs(sg_arr) do table.insert(test_selection,card) end
table.insert(test_selection,candidate)
-- build rest_candidates without candidate
local rest_candidates={}
for _, other in ipairs(cg_arr) do
if other~=candidate then
table.insert(rest_candidates,other)
--- to include one material it must fit all applied filter
if not state.material_limit_filter(nil,candidate) then
can_include=false
end
end
local base_states=Synchro.BuildStatesFromSelection(
test_selection,
tuner_race,tuner_filter,
non_tuner_race,non_tuner_filter,
base_mapper,
tc,math.huge
)
for _,init_state in ipairs(base_states) do
if Synchro.FindValidSelection(
rest_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,test_selection,init_state)
then
addable:AddCard(candidate)
break
local append_material_limit_filter=nil
if can_include==true then
--- to include one material, all selected ones must fit its material limit
local material_limit_effect=candidate:IsHasEffect(EFFECT_TUNER_MATERIAL_LIMIT)
if material_limit_effect~=nil then
append_material_limit_filter=material_limit_effect:GetTarget()
for _,selected_mat in ipairs(sg_arr) do
if not append_material_limit_filter(material_limit_effect,selected_mat) then
can_include=false
break
end
end
end
end
if can_include then
-- simulate adding candidate to sg_arr
local test_selection={}
for _, card in ipairs(sg_arr) do table.insert(test_selection,card) end
table.insert(test_selection,candidate)
-- build rest_candidates without candidate
local rest_candidates={}
for _, other in ipairs(cg_arr) do
if other~=candidate then
table.insert(rest_candidates,other)
end
end
local base_states=Synchro.BuildStatesFromSelection(
test_selection,
tuner_race,tuner_filter,
non_tuner_race,non_tuner_filter,
base_mapper,
tc,math.huge
)
for _,init_state in ipairs(base_states) do
if Synchro.FindValidSelection(
rest_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,test_selection,init_state)
then
addable:AddCard(candidate)
break
end
end
end
end
end
......@@ -3778,6 +3830,7 @@ function Synchro.BuildStatesFromSelection(selection,tuner_race,tuner_filter,non_
hand_count_limit=0,
hand_count=0,
genomix_race=nil,
material_limit_filter=aux.TRUE,
}
}
......@@ -3786,13 +3839,19 @@ function Synchro.BuildStatesFromSelection(selection,tuner_race,tuner_filter,non_
for idx,card in ipairs(selection)do
local next_states={}
local material_limit_effect=card:IsHasEffect(EFFECT_TUNER_MATERIAL_LIMIT)
local append_material_limit_filter=nil
if material_limit_effect~=nil then
append_material_limit_filter=material_limit_effect:GetTarget()
end
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
)) do
-- merge diff into full state
local new_state = Synchro.ApplyVariantState(
st,card,diff,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tc,prune_level
st,card,diff,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tc,prune_level,append_material_limit_filter
)
table.insert(next_states,new_state)
end
......@@ -3928,7 +3987,7 @@ end
-- Helper to apply a diff to a base state
function Synchro.ApplyVariantState(st,card,diff,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tc,prune_level)
function Synchro.ApplyVariantState(st,card,diff,tuner_race,tuner_filter,non_tuner_race,non_tuner_filter,tc,prune_level,append_material_limit_filter)
-- compute increments using provided filters
local tuner_inc=tuner_filter(card,tc) and 1 or 0
local non_tuner_inc=non_tuner_filter(card,tc) and 1 or 0
......@@ -3938,6 +3997,10 @@ function Synchro.ApplyVariantState(st,card,diff,tuner_race,tuner_filter,non_tune
st.level_mapper(card,tc),
prune_level
)
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)
end
return {
possible_sums=diff.possible_sums or possible_sums,
tuner_count=st.tuner_count+tuner_inc,
......@@ -3946,6 +4009,7 @@ function Synchro.ApplyVariantState(st,card,diff,tuner_race,tuner_filter,non_tune
level_mapper_priority=diff.level_mapper_priority or st.level_mapper_priority,
hand_count_limit=diff.hand_count_limit or st.hand_count_limit,
hand_count=st.hand_count+hand_inc,
genomix_race=diff.genomix_race or st.genomix_race
genomix_race=diff.genomix_race or st.genomix_race,
material_limit_filter=new_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