From e6093b3fcbf387b99a5634bd93632f51f3403fb4 Mon Sep 17 00:00:00 2001 From: Elijah Voigt Date: Tue, 28 Oct 2025 16:26:25 -0700 Subject: [PATCH] Very rough swap mechanic --- src/bin/tetris/main.rs | 64 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/src/bin/tetris/main.rs b/src/bin/tetris/main.rs index c0c23b0..045b95c 100644 --- a/src/bin/tetris/main.rs +++ b/src/bin/tetris/main.rs @@ -24,6 +24,7 @@ fn main() { }) .init_state::() .init_resource::() + .init_resource::() .init_resource::() .add_systems(Startup, (init_world, init_debug_ui, init_ui)) // Input and basic systems @@ -49,7 +50,6 @@ fn main() { update_shape_blocks .run_if(any_component_added::.or(any_component_changed::)).after(update_position), deactivate_shape.run_if(any_component_removed::).after(update_shape_blocks), - check_line_removal, // Clearing lines systems clear_line.run_if(any_component_changed::), adjust_block_lines @@ -62,6 +62,7 @@ fn main() { Update, ( sync_resource_to_ui::.run_if(resource_changed::), + sync_resource_to_ui::.run_if(resource_changed::), sync_resource_to_ui::.run_if(resource_changed::), sync_singleton_to_ui::.run_if(any_component_changed::), ), @@ -238,6 +239,18 @@ impl Display for ShapesBuffer { } } +#[derive(Resource, Debug, Default)] +struct ShapeStore(Option); + +impl Display for ShapeStore { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self.0 { + Some(inner) => write!(f, "{}", inner.as_ascii()), + None => write!(f, "---") + } + } +} + fn init_world( mut commands: Commands, mut meshes: ResMut>, @@ -279,6 +292,16 @@ fn init_ui(mut commands: Commands) { parent.spawn(Text::new("Next:")); parent.spawn((Text::new("???"), SyncResource::::default())); }); + parent + .spawn((Node { + flex_direction: FlexDirection::Column, + align_items: AlignItems::Center, + ..default() + },)) + .with_children(|parent| { + parent.spawn(Text::new("Swap:")); + parent.spawn((Text::new("???"), SyncResource::::default())); + }); parent .spawn((Node { flex_direction: FlexDirection::Column, @@ -589,9 +612,12 @@ fn kb_input( KeyCode::ArrowRight => { commands.entity(e).trigger(Movement::Right); } - KeyCode::Space => { + KeyCode::Enter => { commands.entity(e).trigger(Movement::Skip); } + KeyCode::Space => { + commands.entity(e).trigger(Swap); + } KeyCode::Escape => next.set(match curr.get() { GameState::Falling => GameState::Pause, GameState::Pause => GameState::Falling, @@ -650,7 +676,8 @@ fn add_piece(mut commands: Commands, mut shapes: ResMut) { GridPosition { y: Y_MAX - this_shape.height(), ..default() }, this_shape, )) - .observe(movement); + .observe(movement) + .observe(swap); } /// When a line reaches 10 blocks, clear it @@ -727,6 +754,11 @@ fn adjust_block_lines( }); } +/// Swap the current piece out +#[derive(Event, Copy, Clone, PartialEq)] +struct Swap; + +/// Movement events triggered on the piece #[derive(Event, Copy, Clone, PartialEq)] enum Movement { Down, @@ -816,15 +848,29 @@ fn movement( } } -fn check_line_removal( - mut events: RemovedComponents, +fn swap( + trigger: Trigger, + mut shapes: Query<&mut Shape>, + mut store: ResMut, + mut commands: Commands, ) { - events.read().for_each(|e| { - info!("Line entity {:?} removed", e); - }); + info!("Swap called"); + match store.0.as_mut() { + None => { + // Copy current shape into store + // De-activate entity + store.0 = Some(*shapes.get(trigger.target()).unwrap()); + commands.entity(trigger.target()).despawn_related::().despawn(); + } + Some(inner) => { + // Copy current shape into store + // Copy old shape into entity + let mut curr = shapes.get_mut(trigger.target()).unwrap(); + std::mem::swap(&mut (*inner), &mut (*curr)); + } + } } -// TODO: Just despawn? fn deactivate_shape( mut events: RemovedComponents, grid_positions: Query<&GridPosition>,