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