Skip to content
Snippets Groups Projects
Verified Commit bb604c14 authored by Louis's avatar Louis :fire:
Browse files

Create turns based on who can act

parent abe81e44
No related branches found
No related tags found
No related merge requests found
Pipeline #179 passed with warnings with stages
in 3 minutes and 16 seconds
...@@ -11,3 +11,5 @@ pub struct Meander; ...@@ -11,3 +11,5 @@ pub struct Meander;
#[derive(Copy, Clone, Debug, Component)] #[derive(Copy, Clone, Debug, Component)]
pub struct ShouldAct; pub struct ShouldAct;
#[derive(Copy, Clone, Debug, Component)]
pub struct Automated;
...@@ -18,6 +18,13 @@ mod __plugin { ...@@ -18,6 +18,13 @@ mod __plugin {
.run_in_state(AppState::InGame) .run_in_state(AppState::InGame)
.with_system(super::player::handle_player_input) .with_system(super::player::handle_player_input)
.into(), .into(),
)
.add_system_set_to_stage(
CoreStage::PostUpdate,
ConditionSet::new()
.run_in_state(AppState::InGame)
.with_system(super::player::reset_player_action)
.into(),
); );
} }
} }
......
...@@ -3,6 +3,7 @@ use std::time::Duration; ...@@ -3,6 +3,7 @@ use std::time::Duration;
use bevy::math::ivec2; use bevy::math::ivec2;
use bevy::prelude::*; use bevy::prelude::*;
use crate::control::ai::{Automated, ShouldAct};
use crate::entities::lifecycle::Player; use crate::entities::lifecycle::Player;
use crate::entities::timing::ActionCooldown; use crate::entities::timing::ActionCooldown;
use crate::world::level_map::GridPosition; use crate::world::level_map::GridPosition;
...@@ -10,7 +11,11 @@ use crate::world::level_map::GridPosition; ...@@ -10,7 +11,11 @@ use crate::world::level_map::GridPosition;
pub fn handle_player_input( pub fn handle_player_input(
mut commands: Commands, mut commands: Commands,
input: Res<Input<KeyCode>>, input: Res<Input<KeyCode>>,
mut query: Query<(Entity, &mut GridPosition), (With<Player>, Without<ActionCooldown>)>, mut player_query: Query<
(Entity, &mut GridPosition),
(With<Player>, With<ShouldAct>, Without<ActionCooldown>),
>,
npc_query: Query<Entity, (With<Automated>, Without<ShouldAct>)>,
) { ) {
let mut dx = 0; let mut dx = 0;
let mut dy = 0; let mut dy = 0;
...@@ -28,13 +33,32 @@ pub fn handle_player_input( ...@@ -28,13 +33,32 @@ pub fn handle_player_input(
dy -= 1; dy -= 1;
} }
for (entity, mut position) in &mut query { if dx != 0 || dy != 0 {
if dx != 0 || dy != 0 { for (entity, mut position) in &mut player_query {
let next_position = (position.0.as_ivec2()) + ivec2(dx, dy); if dx != 0 || dy != 0 {
**position = next_position.as_uvec2(); let next_position = (position.0.as_ivec2()) + ivec2(dx, dy);
commands **position = next_position.as_uvec2();
.entity(entity) commands
.insert(ActionCooldown::from(Duration::from_millis(250))); .entity(entity)
.insert(ActionCooldown::from(Duration::from_millis(250)))
.remove::<ShouldAct>();
}
}
for entity in &npc_query {
commands.entity(entity).insert(ShouldAct);
}
}
}
pub fn reset_player_action(
mut commands: Commands,
player_query: Query<Entity, (With<Player>, Without<ShouldAct>)>,
npc_query: Query<(), (With<Automated>, With<ShouldAct>)>,
) {
if npc_query.iter().len() == 0 {
for entity in &player_query {
commands.entity(entity).insert(ShouldAct);
} }
} }
} }
use bevy::math::uvec2; use bevy::math::uvec2;
use bevy::prelude::*; use bevy::prelude::*;
use iyes_loopless::prelude::AppLooplessStateExt; use iyes_loopless::prelude::{AppLooplessStateExt, ConditionSet};
use iyes_loopless::state::NextState; use iyes_loopless::state::NextState;
use crate::assets::AssetHandles; use crate::assets::AssetHandles;
use crate::entities::lifecycle::Player;
use crate::system::flow::AppState; use crate::system::flow::AppState;
use crate::world::generators::blobular::Blobular; use crate::world::generators::blobular::Blobular;
use crate::world::generators::drunkard_corridor::DrunkardGenerator; use crate::world::generators::drunkard_corridor::DrunkardGenerator;
use crate::world::level_map::LevelMapBundle; use crate::world::level_map::{LevelMap, LevelMapBundle};
pub fn spawn_player(mut commands: Commands) { pub fn spawn_player(mut commands: Commands) {
commands.spawn_bundle(LevelMapBundle::generate::<DrunkardGenerator>(150, 150)); commands.spawn_bundle(LevelMapBundle::generate::<DrunkardGenerator>(150, 150));
...@@ -68,12 +69,43 @@ pub fn skip_menu(mut commands: Commands) { ...@@ -68,12 +69,43 @@ pub fn skip_menu(mut commands: Commands) {
commands.insert_resource(NextState(AppState::InGame)); commands.insert_resource(NextState(AppState::InGame));
} }
pub fn regen_map(
mut commands: Commands,
input: Res<Input<KeyCode>>,
map_query: Query<Entity, With<LevelMap>>,
player_query: Query<Entity, With<Player>>,
) {
if input.just_pressed(KeyCode::Equals) {
for entity in &map_query {
commands.entity(entity).despawn_recursive();
}
for entity in &player_query {
commands.entity(entity).despawn_recursive();
}
commands.spawn_bundle(LevelMapBundle::generate::<DrunkardGenerator>(100, 100));
} else if input.just_pressed(KeyCode::Minus) {
for entity in &map_query {
commands.entity(entity).despawn_recursive();
}
for entity in &player_query {
commands.entity(entity).despawn_recursive();
}
commands.spawn_bundle(LevelMapBundle::generate::<Blobular>(100, 100));
}
}
pub struct DebugPlugin; pub struct DebugPlugin;
impl Plugin for DebugPlugin { impl Plugin for DebugPlugin {
fn build(&self, app: &mut App) { fn build(&self, app: &mut App) {
app.add_enter_system(AppState::Menu, skip_menu) app.add_enter_system(AppState::Menu, skip_menu)
.add_enter_system(AppState::Menu, spawn_fps_overlay) .add_enter_system(AppState::Menu, spawn_fps_overlay)
.add_enter_system(AppState::InGame, spawn_player) .add_enter_system(AppState::InGame, spawn_player)
.add_system(update_fps_text); .add_system(update_fps_text)
.add_system_set(
ConditionSet::new()
.run_in_state(AppState::InGame)
.with_system(regen_map)
.into(),
);
} }
} }
...@@ -2,6 +2,7 @@ use bevy::ecs::system::SystemParam; ...@@ -2,6 +2,7 @@ use bevy::ecs::system::SystemParam;
use bevy::prelude::*; use bevy::prelude::*;
use crate::assets::AssetHandles; use crate::assets::AssetHandles;
use crate::control::ai::ShouldAct;
use crate::entities::lifecycle::{GameEntity, Player}; use crate::entities::lifecycle::{GameEntity, Player};
use crate::system::camera::ChaseCam; use crate::system::camera::ChaseCam;
use crate::system::graphics::LAYER_CREATURE; use crate::system::graphics::LAYER_CREATURE;
...@@ -23,6 +24,7 @@ impl<'w, 's> EntitySpawner<'w, 's> { ...@@ -23,6 +24,7 @@ impl<'w, 's> EntitySpawner<'w, 's> {
.insert(ChaseCam) .insert(ChaseCam)
.insert(GameEntity) .insert(GameEntity)
.insert(Player) .insert(Player)
.insert(ShouldAct)
.insert(GridPosition(grid_position)); .insert(GridPosition(grid_position));
entity.insert_bundle(SpriteSheetBundle { entity.insert_bundle(SpriteSheetBundle {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment