示例#1
0
 def perform_travel(self, destination):
     travel_time = self.travel_time(destination)
     self.location = destination
     self.hours_in_turn_left -= travel_time
     self.save()
     return "After {} of travel you have reached {}.".format(
         nice_hours(travel_time), destination)
示例#2
0
    def perform_travel(self, destination):
        for unit in self.worldunit_set.filter(status=WorldUnit.FOLLOWING,
                                              location=self.location):
            unit.location = destination
            unit.save()

        travel_time = self.travel_time(destination)
        self.location = destination
        self.hours_in_turn_left -= travel_time
        self.save()
        return "After {} of travel you have reached {}.".format(
            nice_hours(travel_time), destination)
示例#3
0
 def test_nice_hours2(self):
     self.assertEqual(extra_filters.nice_hours(50), "2 days and 2 hours")
示例#4
0
 def test_nice_hours1(self):
     self.assertEqual(extra_filters.nice_hours(25), "1 day and 1 hour")
示例#5
0
    def post(self, request, *args, **kwargs):
        recruitment_type = request.POST.get('recruitment_type')
        if recruitment_type in ('conscription', 'professional'):
            if recruitment_type == 'conscription':
                prefix = 'conscript_'
            elif recruitment_type == 'professional':
                prefix = 'professional_'
            else:
                raise Http404()

            if not request.hero.can_conscript():
                return RecruitmentView.fail_post_with_error(
                    request,
                    "You can't conscript units here."
                )

            # get soldier count
            target_soldier_count = \
                int(request.POST.get('{}count'.format(prefix)))
            if not target_soldier_count > 0:
                return RecruitmentView.fail_post_with_error(
                    request, "Invalid number of soldiers."
                )

            # check cash
            if request.hero.cash < unit_cost(target_soldier_count):
                return RecruitmentView.fail_post_with_error(
                    request,
                    "You need {} silver coins to recruit a unit of {} "
                    "and you don't have that much.".format(
                        target_soldier_count,
                        target_soldier_count
                    )
                )

            # calculate time
            conscription_time = request.hero.location.conscription_time(
                target_soldier_count
            )

            if request.hero.hours_in_turn_left < conscription_time:
                return RecruitmentView.fail_post_with_error(
                    request,
                    "You need {} to recruit a unit of {}, but you don't have "
                    "that much time left in this turn.".format(
                        nice_hours(conscription_time),
                        target_soldier_count
                    )
                )

            # check unit type
            unit_type = request.POST.get('{}unit_type'.format(prefix))
            if unit_type not in WorldUnit.get_unit_types(nice=True):
                return RecruitmentView.fail_post_with_error(
                    request, "Invalid unit type."
                )

            # check payment
            """
            pay = int(request.POST.get('{}pay'.format(prefix)))
            if pay not in range(1, 7):
                return RecruitmentView.fail_post_with_error(
                    request, "Invalid payment."
                )

            if (
                    request.hero.worldunit_set.count() + 1 >
                    request.hero.max_units()
            ):
                return RecruitmentView.fail_post_with_error(
                    request, "You can't recruit any more units."
                )
            """

            already_recruited_soldier_count = sum(
                unit.soldier.count()
                for unit in request.hero.worldunit_set.all()
            )
            if (
                    already_recruited_soldier_count + target_soldier_count >
                    request.hero.max_soldiers()
            ):
                return RecruitmentView.fail_post_with_error(
                    request, "You can't recruit that many soldiers."
                )


            # get candidates

            try:
                candidates = build_population_query_from_request(
                    request, prefix, request.hero.location
                )
            except BadPopulation as e:
                return RecruitmentView.fail_post_with_error(request, e)

            if candidates.count() == 0:
                return RecruitmentView.fail_post_with_error(
                    request,
                    "You seem unable to find anyone in {} matching the profile"
                    " you want".format(request.hero.location)
                )

            soldiers = sample_candidates(candidates, target_soldier_count)

            unit = recruit_unit(
                "{}'s new unit".format(request.hero),
                request.hero,
                request.hero.location,
                soldiers,
                recruitment_type,
                unit_type
            )
            unit.mobilize()

            request.hero.hours_in_turn_left -= conscription_time
            request.hero.cash -= unit.monthly_cost()
            request.hero.save()

            messages.success(
                request,
                "You formed a new unit of {} called {}".format(
                    len(soldiers), unit.name
                ),
                "success"
            )
            return redirect(unit.get_absolute_url())

        else:
            pass