def defend_commit(request, game_id, player_no, tile_count):
    g = Game.objects.get(id=int(game_id))
    if not g.state.startswith("DEFEND"):
        return False

    board = StandardBoard(g, 1)
    build_board_data(board)
    p = g.__getattribute__("player_" + player_no)
    hand = Hand.objects.filter(player=p, turn_no=1, game=g).get()

    civ = g.state.split("|")[1]

    if not int(player_no) == g.waiting_for:
        return False
    if not hand.batch_remove(civ, tile_count):
        return False

    hand.save()

    defend_info = _get_defend_info(g, board)

    losing_kindom = None
    if len(defend_info["attack_board"]) + int(defend_info["attack_committed"]) > len(defend_info["defend_board"]) + int(
        tile_count
    ):
        losing_kingdom = _get_defender_kingdom(g, board)
        winner_no = _get_attacker(g, board)
    else:
        losing_kingdom = _get_attacker_kingdom(g, board)
        winner_no = player_no

    points = board.external_war_removal(losing_kingdom, civ)
    _give_points(game=g, player_no=winner_no, count=points, type=civ)

    build_board_data(board)

    unification_cell_no = board.find_unification_tile()
    more_war = external_war_tile(board, unification_cell_no)
    if more_war:
        g.state = "CHOOSE_COLOR"
        g.waiting_for = g.current_turn
    else:
        board[unification_cell_no].piece = _convert(board[unification_cell_no].special.piece)
        board[unification_cell_no].special = None
        build_board_data(board)

        treasure = board.treasure_to_claim()
        if treasure:
            g.waiting_for = treasure["player_no"]
            g.state = "TREASURE"
        else:
            g.state = "REGULAR"
            g.increment_action()

    g.save()
    board.save()

    update_browsers(game_id)

    return game_state_json(request, game_id, player_no)
def internal_attack(request, game_id, player_no, cell_no, civ, num_committed):
    cell_no = int(cell_no)

    g = Game.objects.get(id=int(game_id))
    board = StandardBoard(g, 1)
    build_board_data(board)
    p = g.__getattribute__("player_" + player_no)

    if not internal_war_ruler(board, cell_no, "ruler-" + civ, player_no):
        return False
    if not g.current_turn == int(player_no):
        return False

    hand = Hand.objects.filter(player=p, turn_no=1, game=g).get()
    if not hand.batch_remove("temple", num_committed):
        return False
    hand.save()

    g.state = "INTERNAL|" + civ + "|" + str(cell_no) + "|" + num_committed

    g.waiting_for = _get_internal_defender(g, board, cell_no, civ)
    g.current_turn = player_no

    g.save()
    board.save()

    update_browsers(game_id)

    return game_state_json(request, game_id, player_no)
def drop_civ(request, game_id, player_no, civ, cell):
    civ = int(civ)
    cell = int(cell)

    g = Game.objects.get(id=int(game_id))
    board = StandardBoard(g, 1)
    build_board_data(board)
    p = g.__getattribute__("player_" + player_no)
    hand = Hand.objects.filter(player=p, turn_no=1, game=g).get()

    moves = []
    civ_obj = _convert(hand.__getattribute__("piece" + str(civ)))

    if civ_obj.name() == "civ-farm":
        moves = [cell_no for cell_no, cell_obj in enumerate(board) if safe_tile(board, cell_no, is_ground=False)]
    else:
        moves = [cell_no for cell_no, cell_obj in enumerate(board) if safe_tile(board, cell_no, is_ground=True)]

    if cell in moves and int(player_no) == g.current_turn:
        point_to = board.get_point(cell, _convert(hand.__getattribute__("piece" + str(civ))))
        if point_to:
            _give_points(game=g, player_no=point_to, count=1, type=civ_obj.css_class_name())

        board.add_civ(cell, _convert(hand.__getattribute__("piece" + str(civ))))
        build_board_data(board)

        if g.action_no == 1:
            hand.swap(civ)
        else:
            hand.remove(civ)

        hand.save()
    else:
        return False

    treasure = board.treasure_to_claim()
    if treasure:
        g.waiting_for = treasure["player_no"]
        g.state = "TREASURE"
    else:
        g.increment_action()

    g.save()
    board.save()

    update_browsers(game_id)

    return game_state_json(request, game_id, player_no)
def reposition_ruler(request, game_id, player_no, ruler, cell):
    cell = int(cell)

    g = Game.objects.get(id=int(game_id))
    board = StandardBoard(g, 1)
    build_board_data(board)
    p = g.__getattribute__("player_" + player_no)

    safe_repositions, _ = _get_reposition_info(board, player_no, ruler)
    if cell in safe_repositions and int(player_no) == g.current_turn:
        board.remove_ruler(board.get_cell_no_for_player_no_and_ruler(player_no, ruler[0]))
    else:
        return False

    g.save()
    board.save()

    return drop_ruler(request, game_id, player_no, ruler, cell)
def reposition_ruler_war(request, game_id, player_no, cell_no, ruler, num_committed):
    cell_no = int(cell_no)

    g = Game.objects.get(id=int(game_id))
    board = StandardBoard(g, 1)
    build_board_data(board)
    p = g.__getattribute__("player_" + player_no)

    _, war_repositions = _get_reposition_info(board, player_no, ruler)
    if cell_no in [x for x, _, _ in war_repositions] and int(player_no) == g.current_turn:
        board.remove_ruler(board.get_cell_no_for_player_no_and_ruler(player_no, ruler[0]))
    else:
        False

    g.save()
    board.save()

    return internal_attack(request, game_id, player_no, cell_no, ruler, num_committed)
