diff --git a/assets/elements/item/buss/bullet/buss.bullet.yaml b/assets/elements/item/buss/bullet/buss.bullet.yaml new file mode 100644 index 0000000000..31d9ebfc9a --- /dev/null +++ b/assets/elements/item/buss/bullet/buss.bullet.yaml @@ -0,0 +1,11 @@ +lifetime: 0.2 +speed: 900 +body_diameter: 15 +atlas: ./buss_bullet.atlas.yaml + +explosion_fps: 21 +explosion_frames: 3 +explosion_volume: 0.015 +explosion_lifetime: 0.140 +explosion_sound: ../explosion/bullet_hit_dull.ogg +explosion_atlas: ../explosion/explosion.atlas.yaml diff --git a/assets/elements/item/buss/bullet/buss_bullet.atlas.yaml b/assets/elements/item/buss/bullet/buss_bullet.atlas.yaml new file mode 100644 index 0000000000..9ae412cdfa --- /dev/null +++ b/assets/elements/item/buss/bullet/buss_bullet.atlas.yaml @@ -0,0 +1,4 @@ +image: ./buss_bullet.png +tile_size: [6, 6] +rows: 1 +columns: 1 diff --git a/assets/elements/item/buss/bullet/buss_bullet.png b/assets/elements/item/buss/bullet/buss_bullet.png new file mode 100644 index 0000000000..dc444106c1 Binary files /dev/null and b/assets/elements/item/buss/bullet/buss_bullet.png differ diff --git a/assets/elements/item/buss/buss.atlas.yaml b/assets/elements/item/buss/buss.atlas.yaml new file mode 100644 index 0000000000..ef604549c9 --- /dev/null +++ b/assets/elements/item/buss/buss.atlas.yaml @@ -0,0 +1,4 @@ +image: ./buss.png +tile_size: [62, 24] +rows: 1 +columns: 1 diff --git a/assets/elements/item/buss/buss.element.yaml b/assets/elements/item/buss/buss.element.yaml new file mode 100644 index 0000000000..6cfb90ad77 --- /dev/null +++ b/assets/elements/item/buss/buss.element.yaml @@ -0,0 +1,3 @@ +name: Buss +category: Weapons +data: buss.yaml diff --git a/assets/elements/item/buss/buss.png b/assets/elements/item/buss/buss.png new file mode 100644 index 0000000000..b6bef3e4e2 Binary files /dev/null and b/assets/elements/item/buss/buss.png differ diff --git a/assets/elements/item/buss/buss.yaml b/assets/elements/item/buss/buss.yaml new file mode 100644 index 0000000000..4ae0417c4b --- /dev/null +++ b/assets/elements/item/buss/buss.yaml @@ -0,0 +1,25 @@ +atlas: ./buss.atlas.yaml + +max_ammo: 2 +cooldown: 1000ms +bullet_meta: ./bullet/buss.bullet.yaml +bullet_count: 10 +bullet_spread: 0.3 + +shoot_fps: 15 +shoot_frames: 3 +shoot_lifetime: 0.3 +shoot_sound_volume: 0.2 +shoot_sound: ./shoot/shoot.ogg +empty_shoot_sound_volume: 0.1 +empty_shoot_sound: ./shoot/gun_empty.ogg +shoot_atlas: ./shoot/buss_shoot.atlas.yaml + +bounciness: 0.3 +can_rotate: true +body_size: [32, 8] +fin_anim: grab_2 +angular_velocity: 0.1 +throw_velocity: 180 +grab_offset: [7, 0] +kickback: 300 diff --git a/assets/elements/item/buss/explosion/bullet_hit_dull.ogg b/assets/elements/item/buss/explosion/bullet_hit_dull.ogg new file mode 100644 index 0000000000..572186bf98 Binary files /dev/null and b/assets/elements/item/buss/explosion/bullet_hit_dull.ogg differ diff --git a/assets/elements/item/buss/explosion/explosion.atlas.yaml b/assets/elements/item/buss/explosion/explosion.atlas.yaml new file mode 100644 index 0000000000..8740da4ed9 --- /dev/null +++ b/assets/elements/item/buss/explosion/explosion.atlas.yaml @@ -0,0 +1,4 @@ +image: ./explosion.png +tile_size: [11, 11] +rows: 1 +columns: 4 diff --git a/assets/elements/item/buss/explosion/explosion.png b/assets/elements/item/buss/explosion/explosion.png new file mode 100644 index 0000000000..f1313c3d2c Binary files /dev/null and b/assets/elements/item/buss/explosion/explosion.png differ diff --git a/assets/elements/item/buss/shoot/buss_fire.png b/assets/elements/item/buss/shoot/buss_fire.png new file mode 100644 index 0000000000..379cb8614e Binary files /dev/null and b/assets/elements/item/buss/shoot/buss_fire.png differ diff --git a/assets/elements/item/buss/shoot/buss_shoot.atlas.yaml b/assets/elements/item/buss/shoot/buss_shoot.atlas.yaml new file mode 100644 index 0000000000..bbb156dea3 --- /dev/null +++ b/assets/elements/item/buss/shoot/buss_shoot.atlas.yaml @@ -0,0 +1,4 @@ +image: ./buss_fire.png +tile_size: [25, 30] +rows: 1 +columns: 4 diff --git a/assets/elements/item/buss/shoot/gun_empty.ogg b/assets/elements/item/buss/shoot/gun_empty.ogg new file mode 100644 index 0000000000..5e4e182a59 Binary files /dev/null and b/assets/elements/item/buss/shoot/gun_empty.ogg differ diff --git a/assets/elements/item/buss/shoot/shoot.ogg b/assets/elements/item/buss/shoot/shoot.ogg new file mode 100644 index 0000000000..dd90956768 Binary files /dev/null and b/assets/elements/item/buss/shoot/shoot.ogg differ diff --git a/assets/game.yaml b/assets/game.yaml index b1f42394b7..8a8fb17206 100644 --- a/assets/game.yaml +++ b/assets/game.yaml @@ -347,6 +347,7 @@ core: - /elements/item/kick_bomb/kick_bomb.element.yaml - /elements/item/mine/mine.element.yaml - /elements/item/musket/musket.element.yaml + - /elements/item/buss/buss.element.yaml - /elements/item/stomp_boots/stomp_boots.element.yaml - /elements/item/sword/sword.element.yaml - /elements/item/sniper_rifle/sniper_rifle.element.yaml diff --git a/assets/map/levels/level_1.map.yaml b/assets/map/levels/level_1.map.yaml index 28274886af..12d9d7de3f 100644 --- a/assets/map/levels/level_1.map.yaml +++ b/assets/map/levels/level_1.map.yaml @@ -1220,7 +1220,7 @@ layers: - pos: - 536.0 - 303.0 - element: /elements/item/grenade/grenade.element.yaml + element: /elements/item/buss/buss.element.yaml - pos: - 784.0 - 495.0 diff --git a/assets/map/levels/level_11.map.yaml b/assets/map/levels/level_11.map.yaml index e8dc7d5456..0779b15f80 100644 --- a/assets/map/levels/level_11.map.yaml +++ b/assets/map/levels/level_11.map.yaml @@ -1757,7 +1757,7 @@ layers: - pos: - 464.0 - 278.5 - element: /elements/item/musket/musket.element.yaml + element: /elements/item/buss/buss.element.yaml - pos: - 548.2856 - 265.5 diff --git a/assets/map/levels/level_3.map.yaml b/assets/map/levels/level_3.map.yaml index b30b2b6797..185360ca25 100644 --- a/assets/map/levels/level_3.map.yaml +++ b/assets/map/levels/level_3.map.yaml @@ -1156,7 +1156,7 @@ layers: - pos: - 512.0 - 246.5 - element: /elements/item/musket/musket.element.yaml + element: /elements/item/buss/buss.element.yaml - pos: - 432.0 - 510.5 diff --git a/assets/map/levels/level_4.map.yaml b/assets/map/levels/level_4.map.yaml index c43c091f97..11dd96081f 100644 --- a/assets/map/levels/level_4.map.yaml +++ b/assets/map/levels/level_4.map.yaml @@ -1067,7 +1067,7 @@ layers: - pos: - 1008.0 - 118.5 - element: /elements/item/musket/musket.element.yaml + element: /elements/item/buss/buss.element.yaml - pos: - 1008.0 - 342.5 @@ -1079,7 +1079,7 @@ layers: - pos: - 112.0 - 118.5 - element: /elements/item/musket/musket.element.yaml + element: /elements/item/buss/buss.element.yaml - pos: - 112.0 - 342.5 diff --git a/assets/map/levels/level_7.map.yaml b/assets/map/levels/level_7.map.yaml index f7a5a16871..0854e757c4 100644 --- a/assets/map/levels/level_7.map.yaml +++ b/assets/map/levels/level_7.map.yaml @@ -1185,7 +1185,7 @@ layers: - pos: - 712.0 - 182.5 - element: /elements/item/musket/musket.element.yaml + element: /elements/item/buss/buss.element.yaml - pos: - 552.0 - 438.5 @@ -1197,7 +1197,7 @@ layers: - pos: - 584.0 - 310.5 - element: /elements/item/musket/musket.element.yaml + element: /elements/item/buss/buss.element.yaml - pos: - 400.0 - 374.5 diff --git a/src/core/elements.rs b/src/core/elements.rs index c6172f4435..918da3244c 100644 --- a/src/core/elements.rs +++ b/src/core/elements.rs @@ -6,6 +6,7 @@ use std::sync::Mutex; use crate::{impl_system_param, prelude::*}; +pub mod buss; pub mod crab; pub mod crate_item; pub mod decoration; @@ -28,7 +29,7 @@ pub mod urchin; pub mod prelude { pub use super::{ - crab::*, crate_item::*, decoration::*, fish_school::*, grenade::*, jellyfish::*, + buss::*, crab::*, crate_item::*, decoration::*, fish_school::*, grenade::*, jellyfish::*, kick_bomb::*, mine::*, musket::*, player_spawner::*, slippery::*, slippery_seaweed::*, snail::*, spike::*, sproinger::*, stomp_boots::*, sword::*, urchin::*, *, }; @@ -314,6 +315,7 @@ install_plugins!( kick_bomb, mine, musket, + buss, player_spawner, slippery_seaweed, slippery, diff --git a/src/core/elements/buss.rs b/src/core/elements/buss.rs new file mode 100644 index 0000000000..251bbfc0a2 --- /dev/null +++ b/src/core/elements/buss.rs @@ -0,0 +1,296 @@ +use crate::prelude::*; + +#[derive(HasSchema, Default, Debug, Clone)] +#[type_data(metadata_asset("buss"))] +#[repr(C)] +pub struct BussMeta { + pub grab_offset: Vec2, + pub fin_anim: Ustr, + + pub body_size: Vec2, + pub bounciness: f32, + pub can_rotate: bool, + pub throw_velocity: f32, + pub angular_velocity: f32, + pub atlas: Handle, + + pub max_ammo: u32, + pub cooldown: Duration, + pub bullet_count: u32, + pub bullet_spread: f32, + pub bullet_meta: Handle, + pub kickback: f32, + + pub shoot_fps: f32, + pub shoot_lifetime: f32, + pub shoot_frames: u32, + pub shoot_sound_volume: f64, + pub empty_shoot_sound_volume: f64, + pub shoot_atlas: Handle, + pub shoot_sound: Handle, + pub empty_shoot_sound: Handle, +} + +pub fn game_plugin(game: &mut Game) { + BussMeta::register_schema(); + game.init_shared_resource::(); +} + +pub fn session_plugin(session: &mut Session) { + session + .stages + .add_system_to_stage(CoreStage::PreUpdate, hydrate) + .add_system_to_stage(CoreStage::PostUpdate, update); +} + +#[derive(Clone, Debug, HasSchema, Default)] +pub struct Buss { + pub ammo: u32, + pub cooldown: Timer, +} + +fn hydrate( + game_meta: Root, + mut entities: ResMutInit, + mut hydrated: CompMut, + mut element_handles: CompMut, + assets: Res, + mut busses: CompMut, + mut atlas_sprites: CompMut, + mut bodies: CompMut, + mut transforms: CompMut, + mut items: CompMut, + mut item_throws: CompMut, + mut item_grabs: CompMut, + mut respawn_points: CompMut, + mut spawner_manager: SpawnerManager, +) { + let mut not_hydrated_bitset = hydrated.bitset().clone(); + not_hydrated_bitset.bit_not(); + not_hydrated_bitset.bit_and(element_handles.bitset()); + + let spawner_entities = entities + .iter_with_bitset(¬_hydrated_bitset) + .collect::>(); + + for spawner_ent in spawner_entities { + let transform = *transforms.get(spawner_ent).unwrap(); + let element_handle = *element_handles.get(spawner_ent).unwrap(); + let element_meta = assets.get(element_handle.0); + + if let Ok(BussMeta { + atlas, + fin_anim, + grab_offset, + max_ammo, + body_size, + can_rotate, + bounciness, + throw_velocity, + angular_velocity, + .. + }) = assets.get(element_meta.data).try_cast_ref() + { + hydrated.insert(spawner_ent, MapElementHydrated); + + let entity = entities.create(); + items.insert(entity, Item); + item_throws.insert( + entity, + ItemThrow::strength(*throw_velocity) + .with_spin(*angular_velocity) + .with_system(buss_drop(entity, *max_ammo)), + ); + item_grabs.insert( + entity, + ItemGrab { + fin_anim: *fin_anim, + sync_animation: false, + grab_offset: *grab_offset, + }, + ); + busses.insert( + entity, + Buss { + ammo: *max_ammo, + cooldown: Timer::new(Duration::from_millis(0), TimerMode::Once), + }, + ); + atlas_sprites.insert(entity, AtlasSprite::new(*atlas)); + respawn_points.insert(entity, DehydrateOutOfBounds(spawner_ent)); + transforms.insert(entity, transform); + element_handles.insert(entity, element_handle); + hydrated.insert(entity, MapElementHydrated); + bodies.insert( + entity, + KinematicBody { + shape: ColliderShape::Rectangle { size: *body_size }, + has_mass: true, + has_friction: true, + can_rotate: *can_rotate, + bounciness: *bounciness, + gravity: game_meta.core.physics.gravity, + ..default() + }, + ); + spawner_manager.create_spawner(spawner_ent, vec![entity]) + } + } +} + +fn update( + entities: Res, + mut commands: Commands, + element_handles: Comp, + assets: Res, + + mut busses: CompMut, + transforms: CompMut, + mut sprites: CompMut, + mut audio_center: ResMut, + + player_inventories: PlayerInventories, + mut items_used: CompMut, + items_dropped: CompMut, + time: Res