game.rs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. use std::time::{Duration, Instant};
  2. use serde::{Serialize, Deserialize};
  3. use actix::{Actor, Addr, Context};
  4. use crate::websocket;
  5. use crate::server;
  6. #[derive(Serialize, Deserialize, Clone)]
  7. pub enum GameState {
  8. Creating,
  9. Guessing(usize),
  10. }
  11. #[derive(Serialize, Deserialize, Clone)]
  12. pub struct CreatingEx {
  13. pub question: String,
  14. pub letters: Vec<char>
  15. }
  16. #[derive(Serialize, Deserialize, Clone)]
  17. pub struct Round {
  18. pub exercises: Vec<CreatingEx>
  19. }
  20. #[derive(Serialize, Clone)]
  21. pub struct Player {
  22. nick: String,
  23. #[serde(skip_serializing)]
  24. actor: Addr<server::GameConnection>,
  25. submitted_word: Option<String>,
  26. }
  27. #[derive(Serialize, Clone)]
  28. pub struct Game {
  29. players: Vec<Player>,
  30. round_number: i32,
  31. #[serde(skip_serializing)]
  32. round: Round,
  33. state: GameState,
  34. }
  35. impl Game {
  36. pub fn new() -> Self {
  37. Self {
  38. players: vec![],
  39. round_number: 0,
  40. round: Round{ exercises: vec![] },
  41. state: GameState::Creating
  42. }
  43. }
  44. fn get_player(&mut self, nick: &str) -> Option<&mut Player> {
  45. self.players.iter_mut().find(|x| x.nick == nick)
  46. }
  47. pub fn submit_creation(&mut self, player_nick: &str, word: &str) -> bool {
  48. match self.state {
  49. GameState::Creating => {
  50. if let Some(player) = self.get_player(player_nick) {
  51. player.submitted_word = Some(word.to_owned());
  52. true
  53. }
  54. else {
  55. false
  56. }
  57. },
  58. _ => false
  59. }
  60. }
  61. pub fn next_state(&mut self) {
  62. match self.state {
  63. GameState::Creating => {
  64. self.state = GameState::Guessing(0);
  65. },
  66. GameState::Guessing(index) => {
  67. if index + 1 < self.players.len() {
  68. self.state = GameState::Guessing(index + 1);
  69. }
  70. else {
  71. self.state = GameState::Creating;
  72. }
  73. }
  74. }
  75. }
  76. pub fn player_join(&mut self, nick: &str, actor: Addr<server::GameConnection>) {
  77. self.players.push(Player{ nick: nick.to_owned(), actor, submitted_word: None });
  78. }
  79. }