From c9cf364c13579ef1dfaaa1833b5982acd9890519 Mon Sep 17 00:00:00 2001 From: "Elijah C. Voigt" Date: Sun, 10 Mar 2024 11:40:43 -0700 Subject: [PATCH] Saving my place before making a big change Going to try simplifying the piece updating logic into one method --- src/audio.rs | 4 +- src/display3d.rs | 120 ++++++++++++----------------------------------- src/game.rs | 26 +++++----- src/menu.rs | 39 +++++++++++++++ src/prelude.rs | 17 ++----- 5 files changed, 88 insertions(+), 118 deletions(-) diff --git a/src/audio.rs b/src/audio.rs index 2ff97cc..5088256 100644 --- a/src/audio.rs +++ b/src/audio.rs @@ -143,7 +143,5 @@ fn toggle_volume(mut vol: ResMut) { } fn control_volume(vol: Res, query: Query<&AudioSource>) { - query - .iter() - .for_each(|aud_src| aud_src.set_volume(vol.0)); + query.iter().for_each(|aud_src| aud_src.set_volume(vol.0)); } diff --git a/src/display3d.rs b/src/display3d.rs index a52bda0..51268d0 100644 --- a/src/display3d.rs +++ b/src/display3d.rs @@ -24,34 +24,30 @@ impl Plugin for Display3dPlugin { .run_if(in_state(GameState::Loading)) .run_if(on_event::>()), hydrate_camera.run_if(any_component_added::()), - set_piece_model.run_if(any_component_added::()), - set_piece_model.run_if(any_component_changed::()), - set_board_model.run_if(any_component_added::()), - set_board_model.run_if(any_component_added::()), - set_valid_move_model.run_if(any_component_added::()), - set_tile_hitbox.run_if(any_component_added::()), - set_piece_position.run_if(any_component_changed::()), + update_tweaks + .run_if(on_event::>()) + .run_if(resource_exists::), + switch_sides + .run_if(in_state(GameState::Play)) + .run_if(state_changed::), + set_piece_model + .run_if(any_component_added::().or_else(any_component_changed::())), set_piece_texture - .run_if(any_component_changed::()) + .run_if(any_component_changed::().or_else(any_component_added::())) .run_if(resource_exists::), + set_piece_position.run_if(any_component_changed::()), + set_board_model.run_if( + any_component_added::() + .or_else(any_component_added::()) + ), + set_valid_move_model.run_if(any_component_added::()), + set_tile_hitbox.run_if(any_component_added::()), select .run_if(in_state(GameState::Play)) .run_if(in_state(DisplayState::Display3d)) .run_if(on_event::()), pick_up.run_if(any_component_added::()), put_down.run_if(any_component_removed::()), - switch_sides - .run_if(in_state(GameState::Play)) - .run_if(state_changed::), - update_tweaks - .run_if(on_event::>()) - .run_if(resource_exists::), - scale_lighting.run_if( - any_component_added::() - .or_else(any_component_added::()) - .or_else(any_component_added::()) - .or_else(on_event::>()), - ), setup_capture_piece.run_if(any_component_changed::>()), capture_piece.run_if(any_with_component::), skip_animation @@ -560,12 +556,11 @@ fn mouse_zoom( /// PERF: We are saving what to work on in a Vector which is bad. /// CAVEAT: We are only exeucting this when a piece changes or state is changed. fn set_piece_texture( - events: Query< + query: Query< (Entity, &Piece, &Side), ( With, With, - Or<(Changed, Added)>, ), >, gltfs: Res>, @@ -574,7 +569,7 @@ fn set_piece_texture( tweaks: Res>, tweaks_file: Res, ) { - events.iter().for_each(|(entity, piece, side)| { + query.iter().for_each(|(entity, piece, side)| { debug!("Checking piece texture for {:?}", entity); let tweak = tweaks.get(tweaks_file.handle.clone()).unwrap(); let assets_handle = tweak @@ -757,14 +752,17 @@ fn select( .filter(|ev| ev.state == ButtonState::Pressed) .for_each(|_| { windows.iter().for_each(|window| { - if let Some(pos) = window.cursor_position() { cameras.iter().for_each(|(camera, gt)| { - if let Some(ray) = camera.viewport_to_world(gt, pos) { query + if let Some(pos) = window.cursor_position() { + cameras.iter().for_each(|(camera, gt)| { + if let Some(ray) = camera.viewport_to_world(gt, pos) { + query .iter() .filter_map(|(entity, handle, gt)| { meshes.get(handle).map(|mesh| (entity, mesh, gt)) }) .for_each(|(entity, mesh, gt)| { - if let Some(_hit) = hit::intersects3d(&ray, mesh, gt) { selectable + if let Some(_hit) = hit::intersects3d(&ray, mesh, gt) { + selectable .iter() .find_map(|(e, &board_index, &side)| { // Check the side of the selection if no piece is selected @@ -789,11 +787,13 @@ fn select( .iter() .for_each(|&board_index| { info!("Board index selected: {:?}", board_index); - selections - .send(game::Selection(board_index)); - }); } - }); } - }); } + selections.send(game::Selection(board_index)); + }); + } + }); + } + }); + } }); }); } @@ -1042,64 +1042,6 @@ fn switch_sides( }); } -fn scale_lighting( - mut directional: Query<( - Entity, - &mut DirectionalLight, - Option<&Original>, - )>, - mut spot: Query<(Entity, &mut SpotLight, Option<&Original>)>, - mut point: Query<(Entity, &mut PointLight, Option<&Original>)>, - mut commands: Commands, - tweaks: Res>, - tweaks_file: Res, -) { - let tweak = tweaks - .get(tweaks_file.handle.clone()) - .expect("Load tweakfile"); - - let directional_tweak = tweak - .get::("display3d_lights_scaling_directional") - .expect("Directional lighting scalar"); - directional - .iter_mut() - .for_each(|(entity, mut val, original)| { - debug!("Scaling directional light {:?}", entity); - if let Some(Original(v)) = original { - val.illuminance = v.illuminance * directional_tweak; - } else { - commands.entity(entity).insert(Original(val.clone())); - val.illuminance *= directional_tweak; - } - }); - - let spot_tweak = tweak - .get::("display3d_lights_scaling_spot") - .expect("Spot lighting scalar"); - spot.iter_mut().for_each(|(entity, mut val, original)| { - debug!("Scaling spot light {:?}", entity); - if let Some(Original(v)) = original { - val.intensity = v.intensity * spot_tweak; - } else { - commands.entity(entity).insert(Original(*val)); - val.intensity *= spot_tweak; - } - }); - - let point_tweak = tweak - .get::("display3d_lights_scaling_point") - .expect("Point lighting scalar"); - point.iter_mut().for_each(|(entity, mut val, original)| { - debug!("Scaling point light {:?}", entity); - if let Some(Original(v)) = original { - val.intensity = v.intensity * point_tweak; - } else { - commands.entity(entity).insert(Original(*val)); - val.intensity *= point_tweak; - } - }); -} - pub(super) mod tweaks { use super::*; diff --git a/src/game.rs b/src/game.rs index c3fec04..8e95f49 100644 --- a/src/game.rs +++ b/src/game.rs @@ -27,7 +27,7 @@ impl Plugin for GamePlugin { hide_valid_moves.run_if(any_component_removed::()), manage_score.run_if(any_component_added::()), check_endgame.run_if(resource_changed::), - reset_game.run_if(just_pressed(KeyCode::KeyR)), + reset_game.run_if(in_state(GameState::Restart)), ), ) .add_systems(OnEnter(GameState::Endgame), set_endgame.after(manage_score)) @@ -321,9 +321,10 @@ impl Board { .iter() .enumerate() .flat_map(|(y, nested)| { - nested.iter().enumerate().filter_map(move |(x, p)| { - p.as_ref().map(|val| (BoardIndex { x, y }, *val)) - }) + nested + .iter() + .enumerate() + .filter_map(move |(x, p)| p.as_ref().map(|val| (BoardIndex { x, y }, *val))) }) .collect() } @@ -660,8 +661,8 @@ fn set_endgame( .with_children(|parent| { parent .spawn(( - menu::ButtonAction(GameState::Restart), - menu::ButtonAction(menu::MenuState::Off), + ButtonAction(GameState::Restart), + ButtonAction(MenuState::Off), ButtonBundle { style: Style { padding: UiRect::all(Val::Px(5.0)), @@ -699,8 +700,8 @@ fn set_endgame( // Quit button parent .spawn(( - menu::ButtonAction(menu::MenuState::Off), - menu::ButtonAction(GameState::Quit), + ButtonAction(MenuState::Off), + ButtonAction(GameState::Quit), ButtonBundle { style: Style { padding: UiRect::all(Val::Px(5.0)), @@ -936,10 +937,7 @@ fn reset_game( .iter() .zip(board.pieces().iter()) .for_each(|(e, (i, p))| { - commands - .entity(e) - .insert((*i, *p)) - .remove::(); + commands.entity(e).insert((*i, *p)).remove::(); }); } @@ -948,6 +946,6 @@ fn handle_quit(mut app_exit_events: EventWriter) { app_exit_events.send(AppExit); } -fn handle_restart() { - todo!("Restart is not implemented yet!"); +fn handle_restart(mut game_state: ResMut>) { + game_state.set(GameState::Play); } diff --git a/src/menu.rs b/src/menu.rs index be49028..02dccdc 100644 --- a/src/menu.rs +++ b/src/menu.rs @@ -118,6 +118,45 @@ fn init_play_menu( }); }); + // Restart button + parent + .spawn(( + ButtonAction(GameState::Restart), + ButtonAction(MenuState::Off), + ButtonBundle { + style: Style { + padding: UiRect::all(Val::Px(5.0)), + margin: UiRect::all(Val::Px(5.0)), + ..default() + }, + image: UiImage { + texture: button_handle.clone(), + ..default() + }, + ..default() + }, + )) + .with_children(|parent| { + parent.spawn(TextBundle { + text: Text { + sections: vec![TextSection { + value: "R e s t a r t".into(), + style: TextStyle { + color: Color::WHITE, + font_size: 16.0, + font: font_handle.clone(), + }, + }], + ..default() + }, + style: Style { + margin: UiRect::all(Val::Px(20.0)), + ..default() + }, + ..default() + }); + }); + // Tutorial button parent .spawn(( diff --git a/src/prelude.rs b/src/prelude.rs index 2d6f34a..5bd87c5 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -1,4 +1,5 @@ -pub(crate) use crate::{audio::AudioEvent, game::*, tutorial::*, tweak::*, *}; +pub(crate) use crate::{audio::AudioEvent, game::*, menu::*, tutorial::*, tweak::*, *}; + pub(crate) use bevy::{ animation::RepeatAnimation, app::AppExit, @@ -13,20 +14,12 @@ pub(crate) use bevy::{ }, diagnostic::*, gltf::Gltf, - input::{ - keyboard::KeyboardInput, - mouse::*, - ButtonState, - }, + input::{keyboard::KeyboardInput, mouse::*, ButtonState}, pbr::*, prelude::*, reflect::TypePath, - render::{ - mesh::*, - render_resource::*, - view::*, - }, - utils::{hashbrown::hash_map::Iter, HashMap, HashSet, BoxedFuture}, + render::{mesh::*, render_resource::*, view::*}, + utils::{hashbrown::hash_map::Iter, BoxedFuture, HashMap, HashSet}, window::PrimaryWindow, winit::WinitWindows, };