sc: separate base damage from upgrade bonus
[sheet.git] / sc.plp
diff --git a/sc.plp b/sc.plp
index f1632eeaddfbf513c0fd28a8113feda44f8f39b7..3a11f0ce4ad2cf8406f02758220e73a728314427 100644 (file)
--- a/sc.plp
+++ b/sc.plp
@@ -126,8 +126,7 @@ sub showrange {
                my $upattack = $row->{upgraded}->{attack}->[$area];
                my $damage = $attack->{damage};
                my $maxdamage = $upattack->{damage} // $damage;
                my $upattack = $row->{upgraded}->{attack}->[$area];
                my $damage = $attack->{damage};
                my $maxdamage = $upattack->{damage} // $damage;
-               $damage = $damage->[0] if ref $damage;
-               $maxdamage = $maxdamage->[-1] if ref $maxdamage;
+               $maxdamage += ($upattack->{upgrade} // $attack->{upgrade}) * 3;
 
                my $out = '<td class="val hurt">';
                $out .= "<small>$attack->{count}× </small>" if $attack->{count} > 1;
 
                my $out = '<td class="val hurt">';
                $out .= "<small>$attack->{count}× </small>" if $attack->{count} > 1;
@@ -135,24 +134,27 @@ sub showrange {
                        if $attack->{type} eq 'explosive';
                $out .= '<span class="unit-s" title="implosive">~</span>'
                        if $attack->{type} eq 'implosive';
                        if $attack->{type} eq 'explosive';
                $out .= '<span class="unit-s" title="implosive">~</span>'
                        if $attack->{type} eq 'implosive';
+       if (my @bonus = sort grep { !/^-/ } keys %{ $attack->{bonus} }) {
                $out .= sprintf('<span class="%s" title="%s">&ge;</span>',
                        (map {
                $out .= sprintf('<span class="%s" title="%s">&ge;</span>',
                        (map {
-                               $_ =~ /^light/ ? 'unit-s' :
+                               $_ eq 'light' ? 'unit-s' :
                                $_ eq 'armored' ? 'unit-l' :
                                $_ eq 'organic' ? 'unit-o' :
                                $_ eq 'armored' ? 'unit-l' :
                                $_ eq 'organic' ? 'unit-o' :
-                               $_ =~ /^massive/ ? 'unit-h' :
+                               $_ eq 'massive' ? 'unit-h' :
                                $_ eq 'shields' ? 'unit-shield' :
                                '',
                                $_ eq 'shields' ? 'unit-shield' :
                                '',
-                       } join '_', keys %{ $attack->{bonus} }),
+                       } join '_', @bonus),
                        join(', ', map {(
                                sprintf('+%s vs %s',
                        join(', ', map {(
                                sprintf('+%s vs %s',
-                                       (map {
-                                               ref $_ ? showrange($_->[0], $_->[-1]) : $_
-                                       } $attack->{bonus}->{$_}),
+                                       showrange(
+                                               $attack->{bonus}->{$_},
+                                               $attack->{bonus}->{$_} + $attack->{bonus}->{"-$_"} * 3,
+                                       ),
                                        $_,
                                ),
                                        $_,
                                ),
-                       )} keys %{ $attack->{bonus} }),
-               ) if $attack->{bonus};
+                       )} @bonus),
+               );
+       }
                $out .= '<span class="unit-pdd" title="projectile">•</span>'
                        if $attack->{type} eq 'projectile';
 
                $out .= '<span class="unit-pdd" title="projectile">•</span>'
                        if $attack->{type} eq 'projectile';
 
@@ -179,7 +181,8 @@ sub showrange {
                        $damage *= ($attack->{count} // 1) / $attack->{cooldown};
                        if (my $bonus = $upattack->{bonus} // $attack->{bonus}) {
                                $maxdamage += $_ for max(
                        $damage *= ($attack->{count} // 1) / $attack->{cooldown};
                        if (my $bonus = $upattack->{bonus} // $attack->{bonus}) {
                                $maxdamage += $_ for max(
-                                       map { ref $_ ? $_->[-1] : $_ } values %{$bonus}
+                                       map { $bonus->{$_} + $bonus->{"-$_"} * 3 }
+                                       grep { !/^-/ } keys %{$bonus}
                                );
                        }
                        $maxdamage *= ($upattack->{count} // $attack->{count} // 1)
                                );
                        }
                        $maxdamage *= ($upattack->{count} // $attack->{count} // 1)
@@ -320,7 +323,7 @@ sub showrange {
                elsif ($get{order} eq 'attack') {
                        $_->{order} = $_->{hp} / 1024 + $_->{shield} / 1008 + max(
                                map {
                elsif ($get{order} eq 'attack') {
                        $_->{order} = $_->{hp} / 1024 + $_->{shield} / 1008 + max(
                                map {
-                                       ((map { ref $_ ? $_->[-1] : $_ } $_->{damage})[0])
+                                       ($_->{damage} + $_->{upgrade} * 3)
                                        * ($_->{count} // 1) / ($_->{cooldown} // 1)
                                        * ($_->{splash} ? 1.01 : 1)
                                        * ($_->{type} eq 'implosive' ? .96 : 1)
                                        * ($_->{count} // 1) / ($_->{cooldown} // 1)
                                        * ($_->{splash} ? 1.01 : 1)
                                        * ($_->{type} eq 'implosive' ? .96 : 1)