diff --git a/Cargo.toml b/Cargo.toml index 545384bb..4161438d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -5,7 +5,7 @@ edition = "2021" [dependencies] bevy = "0.7.0" -bevy_rapier2d = {version = "0.14.1", features = ["simd-stable"] } +bevy_rapier2d = { version = "0.14.1", features = ["simd-stable"] } bevy-inspector-egui = "0.11.0" serde = "1.0.127" ron = "0.6.4" @@ -13,6 +13,11 @@ rand = "0.8.4" strum = "0.21.0" strum_macros = "0.21" console_error_panic_hook = "0.1.7" +bevy_kira_audio = { version = "0.10.0", features = ["mp3", "wav"] } + +# bevy_framespace currently does not support wasm +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +bevy_framepace = "0.4.0" # optimize dev packages as we don't need them in debug version [profile.dev.package."*"] diff --git a/assets/sounds/barrier_bounce.wav b/assets/sounds/barrier_bounce.wav new file mode 100644 index 00000000..7eb5c054 Binary files /dev/null and b/assets/sounds/barrier_bounce.wav differ diff --git a/assets/sounds/collision.wav b/assets/sounds/collision.wav new file mode 100644 index 00000000..90ed04e3 Binary files /dev/null and b/assets/sounds/collision.wav differ diff --git a/assets/sounds/consumable_pickup.wav b/assets/sounds/consumable_pickup.wav new file mode 100644 index 00000000..802e6a6e Binary files /dev/null and b/assets/sounds/consumable_pickup.wav differ diff --git a/assets/sounds/defense_damage.wav b/assets/sounds/defense_damage.wav new file mode 100644 index 00000000..2f454eb8 Binary files /dev/null and b/assets/sounds/defense_damage.wav differ diff --git a/assets/sounds/defense_heal.wav b/assets/sounds/defense_heal.wav new file mode 100644 index 00000000..a3ccbec0 Binary files /dev/null and b/assets/sounds/defense_heal.wav differ diff --git a/assets/sounds/deflector_soundtrack.mp3 b/assets/sounds/deflector_soundtrack.mp3 new file mode 100644 index 00000000..1d411eb7 Binary files /dev/null and b/assets/sounds/deflector_soundtrack.mp3 differ diff --git a/assets/sounds/enemy_fire_blast.wav b/assets/sounds/enemy_fire_blast.wav new file mode 100644 index 00000000..829761e0 Binary files /dev/null and b/assets/sounds/enemy_fire_blast.wav differ diff --git a/assets/sounds/menu_input_success.wav b/assets/sounds/menu_input_success.wav new file mode 100644 index 00000000..d29deea9 Binary files /dev/null and b/assets/sounds/menu_input_success.wav differ diff --git a/assets/sounds/mob_explosion.wav b/assets/sounds/mob_explosion.wav new file mode 100644 index 00000000..cc2351f4 Binary files /dev/null and b/assets/sounds/mob_explosion.wav differ diff --git a/assets/sounds/mob_hit.wav b/assets/sounds/mob_hit.wav new file mode 100644 index 00000000..5d21cf9b Binary files /dev/null and b/assets/sounds/mob_hit.wav differ diff --git a/assets/sounds/player_explosion.wav b/assets/sounds/player_explosion.wav new file mode 100644 index 00000000..100252f2 Binary files /dev/null and b/assets/sounds/player_explosion.wav differ diff --git a/assets/sounds/player_fire_blast.wav b/assets/sounds/player_fire_blast.wav new file mode 100644 index 00000000..b89a38b3 Binary files /dev/null and b/assets/sounds/player_fire_blast.wav differ diff --git a/assets/sounds/player_hit.wav b/assets/sounds/player_hit.wav new file mode 100644 index 00000000..12cd508e Binary files /dev/null and b/assets/sounds/player_hit.wav differ diff --git a/assets/texture/ally_blast_despawn_spritesheet.png b/assets/texture/ally_blast_despawn_spritesheet.png index 250a3584..10e9242a 100644 Binary files a/assets/texture/ally_blast_despawn_spritesheet.png and b/assets/texture/ally_blast_despawn_spritesheet.png differ diff --git a/assets/texture/ally_blast_explosion_spritesheet.png b/assets/texture/ally_blast_explosion_spritesheet.png index b5762f3b..f03b6948 100644 Binary files a/assets/texture/ally_blast_explosion_spritesheet.png and b/assets/texture/ally_blast_explosion_spritesheet.png differ diff --git a/assets/texture/barrier_glow_spritesheet.png b/assets/texture/barrier_glow_spritesheet.png new file mode 100644 index 00000000..f8e0c8b4 Binary files /dev/null and b/assets/texture/barrier_glow_spritesheet.png differ diff --git a/assets/texture/drone_spritesheet.png b/assets/texture/drone_spritesheet.png index 66be1cb7..49c54987 100644 Binary files a/assets/texture/drone_spritesheet.png and b/assets/texture/drone_spritesheet.png differ diff --git a/assets/texture/drone_thrusters_spritesheet.png b/assets/texture/drone_thrusters_spritesheet.png index 2905e239..fee3932e 100644 Binary files a/assets/texture/drone_thrusters_spritesheet.png and b/assets/texture/drone_thrusters_spritesheet.png differ diff --git a/assets/texture/enemy_blast_despawn_spritesheet.png b/assets/texture/enemy_blast_despawn_spritesheet.png new file mode 100644 index 00000000..0fe5e436 Binary files /dev/null and b/assets/texture/enemy_blast_despawn_spritesheet.png differ diff --git a/assets/texture/enemy_blast_explosion_spritesheet.png b/assets/texture/enemy_blast_explosion_spritesheet.png new file mode 100644 index 00000000..c0dfa688 Binary files /dev/null and b/assets/texture/enemy_blast_explosion_spritesheet.png differ diff --git a/assets/texture/game_over_background.png b/assets/texture/game_over_background.png new file mode 100644 index 00000000..bd292af6 Binary files /dev/null and b/assets/texture/game_over_background.png differ diff --git a/assets/texture/hauler_spritesheet.png b/assets/texture/hauler_spritesheet.png index ad804676..4658f083 100644 Binary files a/assets/texture/hauler_spritesheet.png and b/assets/texture/hauler_spritesheet.png differ diff --git a/assets/texture/hauler_thrusters_spritesheet.png b/assets/texture/hauler_thrusters_spritesheet.png index 0c2432de..4f543bb1 100644 Binary files a/assets/texture/hauler_thrusters_spritesheet.png and b/assets/texture/hauler_thrusters_spritesheet.png differ diff --git a/assets/texture/main_menu_background.png b/assets/texture/main_menu_background.png new file mode 100644 index 00000000..8a4fba18 Binary files /dev/null and b/assets/texture/main_menu_background.png differ diff --git a/assets/texture/missile_launcher_spritesheet.png b/assets/texture/missile_launcher_spritesheet.png index df504b1b..c03f6763 100644 Binary files a/assets/texture/missile_launcher_spritesheet.png and b/assets/texture/missile_launcher_spritesheet.png differ diff --git a/assets/texture/missile_launcher_thrusters_spritesheet.png b/assets/texture/missile_launcher_thrusters_spritesheet.png index 32705d16..7f28b204 100644 Binary files a/assets/texture/missile_launcher_thrusters_spritesheet.png and b/assets/texture/missile_launcher_thrusters_spritesheet.png differ diff --git a/assets/texture/missile_spritesheet.png b/assets/texture/missile_spritesheet.png index 93294ff0..75c6d39e 100644 Binary files a/assets/texture/missile_spritesheet.png and b/assets/texture/missile_spritesheet.png differ diff --git a/assets/texture/missile_thrusters_spritesheet.png b/assets/texture/missile_thrusters_spritesheet.png index 1d26ea6b..f2c9e509 100644 Binary files a/assets/texture/missile_thrusters_spritesheet.png and b/assets/texture/missile_thrusters_spritesheet.png differ diff --git a/assets/texture/mob_explosion_spritesheet.png b/assets/texture/mob_explosion_spritesheet.png index 52cac041..f41a0c78 100644 Binary files a/assets/texture/mob_explosion_spritesheet.png and b/assets/texture/mob_explosion_spritesheet.png differ diff --git a/assets/texture/pawn_spritesheet.png b/assets/texture/pawn_spritesheet.png index 7064bb97..c6837583 100644 Binary files a/assets/texture/pawn_spritesheet.png and b/assets/texture/pawn_spritesheet.png differ diff --git a/assets/texture/pawn_thrusters_spritesheet.png b/assets/texture/pawn_thrusters_spritesheet.png index 21e6d000..1d0ed759 100644 Binary files a/assets/texture/pawn_thrusters_spritesheet.png and b/assets/texture/pawn_thrusters_spritesheet.png differ diff --git a/assets/texture/restart_game_prompt_controller.png b/assets/texture/restart_game_prompt_controller.png new file mode 100644 index 00000000..29157eb3 Binary files /dev/null and b/assets/texture/restart_game_prompt_controller.png differ diff --git a/assets/texture/restart_game_prompt_keyboard.png b/assets/texture/restart_game_prompt_keyboard.png new file mode 100644 index 00000000..1c0a5ddf Binary files /dev/null and b/assets/texture/restart_game_prompt_keyboard.png differ diff --git a/assets/texture/start_game_prompt_controller.png b/assets/texture/start_game_prompt_controller.png new file mode 100644 index 00000000..da54c480 Binary files /dev/null and b/assets/texture/start_game_prompt_controller.png differ diff --git a/assets/texture/start_game_prompt_keyboard.png b/assets/texture/start_game_prompt_keyboard.png new file mode 100644 index 00000000..87e62f6b Binary files /dev/null and b/assets/texture/start_game_prompt_keyboard.png differ diff --git a/assets/texture/strafer_spritesheet.png b/assets/texture/strafer_spritesheet.png index 95069d6f..ffe10995 100644 Binary files a/assets/texture/strafer_spritesheet.png and b/assets/texture/strafer_spritesheet.png differ diff --git a/assets/texture/strafer_thrusters_spritesheet.png b/assets/texture/strafer_thrusters_spritesheet.png index 260254ef..78249df1 100644 Binary files a/assets/texture/strafer_thrusters_spritesheet.png and b/assets/texture/strafer_thrusters_spritesheet.png differ diff --git a/assets/texture/victory_background.png b/assets/texture/victory_background.png new file mode 100644 index 00000000..d6a45df2 Binary files /dev/null and b/assets/texture/victory_background.png differ diff --git a/data/characters.ron b/data/characters.ron index 4c57d797..593ee7fd 100644 --- a/data/characters.ron +++ b/data/characters.ron @@ -2,8 +2,8 @@ characters: { "juggernaut": ( acceleration: (10.0, 14.0), - deceleration: (0.8, 1.2), - speed: (150.0, 250.0), + deceleration: (1.2, 1.2), + speed: (200.0, 250.0), collider_dimensions: (3.0 , 5.0), collider_density: 2.5, sprite_path: "player.png", @@ -14,7 +14,7 @@ fire_period: 0.4, health: ( max_health: 100.0, - health: 50.0, + health: 100.0, armor: 0, ), attack_damage: 10.0, diff --git a/data/consumables.ron b/data/consumables.ron index 067fc401..80f700ad 100644 --- a/data/consumables.ron +++ b/data/consumables.ron @@ -8,6 +8,7 @@ acceleration: (0.0, 2.0), deceleration: (0.5, 1.0), speed: (0.0, 110.0), + z_level: 15.0, initial_motion: ( random_linvel: Some(((-100, 50),(100, 100))), random_angvel: Some((-3.0, 3.0)), @@ -30,6 +31,7 @@ acceleration: (0.0, 2.0), deceleration: (0.5, 1.0), speed: (0.0, 110.0), + z_level: 15.0, initial_motion: ( random_linvel: Some(((-100, 50),(100, 100))), random_angvel: Some((-3.0, 3.0)), @@ -52,6 +54,7 @@ acceleration: (0.0, 2.0), deceleration: (0.5, 1.0), speed: (0.0, 110.0), + z_level: 15.0, initial_motion: ( random_linvel: Some(((-100, 50),(100, 100))), random_angvel: Some((-3.0, 3.0)), @@ -74,8 +77,9 @@ acceleration: (0.0, 2.0), deceleration: (0.5, 1.0), speed: (0.0, 110.0), + z_level: 15.0, initial_motion: ( - random_linvel: Some(((-150, 50),(150, 150))), + random_linvel: Some(((-120, 50),(120, 120))), random_angvel: Some((-5.0, 5.0)), ), texture: ( @@ -96,6 +100,7 @@ acceleration: (0.0, 2.0), deceleration: (0.5, 1.0), speed: (0.0, 110.0), + z_level: 15.0, initial_motion: ( random_linvel: Some(((-100, 50),(100, 100))), random_angvel: Some((-3.0, 3.0)), diff --git a/data/effects.ron b/data/effects.ron index 745337a4..6e24caf5 100644 --- a/data/effects.ron +++ b/data/effects.ron @@ -2,9 +2,23 @@ AllyBlastExplosion: ( effect_type: AllyBlastExplosion, effect_behaviors: [DespawnAfterAnimation], + z_level: 10.0, texture: ( path: "texture/ally_blast_explosion_spritesheet.png", - dimensions: (10, 10), + dimensions: (12, 12), + cols: 7, + rows: 1, + frame_duration: .1, + animation_direction: Forward, + ), + ), + EnemyBlastExplosion: ( + effect_type: EnemyBlastExplosion, + effect_behaviors: [DespawnAfterAnimation], + z_level: 10.5, + texture: ( + path: "texture/enemy_blast_explosion_spritesheet.png", + dimensions: (12, 12), cols: 7, rows: 1, frame_duration: .1, @@ -14,9 +28,23 @@ AllyBlastDespawn: ( effect_type: AllyBlastDespawn, effect_behaviors: [DespawnAfterAnimation], + z_level: 9.0, texture: ( path: "texture/ally_blast_despawn_spritesheet.png", - dimensions: (8, 8), + dimensions: (10, 10), + cols: 6, + rows: 1, + frame_duration: .1, + animation_direction: Forward, + ), + ), + EnemyBlastDespawn: ( + effect_type: EnemyBlastDespawn, + effect_behaviors: [DespawnAfterAnimation], + z_level: 9.0, + texture: ( + path: "texture/enemy_blast_despawn_spritesheet.png", + dimensions: (10, 10), cols: 6, rows: 1, frame_duration: .1, @@ -26,9 +54,10 @@ MobExplosion: ( effect_type: MobExplosion, effect_behaviors: [DespawnAfterAnimation], + z_level: -5.0, texture: ( path: "texture/mob_explosion_spritesheet.png", - dimensions: (24, 24), + dimensions: (26, 26), cols: 10, rows: 1, frame_duration: .1, @@ -38,6 +67,7 @@ ConsumableDespawn: ( effect_type: ConsumableDespawn, effect_behaviors: [DespawnAfterAnimation], + z_level: 9.0, texture: ( path: "texture/consumable_despawn_spritesheet.png", dimensions: (9, 9), @@ -47,4 +77,17 @@ animation_direction: Forward, ), ), + BarrierGlow: ( + effect_type: BarrierGlow, + effect_behaviors: [], + z_level: 25.0, + texture: ( + path: "texture/barrier_glow_spritesheet.png", + dimensions: (102, 17), + cols: 3, + rows: 1, + frame_duration: .2, + animation_direction: PingPong(Forward), + ), + ), } \ No newline at end of file diff --git a/data/formation_pools.ron b/data/formation_pools.ron index 411dd8b0..4d9ef68c 100644 --- a/data/formation_pools.ron +++ b/data/formation_pools.ron @@ -3,8 +3,26 @@ ( formation_spawnables: [ ( - spawnable_type: Mob(Enemy(MissileLauncher)), - position: (0.0, 500.0), + spawnable_type: Mob(Enemy(StraferRight)), + position: (0.0, 650.0), + ), + ( + spawnable_type: Mob(Enemy(StraferLeft)), + position: (0.0, 600.0), + ), + ( + spawnable_type: Mob(Enemy(Pawn)), + position: (0.0, 550.0), + ), + ], + weight: 1.0, + period: 7.0, + ), + ( + formation_spawnables: [ + ( + spawnable_type: Mob(Enemy(Pawn)), + position: (300.0, 650.0), ), ( spawnable_type: Mob(Enemy(Pawn)), @@ -12,7 +30,11 @@ ), ( spawnable_type: Mob(Enemy(Pawn)), - position: (-200.0, 600.0), + position: (-300.0, 650.0), + ), + ( + spawnable_type: Mob(Enemy(Pawn)), + position: (-200, 600.0), ), ], weight: 1.0, @@ -22,7 +44,55 @@ formation_spawnables: [ ( spawnable_type: Mob(Enemy(Drone)), - position: (0.0, 500.0), + position: (0.0, 550.0), + ), + ( + spawnable_type: Mob(Enemy(Drone)), + position: (100.0, 650.0), + ), + ( + spawnable_type: Mob(Enemy(Drone)), + position: (50.0, 600.0), + ), + ( + spawnable_type: Mob(Enemy(Drone)), + position: (-100.0, 650.0), + ), + ( + spawnable_type: Mob(Enemy(Drone)), + position: (-50, 600.0), + ), + ], + weight: 1.0, + period: 7.0, + ), + ( + formation_spawnables: [ + ( + spawnable_type: Mob(Enemy(Pawn)), + position: (200.0, 600.0), + ), + ( + spawnable_type: Mob(Enemy(Pawn)), + position: (-200, 600.0), + ), + ( + spawnable_type: Mob(Enemy(Drone)), + position: (0.0, 550.0), + ), + ], + weight: 1.0, + period: 8.0, + ), + ( + formation_spawnables: [ + ( + spawnable_type: Mob(Enemy(Drone)), + position: (180.0, 900.0), + ), + ( + spawnable_type: Mob(Enemy(Drone)), + position: (-180.0, 900.0), ), ( spawnable_type: Mob(Ally(Hauler)), @@ -33,11 +103,15 @@ position: (-200.0, 600.0), ), ], - weight: 1.0, + weight: 0.5, period: 6.0, ), ( formation_spawnables: [ + ( + spawnable_type: Consumable(Money5), + position: (0.0, 400.0), + ), ( spawnable_type: Mob(Enemy(Missile)), position: (0.0, 500.0), @@ -50,9 +124,17 @@ spawnable_type: Mob(Enemy(Missile)), position: (-200.0, 600.0), ), + ( + spawnable_type: Mob(Enemy(Missile)), + position: (400.0, 700.0), + ), + ( + spawnable_type: Mob(Enemy(Missile)), + position: (-400.0, 700.0), + ), ], - weight: 1.0, - period: 4.0, + weight: 0.5, + period: 6.0, ), ( formation_spawnables: [ @@ -60,9 +142,25 @@ spawnable_type: Mob(Enemy(StraferRight)), position: (200.0, 500.0), ), + ( + spawnable_type: Mob(Enemy(StraferRight)), + position: (250.0, 550.0), + ), + ( + spawnable_type: Mob(Enemy(StraferRight)), + position: (300.0, 600.0), + ), ( spawnable_type: Mob(Enemy(StraferLeft)), - position: (-200.0, 600.0), + position: (-200.0, 525.0), + ), + ( + spawnable_type: Mob(Enemy(StraferLeft)), + position: (-250.0, 575.0), + ), + ( + spawnable_type: Mob(Enemy(StraferLeft)), + position: (-300.0, 625.0), ), ], weight: 1.0, @@ -83,7 +181,193 @@ position: (-200.0, 600.0), ), ], + weight: 0.2, + period: 4.0, + ), + ], + Hard: [ + ( + formation_spawnables: [ + ( + spawnable_type: Mob(Enemy(StraferRight)), + position: (0.0, 650.0), + ), + ( + spawnable_type: Mob(Enemy(StraferLeft)), + position: (0.0, 600.0), + ), + ( + spawnable_type: Mob(Enemy(MissileLauncher)), + position: (0.0, 550.0), + ), + ], weight: 1.0, + period: 7.0, + ), + ( + formation_spawnables: [ + ( + spawnable_type: Mob(Enemy(Pawn)), + position: (300.0, 650.0), + ), + ( + spawnable_type: Mob(Enemy(Pawn)), + position: (200.0, 600.0), + ), + ( + spawnable_type: Mob(Enemy(Pawn)), + position: (-300.0, 650.0), + ), + ( + spawnable_type: Mob(Enemy(Pawn)), + position: (-200, 600.0), + ), + ], + weight: 1.0, + period: 6.5, + ), + ( + formation_spawnables: [ + ( + spawnable_type: Mob(Enemy(Drone)), + position: (0.0, 550.0), + ), + ( + spawnable_type: Mob(Enemy(Drone)), + position: (100.0, 650.0), + ), + ( + spawnable_type: Mob(Enemy(Drone)), + position: (50.0, 600.0), + ), + ( + spawnable_type: Mob(Enemy(Drone)), + position: (-100.0, 650.0), + ), + ( + spawnable_type: Mob(Enemy(Drone)), + position: (-50, 600.0), + ), + ], + weight: 1.0, + period: 6.5, + ), + ( + formation_spawnables: [ + ( + spawnable_type: Mob(Enemy(Pawn)), + position: (200.0, 600.0), + ), + ( + spawnable_type: Mob(Enemy(Pawn)), + position: (-200, 600.0), + ), + ( + spawnable_type: Mob(Enemy(MissileLauncher)), + position: (0.0, 550.0), + ), + ], + weight: 1.0, + period: 7.5, + ), + ( + formation_spawnables: [ + ( + spawnable_type: Mob(Enemy(Drone)), + position: (180.0, 900.0), + ), + ( + spawnable_type: Mob(Enemy(Drone)), + position: (-180.0, 900.0), + ), + ( + spawnable_type: Mob(Ally(Hauler)), + position: (200.0, 600.0), + ), + ( + spawnable_type: Mob(Ally(Hauler)), + position: (-200.0, 600.0), + ), + ], + weight: 0.5, + period: 5.5, + ), + ( + formation_spawnables: [ + ( + spawnable_type: Consumable(Money5), + position: (0.0, 400.0), + ), + ( + spawnable_type: Mob(Enemy(MissileLauncher)), + position: (0.0, 550.0), + ), + ( + spawnable_type: Mob(Enemy(Missile)), + position: (200.0, 600.0), + ), + ( + spawnable_type: Mob(Enemy(Missile)), + position: (-200.0, 600.0), + ), + ( + spawnable_type: Mob(Enemy(Missile)), + position: (400.0, 700.0), + ), + ( + spawnable_type: Mob(Enemy(Missile)), + position: (-400.0, 700.0), + ), + ], + weight: 0.5, + period: 6.0, + ), + ( + formation_spawnables: [ + ( + spawnable_type: Mob(Enemy(StraferRight)), + position: (200.0, 500.0), + ), + ( + spawnable_type: Mob(Enemy(StraferRight)), + position: (250.0, 550.0), + ), + ( + spawnable_type: Mob(Enemy(StraferRight)), + position: (300.0, 600.0), + ), + ( + spawnable_type: Mob(Enemy(StraferLeft)), + position: (-200.0, 525.0), + ), + ( + spawnable_type: Mob(Enemy(StraferLeft)), + position: (-250.0, 575.0), + ), + ( + spawnable_type: Mob(Enemy(StraferLeft)), + position: (-300.0, 625.0), + ), + ], + weight: 1.0, + period: 7.5, + ), + ( + formation_spawnables: [ + ( + spawnable_type: Mob(Neutral(MoneyAsteroid)), + position: (0.0, 500.0), + ), + ( + spawnable_type: Mob(Neutral(MoneyAsteroid)), + position: (200.0, 600.0), + ), + ( + spawnable_type: Mob(Neutral(MoneyAsteroid)), + position: (-200.0, 600.0), + ), + ], + weight: 0.2, period: 4.0, ), ], diff --git a/data/levels.ron b/data/levels.ron index e8f3e4f0..68b67420 100644 --- a/data/levels.ron +++ b/data/levels.ron @@ -2,7 +2,7 @@ EarthOrbit: ( initial_delay: 5.0, objective: Defense(( - max_health: 200.0, + max_health: 100.0, health: 100.0, armor: 0, )), @@ -10,7 +10,7 @@ phases: [ ( phase_type: FormationSpawn( - time: 20.0, + time: 45.0, formation_pool: Easy, initial_delay: 1.0, ) @@ -20,8 +20,8 @@ ), ( phase_type: FormationSpawn( - time: 30.0, - formation_pool: Asteroids, + time: 45.0, + formation_pool: Hard, initial_delay: 1.0, ) ), diff --git a/data/mobs.ron b/data/mobs.ron index 606aded0..17a609b8 100644 --- a/data/mobs.ron +++ b/data/mobs.ron @@ -14,6 +14,7 @@ defense_damage: 10.0, initial_motion: (), collider_dimensions: (5.0, 5.0), + z_level: 5.0, consumable_drops: Standard, health: ( max_health: 20.0, @@ -22,7 +23,7 @@ ), texture: ( path: "texture/drone_spritesheet.png", - dimensions: (18.0, 18.0), + dimensions: (20.0, 20.0), cols: 3, rows: 1, frame_duration: 0.25, @@ -32,7 +33,7 @@ y_offset: 11.0, texture: ( path: "texture/drone_thrusters_spritesheet.png", - dimensions: (12.0, 8.0), + dimensions: (14.0, 10.0), cols: 3, rows: 1, frame_duration: 0.15, @@ -71,6 +72,7 @@ defense_damage: 10.0, initial_motion: (), collider_dimensions: (5.0, 5.0), + z_level: 5.0, consumable_drops: Standard, health: ( max_health: 20.0, @@ -79,7 +81,7 @@ ), texture: ( path: "texture/pawn_spritesheet.png", - dimensions: (18.0, 18.0), + dimensions: (20.0, 20.0), cols: 3, rows: 1, frame_duration: 0.25, @@ -89,7 +91,7 @@ y_offset: 11.0, texture: ( path: "texture/pawn_thrusters_spritesheet.png", - dimensions: (12.0, 8.0), + dimensions: (14.0, 10.0), cols: 3, rows: 1, frame_duration: 0.15, @@ -109,9 +111,10 @@ angular_speed: 0.0, attack_damage: 0.0, collision_damage: 5.0, - defense_damage: 0.0, + defense_damage: -10.0, initial_motion: (), collider_dimensions: (5.0, 10.0), + z_level: 6.0, consumable_drops: Standard, health: ( max_health: 20.0, @@ -120,7 +123,7 @@ ), texture: ( path: "texture/hauler_spritesheet.png", - dimensions: (22.0, 36.0), + dimensions: (24.0, 38.0), cols: 3, rows: 1, frame_duration: 0.25, @@ -130,7 +133,7 @@ y_offset: 18.0, texture: ( path: "texture/hauler_thrusters_spritesheet.png", - dimensions: (22.0, 9.0), + dimensions: (24.0, 11.0), cols: 3, rows: 1, frame_duration: 0.15, @@ -164,15 +167,16 @@ defense_damage: 25.0, initial_motion: (), collider_dimensions: (6.0, 8.0), + z_level: 5.0, consumable_drops: Standard, health: ( - max_health: 20.0, - health: 20.0, + max_health: 60.0, + health: 60.0, armor: 0, ), texture: ( path: "texture/missile_launcher_spritesheet.png", - dimensions: (21.0, 26.0), + dimensions: (23.0, 28.0), cols: 3, rows: 1, frame_duration: 0.25, @@ -182,7 +186,7 @@ y_offset: 13.0, texture: ( path: "texture/missile_launcher_thrusters_spritesheet.png", - dimensions: (15.0, 5.0), + dimensions: (17.0, 7.0), cols: 3, rows: 1, frame_duration: 0.15, @@ -201,10 +205,11 @@ angular_deceleration: 0.0, angular_speed: 1.8, attack_damage: 0.0, - collision_damage: 18.0, + collision_damage: 30.0, defense_damage: 0.0, initial_motion: (), collider_dimensions: (1.5, 4.0), + z_level: 5.0, consumable_drops: Nothing, health: ( max_health: 20.0, @@ -213,7 +218,7 @@ ), texture: ( path: "texture/missile_spritesheet.png", - dimensions: (11.0, 17.0), + dimensions: (13.0, 19.0), cols: 4, rows: 1, frame_duration: 0.1, @@ -223,7 +228,7 @@ y_offset: 9.0, texture: ( path: "texture/missile_thrusters_spritesheet.png", - dimensions: (11.0, 7.0), + dimensions: (13.0, 9.0), cols: 4, rows: 1, frame_duration: 0.15, @@ -262,15 +267,16 @@ defense_damage: 15.0, initial_motion: (), collider_dimensions: (7.0, 2.0), + z_level: 5.0, consumable_drops: Standard, health: ( - max_health: 40.0, - health: 40.0, + max_health: 20.0, + health: 20.0, armor: 0, ), texture: ( path: "texture/strafer_spritesheet.png", - dimensions: (24.0, 12.0), + dimensions: (26.0, 14.0), cols: 3, rows: 1, frame_duration: 0.25, @@ -280,7 +286,7 @@ y_offset: 7.0, texture: ( path: "texture/strafer_thrusters_spritesheet.png", - dimensions: (22.0, 9.0), + dimensions: (24.0, 11.0), cols: 3, rows: 1, frame_duration: 0.15, @@ -318,15 +324,16 @@ defense_damage: 15.0, initial_motion: (), collider_dimensions: (7.0, 2.0), + z_level: 5.0, consumable_drops: Standard, health: ( - max_health: 40.0, - health: 40.0, + max_health: 20.0, + health: 20.0, armor: 0, ), texture: ( path: "texture/strafer_spritesheet.png", - dimensions: (24.0, 12.0), + dimensions: (26.0, 14.0), cols: 3, rows: 1, frame_duration: 0.25, @@ -336,7 +343,7 @@ y_offset: 7.0, texture: ( path: "texture/strafer_thrusters_spritesheet.png", - dimensions: (22.0, 9.0), + dimensions: (24.0, 11.0), cols: 3, rows: 1, frame_duration: 0.15, @@ -357,6 +364,7 @@ attack_damage: 0.0, collision_damage: 7.0, defense_damage: 0.0, + z_level: 4.0, consumable_drops: MoneyAsteroid, initial_motion: ( random_angvel: Some((-1.0, 1.0)), diff --git a/data/projectiles.ron b/data/projectiles.ron index 578c60e2..efc8110c 100644 --- a/data/projectiles.ron +++ b/data/projectiles.ron @@ -4,6 +4,7 @@ spawnable_behaviors: [], projectile_behaviors: [ExplodeOnImpact], collider_dimensions: (1.5, 1.5), + z_level: 20.0, texture: ( path: "texture/enemy_blast_spritesheet.png", dimensions: (4.0, 4.0), @@ -18,6 +19,7 @@ spawnable_behaviors: [], projectile_behaviors: [ExplodeOnImpact], collider_dimensions: (1.5, 1.5), + z_level: 20.0, texture: ( path: "texture/neutral_blast_spritesheet.png", dimensions: (4.0, 4.0), @@ -32,6 +34,7 @@ spawnable_behaviors: [], projectile_behaviors: [ExplodeOnImpact], collider_dimensions: (1.5, 1.5), + z_level: 19.0, texture: ( path: "texture/ally_blast_spritesheet.png", dimensions: (4.0, 4.0), diff --git a/data/run.ron b/data/run.ron index ee9804c4..19fb644e 100644 --- a/data/run.ron +++ b/data/run.ron @@ -1,4 +1 @@ -[ - EarthOrbit, - EarthOrbit, -] \ No newline at end of file +EarthOrbit \ No newline at end of file diff --git a/src/arena/barrier.rs b/src/arena/barrier.rs index 1005675b..2d863aec 100644 --- a/src/arena/barrier.rs +++ b/src/arena/barrier.rs @@ -1,18 +1,52 @@ -use crate::{HORIZONTAL_BARRIER_COL_GROUP_MEMBERSHIP, SPAWNABLE_COL_GROUP_MEMBERSHIP}; +use crate::{ + spawnable::{EffectType, SpawnEffectEvent}, + states::{AppStateComponent, AppStates}, + HORIZONTAL_BARRIER_COL_GROUP_MEMBERSHIP, SPAWNABLE_COL_GROUP_MEMBERSHIP, +}; use bevy::prelude::*; use bevy_rapier2d::prelude::*; +use std::f32::consts::FRAC_PI_2; + #[derive(Component)] pub struct ArenaBarrierComponent; /// Spawns arena barriers -pub fn spawn_barriers_system(mut commands: Commands) { +pub fn spawn_barriers_system( + mut commands: Commands, + mut spawn_effect: EventWriter, +) { // spawn horizontal barriers at top and bottom of arena spawn_spawnables_pass_barrier(&mut commands, Vec2::new(0.0, 360.0), 1000.0, 30.0); spawn_spawnables_pass_barrier(&mut commands, Vec2::new(0.0, -360.0), 1000.0, 30.0); // spawn vertical barriers at right and left of arena spawn_barrier(&mut commands, Vec2::new(500.0, 0.0), 30.0, 3000.0); spawn_barrier(&mut commands, Vec2::new(-500.0, 0.0), 30.0, 3000.0); + + spawn_effect.send(SpawnEffectEvent { + effect_type: EffectType::BarrierGlow, + position: Vec2::new(0.0, -355.0), + scale: Vec2::new(7.25, 0.0), + rotation: 0.0, + }); + spawn_effect.send(SpawnEffectEvent { + effect_type: EffectType::BarrierGlow, + position: Vec2::new(0.0, 355.0), + scale: Vec2::new(7.25, 0.0), + rotation: 0.0, + }); + spawn_effect.send(SpawnEffectEvent { + effect_type: EffectType::BarrierGlow, + position: Vec2::new(495.0, 0.0), + scale: Vec2::new(7.25, 0.0), + rotation: FRAC_PI_2, + }); + spawn_effect.send(SpawnEffectEvent { + effect_type: EffectType::BarrierGlow, + position: Vec2::new(-495.0, 0.0), + scale: Vec2::new(7.25, 0.0), + rotation: FRAC_PI_2, + }); } /// Spawns an arena barrier @@ -27,6 +61,8 @@ fn spawn_barrier(commands: &mut Commands, position: Vec2, width: f32, height: f3 .insert(Restitution::new(1.0)) .insert(Friction::new(0.0)) .insert(ArenaBarrierComponent) + .insert(AppStateComponent(AppStates::Game)) + .insert(ActiveEvents::COLLISION_EVENTS) .insert(Name::new("Barrier")); } @@ -45,5 +81,8 @@ fn spawn_spawnables_pass_barrier(commands: &mut Commands, position: Vec2, width: memberships: HORIZONTAL_BARRIER_COL_GROUP_MEMBERSHIP, filters: u32::MAX ^ SPAWNABLE_COL_GROUP_MEMBERSHIP, }) + .insert(AppStateComponent(AppStates::Game)) + .insert(ArenaBarrierComponent) + .insert(ActiveEvents::COLLISION_EVENTS) .insert(Name::new("Spawnables-Pass Barrier")); } diff --git a/src/arena/gate.rs b/src/arena/gate.rs index 267eacf7..e7def9a2 100644 --- a/src/arena/gate.rs +++ b/src/arena/gate.rs @@ -1,5 +1,10 @@ -use crate::spawnable::{MobComponent, SpawnableComponent}; +use crate::{ + spawnable::{MobComponent, SpawnableComponent}, + states::{AppStateComponent, AppStates}, + SoundEffectsAudioChannel, +}; use bevy::prelude::*; +use bevy_kira_audio::AudioChannel; use bevy_rapier2d::{prelude::*, rapier::prelude::CollisionEventFlags}; /// Despawn gate tag @@ -8,7 +13,7 @@ pub struct DespawnGateComponent; /// Spawn gates for despawning entities pub fn spawn_despawn_gates_system(mut commands: Commands) { - spawn_despawn_gate(&mut commands, Vec2::new(0.0, -450.0), 1000.0, 50.0); + spawn_despawn_gate(&mut commands, Vec2::new(0.0, -500.0), 1000.0, 50.0); } /// Spawn a despawn gate @@ -22,6 +27,7 @@ fn spawn_despawn_gate(commands: &mut Commands, position: Vec2, width: f32, heigh .insert(Collider::cuboid(width / 2.0, height / 2.0)) .insert(Sensor(true)) .insert(DespawnGateComponent) + .insert(AppStateComponent(AppStates::Game)) .insert(Name::new("Despawn Gate")); } @@ -33,6 +39,8 @@ pub fn despawn_gates_system( spawnable_query: Query>, mob_query: Query<(Entity, &MobComponent)>, mut enemy_bottom_event: EventWriter, + asset_server: Res, + audio_channel: Res>, ) { 'event_loop: for collision_event in collision_events.iter() { for despawn_gate_entity in despawn_gate_query.iter() { @@ -60,6 +68,11 @@ pub fn despawn_gates_system( if mob_entity == *other_entity { enemy_bottom_event .send(EnemyReachedBottomGateEvent(mob_component.defense_damage)); + if mob_component.defense_damage > 0.0 { + audio_channel.play(asset_server.load("sounds/defense_damage.wav")); + } else if mob_component.defense_damage < -0.5 { + audio_channel.play(asset_server.load("sounds/defense_heal.wav")); + } } } } diff --git a/src/background/resources.rs b/src/background/resources.rs index b724eb98..7ae4bf8f 100644 --- a/src/background/resources.rs +++ b/src/background/resources.rs @@ -1,4 +1,5 @@ use crate::background::PlanetComponent; +use crate::states::{AppStateComponent, AppStates}; use bevy::prelude::Commands; use bevy::prelude::*; use serde::Deserialize; @@ -57,6 +58,7 @@ impl PlanetData { .insert(PlanetComponent { rotation_speed: self.rotation_speed, }) + .insert(AppStateComponent(AppStates::Game)) .insert(Name::new("Planet")); // spawn light entity @@ -72,6 +74,7 @@ impl PlanetData { transform, ..Default::default() }) + .insert(AppStateComponent(AppStates::Game)) .insert(Name::new("Planet Light")); } } diff --git a/src/collision/mod.rs b/src/collision/mod.rs index 6b031c15..e1ee850e 100644 --- a/src/collision/mod.rs +++ b/src/collision/mod.rs @@ -4,8 +4,10 @@ use crate::{ spawnable::{ ConsumableComponent, Faction, MobComponent, MobType, ProjectileComponent, ProjectileType, }, + SoundEffectsAudioChannel, }; use bevy::prelude::*; +use bevy_kira_audio::AudioChannel; use bevy_rapier2d::{prelude::*, rapier::prelude::CollisionEventFlags}; /// Types of collisions @@ -183,6 +185,8 @@ pub fn contact_collision_system( player_query: Query<(Entity, &PlayerComponent)>, mob_query: Query<(Entity, &MobComponent)>, barrier_query: Query>, + asset_server: Res, + audio_channel: Res>, ) { 'collision_events: for contact_event in collision_events.iter() { if let CollisionEvent::Stopped(collider1_entity, collider2_entity, _) = contact_event { @@ -207,6 +211,7 @@ pub fn contact_collision_system( if let Some(colliding_entities) = colliding_entities { for (mob_entity, mob_component) in mob_query.iter() { if colliding_entities.secondary == mob_entity { + audio_channel.play(asset_server.load("sounds/collision.wav")); collision_event_writer.send(SortedCollisionEvent::PlayerToMobContact { player_entity: colliding_entities.primary, mob_entity: colliding_entities.secondary, @@ -221,6 +226,14 @@ pub fn contact_collision_system( continue 'collision_events; } } + + // play bounce sound when player collides with barrier + for barrier_entity in barrier_query.iter() { + if colliding_entities.secondary == barrier_entity { + audio_channel.play(asset_server.load("sounds/barrier_bounce.wav")); + continue 'collision_events; + } + } } } @@ -246,6 +259,7 @@ pub fn contact_collision_system( // check if mob collided with other mob for (mob_entity_2, mob_component_2) in mob_query.iter() { if colliding_entities.secondary == mob_entity_2 { + audio_channel.play(asset_server.load("sounds/collision.wav")); collision_event_writer.send(SortedCollisionEvent::MobToMobContact { mob_entity_1: colliding_entities.primary, mob_faction_1: match mob_component_1.mob_type { @@ -284,6 +298,7 @@ pub fn contact_collision_system( for barrier_entity in barrier_query.iter() { if colliding_entities.secondary == barrier_entity { + audio_channel.play(asset_server.load("sounds/barrier_bounce.wav")); collision_event_writer.send( SortedCollisionEvent::MobToBarrierContact { mob_entity: colliding_entities.primary, diff --git a/src/game_over.rs b/src/game_over.rs new file mode 100644 index 00000000..e82e66dd --- /dev/null +++ b/src/game_over.rs @@ -0,0 +1,194 @@ +use bevy::prelude::*; +use bevy_rapier2d::plugin::RapierConfiguration; + +use crate::{ + main_menu::BouncingPromptComponent, + states::{AppStateComponent, AppStates}, +}; + +#[derive(Component)] +pub struct GameFadeComponent; +#[derive(Component)] +pub struct GameOverFadeComponent; + +pub struct EndGameTransitionResource { + pub fade_out_timer: Timer, + pub fade_in_timer: Timer, + pub max_fps: f32, + pub frame_slowdown_speed: f32, + pub start: bool, + pub fade_out_speed: f32, + pub fade_in_speed: f32, + pub next_state: Option, +} + +impl EndGameTransitionResource { + pub fn new( + fade_out_seconds: f32, + fade_in_seconds: f32, + frame_slowdown_speed: f32, + fade_out_speed: f32, + fade_in_speed: f32, + max_fps: f32, + ) -> Self { + Self { + fade_out_timer: Timer::from_seconds(fade_out_seconds, false), + fade_in_timer: Timer::from_seconds(fade_in_seconds, false), + start: false, + max_fps, + frame_slowdown_speed, + fade_out_speed, + fade_in_speed, + next_state: None, + } + } + + pub fn start(&mut self, app_state: AppStates) { + self.start = true; + self.next_state = Some(app_state) + } +} + +#[derive(Component)] +pub struct GameOverUI; + +#[cfg(not(target_arch = "wasm32"))] +pub fn fade_out_system( + mut app_state: ResMut>, + mut rapier_config: ResMut, + mut framepace: ResMut, + time: Res