diff --git a/Cargo.toml b/Cargo.toml index 32e6675..9d71f8e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,8 +6,34 @@ license = "MIT OR Apache-2.0" [dependencies] bevy = "0.11" -bevy_ecs_ldtk = {version="0.8", features=["default", "derive", "atlas", "render"]} +bevy_ecs_ldtk = { version = "0.8", features = [ + "default", + "derive", + "atlas", + "render", +] } bevy-inspector-egui = "0.19" bevy_rapier2d = "0.22" rand = "0.8.5" pecs = "0.4" +# bevy_nine_slice_ui = "0.2" + +[profile.dev.package."*"] +opt-level = 3 + +[profile.dev] +opt-level = 1 + +[profile.release] +lto = true +codegen-units = 1 + +# The profile that 'cargo dist' will build with +[profile.dist] +inherits = "release" +lto = "thin" + +[features] +dev = [ + "bevy/dynamic_linking", +] \ No newline at end of file diff --git a/src/ai.rs b/src/ai.rs index 19c0cea..5f1bb37 100644 --- a/src/ai.rs +++ b/src/ai.rs @@ -20,7 +20,6 @@ pub(crate) fn mierda_activity( mierda.hit_at = None; } } - v.linvel = Vec2::new( mierda.move_direction.x * rotation_angle.cos() - mierda.move_direction.y * rotation_angle.sin(), @@ -46,7 +45,7 @@ pub(crate) fn update_mierdas_move_direction( { direction_update_timer.timer.tick(time.delta()); - if direction_update_timer.timer.finished() { + if direction_update_timer.timer.finished() || mierda.move_direction == Vec2::ZERO { let mierda_position = mierda_position.translation; mierda.move_direction = Vec2::new( player_position.x - mierda_position.x, diff --git a/src/events.rs b/src/events.rs index 61ea907..607657e 100644 --- a/src/events.rs +++ b/src/events.rs @@ -3,6 +3,8 @@ use bevy_ecs_ldtk::{LdtkLevel, LevelSelection}; use bevy_rapier2d::prelude::Velocity; use pecs::prelude::*; +use rand::Rng; + use crate::{ components::{Mierda, Player}, sprites::{AnimationDirection, CharacterAnimation, FlashingTimer}, @@ -37,10 +39,17 @@ pub fn event_spawn_mierda( level_selection: Res, level_handles: Query<(Entity, &Handle)>, level_assets: Res>, - _texture_atlasses: ResMut>, - los_mierdas: Query<(Entity, &Parent, &mut Visibility, &Mierda)>, + los_mierdas: Query<(Entity, &Parent, &Mierda)>, levels: Query<(Entity, &Handle)>, + q_player_query: Query<(Entity, &Transform, &Player)>, ) { + if q_player_query.iter().count() == 0 { + return; + } + + let mut rng = rand::thread_rng(); + let player_translation = q_player_query.single().1.translation; + for ev_spawn in ev_spawn_mierda.iter() { for (_, level_handle) in level_handles.iter() { let level = &level_assets.get(level_handle).unwrap().level; @@ -52,9 +61,7 @@ pub fn event_spawn_mierda( .unwrap(); for _i in 0..ev_spawn.count { - for (mierda_entity, mierda_parent, _mierda_visibility, mierda) in - los_mierdas.iter() - { + for (mierda_entity, mierda_parent, mierda) in los_mierdas.iter() { if !mierda.is_dummy { continue; } @@ -73,6 +80,22 @@ pub fn event_spawn_mierda( new_entity = Some(ne); }); + // generate random position + + let mut offset_position = Vec3::new(0.0, 0.0, 0.); + let mut mierda_position = player_translation + offset_position; + + while (player_translation - mierda_position).length() < 50.0 { + let x = rng.gen_range(-100.0..100.0); + let y = rng.gen_range(-100.0..100.0); + + offset_position = Vec3::new(x, y, 0.); + mierda_position = player_translation + offset_position; + } + + let transform = Transform::from_translation(mierda_position) + .with_scale(Vec3::ONE * 0.5); + let new_entity = new_entity.unwrap(); commands.entity(new_entity).insert(Mierda { is_dummy: false, @@ -85,6 +108,8 @@ pub fn event_spawn_mierda( source: mierda_entity, destination: new_entity, }); + + commands.entity(new_entity).insert(transform); } } } diff --git a/src/main.rs b/src/main.rs index 3ff7a1d..9e683e4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,9 @@ #![allow(clippy::too_many_arguments, clippy::type_complexity)] -use bevy::prelude::*; +use bevy::{input::common_conditions::input_toggle_active, prelude::*}; use bevy_ecs_ldtk::prelude::*; use bevy_inspector_egui::quick::WorldInspectorPlugin; +// use bevy_nine_slice_ui::*; use bevy_rapier2d::prelude::*; use components::Mierda; use pecs::prelude::*; @@ -28,7 +29,9 @@ fn main() { app.add_plugins(DefaultPlugins) .add_plugins(PecsPlugin) - .add_plugins(WorldInspectorPlugin::new()) + .add_plugins( + WorldInspectorPlugin::default().run_if(input_toggle_active(false, KeyCode::Escape)), + ) .add_systems(Startup, setup) // UI .add_systems(Startup, ui::draw_ui) @@ -105,7 +108,6 @@ fn main() { .add_event::(); app.run(); - // .run(); } fn setup(mut commands: Commands, asset_server: Res) { diff --git a/src/physics.rs b/src/physics.rs index 838d0de..e7806a4 100644 --- a/src/physics.rs +++ b/src/physics.rs @@ -21,14 +21,22 @@ pub(crate) fn handle_mierda_wall_collisions( pub(crate) fn handle_player_mierda_collisions( mut collision_events: EventReader, mut q_player: Query<(Entity, &mut Player)>, + q_los_mierdas: Query<(Entity, &mut Velocity, &Mierda)>, mut ev_player_hit: EventWriter, ) { for event in collision_events.iter() { for (e, _) in q_player.iter_mut() { if let CollisionEvent::Started(e1, e2, _) = event { - if e1.index() == e.index() || e2.index() == e.index() { - ev_player_hit.send(PlayerHitEvent { entity: e }); + if !(e1.index() == e.index() || e2.index() == e.index()) { + continue; + } + + let other_entity = if e1.index() == e.index() { *e2 } else { *e1 }; + if !q_los_mierdas.get(other_entity).is_ok() { + continue; } + + ev_player_hit.send(PlayerHitEvent { entity: e }); } } }