diff --git a/src/play.rs b/src/play.rs index b914d91..a6cc659 100644 --- a/src/play.rs +++ b/src/play.rs @@ -1,7 +1,4 @@ -use bevy::{ - animation::{AnimationTarget, AnimationTargetId}, - prelude::*, -}; +use bevy::{prelude::*, utils::RandomState}; use crate::{deck::Card, menu::UiMessage, setup::AnimationStore, GameState}; @@ -12,7 +9,8 @@ impl Plugin for PlayPlugin { app.add_event::() .add_observer(serve_cards) .add_systems(OnEnter(GameState::Main), deal_cards) - .add_systems(Update, deal_cards.run_if(set_added)); + .add_systems(Update, deal_cards.run_if(set_added)) + .add_systems(Update, delayed_animation); } } @@ -40,35 +38,37 @@ pub(crate) fn toggle_selected( trigger: Trigger>, mut commands: Commands, selections: Query<&Selected>, - mut query: Query<(&Name, &mut AnimationPlayer)>, - store: Res, ) { commands.trigger(UiMessage("".into())); let e = trigger.entity(); - let (g, ai) = store.store.get("rotate".into()).unwrap(); - let (n, mut ap) = query.get_mut(e).unwrap(); - ap.stop_all(); if selections.contains(e) { commands.entity(e).remove::(); } else { - ap.play(ai.clone()).repeat(); - commands.entity(e).insert(( - Selected, - g.clone(), - AnimationTarget { - id: AnimationTargetId::from_name(n), - player: e, - }, - )); + commands.entity(e).insert(Selected); } } -/// Observer system for resetting rotation when a card is de-selected -pub(crate) fn reset_rotation( +pub(crate) fn play_selected_animation( + trigger: Trigger, + mut query: Query<&mut AnimationPlayer>, + store: Res, + mut commands: Commands, +) { + let e = trigger.entity(); + info!("Play selected animation {:?}", e); + let (g, ai) = store.store.get("rotate".into()).unwrap(); + commands.entity(e).insert(g.clone()); + query.get_mut(e).unwrap().play(ai.clone()).repeat(); +} + +pub(crate) fn stop_selected_animation( trigger: Trigger, - mut transforms: Query<&mut Transform>, + mut query: Query<(&mut Transform, &mut AnimationPlayer)>, ) { - let mut t = transforms.get_mut(trigger.entity()).unwrap(); + let e = trigger.entity(); + info!("Stop selected animation {:?}", e); + let (mut t, mut ap) = query.get_mut(e).unwrap(); + ap.stop_all(); t.rotation = Quat::default(); } @@ -223,6 +223,12 @@ fn set_added(query: Query>) -> bool { !query.is_empty() } +#[derive(Component)] +struct DelayedAnimation { + graph: AnimationGraphHandle, + delay: Timer, +} + /// When a card is added to the board, place it on the screen pub(crate) fn place_card( trigger: Trigger, @@ -235,6 +241,7 @@ pub(crate) fn place_card( )>, animation_store: Res, mut commands: Commands, + random_state: Local, ) { let (entity, play_location, mut visibility, name, mut player) = query.get_mut(trigger.entity()).unwrap(); @@ -246,18 +253,35 @@ pub(crate) fn place_card( player.play(animation_index.clone()); - commands.entity(entity).insert(( - graph_handle.clone(), - AnimationTarget { - id: AnimationTargetId::from_name(name), - player: entity, - }, - )); + let delay = ((random_state.hash_one(entity) % 9) as f32 / 10.0) + 0.1; + info!("Delay: {:?}", delay); + commands.entity(entity).insert((DelayedAnimation { + graph: graph_handle.clone(), + delay: Timer::from_seconds(delay, TimerMode::Once), + },)); // Set it to visible *visibility = Visibility::Inherited; } +fn delayed_animation( + mut query: Query<(Entity, &mut DelayedAnimation)>, + mut commands: Commands, + time: Res