def remove_ruler(request, game_id, player_no, ruler):
    g = Game.objects.get(id=int(game_id))
    board = StandardBoard(g, 1)
    build_board_data(board)
    p = g.__getattribute__("player_" + player_no)

    if board.is_ruler_placed("ruler-" + ruler, player_no) and int(player_no) == g.current_turn:
        board.remove_ruler(board.get_cell_no_for_player_no_and_ruler(player_no, ruler[0]))
        g.increment_action()
    else:
        return False

    g.save()
    board.save()

    update_browsers(game_id)

    return game_state_json(request, game_id, player_no)
def drop_ruler(request, game_id, player_no, ruler, cell):
    cell = int(cell)

    g = Game.objects.get(id=int(game_id))
    board = StandardBoard(g, 1)
    build_board_data(board)
    p = g.__getattribute__("player_" + player_no)

    if safe_ruler(board, cell, "ruler-" + ruler, player_no) and int(player_no) == g.current_turn:
        board.add_ruler(cell, ruler, player_no)
    else:
        return False

    g.increment_action()

    g.save()
    board.save()

    update_browsers(game_id)

    return game_state_json(request, game_id, player_no)
def choose_treasure(request, game_id, player_no, cell_nos):
    cell_nos = [int(x) for x in cell_nos.split("_")]

    g = Game.objects.get(id=int(game_id))
    board = StandardBoard(g, 1)
    build_board_data(board)

    for cell_no in cell_nos:
        board[cell_no].piece.treasure = None

    _give_points(game=g, player_no=player_no, count=len(cell_nos), type="treasure")

    g.state = "REGULAR"
    g.increment_action()
    g.save()

    board.save()

    update_browsers(game_id)

    return game_state_json(request, game_id, player_no)
def internal_defend(request, game_id, player_no, num_committed):
    num_committed = int(num_committed)

    g = Game.objects.get(id=int(game_id))
    board = StandardBoard(g, 1)
    build_board_data(board)

    defend_info = _get_defend_internal_info(g, board)

    p = g.__getattribute__("player_" + player_no)
    hand = Hand.objects.filter(player=p, turn_no=1, game=g).get()
    if not hand.batch_remove("temple", num_committed):
        return False
    hand.save()

    defend_amount = num_committed + defend_info["defend_board"]
    attack_amount = defend_info["attack_board"] + int(defend_info["attack_committed"])

    winner = None
    if defend_amount < attack_amount:
        board[defend_info["defend_cell_no"]] = Ground()
        board[defend_info["attack_cell_no"]].piece = _convert_ruler(
            defend_info["ruler_type"], defend_info["attack_player"]
        )
        winner = defend_info["attack_player"]
    else:
        winner = player_no

    _give_points(game=g, player_no=winner, count=1, type="temple")

    g.state = "REGULAR"

    g.increment_action()

    g.save()
    board.save()

    update_browsers(game_id)

    return game_state_json(request, game_id, player_no)
def external_war(request, game_id, player_no, civ, cell):
    civ = int(civ)
    cell = int(cell)

    g = Game.objects.get(id=int(game_id))
    board = StandardBoard(g, 1)
    build_board_data(board)
    p = g.__getattribute__("player_" + player_no)
    hand = Hand.objects.filter(player=p, turn_no=1, game=g).get()

    moves = []
    civ_obj = _convert(hand.__getattribute__("piece" + str(civ)))

    if civ_obj.name() == "civ-farm":
        moves = [
            cell_no for cell_no, cell_obj in enumerate(board) if external_war_tile(board, cell_no, is_ground=False)
        ]
    else:
        moves = [cell_no for cell_no, cell_obj in enumerate(board) if external_war_tile(board, cell_no, is_ground=True)]

    if cell in moves and int(player_no) == g.current_turn:
        board.place_unification(cell, _convert(hand.__getattribute__("piece" + str(civ))))
        hand.remove(civ)
        g.state = "CHOOSE_COLOR"
        g.waiting_for = player_no
    else:
        return False

    g.current_turn = player_no
    g.save()

    board.save()
    hand.save()

    update_browsers(game_id)

    return game_state_json(request, game_id, player_no)
def _setup_game(name, players, num_players):
    player_objs = dict(
        [
            ("player_" + str(player_no + 1), Player.objects.get_or_create(user_name=players[player_no])[0])
            for player_no in xrange(num_players)
        ]
    )
    game = Game.objects.create(num_players=num_players, name=name, **player_objs)

    bag = CivBag.objects.create(game=game)

    for _, player in player_objs.iteritems():
        hand = Hand.objects.create(
            game=game,
            player=player,
            turn_no=1,
            action_no=game.action_no,
            piece0=bag.get_piece().unique_id(),
            piece1=bag.get_piece().unique_id(),
            piece2=bag.get_piece().unique_id(),
            piece3=bag.get_piece().unique_id(),
            piece4=bag.get_piece().unique_id(),
            piece5=bag.get_piece().unique_id(),
        )
        hand.save()

    board = StandardBoard(game=game)

    for _, player in player_objs.iteritems():
        player.save()

    game.save()
    bag.save()
    board.save()

    return HttpResponse()