122 lines
3.6 KiB
Rust
122 lines
3.6 KiB
Rust
use crate::features::{
|
|
phase::messages::{NextPhaseMessage, PhaseTimerPauseMessage},
|
|
pom::messages::InvalidMoveMessage,
|
|
};
|
|
use crate::prelude::*;
|
|
use bevy::input::mouse::MouseButton;
|
|
use bevy::window::PrimaryWindow;
|
|
|
|
pub struct InputPlugin;
|
|
|
|
impl Plugin for InputPlugin {
|
|
fn build(&self, app: &mut App) {
|
|
app.add_message::<MoveMessage>();
|
|
app.add_message::<InvalidMoveMessage>();
|
|
app.add_systems(Update, move_click.run_if(in_state(AppState::GameScreen)));
|
|
|
|
app.add_message::<InteractStartMessage>();
|
|
app.add_systems(
|
|
Update,
|
|
interact_click.run_if(in_state(AppState::GameScreen)),
|
|
);
|
|
|
|
app.add_message::<PhaseTimerPauseMessage>();
|
|
app.add_systems(
|
|
Update,
|
|
phase_timer_pause.run_if(in_state(AppState::GameScreen)),
|
|
);
|
|
|
|
app.add_message::<NextPhaseMessage>();
|
|
app.add_systems(Update, next_phase.run_if(in_state(AppState::GameScreen)));
|
|
}
|
|
}
|
|
|
|
fn move_click(
|
|
mut move_messages: MessageWriter<MoveMessage>,
|
|
mouse_btn: Res<ButtonInput<MouseButton>>,
|
|
window: Single<&Window, With<PrimaryWindow>>,
|
|
camera: Single<(&Camera, &GlobalTransform), With<Camera2d>>,
|
|
config: Res<GameConfig>,
|
|
phase: Res<CurrentPhase>,
|
|
) {
|
|
match phase.0 {
|
|
Phase::Focus { .. } => return,
|
|
_ => {}
|
|
}
|
|
|
|
if mouse_btn.just_pressed(MouseButton::Right) {
|
|
let (cam, cam_transform) = *camera;
|
|
|
|
let Some(cursor_pos) = window.cursor_position() else {
|
|
return;
|
|
};
|
|
let Ok(world_pos) = cam.viewport_to_world(cam_transform, cursor_pos) else {
|
|
return;
|
|
};
|
|
let (x, y) = world_to_grid_coords(world_pos.origin, config.grid_width, config.grid_height);
|
|
|
|
println!("Move Click: ({}, {})", x, y);
|
|
move_messages.write(MoveMessage { x, y });
|
|
}
|
|
}
|
|
|
|
fn interact_click(
|
|
mut interact_messages: MessageWriter<InteractStartMessage>,
|
|
mouse_btn: Res<ButtonInput<MouseButton>>,
|
|
window: Single<&Window, With<PrimaryWindow>>,
|
|
camera: Single<(&Camera, &GlobalTransform), With<Camera2d>>,
|
|
config: Res<GameConfig>,
|
|
phase: Res<CurrentPhase>,
|
|
// for debug
|
|
grid: ResMut<Grid>,
|
|
tile_query: Query<&mut TileState>,
|
|
) {
|
|
match phase.0 {
|
|
Phase::Focus { .. } => return,
|
|
_ => {}
|
|
}
|
|
|
|
if mouse_btn.just_pressed(MouseButton::Left) {
|
|
let (cam, cam_transform) = *camera;
|
|
|
|
let Some(cursor_pos) = window.cursor_position() else {
|
|
return;
|
|
};
|
|
let Ok(world_pos) = cam.viewport_to_world(cam_transform, cursor_pos) else {
|
|
return;
|
|
};
|
|
let (x, y) = world_to_grid_coords(world_pos.origin, config.grid_width, config.grid_height);
|
|
|
|
println!("Interact Click: ({}, {})", x, y);
|
|
interact_messages.write(InteractStartMessage { x, y });
|
|
|
|
if cfg!(debug_assertions) {
|
|
grid.map_tile_state(
|
|
(x, y),
|
|
|state| match state {
|
|
TileState::Unclaimed => TileState::Empty,
|
|
TileState::Empty => TileState::Occupied,
|
|
TileState::Occupied => TileState::Unclaimed,
|
|
},
|
|
tile_query,
|
|
)
|
|
.unwrap();
|
|
}
|
|
}
|
|
}
|
|
|
|
fn phase_timer_pause(
|
|
mut pause_messages: MessageWriter<PhaseTimerPauseMessage>,
|
|
keys: Res<ButtonInput<KeyCode>>,
|
|
) {
|
|
if keys.just_pressed(KeyCode::Space) {
|
|
pause_messages.write(PhaseTimerPauseMessage);
|
|
}
|
|
}
|
|
|
|
fn next_phase(mut messages: MessageWriter<NextPhaseMessage>, keys: Res<ButtonInput<KeyCode>>) {
|
|
if keys.just_pressed(KeyCode::Enter) {
|
|
messages.write(NextPhaseMessage);
|
|
}
|
|
}
|