File Coverage

lib/BalanceOfPower/Nation/Role/IA.pm
Criterion Covered Total %
statement 77 91 84.6
branch 28 44 63.6
condition 8 18 44.4
subroutine 13 13 100.0
pod 0 7 0.0
total 126 173 72.8


line stmt bran cond sub pod time code
1             package BalanceOfPower::Nation::Role::IA;
2             $BalanceOfPower::Nation::Role::IA::VERSION = '0.400105';
3 13     13   4867 use strict;
  13         24  
  13         316  
4 13     13   120 use v5.10;
  13         32  
5 13     13   39 use Moo::Role;
  13         16  
  13         70  
6 13     13   7464 use Array::Utils qw(intersect);
  13         3654  
  13         778  
7              
8 13     13   62 use BalanceOfPower::Constants ':all';
  13         18  
  13         6445  
9 13     13   71 use BalanceOfPower::Utils qw( prev_turn );
  13         20  
  13         7764  
10              
11             has executive => (
12             is => 'rw',
13             handles => { decide => 'decide' }
14            
15             );
16              
17             sub decision
18             {
19 69     69 0 1018 my $self = shift;
20 69         78 my $world = shift;
21 69         65 my @advisors;
22 69 100 100     211 if($world->at_war($self->name) || $world->at_civil_war($self->name))
23             {
24 14         24 @advisors = ('military');
25             }
26             else
27             {
28 55         104 @advisors = ('domestic', 'economy', 'military');
29             }
30 69         1134 @advisors = $world->shuffle("Choosing advisor for ".$self->name, @advisors);
31 69         125 foreach my $a (@advisors)
32             {
33 76         75 my $decision = undef;
34 76 100       236 if($a eq 'domestic')
    100          
    100          
35             {
36 22         57 $decision = $self->domestic_advisor();
37             }
38             elsif($a eq 'economy')
39             {
40 12         28 $decision = $self->economy_advisor();
41             }
42             elsif($a eq 'military')
43             {
44 23         47 $decision = $self->military_advisor();
45             }
46 76 100       316 return $self->name . ": " . $decision if($decision);
47             }
48 22         43 return undef;
49             }
50              
51             sub advisor
52             {
53 57     57 0 43 my $self = shift;
54 57         103 my @orders = @_;
55 57         45 my $order = undef;
56 57         72 for(@orders)
57             {
58 224         539 $order = $self->decide($_);
59 224 100       562 return $order if $order;
60             }
61 10         21 return undef;
62             }
63              
64             sub domestic_advisor
65             {
66 22     22 0 22 my $self = shift;
67 22         45 return $self->advisor("LOWER DISORDER",
68             "BOOST PRODUCTION",
69             "TREATY NAG WITH",
70             "DIPLOMATIC PRESSURE ON",
71             "MILITARY AID FOR",
72             "PROGRESS");
73             }
74              
75             sub economy_advisor
76             {
77 12     12 0 18 my $self = shift;
78 12         27 return $self->advisor("TREATY COM WITH",
79             "DELETE TRADEROUTE",
80             "ADD ROUTE",
81             "ECONOMIC AID");
82             }
83              
84             sub military_advisor
85             {
86 23     23 0 24 my $self = shift;
87 23         40 return $self->advisor("DECLARE WAR TO",
88             "AID INSURGENTS IN",
89             "MILITARY SUPPORT",
90             "REBEL MILITARY SUPPORT",
91             "RECALL MILITARY SUPPORT",
92             "BUILD TROOPS");
93             }
94             sub accept_military_support
95             {
96 4     4 0 8 my $self = shift;
97 4         6 my $other = shift;
98 4         4 my $world = shift;
99 4 50       17 if($world->already_in_military_support($self->name))
100             {
101 0         0 my $supd = $world->supported($self->name);
102 0 0 0     0 if($supd && $supd->node1 eq $other)
103             {
104 0         0 return 1;
105             }
106             else
107             {
108 0         0 return 0;
109             }
110             }
111 4 50       20 return 0 if($world->diplomacy_status($self->name, $other) eq 'HATE');
112 4         22 return $self->army < ARMY_TO_ACCEPT_MILITARY_SUPPORT;
113             }
114              
115             sub good_prey
116             {
117 7     7 0 9 my $self = shift;
118 7         5 my $enemy = shift;
119 7         7 my $world = shift;
120              
121 7         24 my $crisis = $world->crisis_exists($self->name, $enemy->name);
122 7 100       19 my $level = $crisis ? $crisis->get_crisis_level : ALLY_CONFLICT_LEVEL_FOR_INVOLVEMENT;
123              
124 7 100       25 if($self->army < MIN_ARMY_FOR_WAR)
125             {
126 4         10 return 0;
127             }
128 3         3 my $war_points = 0;
129              
130             #ARMY EVALUATION
131 3         5 my $army_ratio;
132 3 100       9 if($enemy->army > 0)
133             {
134 1         5 $army_ratio = int($self->army / $enemy->army);
135             }
136             else
137             {
138 2         3 $army_ratio = 3;
139             }
140 3 50       9 if($army_ratio < 1)
141             {
142 0         0 my $reverse_army_ratio = $enemy->army / $self->army;
143 0 0       0 if($reverse_army_ratio > MIN_INFERIOR_ARMY_RATIO_FOR_WAR)
144             {
145 0         0 return 0;
146             }
147             else
148             {
149 0         0 $army_ratio = -1;
150             }
151             }
152 3         5 $war_points += $army_ratio;
153              
154             #INTERNAL EVALUATION
155 3 50       9 if($self->internal_disorder_status eq 'Peace')
    0          
    0          
156             {
157 3         5 $war_points += 1;
158             }
159             elsif($self->internal_disorder_status eq 'Terrorism')
160             {
161 0         0 $war_points += 0;
162             }
163             elsif($self->internal_disorder_status eq 'Insurgence')
164             {
165 0         0 $war_points += -1;
166             }
167              
168             #WEALTH EVALUATION/PROGRES EVALUATION
169 3         14 my $wealth = $world->get_statistics_value(prev_turn($self->current_year), $self->name, 'wealth');
170 3         13 my $enemy_wealth = $world->get_statistics_value(prev_turn($self->current_year), $enemy->name, 'wealth');
171 3         12 my $progress_delta = $enemy->progress - $self->progress;
172 3 100 66     9 if($wealth && $enemy_wealth)
173             {
174 1 50       3 if($enemy_wealth > $wealth)
175             {
176 0         0 $war_points += 1
177             }
178             else
179             {
180 1 50 33     3 if($progress_delta > 0 && $progress_delta < MAX_AFFORDABLE_PROGRESS)
181             {
182 0         0 $war_points += 1
183             }
184            
185             }
186             }
187             else
188             {
189 2         3 $war_points += 1;
190             }
191              
192            
193             #COALITION EVALUATION
194 3 50 33     12 if($world->empire($self->name) && $world->empire($enemy->name) && $world->empire($self->name) > $world->empire($enemy->name))
      33        
195             {
196 0         0 $war_points += 1;
197             }
198 3 50       9 if($war_points + $level >= 4)
199             {
200 3         11 return 1;
201             }
202             else
203             {
204 0           return 0;
205             }
206             }
207              
208             1;
209