|
|
|
|
@ -1,8 +1,5 @@
|
|
|
|
|
use bevy::{
|
|
|
|
|
input::{
|
|
|
|
|
mouse::{MouseButtonInput, MouseMotion},
|
|
|
|
|
ButtonState,
|
|
|
|
|
},
|
|
|
|
|
input::{mouse::MouseButtonInput, ButtonState},
|
|
|
|
|
window::{PrimaryWindow, WindowResized},
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@ -12,7 +9,7 @@ use bevy::{
|
|
|
|
|
/// TODO: Handle Cursor!
|
|
|
|
|
///
|
|
|
|
|
use crate::{
|
|
|
|
|
game::{ActiveTile, Board, BoardIndex, Piece, Tile},
|
|
|
|
|
game::{ActiveTile, Board, BoardIndex, Piece, Side, Tile},
|
|
|
|
|
prelude::*,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
@ -48,8 +45,8 @@ impl Plugin for Display2dPlugin {
|
|
|
|
|
.run_if(any_component_removed::<game::Selected>()),
|
|
|
|
|
update_background.run_if(on_event::<WindowResized>()),
|
|
|
|
|
// PERF: Only need to run when piece2d or tile2d added
|
|
|
|
|
set_sprite,
|
|
|
|
|
set_transform,
|
|
|
|
|
set_sprite.after(game::set_side),
|
|
|
|
|
set_transform.after(game::update_board::<Piece2d>),
|
|
|
|
|
),
|
|
|
|
|
)
|
|
|
|
|
.add_systems(
|
|
|
|
|
@ -110,7 +107,7 @@ fn load_spritesheet(
|
|
|
|
|
let atlas = TextureAtlas::from_grid(
|
|
|
|
|
server.load("images/sprites.png"),
|
|
|
|
|
Vec2::new(TILE_SIZE, TILE_SIZE),
|
|
|
|
|
5,
|
|
|
|
|
8,
|
|
|
|
|
1,
|
|
|
|
|
None,
|
|
|
|
|
None,
|
|
|
|
|
@ -173,6 +170,7 @@ fn initialize_board(board: Option<Res<Board>>, mut commands: Commands) {
|
|
|
|
|
Board2d,
|
|
|
|
|
))
|
|
|
|
|
.with_children(|parent| {
|
|
|
|
|
// Spawn tiles
|
|
|
|
|
for i in 0..32 {
|
|
|
|
|
let x = i % 8;
|
|
|
|
|
let y = i / 8;
|
|
|
|
|
@ -184,12 +182,15 @@ fn initialize_board(board: Option<Res<Board>>, mut commands: Commands) {
|
|
|
|
|
parent.spawn((tile, index, Tile2d, SpriteSheetBundle { ..default() }));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
board.pieces().iter().for_each(|(piece, index)| {
|
|
|
|
|
// TODO: transform is slightly different, set sprite
|
|
|
|
|
// Spawn pieces
|
|
|
|
|
board.pieces().iter().for_each(|(index, piece)| {
|
|
|
|
|
let side = Board::side(index).expect("Spawn valid side");
|
|
|
|
|
|
|
|
|
|
parent.spawn((
|
|
|
|
|
piece.clone(),
|
|
|
|
|
Piece2d,
|
|
|
|
|
index.clone(),
|
|
|
|
|
side,
|
|
|
|
|
SpriteSheetBundle { ..default() },
|
|
|
|
|
));
|
|
|
|
|
});
|
|
|
|
|
@ -203,22 +204,28 @@ fn set_sprite(
|
|
|
|
|
&mut TextureAtlasSprite,
|
|
|
|
|
&mut Handle<TextureAtlas>,
|
|
|
|
|
Option<&Piece>,
|
|
|
|
|
Option<&Side>,
|
|
|
|
|
Option<&Tile>,
|
|
|
|
|
),
|
|
|
|
|
Or<(Added<Piece>, Added<Tile2d>)>,
|
|
|
|
|
Or<(Added<Piece>, Added<Tile2d>, Changed<Side>)>,
|
|
|
|
|
>,
|
|
|
|
|
sprite_sheet: Option<Res<SpriteSheet>>,
|
|
|
|
|
) {
|
|
|
|
|
if let Some(sprite_sheet) = sprite_sheet {
|
|
|
|
|
events
|
|
|
|
|
.iter_mut()
|
|
|
|
|
.for_each(|(mut sprite, mut texture_atlas, piece, tile)| {
|
|
|
|
|
.for_each(|(mut sprite, mut texture_atlas, piece, side, tile)| {
|
|
|
|
|
info!("Got sprite update event");
|
|
|
|
|
|
|
|
|
|
*texture_atlas = sprite_sheet.handle.clone();
|
|
|
|
|
let s = match piece {
|
|
|
|
|
Some(Piece::Queen) => 2,
|
|
|
|
|
Some(Piece::Drone) => 3,
|
|
|
|
|
Some(Piece::Pawn) => 4,
|
|
|
|
|
None => match tile {
|
|
|
|
|
let s = match (piece, side) {
|
|
|
|
|
(Some(Piece::Queen), Some(Side::A)) => 2,
|
|
|
|
|
(Some(Piece::Queen), Some(Side::B)) => 5,
|
|
|
|
|
(Some(Piece::Drone), Some(Side::A)) => 3,
|
|
|
|
|
(Some(Piece::Drone), Some(Side::B)) => 6,
|
|
|
|
|
(Some(Piece::Pawn), Some(Side::A)) => 4,
|
|
|
|
|
(Some(Piece::Pawn), Some(Side::B)) => 7,
|
|
|
|
|
_ => match tile {
|
|
|
|
|
Some(Tile::Dark) => 0,
|
|
|
|
|
Some(Tile::Light) => 1,
|
|
|
|
|
None => 99,
|
|
|
|
|
@ -244,7 +251,7 @@ fn set_transform(
|
|
|
|
|
let x = SCALE * 16.0 * ((i.x as f32) - 3.5);
|
|
|
|
|
let y = SCALE * 16.0 * ((i.y as f32) - 1.5);
|
|
|
|
|
*t = Transform::from_scale(Vec3::splat(SCALE)).with_translation(Vec3::new(x, y, 0.0));
|
|
|
|
|
info!("setting position of {:?} to {:?}", i, t);
|
|
|
|
|
debug!("setting position of {:?} to {:?}", i, t);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -379,6 +386,7 @@ fn place_piece(
|
|
|
|
|
}
|
|
|
|
|
Err(game::GameError::NullMove) => game_events.send(game::GameEvent::PlacePiece),
|
|
|
|
|
Err(game::GameError::InvalidMove) => warn!("Invalid move!"),
|
|
|
|
|
Err(game::GameError::InvalidIndex) => warn!("Invalid index!"),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@ -394,9 +402,10 @@ fn cancel_place(
|
|
|
|
|
(*button, *state) == (MouseButton::Right, ButtonState::Pressed)
|
|
|
|
|
})
|
|
|
|
|
.for_each(|_| {
|
|
|
|
|
let entity = current.single();
|
|
|
|
|
commands.entity(entity).remove::<game::Selected>();
|
|
|
|
|
writer.send(game::GameEvent::PlacePiece);
|
|
|
|
|
if let Ok(entity) = current.get_single() {
|
|
|
|
|
commands.entity(entity).remove::<game::Selected>();
|
|
|
|
|
writer.send(game::GameEvent::PlacePiece);
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|