def end_turn(server, clockwise=True): global current_player all_sockets = list(server.clients) for i, socket in enumerate(all_sockets): if socket == current_player.socket: if clockwise is True: if i + 1 >= len(all_sockets): current_player = server.find_client_by_socket( all_sockets[0]) else: current_player = server.find_client_by_socket( all_sockets[i + 1]) else: current_player = server.find_client_by_socket(all_sockets[i - 1]) server.send_message( server_data.Data( content_type=SERV_BROADCAST, content_data= f'Discard Pile: Top Card - {discard_pile.get_top_card()}')) server.send_message( server_data.Data( content_type=SERV_BROADCAST, content_data=f'It is {current_player.name}\'s turn.')) return
def on_connect(*params): socket = params[0] message = params[1] if game_started: server.close_socket(sock=socket) return if message is None: return temp_client = server.find_client_by_socket(socket) new_client = Player(temp_client.socket, temp_client.name) if new_client.name_set_flag: return new_name = message if message.lower() in [ server.clients[client].name.lower() for client in server.clients ]: print( f"[{server.name}] A client tried to join with the same name as an existing client. " "A randomly generated name has been given instead.") else: new_client.name = new_name new_client.name_set_flag = True server.set_client(new_client) server.send_message(server_data.Data( content_type=SERV_MESSAGE, content_data=f'!setname {new_client.name}'), sock=socket) server.send_message(server_data.Data(content_type=SERV_MESSAGE, content_data=f'!setserver'), sock=socket) server.send_message(server_data.Data( content_type=SERV_MESSAGE, content_data=f'Hello {new_client.name}!'), sock=socket) server.send_message( server_data.Data(content_type=SERV_BROADCAST, content_data=f'{new_client.name} joined the server.'))
def on_disconnect(*params): global game_started socket = params[0] server.send_message( server_data.Data( content_type=SERV_BROADCAST, content_data= f"Client has disconnected: {server.find_client_by_socket(socket).name}({socket.getpeername()})" )) server.send_message(server_data.Data(content_type=SERV_MESSAGE, content_data='!quit'), sock=socket) if game_started: if len(server.clients) <= 2: game.end_flag = True server.send_message( server_data.Data( content_type=SERV_BROADCAST, content_data= "The game has been shutdown as there are too few players to continue playing." )) elif game.current_player.socket == socket: game.end_turn(server) game_started = False server.close_socket(socket)
def on_player_play_card(*params): socket = params[0] try: card_index = int(params[1]) except TypeError: return global game_started if game_started: if game.current_player.socket == socket: my_card = None for i, card in enumerate(game.current_player.hand): # print(f"ITERATING HAND - Card({card.color}:{card.value})") if i == card_index: my_card = card # print(f"FOUND CARD - Card({card.color}:{card.value})") if my_card is None: return if my_card.color == game.discard_pile.get_top_card( ).color or my_card.value == game.discard_pile.get_top_card().value: # print(f"CARD PLAYED - Card({my_card.color}:{my_card.value})") removed_card = game.current_player.remove_from_hand(my_card) game.discard_pile.add_to_top(removed_card) server.send_message( server_data.Data( content_type=SERV_BROADCAST, content_data= f'{game.current_player.name} played ({my_card.color}:{my_card.value})' )) game.end_turn(server)
def on_view_cards(*params): socket = params[0] client = server.find_client_by_socket(sock=socket) if client: if client.hand_size() == 0: server.send_message(server_data.Data( content_type=SERV_MESSAGE, content_data=f'{client.name} has no cards on hand.'), sock=socket) # server.outputs.append(socket) return for i, card in enumerate(client.hand.deck): server.send_message(server_data.Data( content_type=SERV_MESSAGE, content_data=f'[{i}]({card.color}:{card.value})'), sock=socket)
def game_loop(server): global current_player, game_deck, discard_pile, registered_cards register_cards() game_deck = Deck() discard_pile = Deck() game_deck.generate_default_deck( num_of_players=len(server.clients), card_definitions_file='../definitions/cards.json') print(f"Deck Size: {game_deck.size}") server.send_message( server_data.Data(content_type=SERV_MESSAGE, content_data=f'THE GAME HAS STARTED!', client=server.name)) for client in server.clients: while server.clients[client].hand_size() < 7: card = game_deck.draw() server.clients[client].add_to_hand(card) server.send_message(server_data.Data( content_type=SERV_MESSAGE, content_data= f'Given {server.clients[client].name}: {card.get_json()}', client=server.name), sock=server.clients[client].socket) print(f'Cards left in deck: {game_deck.size}') # Draw first card discard_pile.add_to_top(game_deck.draw()) print(f"Chosen Card - {discard_pile.get_top_card()}") server.send_message( server_data.Data( content_type=SERV_BROADCAST, content_data= f'Discard Pile: Top Card - {discard_pile.get_top_card()}')) # Get first player current_player = random.choice(list(server.clients.values())) print(f"First Player - {current_player.name}") server.send_message( server_data.Data( content_type=SERV_BROADCAST, content_data=f'The first player is {current_player.name}')) while not end_flag: time.sleep(1) clear_game(server)
def on_get_clients(*params): socket = params[0] all_clients = [server.clients[client].name for client in server.clients] server.send_message(server_data.Data( content_type=SERV_MESSAGE, content_data= f"All Clients ({len(server.clients)}) - {', '.join(all_clients)}"), sock=socket)
def on_message(*params): socket = params[0] message = params[1].strip() if len(message) != 0: server.send_message( server_data.Data(content_type=SERV_BROADCAST, content_data=f'{message}', client=server.find_client_by_socket(socket).name)) print(f'[{server.find_client_by_socket(socket).name}]: {message}')
def outbound_data_to_server(): # Send connect message connect_data = server_data.Data(content_type=SERV_MESSAGE, content_data=f"!connect {PLAYER_NAME}", client=PLAYER_NAME) ssl_socket.send(bytes(prepare_message(connect_data), 'utf-8')) while not kill_threads: try: # Send data to the server. data_to_send = input() if len(data_to_send) != 0: data_to_send = server_data.Data(content_type=SERV_MESSAGE, content_data=data_to_send, client=PLAYER_NAME) ssl_socket.send(bytes(prepare_message(data_to_send), 'utf-8')) except socket.error as e: # print(e) disconnect_from_server() return time.sleep(CLIENT_TICK_RATE)
def on_draw_card(*params): socket = params[0] if game_started: if game.current_player.socket == socket: card = game.game_deck.draw() game.current_player.add_to_hand(card) server.send_message(server_data.Data( content_type=SERV_MESSAGE, content_data=f'You drew the card ({card.color}:{card.value})'), sock=game.current_player.socket) game.end_turn(server)
def on_game_stop(*params): socket = params[0] client = server.find_client_by_socket(socket) global game_started if game_started: game_started = False server.send_message( server_data.Data( content_type=SERV_BROADCAST, content_data=f'The game has been closed by {client.name}')) game.clear_game(server=server)
def on_game_start(*params): socket = params[0] client = server.find_client_by_socket(socket) global game_started if not game_started: game_started = True server.send_message(server_data.Data( content_type=SERV_BROADCAST, content_data=f'The game has been started by {client.name}'), sock=socket) game.game_loop(server=server)