File Coverage

blib/lib/Games/Lacuna/Task/Action/StarCacheBuild.pm
Criterion Covered Total %
statement 4 6 66.6
branch n/a
condition n/a
subroutine 2 2 100.0
pod n/a
total 6 8 75.0


line stmt bran cond sub pod time code
1             package Games::Lacuna::Task::Action::StarCacheBuild;
2              
3 1     1   1555 use 5.010;
  1         3  
  1         57  
4             our $VERSION = $Games::Lacuna::Task::VERSION;
5              
6 1     1   503 use Moose -traits => 'NoAutomatic';
  0            
  0            
7             extends qw(Games::Lacuna::Task::Action);
8             with qw(Games::Lacuna::Task::Role::Stars);
9              
10             use List::Util qw(max min);
11              
12             sub description {
13             return q[Build a star cache, reducing subsequent api calls made by various tasks];
14             }
15              
16             has 'coordinate' => (
17             is => 'ro',
18             isa => 'Lacuna::Task::Type::Coordinate',
19             documentation=> q[Coordinates for query center],
20             coerce => 1,
21             lazy_build => 1,
22             );
23              
24             has 'skip' => (
25             is => 'ro',
26             isa => 'Int',
27             default => 1,
28             documentation=> q[Skip firt N-queries],
29             );
30              
31             has 'count' => (
32             is => 'ro',
33             isa => 'Int',
34             default => 20,
35             documentation=> q[Number of queries to be cached],
36             );
37              
38             sub _build_coordinate {
39             my ($self) = @_;
40            
41             my $home_planet = $self->home_planet_id();
42             my $home_planet_data = $self->my_body_status($home_planet);
43            
44             return [$home_planet_data->{x},$home_planet_data->{y}];
45             }
46              
47             sub run {
48             my ($self) = @_;
49            
50             my @pos = (0,0);
51             my @vector = (-1,0);
52             my $segment_length = 1;
53             my $segment_passed = 0;
54            
55             if ($self->skip <= 1) {
56             $self->get_star_step(0,0);
57             }
58             for my $round (2..$self->count) {
59             $pos[$_] += $vector[$_] for (0..1);
60             $segment_passed++;
61            
62             if ($round > $self->skip) {
63             $self->get_star_area(@pos);
64             }
65            
66             if ($segment_passed == $segment_length) {
67             $segment_passed = 0;
68             my $buffer = $vector[0];
69             $vector[0] = $vector[1] * -1;
70             $vector[1] = $buffer;
71             $segment_length++
72             if $vector[1] == 0;
73             }
74             }
75             }
76              
77             sub get_star_step {
78             my ($self,$x,$y) = @_;
79            
80             my ($cx,$cy) = ($x + $self->coordinate->[0],$y + $self->coordinate->[1]);
81             my ($min_x,$min_y) = ( $x * $Games::Lacuna::Task::Constants::MAX_MAP_QUERY + $cx , $y * $Games::Lacuna::Task::Constants::MAX_MAP_QUERY + $cy);
82             my ($max_x,$max_y) = ( ($x+1) * $Games::Lacuna::Task::Constants::MAX_MAP_QUERY + $cx , ($y+1) * $Games::Lacuna::Task::Constants::MAX_MAP_QUERY + $cy);
83            
84             $self->_get_star_api_area_by_xy($min_x,$min_y,$max_x,$max_y);
85             }
86              
87             __PACKAGE__->meta->make_immutable;
88             no Moose;
89             1;