From 6d4c717beefc6c357d6ac8e152634e0c25afc601 Mon Sep 17 00:00:00 2001 From: Jacob LeCoq Date: Tue, 17 Jan 2023 17:12:59 -0600 Subject: [PATCH 1/3] feat: add kick_bomb to jumpy core --- .../item/kick_bomb/kick_bomb.element.yaml | 4 +- assets/map/levels/level1.map.yaml | 4 +- core/src/elements.rs | 2 + core/src/elements/kick_bomb.rs | 357 ++++++++++++++++++ core/src/metadata/element.rs | 8 +- 5 files changed, 368 insertions(+), 7 deletions(-) create mode 100644 core/src/elements/kick_bomb.rs diff --git a/assets/elements/item/kick_bomb/kick_bomb.element.yaml b/assets/elements/item/kick_bomb/kick_bomb.element.yaml index 6f652c55cf..203ca4f3bb 100644 --- a/assets/elements/item/kick_bomb/kick_bomb.element.yaml +++ b/assets/elements/item/kick_bomb/kick_bomb.element.yaml @@ -13,7 +13,9 @@ builtin: !KickBomb explosion_frames: 12 explosion_fps: 8 explosion_sound: ./explosion.ogg + explosion_volume: 0.1 + fuse_sound_volume: 0.1 fuse_sound: ./fuse.ogg body_size: [30, 30] @@ -22,4 +24,4 @@ builtin: !KickBomb can_rotate: true bounciness: 0.6 angular_velocity: 0.1 - arm_delay: 0.02 + arm_delay: 0.02 \ No newline at end of file diff --git a/assets/map/levels/level1.map.yaml b/assets/map/levels/level1.map.yaml index 43bdffd27a..6399824e58 100644 --- a/assets/map/levels/level1.map.yaml +++ b/assets/map/levels/level1.map.yaml @@ -1268,8 +1268,8 @@ layers: - 593.5 element: /elements/item/sword/sword.element.yaml - pos: - - 171.5714 - - 409.5 + - 536.0 + - 309.5 element: /elements/item/kick_bomb/kick_bomb.element.yaml - id: spawners kind: !element diff --git a/core/src/elements.rs b/core/src/elements.rs index 057bb00fb5..d70cf04ea6 100644 --- a/core/src/elements.rs +++ b/core/src/elements.rs @@ -3,6 +3,7 @@ use crate::prelude::*; pub mod crab; pub mod decoration; pub mod grenade; +pub mod kick_bomb; pub mod player_spawner; pub mod sproinger; pub mod sword; @@ -24,4 +25,5 @@ pub fn install(session: &mut GameSession) { sword::install(session); grenade::install(session); crab::install(session); + kick_bomb::install(session); } diff --git a/core/src/elements/kick_bomb.rs b/core/src/elements/kick_bomb.rs new file mode 100644 index 0000000000..9c2bdba595 --- /dev/null +++ b/core/src/elements/kick_bomb.rs @@ -0,0 +1,357 @@ +use crate::prelude::*; + +pub fn install(session: &mut GameSession) { + session + .stages + .add_system_to_stage(CoreStage::PreUpdate, hydrate) + .add_system_to_stage(CoreStage::PostUpdate, update_lit_kick_bombs) + .add_system_to_stage(CoreStage::PostUpdate, update_idle_kick_bombs); +} + +#[derive(Clone, TypeUlid, Debug, Copy)] +#[ulid = "01GQ0ZWBNA8HZRXYKZXCT05CXT"] +pub struct IdleKickBomb { + spawner: Entity, +} + +#[derive(Clone, TypeUlid, Debug, Copy)] +#[ulid = "01GQ0ZWFYZSHJPESPY9QPSTARR"] +pub struct LitKickBomb { + age: f32, + spawner: Entity, +} + +fn hydrate( + mut items: CompMut, + mut entities: ResMut, + mut bodies: CompMut, + mut transforms: CompMut, + mut idle_bombs: CompMut, + mut atlas_sprites: CompMut, + element_assets: BevyAssets, + mut hydrated: CompMut, + mut element_handles: CompMut, + mut animated_sprites: CompMut, + mut respawn_points: CompMut, +) { + let mut not_hydrated_bitset = hydrated.bitset().clone(); + not_hydrated_bitset.bit_not(); + not_hydrated_bitset.bit_and(element_handles.bitset()); + + let spawners = entities + .iter_with_bitset(¬_hydrated_bitset) + .collect::>(); + + for spawner_ent in spawners { + let transform = *transforms.get(spawner_ent).unwrap(); + let element_handle = element_handles.get(spawner_ent).unwrap(); + let Some(element_meta) = element_assets.get(&element_handle.get_bevy_handle()) else { + continue; + }; + + if let BuiltinElementKind::KickBomb { + atlas, + body_size, + body_offset, + can_rotate, + bounciness, + .. + } = &element_meta.builtin + { + hydrated.insert(spawner_ent, MapElementHydrated); + + let entity = entities.create(); + items.insert(entity, Item); + idle_bombs.insert( + entity, + IdleKickBomb { + spawner: spawner_ent, + }, + ); + atlas_sprites.insert(entity, AtlasSprite::new(atlas.clone())); + respawn_points.insert(entity, MapRespawnPoint(transform.translation)); + transforms.insert(entity, transform); + element_handles.insert(entity, element_handle.clone()); + hydrated.insert(entity, MapElementHydrated); + animated_sprites.insert(entity, default()); + bodies.insert( + entity, + KinematicBody { + size: *body_size, + offset: *body_offset, + gravity: 1.0, + has_mass: true, + has_friction: true, + can_rotate: *can_rotate, + bounciness: *bounciness, + ..default() + }, + ); + } + } +} + +fn update_idle_kick_bombs( + entities: Res, + mut commands: Commands, + mut sprites: CompMut, + player_inventories: PlayerInventories, + mut bodies: CompMut, + mut items_used: CompMut, + mut transforms: CompMut, + mut audio_events: ResMut, + element_handles: Comp, + mut idle_bombs: CompMut, + element_assets: BevyAssets, + mut items_dropped: CompMut, + mut animated_sprites: CompMut, +) { + for (entity, (kick_bomb, element_handle)) in + entities.iter_with((&mut idle_bombs, &element_handles)) + { + let spawner = kick_bomb.spawner; + let Some(element_meta) = element_assets.get(&element_handle.get_bevy_handle()) else { + continue; + }; + + let BuiltinElementKind::KickBomb { + grab_offset, + angular_velocity, + fuse_sound, + fuse_sound_volume, + throw_velocity, + .. + } = &element_meta.builtin else { + unreachable!(); + }; + + // If the item is being held + if let Some(inventory) = player_inventories + .iter() + .find_map(|x| x.filter(|x| x.inventory == entity)) + { + let player = inventory.player; + let body = bodies.get_mut(entity).unwrap(); + + // Deactivate held items + body.is_deactivated = true; + + // Flip the sprite to match the player orientation + let flip = sprites.get(player).unwrap().flip_x; + let sprite = sprites.get_mut(entity).unwrap(); + sprite.flip_x = flip; + let flip_factor = if flip { -1.0 } else { 1.0 }; + + let player_translation = transforms.get(player).unwrap().translation; + let transform = transforms.get_mut(entity).unwrap(); + let offset = Vec3::new(grab_offset.x * flip_factor, grab_offset.y, 1.0); + transform.translation = player_translation + offset; + transform.rotation = Quat::IDENTITY; + + // If the item is being used + let item_used = items_used.get(entity).is_some(); + if item_used { + audio_events.play(fuse_sound.clone(), *fuse_sound_volume); + items_used.remove(entity); + let animated_sprite = animated_sprites.get_mut(entity).unwrap(); + animated_sprite.start = 3; + animated_sprite.end = 5; + animated_sprite.repeat = true; + animated_sprite.fps = 8.0; + body.angular_velocity = *angular_velocity; + commands.add( + move |mut idle: CompMut, mut lit: CompMut| { + idle.remove(entity); + lit.insert(entity, LitKickBomb { spawner, age: 0.0 }); + }, + ); + } + } + + // If the item was dropped + if let Some(dropped) = items_dropped.get(entity).copied() { + let player = dropped.player; + + items_dropped.remove(entity); + let player_translation = transforms.get(dropped.player).unwrap().translation; + let player_velocity = bodies.get(player).unwrap().velocity; + + let body = bodies.get_mut(entity).unwrap(); + let sprite = sprites.get_mut(entity).unwrap(); + + // Re-activate physics + body.is_deactivated = false; + + let horizontal_flip_factor = if sprite.flip_x { + Vec2::new(-1.0, 1.0) + } else { + Vec2::ONE + }; + body.velocity = *throw_velocity * horizontal_flip_factor + player_velocity; + body.angular_velocity = *angular_velocity * if sprite.flip_x { -1.0 } else { 1.0 }; + + body.is_spawning = true; + + let transform = transforms.get_mut(entity).unwrap(); + transform.translation = player_translation; + } + } +} + +fn update_lit_kick_bombs( + entities: Res, + element_handles: Comp, + element_assets: BevyAssets, + mut audio_events: ResMut, + mut transforms: CompMut, + mut lit_grenades: CompMut, + mut sprites: CompMut, + mut bodies: CompMut, + mut items_dropped: CompMut, + mut hydrated: CompMut, + player_inventories: PlayerInventories, + mut commands: Commands, +) { + for (entity, (kick_bomb, element_handle)) in + entities.iter_with((&mut lit_grenades, &element_handles)) + { + let Some(element_meta) = element_assets.get(&element_handle.get_bevy_handle()) else { + continue; + }; + + let BuiltinElementKind::KickBomb { + grab_offset, + angular_velocity, + explosion_sound, + explosion_volume, + throw_velocity, + fuse_time, + damage_region_lifetime, + damage_region_size, + explosion_lifetime, + explosion_atlas, + explosion_fps, + explosion_frames, + .. + } = &element_meta.builtin else { + unreachable!(); + }; + + kick_bomb.age += 1.0 / crate::FPS; + let spawner = kick_bomb.spawner; + + // If the item is being held + if let Some(inventory) = player_inventories + .iter() + .find_map(|x| x.filter(|x| x.inventory == entity)) + { + let player = inventory.player; + let body = bodies.get_mut(entity).unwrap(); + + // Deactivate held items + body.is_deactivated = true; + + // Flip the sprite to match the player orientation + let flip = sprites.get(player).unwrap().flip_x; + let sprite = sprites.get_mut(entity).unwrap(); + sprite.flip_x = flip; + let flip_factor = if flip { -1.0 } else { 1.0 }; + + let player_translation = transforms.get(player).unwrap().translation; + let transform = transforms.get_mut(entity).unwrap(); + let offset = Vec3::new(grab_offset.x * flip_factor, grab_offset.y, 1.0); + transform.translation = player_translation + offset; + transform.rotation = Quat::IDENTITY; + } + + // If the item was dropped + if let Some(dropped) = items_dropped.get(entity).copied() { + let player = dropped.player; + + items_dropped.remove(entity); + let player_translation = transforms.get(dropped.player).unwrap().translation; + let player_velocity = bodies.get(player).unwrap().velocity; + + let body = bodies.get_mut(entity).unwrap(); + let sprite = sprites.get_mut(entity).unwrap(); + + // Re-activate physics + body.is_deactivated = false; + + let horizontal_flip_factor = if sprite.flip_x { + Vec2::new(-1.0, 1.0) + } else { + Vec2::ONE + }; + body.velocity = *throw_velocity * horizontal_flip_factor + player_velocity; + body.angular_velocity = *angular_velocity * if sprite.flip_x { -1.0 } else { 1.0 }; + + body.is_spawning = true; + + let transform = transforms.get_mut(entity).unwrap(); + transform.translation = player_translation; + } + + // If it's time to explode + if kick_bomb.age >= *fuse_time { + audio_events.play(explosion_sound.clone(), *explosion_volume); + + // Cause the item to respawn by un-hydrating it's spawner. + hydrated.remove(spawner); + let mut explosion_transform = *transforms.get(entity).unwrap(); + explosion_transform.translation.z += 1.0; + + // Clone types for move into closure + let damage_region_size = *damage_region_size; + let damage_region_lifetime = *damage_region_lifetime; + let explosion_lifetime = *explosion_lifetime; + let explosion_atlas = explosion_atlas.clone(); + let explosion_fps = *explosion_fps; + let explosion_frames = *explosion_frames; + commands.add( + move |mut entities: ResMut, + mut transforms: CompMut, + mut damage_regions: CompMut, + mut lifetimes: CompMut, + mut sprites: CompMut, + mut animated_sprites: CompMut| { + // Despawn the kick bomb + entities.kill(entity); + + // Spawn the damage region + let ent = entities.create(); + transforms.insert(ent, explosion_transform); + damage_regions.insert( + ent, + DamageRegion { + size: damage_region_size, + }, + ); + lifetimes.insert(ent, Lifetime::new(damage_region_lifetime)); + + // Spawn the explosion animation + let ent = entities.create(); + transforms.insert(ent, explosion_transform); + sprites.insert( + ent, + AtlasSprite { + atlas: explosion_atlas.clone(), + ..default() + }, + ); + animated_sprites.insert( + ent, + AnimatedSprite { + start: 0, + end: explosion_frames, + fps: explosion_fps, + repeat: false, + ..default() + }, + ); + lifetimes.insert(ent, Lifetime::new(explosion_lifetime)); + }, + ); + } + } +} diff --git a/core/src/metadata/element.rs b/core/src/metadata/element.rs index bc31af8677..b1828892f1 100644 --- a/core/src/metadata/element.rs +++ b/core/src/metadata/element.rs @@ -166,10 +166,10 @@ pub enum BuiltinElementKind { explosion_lifetime: f32, explosion_frames: usize, explosion_fps: f32, - explosion_sound: String, - #[serde(skip)] - explosion_sound_handle: Handle, - fuse_sound: String, + explosion_sound: Handle, + explosion_volume: f32, + fuse_sound: Handle, + fuse_sound_volume: f32, #[serde(skip)] fuse_sound_handle: Handle, /// The time in seconds before a grenade explodes From c4f982718c94be27acd34dfbe6b944794fa46f9c Mon Sep 17 00:00:00 2001 From: Jacob LeCoq Date: Wed, 18 Jan 2023 12:25:49 -0600 Subject: [PATCH 2/3] fix: kick bomb is now kickable --- .../item/kick_bomb/kick_bomb.element.yaml | 3 +- core/src/elements/kick_bomb.rs | 39 ++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/assets/elements/item/kick_bomb/kick_bomb.element.yaml b/assets/elements/item/kick_bomb/kick_bomb.element.yaml index 203ca4f3bb..311f4fd4cd 100644 --- a/assets/elements/item/kick_bomb/kick_bomb.element.yaml +++ b/assets/elements/item/kick_bomb/kick_bomb.element.yaml @@ -24,4 +24,5 @@ builtin: !KickBomb can_rotate: true bounciness: 0.6 angular_velocity: 0.1 - arm_delay: 0.02 \ No newline at end of file + # arm_delay: 0.02 + arm_delay: 0.5 \ No newline at end of file diff --git a/core/src/elements/kick_bomb.rs b/core/src/elements/kick_bomb.rs index 9c2bdba595..df6a341e0f 100644 --- a/core/src/elements/kick_bomb.rs +++ b/core/src/elements/kick_bomb.rs @@ -202,6 +202,9 @@ fn update_lit_kick_bombs( entities: Res, element_handles: Comp, element_assets: BevyAssets, + + collision_world: CollisionWorld, + player_indexes: Comp, mut audio_events: ResMut, mut transforms: CompMut, mut lit_grenades: CompMut, @@ -210,6 +213,7 @@ fn update_lit_kick_bombs( mut items_dropped: CompMut, mut hydrated: CompMut, player_inventories: PlayerInventories, + mut commands: Commands, ) { for (entity, (kick_bomb, element_handle)) in @@ -232,6 +236,7 @@ fn update_lit_kick_bombs( explosion_atlas, explosion_fps, explosion_frames, + arm_delay, .. } = &element_meta.builtin else { unreachable!(); @@ -240,6 +245,7 @@ fn update_lit_kick_bombs( kick_bomb.age += 1.0 / crate::FPS; let spawner = kick_bomb.spawner; + let mut should_explode = false; // If the item is being held if let Some(inventory) = player_inventories .iter() @@ -263,6 +269,37 @@ fn update_lit_kick_bombs( transform.translation = player_translation + offset; transform.rotation = Quat::IDENTITY; } + // The item is on the ground + else { + if let Some(player_entity) = collision_world + .actor_collisions(entity) + .into_iter() + .find(|&x| player_indexes.contains(x)) + { + let body = bodies.get_mut(entity).unwrap(); + let translation = transforms.get_mut(entity).unwrap().translation; + + let player_sprite = sprites.get_mut(player_entity).unwrap(); + let player_translation = transforms.get(player_entity).unwrap().translation; + + let player_standing_left = player_translation.x <= translation.x; + + if body.velocity.x == 0.0 { + body.velocity = *throw_velocity; + if player_sprite.flip_x { + body.velocity.x *= -1.0; + } + } else if player_standing_left && !player_sprite.flip_x { + body.velocity.x = throw_velocity.x; + body.velocity.y = throw_velocity.y; + } else if !player_standing_left && player_sprite.flip_x { + body.velocity.x = -throw_velocity.x; + body.velocity.y = throw_velocity.y; + } else if kick_bomb.age >= *arm_delay { + should_explode = true; + } + } + } // If the item was dropped if let Some(dropped) = items_dropped.get(entity).copied() { @@ -293,7 +330,7 @@ fn update_lit_kick_bombs( } // If it's time to explode - if kick_bomb.age >= *fuse_time { + if kick_bomb.age >= *fuse_time || should_explode { audio_events.play(explosion_sound.clone(), *explosion_volume); // Cause the item to respawn by un-hydrating it's spawner. From de9b563869c874321e51c3a5a275c1e3089869e7 Mon Sep 17 00:00:00 2001 From: Jacob LeCoq Date: Wed, 18 Jan 2023 19:43:31 -0600 Subject: [PATCH 3/3] fix: clippy warnings; add kick_bomb to different location --- Cargo.toml | 111 +++++++++++++----------------- assets/map/levels/level1.map.yaml | 4 +- core/Cargo.toml | 28 ++++---- core/src/elements/kick_bomb.rs | 52 +++++++------- 4 files changed, 89 insertions(+), 106 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 62caa7e362..0136341602 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,80 +1,67 @@ [package] -name = "jumpy" -version = "0.5.1" -description = "A tactical 2D shooter" -authors = ["The Fish Fight Game & Spicy Lobster Developers"] -license = "MIT OR Apache-2.0" -edition = "2021" +authors = ["The Fish Fight Game & Spicy Lobster Developers"] default-run = "jumpy" +description = "A tactical 2D shooter" +edition = "2021" +license = "MIT OR Apache-2.0" +name = "jumpy" +version = "0.5.1" [workspace] -members = [ - ".", - "core", -] +members = [".", "core"] [features] default = ["render"] -render = [ - "bevy/x11", - "bevy/png", - "bevy/filesystem_watcher", - "bevy/bevy_gilrs", -] +render = ["bevy/x11", "bevy/png", "bevy/filesystem_watcher", "bevy/bevy_gilrs"] [dependencies] -anyhow = "1.0.58" -async-channel = "1.7.1" -base64 = "0.21.0" -bevy-inspector-egui = { version = "0.17.0" } -bevy_egui = "0.19.0" -bevy_fluent = "0.5.0" -bevy_framepace = "0.11.0" -bevy_kira_audio = { version = "0.13.0", features = ["ogg"], default-features = false } -bevy_prototype_lyon = "0.7.2" -bevy_tweening = { version = "0.6.0", default-features = false } -bones_bevy_asset = "0.1.0" -bones_bevy_renderer = "0.1.0" -bones_lib = { version = "0.1.0", features = ["bevy"] } -bytemuck = "1.12.3" -clap = { version = "4.0.18", features = ["derive", "env"] } -directories = "4.0.1" -egui_extras = "0.20.0" -either = "1.8.0" -fluent = "0.16.0" -fluent_content = "0.0.3" -fnv = "1.0.7" -futures-lite = "1.12.0" -getrandom = { version = "0.2", features = ["js"] } -iyes_loopless = "0.9.1" -jumpy_core = { path = "./core" } +anyhow = "1.0.58" +async-channel = "1.7.1" +base64 = "0.21.0" +bevy-inspector-egui = { version = "0.17.0" } +bevy_egui = "0.19.0" +bevy_fluent = "0.5.0" +bevy_framepace = "0.11.0" +bevy_kira_audio = { version = "0.13.0", features = ["ogg"], default-features = false } +bevy_prototype_lyon = "0.7.2" +bevy_tweening = { version = "0.6.0", default-features = false } +bones_bevy_asset = "0.1.0" +bones_bevy_renderer = "0.1.0" +bones_lib = { version = "0.1.0", features = ["bevy"] } +bytemuck = "1.12.3" +clap = { version = "4.0.18", features = ["derive", "env"] } +directories = "4.0.1" +egui_extras = "0.20.0" +either = "1.8.0" +fluent = "0.16.0" +fluent_content = "0.0.3" +fnv = "1.0.7" +futures-lite = "1.12.0" +getrandom = { version = "0.2", features = ["js"] } +iyes_loopless = "0.9.1" +jumpy_core = { path = "./core" } leafwing-input-manager = { version = "0.8.0", default-features = false } -log = { version = "0.4.17", features = ["release_max_level_debug"] } -normalize-path = "0.2.0" -once_cell = "1.17.0" -rand = "0.8.5" -serde = { version = "1.0.137", features = ["derive"] } -serde_json = "1.0.89" -serde_yaml = "0.9.2" -thiserror = "1.0.31" -tracing = { version = "0.1.37", features = ["release_max_level_debug"] } -type_ulid = "0.1.0" -unic-langid = "0.9.0" +log = { version = "0.4.17", features = ["release_max_level_debug"] } +normalize-path = "0.2.0" +once_cell = "1.17.0" +rand = "0.8.5" +serde = { version = "1.0.137", features = ["derive"] } +serde_json = "1.0.89" +serde_yaml = "0.9.2" +thiserror = "1.0.31" +tracing = { version = "0.1.37", features = ["release_max_level_debug"] } +type_ulid = "0.1.0" +unic-langid = "0.9.0" [dependencies.bevy] -version = "0.9.1" default-features = false -features = [ - "x11", - "png", - "filesystem_watcher", - "bevy_gilrs" -] +features = ["x11", "png", "filesystem_watcher", "bevy_gilrs"] +version = "0.9.1" [target.'cfg(target_arch = "wasm32")'.dependencies] wasm-bindgen = "0.2.83" -web-sys = { version = "0.3", features = ["Window","Location","Storage"] } +web-sys = { version = "0.3", features = ["Window", "Location", "Storage"] } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] mimalloc = { version = "0.1.32", default-features = false } @@ -83,5 +70,5 @@ mimalloc = { version = "0.1.32", default-features = false } opt-level = 3 # Set this to 3 if the game becomes slow to respond during gameplay [profile.release] -lto = true -codegen-units = 1 # Improved rapier physics perf, so it might help other stuff, too +codegen-units = 1 # Improved rapier physics perf, so it might help other stuff, too +lto = true diff --git a/assets/map/levels/level1.map.yaml b/assets/map/levels/level1.map.yaml index 6399824e58..ba35cc4b96 100644 --- a/assets/map/levels/level1.map.yaml +++ b/assets/map/levels/level1.map.yaml @@ -1268,8 +1268,8 @@ layers: - 593.5 element: /elements/item/sword/sword.element.yaml - pos: - - 536.0 - - 309.5 + - 370.0 + - 350.5 element: /elements/item/kick_bomb/kick_bomb.element.yaml - id: spawners kind: !element diff --git a/core/Cargo.toml b/core/Cargo.toml index b1b165269e..412b651fd5 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -1,27 +1,25 @@ [package] -name = "jumpy_core" -version = "0.1.0" edition = "2021" +name = "jumpy_core" +version = "0.1.0" [dependencies] bones_bevy_asset = "0.1.0" -bones_lib = { version = "0.1.0", features = ["serde"] } -type_ulid = "0.1.0" +bones_lib = { version = "0.1.0", features = ["serde"] } +type_ulid = "0.1.0" -bytemuck = { version = "1.12.3", features = ["derive"] } -glam = { version = "0.22.0", features = ["bytemuck"] } -serde = { version = "1.0.152", features = ["derive"] } -tracing = "0.1.37" -hex = "0.4.3" +bytemuck = { version = "1.12.3", features = ["derive"] } csscolorparser = "0.6.2" +glam = { version = "0.22.0", features = ["bytemuck"] } +hex = "0.4.3" +serde = { version = "1.0.152", features = ["derive"] } +tracing = "0.1.37" [dependencies.bevy] -version = "0.9.0" default-features = false -features = [ - "bevy_asset" -] +features = ["bevy_asset"] +version = "0.9.0" [dependencies.turborand] -version = "0.8" -features = ["atomic"] \ No newline at end of file +features = ["atomic"] +version = "0.8" diff --git a/core/src/elements/kick_bomb.rs b/core/src/elements/kick_bomb.rs index df6a341e0f..bc88b8a831 100644 --- a/core/src/elements/kick_bomb.rs +++ b/core/src/elements/kick_bomb.rs @@ -270,34 +270,32 @@ fn update_lit_kick_bombs( transform.rotation = Quat::IDENTITY; } // The item is on the ground - else { - if let Some(player_entity) = collision_world - .actor_collisions(entity) - .into_iter() - .find(|&x| player_indexes.contains(x)) - { - let body = bodies.get_mut(entity).unwrap(); - let translation = transforms.get_mut(entity).unwrap().translation; - - let player_sprite = sprites.get_mut(player_entity).unwrap(); - let player_translation = transforms.get(player_entity).unwrap().translation; - - let player_standing_left = player_translation.x <= translation.x; - - if body.velocity.x == 0.0 { - body.velocity = *throw_velocity; - if player_sprite.flip_x { - body.velocity.x *= -1.0; - } - } else if player_standing_left && !player_sprite.flip_x { - body.velocity.x = throw_velocity.x; - body.velocity.y = throw_velocity.y; - } else if !player_standing_left && player_sprite.flip_x { - body.velocity.x = -throw_velocity.x; - body.velocity.y = throw_velocity.y; - } else if kick_bomb.age >= *arm_delay { - should_explode = true; + else if let Some(player_entity) = collision_world + .actor_collisions(entity) + .into_iter() + .find(|&x| player_indexes.contains(x)) + { + let body = bodies.get_mut(entity).unwrap(); + let translation = transforms.get_mut(entity).unwrap().translation; + + let player_sprite = sprites.get_mut(player_entity).unwrap(); + let player_translation = transforms.get(player_entity).unwrap().translation; + + let player_standing_left = player_translation.x <= translation.x; + + if body.velocity.x == 0.0 { + body.velocity = *throw_velocity; + if player_sprite.flip_x { + body.velocity.x *= -1.0; } + } else if player_standing_left && !player_sprite.flip_x { + body.velocity.x = throw_velocity.x; + body.velocity.y = throw_velocity.y; + } else if !player_standing_left && player_sprite.flip_x { + body.velocity.x = -throw_velocity.x; + body.velocity.y = throw_velocity.y; + } else if kick_bomb.age >= *arm_delay { + should_explode = true; } }