From e69d9c3b5266fd6f9215d1e3f4a761b8027a785c Mon Sep 17 00:00:00 2001 From: troido Date: Fri, 21 Feb 2020 16:27:32 +0100 Subject: wrote world code for migrating players --- src/world.rs | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'src/world.rs') diff --git a/src/world.rs b/src/world.rs index 891e22b..62d80be 100644 --- a/src/world.rs +++ b/src/world.rs @@ -50,31 +50,52 @@ impl <'a, 'b>World<'a, 'b> { self.rooms.get_mut(id) } - pub fn add_player(&mut self, playerid: PlayerId) -> Result<()> { - let state = self.persistence.load_player(playerid.clone()).unwrap_or(PlayerState::new(playerid.clone())); + fn add_loaded_player(&mut self, state: PlayerState) -> Result<()> { let roomid = state.clone().room.unwrap_or(self.default_room.clone()); let room = self.get_room_mut(&roomid).ok_or(aerr!("room not found"))?; room.add_player(&state); - self.players.insert(playerid, roomid); + self.players.insert(state.id.clone(), roomid); Ok(()) } - pub fn remove_player(&mut self, playerid: PlayerId) -> Result<()> { - let roomid = self.players.remove(&playerid).ok_or(aerr!("player not found"))?; + pub fn add_player(&mut self, playerid: &PlayerId) -> Result<()> { + let state = self.persistence.load_player(playerid.clone()).unwrap_or(PlayerState::new(playerid.clone())); + self.add_loaded_player(state) + } + + fn discorporate_player(&mut self, playerid: &PlayerId) -> Result { + let roomid = self.players.remove(playerid).ok_or(aerr!("player not found"))?; let room = self.get_room_mut(&roomid).ok_or(aerr!("room not found"))?; - let player_state = room.remove_player(playerid.clone())?; + room.remove_player(playerid) + } + + pub fn remove_player(&mut self, playerid: &PlayerId) -> Result<()> { + let player_state = self.discorporate_player(playerid)?; self.persistence.save_player(playerid.clone(), player_state)?; Ok(()) } + pub fn control_player(&mut self, player: PlayerId, control: Control) -> Result<()>{ let roomid = self.players.get(&player).ok_or(aerr!("player not found"))?.clone(); Ok(self.get_room_mut(&roomid).ok_or(aerr!("room not found"))?.control_player(player, control)) } + fn migrate_player(&mut self, player: &PlayerId, destination: RoomId) -> Result<()> { + let mut state = self.discorporate_player(player)?; + state.room = Some(destination); + self.add_loaded_player(state) + } + + pub fn update(&mut self) { + let mut migrants = Vec::new(); for room in self.rooms.values_mut() { room.update(); + migrants.append(&mut room.emigrate()); + } + for (player, destination) in migrants { + self.migrate_player(&player, destination).unwrap(); } } -- cgit