sc: reuse formatting procedure for subunit columns
[sheet.git] / sc.plp
diff --git a/sc.plp b/sc.plp
index 26c8a97586244537ca02a52c248d0cf0141a4b83..76974c94ee8f7351faaaeb1d8e76ceb83ffd0954 100644 (file)
--- a/sc.plp
+++ b/sc.plp
@@ -259,44 +259,24 @@ sub showrange {
                } @$specials;
        }
 
-       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;
+       sub showunitcols {
+               my ($row) = @_;
+               local $_ = $row;
+               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',
@@ -304,7 +284,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;'
                        ),
@@ -320,20 +300,43 @@ 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;
+               $_->{hp} += $_->{shield};
+               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),
                        );
                }
        }