From 2d4e4b9bfaa65da58bfbe3f54ca8b743a38a164a Mon Sep 17 00:00:00 2001 From: eri Date: Sun, 21 Jul 2024 16:46:11 +0200 Subject: [PATCH] feat: final fixes --- src/enemy.rs | 59 ++++++++++++++++++++++++++++++++++++++--- src/player.rs | 1 - src/tilemap.rs | 10 +++---- src/ui/menu/mappings.rs | 17 +++++++----- 4 files changed, 69 insertions(+), 18 deletions(-) diff --git a/src/enemy.rs b/src/enemy.rs index 34865c2..efa0b9f 100644 --- a/src/enemy.rs +++ b/src/enemy.rs @@ -1,10 +1,12 @@ +use std::f32::consts::PI; + use bevy::prelude::*; #[cfg(feature = "persist")] pub use bevy_persistent::prelude::Persistent; use rand::Rng; use crate::{ - assets::{SoundAssets, ATLAS_SIZE}, + assets::{CoreAssets, SoundAssets, ATLAS_SIZE}, data::{attack, max_battery, SaveData}, misc::{dir_to_vec, Direction, MoveTo, MIN_TURN_TIMER}, player::Player, @@ -45,7 +47,7 @@ impl Plugin for EnemyPlugin { Update, ( on_damage.in_set(PlaySet::Events), - enemy_flash.in_set(PlaySet::Animation), + (damage_text, enemy_flash).in_set(PlaySet::Animation), ), ); } @@ -105,6 +107,9 @@ struct EnemyTurn(Timer); #[derive(Component)] struct EnemyFlash(Timer); +#[derive(Component)] +struct DamageText(Timer, Vec2); + // ······ // Events // ······ @@ -123,6 +128,7 @@ fn on_damage( mut damage_reader: EventReader, mut save_data: ResMut>, mut next_play_state: ResMut>, + assets: Res, ) { for DamageEvent(entity) in damage_reader.read() { cmd.entity(*entity) @@ -142,7 +148,7 @@ fn on_damage( .clamp(0, max_battery(save_data.battery_level)); } - enemy.health -= match enemy.elem { + let value = match enemy.elem { Element::Basic => match save_data.attack_selected { Element::Basic => attack(save_data.attack_level), Element::Fire => { @@ -249,6 +255,29 @@ fn on_damage( }, }, }; + + let value = value.clamp(0., enemy.health); + enemy.health -= value; + + cmd.spawn(( + Text2dBundle { + text: Text::from_section( + if value > 0. { format!("{:.1}", value) } else { "X".into() }, + TextStyle { + font: assets.font.clone(), + font_size: 10., + color: enemy_color(&save_data.attack_selected).lighter(0.1), + }, + ), + transform: Transform::from_translation(tile_to_pos(enemy.pos).extend(15.)), + ..default() + }, + DamageText( + Timer::from_seconds(0.3, TimerMode::Once), + tile_to_pos(enemy.pos), + ), + )); + if enemy.health <= 0. { cmd.entity(*entity).despawn(); let mut rng = rand::thread_rng(); @@ -386,6 +415,30 @@ fn update_enemies( } } +fn damage_text( + mut cmd: Commands, + mut text: Query<( + Entity, + &mut Transform, + &mut Text, + &mut DamageText, + )>, + time: Res