This commit is contained in:
rendo 2026-02-01 19:07:50 +05:00
commit 952818c5be
7 changed files with 81 additions and 14 deletions

View file

@ -7,10 +7,16 @@ pub struct GridPlugin;
impl Plugin for GridPlugin { impl Plugin for GridPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_systems(Startup, setup_grid) app.add_systems(Startup, setup_grid)
.add_systems(Update, snap_grid_elements); .add_systems(Update, snap_grid_elements)
.add_observer(grid_despawn_check);
} }
} }
#[derive(EntityEvent)]
pub struct GridDespawn {
pub entity: Entity,
}
#[derive(Component)] #[derive(Component)]
pub struct Grid { pub struct Grid {
bounds: Rect, bounds: Rect,
@ -131,3 +137,21 @@ fn snap_grid_elements(
} }
} }
} }
pub fn grid_despawn_check(event: On<GridDespawn>, mut grid_query: Single<&mut Grid>) {
for i in 0..grid_query.elements.len() {
match grid_query.elements[i] {
CellState::Empty => continue,
CellState::Filled(entity) => {
if entity == event.entity {
grid_query.elements[i] = CellState::Empty
}
}
CellState::Part(entity) => {
if entity == event.entity {
grid_query.elements[i] = CellState::Empty
}
}
}
}
}

View file

@ -36,7 +36,7 @@ fn try_play(
commands.entity(music_player.entity()).insert(( commands.entity(music_player.entity()).insert((
AudioPlayer::new(soundtrack.0[random_range(0..soundtrack.0.len())].clone()), AudioPlayer::new(soundtrack.0[random_range(0..soundtrack.0.len())].clone()),
PlaybackSettings { PlaybackSettings {
volume: Volume::Linear(0.2), volume: Volume::Linear(2.0),
mode: bevy::audio::PlaybackMode::Remove, mode: bevy::audio::PlaybackMode::Remove,
..default() ..default()
}, },

View file

@ -1,8 +1,8 @@
use crate::{ use crate::{
animation::transform::AnimatedTransform, animation::transform::AnimatedTransform,
grid::Grid, grid::{Grid, grid_despawn_check},
mouse_position::MousePosition, mouse_position::MousePosition,
turns::{TurnBusy, TurnState, TurnUnit}, turns::{TurnBusy, TurnUnit},
unit::{UnitTextures, health::Health}, unit::{UnitTextures, health::Health},
}; };
use bevy::prelude::*; use bevy::prelude::*;
@ -23,7 +23,7 @@ pub fn spawn_doh(
Health::new(10), Health::new(10),
Transform::from_xyz(mouse_position.position.x, mouse_position.position.y, 1.), Transform::from_xyz(mouse_position.position.x, mouse_position.position.y, 1.),
AnimatedTransform::from_xyz(mouse_position.position.x, mouse_position.position.y, 1.), AnimatedTransform::from_xyz(mouse_position.position.x, mouse_position.position.y, 1.),
TurnUnit, //TurnUnit,
)) ))
.id(); .id();
grid.try_set(mouse_position.position.truncate(), doh); grid.try_set(mouse_position.position.truncate(), doh);

View file

@ -1,8 +1,8 @@
use crate::{ use crate::{
animation::transform::AnimatedTransform, animation::transform::AnimatedTransform,
grid::Grid, grid::{Grid, grid_despawn_check},
mouse_position::MousePosition, mouse_position::MousePosition,
turns::{TurnBusy, TurnState, TurnUnit}, turns::{TurnBusy, TurnUnit},
unit::{UnitTextures, health::Health}, unit::{UnitTextures, health::Health},
}; };
use bevy::prelude::*; use bevy::prelude::*;
@ -28,3 +28,24 @@ pub fn spawn_fosma(
.id(); .id();
grid.try_set(mouse_position.position.truncate(), fosma); grid.try_set(mouse_position.position.truncate(), fosma);
} }
pub fn fosma_action(
mut commands: Commands,
grid: Single<&Grid>,
fosma_query: Query<(Entity, &Transform), (With<Fosma>, With<TurnBusy>)>,
mut health_query: Query<&mut Health>,
) {
for (entity, transform) in fosma_query {
let Some(unit) =
grid.get_entity_in_direction(transform.translation.truncate(), Vec2::new(1., 0.))
else {
commands.entity(entity).remove::<TurnBusy>();
return;
};
if let Ok(mut health) = health_query.get_mut(unit) {
health.damage(10);
}
commands.entity(entity).remove::<TurnBusy>();
}
}

View file

@ -1,13 +1,28 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::grid::GridDespawn;
#[derive(Component)] #[derive(Component)]
pub struct Health { pub struct Health {
pub max_hp: u32, pub max_hp: i32,
pub hp: u32, pub hp: i32,
} }
impl Health { impl Health {
pub fn new(max_hp: u32) -> Self { pub fn new(max_hp: i32) -> Self {
Self { max_hp, hp: max_hp } Self { max_hp, hp: max_hp }
} }
pub fn damage(&mut self, damage: i32) {
self.hp -= damage;
}
}
pub fn health_despawn_system(mut commands: Commands, query: Query<(Entity, &Health)>) {
for (entity, health) in query {
if health.hp <= 0 {
commands.trigger(GridDespawn { entity });
commands.entity(entity).despawn();
}
}
} }

View file

@ -1,5 +1,10 @@
use bevy::prelude::*; use bevy::prelude::*;
use crate::{
turns::TurnState,
unit::{fosma::fosma_action, health::health_despawn_system},
};
pub mod doh; pub mod doh;
pub mod fosma; pub mod fosma;
pub mod health; pub mod health;
@ -8,7 +13,9 @@ pub mod zlosma;
pub struct UnitPlugin; pub struct UnitPlugin;
impl Plugin for UnitPlugin { impl Plugin for UnitPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_systems(Startup, unit_setup); app.add_systems(Startup, unit_setup)
.add_systems(OnEnter(TurnState::Turn), health_despawn_system)
.add_systems(Update, fosma_action);
} }
} }

View file

@ -1,8 +1,8 @@
use crate::{ use crate::{
animation::transform::AnimatedTransform, animation::transform::AnimatedTransform,
grid::Grid, grid::{Grid, grid_despawn_check},
mouse_position::MousePosition, mouse_position::MousePosition,
turns::{TurnBusy, TurnState, TurnUnit}, turns::{TurnBusy, TurnUnit},
unit::{UnitTextures, health::Health}, unit::{UnitTextures, health::Health},
}; };
use bevy::prelude::*; use bevy::prelude::*;
@ -23,7 +23,7 @@ pub fn spawn_zlosma(
Health::new(10), Health::new(10),
Transform::from_xyz(mouse_position.position.x, mouse_position.position.y, 1.), Transform::from_xyz(mouse_position.position.x, mouse_position.position.y, 1.),
AnimatedTransform::from_xyz(mouse_position.position.x, mouse_position.position.y, 1.), AnimatedTransform::from_xyz(mouse_position.position.x, mouse_position.position.y, 1.),
TurnUnit, //TurnUnit,
)) ))
.id(); .id();
grid.try_set(mouse_position.position.truncate(), zlosma); grid.try_set(mouse_position.position.truncate(), zlosma);