# **************************************************************************** # # # # ::: :::::::: # # Tournament.py :+: :+: :+: # # +:+ +:+ +:+ # # By: edbernar 20): self.messages.pop(0) self.broadcast({"action":3, "username":socket.username, "message":message}) def playerFromSocket(self, socket): for x in range(len(self.players)): if(self.players[x].socket == socket): return(x) return(-1) def leave(self, socket): if(self.started): return; index = self.playerFromSocket(socket) if(index == -1): return; self.players.pop(index) socket.tournament = None self.broadcast({"action":2,"id":index}) def join(self, socket, skin=0, goal=0, isBot=False): if(not isBot and socket.tournament != None): socket.sendError("already in a tournament", 9036) return if(not isBot and len(self.players) == Tournament.playerLimit): socket.sync_send("tournament",{"action":0, "isFull":True}) return if(isBot): player = Bot(None, self) socket = player.socket else: player = Player(socket) player.skin = skin player.goal = goal socket.tournament = self self.players.append(player) socket.sync_send("tournament",{"action":0, "code":self.code}) self.broadcast({"action":1, "id":len(self.players) - 1, "username": socket.username,"pfp":socket.pfp}) if(len(self.players) == Tournament.playerLimit): self.start() if(len(self.players) == Tournament.playerLimit - self.nbBot): for x in range(self.nbBot): self.join(None, 0, 0, True) def createGames(self, players, level=1): left = None right = None if(level == Tournament.levels): try: right = players.pop(0) left = players.pop(0) except IndexError: pass else: right = self.createGames(players, level + 1) left = self.createGames(players, level + 1) return(TournamentGame(left, right, self)) def start(self): self.started = True self.finalGame = self.createGames(self.players.copy()) asyncio.create_task(self.tournamentLoop()) def addHistory(self, p1, p2, p1Win): self.broadcast({"action":6, "p1" : p1, "p2" : p2, "p1Win": p1Win}) self.history.append({"p1": p1, "p2" : p2, "p1Win":p1Win}) def allPlayersReady(self): for x in self.players: if (not x.isTournamentReady()): return False return True async def tournamentLoop(self): while self.finalGame.winner == None: await asyncio.sleep(1) nbLoop = 0 while not self.allPlayersReady() and nbLoop < GameSettings.maxTimePlayerWait * 10: nbLoop += 1 await asyncio.sleep(0.1) self.broadcast({"action":7, "winnerId" : self.players.index(self.finalGame.winner)}) print("tournament done, winner is ", self.finalGame.winner.socket.username)