BalanceOfPower
view release on metacpan or search on metacpan
lib/BalanceOfPower/Role/Merchant.pm view on Meta::CPAN
sub generate_traderoute
{
my $self = shift;
my $node1 = shift;
my $node2 = shift;
my $added = shift;
my $n1 = $self->get_nation($node1);
my $n2 = $self->get_nation($node2);
my $distance = $self->distance($node1, $node2);
my $common_factor = 2;
if($distance ne 'X')
{
if($distance == 1)
{
$common_factor = 4;
}
elsif($distance == 2)
{
$common_factor = 3;
}
}
my $factor1 = $common_factor;
my $factor2 = $common_factor;
if($n1->size < $n2->size)
{
$factor1 = $common_factor + TRADEROUTE_SIZE_BONUS;
}
if($n2->size < $n1->size)
{
$factor2 = $common_factor + TRADEROUTE_SIZE_BONUS;
}
$self->add_traderoute(
BalanceOfPower::Relations::TradeRoute->new(
node1 => $node1, node2 => $node2,
factor1 => $factor1, factor2 => $factor2));
if($added)
{
$n1->subtract_production('export', ADDING_TRADEROUTE_COST);
$n2->subtract_production('export', ADDING_TRADEROUTE_COST);
$self->change_diplomacy($node1, $node2, TRADEROUTE_DIPLOMACY_FACTOR, "TRADE CREATION");
my $event = { code => 'tradeadded',
text => "TRADEROUTE ADDED: $node1<->$node2",
involved => [$node1, $node2],
values => [] };
$self->broadcast_event($event, $node1, $node2);
}
}
sub delete_route
{
my $self = shift;
my $node1 = shift;;
my $node2 = shift;
my $n1 = $self->get_nation($node1);
my $n2 = $self->get_nation($node2);
my $present_treaty = $self->exists_treaty_by_type($node1, $node2, 'commercial');
if($present_treaty)
{
my $not_event = "TRADEROUTE DELETION $node1<->$node2 BLOCKED BY TREATY";
$self->broadcast_event($not_event, $node1, $node2);
}
else
{
$self->delete_traderoute($node1, $node2);
my $event = { code => 'tradedeleted',
text => "TRADEROUTE DELETED: $node1<->$node2",
involved => [$node1, $node2],
values => [] };
$self->broadcast_event($event, $node1, $node2);
$self->change_diplomacy($node1, $node2, -1 * TRADEROUTE_DIPLOMACY_FACTOR, "TRADE DELETION");
}
}
sub suitable_route_creator
{
my $self = shift;
my $nation = $self->get_nation( shift );
return 0 if($nation->production < ADDING_TRADEROUTE_COST);
return 0 if($nation->internal_disorder_status eq 'Civil war');
return 1;
}
sub suitable_new_route
{
my $self = shift;
my $node1 = $self->get_nation( shift );
my $node2 = $self->get_nation( shift );
return 0 if($self->route_exists($node1->name, $node2->name));
if($self->diplomacy_status($node1->name, $node2->name) ne 'HATE')
{
if($self->suitable_route_creator($node2->name))
{
return 1;
}
}
else
{
$self->broadcast_event({ code => 'traderefused',
text => $node1->name . " AND " . $node2->name . " REFUSED TO OPEN A TRADEROUTE",
involved => [$node1->name, $node2->name] }, $node1->name, $node2->name);
return 0;
}
}
1;
( run in 1.971 second using v1.01-cache-2.11-cpan-5837b0d9d2c )