diff --git a/src/display2d.rs b/src/display2d.rs index b3d9b2b..1596e61 100644 --- a/src/display2d.rs +++ b/src/display2d.rs @@ -17,12 +17,6 @@ pub(crate) struct Display2dPlugin; impl Plugin for Display2dPlugin { fn build(&self, app: &mut App) { app.add_systems(Startup, (initialize_camera, set_background)) - .add_systems( - Update, - load_spritesheet - .run_if(on_event::>()) - .run_if(in_state(GameState::Loading)), - ) .add_systems(OnExit(GameState::Loading), initialize_board) .add_systems( Update, @@ -41,10 +35,12 @@ impl Plugin for Display2dPlugin { set_transform .after(game::update_board) .run_if(any_component_changed::), - set_piece_sprite - .run_if(any_component_changed::) - .after(game::set_side), - set_tile_sprite.run_if(any_component_added::), + sync_sprite.run_if(any_component_changed::), + load_spritesheet.run_if(on_event::>()), + // Set Sprite for Pieces + set_sprite.run_if(any_component_changed::), + // When tweakfile is updated + set_sprite.run_if(resource_exists_and_changed::()), ), ) .add_systems(OnEnter(DisplayState::Display2d), activate::) @@ -131,9 +127,7 @@ fn load_spritesheet( ) { info!("Loading spritesheet"); let handle: Handle = server.load("martian.tweak.toml"); - info!("Handle: {:?}", handle); let tweak = tweaks.get(&handle).expect("Load tweakfiles"); - info!("Tweak: {:?}", tweak); let atlas = TextureAtlas::from_grid( server.load(tweak.display2d.sprites.file.clone()), Vec2::new( @@ -145,7 +139,6 @@ fn load_spritesheet( None, None, ); - info!("Atlas: {:?}", atlas); commands.insert_resource(SpriteSheet { handle: texture_atlases.add(atlas), }); @@ -224,7 +217,7 @@ fn initialize_board(board: Option>, mut commands: Commands) { board.pieces().iter().for_each(|(index, piece)| { let side = Board::side(*index).expect("Spawn valid side"); - let game_sprite: GameSprite = (*piece, side.clone()).into(); + let game_sprite: GameSprite = (*piece, side).into(); parent.spawn(( game_sprite, @@ -240,44 +233,22 @@ fn initialize_board(board: Option>, mut commands: Commands) { } } -fn set_piece_sprite( - mut events: Query< - ( - &mut TextureAtlasSprite, - &mut Handle, - &GameSprite, - ), - (With, Or<(Added, Changed)>), - >, - sprite_sheet: Option>, - tweaks: Res>, - server: Res, -) { - let handle: Handle = server.load("martian.tweak.toml"); - let tweak = tweaks - .get(&handle) - .expect("Load tweaksfile in set piece sprite"); - let sprite_sheet = sprite_sheet.expect("Sprite sheet"); +fn sync_sprite(mut events: Query<(&mut GameSprite, &Piece, &Side), Changed>) { events .iter_mut() - .for_each(|(mut sprite, mut texture_atlas, game_sprite)| { - if let Some(index) = tweak.display2d.sprites.locate(game_sprite) { - if *texture_atlas != sprite_sheet.handle { - *texture_atlas = sprite_sheet.handle.clone(); - } - sprite.index = index; - } + .for_each(|(mut game_sprite, piece, side)| { + *game_sprite = (*piece, *side).into(); }); } -fn set_tile_sprite( - mut events: Query< +fn set_sprite( + mut entities: Query< ( &mut TextureAtlasSprite, &mut Handle, &GameSprite, ), - (Added, With), + With, >, sprite_sheet: Option>, tweaks: Res>, @@ -286,14 +257,16 @@ fn set_tile_sprite( let handle: Handle = server.load("martian.tweak.toml"); let tweak = tweaks .get(&handle) - .expect("Load tweaksfile in set tile sprite"); + .expect("Load tweaksfile in set piece sprite"); let sprite_sheet = sprite_sheet.expect("Sprite sheet"); - events + entities .iter_mut() .for_each(|(mut sprite, mut texture_atlas, game_sprite)| { if let Some(index) = tweak.display2d.sprites.locate(game_sprite) { - *texture_atlas = sprite_sheet.handle.clone(); - *sprite = TextureAtlasSprite::new(index); + if *texture_atlas != sprite_sheet.handle { + *texture_atlas = sprite_sheet.handle.clone(); + } + sprite.index = index; } }); } diff --git a/src/game.rs b/src/game.rs index 3642370..14595b3 100644 --- a/src/game.rs +++ b/src/game.rs @@ -136,7 +136,7 @@ pub(crate) struct BoardIndex { pub y: usize, } -#[derive(Debug, Component, PartialEq, Clone)] +#[derive(Debug, Component, PartialEq, Clone, Copy)] pub(crate) enum Side { A, B,