diff --git a/game/src/combat.rs b/game/src/combat.rs index a4b06b6f07e75471884d6fda5b04933a07219ff3..5c39bb1587d6b92c58b7bcea63d738d3b34e260d 100644 --- a/game/src/combat.rs +++ b/game/src/combat.rs @@ -14,14 +14,12 @@ impl Plugin for CombatPlugin { app.add_systems(Update, button_system); app.add_state::<CombatState>(); app.add_systems(OnEnter(CombatState::ETurn), enemy_attack); - app.add_systems(OnEnter(CombatState::PTurn), player_attack); app.add_systems(Update, combat_outcome); app.add_systems(OnExit(GameState::Combat), exit_combat); + app.add_systems(OnEnter(CombatState::PrepareAttack), update_hp); } } -static ATTACKNO: AtomicUsize = AtomicUsize::new(0); - #[derive(Clone, Copy, Default, Eq, PartialEq, Debug, Hash, States)] pub enum CombatState { #[default] @@ -46,13 +44,17 @@ const PRESSED_BUTTON: Color = Color::rgb(0.35, 0.75, 0.35); #[derive(Component)] struct OnMainCombat; +#[derive(Component)] +struct CombatText; + pub fn spawn_combat( mut commands: Commands, asset_server: Res<AssetServer>, window_query: Query<&mut Window, With<PrimaryWindow>>, - player_query: Query<(&mut Transform, &Player)>, + player_query: Query<(&Player)>, + enemy_query: Query<&Enemy>, ) { - let player = player_query.get_single().unwrap(); + let players = player_query.get_single(); let button_style = Style { width: Val::Px(150.0), height: Val::Px(65.0), @@ -65,14 +67,9 @@ pub fn spawn_combat( }; let window = window_query.get_single().unwrap(); - + //spawn combat assets commands.spawn(( SpriteBundle { - // sprite: Sprite { - // color: Color::rgb(0.0, 0.0, 0.0), - // custom_size: Some(Vec2::new(window.width(), window.height())), - // ..default() - // }, transform: Transform { translation: Vec3 { z: 3.0, @@ -115,7 +112,7 @@ pub fn spawn_combat( }, OnMainCombat, )); - + //spawn combat ui commands .spawn(( NodeBundle { @@ -149,23 +146,71 @@ pub fn spawn_combat( ..default() }) .with_children(|parent| { - for capacite in &player.1.moveset { - parent - .spawn(( - ButtonBundle { - style: button_style.clone(), - background_color: NORMAL_BUTTON.into(), + if let Ok(player) = players { + for capacite in &player.moveset { + parent + .spawn(( + ButtonBundle { + style: button_style.clone(), + background_color: NORMAL_BUTTON.into(), + ..default() + }, + BTNACTION[i], + )) + .with_children(|parent| { + parent.spawn(TextBundle::from_section( + &capacite.name, + TextStyle { ..default() }, + )); + }); + i += 1; + } + } + }) + .with_children(|parent| { + if let Ok(player) = players { + parent.spawn(( + TextBundle { + text: Text { + sections: vec![TextSection { + value: format!("HP Player {}", player.hp), + style: TextStyle { + color: Color::GREEN, + font_size: 20.0, + ..default() + }, + ..default() + }], ..default() }, - BTNACTION[i], - )) - .with_children(|parent| { - parent.spawn(TextBundle::from_section( - &capacite.name, - TextStyle { ..default() }, - )); - }); - i += 1; + ..default() + }, + CombatText, + )); + } + }) + .with_children(|parent| { + for enemy in &enemy_query { + if enemy.tag == true { + parent.spawn(( + TextBundle { + text: Text { + sections: vec![TextSection { + value: format!("HP Enemy {}", enemy.hp), + style: TextStyle { + color: Color::RED, + font_size: 20.0, + ..default() + }, + ..default() + }], + ..default() + }, + ..default() + }, + CombatText, + )); + } } }); }); @@ -184,28 +229,41 @@ fn button_system( >, mut text_query: Query<&mut Text>, mut combat_state: ResMut<NextState<CombatState>>, + mut players: Query<&mut Player>, + mut enemies: Query<&mut Enemy>, ) { for (interaction, mut color, mut border_color, children, btnaction) in &mut interaction_query { let mut text = text_query.get_mut(children[0]).unwrap(); match *interaction { Interaction::Pressed => { - match btnaction { - BtnAction::Cap1 => { - ATTACKNO.store(0, Ordering::Relaxed); - println!("button cap1 pressed"); - combat_state.set(CombatState::PTurn); - } - BtnAction::Cap2 => { - ATTACKNO.store(1, Ordering::Relaxed); - combat_state.set(CombatState::PTurn); - } - BtnAction::Cap3 => { - ATTACKNO.store(2, Ordering::Relaxed); - combat_state.set(CombatState::PTurn); - } - BtnAction::Cap4 => { - ATTACKNO.store(3, Ordering::Relaxed); - combat_state.set(CombatState::PTurn); + for mut enemy in &mut enemies { + println!("enemy tag is{}", enemy.tag); + if enemy.tag == true { + for player in &players { + match btnaction { + BtnAction::Cap1 => { + println!("button cap1 pressed"); + enemy.hp -= player.moveset[0].degat; + println!("enemi prend {} degat", player.moveset[0].degat); + } + BtnAction::Cap2 => { + println!("button cap1 pressed"); + enemy.hp -= player.moveset[1].degat; + println!("enemi prend {} degat", player.moveset[1].degat); + } + BtnAction::Cap3 => { + println!("button cap1 pressed"); + enemy.hp -= player.moveset[2].degat; + println!("enemi prend {} degat", player.moveset[2].degat); + } + BtnAction::Cap4 => { + println!("button cap1 pressed"); + enemy.hp -= player.moveset[3].degat; + println!("enemi prend {} degat", player.moveset[0].degat); + } + } + } + combat_state.set(CombatState::ETurn); } } *color = PRESSED_BUTTON.into(); @@ -223,41 +281,49 @@ fn button_system( } } -fn player_attack( - mut enemies: Query<(&mut Enemy)>, - mut players: Query<(&Player)>, +fn enemy_attack( + mut enemies: Query<(&Enemy)>, + mut players: Query<(&mut Player)>, mut combat_state: ResMut<NextState<CombatState>>, ) { - println!("entered player_attack()"); - for mut enemy in &mut enemies { - println!("enemy tag is{}", enemy.tag); + for (mut enemy) in &enemies { if enemy.tag == true { - for player in &players { - enemy.hp -= player.moveset[ATTACKNO.load(Ordering::Relaxed)].degat; + for (mut player) in &mut players { + player.hp -= enemy.nbdegat; println!( - "enemi prend {} degat", - player.moveset[ATTACKNO.load(Ordering::Relaxed)].degat + "joueur prend {} degats, joueur a {} hp", + enemy.nbdegat, player.hp ); } } } - combat_state.set(CombatState::ETurn); + combat_state.set(CombatState::PrepareAttack); } -fn enemy_attack( - mut enemies: Query<(&Enemy)>, - mut players: Query<(&mut Player)>, - mut combat_state: ResMut<NextState<CombatState>>, +fn update_hp( + enemies: Query<&Enemy>, + players: Query<&Player>, + mut entity_hp: Query<(&mut Text, &CombatText)>, ) { - for (mut enemy) in &enemies { - if enemy.tag == true { - for (mut player) in &mut players { - player.hp -= enemy.nbdegat; - println!("joueur prend {} degats", enemy.nbdegat); + for (mut ehp, et) in &mut entity_hp { + for player in &players { + for enemy in &enemies { + if enemy.tag == true { + if ehp.sections[0].style.color == Color::RED { + ehp.sections[0].value = format!("Enemy HP: {}", enemy.hp); + } else { + ehp.sections[0].value = format!("Player HP: {}", player.hp); + } + println!("enemy hp is {}", enemy.hp); + } } } } - combat_state.set(CombatState::PrepareAttack); + //for (mut php, pt) in &mut player_hp { + // for player in &players { + // php.sections[0].value = format!("Player HP: {}", player.hp); + // } + //} } fn combat_outcome( @@ -284,8 +350,13 @@ fn combat_outcome( } } -fn exit_combat(mut combat_ui: Query<(Entity, &Transform, &OnMainCombat)>, mut commands: Commands) { +fn exit_combat( + mut combat_ui: Query<(Entity, &Transform, &OnMainCombat)>, + mut commands: Commands, + mut game_state: ResMut<NextState<GameState>>, +) { for (ui_id, _transform, _onmaincombat) in &combat_ui { commands.entity(ui_id).despawn_recursive(); } + game_state.set(GameState::GameOver); } diff --git a/game/src/main.rs b/game/src/main.rs index f2f9259ebb2b02613416614cb608c303250e0822..436a7bbc27032ba77eccfdcff66f90cd41b80364 100644 --- a/game/src/main.rs +++ b/game/src/main.rs @@ -33,6 +33,7 @@ pub enum GameState { #[default] Overworld, Combat, + GameOver, } fn setup(mut commands: Commands) { commands.spawn(Camera2dBundle::default());