sc: indicate specials cost and availability
[sheet.git] / sc.plp
diff --git a/sc.plp b/sc.plp
index 6b08c9477acb304665a865dc57178ca2f95d5013..b14e04f49a303dfb518bb7b8bf5f6492681e37f4 100644 (file)
--- a/sc.plp
+++ b/sc.plp
@@ -1,5 +1,10 @@
 <(common.inc.plp)><:
 
+my $datafile = 'sc-units.inc.pl';
+if ($ENV{PATH_INFO} and $ENV{PATH_INFO} eq '/2') {
+       $datafile = 'sc2-units.inc.pl';
+}
+
 Html({
        title => 'starcraft unit cheat sheet',
        version => 'v1.0',
@@ -13,6 +18,7 @@ Html({
                reference software attributes properties
        '],
        stylesheet => [qw'light'],
+       data => [$datafile],
 });
 
 :>
@@ -193,7 +199,9 @@ sub showrange {
        }
 
        if ($elements[0] eq 'attack' and $elements[1] ne 'range' and $elements[2] eq 'dps') {{
-               my $type = $row->{$elements[0]}->{$elements[1]}->{type} or next;
+               my $attack = $row->{ $elements[0] }->{ $elements[1] };
+               ref $attack or $attack = $row->{ $elements[0] }->{$attack}; # follow
+               my $type = $attack->{type} or next;
                if ($type eq 'explosive') {
                        $min /= 2;
                }
@@ -209,6 +217,11 @@ sub showrange {
        sub showattack {
                my ($row, $area) = @_;
                local $_ = $row->{attack}->{$area};
+               if (not ref $_) {
+                       # reference to another area
+                       $area = $_;
+                       $_ = $row->{attack}->{$area};
+               }
 
                return '<td colspan="2" class="hurt">' unless $_;
 
@@ -237,53 +250,36 @@ sub showrange {
                                join('',
                                        $_->{name},
                                        $_->{desc} ? ": $_->{desc}" : '',
-                                       $_->{range} ? sprintf(' (%s)', join ', ',
-                                               "range $_->{range}",
-#                                              "cost $_->{cost}",
+                                       $_->{range} || $_->{cost} ? sprintf(' (%s)', join ', ',
+                                               $_->{range} ? "range $_->{range}" : (),
+                                               $_->{cost} ? sprintf('cost %.0f%%',
+                                                       100 * $_->{cost} / $row->{energy}
+                                               ) : (),
                                        ) : '',
                                ),
-                               $_->{abbr},
-               } @$specials;
+                               sprintf($_->{build} ? '(%s)' : '%s', $_->{abbr}),
+               } grep { defined $_->{abbr} } @{$specials};
        }
 
-       my $units = do 'sc-units.inc.pl';
-       die "Cannot open unit data: $_\n" for $@ || $! || ();
-       my $grouped = !exists $get{order};
-       if (exists $get{order}) {
-               $get{order} ||= '';
-               if ($get{order} eq 'size') {
-                       $_->{order} = $_->{unit}*8 + $_->{suit} + $_->{hp}/512 + $_->{min}/8192 for @$units;
-               }
-               elsif ($get{order} eq 'cost') {
-                       $_->{order} = $_->{gas}*1.5 + $_->{min} + $_->{unit}/8 + $_->{build}/256/8 for @$units;
-               }
-               else {
-                       $units->[$_]->{order} = $_ for 0 .. $#$units;
+       sub showunitcols {
+               my ($row) = @_;
+               local $_ = $row;
+               $_->{hp} += $_->{shield} if $_->{shield};
+               my $suitchar = '';
+               if ($_->{suit}) {
+                       $suitchar = [qw/? s m l/]->[$_->{suit}];
                }
-       }
-       my @rows = $grouped ? @$units : sort {$a->{order} <=> $b->{order}} @$units;
 
-       my ($race, $cat) = ('', '');
-       for (@rows) {
-               $race = $_->{race},
-               printf '<tbody id="%s"><tr class="race"><th colspan="18"><h2>%s</h2>'."\n", $race, ucfirst $race
-                       if $grouped and $race ne $_->{race};
-               $_->{cat} = $_->{race} if not $grouped;
-               $_->{hp} += $_->{shield};
-               my $suitchar = [qw/? s m l/]->[$_->{suit}];
-               print(
-                       '<tr>',
-                       sprintf('<t%s class="cat">%s', $cat ne $_->{cat} ? ('h', $cat = $_->{cat}) : ('d', '&nbsp;')),
-                       '<td>' . $_->{name},
-                       '<td class="val min">' . ($_->{min} || '0'),
+               return (
+                       '<td class="val min">' . ($_->{min} // ''),
                        '<td class="val gas">' . ($_->{gas} || ''),
-                       sprintf('<td class="val time">%s%.0f',
+                       !defined $_->{build} ? '<td>' : sprintf('<td class="val time">%s%.0f',
                                !!$_->{base} && '<span class="unit-composed">+</span>',
                                $_->{build} || '0',
                        ),
-                       sprintf('<td class="unit unit-%s">%s', $suitchar, ucfirst $suitchar),
+                       !$suitchar ? '<td>' : sprintf('<td class="unit unit-%s">%s', $suitchar, ucfirst $suitchar),
                        '<td class="val unit">' . join('',
-                               $_->{unit} ? $_->{unit} == .5 ? '½' : $_->{unit} : '&nbsp;',
+                               defined $_->{unit} && $_->{unit} == .5 ? '½' : $_->{unit},
                                defined $_->{organic} && sprintf(
                                        '<span class="unit-%s" title="%s">%s</span>',
                                        $_->{organic} ? 'o' : 'u',
@@ -291,7 +287,7 @@ sub showrange {
                                        $_->{organic} ? 'o' : 'm',
                                ),
                        ),
-                       '<td class="val unit-hp">' . $_->{hp},
+                       '<td class="val unit-hp">' . $_->{hp} // '',
                        '<td class="val unit-shield">' . (
                                $_->{shield} ? sprintf('%.0f%%', 100 * $_->{shield} / $_->{hp}) : '&nbsp;'
                        ),
@@ -307,20 +303,42 @@ sub showrange {
                        '<td class="unit-magic">' . showmagic($_),
                        "\n"
                );
+       }
+
+       my $units = do $datafile;
+       die "Cannot open unit data: $_\n" for $@ || $! || ();
+       my $grouped = !exists $get{order};
+       if (exists $get{order}) {
+               $get{order} ||= '';
+               if ($get{order} eq 'size') {
+                       $_->{order} = $_->{unit}*8 + $_->{suit} + $_->{hp}/512 + $_->{min}/8192 for @$units;
+               }
+               elsif ($get{order} eq 'cost') {
+                       $_->{order} = $_->{gas}*1.5 + $_->{min} + $_->{unit}/8 + $_->{build}/256/8 for @$units;
+               }
+               else {
+                       $units->[$_]->{order} = $_ for 0 .. $#$units;
+               }
+       }
+       my @rows = $grouped ? @$units : sort {$a->{order} <=> $b->{order}} @$units;
+
+       my ($race, $cat) = ('', '');
+       for (@rows) {
+               $race = $_->{race},
+               printf '<tbody id="%s"><tr class="race"><th colspan="18"><h2>%s</h2>'."\n", $race, ucfirst $race
+                       if $grouped and $race ne $_->{race};
+               $_->{cat} = $_->{race} if not $grouped;
+               print(
+                       '<tr>',
+                       sprintf('<t%s class="cat">%s', $cat ne $_->{cat} ? ('h', $cat = $_->{cat}) : ('d', '&nbsp;')),
+                       '<td>' . $_->{name},
+                       showunitcols($_),
+               );
 
                for my $alt (grep { $_->{alt} } @{ $_->{special} }) {
                        print(
-                               '<tr class="alt"><td class="cat"><td colspan="9">' . $alt->{alt},
-                               showattack($alt, 'ground'),
-                               showattack($alt, 'air'),
-                               '<td class="val unit-range">' . showrange($alt, 'attack', 'range'),
-                               '<td class="val unit-sight">' . sprintf(
-                                       $alt->{detect} ? '<strong class="unit-detect">%s</strong>' : '%s',
-                                       showrange($alt, 'sight')
-                               ),
-                               '<td class="val unit-speed">' . showrange($alt, 'speed'),
-                               '<td>',
-                               "\n",
+                               '<tr class="alt"><td class="cat"><td>' . $alt->{alt},
+                               showunitcols($alt),
                        );
                }
        }