예제 #1
0
파일: temp.py 프로젝트: yezooz/crime-corp
    def testMoveRoute(self):
        from crims.common.helpers._crims import calc_route

        self.assertEqual(calc_route(2, 1, 2, 100), 19)
        self.assertEqual(calc_route(200, 55, 55, 1), 1460)
        self.assertEqual(calc_route(1, 1, 55, 100), 559)
예제 #2
0
파일: city.py 프로젝트: yezooz/crime-corp
    def move_units(self, post):
        from crims.city.models import MapMove, MapMoveGroup

        # Queue limitation check
        current_queue = MapMove.objects.get_by_user(user=self.engine.user.user)
        if self.engine.user.profile.is_premium:
            limit = settings.MAP_MOVE_QUEUE_LIMIT_PREMIUM
        else:
            limit = settings.MAP_MOVE_QUEUE_LIMIT
        if len(current_queue.units) >= limit:
            self.engine.log.message(message=_('Limit of moving units is %d' % limit))
            return

        # Start city validation
        try:
            s_city_id = int(post['city_id'])
        except (ValueError, KeyError):
            logging.warning('Start city id:%s is not valid integer' % str(post['city_id']))
            self.engine.log.message(message=_('Request is invalid'))
            return

        s_city = CityMap.objects.get_by_id(s_city_id)
        if s_city is None:
            logging.warning('Start city is not valid with ID:%d' % s_city_id)
            self.engine.log.message(message=_('Request is invalid'))
            return

        e_city = CityMap.objects.get_by_id(self.id)

        # Units validation
        try:
            req_units = {}
            for k, v in post.items():
                if k.find('unit_') != 0 or int(v) <= 0: continue
                req_units[int(k.replace('unit_', ''))] = int(v)
        except ValueError:
            logging.warning('POST is not valid')
            self.engine.log.message(message=_('Request is invalid'))
            return

        if len(req_units) == 0:
            self.engine.log.message(message=_('No unit selected'))
            return

        # Validate if user has units of each kind
        city_units = self.get_units(city_id=s_city_id)
        my_units = city_units.units

        for k, v in req_units.iteritems():
            if not my_units.has_key(str(k)) or int(my_units[str(k)]) < int(v):
                self.engine.log.message(message=_('Has not enough units to select'))
                return

        # MOVE...
        from crims.common.helpers._crims import calc_route

        transport_type = 'default'  # TODO: wprowadzic pozniej inne
        arrival_date = int(time.time() + int(
            calc_route(s_city.sector, s_city.position, e_city.sector, e_city.position) * 60.0 *
            settings.MOVE_TIME_PER_KM[transport_type]))

        # Take units
        for unit_id, unit_amount in req_units.iteritems():
            my_units[str(unit_id)] -= int(unit_amount)
            if my_units[str(unit_id)] == 0: del my_units[str(unit_id)]
        city_units.unit = json.dumps(my_units)
        city_units.save()

        # Make a move
        mvg = MapMoveGroup()
        mvg.unit = json.dumps(req_units)
        mvg.save()

        current_units = current_queue.units
        if len(current_units) == 0:
            current_queue.next_at = datetime.datetime.fromtimestamp(arrival_date)
        else:
            current_queue.next_at = datetime.datetime.fromtimestamp(min([x[3] for x in current_queue.units]))

        current_units.append([s_city_id, self.id, mvg.id, arrival_date])
        current_queue.unit = json.dumps(current_units)
        current_queue.save()

        self.engine.log.message(message=_('Units are moving'))
        return True