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()