diff --git a/src/play.rs b/src/play.rs index 9288897..f3f25d2 100644 --- a/src/play.rs +++ b/src/play.rs @@ -6,7 +6,8 @@ pub struct PlayPlugin; impl Plugin for PlayPlugin { fn build(&self, app: &mut App) { - app.add_systems(OnEnter(GameState::Play), serve_cards) + app.add_observer(serve_new_cards) + .add_systems(OnEnter(GameState::Play), serve_cards) .add_systems(Update, rotate_cards); } } @@ -64,21 +65,28 @@ pub(crate) fn reset_rotation( /// Check a set when the "Set" button is clicked pub(crate) fn check_set( _trigger: Trigger>, - query: Query<(&Card, Entity), With>, + mut query: Query<(Entity, &Card, &mut Visibility, &mut Transform), With>, mut commands: Commands, ) { let mut cards = query.iter(); if cards.len() == 3 { - let ((a, _), (b, _), (c, _)) = ( + let ((_, a, _, _), (_, b, _, _), (_, c, _, _)) = ( cards.next().unwrap(), cards.next().unwrap(), cards.next().unwrap(), ); if is_set((a, b, c)) { - query.iter().for_each(|(_, e)| { - // TODO: Figure out something better to do than despawning! - commands.entity(e).despawn_recursive(); - }); + query + .iter_mut() + .for_each(|(entity, _, mut visibility, mut transform)| { + *visibility = Visibility::Hidden; + *transform = Transform::default(); + let set_number = 1; + commands + .entity(entity) + .remove::() + .insert(SetNumber(set_number)); + }); } } else if cards.len() > 3 { info!("Too many cards!") @@ -116,7 +124,39 @@ fn serve_cards( ) { let mut target = (cards.iter().len() - 1) as u8; // Iterate over every x, y play location - for this_x in 0..=2 { + for this_x in 0..=3 { + for this_y in 0..=3 { + // If this spot does not have a card + if spots + .iter() + .find(|PlayLocation { x, y }| *x == (this_x as u8) && *y == (this_y as u8)) + .is_none() + { + if let Some((e, _)) = cards.iter().find(|(_, deck_order)| deck_order.0 == target) { + // Set the selected card to this play location and remove from the deck + commands + .entity(e) + .remove::() + .insert(PlayLocation { + x: this_x, + y: this_y, + }); + target = target - 1; + } + } + } + } +} + +fn serve_new_cards( + _trigger: Trigger, + cards: Query<(Entity, &DeckOrder)>, + spots: Query<&PlayLocation>, + mut commands: Commands, +) { + let mut target = (cards.iter().len() - 1) as u8; + // Iterate over every x, y play location + for this_x in 0..=3 { for this_y in 0..=3 { // If this spot does not have a card if spots @@ -150,7 +190,7 @@ pub(crate) fn place_card( // Set it's transform based on it's placement let CARD_SIZE = [100.0, 160.0]; - let offset = Vec2::new(CARD_SIZE[0] * 3.0, CARD_SIZE[1] * 4.0) / 2.0; + let offset = Vec2::new(CARD_SIZE[0] * 4.0, CARD_SIZE[1] * 4.0) / 2.5; transform.translation = Vec3::new( ((*x as f32) * CARD_SIZE[0]) - offset.x, ((*y as f32) * CARD_SIZE[1]) - offset.y, diff --git a/src/setup.rs b/src/setup.rs index 4c35b12..99cc4df 100644 --- a/src/setup.rs +++ b/src/setup.rs @@ -20,27 +20,25 @@ impl Plugin for SetupPlugin { /// Setup drawing our cards on the screen pub(crate) fn setup_cards(mut commands: Commands, deck: Res) { - Deck::iter_shuffled() - .enumerate() - .for_each(|(i, this_card)| { - let this = deck - .cards - .get(&this_card) - .unwrap_or_else(|| panic!("fech card sprite {:?}", this_card)) - .clone(); - let this_sprite = Sprite { - custom_size: Some(Vec2::new(80.0, 128.0)), - ..this - }; - let order = play::DeckOrder(i as u8); - commands - .spawn((this_sprite, this_card, order, Visibility::Hidden)) - .observe(play::place_card) - .observe(debug::set_debug_card) - .observe(debug::hide_debug_card) - .observe(play::reset_rotation) - .observe(play::toggle_selected); - }); + Deck::iter_cards().enumerate().for_each(|(i, this_card)| { + let this = deck + .cards + .get(&this_card) + .unwrap_or_else(|| panic!("fech card sprite {:?}", this_card)) + .clone(); + let this_sprite = Sprite { + custom_size: Some(Vec2::new(80.0, 128.0)), + ..this + }; + let order = play::DeckOrder(i as u8); + commands + .spawn((this_sprite, this_card, order, Visibility::Hidden)) + .observe(play::place_card) + .observe(debug::set_debug_card) + .observe(debug::hide_debug_card) + .observe(play::reset_rotation) + .observe(play::toggle_selected); + }); } /// Setup our camera to view cardson the screen