diff --git a/lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm b/lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm index 2a3d2dd5..449a784f 100644 --- a/lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm +++ b/lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm @@ -8,58 +8,31 @@ after handle_arrival_procedures => sub { # no defense at stars return unless $self->foreign_body_id; - + my $body_attacked = $self->foreign_body; - my $is_planet = $body_attacked->isa('Lacuna::DB::Result::Map::Body::Planet'); - my $is_asteroid = $body_attacked->isa('Lacuna::DB::Result::Map::Body::Asteroid'); + my $ship_body = $self->body; + my $is_planet = $body_attacked->isa('Lacuna::DB::Result::Map::Body::Planet'); + my $is_asteroid = $body_attacked->isa('Lacuna::DB::Result::Map::Body::Asteroid'); return unless ( $is_planet || $is_asteroid ); - + # no defense against self - return if ( $is_planet && $body_attacked->empire && $body_attacked->empire_id == $self->body->empire_id ); + return if ( $is_planet && $body_attacked->empire && $body_attacked->empire_id == $ship_body->empire_id ); + + # only trigger defenses on arrival to the foreign body + return if $self->direction eq 'in'; - # only trigger defenses on arrival to the foreign body - return if $self->direction eq 'in'; - # set last attack status - $body_attacked->set_last_attacked_by($self->body->id); + $body_attacked->set_last_attacked_by($ship_body->id); + + # get allies + $self->allied_combat(); - # get allies - $self->allied_combat(); - # get SAWs $self->saw_combat($body_attacked) if $is_planet; - my $alliance_id; - if ( $is_planet && $body_attacked->empire ) { - $alliance_id = $body_attacked->empire->alliance_id; - } - my $bodies = Lacuna->db->resultset('Lacuna::DB::Result::Map::Body')->search( - { id => { '!=' => $body_attacked->id}, star_id => $body_attacked->star_id } - ); - while (my $body = $bodies->next) { - # asteroids don't have SAWs - next - unless $body->isa('Lacuna::DB::Result::Map::Body::Planet'); + $self->system_saw_combat; - # don't attack own ships - next - if $body->empire_id && $body->empire_id == $self->body->empire_id; - # don't attack alliance ships - my $body_alliance = $body->alliance_id || ($body->empire && $body->empire->alliance_id); - next - if $body_alliance && $body_alliance == $self->body->empire->alliance_id; - - if ( $is_asteroid ) { - # all planets defend the asteroids in their system - $self->saw_combat($body); - } - else { - next unless ( $body->empire && $body->empire_id && $body->empire->alliance_id == $alliance_id ); - # alliance planets defend each other in their system - $self->saw_combat($body); - } - } - $self->defender_combat(); + $self->defender_combat(); }; sub damage_in_combat { @@ -171,6 +144,58 @@ sub allied_combat { $self->ship_to_ship_combat($allied_ships); } +sub system_saw_combat { + my ($self) = @_; + + my $attacked_body = $self->foreign_body; + my $ship_body = $self->body; + my $is_planet = $attacked_body->isa('Lacuna::DB::Result::Map::Body::Planet'); + my $is_asteroid = $attacked_body->isa('Lacuna::DB::Result::Map::Body::Asteroid'); + + my $attacked_empire = $attacked_body->empire_id; + my $attacked_alliance = $attacked_body->alliance_id + || ($attacked_body->empire && $attacked_body->empire->alliance_id); + + my $ship_empire = $ship_body->empire_id; + my $ship_alliance = $ship_body->empire->alliance_id; + + my $defending_bodies = Lacuna->db->resultset('Lacuna::DB::Result::Map::Body')->search( + { id => { '!=' => $attacked_body->id}, star_id => $attacked_body->star_id } + ); + while (my $defending_body = $defending_bodies->next) { + # asteroids don't have SAWs + next + unless $defending_body->isa('Lacuna::DB::Result::Map::Body::Planet'); + + # never attack own ships + my $defending_empire = $defending_body->empire_id; + next + if $defending_empire && $defending_empire == $ship_empire; + + my $defending_alliance = $defending_body->alliance_id + || ($defending_body->empire && $defending_body->empire->alliance_id); + + if ( $is_asteroid ) { + # don't attack alliance ships + next + if $defending_alliance && $ship_alliance && $defending_alliance == $ship_alliance; + # all planets defend the asteroids in their system + $self->saw_combat($defending_body); + } + elsif ( $defending_empire && $attacked_empire && $defending_empire == $attacked_empire ) { + # defend own planets in system + $self->saw_combat($defending_body); + } + elsif ( $defending_alliance && $ship_alliance && $defending_alliance == $ship_alliance ) { + # don't defend against allied ships + } + elsif ( $defending_alliance && $attacked_alliance && $defending_alliance == $attacked_alliance ) { + # alliance planets defend each other in their system + $self->saw_combat($defending_body); + } + } +} + sub saw_combat { my ($self, $body) = @_; -- 2.51.2 From a93e4aaea7d909e6634916bda1b6bb639d563264 Mon Sep 17 00:00:00 2001 From: Graham Knop Date: Thu, 31 Mar 2011 11:15:29 -0500 Subject: [PATCH 2/3] saw combat should come before all ship combat --- lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm b/lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm index 449a784f..c7046aa1 100644 --- a/lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm +++ b/lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm @@ -24,14 +24,14 @@ after handle_arrival_procedures => sub { # set last attack status $body_attacked->set_last_attacked_by($ship_body->id); - # get allies - $self->allied_combat(); - # get SAWs $self->saw_combat($body_attacked) if $is_planet; $self->system_saw_combat; + # get allies + $self->allied_combat(); + $self->defender_combat(); }; -- 2.51.2 From f7e7e4f24b5019630314c66afb2501b8c1d9df54 Mon Sep 17 00:00:00 2001 From: Graham Knop Date: Thu, 31 Mar 2011 11:15:43 -0500 Subject: [PATCH 3/3] Simplify and fix SAW combat --- lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-) diff --git a/lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm b/lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm index c7046aa1..a3e0e6c7 100644 --- a/lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm +++ b/lib/Lacuna/Role/Ship/Arrive/TriggerDefense.pm @@ -167,30 +167,22 @@ sub system_saw_combat { next unless $defending_body->isa('Lacuna::DB::Result::Map::Body::Planet'); - # never attack own ships my $defending_empire = $defending_body->empire_id; - next - if $defending_empire && $defending_empire == $ship_empire; - my $defending_alliance = $defending_body->alliance_id || ($defending_body->empire && $defending_body->empire->alliance_id); - if ( $is_asteroid ) { - # don't attack alliance ships - next - if $defending_alliance && $ship_alliance && $defending_alliance == $ship_alliance; - # all planets defend the asteroids in their system - $self->saw_combat($defending_body); + if ( $defending_empire && $defending_empire == $ship_empire ) { + # don't attack ships from same empire } elsif ( $defending_empire && $attacked_empire && $defending_empire == $attacked_empire ) { # defend own planets in system $self->saw_combat($defending_body); } elsif ( $defending_alliance && $ship_alliance && $defending_alliance == $ship_alliance ) { - # don't defend against allied ships + # don't attack ships in same alliance } - elsif ( $defending_alliance && $attacked_alliance && $defending_alliance == $attacked_alliance ) { - # alliance planets defend each other in their system + else { + # attack everything else $self->saw_combat($defending_body); } }