Remove complex PlayerWrapper structure
				
					
				
			This commit is contained in:
		
							
								
								
									
										27
									
								
								src/game.rs
									
									
									
									
									
								
							
							
						
						
									
										27
									
								
								src/game.rs
									
									
									
									
									
								
							| @@ -1,8 +1,6 @@ | ||||
| use std::sync::Arc; | ||||
|  | ||||
| use crate::data::GameRules; | ||||
| use crate::human_player::HumanPlayer; | ||||
| use crate::random_bot::RandomBot; | ||||
| use actix::prelude::*; | ||||
| use actix::{Actor, Context, Handler}; | ||||
| use uuid::Uuid; | ||||
| @@ -15,20 +13,6 @@ pub trait Player { | ||||
|     fn query_boats_layout(&self, rules: &GameRules); | ||||
| } | ||||
|  | ||||
| pub enum PlayerWrapper { | ||||
|     Human(Arc<HumanPlayer>), | ||||
|     RandomBot(RandomBot), | ||||
| } | ||||
|  | ||||
| impl PlayerWrapper { | ||||
|     fn extract(self) -> Arc<dyn Player> { | ||||
|         match self { | ||||
|             PlayerWrapper::Human(h) => h, | ||||
|             PlayerWrapper::RandomBot(r) => Arc::new(r), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| #[derive(Default, Eq, PartialEq, Debug, Copy, Clone)] | ||||
| enum GameStatus { | ||||
|     #[default] | ||||
| @@ -66,15 +50,18 @@ impl Actor for Game { | ||||
|  | ||||
| #[derive(Message)] | ||||
| #[rtype(result = "()")] | ||||
| pub struct AddPlayer(pub PlayerWrapper); | ||||
| pub struct AddPlayer<E>(pub E); | ||||
|  | ||||
| impl Handler<AddPlayer> for Game { | ||||
| impl<E> Handler<AddPlayer<Arc<E>>> for Game | ||||
| where | ||||
|     E: Player + 'static, | ||||
| { | ||||
|     type Result = (); | ||||
|  | ||||
|     /// Add a new player to the game | ||||
|     fn handle(&mut self, msg: AddPlayer, _ctx: &mut Self::Context) -> Self::Result { | ||||
|     fn handle(&mut self, msg: AddPlayer<Arc<E>>, _ctx: &mut Self::Context) -> Self::Result { | ||||
|         assert!(self.players.len() < 2); | ||||
|         self.players.push(msg.0.extract()); | ||||
|         self.players.push(msg.0); | ||||
|  | ||||
|         if self.players.len() == 2 { | ||||
|             self.query_boats_disposition(); | ||||
|   | ||||
| @@ -7,7 +7,7 @@ use actix_web_actors::ws::{CloseCode, CloseReason, Message, ProtocolError, Webso | ||||
| use uuid::Uuid; | ||||
|  | ||||
| use crate::data::{BotType, GameRules}; | ||||
| use crate::game::{AddPlayer, Game, PlayerWrapper}; | ||||
| use crate::game::{AddPlayer, Game}; | ||||
| use crate::human_player::HumanPlayer; | ||||
| use crate::random_bot::RandomBot; | ||||
|  | ||||
| @@ -56,10 +56,11 @@ impl Actor for HumanPlayerWS { | ||||
|             StartMode::Bot(rules) => { | ||||
|                 let game = Game::new(rules.clone()).start(); | ||||
|  | ||||
|                 let bot = match rules.bot_type { | ||||
|                     BotType::Random => PlayerWrapper::RandomBot(RandomBot::new(game.clone())), | ||||
|                 match rules.bot_type { | ||||
|                     BotType::Random => { | ||||
|                         game.do_send(AddPlayer(Arc::new(RandomBot::new(game.clone())))); | ||||
|                     } | ||||
|                 }; | ||||
|                 game.do_send(AddPlayer(bot)); | ||||
|  | ||||
|                 let player = Arc::new(HumanPlayer { | ||||
|                     name: "Human".to_string(), | ||||
| @@ -68,7 +69,7 @@ impl Actor for HumanPlayerWS { | ||||
|                     uuid: Uuid::new_v4(), | ||||
|                 }); | ||||
|                 self.inner = Some(player.clone()); | ||||
|                 game.do_send(AddPlayer(PlayerWrapper::Human(player))); | ||||
|                 game.do_send(AddPlayer(player)); | ||||
|             } | ||||
|  | ||||
|             StartMode::AgainstHuman => { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user