diff --git a/src/app/states/skirmish_states/board.rs b/src/app/states/skirmish_states/board.rs index a86a1ea..01d9e0b 100644 --- a/src/app/states/skirmish_states/board.rs +++ b/src/app/states/skirmish_states/board.rs @@ -5,11 +5,13 @@ use crate::app::{ skirmish_states::{ CellSizes, MarkedCells, MoveFocusedCell, Players, ZoomLevel, structures::{BaseBuilding, Ore, Stone, Structures}, - units::{MinerUnit, Units}, + tasks::{DiggingTask, Tasks}, + units::{MinerUnit, Unit, Units}, }, }, widgets::CellWidget, }; +use log::info; use ratatui::layout::Rect; use std::collections::VecDeque; @@ -87,9 +89,15 @@ impl BoardState { }; let unit: Option = if player_base { - Some(Units::Miner(MinerUnit::new(Players::Player))) + Some(Units::Miner(MinerUnit::new( + Players::Player, + player_base_coords, + ))) } else if enemy_base { - Some(Units::Miner(MinerUnit::new(Players::Enemy))) + Some(Units::Miner(MinerUnit::new( + Players::Enemy, + enemy_base_coords, + ))) } else { None }; @@ -161,6 +169,8 @@ impl BoardState { self.marked_cells .marked_cells .push_back((new_cell.0, new_cell.1)); + + info!("{:?}", self.marked_cells); } pub fn undo_marked_cell(&mut self) { @@ -198,8 +208,8 @@ impl BoardState { let cell: &mut CellWidget = self.get_mut_cell(row, col); cell.set_marked(true); - self.marked_cells.selected_unit = cell.get_option_unit(); + self.marked_cells.selected_unit = cell.get_option_unit(); self.marked_cells.marked_cells.push_back((row, col)); } @@ -208,6 +218,13 @@ impl BoardState { self.get_mut_cell(row, col).set_marked(false); } + let (row, col) = self.marked_cells.selected_unit.get_coords(); + let task: Tasks = Tasks::Digging(DiggingTask::new(self.marked_cells.marked_cells.clone())); + let unit: &mut Option = self.get_mut_cell(row, col).get_mut_option_unit(); + + unit.set_task(task); + + self.marked_cells.selected_unit = None; self.marked_cells.marked_cells.clear(); } diff --git a/src/app/states/skirmish_states/units/miner.rs b/src/app/states/skirmish_states/units/miner.rs index 7302242..47e43f0 100644 --- a/src/app/states/skirmish_states/units/miner.rs +++ b/src/app/states/skirmish_states/units/miner.rs @@ -7,16 +7,18 @@ pub struct MinerUnit { hp: u16, can_dig: bool, digging_power: f32, - pub tasks: VecDeque, + coords: (usize, usize), + tasks: VecDeque, } impl MinerUnit { - pub fn new(owner: Players) -> Self { + pub fn new(owner: Players, coords: (usize, usize)) -> Self { Self { owner, hp: 100, can_dig: true, digging_power: 0.55, + coords, tasks: VecDeque::new(), } } @@ -50,4 +52,12 @@ impl Unit for MinerUnit { fn get_digging_power(&self) -> f32 { self.digging_power } + + fn get_coords(&self) -> (usize, usize) { + self.coords + } + + fn set_task(&mut self, task: Tasks) { + self.tasks.push_back(task); + } } diff --git a/src/app/states/skirmish_states/units/unit_trait.rs b/src/app/states/skirmish_states/units/unit_trait.rs index aeaa6c8..561f451 100644 --- a/src/app/states/skirmish_states/units/unit_trait.rs +++ b/src/app/states/skirmish_states/units/unit_trait.rs @@ -1,4 +1,4 @@ -use crate::app::states::skirmish_states::Players; +use crate::app::states::skirmish_states::{Players, tasks::Tasks}; use ratatui::{ style::Stylize, text::{Line, Span}, @@ -23,6 +23,10 @@ pub trait Unit { fn get_digging_power(&self) -> f32; + fn get_coords(&self) -> (usize, usize); + + fn set_task(&mut self, task: Tasks); + fn base_text(&self) -> Vec> { let owner: Span<'_> = self.get_owner().get_span(); let hp: u16 = self.get_hp(); diff --git a/src/app/states/skirmish_states/units/units_enum.rs b/src/app/states/skirmish_states/units/units_enum.rs index 2276e97..a0681e9 100644 --- a/src/app/states/skirmish_states/units/units_enum.rs +++ b/src/app/states/skirmish_states/units/units_enum.rs @@ -1,5 +1,6 @@ use crate::app::states::skirmish_states::{ Players, + tasks::Tasks, units::{MinerUnit, Unit}, }; @@ -15,6 +16,13 @@ impl Units { Self::Miner(m) => m, } } + + #[inline] + fn u_mut(&mut self) -> &mut dyn Unit { + match self { + Self::Miner(m) => m, + } + } } impl Unit for Units { @@ -45,6 +53,14 @@ impl Unit for Units { fn get_digging_power(&self) -> f32 { self.u().get_digging_power() } + + fn get_coords(&self) -> (usize, usize) { + self.u().get_coords() + } + + fn set_task(&mut self, task: Tasks) { + self.u_mut().set_task(task); + } } impl Unit for Option { @@ -79,4 +95,12 @@ impl Unit for Option { fn get_digging_power(&self) -> f32 { self.as_ref().map_or(0.0, |u| u.get_digging_power()) } + + fn get_coords(&self) -> (usize, usize) { + self.as_ref().map_or((0, 0), |u| u.get_coords()) + } + + fn set_task(&mut self, task: Tasks) { + self.as_mut().map_or((), |u| u.set_task(task)) + } } diff --git a/src/app/widgets/cell.rs b/src/app/widgets/cell.rs index bd2cb0d..f3ba1a4 100644 --- a/src/app/widgets/cell.rs +++ b/src/app/widgets/cell.rs @@ -60,6 +60,14 @@ impl CellWidget { self.unit.clone() } + pub fn get_ref_option_unit(&self) -> &Option { + &self.unit + } + + pub fn get_mut_option_unit(&mut self) -> &mut Option { + &mut self.unit + } + pub fn set_structure(&mut self, structure: Structures) -> &mut Self { self.structure = structure; self