Пример #1
0
    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)
Пример #2
0
    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)
Пример #3
0
    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)
Пример #4
0
    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()
Пример #5
0
    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)
Пример #6
0
 def cancel(self) -> None:
     logger.info(f"Match {self.code} is being cancelled")
     socket.emit("game_cancelled", room=self.code)