def vote_turn(game_id: int, player_id: int, player_vote: bool): ''' Submit a player's vote instance. If it is the first vote in the turn, create the Vote instance for the turn. ''' turn = db_turn.get_current_turn_in_game(game_id) player = db_player.get_player_by_id(player_id) vote = Vote.get(lambda v: v.turn.turn_number == turn.turn_number \ and v.turn.game.id == game_id) Player_vote(player=player, vote=vote, is_lumos=player_vote) commit() # Check and take action if all players voted if len(vote.player_vote) == db_game.alive_players_count(game_id): lumos_counter = select(pv for pv in Player_vote if \ pv.vote.turn.turn_number == turn.turn_number \ and pv.vote.turn.game.id == game_id \ and pv.is_lumos ).count() result = False if len(vote.player_vote) - lumos_counter < lumos_counter: result = True turn.current_minister = turn.candidate_minister turn.current_director = turn.candidate_director vote.result = result return len(vote.player_vote)
def execute_crucio(game_id, player_id): ''' Execute crucio to a player in game ''' board = Board[game_id] player = db_player.get_player_by_id(player_id) player.is_investigated = True board.spell_available = False return player.loyalty == "Fenix Order"
def select_DD_candidate(game_id, player_id): ''' Set a player as director candidate in current turn. This function doesn't make checks, it should've been made privously ''' turn = get_current_turn_in_game(game_id) director_candidate_player = db_player.get_player_by_id(player_id) turn.candidate_director = director_candidate_player return [turn.candidate_minister.id, director_candidate_player.id]
def execute_avada_kedavra(game_id: int, player_id: int): ''' Execute avada kedavra to a player in game ''' game = db_game.get_game_by_id(game_id) board = Board[game_id] player = db_player.get_player_by_id(player_id) player.is_alive = False player.chat_enabled = False board.spell_available = False return player.rol == "Voldemort"
def get_players_info(game_id): ''' Get players ids, username and loyalty in current game ''' players_id_list = get_all_players_id(game_id) players_info_list = [] for id in players_id_list: player = db_player.get_player_by_id(id) loyalty = "Voldemort" if player.rol == "Voldemort" else player.loyalty players_info_list.append({ "player_id": id, "username": player.user.username, "loyalty": loyalty, "is alive": player.is_alive }) return players_info_list
def check_init_conditions(game_id: int, player_id: int): ''' Check the conditions to start a game ''' game = get_game_by_id(game_id=game_id) if not game: raise game_not_found_exception player = db_player.get_player_by_id(player_id=player_id) if not player: raise player_not_found_exception if player not in game.players: raise player_not_in_game_exception if game.state == 1: raise game_has_started_exception if game.state == 2: raise game_has_finished_exception if game.owner != player.user: raise not_the_owner_exception if game.min_players > game.players.count(): raise min_player_not_reach_exception
def select_MM_candidate(game_id: int): ''' Start a new turn and return the candidate for minister in mentioned turn. ''' game = db_game.get_game_by_id(game_id) players_set = game.players next_candidate_minister = None # Last turn info game_turns = get_current_turn_number_in_game(game_id) last_turn = get_turn_in_game(game_id=game_id, turn_number=game_turns) last_candidate_minister = last_turn.candidate_minister # Get LAST minister candidate if game_turns > 1: # Second last turn info second_last_turn = get_turn_in_game(game_id=game_id, turn_number=game_turns - 1) if second_last_turn.imperius_player_id: last_candidate_minister = second_last_turn.candidate_minister # Get NEXT minister candidate if last_turn.imperius_player_id: next_candidate_minister = db_player.get_player_by_id( last_turn.imperius_player_id) else: next_candidate_minister = get_next_candidate(players_set, last_candidate_minister) turn = generate_turn(game_instance=game, turn_number=game_turns + 1, candidate_minister=next_candidate_minister, candidate_director=next_candidate_minister, last_minister=last_turn.current_minister, last_director=last_turn.current_director, current_minister=next_candidate_minister, current_director=next_candidate_minister) return next_candidate_minister.id