diff --git a/src/components/mod.rs b/src/components/mod.rs deleted file mode 100644 index 03bc99f..0000000 --- a/src/components/mod.rs +++ /dev/null @@ -1,5 +0,0 @@ -pub mod phase; -pub mod pom; -pub mod savegame; -pub mod tile; -pub mod ui; diff --git a/src/config.rs b/src/features/config/components.rs similarity index 60% rename from src/config.rs rename to src/features/config/components.rs index 74b828b..94fb4fc 100644 --- a/src/config.rs +++ b/src/features/config/components.rs @@ -1,5 +1,4 @@ -use bevy::prelude::*; -use serde::Deserialize; +use crate::prelude::*; use std::fs::File; use std::io::BufReader; @@ -20,8 +19,10 @@ impl Default for GameConfig { } } -pub fn read_config() -> Option { - let file = File::open("assets/config.json").ok()?; - let reader = BufReader::new(file); - serde_json::from_reader(reader).ok() +impl GameConfig { + pub fn read_config() -> Option { + let file = File::open("assets/config.json").ok()?; + let reader = BufReader::new(file); + serde_json::from_reader(reader).ok() + } } diff --git a/src/features/config/mod.rs b/src/features/config/mod.rs new file mode 100644 index 0000000..f188f2c --- /dev/null +++ b/src/features/config/mod.rs @@ -0,0 +1 @@ +pub mod components; diff --git a/src/plugins/core.rs b/src/features/core/mod.rs similarity index 86% rename from src/plugins/core.rs rename to src/features/core/mod.rs index fd2d174..bc0e573 100644 --- a/src/plugins/core.rs +++ b/src/features/core/mod.rs @@ -1,5 +1,6 @@ -use crate::states::*; -use bevy::prelude::*; +use crate::prelude::*; + +pub mod states; pub struct CorePlugin; diff --git a/src/features/core/states.rs b/src/features/core/states.rs new file mode 100644 index 0000000..e14ed92 --- /dev/null +++ b/src/features/core/states.rs @@ -0,0 +1,8 @@ +use crate::prelude::*; + +#[derive(States, Clone, PartialEq, Eq, Debug, Hash, Default)] +pub enum AppState { + #[default] + StartScreen, + GameScreen, +} diff --git a/src/plugins/game_screen.rs b/src/features/game_screen/mod.rs similarity index 90% rename from src/plugins/game_screen.rs rename to src/features/game_screen/mod.rs index 6a6e656..9f503b7 100644 --- a/src/plugins/game_screen.rs +++ b/src/features/game_screen/mod.rs @@ -1,5 +1,4 @@ -use crate::states::*; -use bevy::prelude::*; +use crate::prelude::*; pub struct GameScreenPlugin; diff --git a/src/components/tile.rs b/src/features/grid/components.rs similarity index 93% rename from src/components/tile.rs rename to src/features/grid/components.rs index 9bb994c..6875de2 100644 --- a/src/components/tile.rs +++ b/src/features/grid/components.rs @@ -1,7 +1,5 @@ -use bevy::prelude::*; -use serde::{Deserialize, Serialize}; - -use crate::errors::GridError; +use super::errors::GridError; +use crate::prelude::*; #[derive(Component)] pub struct Tile { diff --git a/src/features/grid/consts.rs b/src/features/grid/consts.rs new file mode 100644 index 0000000..bc45548 --- /dev/null +++ b/src/features/grid/consts.rs @@ -0,0 +1 @@ +pub const TILE_SIZE: f32 = 32.0; diff --git a/src/errors.rs b/src/features/grid/errors.rs similarity index 100% rename from src/errors.rs rename to src/features/grid/errors.rs diff --git a/src/plugins/grid.rs b/src/features/grid/mod.rs similarity index 65% rename from src/plugins/grid.rs rename to src/features/grid/mod.rs index d6e6026..1f06f99 100644 --- a/src/plugins/grid.rs +++ b/src/features/grid/mod.rs @@ -1,19 +1,9 @@ -use crate::{ - components::tile::{Grid, Tile, TileState}, - config::GameConfig, - states::AppState, -}; -use bevy::prelude::*; -use bevy_aseprite_ultra::prelude::AseSlice; +use crate::prelude::*; -pub const TILE_SIZE: f32 = 32.0; - -pub fn grid_start_x(grid_width: u32) -> f32 { - -(grid_width as f32 * TILE_SIZE) / 2.0 + TILE_SIZE / 2.0 -} -pub fn grid_start_y(grid_height: u32) -> f32 { - -(grid_height as f32 * TILE_SIZE) / 2.0 + TILE_SIZE / 2.0 -} +pub mod components; +pub mod consts; +pub mod errors; +pub mod utils; pub struct GridPlugin; @@ -94,37 +84,3 @@ fn update_tile_colors( }; } } - -pub fn world_to_grid_coords(world_pos: Vec3, grid_width: u32, grid_height: u32) -> (u32, u32) { - let start_x = grid_start_x(grid_width); - let start_y = grid_start_y(grid_height); - - let x = ((world_pos.x - start_x + TILE_SIZE / 2.0) / TILE_SIZE).floor(); - let y = ((world_pos.y - start_y + TILE_SIZE / 2.0) / TILE_SIZE).floor(); - - let mut x_u32 = x as u32; - let mut y_u32 = y as u32; - - if x_u32 >= grid_width { - x_u32 = grid_width - 1; - } - if y_u32 >= grid_height { - y_u32 = grid_height - 1; - } - - (x_u32, y_u32) -} - -pub fn grid_to_world_coords( - grid_x: u32, - grid_y: u32, - z: Option, - grid_width: u32, - grid_height: u32, -) -> Vec3 { - Vec3::new( - grid_start_x(grid_width) + grid_x as f32 * TILE_SIZE, - grid_start_y(grid_height) + grid_y as f32 * TILE_SIZE, - z.unwrap_or(0.0), - ) -} diff --git a/src/features/grid/utils.rs b/src/features/grid/utils.rs new file mode 100644 index 0000000..3c032da --- /dev/null +++ b/src/features/grid/utils.rs @@ -0,0 +1,43 @@ +use crate::prelude::*; + +pub fn grid_start_x(grid_width: u32) -> f32 { + -(grid_width as f32 * TILE_SIZE) / 2.0 + TILE_SIZE / 2.0 +} + +pub fn grid_start_y(grid_height: u32) -> f32 { + -(grid_height as f32 * TILE_SIZE) / 2.0 + TILE_SIZE / 2.0 +} + +pub fn world_to_grid_coords(world_pos: Vec3, grid_width: u32, grid_height: u32) -> (u32, u32) { + let start_x = grid_start_x(grid_width); + let start_y = grid_start_y(grid_height); + + let x = ((world_pos.x - start_x + TILE_SIZE / 2.0) / TILE_SIZE).floor(); + let y = ((world_pos.y - start_y + TILE_SIZE / 2.0) / TILE_SIZE).floor(); + + let mut x_u32 = x as u32; + let mut y_u32 = y as u32; + + if x_u32 >= grid_width { + x_u32 = grid_width - 1; + } + if y_u32 >= grid_height { + y_u32 = grid_height - 1; + } + + (x_u32, y_u32) +} + +pub fn grid_to_world_coords( + grid_x: u32, + grid_y: u32, + z: Option, + grid_width: u32, + grid_height: u32, +) -> Vec3 { + Vec3::new( + grid_start_x(grid_width) + grid_x as f32 * TILE_SIZE, + grid_start_y(grid_height) + grid_y as f32 * TILE_SIZE, + z.unwrap_or(0.0), + ) +} diff --git a/src/plugins/input.rs b/src/features/input/mod.rs similarity index 89% rename from src/plugins/input.rs rename to src/features/input/mod.rs index e6c4af6..ce12444 100644 --- a/src/plugins/input.rs +++ b/src/features/input/mod.rs @@ -1,17 +1,10 @@ -use bevy::input::mouse::MouseButton; -use bevy::prelude::*; -use bevy::window::PrimaryWindow; - -use crate::components::phase::{CurrentPhase, Phase}; -use crate::components::tile::{Grid, TileState}; -use crate::config::GameConfig; -use crate::messages::phase::{NextPhaseMessage, PhaseTimerPauseMessage}; -use crate::messages::{ - interact::InteractStartMessage, - r#move::{InvalidMoveMessage, MoveMessage}, +use crate::features::{ + phase::messages::{NextPhaseMessage, PhaseTimerPauseMessage}, + pom::messages::InvalidMoveMessage, }; -use crate::plugins::grid::world_to_grid_coords; -use crate::states::AppState; +use crate::prelude::*; +use bevy::input::mouse::MouseButton; +use bevy::window::PrimaryWindow; pub struct InputPlugin; diff --git a/src/plugins/mod.rs b/src/features/mod.rs similarity index 93% rename from src/plugins/mod.rs rename to src/features/mod.rs index a387290..ea4140a 100644 --- a/src/plugins/mod.rs +++ b/src/features/mod.rs @@ -1,3 +1,4 @@ +pub mod config; pub mod core; pub mod game_screen; pub mod grid; @@ -7,6 +8,7 @@ pub mod pom; pub mod savegame; pub mod start_screen; pub mod status; +pub mod ui; pub use core::CorePlugin; pub use game_screen::GameScreenPlugin; diff --git a/src/components/phase.rs b/src/features/phase/components.rs similarity index 79% rename from src/components/phase.rs rename to src/features/phase/components.rs index 1fee59a..2fb7857 100644 --- a/src/components/phase.rs +++ b/src/features/phase/components.rs @@ -1,5 +1,5 @@ -use bevy::prelude::*; -use serde::{Deserialize, Serialize}; +use super::utils::format_time; +use crate::prelude::*; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub enum Phase { @@ -9,21 +9,6 @@ pub enum Phase { Finished { completed_phase: Box }, } -fn format_time(seconds: f32) -> String { - let seconds = seconds.max(0.0) as u32; - - if seconds >= 3600 { - let hours = seconds / 3600; - let minutes = (seconds % 3600) / 60; - let secs = seconds % 60; - format!("{:02}:{:02}:{:02}", hours, minutes, secs) - } else { - let minutes = seconds / 60; - let secs = seconds % 60; - format!("{:02}:{:02}", minutes, secs) - } -} - impl Phase { pub fn ui_color(&self) -> Color { match self { diff --git a/src/messages/phase.rs b/src/features/phase/messages.rs similarity index 76% rename from src/messages/phase.rs rename to src/features/phase/messages.rs index 3ecb181..620aad1 100644 --- a/src/messages/phase.rs +++ b/src/features/phase/messages.rs @@ -1,5 +1,4 @@ -use crate::components::phase::Phase; -use bevy::prelude::*; +use crate::prelude::*; #[derive(Message)] pub struct PhaseTimerFinishedMessage { diff --git a/src/plugins/phase.rs b/src/features/phase/mod.rs similarity index 95% rename from src/plugins/phase.rs rename to src/features/phase/mod.rs index 66c3662..5c16d7c 100644 --- a/src/plugins/phase.rs +++ b/src/features/phase/mod.rs @@ -1,9 +1,11 @@ -use crate::{ - components::phase::*, - messages::{phase::*, savegame::SavegameDumpMessage}, - states::AppState, -}; -use bevy::prelude::*; +use crate::features::savegame::messages::SavegameDumpMessage; +use crate::prelude::*; +use components::{SessionTracker, TimerSettings}; +use messages::*; + +pub mod components; +pub mod messages; +pub mod utils; pub struct PhasePlugin; diff --git a/src/features/phase/utils.rs b/src/features/phase/utils.rs new file mode 100644 index 0000000..fb280fe --- /dev/null +++ b/src/features/phase/utils.rs @@ -0,0 +1,14 @@ +pub fn format_time(seconds: f32) -> String { + let seconds = seconds.max(0.0) as u32; + + if seconds >= 3600 { + let hours = seconds / 3600; + let minutes = (seconds % 3600) / 60; + let secs = seconds % 60; + format!("{:02}:{:02}:{:02}", hours, minutes, secs) + } else { + let minutes = seconds / 60; + let secs = seconds % 60; + format!("{:02}:{:02}", minutes, secs) + } +} diff --git a/src/components/pom.rs b/src/features/pom/components.rs similarity index 92% rename from src/components/pom.rs rename to src/features/pom/components.rs index 5b6c5a8..7cf4043 100644 --- a/src/components/pom.rs +++ b/src/features/pom/components.rs @@ -1,8 +1,6 @@ +use crate::prelude::*; use std::collections::VecDeque; -use bevy::prelude::*; -use serde::{Deserialize, Serialize}; - #[derive(Component)] pub struct Pom; diff --git a/src/messages/move.rs b/src/features/pom/messages.rs similarity index 58% rename from src/messages/move.rs rename to src/features/pom/messages.rs index 9567306..b823c29 100644 --- a/src/messages/move.rs +++ b/src/features/pom/messages.rs @@ -1,4 +1,4 @@ -use bevy::prelude::*; +use crate::prelude::*; #[derive(Message)] pub struct MoveMessage { @@ -10,3 +10,9 @@ pub struct MoveMessage { pub struct InvalidMoveMessage { pub message: String, } + +#[derive(Message)] +pub struct InteractStartMessage { + pub x: u32, + pub y: u32, +} diff --git a/src/plugins/pom.rs b/src/features/pom/mod.rs similarity index 92% rename from src/plugins/pom.rs rename to src/features/pom/mod.rs index f7c2afa..ce4a7d5 100644 --- a/src/plugins/pom.rs +++ b/src/features/pom/mod.rs @@ -1,12 +1,11 @@ -use crate::components::pom::{GridPosition, MovingState, PathQueue, Pom}; -use crate::components::tile::{Grid, TileState}; -use crate::config::GameConfig; -use crate::messages::r#move::{InvalidMoveMessage, MoveMessage}; -use crate::plugins::grid::{TILE_SIZE, grid_to_world_coords}; -use crate::states::*; -use crate::utils::pathfinding::find_path; -use bevy::prelude::*; -use bevy_aseprite_ultra::prelude::*; +use crate::prelude::*; +use components::*; +use messages::InvalidMoveMessage; +use utils::find_path; + +pub mod components; +pub mod messages; +pub mod utils; pub struct PomPlugin; diff --git a/src/utils/pathfinding.rs b/src/features/pom/utils.rs similarity index 97% rename from src/utils/pathfinding.rs rename to src/features/pom/utils.rs index 6b6d56f..73ad8fb 100644 --- a/src/utils/pathfinding.rs +++ b/src/features/pom/utils.rs @@ -1,5 +1,4 @@ -use crate::components::tile::{Grid, TileState}; -use bevy::prelude::*; +use crate::prelude::*; use std::cmp::Ordering; use std::collections::{BinaryHeap, HashMap, VecDeque}; diff --git a/src/components/savegame.rs b/src/features/savegame/components.rs similarity index 97% rename from src/components/savegame.rs rename to src/features/savegame/components.rs index 88c6015..2bccd54 100644 --- a/src/components/savegame.rs +++ b/src/features/savegame/components.rs @@ -1,4 +1,4 @@ -use bevy::prelude::*; +use crate::prelude::*; use directories::ProjectDirs; use std::path::PathBuf; diff --git a/src/messages/savegame.rs b/src/features/savegame/messages.rs similarity index 69% rename from src/messages/savegame.rs rename to src/features/savegame/messages.rs index b084cb2..a67f4c2 100644 --- a/src/messages/savegame.rs +++ b/src/features/savegame/messages.rs @@ -1,4 +1,4 @@ -use bevy::prelude::*; +use crate::prelude::*; #[derive(Message)] pub struct SavegameDumpMessage; diff --git a/src/plugins/savegame.rs b/src/features/savegame/mod.rs similarity index 89% rename from src/plugins/savegame.rs rename to src/features/savegame/mod.rs index f936420..b0d1cef 100644 --- a/src/plugins/savegame.rs +++ b/src/features/savegame/mod.rs @@ -1,18 +1,12 @@ -use crate::{ - components::{ - phase::{CurrentPhase, SessionTracker, TimerSettings}, - pom::{GridPosition, Pom}, - savegame::SavegamePath, - tile::{Grid, TileState}, - }, - messages::savegame::*, - states::AppState, -}; -use bevy::prelude::*; -use serde::{Deserialize, Serialize}; +use crate::features::phase::components::{SessionTracker, TimerSettings}; +use crate::prelude::*; +use messages::*; use std::fs::File; use std::io::Write; +pub mod components; +pub mod messages; + pub struct SavegamePlugin; impl Plugin for SavegamePlugin { diff --git a/src/plugins/start_screen.rs b/src/features/start_screen/mod.rs similarity index 98% rename from src/plugins/start_screen.rs rename to src/features/start_screen/mod.rs index f20f9b9..1860931 100644 --- a/src/plugins/start_screen.rs +++ b/src/features/start_screen/mod.rs @@ -1,5 +1,4 @@ -use crate::{components::savegame::SavegamePath, states::*}; -use bevy::prelude::*; +use crate::prelude::*; pub struct StartScreenPlugin; diff --git a/src/plugins/status.rs b/src/features/status/mod.rs similarity index 95% rename from src/plugins/status.rs rename to src/features/status/mod.rs index bda69a7..85b2fb6 100644 --- a/src/plugins/status.rs +++ b/src/features/status/mod.rs @@ -1,9 +1,5 @@ -use crate::{ - components::{phase::CurrentPhase, ui::*}, - messages::savegame::SavegameDumpMessage, - states::AppState, -}; -use bevy::prelude::*; +use crate::features::savegame::messages::SavegameDumpMessage; +use crate::prelude::*; pub struct StatusPlugin; diff --git a/src/components/ui.rs b/src/features/ui/components.rs similarity index 90% rename from src/components/ui.rs rename to src/features/ui/components.rs index 33e0dd2..827d43e 100644 --- a/src/components/ui.rs +++ b/src/features/ui/components.rs @@ -1,4 +1,4 @@ -use bevy::prelude::*; +use crate::prelude::*; #[derive(Component)] pub struct UiStatusRootContainer; diff --git a/src/features/ui/mod.rs b/src/features/ui/mod.rs new file mode 100644 index 0000000..f188f2c --- /dev/null +++ b/src/features/ui/mod.rs @@ -0,0 +1 @@ +pub mod components; diff --git a/src/lib.rs b/src/lib.rs index 4c07870..e570eb4 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,7 +1,2 @@ -pub mod components; -pub mod config; -pub mod errors; -pub mod messages; -pub mod plugins; -pub mod states; -pub mod utils; +pub mod features; +pub mod prelude; diff --git a/src/main.rs b/src/main.rs index c143b41..07d07a9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,8 @@ -use bevy::prelude::*; -use bevy_aseprite_ultra::prelude::*; use bevy_dev_tools::fps_overlay::*; -use pomomon_garden::config::{GameConfig, read_config}; -use pomomon_garden::plugins; +use pomomon_garden::prelude::*; fn main() { - let config = read_config().unwrap_or(GameConfig::default()); + let config = GameConfig::read_config().unwrap_or(GameConfig::default()); App::new() .add_plugins(( @@ -25,15 +22,15 @@ fn main() { }, },)) .add_plugins(( - plugins::CorePlugin, - plugins::StartScreenPlugin, - plugins::GameScreenPlugin, - plugins::GridPlugin, - plugins::PomPlugin, - plugins::InputPlugin, - plugins::PhasePlugin, - plugins::StatusPlugin, - plugins::SavegamePlugin, + features::CorePlugin, + features::StartScreenPlugin, + features::GameScreenPlugin, + features::GridPlugin, + features::PomPlugin, + features::InputPlugin, + features::PhasePlugin, + features::StatusPlugin, + features::SavegamePlugin, )) .insert_resource(config) .run(); diff --git a/src/messages/interact.rs b/src/messages/interact.rs deleted file mode 100644 index edd2a8d..0000000 --- a/src/messages/interact.rs +++ /dev/null @@ -1,7 +0,0 @@ -use bevy::prelude::*; - -#[derive(Message)] -pub struct InteractStartMessage { - pub x: u32, - pub y: u32, -} diff --git a/src/messages/mod.rs b/src/messages/mod.rs deleted file mode 100644 index de05e56..0000000 --- a/src/messages/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod interact; -pub mod r#move; -pub mod phase; -pub mod savegame; diff --git a/src/prelude.rs b/src/prelude.rs new file mode 100644 index 0000000..ed5c227 --- /dev/null +++ b/src/prelude.rs @@ -0,0 +1,20 @@ +pub use crate::features; +pub use crate::features::{ + config::components::GameConfig, + core::states::AppState, + grid::{ + components::{Grid, Tile, TileState}, + consts::TILE_SIZE, + utils::{grid_to_world_coords, world_to_grid_coords}, + }, + phase::components::{CurrentPhase, Phase}, + pom::{ + components::{GridPosition, MovingState, Pom}, + messages::{InteractStartMessage, MoveMessage}, + }, + savegame::components::SavegamePath, + ui::components::*, +}; +pub use bevy::prelude::*; +pub use bevy_aseprite_ultra::prelude::*; +pub use serde::{Deserialize, Serialize}; diff --git a/src/states.rs b/src/states.rs deleted file mode 100644 index 8598ef3..0000000 --- a/src/states.rs +++ /dev/null @@ -1,8 +0,0 @@ -use bevy::prelude::*; - -#[derive(States, Clone, PartialEq, Eq, Debug, Hash, Default, Reflect)] -pub enum AppState { - #[default] - StartScreen, - GameScreen, -} diff --git a/src/utils/mod.rs b/src/utils/mod.rs deleted file mode 100644 index 1bc27c5..0000000 --- a/src/utils/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod pathfinding;