feat: add Captured and TractorBeam components, enhance enemy behavior with capture mechanics

This commit is contained in:
Harald Hoyer 2025-04-16 08:41:17 +02:00
parent 1d1b927007
commit 008f9cc24a
5 changed files with 366 additions and 107 deletions

View file

@ -21,11 +21,11 @@ use game_state::{
};
use player::{
check_player_enemy_collisions, manage_invincibility, move_player, player_shoot,
respawn_player,
respawn_player, handle_captured_player,
};
use enemy::{
check_formation_complete, enemy_shoot, is_formation_complete, move_enemies, spawn_enemies,
trigger_attack_dives,
trigger_attack_dives, boss_capture_attack,
};
use bullet::{
check_bullet_collisions, check_enemy_bullet_player_collisions, move_bullets,
@ -36,75 +36,67 @@ use systems::{player_exists, player_vulnerable, setup, should_respawn_player, up
fn main() {
App::new()
.init_state::<AppState>() // Initialize the AppState
.insert_resource(ClearColor(Color::rgb(0.0, 0.0, 0.0)))
.insert_resource(ClearColor(Color::rgb(0.0, 0.0, 0.1)))
.add_plugins(DefaultPlugins.set(WindowPlugin {
primary_window: Some(Window {
title: "Galaga :: Stage: 1 Lives: 3 Score: 0".into(), // Initial title
title: "BGLGA".into(),
resolution: (WINDOW_WIDTH, WINDOW_HEIGHT).into(),
resizable: false,
..default()
}),
..default()
}))
// Add Resources
.insert_resource(PlayerLives {
count: STARTING_LIVES,
// Add states
.init_state::<AppState>() // Changed from add_state to init_state
// Initialize game resources
.insert_resource(EnemySpawnTimer {
timer: Timer::new(Duration::from_secs_f32(1.0), TimerMode::Once),
})
.insert_resource(PlayerLives { count: STARTING_LIVES })
.insert_resource(PlayerRespawnTimer {
timer: Timer::new(
Duration::from_secs_f32(PLAYER_RESPAWN_DELAY),
TimerMode::Once,
),
})
.insert_resource(EnemySpawnTimer {
timer: Timer::new(Duration::from_secs_f32(0.5), TimerMode::Repeating),
})
.insert_resource(Score { value: 0 })
.insert_resource(CurrentStage {
number: 1,
waiting_for_clear: false,
})
.insert_resource(FormationState {
next_slot_index: 0,
total_spawned_this_stage: 0,
formation_complete: false,
})
.insert_resource(StageConfigurations::default()) // Add stage configurations
.insert_resource(AttackDiveTimer {
timer: { // Correctly assign the block expression to the timer field
let mut timer = Timer::new(Duration::from_secs_f32(3.0), TimerMode::Repeating); // Default duration, will be overwritten by stage config
timer.pause(); // Start paused
timer
}
total_spawned_this_stage: 0,
next_slot_index: 0,
})
.insert_resource(AttackDiveTimer {
timer: {
let mut timer = Timer::new(Duration::from_secs_f32(3.0), TimerMode::Repeating);
timer.pause(); // Start paused
timer
},
timer: Timer::new(Duration::from_secs_f32(3.0), TimerMode::Once),
})
// Add Systems
.insert_resource(StageConfigurations::default()) // Use default stages for now
// Add startup systems
.add_systems(Startup, setup)
// Systems running only when Playing
// Core game systems
.add_systems(
Update,
(
// Player systems
move_player,
update_window_title,
// Enemy and player systems
spawn_enemies,
move_player.run_if(player_exists),
player_shoot.run_if(player_exists),
check_player_enemy_collisions.run_if(player_vulnerable),
respawn_player.run_if(should_respawn_player),
manage_invincibility,
handle_captured_player, // New system for handling captured player
// Bullet systems
move_bullets,
check_bullet_collisions,
move_enemy_bullets,
check_enemy_bullet_player_collisions.run_if(player_vulnerable),
// Enemy systems
spawn_enemies,
move_enemies,
enemy_shoot, // Consider run_if attacking state? (Handled internally for now)
boss_capture_attack, // New system for boss tractor beam
)
.run_if(in_state(AppState::Playing)),
)
@ -119,18 +111,9 @@ fn main() {
.chain() // Ensure these run in order if needed, check_formation first
.run_if(in_state(AppState::Playing)),
)
// Systems running regardless of state (or managing state transitions)
.add_systems(
Update,
(
update_window_title, // Keep title updated
// TODO: Add system to check for restart input in GameOver state
bevy::window::close_on_esc, // Allow closing anytime
),
)
// Systems for entering/exiting states
// UI and state management systems
.add_systems(OnEnter(AppState::GameOver), setup_game_over_ui)
.add_systems(OnExit(AppState::Playing), cleanup_game_entities)
.add_systems(OnExit(AppState::GameOver), cleanup_game_over_ui)
.add_systems(OnExit(AppState::Playing), cleanup_game_entities) // Cleanup when leaving Playing
.run();
}