File Coverage

lib/BalanceOfPower/Dice.pm
Criterion Covered Total %
statement 94 94 100.0
branch 24 24 100.0
condition 4 10 40.0
subroutine 10 10 100.0
pod 0 6 0.0
total 132 144 91.6


line stmt bran cond sub pod time code
1             package BalanceOfPower::Dice;
2             $BalanceOfPower::Dice::VERSION = '0.400110';
3 13     13   96 use v5.10;
  13         29  
4 13     13   42 use Moo;
  13         14  
  13         53  
5 13     13   2410 use Data::Dumper;
  13         14  
  13         535  
6 13     13   51 use List::Util qw(shuffle);
  13         13  
  13         8321  
7              
8             with 'BalanceOfPower::Role::Logger';
9              
10             has tricks => (
11             is => 'rw',
12             default => sub { {} }
13             );
14             has trick_counters => (
15             is => 'rw',
16             default => sub { {} }
17             );
18             has forced_advisor => (
19             is => 'rw',
20             default => 0
21             );
22             has only_one_nation_acting => (
23             is => 'rw',
24             default => 0
25             );
26              
27             sub random
28             {
29 793     793 0 15184 my $self = shift;
30 793         620 my $min = shift;
31 793         575 my $max = shift;
32 793   33     1215 my $message = shift || "NO MESSAGE [$min-$max]";
33 793         1015 my $out = $self->tricked($message);
34 793 100       1030 if(defined $out)
35             {
36 94         112 $self->write_log($message, $out, 1);
37 94         239 return $out;
38             }
39             else
40             {
41 699         752 my $random_range = $max - $min + 1;
42 699         1128 $out = int(rand($random_range)) + $min;
43 699         902 $self->write_log($message, $out, 0);
44 699         1404 return $out;
45             }
46             }
47              
48             sub random10
49             {
50 898     898 0 22149 my $self = shift;
51 898         716 my $min = shift;
52 898         695 my $max = shift;
53 898   33     1450 my $message = shift || "NO MESSAGE [$min-$max]";
54 898         1283 my $out = $self->tricked($message);
55 898 100       1125 if(defined $out)
56             {
57 53         78 $self->write_log($message, $out, 1);
58 53         131 return $out;
59             }
60             else
61             {
62 845         1413 my $random_range = (($max - $min) / 10) + 1;
63 845         1677 $out = (int(rand($random_range)) * 10) + $min;
64 845         1110 $self->write_log($message, $out, 0);
65 845         2258 return $out;
66             }
67             }
68              
69             sub random_around_zero
70             {
71 159     159 0 6470 my $self = shift;
72 159         143 my $max = shift;
73 159   50     264 my $divider = shift || 1;
74 159         129 my $message = shift;
75 159         232 my $out = $self->tricked($message);
76 159 100       200 if(defined $out)
77             {
78 2         5 $self->write_log($message, $out, 1);
79 2         8 return $out;
80             }
81             else
82             {
83 157         157 my $random_max = $max * 2;
84 157         244 my $r = $self->random(0, $random_max, "Inside dice, from random_around_zero");
85 157         170 $r = $r - $max;
86 157         150 $r = $r / $divider;
87 157         250 $self->write_log($message, $r, 0);
88 157         454 return $r;
89             }
90             }
91             sub shuffle_array
92             {
93 627     627 0 15555 my $self = shift;
94 627   50     1011 my $message = shift || "NO MESSAGE IN SHUFFLE";
95 627         684 my @array = @_;
96 627 100       1088 if($message =~ /^Choosing advisor for (.*)$/)
97             {
98 69         92 my $nation = $1;
99 69         56 my @array_back;
100 69         70 my $tricked = 0;
101 69 100       178 if($self->forced_advisor())
102             {
103 34         56 @array_back = ( $self->forced_advisor() );
104 34         27 $tricked = 1;
105             }
106             else
107             {
108 35         100 @array_back = shuffle @array;
109             }
110 69 100       137 if($self->only_one_nation_acting)
111             {
112 5 100       9 if($self->only_one_nation_acting ne $nation)
113             {
114 4         5 @array_back = ("Noone");
115 4         4 $tricked = 1;
116             }
117             }
118 69         140 $self->write_log($message, "<<array>>, first result: " . $array_back[0], $tricked);
119             return @array_back
120 69         280 }
121              
122 558 100       824 if(@array == 0)
123             {
124 269         343 $self->write_log($message, "<<array>>, Array empty");
125 269         651 return @array;
126             }
127 289         664 @array = shuffle @array;
128 289         743 $self->write_log($message, "<<array>>, first result: " . $array[0]);
129 289         932 return @array;
130             }
131             sub tricked
132             {
133 1850     1850 0 1442 my $self = shift;
134 1850         1452 my $message = shift;
135 1850 100       3495 if(exists $self->tricks->{$message})
136             {
137 155         166 my $index;
138 155 100       278 if(exists $self->trick_counters->{$message})
139             {
140 78         99 $index = $self->trick_counters->{$message};
141             }
142             else
143             {
144 77         74 $index = 0;
145             }
146 155         111 my $result;
147 155 100       273 if(exists $self->tricks->{$message}->[$index])
148             {
149 149         186 $result = $self->tricks->{$message}->[$index];
150             }
151             else
152             {
153 6         6 $result = undef;
154             }
155 155         230 $self->trick_counters->{$message} = $index + 1;
156 155         192 return $result;
157             }
158             else
159             {
160 1695         1951 return undef;
161             }
162             }
163              
164             sub write_log
165             {
166 2477     2477 0 1988 my $self = shift;
167 2477         2047 my $message = shift;
168 2477         1778 my $result = shift;
169 2477         1775 my $tricked = shift;
170 2477 100       3503 if($tricked)
171             {
172 183         209 $message .= " *TRICKED* ";
173             }
174 2477         4135 $message = "[" . $message . "] $result";
175 2477         4437 $self->log($message);
176             }
177              
178             1;