From f8ce9b41b2eca58bdb006308784677baab867fae Mon Sep 17 00:00:00 2001 From: Elijah Voigt Date: Tue, 10 Dec 2024 23:10:29 -0800 Subject: [PATCH] I believe this is a more robust solution to the set helper --- src/play.rs | 76 +++++++++++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 37 deletions(-) diff --git a/src/play.rs b/src/play.rs index fa9f2d2..d3595ef 100644 --- a/src/play.rs +++ b/src/play.rs @@ -64,7 +64,7 @@ pub(crate) fn reset_rotation( /// Check a set when the "Set" button is clicked pub(crate) fn check_set( - trigger: Trigger>, + _trigger: Trigger>, mut query: Query<(Entity, &Card, &mut Visibility, &mut Transform), With>, mut commands: Commands, ) { @@ -205,47 +205,49 @@ pub(crate) fn check_for_sets( _trigger: Trigger>, cards: Query<(Entity, &Card), With>, selected: Query>, - mut help_set: Local>, mut commands: Commands, ) { - match *help_set { - None => { - *help_set = cards - .iter_combinations() - .find_map(|[(ea, ca), (eb, cb), (ec, cc)]| { - (is_set((ca, cb, cc))).then_some((ea, eb, ec)) - }); - } - Some((a, b, c)) => { - if cards.get_many([a, b, c]).is_err() { - *help_set = cards - .iter_combinations() - .find_map(|[(ea, ca), (eb, cb), (ec, cc)]| { - (is_set((ca, cb, cc))).then_some((ea, eb, ec)) - }); + cards + // Iterate over all combinations of cards on the board + .iter_combinations() + // Only find combinations including currently selected cards + .filter(|[(ea, _ca), (eb, _cb), (ec, _cc)]| { + // If selected is empty, proceed + match selected.iter().len() { + 0 => true, + 1 | 2 | 3 => { + let a = selected.contains(*ea); + let b = selected.contains(*eb); + let c = selected.contains(*ec); + match selected.iter().len() { + 1 => a || b || c, + 2 => a && b || b && c || a && c, + 3 => a && b && c, + _ => panic!("WTF?"), + } + } + _ => panic!("Impossible!"), } - } - } - - // TODO: Check if help_set cards are all still on board, if not set to None - - help_set.iter().for_each(|(a, b, c)| { - match ( - selected.contains(*a), - selected.contains(*b), - selected.contains(*c), - ) { - (false, false, false) => { - commands.entity(*a).insert(Selected); + }) + // return the first valid set + .find_map(|[(ea, ca), (eb, cb), (ec, cc)]| { + if is_set((ca, cb, cc)) { + info!("\n\t{}\n\t{}\n\t{}", ca, cb, cc); + Some((ea, eb, ec)) + } else { + None } - (true, false, false) => { + }) + .iter() + .for_each(|(a, b, c)| { + if !selected.contains(*a) { + commands.entity(*a).insert(Selected); + } else if !selected.contains(*b) { commands.entity(*b).insert(Selected); - } - (true, true, false) => { + } else if !selected.contains(*c) { commands.entity(*c).insert(Selected); + } else { + info!("I cannot hold your hand further..."); } - (true, true, true) => info!("I can't hold your hand any further."), - _ => panic!("How???"), - } - }); + }); }