Can change bot type in rules screen
This commit is contained in:
		| @@ -13,7 +13,8 @@ use tui::{Frame, Terminal}; | |||||||
|  |  | ||||||
| use sea_battle_backend::data::GameRules; | use sea_battle_backend::data::GameRules; | ||||||
|  |  | ||||||
| use crate::constants::TICK_RATE; | use crate::constants::{HIGHLIGHT_COLOR, TICK_RATE}; | ||||||
|  | use crate::ui_screens::select_bot_type::SelectBotTypeScreen; | ||||||
| use crate::ui_screens::utils::centered_rect_size; | use crate::ui_screens::utils::centered_rect_size; | ||||||
| use crate::ui_screens::ScreenResult; | use crate::ui_screens::ScreenResult; | ||||||
| use crate::ui_widgets::button_widget::ButtonWidget; | use crate::ui_widgets::button_widget::ButtonWidget; | ||||||
| @@ -27,6 +28,7 @@ enum EditingField { | |||||||
|     BoatsList, |     BoatsList, | ||||||
|     BoatsCanTouch, |     BoatsCanTouch, | ||||||
|     PlayerContinueOnHit, |     PlayerContinueOnHit, | ||||||
|  |     BotType, | ||||||
|     Cancel, |     Cancel, | ||||||
|     OK, |     OK, | ||||||
| } | } | ||||||
| @@ -70,6 +72,14 @@ impl GameRulesConfigurationScreen { | |||||||
|  |  | ||||||
|                         // Submit results |                         // Submit results | ||||||
|                         KeyCode::Enter => { |                         KeyCode::Enter => { | ||||||
|  |                             if self.curr_field == EditingField::BotType { | ||||||
|  |                                 if let ScreenResult::Ok(t) = | ||||||
|  |                                     SelectBotTypeScreen::default().show(terminal)? | ||||||
|  |                                 { | ||||||
|  |                                     self.rules.bot_type = t; | ||||||
|  |                                 } | ||||||
|  |                             } | ||||||
|  |  | ||||||
|                             if self.curr_field == EditingField::Cancel { |                             if self.curr_field == EditingField::Cancel { | ||||||
|                                 return Ok(ScreenResult::Canceled); |                                 return Ok(ScreenResult::Canceled); | ||||||
|                             } |                             } | ||||||
| @@ -143,7 +153,7 @@ impl GameRulesConfigurationScreen { | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     fn ui<B: Backend>(&mut self, f: &mut Frame<B>) { |     fn ui<B: Backend>(&mut self, f: &mut Frame<B>) { | ||||||
|         let area = centered_rect_size(50, 16, &f.size()); |         let area = centered_rect_size(50, 20, &f.size()); | ||||||
|  |  | ||||||
|         let block = Block::default().title("Game rules").borders(Borders::ALL); |         let block = Block::default().title("Game rules").borders(Borders::ALL); | ||||||
|         f.render_widget(block, area); |         f.render_widget(block, area); | ||||||
| @@ -156,7 +166,8 @@ impl GameRulesConfigurationScreen { | |||||||
|                 Constraint::Length(3), |                 Constraint::Length(3), | ||||||
|                 Constraint::Length(1), |                 Constraint::Length(1), | ||||||
|                 Constraint::Length(1), |                 Constraint::Length(1), | ||||||
|                 Constraint::Length(1), |                 Constraint::Length(3), // Bot type | ||||||
|  |                 Constraint::Length(1), // Margin | ||||||
|                 Constraint::Length(1), // Buttons |                 Constraint::Length(1), // Buttons | ||||||
|                 Constraint::Length(1), // Error message (if any) |                 Constraint::Length(1), // Error message (if any) | ||||||
|             ]) |             ]) | ||||||
| @@ -206,6 +217,22 @@ impl GameRulesConfigurationScreen { | |||||||
|         ); |         ); | ||||||
|         f.render_widget(editor, chunks[EditingField::PlayerContinueOnHit as usize]); |         f.render_widget(editor, chunks[EditingField::PlayerContinueOnHit as usize]); | ||||||
|  |  | ||||||
|  |         // Select bot type | ||||||
|  |         let bot_type_text = format!("Bot type: {}", self.rules.bot_type.description().name); | ||||||
|  |         let text = Paragraph::new(bot_type_text.as_str()).style( | ||||||
|  |             match self.curr_field == EditingField::BotType { | ||||||
|  |                 false => Style::default(), | ||||||
|  |                 true => Style::default().fg(HIGHLIGHT_COLOR), | ||||||
|  |             }, | ||||||
|  |         ); | ||||||
|  |         f.render_widget( | ||||||
|  |             text, | ||||||
|  |             chunks[EditingField::BotType as usize].inner(&Margin { | ||||||
|  |                 horizontal: 0, | ||||||
|  |                 vertical: 1, | ||||||
|  |             }), | ||||||
|  |         ); | ||||||
|  |  | ||||||
|         // Buttons |         // Buttons | ||||||
|         let buttons_chunk = Layout::default() |         let buttons_chunk = Layout::default() | ||||||
|             .direction(Direction::Horizontal) |             .direction(Direction::Horizontal) | ||||||
|   | |||||||
| @@ -27,7 +27,7 @@ impl Default for SelectBotTypeScreen { | |||||||
|         Self { |         Self { | ||||||
|             state: Default::default(), |             state: Default::default(), | ||||||
|             curr_selection: types.len() - 1, |             curr_selection: types.len() - 1, | ||||||
|             types, |             types: types.to_vec(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -36,7 +36,7 @@ impl GameRules { | |||||||
|                 .join(","), |                 .join(","), | ||||||
|             boats_can_touch: MULTI_PLAYER_BOATS_CAN_TOUCH, |             boats_can_touch: MULTI_PLAYER_BOATS_CAN_TOUCH, | ||||||
|             player_continue_on_hit: MULTI_PLAYER_PLAYER_CAN_CONTINUE_AFTER_HIT, |             player_continue_on_hit: MULTI_PLAYER_PLAYER_CAN_CONTINUE_AFTER_HIT, | ||||||
|             bot_type: BotType::Random, |             bot_type: BotType::Smart, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -9,13 +9,42 @@ pub enum BotType { | |||||||
|     Smart, |     Smart, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[derive(serde::Serialize)] | impl BotType { | ||||||
|  |     pub fn description(&self) -> &'static BotDescription { | ||||||
|  |         BOTS_TYPES.iter().find(|d| d.r#type == *self).unwrap() | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
|  | #[derive(serde::Serialize, Clone)] | ||||||
| pub struct BotDescription { | pub struct BotDescription { | ||||||
|     pub r#type: BotType, |     pub r#type: BotType, | ||||||
|     pub name: &'static str, |     pub name: &'static str, | ||||||
|     pub description: &'static str, |     pub description: &'static str, | ||||||
| } | } | ||||||
|  |  | ||||||
|  | const BOTS_TYPES: [BotDescription; 4] = [ | ||||||
|  |     BotDescription { | ||||||
|  |         r#type: BotType::Linear, | ||||||
|  |         name: "Linear", | ||||||
|  |         description: "Linear strike. Shoot A1, A2, A3, ..., B1, B2, ...", | ||||||
|  |     }, | ||||||
|  |     BotDescription { | ||||||
|  |         r#type: BotType::Random, | ||||||
|  |         name: "Random", | ||||||
|  |         description: "Random search. Random strike.", | ||||||
|  |     }, | ||||||
|  |     BotDescription { | ||||||
|  |         r#type: BotType::Intermediate, | ||||||
|  |         name: "Intermediate", | ||||||
|  |         description: "Random search. Intelligent strike.", | ||||||
|  |     }, | ||||||
|  |     BotDescription { | ||||||
|  |         r#type: BotType::Smart, | ||||||
|  |         name: "Smart", | ||||||
|  |         description: "Smart search. Smart strike.", | ||||||
|  |     }, | ||||||
|  | ]; | ||||||
|  |  | ||||||
| #[derive(serde::Serialize)] | #[derive(serde::Serialize)] | ||||||
| pub struct PlayConfiguration { | pub struct PlayConfiguration { | ||||||
|     pub min_boat_len: usize, |     pub min_boat_len: usize, | ||||||
| @@ -26,7 +55,7 @@ pub struct PlayConfiguration { | |||||||
|     pub max_map_height: usize, |     pub max_map_height: usize, | ||||||
|     pub min_boats_number: usize, |     pub min_boats_number: usize, | ||||||
|     pub max_boats_number: usize, |     pub max_boats_number: usize, | ||||||
|     pub bot_types: Vec<BotDescription>, |     pub bot_types: &'static [BotDescription], | ||||||
|     pub ordinate_alphabet: &'static str, |     pub ordinate_alphabet: &'static str, | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -41,28 +70,7 @@ impl Default for PlayConfiguration { | |||||||
|             max_map_height: MAX_MAP_HEIGHT, |             max_map_height: MAX_MAP_HEIGHT, | ||||||
|             min_boats_number: MIN_BOATS_NUMBER, |             min_boats_number: MIN_BOATS_NUMBER, | ||||||
|             max_boats_number: MAX_BOATS_NUMBER, |             max_boats_number: MAX_BOATS_NUMBER, | ||||||
|             bot_types: vec![ |             bot_types: &BOTS_TYPES, | ||||||
|                 BotDescription { |  | ||||||
|                     r#type: BotType::Linear, |  | ||||||
|                     name: "Linear", |  | ||||||
|                     description: "Linear strike. Shoot A1, A2, A3, ..., B1, B2, ...", |  | ||||||
|                 }, |  | ||||||
|                 BotDescription { |  | ||||||
|                     r#type: BotType::Random, |  | ||||||
|                     name: "Ranom", |  | ||||||
|                     description: "Random search. Random strike.", |  | ||||||
|                 }, |  | ||||||
|                 BotDescription { |  | ||||||
|                     r#type: BotType::Intermediate, |  | ||||||
|                     name: "Intermediate", |  | ||||||
|                     description: "Random search. Intelligent strike.", |  | ||||||
|                 }, |  | ||||||
|                 BotDescription { |  | ||||||
|                     r#type: BotType::Smart, |  | ||||||
|                     name: "Smart", |  | ||||||
|                     description: "Smart search. Smart strike.", |  | ||||||
|                 }, |  | ||||||
|             ], |  | ||||||
|             ordinate_alphabet: ALPHABET, |             ordinate_alphabet: ALPHABET, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user