def broadcast_update(self, caller: Optional[str], update: GameUpdate) -> None: """ Envía un mismo game_update a todos los participantes de la partida. """ self.send_chat_update(caller, update) socket.emit("game_update", update.get_any(), room=self.code)
def send_update(self, caller: Optional[str], update: GameUpdate) -> None: """ Envía un game_update a cada uno de los participantes de la partida. """ self.send_chat_update(caller, update) for user in self.users: status = update.get(user.name) if status == {}: continue socket.emit("game_update", status, room=user.sid)
def send_chat_update(self, caller: Optional[str], update: GameUpdate) -> None: """ Envía un mensaje de chat con el resumen de un turno. """ if caller is None: return msg = update.fmt_msg(caller) if msg is None: return socket.emit("chat", {"msg": msg, "owner": "[GATOVID]"}, room=self.code)
def create_public_game(self) -> None: # Se cancela el timer si es necesario. if self._public_timer is not None: self._public_timer.cancel() self._public_timer = None # Obtener los jugadores esperando users = self.get_waiting() # Creamos la partida new_match = PublicMatch(num_users=len(users)) code = new_match.code # Añadimos la partida a la lista de partidas matches[code] = new_match # Avisar a todos los jugadores de la partida for user in users: socket.emit("found_game", {"code": code}, room=user.sid) # Ponemos un timer para empezar la partida, por si no se unen todos logger.info(f"Public match {code} has been created") new_match.start_timer.start()
def start(self) -> None: """ La partida solo se puede iniciar una vez, por lo que esta operación es más limitada que un setter. Primero se envía un mensaje especial de inicio de la partida, start_game. Posteriormente, se inicia la partida tanto por parte del juego (con la lógica, como las cartas de cada jugador, etc), como por parte de la partida (que tiene que enviar al cliente información de los usuarios, como su tablero). Notar que esto último se tiene que enviar en un mismo mensaje al cliente, y no se puede dividir en dos; originalmente la información sobre los jugadores como sus fotos debería haber ido en start_game. """ if self.is_started(): return enable_ai = isinstance(self, PublicMatch) self._game = Game(self.users, self._turn_passed_auto, enable_ai) # Mensaje especial de inicio de la partida logger.info(f"Match {self.code} has started") socket.emit("start_game", room=self.code) # game_update con el inicio del juego update = self._game.start() # game_update con el inicio de la partida match_update = self._match_update() # Unión de ambos game_update update.merge_with(match_update) self.send_update(None, update)
def cancel(self) -> None: logger.info(f"Match {self.code} is being cancelled") socket.emit("game_cancelled", room=self.code)