Beispiel #1
0
def deploy_ship(request, game_id):
    ship_id = Ship.id_str_to_pk(request.REQUEST['shipId'])
    cancel_colony = request.method == 'DELETE'

    ship = Ship.objects.get(pk=ship_id)

    if ship.ship_type != game_constants.COLONY:
        return _forbidden("Only colonies can do that")
    if ship.owner != request.player:
        return _forbidden("You don't own that ship")
    if ship.on_deploy_queue and not cancel_colony:
        return _forbidden("That colony is already deploying")
    elif not ship.on_deploy_queue and cancel_colony:
        return _forbidden("That colony isn't deploying")

    if ship.system.owner == request.player:
        return _forbidden("You already own that system")
    
    if not cancel_colony:
        ships_already_building = ship.system.ship_set.filter(
            owner=request.player,
            ship_type=ship.ship_type,
            on_deploy_queue=True)
        if len(ships_already_building) > 0:
            return _forbidden("You're already deploying a colony there")

    ship.on_deploy_queue = not cancel_colony
    ship.save()

    _game_state_changed(request.game)

    return _json(_game_state(request.game, request.player))
Beispiel #2
0
def move_ship(request, game_id):
        err = _check_phase(request.game, game_constants.MOVE_PHASE)
        if err:
            return err

        system_id = System.id_str_to_pk(request.REQUEST['systemId'])
        ship_id = Ship.id_str_to_pk(request.REQUEST['shipId'])

        system = System.objects.get(pk=system_id)
        ship = Ship.objects.get(pk=ship_id)

        if ship.owner != request.player:
            return _forbidden("You don't own that ship!")

        if ship.on_deploy_queue:
            return _forbidden(
                "That ship is deploying; cancel deployment to move it")

        enemy_fighters = ship.system.ship_set.exclude(owner=request.player). \
            exclude(attack_tech=0)
        if len(enemy_fighters):
            return _forbidden("You can't run from enemy ships")

        lane_traveled = ship.system.neighbors.filter(system=system)
        if not lane_traveled or not lane_traveled[0].lane.passable:
            return _forbidden("Those systems aren't connected")

        ship.system = system
        ship.moves -= 1
        ship.save();

        map_changed = False
        if request.player not in system.visible_to.all():
            system.visible_to.add(request.player)
            map_changed = True

        neighbors = system.neighbors.all()
        for neighbor in neighbors:
            if request.player not in neighbor.lane.visible_to.all():
                map_changed = True
                neighbor.lane.visible_to.add(request.player)
                neighbor.lane.save()

        _game_state_changed(request.game)
        if map_changed:
            _map_changed(request.game, [request.player])

        return _json(_game_state(request.game, request.player))