File Coverage

lib/BalanceOfPower/Role/Merchant.pm
Criterion Covered Total %
statement 83 89 93.2
branch 20 30 66.6
condition 3 6 50.0
subroutine 10 10 100.0
pod 0 5 0.0
total 116 140 82.8


line stmt bran cond sub pod time code
1             package BalanceOfPower::Role::Merchant;
2             $BalanceOfPower::Role::Merchant::VERSION = '0.400115';
3 13     13   6061 use strict;
  13         30  
  13         382  
4 13     13   175 use v5.10;
  13         36  
5 13     13   52 use Moo::Role;
  13         15  
  13         90  
6              
7 13     13   3426 use BalanceOfPower::Constants ':all';
  13         22  
  13         7852  
8 13     13   4727 use BalanceOfPower::Relations::TradeRoute;
  13         35  
  13         13223  
9              
10             requires 'get_nation';
11             requires 'broadcast_event';
12             requires 'change_diplomacy';
13             requires 'diplomacy_status';
14             requires 'random';
15             requires 'distance';
16              
17             has trade_routes => (
18             is => 'ro',
19             default => sub { BalanceOfPower::Relations::RelPack->new() },
20             handles => { add_traderoute => 'add_link',
21             delete_traderoute => 'delete_link',
22             route_exists => 'exists_link',
23             routes_for_node => 'links_for_node',
24             route_destinations_for_node => 'link_destinations_for_node'
25             # print_borders => 'print_links'
26             }
27             );
28              
29             sub init_trades
30             {
31 2     2 0 6 my $self = shift;
32 2         4 my @nations = @{$self->nations};
  2         15  
33 2         6 my %routes_counter;
34 2         7 foreach my $n (@nations)
35             {
36 10 100       42 $routes_counter{$n->name} = 0 if(! exists $routes_counter{$n->name});
37 10         206 my $how_many_routes = $self->random(MIN_STARTING_TRADEROUTES, MAX_STARTING_TRADEROUTES, "Routes to generate for " . $n->name);
38 10         1069 say " routes to generate: $how_many_routes [" . $routes_counter{$n->name} . "]";
39 10         34 my @my_names = @nations;
40 10         18 @my_names = grep { $_->name ne $n->name } @my_names;
  50         113  
41 10   66     70 while($routes_counter{$n->name} < $how_many_routes && @my_names > 0)
42             {
43 10         28 my $second_node = $my_names[rand @my_names];
44 10         15 @my_names = grep { $_->name ne $second_node->name } @my_names;
  37         71  
45 10 50 33     66 if($second_node->name ne $n->name && ! $self->route_exists($n->name, $second_node->name))
46             {
47 10         590 say " creating trade route to " . $second_node->name;
48 10         21 @my_names = grep { $_->name ne $second_node->name } @my_names;
  27         81  
49 10         41 $self->generate_traderoute($n->name, $second_node->name, 0);
50 10         25 $routes_counter{$n->name}++;
51 10 100       32 $routes_counter{$second_node->name} = 0 if(! exists $routes_counter{$second_node->name});
52 10         50 $routes_counter{$second_node->name}++;
53             }
54             }
55             }
56             }
57             sub generate_traderoute
58             {
59 15     15 0 4884 my $self = shift;
60 15         19 my $node1 = shift;
61 15         23 my $node2 = shift;
62 15         21 my $added = shift;
63              
64 15         61 my $n1 = $self->get_nation($node1);
65 15         36 my $n2 = $self->get_nation($node2);
66 15         84 my $distance = $self->distance($node1, $node2);
67 15         28 my $common_factor = 2;
68 15 50       51 if($distance ne 'X')
69             {
70 15 100       57 if($distance == 1)
    100          
71             {
72 6         14 $common_factor = 4;
73             }
74             elsif($distance == 2)
75             {
76 4         7 $common_factor = 3;
77             }
78             }
79 15         22 my $factor1 = $common_factor;
80 15         19 my $factor2 = $common_factor;
81 15 50       88 if($n1->size < $n2->size)
82             {
83 0         0 $factor1 = $common_factor + TRADEROUTE_SIZE_BONUS;
84             }
85 15 50       75 if($n2->size < $n1->size)
86             {
87 0         0 $factor2 = $common_factor + TRADEROUTE_SIZE_BONUS;
88             }
89            
90             $self->add_traderoute(
91 15         325 BalanceOfPower::Relations::TradeRoute->new(
92             node1 => $node1, node2 => $node2,
93             factor1 => $factor1, factor2 => $factor2));
94 15 100       62 if($added)
95             {
96 1         4 $n1->subtract_production('export', ADDING_TRADEROUTE_COST);
97 1         2 $n2->subtract_production('export', ADDING_TRADEROUTE_COST);
98 1         5 $self->change_diplomacy($node1, $node2, TRADEROUTE_DIPLOMACY_FACTOR, "TRADE CREATION");
99 1         9 my $event = { code => 'tradeadded',
100             text => "TRADEROUTE ADDED: $node1<->$node2",
101             involved => [$node1, $node2],
102             values => [] };
103 1         4 $self->broadcast_event($event, $node1, $node2);
104             }
105            
106             }
107             sub delete_route
108             {
109 1     1 0 2 my $self = shift;
110 1         3 my $node1 = shift;;
111 1         3 my $node2 = shift;
112 1         3 my $n1 = $self->get_nation($node1);
113 1         3 my $n2 = $self->get_nation($node2);
114 1         3 my $present_treaty = $self->exists_treaty_by_type($node1, $node2, 'commercial');
115 1 50       4 if($present_treaty)
116             {
117 0         0 my $not_event = "TRADEROUTE DELETION $node1<->$node2 BLOCKED BY TREATY";
118 0         0 $self->broadcast_event($not_event, $node1, $node2);
119             }
120             else
121             {
122 1         6 $self->delete_traderoute($node1, $node2);
123 1         10 my $event = { code => 'tradedeleted',
124             text => "TRADEROUTE DELETED: $node1<->$node2",
125             involved => [$node1, $node2],
126             values => [] };
127 1         10 $self->broadcast_event($event, $node1, $node2);
128 1         12 $self->change_diplomacy($node1, $node2, -1 * TRADEROUTE_DIPLOMACY_FACTOR, "TRADE DELETION");
129             }
130             }
131             sub suitable_route_creator
132             {
133 2     2 0 3 my $self = shift;
134 2         6 my $nation = $self->get_nation( shift );
135 2 50       6 return 0 if($nation->production < ADDING_TRADEROUTE_COST);
136 2 50       7 return 0 if($nation->internal_disorder_status eq 'Civil war');
137 2         25 return 1;
138             }
139             sub suitable_new_route
140             {
141 1     1 0 2 my $self = shift;
142 1         3 my $node1 = $self->get_nation( shift );
143 1         4 my $node2 = $self->get_nation( shift );
144 1 50       8 return 0 if($self->route_exists($node1->name, $node2->name));
145 1 50       9 if($self->diplomacy_status($node1->name, $node2->name) ne 'HATE')
146             {
147 1 50       7 if($self->suitable_route_creator($node2->name))
148             {
149 1         3 return 1;
150             }
151             }
152             else
153             {
154 0           $self->broadcast_event({ code => 'traderefused',
155             text => $node1->name . " AND " . $node2->name . " REFUSED TO OPEN A TRADEROUTE",
156             involved => [$node1->name, $node2->name] }, $node1->name, $node2->name);
157 0           return 0;
158             }
159             }
160              
161              
162              
163             1;
164              
165